1.0.2/000075500000000000000000000000001140165031200123445ustar00viewvcviewvc000000100000001.0.2/build.xml000064400000000000000000000241761140165031200141770ustar00viewvcviewvc00000010000000 writer2latex - build file Usage: ant <target> The following targets are supported: all Build nearly everything compile Compile all file except the tests. jar Create the standalone jar file. oxt Create extension packages for OOo distro Create the distribution packages javadoc Create the javadoc documentation in target/javadoc. clean 1.0.2/.settings/000075500000000000000000000000001140165031200142625ustar00viewvcviewvc000000100000001.0.2/source/000075500000000000000000000000001140165031200136445ustar00viewvcviewvc000000100000001.0.2/source/COPYING.TXT000064400000000000000000000604131140165031200153610ustar00viewvcviewvc00000010000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS 1.0.2/source/readme-source.txt000064400000000000000000000040341140165031200171410ustar00viewvcviewvc00000010000000Writer2LaTeX source version 1.0.2 ================================= Writer2LaTeX is (c) 2002-2010 by Henrik Just. The source is available under the terms and conditions of the GNU LESSER GENERAL PUBLIC LICENSE, version 2.1. Please see the file COPYING.TXT for details. Overview -------- The source of Writer2LaTeX consists of three major parts: * A general purpose java library for converting OpenDocument files into LaTeX, BibTeX, xhtml and xhtml+MathML This is to be found in the packages writer2latex.* and should only be used through the provided api writer2latex.api.* * A command line utility writer2latex.Application * A collection of components for OpenOffice.org These are to be found in the packages org.openoffice.da.comp.* Currently parts of the source for Writer2LaTeX are somewhat messy and undocumented. This situation is improving from time to time :-) Building Writer2LaTeX --------------------- Writer2LaTeX uses Ant version 1.5 or later (http://ant.apache.org) to build. Some java libraries from OOo are needed to build the filter part of Writer2LaTeX, these are jurt.jar, unoil.jar, ridl.jar and juh.jar. To make these files available for the compiler, edit the file build.xml in the writer2latex09 directory as follows: The line should be edited to contain the path to your OOo installation, e.g. To build, open a command shell, navigate to the writer2latex09 directory and type ant oxt (this assumes, that ant is in your path; otherwise specifify the full path.) In addition to oxt, the build file supports the following targets: all Build nearly everything compile Compile all file except the tests. jar Create the standalone jar file. javadoc Create the javadoc documentation in target/javadoc. distro Create distribution files clean Henrik Just, May 2010 Thanks to Michael Niedermair for writing the original ant build file 1.0.2/source/distro/000075500000000000000000000000001140165031200151505ustar00viewvcviewvc000000100000001.0.2/source/distro/COPYING.TXT000064400000000000000000000574771140165031200167050ustar00viewvcviewvc00000010000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS 1.0.2/source/distro/History.txt000064400000000000000000000112771140165031200173620ustar00viewvcviewvc00000010000000Version history for Writer2LaTeX ================================ Version 1.0.2 (May 2010) - General: - Added Finnish translation - Another fix for slight change in formula representation in OOo 3.2 Version 1.0.1 (March 2010) - General: - Fix for slight change in formula representation in OOo 3.2 Version 1.0 (September 2009) -Filters: - Changed to oxt format and separated into Writer2LaTeX and Writer2xhtml extensions - Added (localized) dialogs to the filters - LaTeX: - Export vector graphics to pdf for use with pdfTeX. - Support equations generated by OOoLaTeX. - XHTML: - Improved navigation features for splitted documents - Do not export hidden or filtered rows and columns. Apply print ranges. - Improved batch conversion - General: - Export images to a subdirectory. Version 0.5 (June 2007) - LaTeX: - support fancyhdr.sty - support geometry.sty - support supertabular.sty - support tabulary.sty - support colortbl.sty - support l, c, r columns in tables - support floating figures and tables - some graphics improvements - custom tabstop handling - flexible handling of notes (ignore, comment, marginpar, pdf annotation) - string replace (eg. LaTeX -> \LaTeX) - XHTML: - convert an entire directory with index page(s) - convert using a template document - support html forms - custom tabstop handling - support continued lists - improved export of table formatting - support background images - improved table of contents - General: - support OpenDocument - now installable as uno package (extension) - no longer using the XMerge framework Version 0.4 (July 2005) - LaTeX: - improved readability of output (wrap long lines, do not include unused labels and hypertargets) - support for more languages - writer.sty is replaced by the optional package ooomath.sty - color.sty is now optional - new options to ignore hard page and line breaks - new option to ignore double spaces - new option to specify that the document is *not* multilingual - support for cp1251 (Windows cyrillic) and latin2 inputenc - improved style maps for paragraphs (avoid line break, verbatim content) - cleaned up configuration of formatting - improved export of list formatting - support for other documentclasses than article - support for lastpage.sty - support for eurosym.sty - support for tipa.sty - support for various 8-bit fonts: Wingdings, Windows Symbol - support for OpenSymbol - XHTML: - converts units to px (default) - Calc2xhtml added - improved support for table formatting; table formatting is now always exported - (partial) bidi support - support for sections (margins and background color) - new option to scale column widths - new options to ignore double spaces, hard line breaks and empty paragraphs - General - Added ant build file (provided by Michael Niedermair) - Now possible to specify output path+file name on command line - removed usage of document specific configuration files (*-config.xml) - new option to create user configuration automatically Version 0.3.2 (February 2004) - LaTeX: - support for custom math symbols (%symbol) - improved handling of paragraph formatting - support for table borders - support for alphabetical index - support for pdf meta data - XHTML: - support for three different XHTML variants - long documents can be split in several XHTML documents - support for custom style sheets - more flexible handling of fomatting - support for most XHTML elements (including blockquote, dl, hr) - support for alphabetical index - support for meta data Version 0.3 (October 2003) - support for BibTeX - support for greek and russian text - support for more languages - support for latin1, cp1250, iso-8859-7, koi8-r and utf8 (Dominique Unruh's ucs.sty) inputencodings - support for symbol fonts: pifont.sty, wasysym.sty, ifsym.sty and bbding.sty - support for ulem.sty (underline/cross out) - export of footnotes configuration, list label styles, heading styles and hard paragraph formatting can be disabled - custom export of list styles - bugfixes Version 0.2 (March 2003) - support for tables - support for graphics - support for outline numbering and list styles - support for page styles - support for sections (columns) - custom export of text and paragraph styles - integration with xmerge (enables use as export filter) - export to XHTML + MathML Version 0.1 (September 2002) - first simple version1.0.2/source/distro/Readme.txt000064400000000000000000000006431140165031200171110ustar00viewvcviewvc00000010000000Writer2LaTeX version 1.0.2 ========================== This is the distribution of Writer2LaTeX version 1.0.2 Latest version can be found at the web site http://writer2latex.sourceforge.net You can read about installation and usage of Writer2LaTeX in the user guide, which is included in the directory doc. Bugs and feature requests should be reported to writer2latex (at) gmail.com May 2010 Henrik Just 1.0.2/source/distro/changelog.txt000064400000000000000000000361461140165031200176520ustar00viewvcviewvc00000010000000Changelog for Writer2LaTeX version 0.5 -> 1.0.2 ---------- version 1.0.2 final -------- [w2l] Bugfix: Display equations in flat XML are now again recognized correctly [all] Added Finnish translation from Samuli Selin ---------- version 1.0.1 final -------- [w2x] Adapted to work with MathML without namespace (fix for change in OOo 3.2) [w2l] Adapted to work with MathML without namespace (fix for change in OOo 3.2) [all] OFFICE_HOME and URE_HOME in build.xml renamed to OFFICE_CLASSES and URE_CLASSES, which should now point directly to the directory containing the jars ---------- version 1.0 final ---------- [c2x] Optimization: Don't include more than one trailing empty row [w2l] Bugfix: Fixed problem with name clash for Polish (\lll is defined by Babel as well as amsfonts) [w2l] Bugfix: The symbol U+2280 and U+2281 are now translated correctly [all] Added Dutch translation from Michael Janszen [all] Added Brazilian Portuguese translation from Henrique Pasti [all] Added Czech translation from Jindřich Marek [w2l] Bugfix: Fixed crash when using the option external_bibtex_files [w2l] Use \centering, \raggedleft and \raggedright rather than the corresponding environment in floats (to avoid the extra glue) [all] Added updated Italian translation from Stefano Tombolini [all] Added Polish translation from Dariusz Bismor ---------- version 1.0 beta3 ---------- [all] Added Turkish translation from Ferhat Nutku [all] Added Italian translation from Stefano Tombolini [w2l] Bugfix: Removed unwanted \hfill from one-line formulas starting with text [w2x] Bugfix: Fixed another typo in description.xml ---------- version 1.0 beta2 ---------- [all] Bugfix: Paragraphs containing only fields are no longer lost [all] Buildfile is adapted to work with separated ure and office (OOo 3.0+) [all] Bugfix: Corrected path to descriptions in oxt [w2x] Bugfix: Corrected typo in german translation of navigation bar ---------- version 1.0 beta ---------- [w2x] Added german translation from Raphael Fetzer [w2x] Do not export character formatting in toc [w2l] Bugfix: Added missing hyperlink targets for frames and graphics [w2x] Bugfix: Fixed null pointer exception for text frames without height attribute [w2l] Added spanish translation from Emilio José Juárez Pérez [w2l] Added support for bitmap graphics with backend=dvips [all] No longer create source distribution (SourceForge provides tarballs generated directly from SVN) [all] Added german description to filters [w2l] Bugfix: Fixed crash for tables with fewer columns than rows ---------- version 0.9.4 ----------- [w2l] Added sample LaTeX configuration for Google Docs from Elefterios Stamatogiannakis [w2x] Added MathML named entites table from Bruno Mascret [all] Bugfix: Locked controls are now updated correctly when the dialog is displayed [w2l] New backed xetex (initial prototype) [c2x] Bugfix: Corrected wrong calculation of column number for columns with two letters (affected apply_print_ranges=true) [c2x] Bugfix: Ensure that we always export a document, even if there are no defined print ranges (affected apply_print_ranges=true) [c2x] Bugfix: Now also exports uplink for spreadsheets [w2l] Bugfix: No longer incorrectly assume math mode when exporting plain text [all] Added support for the new Writer notes/annotations (which now can contain several formatted paragraphs rather than a single, plain text paragraph) [all] Added russian and ukrainian translations from Volodymyr Volkov [all] Bugfix: Removed PreferredFilter propery from type definitions (makes sense only for import filters) [all] Changed unix startscript: By default assume that w2l and writer2latex are in the same directory (thus using dirname $0), and assume that the java executable is either in the PATH or the location is defined by JAVA_HOME (which these assumptions manual editing of the script is usually not required) [all] Added french translation from Jacques Lamoine [w2l] The option simple_table_limit now refers to the *total* width of the table measured in characters rather than the width of individual cells [w2x] Bugfix: The position and dimensions of a frame is now calculated correctly (previously the size of margins, borders and padding was not taken into account) [w2l] The inputencoding utf8 now uses the LaTeX standard rather than ucs.sty (which only supports latin and cyrillic alphabets) [w2l] New style map family "text-attribute" to map text formatting to LaTeX code currently only the values "bold", "italic", "small-caps", "subscript" and "superscript" are supported, and the verbatim attribute is not supported ---------- version 0.9.3 ----------- [all] All source files are now US ASCII; added encoding of source files to build file [all] Added more File-based methods to the API [w2l] The paper sizes defined by standard LaTeX document classes are now identified and added as global options (a4paper, a5paper, b5paper, letterpaper, legalpaper, executivepaper, including landscape variants) [w2x] Bugfix: Now only exports the name of a text box if it actually exists! [w2l] Removed option "pagecolor" from \hypersetup (this option has been removed from the hyperref package) [all] Filter bugfix: The new option name "ConfigURL" is now used in the dialogs [all] Added (partial) german localization from Martin Friedrich [w2x] New option use_named_entities: When set to true, named character entities as defined in xhtml 1.0 are used (currently only those within ISO latin 1) [w2x] Characters not supported by the encoding are now exported as numeric character entities [w2x] Bugfix: Internal hyperlinks to tables, sections, frames and graphics now works correctly [w2x] Bugfix: Subtables are no longer exported with an id attribute [all] Bugfix: table:number-rows-repeated is now treated correctly [c2x] New option: apply_print_ranges ---------- version 0.9.2 ----------- [c2x] No longer exports for tables without [all] Renamed "class" to "family" in style maps to avoid confusion with css classes (old name is still accepted) [all] Filter: Renamed template and config options to the more descriptive TemplateURL and ConfigURL [all] API: Added convenience method convert(File) to Converterer [all] API: Added convenience method write(File) to ConverterResult [all] New option: save_images_in_subdir [all] Use Robert Harders public domain Base64 decoder (replacing the non-standard decoder in sun.misc) [all] MIMETypes used in the API are now defined in writer2latex.api.MIMETypes [all] Renamed the option keep_image_size to original_image_size (the meaning of this option was confusing). The old name is still recognized. [all] OOo now saves SVM files with a MIME type in the package format. This is now recognized by w2l, which implies that GraphicConverter implementations can use SVM files from a package [w2x] New uno service org.openoffice.da.writer2xhtml.BatchConverter provides batch conversion via uno. Interaction with the user can be implemented using the interface org.openoffice.da.writer2xhtml.XBatchHandler [w2x] Batch processing from the command line can now be cancelled (using the Enter key) [all] API: Created new API for batch conversion [w2l] Bugfix: Tables were in rare cases exported with invalid row alignment (null character) [w2x] Filter ui bugfix: Default value for RepeatLevels changed from 6 to 5 (6 was not valid) [w2x] Filter: The xhtml export now uses it's own custom configuration (writer2xhtml.xml, also stored in the user configuration of OOo) [w2l] Tabstops are now exported as \ \ , which usually is closer to the expectations of the user (and is not ignored at the beginning of a par.) [w2x] Empty paragraphs are now (again!) exported with a   (otherwise they are ignored by the browser) [w2x] Xhtml specific options no longer starts with the prefix xhtml_ (is still accepted for backwards compatibility) [all] Filter: Added display name and description to the extensions [w2x] BatchConverter: Localized alternative text for icons [w2b] Bugfix: Replace ";" with "and" also in in editor field [w2x] Added new options xslt_path to give the path to the XSL transformation from w3c (also in the ui) [all] Filter: Optimized the size of the extensions by excluding code not relevant for the format(s) supported by the extension [all] Separated LaTeX and xhtml code. As a consequence, it is possible to build and run Writer2LaTeX with support for only one format [c2x] New options display_hiddens_rows_cols and display_filtered_rows_cols. If set to false (default), rows and columns that are hidden or filtered are not exported [all] Filter: Translated dialogs to Danish [all] Filter: Raised requirement in description.xml to OOo 2.2 (needs support for localized dialogs) [w2l] Added ui option "Support additional symbols". This sets all the options use_pifont, use_ifsym, use_wasysym, use_eurosym and use_tipa. The pseudo-option additional_symbols can be used in the LockedOptions list [all] Bugfix: The class w2l.xmerge.DOMDocument did not throw IOException when trying to read a non-xml document [w2x] Bugfix: The convert method did not restart document enumeration (relevant if it's called several times for the same converter instance) [w2x] API: Created new API for batch conversion, which is also moved from Application to a separate class [all] API: The API now uses a interface to the configuration rather than using the class writer2latex.util.Config [w2x] Style of header/footer in index pages (batch conversion) aligned with document header/footer [all] Added package descriptions to the javadoc [w2l] Always export non-breaking space as ~ even if inputenc supports it directly - non-breaking spaces are usually not easy to identify in text editors ---------- version 0.9.1 ----------- [w2x] New option: xhtml_add_bom (default false), if set to true a BOM will be added at the start of generated xhtml files [w2x] Fixed typo in filter name: XHTML 1.0 + MathML 2.0 should be XHTML 1.1 + MathML 2.0 [w2l] Added support for the latin language [w2l] Removed article.xml from w2l - it now belongs to Writer4LaTeX [all] The distribution now includes a sample configuration package: xhtml-config-sample.oxt [all] Filter: Split the filter component into two extensions: writer2latex.oxt for LaTeX and BibTeX, writer2xhtml.oxt for xhtml The build file now produces optimized jars for each application, and the standalone jar does not contain any uno code [w2l] Added (imcomplete) support for some of the Euclid fonts from Design Science [w2b] Replace ";" with "and" in author field (multiple authors) [w2l] Added support for formulas inserted by OOoLaTeX [w2x] Now adds mini-toc to the element with id "panel" if it exists in the xhtml template [w2l] API: Added new api for standalone StarMath converter Writer2LaTeX api: writer2latex.api.StarMathConverter Uno service: org.openoffice.da.writer2latex.StarMathConverter [all] Filter: Added dialogs to all filters (w2l, w2x and c2x) [w2l] Vector graphics (except wmf) is now exported as pdf if backend is pdftex [all] API: In the GraphicConverter interface, the method supportsFormat has been replaced with the method supportsConversion [w2l] Added support for *numbered* display equations: If paragraph contains exactly one equation and exactly one sequence field (and otherwise only whitespace and brackets), it treated as a numbered equation [w2l] I18n: If several characters in a row are converted using math mode, they are now combined (ie. ${\alpha}{\beta}$ rather than ${\alpha}$${\beta}$) [all] Extended FilterData to support the property AutoCreate. If set to true, the configuration file will be created if it does not exist [w2l] Even if formatting=IGNORE_ALL, we should still obey character style maps from the configuration [w2x] Added german translation of navigation pane (w2l.util.L10n) [all] Bugfix: A paragraph with a bibliographic reference as the only content was considered empty (and the reference was lost) [w2l] Use url decoding when creating file names for linked sections (in order to obtain more readable file names) [w2l] Avoid redundant \mathit in StarMathConverter in some rare cases (such as greek letters pasted into Math) [w2l] Support formulas for sequence fields (only the most common cases oow:Name, oow:Name+Number, oow:Name-Number and oow:Number) [c2x] New options xhtml_display_hidden_sheets, xhtml_use_title_as_heading and xhtml_use_sheet_names_as_headings [o2x] New option xhtml_notes. If true notes (annotations) are exported to xhtml comments, if false they are ignored [c2x] Convert notes (annotations) [w2l] Heading formatting: The prefix and suffix to the counter should not be included in \thesection, but rather in the formatting. This means that the prefix and suffix no longer will be exported if formatting=CONVERT_BASIC [w2l] Added support for chapter references to reference marks and bookmarks (if the marks are contained in a heading) [w2l] New option external_bibtex_files gives a list of BibTeX files. If nonempty, these files will be used instead of converting the actual bibliography marks [w2l] New option metadata. If true, export metadata as \author, \date and pdf metadata, as well as pdf metadata (if use_hyperref is true) [all] Filters/API: Changed filternames to the more obvious org.openoffice.da.writer2latex etc. [w2l] Updated clean.xml and ultraclean.xml. Both configurations now exports predefined Writer styles (like article.xml) [w2x] New option: xhtml_repeat_levels defines the number of heading levels to repeat when splitting a file (0 means no levels are repeated) [w2x] Allow xhtml templates without header and footer elements [w2x] Bugfix (w2l.office.ListCounter): OpenDocument does not use numberings like 1.0.1 if a list level is missing, but rather 1.1.1 [all] Command line application now uses internal standard configurations (*ultraclean.xml etc.) [all] Command line application now accepts several configuration files (by using the -config option more than once) [w2x] Use text style for label when applying numbering to heading [w2x] Added support for other list styes applied to headings [w2x] Added support for text:restart-numbering, text:is-list-header on headings [w2x] No longer add hr and [] to links in navigation (the template and style sheet should take care of this) [all] New filter configuration concept: Configuration packages containing an OOo template, a w2l configuration and registry information to bind these together: When a configuration package is installed in OOo, the configuration is added to the filter ui, and is preselected for documents based on the OOo template [all] Repackaging: Distribution files are included in source, build file is extended to create the distribution; source distribution is separated [all] Changed to new extension format (.oxt) [all] Filter: Added messagebox to display the error in case an exception happens during conversion [all] Moved default configurations to jar; the FilterData property can refer to these using the special url *filename.xml [all] The filter now reads the FilterData property, which can be used to specify options, configuration fil (url) and xhtml template (url)1.0.2/source/distro/w2l000064400000000000000000000013171140165031200156010ustar00viewvcviewvc00000010000000# *Very* simple script to run Writer2LaTeX (unix version) # Created by Henrik Just, october 2003 # Modified december 2003 as suggested by Juan Julian Merelo Guervos # Modified may 2004 as suggested by J. Wolfgang Kaltz # Last modified december 2008 # If writer2latex.jar is not in the same directory as the script, please # edit the following line to contain the full path to Writer2LaTeX: W2LPATH=`dirname $0` # If the required JVM is not in your path, or the path is not set by JAVA_HOME, # please edit the following line to contain the full path and file name MYJAVAEXE="java" if [ "$JAVA_HOME" = "" ] then JAVAEXE="$MYJAVAEXE" else JAVAEXE="$JAVA_HOME/bin/java" fi $JAVAEXE -jar "$W2LPATH/writer2latex.jar" "$@"1.0.2/source/distro/w2l.bat000064400000000000000000000010711140165031200163430ustar00viewvcviewvc00000010000000@echo off rem *Very* simple batch file to run Writer2LaTeX rem Created by Henrik Just, october 2003 rem Modfied december 2003 as suggested by Juan Julian Merelo Guervos rem Last modified july 2007 rem Please edit the following line to contain the full path to Writer2LaTeX: set W2LPATH="c:\writer2latex10" rem If the Java executable is not in your path, please edit the following rem line to contain the full path and file name set JAVAEXE="java" %JAVAEXE% -jar %W2LPATH%\writer2latex.jar %1 %2 %3 %4 %5 %6 %7 %8 %9 set W2LPATH= set JAVAEXE= 1.0.2/source/distro/doc/000075500000000000000000000000001140165031200157155ustar00viewvcviewvc000000100000001.0.2/source/distro/doc/user-manual.odt000064400000000000000000006540711140165031200206730ustar00viewvcviewvc00000010000000PK 7<^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK 7<Configurations2/statusbar/PK 7<'Configurations2/accelerator/current.xmlPKPK 7<Configurations2/floater/PK 7<Configurations2/popupmenu/PK 7<Configurations2/progressbar/PK 7<Configurations2/menubar/PK 7<Configurations2/toolbar/PK 7<Configurations2/images/Bitmaps/PK 7<077-Pictures/1000000000000207000002648CF7BB5B.pngPNG  IHDRd IDATx\ǯn,TFE@A ;} P ׎RJKsw\nX8svv♹R@S:@~gD")>)2PT:JK8 H$ `ҹXx+a!D Bal7275~B돖Ƌ8BM'XytѱZ0([YS[{#aߕT Rqp[96ָ͛Ӳ$~II.U RdgMfda+(QPqKФ \[kjImY=q vVByh/ts_-fLܴBABPn y%9)|*)aK8@$ |R>7{Ym9 ĤG 4zz)p)If˫v|\-ޛ ^' i.fո#,t2X$J R9B|~c=m&dC Qb.œIdJP)dRl3 Du%//f mu-VU$>oJzZ@z̿HhFDoFid;7t4@TkvT~UۮF64Eԛ|~~\QܕQo8]q&òSضOІ Wuzfd[FKʫBtBhgkqg+3fZ)(j~FMi|&dta2l _#H:MYIYAARXLCn M@= 0OqaOMg2cu$thϡ$xdŷd%EƅmrOʽ6نbyqr3 "U0&d; EҪEe7$H_DUWaJAM\qVC7lTv-6X\ Yfg3iJ4چwb)F9Ʀ?2GK=CMu5 ?5F!]Bila={,yps20/s]|PWu@kΡ8ŽF2l{Mw!*;5R%J 4b;>max⓲\enf9SRN"?-?V{Mxxq>1.**`KI?)S|,g ")*3{u?~)B"RUt2o"Y_b;B:j\8@Pc?~a@~?3GS7(jPZY+ Hf w?xfo3hmVLèX7y(Dqf?yojf{[K ;N^%Oz**S 7"L'.U~WB=󖞚bt):ڵӉvJ#i^qP+i~ԺYP)3)93H.}ܕpR>&%P +4_oxaM稤|meڭe_wniAgdtzw|7QWMǰN36fܺ rTsϴ.(d0ICGuGN*<:R( {?x*#3bb_v9rc-m$F$ 4ZV뾆c߻PnciPJ{#Ͷ՘\4qB"-BWPTQSWTTQȺtТݍ;`[S="g`ż<+3%5M,!?a>~شfEj61ynq昁r@=yce Y4T#e#4 yhDPjBM]&t }Y3O=h3˦2 >ܨO%t hθyAo'arɟ㾩RZsZQs}򘽁(F}itk; M*crT %~֓BB+WcAh2BU}pJi>A?=~,zy"S}ΌC"ʍٴWQ#L9t4e?{0ְC'MJ\\Q\R@EnAײv6~]߲?ל-,Ly>Wl\V#sH4zbJԬő--cwG6d=hyki)xw0Pǩﭝ[O'tpxّEM۫Q"{ +HrhN(rh&%Ҫ ~> ܓ$嗀 t[zvVv +n▔SH"$L3 W yXGY:*tj+S&h ]#g.$p>Igz+-v؂)ʛ%2VMfP?::$cE4%0P"[dmɢt6-)|"4n.; 'T:_&Daγz]:+,p|q!u\..NkEoҝlQ4{^Ѝ䉼7#=~^ȓMWSv5Hd#)QhYI?$ -25?0Ѻ!r7E ǑlrZ*VGetE#&Ğ>x=J,-#Dbu '7]}ǣ:FO&,okۅ=ۗ6(>[ iO&4{rm=!Mt$pˌ-&43%h&썛Pod{8=}Ky~cgB9HOrյ-bw癗?x&*sG_y,ђ*I`VNsb=~ 1޸eg 2Vb*ʚJ$6YL C>D4N3QӉ߅%iZSnr斕ElcAQTQTBǝO0ԥ(S35dJa Sgt4WF$9q/b^tk'ŕd<2? h$MP`KX" ( 钨5ѓ7QOIL 9.=+|6] A(bsViQnɔBUzV*``@$>mUL19i8MR(tHqKT fJ%75$qV5Cr\գ)BQo_,r)VK~#Z"W7.UO 9 LVbc 4Ӟ2I؜C&-B4%i Џ,>5WW 7i AIEWK& 5"/9O`N"Zh纀~t49ÿdc~=Q/IT1<GVvVBfdƶ;oӾmt+,D` Tai M!dEDTVOXJUV1 $2_6^ mD^~a؛5'_a=bAm-hNhK d| ;lsrJTbE73Vx0~muZKb1,!@8a2Gf2Z rg.5F# 6탴y%qIoӚt2ö[ƝHz. 2.c˿:XN-}`H\yvĜ5Z/{x.|'3kv_&1g7V-hE!0|>zxMe~L^)8;N9@xz\A9Xyfn=hQ;'+=nR^X[kN ;vkL U G Z B W' wuQמ娪)ҕJo8hF 6!h(d^eJQ\.+_'Y[m5}uc۶ CTp48@tא턣֛"?o'Ucmy0ՃGMSbzCSX.!=!M@%R0WBN+enߦE[DPqbbے :{˗@$g6gŇ_pBX4-$  .]J)ЗLTڙ+jI:)Y慎V-CCW2IOKZQBz:趜4h7`v.SX2IGS&YE (7woIfyhŠ2TI TSvm&w׸"Z2D~rΛD ̒N_G?4z{2Y^?wt;QNJU+\'jj͵h p4אN~yZ*M<Hᒅ' 1{X|CdA$+L5%L$@$@i^?}tH"1T\(5W@Ʌe@0/:[]-I <ѯxd4MS@HF}Մx`H tC>R|1# |AZ=-\.[3H%HYbxغz52joC֠}Es@$BTVPⓆ`P!o!tv:wmFgpy$u=+lW-Zڴֺd|+S-͔4# (F4M WYO09m0UJ;R7(+ 4"]A#kшDAJH6 &å8`7dMM&\(2T {3L'j1T&Ո\3q'CTu0YuJ2lEeWS$|m!WxE s~IrףҫC$ $ѥ*7 "A@Š|$dilY/C&՘JWL:dnL1>PnCTГIUѭ/%%QhE]* u5Vsx=nκ')*ٚnjd* OUF!552HamXVPc8%Wc~U5VxpϺy~>KI#5U#Q@,77BR߬}ߝrYR7QSnO/{X}pss p[z%PPPP@ ނΟQRRs1 mP|X,ANځ{4cWȇڪ:bK۶hkk%&%= 3i>ڵlj6XlC_i]ݺ:>za&$Y& d7o07V ,\lIZ073#(~]`+HWo8yڹ[W I@4Ng<qӖQOL&H@Fj $+{زu{OjjjgN;Y"ʰ!9y ;}܆uk$r?atkMM h߾#"ФF2RWuW,[΅KfΞgҤI~}$yr;䆺ZZNmU!+;{CpJ._5![+>{>X\(kkN]-ذ>PWGQn.JW7'9%D"YYZn =s9~B"(C о]S K;~]]TUUt۵S[UPRRڱms?3ZZEEJf">}l/^p\[ӧ5\glfk#RQdISaGGoɉd2%*Nݜ}L;ƣZ6O@us|EQQq= h4Uغ} taC+n2Y,G,%Kg\lELL*5ڵj٭kBBN/5ib/G ntÇ+(*Μ=kB %p8V,i6L:orJ5LXd-J ߭e3wSцu:ctC'Bbc? keeb>}OL3? WUUٸi(ϧ{MUgDs RAAUo""۶A'NvUBd qܼyL7w6=t`u?q(&M:u͛Ȍ̌m߱s8O2!1q괙sf͚6cf8--\iPnQQL=;w8t8=-0lkJ_M(!3g͹edS|&Ljjڼ <|D$]zU6h!C\^ljyo]kH$Re,\CL6kehhQYYYKn`p+HG͝'>m4i(TAAQh}}=4G_{ZSS.Z(4:(~ؐsfffs5ʣg|P ٰ.ӧS&]YYH9gcc"QwTD$|| :ɾ:2s9|Cא#iTZ^^ 3JW5\Q8M",u%Ч>Wv{Ü,4p~A ܽw*Pv+Q{>S""3qbHh( Μn[\C;QQN0"o~Yt\MZBmG.'S4OLLv 菶Ω3gOm<5UQtF55UL/_vfҫ2`3ѧ2,>)YYYj*( hb>SRvSTT vHWG*f1Ѯ8(_Q<.,ek_qsϾ) ¼4 ./4qyX|rb"NGcB HJJ4ӕ`$M($"KEX2c卑ح)ɕuQ}:mTaVt)7/? s'hm۷sѨZȥڪS~ 6)((x  3"455|sq?Z.m,u Y616pr˖-ćBoa2ݻKD(BOOPUU 3P.35-wS'Ɇ%={ q^i{x4bHttt 0RO_ kA}e`7 _B5ͬĽІy=ol6k_;wx94AПUq}{UUUQ#׬2 ҹ{oW|e=s9~rtYWth߮EU[uk&L5cqyΛ3gfl7]v]e[iEd {'N^jN_2mmmZ[f<oEN;Va-rVi֗ ,6.# O"OPPPwuW r O6-Zܻ"\h2Oīg%%%m-q~1w'u #>.?qq9+|,?ņcGΜ=ҦΘ{~B*K.[Z6]8^ xgryl  83N;`v(i_TW{VVa̬fϝahP%[m3wџA rug^AaӠUTACǠ9mkי,ր"M]:w"ZÔ&=[e sWϞ@_4D3 hڤųqZ.NZn;Go[7Õӭ~P%+K3+ Cb 53F[?ӶlX\D?q5S̻6hd>_7+UT\\EFFHMVTT:qHy\nc oh`jV2|ϯ, tQ@'Q Ts}63mJ4 0x\^Bb|=()*61 [~9z1<06wXA YX67jbZXXІ@9ѰoaU8D4HUUUp8\.B {VM7o& T*59'Y"f% _!ir1q@-9N61%oA Yu25>ųAk.]! 6о]6D{A&L>ŕ=cQT: 3-UШ 왳ؾUKKKilbJ 6, <.I 1U`2Y^޼@ϞUP``$2 I~3Upu9k0diӑ$0DC56 S+|b :uw׎8cT;8yݻП9FU|/^|b77{U_plwwQŬ \S7ov"|`cƏ1|`~YI1th7^/mJLJ {P25k֬ٳg׭[wҥgϞx{{5*,,z]amjU@v?YjZ[}МiTo$ BZZzZZϤhײڰCyyhz422ܽ}î=9` 2(0F|~kQo32Lfp:P|bRҌYs#ޢzg͘6skijʧ>_.&+Vhڴ) Ǐmll*_+f$&&YX+**6`Kgy7_V 'U044@2p)'jLRSTGuuubfW.766B1#Fݽg3ׯ\RWWpY1"PQ&kx$}{;";;۷oخzTTv Qk+/99h0>~ t룺CN@"n^g߁-[~6{i>? _tk$ `u(f[wUoHPԴbTy.wV*9Jq 狨0^&ު6{_*@ʿFya{^q{9qD;VHy4Bw eKVR¹pL4QQQhFFQڽ/9%BAD嫪b>YlVzF*_old\ @&A;- TET_6YAN֯ϟ=P R$Z\y; 𧀓$fSMGG&VOU^شe/ 7G7e/1cT[k놶ɓ'wb7"xGݻWOOzESeWܾsG(f]y3.K5~D~p~Oo+ׯ]r6Tn6ȓA7 of͚5{l|u.]3ooQFU_+ \*NBb"^=KMKsӿs\/J$ 7U@џ8ET/BCoUݽ/fW5#؋\WϞ'OMLLk>pB#DNedfbtq LOϐ]M :`(|7@8q2UUU,@'ݷwCGf񳱶;߿i4##Ckd RTT8)]{zF8wx!$/,,0a3Rm_-y؊ȏ9Ϳ~bP&c#CL=|dX,_ V&Mpex4cB$ѧxit- 44?JJ8Μ?ir\L!T/ݺ:H$$$g_Auz-؟Aʷ:k 4&޼ycoovrss[n]Y|}C$ seIV*.Y7g6~;89uyM 'rRԿ7FcuuumѼaC۴[Kp[*Svn߽ҫ'ߵg_[KZZzvhYY6e;mF]Wpkk$ ȧ$Ԡfl7kf5Y,fP:o',p:ѧƍܐ,\{ŃGcF X6 El`fjե׻h33Y?ݙګg.oڽ+#uw.-mݻ=|@:哦L]C]}d#s<ܷ?rh򕝜XlkVGE 422TVVF嫚UzZX7Cs|4נ@9rǧtDAALmm%Ky pqq9{W_'Vq^.zrsVr /.*թd"V-45ݸ9td@"dUYaJN%߳s:Nۼ1w[ByKKwheer2iii-yH$yFІkQo32Lfp::rI[3ux̤I+n2Y,G,ͱrztlblMIIe];9G{j ?Vh fd bn߹ࡂBo]`"udFnN1EkW#3QU#L9)_Yu#$%ݰ¢-OePP'@xuut CϜ<$zꚀ$$&]omD/>񝞚fhhзSg֯]*:}KP/_=|v-w * f8/Z^В+(*^xfU^u'Ay̌Ν:\~}$4̟;JzFGtuu&=OPaUsG6QuoPcHJH=4*r^wVw2Q$TW#gdfJ;t:.751ACTU-ud4J,6 }5e+ 7//@(2%>B\2J+}⮎v-]%Zoﮃ̜gcm7wNUѴ OڲmCeWиPH[u?W|dJ9qiB+o~은&eĮN wN&1/^3hsjSa2se)eUd64*x\*Bz5w̉Y팕<AP+Ua7ȹ$%%#ѢyÆim| bU@xd#8&"X$N]-ذ>ւG{P( Knm{.z"kϾ_|_oHQ45V"|z[[;? hcc_2yFDFжmfs\ڢTX,\Exn?+:4ס<}NH|4WE۽zq2r4{uw.-mG$ 1Gnٺ9SGY٥HUUK]Ξ9}}9:{,哦L]C]}_G_jȳ}G!cc*3CN;w1z:'644x إs'T츉>B+/mZWV>}VL&#װ!ԱN<4]DVN}|T!W0?1xN8*/As2SŻM-,l Z*AnīgZhjbxwOՖ QYnWsD:As3E "[WqM:#˯Z,(x+.kQV-[7mYp\P4\HH,Ljg@JHohK+\}0|ˡXx^) d2EP)y{>_8KqXo HӤqԋadd؀@}1;(}GWqP$IQ4@; IKϐ*+ꉆ'A=Ih@@2@2@2@2@2@2@2@2@2@dսXcjW֦1@TξiS}&M4[t|ҌSmk>m(mԌPǫk G.=jSup8Aݦ,i~(h̶P3@> f0'i D|Y\\jWu2Æ @W eX7XKdLKKhɣD"W kP|Wg^=#"223-۵{x$1)iƬQo g͘6skijWTPvW^oަgd2u΢WLڳci Ɛ!i4j(sazƲiC\1##aCm &HUTQٲR+L:K/E핥d \.Ix/v(-=T!6VV,Sg,~t:pUU|z673yjш~}) ¢J1 L`KpUTf,TaJz M)n^d)FBeP, TĻ?rrAs&D#t;6`L==6v WU~P=]݂BT;aSS'?s[W'd^**3[^"TԽjjQo}:|p_f~d TU5rĪn.]:w444p܉ ZIKKoΑFjijY[[uu2o< eڴim| bU@Be4kf֬fA[dox1hcm5r9f*gM-K/Uؽxд`/{pGR2IƲ٬~MHTTTܩ0d2Cܷ?r.EEE*]:wv*QG/Zb۲ ZX7C4caL=ib?~ |,e**3^{\q3333(xڰu^Q0P$T )>&߲E{CmU\G !ݸ/~(e4Hr2S&]>oe2%Ƌwo$WVEefWKuضS|&@QѸ X<-10^+;᪺IVvP yZ,eXa5k7JhS!A Y3GAK󹪠2ꇵoW^\MネNyp7]QQ᳝\ݾ)!!:ԝ[UUUyǦ{>񌶶uo_o trq'e/Z#|"Q>%%m%ˡ̶p_伐A:8 ◒<kOݻw\dq%!1zHcc II6]Om#/-%J&EC.F,(,߿kN: KJ*(**풴4eWqTXF HBYYỶXS8נAo  ۰)h|V(++! !_a"LuA窂L)t|B׆}OusuGVcGi{LtT6 cFm?vQVlvVĞ]ܪзjiiv _Q`lрkke|=G: RsB 煬.̐"Uyyy :Yؚ+)uػY]EL'-~#L*"" ~ YAAiOPA_P/  \+  PA  TA UAဪ p@U@A8*  PA   ݺu _Q`틪 t8UzރZ8;xk+/X;Ngu(S _£C%*ң[?bM]))/"VSS,#tdD IlDa>h5U ulGdaVSS+!.AӹsJJJ,mmr~.)((yZ,eXa(,Y.%_ffÆ nw` :}ۂ؋ B]]m$ܢUjPǞԻ?qC%L ;x uA۵ki7RA\MrII{g9<⦯,~R/I/%'DOJJ* gx.k|-Cptw~>99BBR 9>wAZ+*្"P v&6d77jOopA* 4Oק= 0d~/ͮ! -"U6c$( }&D4 BA%mAD*  PA  TA UAဪ p@U@A8tPU֭@航p-o΢ L&tЫTV/][I.Ns?Ea;“k 6ޞK,ö҆翓Μ1MC5N^ּf:΁:w V_ȓ6v fBۙ۝fyy.5f0>fCCú B7CԾlECVhǿeòrM o}{ΐݻ{' ,忦N!*`)RRRm*D S_kWYztk󧧑yr˝=55%FwL|7oWUVYZ9=ܷm=9Q'O3j׮uq- ٺYUEd\7 *0ǎǒi##4*oۙÂ㗋 j_jD IlDa>h5U ulGda0)))MJΞ|+KʊEqqq5$tVbǏ|,-%l.8Y=Ir/2_o L|ܷgٰ~ۻp"AC^]aJڍַO-G&wC2t)266tgv}}>yZ,eXa۠5k7PtG@q#.hVbkOWO5;O.&_i&7֭ZI!_ oo5m Sno(KIw#Ųw~&&baBЃduBݹu]UU5/?g ş>q,ZOOy֖oI.~7u ネNyp7]QQ᳝\ݾIt<%%څ^'M\yU<߁j6 l 9|- KOKf_⭘)ud~tЕW^bGcNKyw쩸ݿC xG~2mA,Ǚje<-g84܀9͙KXK} 8w`yO=]guo_ooy`6">\Ĉ) )YәTS7DY=`Fl"xS01y0($F IIV0튋-AFT؝/^BI?E ooӚ.\SS g>&#fUx{=&TVCQ:`ՙ[%EEŚzM1P=ܹDPV-Œ>j 0"&PUU/js!^g9&E#MV^r_f̵qht ·_Py^(߿K1H; "UIq"V_[Jh|78Μêr|/ps ߽l0Kɴ! KqtR9t{5^bo?^ZfX;Y,y4[LBFLiW$ sLGǏ"-- [("MVPqdW䁈޾F C?_2ʐ TQQAa,=zPI"'^Vfi)ą@ӒzT+ 3y7n,L#Eʣ&T^H)*P9jPK/b+%/{ih*U;7av'N"0-GUWW73i<TuPQQbdeeiMor2eX+T}Q3Z"]VVFk^4T/[T[]x9Faad>}9?}QNf+~^Υhl9 }(_BBai ao3 MMae,i}B%7TF_ 8cXi ǟi\ :,9cpG4PW EUõkjh C\CBB"lwߧ] s] bbbL9qrT##$M<BAo  ۰)h|(++7662g? _d cVݽ} 8 %qFKMCfyy;vl`@UAkq;Bz(1A}fR=! LCs@m"?m쩸#ч  qNO@~r^V > 0wQUUy,4staN־'~x&n?/Q~-X,#b7ẻXAi|)xZ}F?Y1ϓh3J$ Tp(ln]ZZ{#_MN3z缅7R.:/ϐ?v XƸ`xl0?aaCN><}ϝEAAnBٿ }x̭jmm=@7w_lU%%71Q[ZXVcF(OA q[]H)kf4!FC<@^!b?]K `)Z_xa!!yϊaiǍ9X-/D{{* yZuAFWO٭[7>"=1T^H0xi~|@Dk:X.ԑl/%( WN_&LӃSYyxo<~NT]8_3bo_Ν%w=R[:XL3rw"^7̆qhϮdB(zJZM@5AT]yz"RZ L{7_ԉc4g /nӂFFW4/sIfŪt */w*!"DDkh׾+.!( 41Z]GXFAQ 3gL7ikX.ё/TABB]M5:f vS_w(0wtt[.tZ9=!U:iO?O{$a9-~K-A|@8#HWB0lmi%LA_UIPQQAK# jMiAK AU@A8*  PA  TA UAဪ p@U@A8*  Lv޲5dsf;Xx'! òrM o}ɇQwA6P__GcN Brz\7/ϥ![7qӅ^SS#%%%hAmTzڍ{іcML~xrEze6n ۱kG*..XV11cCo@CCÊ0[_k}7_K6*oam3~uFfi;vgm~cХ,6lНa Ǐe7&_Rbiii۳9& iU8s|oFsq_4IAUXLh1:|5pzF[PRr:,?aaCN9zqZY?n_΅e5޶BCC}U'U&&:*pV kJEE1G6^~(s+6Z[[+b.PfN~@!t >WN?ʛr"jrdyƣd_;CN8ƛ/JT]EE!5=bf͜D_@A8*  PA  TA UAဪ p@U@A8*  PA  TA UAဪ p@Uh56ޞKLW/~𤋮̝ok?ynІnYADEgRs ڑvs1!j/Z*^yͺ:G%%%ZY،nWhM8Lr6FAT!歰0"z[UUnݺ&jjjF߾Z䩆re>+06>yZ,eXa۬,|qqq5k}k=iM@Ə|,-]A/laCwm7m}Qg߽w_SCMD<}DVFf4@ii)&  M u^-$A+++7yyNv#+[MM5t[0QW;gᢥQt0pyy >sm rPOC%LjUp`pbC))I'M\VV0q<á 7[CB MMI퉣`}+WɸI6KX$ğKKMJݪ\oQ8;9xBE^޶}y>ޞD,Ϟ?WWWSPP8 f^I hb MQQ>JKKK_v5N{7)aҫ_Xf:@t>~YEVVh^H/@RR|Qq1Kk-vmm@{(zwdrOe 2F8@Dho_#/)*tpD $z@Z^^+"D+.V]],-UUQݷFTPW|z,9kia...1L_O***Y,,Km.( Taah!MQnㆵ׮n3bɊS&SɸrwYD]Q~&&[n۲fS766E.^HPNNNAoe`>WixQ^iMWwFἠ&V&zr,5-ܩdJo4R)Aұ D>*=T8[O5^l :eLW}A.TARR$[QQA{Zp9;bbblmB ]X+u ֖b-ݝ` AF`3zIq S-u" h+5!A :/i# _TA UAဪ Ц?H*  4Z &߸*  PA  TANXXx{.u~A3L9ۂDaٳD _#g^@R߼~㦠_Җkea3κ]}jFJJ ٯjBvVXX"|ZnSUk_擧˽yx6>yZ,eXa۬,|qqq5k}k=iM5Ə|,-]A/laCwm7otYY2`;)i7n>z[>}[FgLF<-YYgegWTVTTlY!++{Soia~h׈ i}mnOGL(--w-F1Th޻F2tӻZA: "PZr!ġ&*[0|qz,>t>QI{%˳e8AXm!C|ttw~>͞ 7}2qO]z|܃CQPq21 1gc37m!UىpF{swPAAaƴNĞU<wz-|I퉣AnxMv[zl[N 7[CBᥑjkX'Q+ -V,a2)**ZD]͆:NWUn{7)aҫ_XVf: 0~8u2bjBF]OdU4,x6oJnoA`]/@RR,CvVP1m:u겲2@_?@Dho_#/)6 I^%W ^ ˫UWW3KKhC@5!$_$|L2˷0Mkz.)wX%;Kҥd95}B%gb--!ƟI(cK  ad>}9?}QN)#EQ~&&[n۲fS766ޞ}#66x~F|3aL^o?ifn@b> 3y"5ZQȋWѨ IVӧȴ ?)(ttT ^*-"N?k<Ď(T۔ٰw=vp!65}yy^={sK _SV[Ygfl) JKs-%ADBZ+Xxn~ek)ot%bLJ|2/ظhAA@$%%oJ@;"'y`GLLlMv=a ߽Gz'x~Yˏ- @ZY[N/^$k鞣[ؾw_fa2Y[j-9_+A8&%LA@y>6 քHFA(L |iPA  TA UAဪ p@U@A8*  PA 42=[[W/Orqvruz 3L9ۂD HEz7X+ qS555RRR. HAvVXX"|ZnSUk_擧˽y .XXڎi bnJ#&&6~uz5]?:# tJqV7]Jb͆ @_Y^>~PYy& onL {{ƧvCTCe)++kџ]{~:uBN9c:~YYgegWTVTTlHy$XqI̴iAҍB#4|Jo.3aZ" ]Bmm-HVhNPq Z\->8 =sJIIM:=lY2 L;AXm!CԻt3g2+**#|˽7=n~&&b*zMh̉s a쩸ݿ"]`"j_e/s^._z{g9<tu'wo_o(:!ܺ m='畠D %++? <U+W\KAusuPHkzϢbj .6F^^m41bH؝BHi7g>VVt<aL%,POѥa2oӚ3E?Ȉ g9Ý<*?r0XϞ?WWWSPP8?yىѣF'M'c @9@r^^@C !UTz jA.(6JAKLnĮ6Q2_jvqI N'Bۻw&Tz" yLGǏęP Ahs<сQa"DD7bq_UE,i" $%%+++ h׵ރiii :hLI*@MUV+.V]],-%ۂF#<PW8|b 2UQQbdeeal]^[[Krm4p@J5;~⻩S]9^O<-..fTOee11ZFbN0Ȉ7yy` Ч}46jq_APo jA.@T hr? Lo-v=MR/1GV1?X+ˣG7bcamSYY0fh{;fe;{/ v&R7ie#ͭz()9LGwu"3H*`{.?jEq֊<@^@ssu@jiiv _koenfW=t{:EtD $ZN"zz/L?x('' 7R20HCLl2u$qq/vC1A U"F( VTT4~_\11 6ۂ6? X+u ֖b-`  @lY05).a QA}&D4 BAg%mAK p@U@A8*  PA  TA UAဪ pR`k?yn4 ґiU8Z rwXӧ<3oAiOf` DxÔɔ5AHۨ\xAWo |f 3l>2tӷc Hh2+**#|˽7sr^e/s^W AۨB D:rO6-:7z癏{Кdy(*#J/ZCó&^! mTqV=+,|'&&6m##-%GaC#DD7bNh&! mTA^^^SSb )7;0e2l>՜('ym "-AF XSS g>I56Ȩَql޴l10y|:7zMuî3M K~Y mך.isuu5XA+ ʫa>}IHLY[Ggoᐪ Y ҰD|4(sy:N~@wo[R„+<--M ;20!diW$ dyLG FDZQQLiiˮfS7돈}8 L$deeV(ۄ䅷G%LB72_[KHG:o0% A6Dd HxW i{`Hɣyy) ΣVQQbdeeaYZJWWW.=o ௚*?}zل.M%eee-v uup/%"1Az,9kia+-g+AMIaPSU-/q#]!yad`Np2.~ݻ+#Ȯ Va߁ӿ0d|:w7yyu iS>袬7ȴȃ+|}dAo  ۰)h|_w``J;hk6qðѦ!`V 60omwX,px A6D,x+AMIa011gbe-lVhX8:7f0'詬 JiCD(:*Ȕ2K((,dطoP[Q7Wgde?vjr_CAT~N>u=}ϝEAAnBD"?6h5CkeI~n'&G[Z{v*nZxHsJJS[A̘(6 cF`JIS4uaᯏZVyEфQ^ &:z-[rz$<@s^3:*y A6D4 H(TA^^ AxjyEi^[Gsg]oϥDGy+)uػY&$rwɢ?~#43.5g2 nGhlrW)_E-vgU x)jEW4/ռxg"}C999nMM$A6c|Dg7 @\a֐S&@*HJJVUUb#v+**#IǏ(**rr'[mA"D c,֭['/@Z[C2".[D|@lY05).a ^! 4QWPkB$M# t_FA4  TA UAဪ yKuԵPS00'j_P5yo^In,> SW[uιtY]=}:5t(^9kA!0Atq <. ).*@"zPRR]W[ڊ00 |։KHvE»wE:5Vp[U0L#A^SY~ϴVvM%]Fh WXWB)UaCCmAdD* [\j`AA!; ?|E蘐tJUh;MB()؈\9tN*t)266tgvOzE<}DVFf4@ii)/(({[r/U k<-aXmVr'O54ԗ{-YA\}joQ%6~oA}AFZ+p_A~yx0 bll$*ׄ |Et̃銊 ?rM =]g8\lUeBAfSRR'*)uO8syֳ 111y 7;{:bmBnjIKۍt###FIQ!OΪ bN'$eeǍi7g>VVWG|I  ._ K'ğKKoۢ3HIaKWP:|,a˗KfLs. ]V=ۣΪ `0 -R^^~+* ۈI8s"NCycc#~&##oĸI۶lfYa7XHHH̞y(귌_Νmt1G˗'Ly'qfR.u쏼wڦRQQav}^o?ifn >Q#޾`o7!lb+:πa eK]ORΙk԰C) ];CSgnC4Թ锪pT/iEE!5+*`lzss)Mc,2*-"zz/L?x(''_10 ͶX&t*4{;wOŝ3"uM(:*PѠ8X(O=]Qw??|ز5dIt Ļ5k>Us(|ǏUU,)T>5EEEN.󪪪`^0&t[=B·D}]}yg(''Xtjka(kBE^Qa76Q{ u 킷yzvD k\Q1lΟ=ttrSW[:¹q3 ]= Nuc1c54NTADønEE22}  &D p p@U@A8* "z^fqf$s˱ ~UAQfc(p7sΝ)_ HzꕙmOBHHHe \J:8EBU@Djmu=())ҮimE TAjj%$"ݻ"]ښV BGfXXx{.u~Fd2F^$g'W繟i|iEգ*Ň"#Dk)Uaki7 !))t+OoQ%J 6~oA}fמF./gΘ-8^j  Ah'@zؐ!͝UH>+5X)2+**#|˽7%w+CԞn:NAtu'wo_op<s}> Css|XY^y(*# ja&C!1zH II6 *?i=nn(DȦf7"z,\5$f/^L?!]Z6(+6߶\MX m}?@*`۪+/Ǟ ٺNSgMK +' `%/!Hףa՟>x$ɓ`\XNHH..aRt1b_dAadeePTՋH_v5M4&ԖJLnd6ux lIt{<u8߈aKPPͪ mFM5j3 PW|D7#/?˷0-E =0&8[gkPWSdX󘘥·Z^^QVVFCV!},a˗KfLs.ύÔɰ}Ts2.~ݻ+ 뤵﬎LSW:o:*s钐а C 1~+jV 6Ms4FF H˛:yU,Hl̉X:ss 5alldd>P bm31 ܲuۖl6+4,%!!1{c䡨229w׹% 7ꩬ N@ڗ.uyw^|9~D`w-QyW`b8aڦRQQavD18ꏬl5Uǎ$@&}^o?ifn >asfÆ/{m|=w{ gQ^ &;eK]Oz)kYJ :DpouCCVTPyg|h #c#m&@rD\tJUH8}{iA;BC`㭥YVkwƣ|"? ҢDorzx{.%W/_l- ?)(tkfp10 ͶXZJ25+.!Ng{ws\t"SJ9wk$G(+!~u\!#7\ֹXKv]]4ߏc|&K3}z>w;L"=zp_BmiOž5<*O盫:cܜ[|YffWͬzIII^>%xB+<' Sdzu];}vFQ~>,_Qf\Xt /clbka>E06pJ*rvrPd7ޖagEq/uv]: c\]x.RC.0P69v415cVCHMst *l ("\WH(H@*R$ T H ֹ`!q]HZK3MJJJ&-"PR*<[wfggkvC9kFz=MVtt;rx& r _r;88;եUu.],"{!WB&<555V .]YPP)(">33s̙͚K(L #<>|d-M>}z-7W]]mm;vEUo٦7뚛a/NEnݪ劐V('޽z^|ԯe?X,%%~}W0;+ fO||s/Xz[554xkܹHNI ^e.q׭YLMR-c[xWz*a4 'qqҊtÔiS';;u(s߿ }LfV@`nCGс BlެLquN.үS*~hݚ*͏477H(T~XAOS`jjB14gQ#5mRҒ,űqq׭0!0<1MLٻޮ=E 9JCC֍k::5-ۯWx^9o;YZZL2so.Stsu۴i}(r#|eYƳgϗ\tںAvvϞ<{|Աõjzpu} {:mm#Edfd+m^ʀSQǘ2_!F> 鵢j)n޺U Pjb5fᾴ%V֨w-H nW`ĥ0OhBW~ߺcGܺwe~yϜzݺFٷd|Z3yKW|pOO6=]Miߓvf)xP Ϟ{y`(U]K8Ǜ^7m9H:PWU{گe3ěiH Gx*J2r_N4u[;fbv9R$\xgͥ#!mz}?Ϡ[nnÇ'Ѿn.=RwKe!I{ž]SC3''.䔔5k0Ә >J+)|C-&Lnhc=y6laN9ş[Khn&677$AmT+C"Sihh0l''0eWAxp+Wuq-8KiP(48`Ejpt 8Lli=ԩ~}zQoN#M:}ٿ7o,0--ÇLߝ:2zA7J=9Y̟V55 '$&É퍍3D~v69r?!zrrrh-0>! KZc'NE{y/Mޭ۰oowkܣO=̬, ԻA,<oMCHk{.]:׮wquW ʰmvE  -x06)QWY/^,s-7;{K'g*;l}xYv۽'UH)B{ԃ7il>| / nPp5Vx}:{3oF k|/sCCE"9V!kmx9*J@* Z)>|iOz^ BwvTuW7wFܾskЕi{vmvprѩi׾}.+E [I+cOu.^ʠq/L9|{H[9FѾCZzӥC 43Hvlevi?`׬Yk׃v^۶P1p 5jpc/5r]v4^(L #&m! ̀*"Kppr㒘O3͟m;Z}Z8o.Ռgʜ Blެ)s7II}x㷛tB*}?ߑ_st655iHߨ͚6gi) >sSjR>k:03yx^~Ä ݼu"vlf՚|SO[WW70Q\`/hG:L9Eֽ+,C)9(ʜ}Q4;b%IIBJ *5,[rqK-wFx}?Ϡ[nnÇ'57֭"240(>,LNQ'օ'$& ++$f@KKs+R @UQy?oԬ7tP|:8`EGYT 9ط&i"il 30*/_H4t;Gc޾{nƾmmr?*6u\"('']wӧ{Æ64@ t#3+K,7Hzzz/_T= W^۾s g/QF}ɢnԔTa _[7h ]_9(p% #\t^uPbsȼ~r *ijJ$lgx<GhvvNNOĤ/]S&)I8iWtr^..ο %5Y, iѼ?ՠiW}„I~FΞ33ƺ9 v׬]idPSK_>K-PW/1&Ç)YY+W0M̜uL`úڴu2:++M֫W.bV^ "țA?XFAAz l ]w;wkWUUUNE|\Z߸ޝ&&<իcXí;3@;bDl*P1Mܭk~o232\'i/^^xFӂox֭[}lR!'+S&˩ا HԿo)jLyޞ/mժmZ ĵk~G;tj0 3 >>Ȱpz]bq^n.R)vԨAiJ?{|~FFU=fjZp(D:P0Ы]|^xNG =cRRi64M*LS->{xJ5x'ܹ{oϾ<2x;;cc㜜o?A062V8 ;J c Hu]s󃇏6mڤ$w]v[mSs&c\Ą]Ia9un鵫(‹ o2:-]H,eӞ#[r7IΞࡗЖ-mԈ`WĞ޽z6Wq={h|˗-D-hc[KKKTlo:u^e~A)@Sg  {G6nl}666<އi"6٧ ۵4}urظ8Z8N#'Mtv뮝]W?(ċ osPI-Ǝ_:L XntAǍ6ҹիW |O:ISCC]۷^$رmMs}|ENqV-?rp?[Q&&.O?KtcݺPMԽgoj5jݾ}t;Sٹms;t13عm]322ttjڵo׵k\1BrҪ⋪s& }ܛ~ż9|!M2ヘMƲob ~];ͽE}bz$នb^D?M]tR&ɵX2H zܮ^<m sf;ǎ&fZZZ];\a,&`8ԦQcEzzL_kij]hbE &`vY- [@H@*R$ T HHRAq@*٧ }RRr!R*Э0TUU 2" |&\WxZ,+;fgr]T6 ^Q2z.|SnQ'3?p]!ݻME |6x ?u wy9̀_ XbUGVԵkr[1 %}ठ'S&EY+P$PVEBGACC@&O{B  jH¤BAAAH \ r40 #A]]$ҧ3HBAfj^mdc-`'(S ]W)[${L޳=ׅÇ_t~Y-J7Ry*ӢOR+:MT jE7+0}=V33gsJZZZ"> yٕqK=MիjƯ˒w :yy|/ K2`k"YUA&%aIՃDbç` &''ahp5-Q1޷H!$2!-( lsTe64@vFM׸go"ϝټ4*~ii&ײK8>GWH*_X6#J'X~mQZcEk\mh>Z\:z]fS&EDP(He\BY~in::KKٜR8C9AID@(2Y'(_cМGbf'4jӖ´o5~lV@<]zTn/OVw6r5|ɄNp\**&ÏKӘB"|Efz\p@nEdFR)T &,jQKm;J\FkA5Lj#9*7i%b:Rx0S? D^fCGұ:W\ȭ4VЇS__{>d݊Vu5J!|h+zi  -V u(743&1%wJ1YԞDc$ǟ˯'WRUն{6h{9u)MKëĜ]anv#7?-uez.troa 8xق8$d8\.UYH1B>@ijj** .d*삛5&uؒau&B폲mݟТEKϚ$myE'R>W+Gf j#P㪁 ӱ?iqCL2˃i:h*!NXm҅欝kUK »-hF:Rp/] :j b[Jq>kf%e?~|Y ^Aߢ"Kz`ʵ sS߹<#>y]PdW_j~Zq>RնbS#5?k*g*jرsrC.K I7QgFŕ|l~TCƐWX.,*.,AP\T171(.aw͠oy!B"RKȻD(ޛ lMj;ޜN>+hkՙ\K q sĕvԲ0R(-T'bYMzXtbV4KMqiJ/5#Uӗ^fk0?regS:Mt7jo1n!T33ըvb^,7v³ۖQ,f-<< ޕO&ec:H؛1{ -q91YQ̇uꥦtv't`ڣf3vt]#mvSw$mTJˍz\Z OMCu;Yߝ֧ϱ®n-#dЛ4hDb^sG_}_bjbIL*:s`n=ts5֝IϒiUG[UcjmwRRt&*DAܻ'8G91J[!x#i1m͓tc~o Io.,$aٰ(3)5ARcsI9&&|E r ּ1Í Q4kqT S]STQ &ȃѥ]xWcmbwsɬ3)|[KUMMGFDVqSNLu)4RҪ}V*l1TH~Yjh).QD`ڈ7ۧ5FkWhdV|Ev?7*~.M{iƬYa/fbqhPZv^^g%=:h:#{o76k*&IOjh2 FVBɋ MZs]241-s4J^.1^Fy7oǙQNQqZfٖ~7-Hs1%تf:t mM5?glninꃙ#w%9`cQ&^lq0 yJů4,_[׻UM9嚾.u1Zr9ϋ U/}KP`6-_'^p€@7*!~sIu]0QAoQ Hݡ"8pKy"dh?uõO'Kt*ȃ1-uW{3q󞽷猪 yua)Qnj?߫Z-t91sEKINfPD;Eߊ$}3=Z (MP~!6ƿfS:Z9iY";,**[$.3ΓP?Lf<<6tq'#i.] TױQ؅ܾˋBSCQ~݈siBǶzn$T-om.&T, UIALU<~Y-Ju.7Vts[JfcdK $dlJ+I<(̻w{x.uƳ{ésg{LYElD>9ek>͙ZB>^z#qq{wdŨF& 52; jYQЕoU/Jky_8 * A!/MipKRPٜ"yK}ߗT a0f4_T5##3##,d'#F,6kFfyB.D7%ʅh;H VSg}q.* ʮ4`KKX6nS| ?GsڎL!qA{l6TQ|#HŬme ťrN7>N':|դcMN˿Ɲ.b+k>ScyM (j,y(SَYK*ID.c÷1{ J3}Z,ַtIGϗ I!hE,AiA#%|WIT+K 835UD>YI9FLm5b+}2׀Z.,"j\xw_GXu-SXM"PF%iH@v"tI'U.[AvҀB[YH05 QBMO|Y{wS^[1!@V$lH\=TZʮ=HH,W %,V~~~nV0Oי#h֗J3HD"WA(T-Eu԰@@$H$7ײn- Ž/* + UQ 7ۗ][sN=hӂ\[;D~S.Nޱ6iݑd=% Un#Zhe@Ѳyoj/ ^9L42E~J~/zB"D%IY|D3}·m[o1eGA? $h,C|YHlR  c K37^J^{2[ R-!zсOA*C͟gq9^0{R@$wRe%p2(g 笾L2\}2ѯݐ97mmk&9-Hч)œcȻ_(kQ{At]Gb3[z"rEuBS#c Ӈ↓ig1L tG%A퍬y/u0ifH;w<2KuMvrE~8fMܔ^%0PkDw (&Zǩ>9Hd5IG}& X/źv>F13t:{DƞZVz;ijbݻݞizGY )--b 6ayS-.t) )> XL;KA+X {פFҳ0q%hX69rS"~ >{;Bu&Z_v]ҡ0$ M|\t*W QWWrQV0;:~t.wdܻ%VBbP:7)NBIq /[3p ^k_:=Զ9Mu)֧=&xc7ǟO),g;-XC pR:kk/E&UKmb91Wnx[J`d4)?6ů_ D ^" "GvX=+Ej^Nr5vpq§ʉqAg>3q޶ ;!ʋG|}'GsC0G&;~]Gr0glLJWGΛO*7YA%"zZH%PT2QIiezBLm9 ">JMϦi|D28D?!! A2CJMn>f" PNUMֻUm<-\Jj^?]N;~n|pĪSȆ&Qr$vEKA #M•b>G@ :jTG+䠏}` YvoyhK&鐴KIfۘ oNV.La!1!SK;%d|8)bT+ z~*DѤոSD+hwIQvb>+Hj_KuIG}aG$NA†Dcĉ !K**yZ۫ SѴ>Doz#(yցSyd[|d>ܙoS&.%36#1'dkd5" &c;cYE? (SR1.qפj2TNsS=^[O&`|$S+^y=r1&:@7aJ|FuomJ3IiH…$s 0 qWt=YOBB6QM`L5dH>ID5-G#.AtdGu=uM/*ǛG2dx<9Gki@o9RΤ'(64wt:k6UE4=Zjj>~rP7r {uJf8Hn([E,?ztw*4DHNLx~YjD=SѼ&Q/#q#JDΒ M=}В1Gd;]N}-|C!8ɽ}sgWˮh~O m /gRDmI ƪ$k5q 2=ϦTpʨlh$+3rP.~)@]!Pj^R--a] `Iw_{!RFd#}y%v2c.fV bؙh24%1|}j*9 yǼ8-TUӡk`kIkP仫'Vs $zZ.4?u@xD/HaP7qr`  MS-OH籭he m4z8SWňB|O__^%|zMPj^/ashP J%0TEJ<=5dS>jr&DKMued뵫d|{IK3T/jZF1B;7;+ hLnRUws*).*Æ_9pR͟@7U-?˖gxeLz` K @G:ó7pUUe&|J¢ @9<ry @ @94y7peQ7KC@aԁu 㤲C<#GYB*O§O7bnzDGGE ܹ8@KzzK-@Gi)S2o=?hH[c<^^RRSǀC$)4*-??NOJQ}}[WH]& h`eiq | RRōP+Q40২yٺ}}l3NLĶttt>}?,[,[mgN3Yj_XXx;N/ A|?ܮ 5rT`Jj*DYNM:yڌȝZsJkۦbeg7b N;z𬽑OQ򠪪y:RRtuG苒FDjt0(z ,6O?.S(T운 H׭hlY*޾Tds@;9<ry @ @ߎ{FFF:W-PL642vΡm)HJ|rTACے1:CJ戀?Ƶ˃EBeeՃp^pf0?UUUe[fM53@z$##ԌlADѢ"oUg|^%> 璘BѩIǎ7u\p^}xn=PC>CfFе#kgiӦMc_AuNm}pV;##LY7Dwa>xS&O#iS8 +0l}䗔$2\.nƏ1WnbpC4}Μe2;oSa?E ڱkwaaNvsA{xy>,a6 ok{2**XrbgR~J>uڌSAވ9>p,ZܤϚ=D"ý0===9ak# J=~ئ;=<}r5:;ڴD"Ud ߼}xɲ5a-[WnV4D { ns 3$gPعuk{eV}<0UP|P]]MQb§O7bnzDGGE ܹ84(}Ѐ:ӏ=f u>}|Ņs423KLL4g_[f͜!*V,Ʀ4*߸>;=tU`LPXfH9z3fǷ{7蠟gxz$%td052Arr(EI!ZQHD,JY%X"c卑VԔ FW3tȲ^:v 511v؁ A޶m\h4谳ifМ5C oA܂O>[kC-:m Zk623;yL$/_eXn]D<(аHCC T5-==pZ޻؉S&$ee\ 'DC#Yk.i~E`7 _Cݬ|~$lCjB}_=wωIL&cgNG!t M.Y1A(ܮbeg74AN;zYQS'Os?' xYHm[[5ʶvWZ1z8]=>* k7f͞;k4ss92M84m|!l;|Ʋ:\4$M*w" :".-?lvpoqI|ڷZ|*]]O%EUv!- J^N\rNU EOElzfͮ_MG>"l5:*hB}|Hr_}m $s=N86b=:x\RbhQt]SϲoS&N~#JOȃ/.4;{V>MMM\];=|{re@ pfڿwMP Z۽r'Vb̴)Ϝcghv% u{U]AaT㪋A[߸YimXlv>wC@:uI)K?fVV?xhg0O9Am_5+Q_h/I $ኌ?V >Cs=r0!O9(N `פDڸn-sTﲼxRSS<;;'t՚~}kh1~!226rkKJX?\wMd2YIiÆa/D",o)|LՃVY5.F&f)ɉoO&=<=^xO e=!idl@T ݣS{oiјLi(4I Qtd* W޷o\=>`ϚԥJoΡi#"e S(* FCxN;*FV@ .mELr)ʫWolffjnHV5L@TjJҧGwc2]aŬJ=IEE%hyntW^&,H55B<Ա§Θ  wnשM;eR z'LsaffR uӧVĕ+.=y } U7rt6.E1&p|rrr|E׷<Glm>Y֨1 ӫDtȝ7lz'M1v쿯?A@w/o,RƎ|JyzxyN[h偎sf]?KAAzESb+USu-^?_4ݳs y|{cMLJJrtl:t.HE.YܓOO>˼Q#uu5:fjj"얭)) M+_CC h4323Qt3S:?cPC*@ sC}˝>k3#LMv6&pž}& @97"n^ 4SZk$p_RT]]]SSӧO:99hbbb^^^˖-+Jo{DbQ^Nuո ͘n``IơWNOW l`e6a„kzyy!I;wn׮] /8dYȡ#'Vw)*-eW==lҢ6*Ƀ 5rT`Jj*r66#АS^xi׮l6t˦ H6 DMM Gk}LimNLpF }~X=39++KOOoheV H3<<<++e%fdf^^v7{7RuC^^gOsg; :/ FqRUUܲyTٳ!jE؛$aJV?xd2jft2. S(<{׺UKF)9wc%QccjSP'ğ9ul}꙳ ? uÝ7zujNنT&J&ms&XynJO341UBvs)''g7mՕ$[T_>`ZC'SQa`$2ʋa}}}}JQIꓘcӽz BNFr@P< 5{^.,KfEϞv֬]R4uluF]P״f-?ѿ_?yjӸ۞>{*lmff ܸ>{<"EFf [Ugæv]XXĠӑh AGE_.aLMMne[䞽32ThTKaffR uӧVnFnH3~"''˗/e?jmm'7AX?`gk)77MյF7N^}4W(NsrЫ)䗟=;z耪)+B.rլ|TH{{.0!GXl 8҉$?ygr&x S}j^zeddZQbDŽ۱ziA X޽J;: *Ao"@+t̝3zjv~! +p 0):ry{TF˃M(܎<>Ͻ{1&&%%9:XBv8y620?Mt$fddV_$;Q :`~8@K 9H9kjh("t]r#D=/G;.+NiׯiuwC]:H$(NAsE/C: 4$tuuMMM>}䄢yyy-[(!Ey9V&.X4c:yn҄q(յӓ'Ok\Q<^f_ݏf`pMت|e!ڷ]:tlqu`˶:0ӧm\OWG}0akӸkn޸v!6 ~ChS4qhڤIV,gYaS`П0W ٢:G&LXvsvPQz:r r!˖ԦKQh-#,-_z+K4zc{nϟ _'5*Ё}-ph 9n]۳SxcOjU[K_ߺgbJ133ػ{\egys{555QSSC5z`߮)fZ5A)&\Cipٻwo``聝YYYzzz ,@+J@qXG(^/ -3#3i=ܻڬ-={;;hqg_YxQmV0DN_69ɦ_( [_qd /5IItӆI MsҤjެ+Q6hiinټA*qY`|֭,-%7dV cȦp1LWޟBlް/֭Z0JMc<+ypsPY(N+:%^|/;'g}ƾ@A*LU;#gY@q;k@%,))A/OUʶjZ )@xDI{<L<ͭdzxyCV@odpP NDN]_:aؖܰT%|?1)!UzFAB62+V|PFp" j<P7PP!A"Ik$4JBA~Nj<P7Pե0_&4t@9<ry @ W৭C17ll~y7peR-[>JԦGU ؿAkP9է!k=xM'OEÂBc=fUn=ǎZL`gWjЌ  \luʳ{T̟;{~}PzjO/ѮtxyF\f.NX[Yaww{<.3+۷؀ԓ:޺y_5k񽦦\KHUa_;v.,,bHW_ Aftݻ¢⢢˃(}EȲ!L:ISu1*e'҆ۄoVA f3`׺;32Ç䔔CKՆy+_+K˷/ qp4ʕk(y r̵SG (~yI.]89ܚZ-r}s'::(:oNP]f4Eё~!ג20U(|P]]*A;wp?wh?i8$0500m"[.ZUY>j+*l(OJYH"o~PNx /$xi3 <s͙YY+=#NK-kFF&54<FCl?q%hڛ_^(15 xhG߸ٹ h_TTTV[8W}do /P J\=,;29Fz(v|Sh%!_l5:qtfhodhpD!V))Ά4iї^tiЀ~ %!u%"6#taႂ멼~}@Gi)cƎJj_A@KĤή +N< -k>z##|lִDŽOUVGn犺C|*)@Q<{~),)PgN3Ylaa;=<(ܚ[:r{wlaWSzzF6.4UWG $;8Ws}x@v(91mkg|;nݤTACW*%ܽ{ ݳبwW2=oCVHEu"u7\~&UZKbeg7b N;z-;}i3"wvqv1eǎ޵V?w'KGff"K*2?bo޾34?7ov5Աv.( DuU_IU3Œ}$B7hO ,?VB>Z@ozoR '3e% ʏ_69ɦK^Eܬ4I5>|PDjtTRM~=/B ss% +jŊ~sW4RXYZΛS%]:|DgϚقhvlu@*GT[8K6oLnF?wnP(o D$F6.%1@$KgaMe>(Gz럿g65[ K@yp4u@zFw06Uz[*P(ڃeTNCAo@<ry @ @9<ry <{1y~lmomԆ_LL41phI}SE )=M<ήy]eѐm6(Gݸu->_S(J=)ԦrTdYκ!@mP<ܺ`0$?-#kIIɟ٢YI ڱkwaaNj8:nڈ>~%4:_+K˷/M0:).]8I۴q9u(cWdՕ+PUZZ'O0yj)'L uӧVG{^KKY 1ͭ˽؛H zw}<5QURE+S7/ay |a6. J Y7dNUPa2/_222TWWwl%&|t#֫OttQ"wB4D=t@UUEW,ui yUaQt x޾}[єs̺sSU#6@/ ML{΢&Ǝ|aTH{{v0!GXl 5҉0yDEfWg\y1*KL&:50QiYm(?HR5`SQ s[v;uFmE~AH#ǘͻtAP=5##}==Y3223444i^haW4߲52%5B[[[W&DQEuզ~I~~M8C]:H$p8Yi"3Jyë<ńlڤO @DK5C,ԱC^~~pHkIzzF6.4UWGH$ζkAs֬E޿v^hN-UKKׇ%B:o-*IW\b9 __Xvvq#O}ChRi"3JrZ( ^ؽ$:50!Þ;$&ٱC3cb!1733#ػ 9n:v)Uf[мveߞU`߮)fZ5A4e҄7b(j Mcys{555QSSC)X}*i"W#Ёپ]? CEP< Elzfͮ_MG^,"l5:*ɦ޼^( [YZ^<!*uu5/4p~QP<ʑ RRR}- (ZTT+HKKzA$<=Vֹa/j6G9Эk?@ͭ Qg':mO QJ\blݴqe[䞽32ThJl[!vcDnnakVbzz{bV!k,ZF˂WGlpl|ߞ_pP`bb`EǍmѼ%Aoї^|IKKC}ލE*2j8:nڈ>~?{wWS?R Q$,3dKڌml%E1cdRDDD$*uB3EI)-wƫ޴u;s>BIUU5;SVf3BmE %E^9yqs{btgh?vGmlne]QQ<Φ160tt}z^c?nVǎ~#Qfqt5h1ҢOyyz, = 1tpI!C`xN."***C$sN{w$޸v\^b9BHZZcxރcFYo0 "pѧ,->QMFY۹u9UeBtãc"jk7**f̑軞\UPP$UD9#P's|_e22Օ52uuxrgjhhNN)..60}*.˿pLv ,=#|F?bQTTbwdeeams]!3*% Nzzߦ'rKjf'Oy%|>?(p Ck~\/Uii Wcvm ߵgߡeelS'!H'<4Ć2[_]᡾f'unӿٱ?GnqjG߼zW;wt&kjr]{?Kh\˾sW(9K!7 9C/gMVQQiΙ~IG ؆F%`;ʋw7m^__Oy\3wt # C\EF;8;9B #\47ATdD }a#srsu{.DlhB"0Lz}+!)-7U.zOHh NYZ f(B 酇| !/jejj~yil֣L{$iS_\IXs-̈́WWS^IIQq1&CH=dPN\[7 @EY,T s&翁yid K;B1,A%Cg~WG;@% 4$ ̵4Ez,Q_;q,r knfШ╔u^L*u1Љ7rJÁո+Cؤ }ɨsg!>'MeW/S9DMv}mL}Áuڵ ڱMAAk)Of~2믍 "N|bCl`}ezޫLryroxtuWǏ瓜/ cG)Kޓf-)dY$+n>oRBf2 8䮻Y~MVCl>Z5ѷd׌BH'U$]-U۶_ήS8mH1<܈y17Ms)?GD5em6qOgjOGbK<rg}}[6+fs445Y`_ Rd>=NپsKK˴45ֵۭWD;gd<anվ}7/D/ ~ՊYN.&NPPPh  |㘈Z**fEw=^Fw%ׂ-Γ&ln'WVTZ) 6ors_{>tqJxS$''BWcvmՋ8 1O<--PĚ3]C 7>Çk7j—krصgߡeel6t[E^'WbA 6ԮZøo!W99cOjWzpm)[^xg,_8kHaݏ/Kga%ekg{* ag}ylFllXI#NJ'Ob)0)<[0kZ鄇ښؐy[/뫫o1]u:ZT̓aC]}5pǏoLHN'7wW;wt&kjr]{?Kh\jEߒaF<{[_#3Q0DuN2g ܾ͎N9q,\W'&f[YYKN&] l⃻**?m9/IĉCp/X  |ʆi6tFy8C %lg23%'C*^df)s3}0YY/!ݎF}F⑧sY舷sE뼼D"e9a&] @8kL`rr \{/P6DgϋhËa}z0>y{/7??_Yѽa,˲ly ann WMf"\+= C.999ǧ6L^tK-~8HZkk4rw_㿿OC42u  v 5 e_;D89yD.,ə8~<_ nΠ#࣪J<сC˽ 2!r67lŪw?? zhL$MC>+m - p񲲲mB9"60ttmf]:w4NDxߦV0=HSS{;ND0֐b9zO謡LJ 9H^!n BBh= vA_6`nf3zԕ`@c9Ʀf0[6~I—ew/e"\^c?nVǎ!<q8Oo=%/23OZf0޽ýg|~u0mņxq))W W{kQd'?yx>ɉ«Mytݻ_p\XĜ3!$BF..^ cڳk; }`8 -)ltdhJAΎpIj(^׮0f\nv:qLC`~"Kt-/Q+,ZUŒ|-e"\ZYѽ0۟~ b`NzzYr],z&!6ԶuQBuH*M2lPi5Ï߯p$8; ڵk'edpݷVI]}]]üZTCܭ {wwBF>݇>5鄇A󉺺ʭfV_ȬȆvF#0xBEZ#F ;Er&sw눷DϥCMMYc٭[y -B!)jPTT\TT6GS#xYx[ Ly}UFtA׫]oS];z$tמ}+ӦNgBHX --Mq|{ 'x0.w} =?Ksي&(}LG{$k׎2z22o JN#^df}) ANNj!;wxSN^'Λ 1ݼ5/JHJKMUL}CBRRtҙ2)Wh(++|O!ykZ[?{z-ѽqcM>JJWP%Y wUTTPճGa=} >˼}c"gBlegرs NÁ0{sN/^dR4[Txu҄Pt2i: п\ |;ϭ~W99"Wqf#ܶ5@]Mv;[ktyyyUUW/1PUU?cBAIQW2{{^~~>;Xa8$"ہ"̭==9L*a<x`߻J"*BXx0fBL8C,Z0[x,2rY?bc\Ǚ3]'!+VbRmm-VyyQ֣(.pw信:7ȓcLJ?n,l4a'GiC!:  I뉔Fuuu𷲲rڵ444ďodhhѯv՚}cpvw(pYY"=m-2U,-32+7o?@ȑcEJ'O c ш_n2,ݻ^PX8e̻kijF/\%^~{Z<.tA^^Ĺ،yi1n?F$]Ak~\)h=JWBNx@TṬ "ORVK}>dbFA (^df]jΝsn&G8Cݞ=/?0i^P:_) 9y\<6 {-X,52:YYQ:Ͻ9nlwUTھs_ڵkc.s>w^,F$]APB{伡N ܁[DJp4GCYY&C #RLw7ca"B,@p d2u'"OBxu*̶-(3ok~ư>o歁EZZ_>y}ł>aH}+!)-7U. !a)O`.NĹڸ/)+) ҥ3C$) !FIi@<v"سGa=} >˼N_]M a"ᥘ+C+**tNut;f-e}Ժu#ᯠJ DW+~42ݻwIJ߉,xY ^I* IY6J.6H8o ;ASӧOoIQLOԩ3%573>p³Qfrrrߝ>MlyC/ݞ.^8k2GC+))*9]Á9. 1Kh.FGWЋth&yY6A>,<֚F#OE ?zPz]TTV7Q[[cǎ3>xz!B=ߪpcB0 $ ,׮]KFYY~774׋g-XjG[76**ѽkB$4ItBz#<0< ! !(`x@!DB! BQBB0< EqN.NchE[Y{z,r>Uy }LG{$wӋx%yʲĕ1>t}/]] y%sp s387p{%&%LL=tdn4be%NV˜y0ݹs:dK)PN)uu{._zl++{ɉƎt)ʷ'M6B_ikXݴ_o '*W㟥q8#7(atp\Y&|,LDB82:'!<@:ufۖM7׵?cXp7ㅅEZZ52OF>f#ɿ0ξjX0 4V]]sq_!Ra3"#:t7  .oߞ4a}oAKv hDx%(OVXfKH@d| υ9 5!ٍ!+'RSAΒ4B_)5-_.]{r08pWg72QD2Qd<8WTT鮳/vrmMX;[uF,())_A@xkaQL^{=tèy42ݻwIJ߉)K>0FfDoK4-.AY0c6b2zz_8_}m sc6h;Ya9NA<J(E)*aqU=CzjH3< s/hjr-cax_}2i:5`'''Ty FEZAwpl4 t{^x9j6/GC+))*9]Á{~ ( r&<{5tV wy%t@HhUUb-CߘFkV#Ҫzr106]SSC,607B_i^\[k澎<v$pAk/1aFr{ĉ'M^LUP.9Y"NDpo̬,uvֆ}ZaNrF.YmkeeeZ juvaaĸ{ذeeD\i{fq CcMFߧwÉXw8qS6p@cFelw9="t(KkĆQVx"[E Br ֣f"BFj=h4V!F!y`x@!DB! BQBB0< ! !(`x@!D 6㜝]hx],mKz{WUOZЧ"<пA fLHiO nq&% \)Vxڜ 3m!$)鄇[I~[^^~h+ʭ 6o} ݱaƏ+xOVeySCެ章ڲB}n"R{ʵk76IWYYYFjjjWa7.|aaמ}+ӦNV֖fe7YYZ| Hb%Eɓ'X rh/I7}^ nuebRۼ9Χб~п#6_LMW/cF[>ᕔ^3ʒr%^~{ZE>tȊkn'߁F3*pn]^1у;歁?mߙnϞi3_mN٪MQ1O<--DKRw}b]󵵵eb2HD;{wS'̷&$$&=q޽:8%uKO<^Sv csЗA:ᡦb9{('/~O6W^!32o JND@"3tW;wt&kjr3::98 Nd_4\D:eea.A ,VmM͎@ CorKsي&(CQή"N9q,\Wg9ͶQmIb|;q]?d# e潦M L]] pR{%8YZ tr LG ǥnDXm+ =ySQgm'/evTU* CB`XLtt)wiSl ~;ʂȬ"#:t7  .oߞ4a}o8Ax 1*s)v6 = ʚ|fKH@d| 6 o ͚uFDDO ^gI/ߚ sJj.‰={9v8ǀ̛`("1xH^~+**tNut;cl?|hÓ9),ֻwenݘw+//3dDfcd6M2myp1 Z_m"ت$***׼f݂*AaQQ/((ȡ%p t/32EE"4*VUg^^M6B_i ἁpMMN>Ea OF6?3=Suc䚛 UPP8}٨H s3999N&6n /\u5c&qWQ*`]^^󕔔`WRd *ؓdnZY/XܥKQVr8!]TU }Z&MV^KK{YKKSSfkjj&[FB̍C>,<֚F#OE ?zPÕiSTTdpW3(##Æ --+;}&:6Lcسo7cZU֣IӻWڻ{8)8\M1%lI4}1^x hÐkW. >0 .#3%drJ}jǏ>V7Q[[cǎ1=xz!|/O>!M9tDxߦV**#MMlď 5v~62k }](KGBthUg~kd0كbhUsQ\a@PճGSmf]:w4e>dd# ŐZx !)Yzߦ'rd޼)+)*N<)ߏRs_^tYꓧK{z-z{WUu^ &ڦ׫kϾCaiSl '!eNx@D'Jl**QǏkhh0b[M׮߈~sNwݟn2 Ӧ:`x)+ s?tWc.v!<s<}BR %ܮ\vY\YNYVVy!CLΝ1}l⃻**?m9/IY[Yyg8L[ab+ ۡ!~\YƐNPVV:'!<@X:ufۖMug3ћsuq"q_QXXI'I8q ={uD߽{3`U+LH^fgJHJKMU ¤$$4 &(jjݠq80aB_EoM0ڵ,;qª<"9 WWS#e0\g;;!`_ښv֭]UTTVU=I¹]?$/?O^^BOO!bOY#(? L,&O4> r08pWg7BH.6a6<_}M`?q2<;䚛2`K煋c:ΚApHHhs_x6*LNNgPW/++/--%"D|"]Áb a&'Nq֩BK#͋K 7o%ySp3.V9xfV#N7]^СC]g;3}ۙ2xl7mI! }ʣEjrx0&3ʥo^YLC8~0BNyH5:?~cRT<}A=矛6o8a+j+++!ڵ?cQY9;~b7~ *,,tt m+++kkc-j鄇Qk׮Q ,$xIL^?[;[xH/tƒhFE< 6p4?sBރF#iBYAoBB0< ! !(`x@!DB! BQBB0< ၂8g'G'[1ljYV֞OmEf>m>nOwttKJk$M t{xvNn,z{yUUDca\z,M"++KW(eAn}DEVVTsk;w}fN,W' 2#u_e{?!f,V.jCִxl /'+WW_'1`٣G>\}ec翁QiA50K1WWTTUUn݈%%E+0JYPaQL2X"9NGEE Y,bOY#ӜAy tajii_or8bu҄xd9n349ObCc:Os7IsAAMWNTj\(]A >& iC "M"Ҽa _6#MG;?--M32W{1aB.Wl2۶Ncgk CllUUU_QHI+|8.lg#NDlJP 9 v>"Q1 mڼeFScB_6\]UNnMG p yfK8\GG;, 1>ʺBEEyH^K}BB si 75szW؏ձcG, pO /+++F;/aA e [tb oJoƾ(`Ro ,pwxz?cqn kP+6ixiW鄇AAA퀈^@𷲲rڵ;v\͞6uʖH,--]j5@`2xЎmzzIr ((,2}{45@+K )>==oS];z$T\s+k1O<--DB+*.VRT,ys]3ys7o ,,, vҹɂ(8A7'xk6Po쉭Ѝuv60h ?kCԙ}wСĉ'NYMi(eha eAϟSl _$lwG: c7\3)5-t׉@Lzr08pWg7Ao`\9y?Е@y I[7bAII tVTT4Y%g"/Czzzݺv%aXW] S;Me #L+&D,i7Z1ܑL!$uz4Mz+`:PIt507hg8ed(W&tq44+|JJ$?k urx="Mg#͋Kfphkc=t߽43!xxK*rF.YmkZYY;v0h%<] fge*|h.N"NDlI̧IWnGdhh`@ȡ^CȰߦ[6mA;{\e>+m PWS+++|:뢢CLX,2@!$-Rxk:"fz**8u@!i}xkW(;36"A!7BQBB0< ! !(`x@!DB! BQBB0< ! !(`x@!DC[Y{z,r>3kc?\g]?NI522zY%-PCzzƺ ~~}$45Gv0x+!FY۹u9Cx,2r?iZ\sO7Lu}rEHYtJSJJQ'O>4輐Z_xX07x`V%LAh>ҡ^NA[Y-«Oi*9MSA!v7Tփ8Ef +do`Pp߯<N>}+;P~4bú`XYyަ\~œGƿ!{Ca, P,Y0%O͘Jnj6geqyv 7(0H' isѳ<)[HqLhƯpcڼ2fDD4ߚ 򫪨}JKˢNEd2 k89Κ3o 7jpH|cqH,i֧O 1dа u61^pbGFbA ^ j X ^k5UU2a;Zg#iL7A@iڌNy a'm b?}""f "ODlX,FN7é_.eA5^CG#"g&'PTT)ɂ _ jRYANMKfeÇ,Aʏluld7!Dތoť??ܽg&&eegΝ c"lb)//Бp6M\`0'9 }DEK6nX #[wlaK6%oС辎_!ȠSR5@iPx9:nΝM`ZuȑBZ!ؘ6o$L_$2NnNGFf&#c#ClK,@1Z[[]v;jIA{I&fmaaECV\-8\ϡDAA^s/X7 mߊ& RkiS.yz>NV%1d((OGE6捇TS A&A&-=W~ u[Ǫظ >{m hh`PI5+۱cF]qF:8zM99L50@JJJD/|x>ޯ^IJ 7 /'_vp߆ \futsV"Y=z[QQߥ9UbDy^ =N?O3$>k{Ξ:0y]xyB]=iigٜw7mttrMO0<~~}}=K'Ou3(cEnj=J2o>'G@1IFr ׯN~`{^t%)%%Ũfϝ!+Wu24x)!nDm05kbPUU?BCC]^^ 6봩PYر1{nV<+#+Tn.De:M޳7\t5~"Y,xoS^2͙Ak!hF@ gD!hd8\>?Y":ƍ=~"o\!h5]_WUQY2xE: #}ΐ &YXXhhX4q֜yVާOyF0\7с4 qӧO]%0CCNII)OFvN|;"vVR!w\ Hib^ǎM5e 3,.fD WZF[[K0-cل~UmvvQ.Y}zO{Kmn }s{˷FWs8&7ԯ /Egz.9<vVRRܱ-N"j{!h]7J.m%b7{ xz??Ya$ĐUG|8{>W\PYBo#M޻5b>UTTZ\hiiiD-MO%5cd:%BIԚOz]rq7edd ?zu_&t m6);-8`08l)n'99s3ϝ,ml_J,((/(ظ~@'+xɍ$%%mOO!Ǐt}|ʍ=w;rg"b0p޳fH116ZrEU~{es mXŪ~@ yivvN%O>wyL^Q;~f$А(ZĠuhSK7TUD]]-logzx+Wߒ"]qҝw':L~=-MI ^VVV=u[\9ZtL쥸B-mded/>9ġ^IIwR@uutRSS'88n۾{셋c砋5uKP}@?݉\)`ōf?z𧂂M`{waAZBg:EfYhg%ξ" ӟ[5U5ʳ#G 'vvIHxҧOԿ@JxE"3 ǏYMsX҄cΓ7oݻ}{VVUWR$U:(CH%vDZiUWTryeeYi)yHZ5K;n v.B*H|L쮐L&ЀLVMWU6̄r{z}sQǑ)99ِF6OKqޗ!VFDN\qZzyZZFII?Z2hkH$K쒇>E\&uuN՜?*=VRRRaD8IeV[[$hjVwsJKF@AԷiI~pL$CK O:9Ԕp81:λԴQ#Ghii}ߚ͛6TTTX?ZR:K%?9t gjzzƱ]F&&&R F^^cI.5220HMKp9$z/YqHϏ}n-)Ihi졓y/Nh~xۃu})=dl;xP̹Am 454RUQY=|XvYZZ(svo|;k+˄&ػwcGO_dwon߾ҎmAu2+**”^uү\&{Czl3޾le0&{E!3%WI֮4 B*Zs & TCw_4GӖUwޚ4 5Kޟ@I22,6[f54u2S Eki(HK#wX.2>*} U%$nŖ`ސY(y5oAYڟ=y|zpJioΝd7LSrF97RdY O$dh0K"DOn؈[.ć i 끚Z:222tqD6?9aĜQDVRTsHLLhq0L\B j AZ P P P P P P P P<# '# |>GA L < k!A0 UBy@7#US;{ CA`T˃T턁Iuyrc^JvAim@D1u!{GWTG H1碥K0Lf:TF2FAZbbGZ) LBj زuv3Y2r 0o…,Aԣrݦ~6"fs "b<--hPiB(y VZZ˓nAgI*HWkŮY_Dj ĭwݹ}ĸP2% >_TM,\tQ-vD<}tu"Ee6Ȼi)UI,U+4׳" Ml6[FFANNUj*zF é^ﺋ$"bB|/ X\%Br4plyQ塲ײUD;leD)bȻi!g%}$y@ N6@^upd8 ճ ++[^"ҕD͂-DeXy#mr>P%k  A C$>k~B!'4^jf xx޼EU;8"ȻiGLjگI~=IENDB`PK 7ˊduBJmfGRt;lo#9uY2W{U{#? BwZO6c~f 0:Y`/#)?kFVv4b]Pi7x.=yMjC [wס`Kؾ5Qn9d2ټa,2.P)QYNoiO1&[;`Ze?AP5u+=}z KftM.y蕾Oe~=;1VJwDx2=sG(ܿ@#'n'Ictd#?%,FDZ=_P_Tea^NVM+"VM 4ͻ^$$Jї:@|sqOE6P8p>xmXIǔbl}zΞz$)?v/iX fgpj61~Bz5iɿ3SHyQNtzm1\"H\1uomVǮn`r3G}1,Z؎}r/Q۵.c'=|F@in;zH7`;PHm?:Yx"\hVr?jjft!_| *K9Тu7]c$9O$3D.^Do|ӝh< l=[pi[v0+K`f׹ūmZ@n]TeRt݆iiaKtƕrB&4 0k؂U+"cjMzdkK-;BJ>v[j5{>wVX^׌OVFdP+ulp\21 ,9\K1dJXlo 99X,D"q¥ i4-m=}mm*d&胲 C(nyOI4^-}Ȫ-} ԤQό:noҖK>{YZ1CS#4]kG/~.UPNG_KE 27Cֵ°ˏi[P]tj|Lx~Ykё_SAK~v骻-38᳧"S4 RIe n>M^[nLC==[ِ %2R]m1,HȅW{Tla66P ) oҼ[HܷS ==@JN|+Mmu0OGqZT^gBne-8w(ӄhWlH2FĒq5o; ඨO$A;g .GwE\,qAZ}|?R/EB.d\xIRDԡ@ȐhhL`z [YQnzh9oݍ%=x{uj`W_ *3EfDqު~=:Ul\ڌW͊+Ӕ狜XD#/.^Myy\S/ȗ|wǰ0(T>Dt~_UgIcfV)RsyȲ(YE%[P%{zffVffRa;,!jc֖,6'=33_x+c&K$l]Ub?̮CzL~>mD+(J"Af$3vN%4'g^Mt1h7\- 13}oz´Z XE2}a1=m]#7"X)Pȕ|M&iMg@Ƚ iȁh-K֣_^VfeF֥dE~ rV48E^v>fgFzbD>Q\Mv\AqܬWyVH&cBv^bNJQ^6&񟞏ͣ[\Nvӭ ;cD"[s]fC4~B̮/gʔCa\}c4,MՑY&z$%}uzNH 9,ַBI QY+PPܦd:2E6WAYʒ@8l"+777';{P6AÉğ.g/F'>p߯.AɛZ[ŵOV]^꺺{ĸ,QHI}5c5ް+c=^o%^ 1HGs diMYtta=#a!b\ÈL7#؊$}RdMYxX1HI; M ɹ"eD`L?Խ{ֲm>tX~^n`H,!Dyd\פ!9 #Ka'4jaվ;$SNkɄi$":.IWI.J[g HMaF ^v/XyMn„HO=AV￧ 0wv\|)I6mNV[#3Fw2P,F*/E(o;e;2tmH_.g– F וosIHx3 FL+M#"0b } fG!朊&Lx5txcGRZF"iwe֚OD5Q^NmY1Vy7'ךh֪6klC.eiQ:I~T_zNfia' X4ژPE^2kt;6-}P2.Le("r?íso|Jbcz|=e|f~L[Ɲx[b̘|]֘0~<EX@|JXǭxjM<==v G',ŕ}JZJ^”$=IwVR`jNnSOX5ctZ$5r?enG7I6Q$ָ$SH>B r]/!7wK6t2)v KFd:HJ$F'@)1-J&6igew=a҇{aF?vKw4A1/^a~iJ[}-^PW~^hm7яݵKz?i9S$:xyovbEvd6>wY>g5&cÖ>e+t牖O1AdFO=a]k0~n]oHdفoy3 L4#aNZԡU=S]s5+|ZdZOk²EBx*?30Er4No"7t[af50 ߶bh{Tg? :Qd)-w^=%ߗru r5:Sc>:&M,BԢ($B|\1AjH(~J>9',%v4XD|ɜQB>RHDy6ǔAcB?o<+]vp0r!̈';w#C1Ϳ]1s}bZ;>A|fb}]v:dYe%5;PbdKq6]Lq/xvɭ˿}rQK?+L=ꈞӢ(ĖFڍH6(M&[5(!ݥS9iB{+:re}&?Tժv7RG: Lj⇑u1Cgo|C%ҚH%[dۊN?ERF)[;/\Ȳ"TreG=ʷw"Ǝ:u7[O_J#0j*Fnd3xGIc.ĸ J>bs9K@'W$//[0$,@Cѽ]\܏~zkT[V%=ӹ|zk12Qc=M?'¿D J;?1Ol}Kr2&eL K6rzJǥ=(}jx,1مs H4D"oI^I|'K!)TaTQP!=ln%AױQ6d{%F$G-sma=JfQD siܤ.M\u\hnZb/kkc+W 2;N\*T S(`S_yHX׈JOpP7ӄ7C.JT\ '(&"SIT忺F "E Lej8 ֜pQRLkZ@h"(`L>۞Q4GFW3#Ĵ,D$@ MIe"+7xr؅W T8$}I F׊"i ] 0dBP NK rƟYjsIe<TEH4z4_M`:hlVQaA^&+Sn@U10'/ />2ӒM n*|~ P@@Y(Kbe T ,%P1*P@@Y(Kbe T ,*>a %P1)N]|=7аY3[/\'l6Ҳe;m(&wqr(kWcF  P7n6r„K[ZX|ftc'*OYx< RI|> mhbb)5**٣?U"hƬhXh<<`7.^vdCZ{{ֳcN^xb׭lQz=ǾΞ3kdffj}^l) Zd2ƌ@߅<^;6q/-C\-b޾eJJ Μ3v]sU&Ƙ >o%KWlrmPWbSe)5uoU FKދa0ևl-v]q~3ĽzU)?qwd/]9攍urJw6uobee ƍӠ~={;;{\y?8ѽ$@Uya#GS(o!(kֶ\>S#P! cO1*pk/_RO?Ѷ ٻĩ?R)nظ׸LNIMNNiۦ*>"Ǩj>JѠ9%Tܬ;PUSe൫GP(CYZZ=zTmA3f]91w;{wDfʘ NNEÅ>V/;w˩=w῏0"Ѿ{; ^=z Cv%9{ (,S)TjŹQCׅn ^'-YֲEs+R>|ePos7o5//аEfǺYbU[ώ ^VtTw0g֌.{Y[["o%ղU-:=;+{ȀԴ4j;:n Yשc|aC{onfz>|P ۿw-۴c966۶lU3<v`y.!מ:yi3BwErlvrҤyS:폄W`[>r1ё0=dg==bxW.jAGGg !9(CoۺI.Rg*5CH>/cvo P@@{@Y(Kbe T ,%P1*P@޹u33)]($²K]uր?AYVwR?^z@ZIdx ]^)?HeO;7#8Q!8P&И]"QwO*ReufSVOFff+oFt %jGgV99GxY*^;5o_;33ӧ֭uzy0rİÇI ~\EEqvjkkT 7ecΆlQI@] >gIјixx̸ =Ɔ AU*{];uhm\ܲO?"'+1OwX.Y(Jyk~\D޸t:ܼy&oҸq Csj jIo9Y 3pءC"x=w^[[{j,&%x V9u냗._!H xiMCf)m;B?ԢrR$ D]]|f5A^-'E̛0ykM;fTV-5m̳C'#V̘#'e23̻s@ t\v1Jֳcc_degϙ5#d>{FEzcZ{wxd`wns\ڣsnLR|ux`vvq#0v"Οw!w)z >ԸŠc$qq^jϟ9kvP<0e4uw߲)aiϞCfT4jIow2LOJE ݱ˳ NOwSwH4{qq -Y.ka _Ff5'>]P vkU*ۆӨgn܈\z=%{ ^E^K׮E\r3 k](kDE֮fW~2sE7~zԉf-[}n:xMw˧[JFnn./]aYXܾYS oF퉔>LLLP▭=\'Ok9طg+WBݲ(c2ٻSYE,1VҿPh,eٽ[ۯo_i BE#?<6M2i^=X~hff&ضfMLBSHQpN~cNs8ߨbff~-)ÍQqo^ysfعXww7,=wȝ}ʕbe @gMsF ۸yG6LMe̬r9R@ltRTpw&;ٻNgM5 &I1ɤÂ/[EkkiWH(7tu˘]$gcO?/W.oN|Q#(?rRF-^^(TY2Y}HV@.GKȰ-/TO4HYga٩GC$ȭ8^JzK А .rM?nsOr)|_'+;RS1Y)Y~.=RV |&"M:ZޣWBdee>_HswҎݩi?$= x6YY*E$\<^(@{@R.5c);=zcCeJNINNiۦUٝ^yV)eM{>\.#njM{L Az۷بe3wӭYsN?1h 3n޳wSj;N6[β?~@PHMIA܀GZO)fBЀ1N' &Lb2$+űZb-ࣿ߿s d/4SY }EEEu ;|Dt9jm:hƬkV";ngH,[J̝-~`=o:yR] /ɫEKl\n]vX,UuAC>J⧯'İ3ΣhmGG< }υO=N N:Ѩ|HF7 ـ&oR|u*!?#H6}NO~y !7SOvh޽Pcrr=0-+*ŝʚRS>}b235uGnH~*E9r7nǣ#-~'?}&ViD!r?i TCQsfҽtuuyIYbU[ώ ^Vttv́7@Bwo_u)ڑ3s!vmZ2u)fl>DE"nDG{@$:99ij9kW01wzwxFX,IUqR^^# d] ߸ٱC{`{,N8ݍAz KHݍb;n\ij-&"?mdcmuێ#[j\ёW&&y2hqf;~k,gJGgI"zON邻&"noDB>Eo6FCYӦ(w1{!Ȼ&FCaCEKW_#VVչ~)WOvd9v Y/ W +hT ?yL1 gϜ*{b Y}d#y$ӢyO /-6j:,&:Rզ챶l QEO(ƫٱή{чF7k~%|&D}={Zv_PK6HR?zZxa< $H'/L05h=ܚ4 5n0Qk41Q9}H7pW.}^)^K6%F(ݲ)>~z7]Vz8 n:ԽkFJ mv00!x ekݻv(Ϣ%z9$mhgk{Ysum]R_- &;Xd{L^t/T:?գ, MBH]𗑺*+}}}4zFkKt{)v`;ׯDH7Ǐ W/J#=ڶ4  sޱ'j(X5su{A].{ʆ۶nDsfcoHMeg7nPdlv:.=r^U* Qh>Ŀˑ7/*bpqj21🀺@A D $2\ ڰF@mmC2/ׯV[V'v4PݱIlkW%_ TsХkai :.U;;v>d^}lk0T |ArJ {wՑ|>?HeOP[;{o߼~2@ PwqLH$s ^V6ZZZ.PM TE*0'5l ]($2YKU@-"?AYbt$U (Kbe T ,%%Ŀsff&T6rr?eYIIx>>kՆ7NU1)4Js3jC"eD"9:KR9A\ eufSVFff+oFt %ʲ#$2LVj|^%t_K@u+˶'O;mfee9kc# 4GWfff;:&066?gu֍q].ed5G^R7w@ X ֆ_n#nDE;9:VeY|o%өKw vUr )Uyb~}z.B Bmʲ t@0334p?H$u:#ѣy P(GZ3 4Hasj :qmΙ??xZQeR<O[O_11:b^Wv\W{vVZl۱s޿`~~}Fu,cF'sL :{;X>婸Kꁥ ?ΣJձsQIEc#WIǻ89Mtchɚtb*hv왃ݫ'JEsƬX 'O fcm=z5"qW(**ڳwߘׯWnY'5-ɉH"*>]TXѮmٟTjF}b F`06m܀$**eߞeqm >0lS)=GCj'^dtZ^s5Heb;޺#vm)ڠ/[eFʒ@ %nݭI|BmGZtz߾W.[Joܼ^rŲھe=v<߿'TGG'/%^vo^`/~5I[ώ:uxefV6n5>LOMM45VSLRG{sE"I!zzAS,_ŋ:~'OZYYN62ygϡͨh4H@cYE\jGaekOOo ֮^ŗ2*DӨb</S}˦ NucԘqڴn%f{/OT<~}+Qr .(Baƍ]\U4 yġyK(qYH$cBaל6,<.SG?sssż$"Fdff"b "xIy/(DwKqd2gΙw;.=;xy[x=ǾήacdMk?oAU^Uvu]oߺ/RzzFM߿gb3*֓kڻkdz籫׭o`"`Q)QP 2g֌͚j7K)a),¦-ڳ7?Nz2+ v*6^U4}"PsPFrX^ >d`wnỮ]8@?S^=GSNǏوhQbZ=~jFC׭[EEEG⩶lHR|!FPl$r17ܽwXYZײ)ʂƧ3}|?qc^޼Uk+ϓUN E}lA23R@X7] e)|aFm,RlmFiɳg7nDDGJRrzKs޻``Gb,--C^T(?iĨ]薿qL,V,(>sΠ~L4]qOX9 <|Xګ҆kj7K)aYkDE֮f+f}RNv*6^U4}bb_'үQ}/^ޭ @ǘQ#mIc} Kj'ݻ׎9|xL҇7nFFh CwA:4rB# E7- t81#nhT*X%4Ϝ)*b!߽|b7&Pӝ=}&aٷnηo K<9b?(кU:u\Οò7nFŽyi$y{ޜ;vz<FM6mPӧQTٌor~ hx,9Yy-.dlVd@=Dt n>ypDŽHefe ۏ[q٪e  ڶE#a[V,[޼5q<|?.wJݻw;y<@#G G{K!}dPy ++ҏP6QޱCRJXvVUGSSt}z\OOϵA}ż9rؤ(U]+d.r\NeۿQ =9{ނ3go Y6ѠgԴT2\XXo+JѣǍ< }1T 57737 .8vU=[?a@ӯ3jCSJ2COOG'O~p,)q@]=]ݜo~Z &F?2*PF~HzJسEm2o׮2i5kzw&؀ZqBoe!YМAÄ|$o'65=SJ>>sgϔnJè6n&hlDcBY/g.eW{UYf٪:UHUFWit KvS^z Ϊ, s۞'OT{F4&NPAAl6,JRzdhՅP (ԩ,[ 2h֜HYg:vYZX/07/((dXZZWdegWpU5IL[[LvEAa!rx|"%t5^ݺI>JwR>J7SR>mݺܖ -KKYz(]*'ϼ9_&N :~}z~5%,P>xEKοZz]c]/ɎM/W_, PtHNٻӣO=6TS))?)m۴B OxI S@U{UYJ;p^^^)VE)Ql(bPUJлgryG9flbkJ'}(e?l Uu Uh]BbUSYD"dd0OuU X,ڜD#3km:h쭛7I;͘ݳϙhT[xƬkVcvHV..kvf~ޓbIMxܽ'h8w."e jUk:th=љE)={tG}C9-d#ڴn5}֜VJr̝ޝgyLxͪm=;n=iB {~(-6&$g\rF%$t:|Zn\oN?F$[Qhd⽏߇zNSKHDR2 o!H6}NO~y !7SOvh޽Pcrr=-ܨK7,k٢5##>*ƫ(^eAC"ot7xyRk]J)m2PUT1'&3YSw*bldDwb0c嚵O 4l Uu U*^J2&iP ݽ}P@OOUc-9ftJWW]?Ӈ߻`mڱm[6.=;} ݇a,] IBCuV]:w*08yڹt~L%^) ;wҔ"$)YB"#(jBm8E/^6n?tƬoL؋gr⡳lj?rKtw:[ | !Fsf0Qk4pL ˺ԁa#ފ_:"!_$,MY޳}۶n޺mn:yVBC$-lnY#afΙR:}^<(-2mFnMΆݥ#XdqZigh`лW_Sj(9Ji7XR !]>I$S/%4Ґ:󲠪r%T+*Je4ËA*)T=s:(#') \}0=B֭ARңqLNvYNKwM.o봊wƙ֯]&BYp`o/PoXFJ.F__?dh9%I6e韊Ws7lBŀ(?~ܽwA~2jMC$5tOhw݃OͭbYYj*1Q9}H7P-鞣(ڑdJ#@ bfbz-BTSPr v~b׫w/(M&3_wؤr%Tݫ*T/Y%!C=Tw뤷. VOhٲeqF +@byP@ˑ=)C_8SF a#-tW9N%U,+]'WUm܄I#_>7kRT α(?A=ʲfOH$@HRDџP +(Ʀcme塭s_f'aQiou:{-`P$g+Ե8yxUOԨa"Tzhě5bae)N*;ҟ.] KJU tBaҽHV66B)[uT  P}=2ӾcOvζ @@$$]pwWjԔOM,UCGBk* P[;{o߼~2@P@s H=,lU[%ŀ0'5l~e4%&#AݥJ@Y5 @Y(Kbe ` oܺɄUm<\ꪻ,O@YVwR?^z@Zx ]^%Qݹy!v /[MD"9:KR9Af5SpPfzMM[PV6>ѥ.P̩::IR@YVwDJ@|Q֞+D.< Q+ˬ,z ߿{cldԩKw Bi+k֭vE, ߧ@x X ֮X=m=;N8w\|Uo&MYt#*Z6l vzIǻ89U!""I}w~G 9k϶B,ۺ#:x~i8n!wylLs^^W nkmjT{5(mܼ]3̠3oq܆kVlެY)Sݷ_}Փ&3gΌE$w1dNxysݥ}S>&̛;[)Ss=yg,]gwqt:MU<2f5W)2~D mmmſcǎppb] ۬9seςk/\W M7Hq1m TId=!H*Sim@BʒD$h4ȶ;u̬ln5>pWXV۷lrwwc23̻s@ LQԴIS>{nei1u$qUJiҔ/---L0y^ө2H8[XGG?I;w%d&|/Mhiͼ,x[Sw-BP 6 ݕO}_f-\d ;0DӨrqS/tv/vhszs?}oڣcϞfeg͟;EgΊuo^gbbdo] 7[ݾ{L&ӯU+T*nw/23UiC0nG".zy#`ҕU 1qcǠ+E8֪>I9h(~FTB}P# 9z`?\KIH|?q8K s3j;jبG$r>&'xr׎ @ֳ}nj KIdԡ=n1%!')jR.?Bf5<>]P vkŹ(zBYO#um}fkgk$;}}l{>}=g֌.^vdCZ{K6mwמtO+ɕjێ}233}{\ 0՞Sו2o%KWlrmPݪ@mś[Rq9 οW/*M|ڵȈg O 8%s$wo433KNIA1(`vv(P(;~҈Q(#>jL:uN?RTX4bt@?|POGNstWm!]l}Ҟ?Ek΁&xJ#QG}v}W^s-''$$kWHNRģE,͈]+v^ߠ?: p谑/^ &uT+KKF6Y̒QM۹rsTx7'yl,[% )*:c3ڠ&$ң{7oތ>_x>O٣g͛Y[Y3g]?T;ϟ7G[[[$"S"A%_|i!J3UN E(9Shgǧ4QHqfKF?!߿s+1u1Qk;ݚ^ш3ll4 `MR9u{jx)8v\ L;>d'ʍF{Q0dxtɃ{(0bPPwcLbZ8>{RT$Le"mHpʾVkH{-Dd,rq]fF2Yt134:q{ygg+77r_[ɨ#FAq1 GVZ U^V#()*vVl}tM:ôp͠7}W).+߳zvФkV_$]LNpWzI&Ι5co`Pfة7Bw޶o̴019z aOGc.P,]qa,-,Bׄm;Xaᐳ[AKKUkDr0bfʓjH0D!l/.&_w+È(Mݿ 譝:v-d $.OT9%JX 0ƀwq;"w?Ǜ[ AFe &M4M3Eɲׯ_Z}uPWRR"&вE x0Q,8PV_PNN6YLݡ޹H#))f+++wlo )/?3˅Q0vߢv9{.myskT|DV!ȅdx0>Sa\Q6mIggf·N,fVV?Vf:گ^P N>-"2;;G^^̬-D8l,zrCȺ`86dL**;1׿>8*; "\7oh4C͙8405%@lzsCßDll]hȰs_ntߞ].l Xe%/UT+ WTTGB:s^ _.!nmv!)韛ܱ lmΘ-''׻WOQCCH?wOsuÇ ԁCL{|.d0."bo@, pMHC}0d>i̬l,޽~3m{mmz}Qb[Oi߮/$vGQepȠpK .;-_1<ճ1Vnr[ys\mdii20xuh2VXoƁlڬqUco O:=g "ɴm`ꊊR1++;7/h󽠬,|xod8\.e7ЩS IokĎ~6osN+ׯ[߾3%{c>̜ɄÆ#ذY,2)Y9{2ACUg5em#;3m+>}:g|FFf]MքO{zlE`ЇQ6`2"\-[̘>u$?q~&ۼG2#ӧcFR+&ʷ07 KyHzT{ꌞ6M;S~`Lm8?w?%zQTvͯmZ-Z7p3/>NITwsEDԀ Ok?]x.s5/Ay#MOMI$a0jS(3Ѣ019u(8{tbUVljkojh|%D18B6{7id50 &vlmn߼&ޣӖ-/'OijWUhlȘj%x /M،a-E:eeef!PPPX<ro'Dss *âXI*7)xD7lƬ?}g0gu*8q.[*RQ) /$|&Ӧ$Q$=$ء}$qUq MBT+GA5BW 6K AF:β뙻jy6xaCwR܄XawV_;2W^[ |:ACOUl\qJH4j,"77cBiiSǰiGTq9\9犿wE;ؤL߆Qs#p_=i6!T7g7h Hc0I;àqvVFKS6̨|,Zځ ut q(?"!N=4yir仁dd>OD_AjA : |¡=G Dcܘx" @g0LZK;r*u: R]Y"|*v 4nY"  :KAAv@g  ,AA%  R;DAAjt  H8eqq@AAh2)9٦M9K[3%w7OuT bx B=͡ڶ!XC AECw~_U]ƁL9~䠃]Vq=u,8kt &S4UPs!R%v=c:t2ż].g#vՅ5dlȱ!Hy,V| ]<.0zն V u>lh(***Hċ.\O@^^c_z*J]uo Y3rlR-,o$@A]Qb|b1*Jy6}]V鑞x誯/Pc޹_PbB[Eڽ'/?_EYy!AˌAC?L"zǏWI8*+uCZVD1|XrʥjӺnN [WPP8f/m l:߈*^m߹kƳMh,Y"=Q@`pM:v)ɕʚ5g~ڝsf͘=:TaдX6yG΢be%ѣ~ G&ѣիhߖI(Iz%T$MUUؒ%c)g9k'.IR24,96V>(zϫ(g}Szakd^~AǴ9zl9n̙lyaccLq[m7w6?:f߉#̶{Ny `())_nFW7$'''ToC65mhSS@ g$ T5+v=&L8>S,DyĶm۔=yϞx ykck QA #?,l6l%yΒ5Ī'UD%,M$Ԩꪺ$HTUP]e+U)6޽M/Z?w! }gɧ%d+ϧJ+Hi/+_ODžؽ'Б#kW6Ղ/Ow gܼ HdVԠ<7>d_|~ڿMaQ0QP<&su;txU 55ff Xiiw$t5Ft?|a:1 aZWTQhZIUnݿo`ѩc*A9udSB#@BzpJA!0XAG**BlD3UϦ?P b*lIZIrܾ#tBBҹ3D4 g2"Kg}M%5S˦*+!ѣ/'kʚgᳬ >a ekDvN|IIy ֒ #G) &`D!uSʄV.*ѽ/(P'Ӎ)7?4$J-"oڹ{+FUW%A[Uؒpܚ3N%? !iβ43ci%L0uqv K:g BVIjx:wϴqv6Ыr3;'ɱĈQRTbǏ꾽"@_Oj!0՗}+e0}T?D)Onj/dS뗗3+;Gz1Vs!H#VҜ40"绀D$2(y%Ѩ*^U*–`!V63ݹ;m]Q,-U24q؆ JW_7ݍպ*8 p9 d")n:)e@g͙LP}ٻo0&-Ϟ;=H=o5!EEES prj;u<د/ije[?r9f^fdM-c.;-_1<ճqCj.iTYu Z߱u>@ŠגȠ}FzU [VMW=W.|^Ni?J.׻a;]ű1Vl 2jL?6Q=Ѧ٢~85WWW.z㟛ZOs}φݳK+FUIuTAvDռ$N),, _+2gk0 uJp<a4Q{FGe0RJګGH΃P+%DC(Ձ~ݾyMl$TT{ljko!DCC& VCIDө 'mjt{E3 ,C䇂V;K`࣊$TZ FIo+2i l%%c>& ?4dp8< H5sm|du7TJ 8ރTW=IA7V۷8B AsDz}FB%H5 \YCEKG&\ ͊ ?[ɩ(˼(UQBrss<&8w vDл7nS?k&TiRHYv2~}\nص ? ֘Nav"Ve: ]l_w`Ai4Ұ6jȼ[@ h[ cסc{KOAw gmA' ,AAt  HAAY"  :KAAv@g  ,AA%  R;DAAj,ե  BG#pI)6mup=s˘Q4y>ޢjHt`3"HPVwݳK % hBbo SgLDEw8vuEA ~㟰7œ9}ꔱ.7Y3[0ժH*AFA,opDWe/K+^WQB (jHAA/^r#N?yy>}DWc¤ wlߪr~ 2J^aCp 6zT ;{/ PPbTXRr_}sƆUcz'f:WMoXYIi_BC ǏWI8*+uCZV6m5g~ڝsf͘=:ڶ:NSPXh__{EUYŚKKK-[ֱ~*K|'͛;H9YNNnϴqc]iogQQqIqqUG2ݙ+WLI?rjD#v72fOIRJ҈p|[2?=%sGO=fyr=^ضm'O())_nFW7z*-w:z(o} ~&$a_F-]t^fPB-낗]ij'ƙ6chbڲc223]ƹoݶ@TJcF< dO]`qo;[8t'I3@$YrX%O"ɆTԥi'OşIp7e|"rrrlm CVv6| mXe@e+0mML9֡}{2L9䪌Lt Fܝ6sήvD"VZnH`'CIXJ҈hΒaj((^}~ߔv7VnT0x܀XUN{[zC`PH6ֽn &S[]vrN0$˴ ^QlTEW!/'}|F:v$<(yP/ɜ URb1ɜY/VIII i2xyzl޺gA˩={p;sCҹ8Ί^={$` ש5GGGm$s[yb9ܜ 3/321o$'x_*'nՊuP'IR]fVJ҈hF= *^z`+y\6joV.eFu'"0j@a566NDSS5gˬӒ.&#(*@k~t!F8z;rΞ9g_DNn]9((R5If ld\]]?7%ِ&O0$9ݻgn1Xt>vѻ"Pg tu7o`WT  |4vBN'$8g D슌*EvDQjI Vʪ i\4gqxvOgttZVq#eL{Sy'Co\&2[81 ?(IQT邛 I gOWYר%qY+Z*7ɠLGgW/ʪ۫ e*DyhѺfdOCe+%wJ(GP$&ӧ$Zo*Mկk b7%bAE~2PʐEp ǐi&{γ|[ɐap*nTl0Ʊܽǿeo޾ ^yH9y*UV6 _e 9K"]Q"VÿEi HYɕzqc\E$,AApE{'{H;CH0-F: %   rI; z5۷M:::dq t  _p8"B,Y2OIn݆(rUސYcYJ=~Mw7Ow1CЬ1uQ&gNw3J եPt!F^WW D<3V<|9:w̍Y?Z2?7ʚc??>|'*f͜ndNp H2.)96#R=zAUUUIj |E۷oJJ۷t¨tl/.--urrھ} OY.] "CJhHp] }gxŔKTOu fqo5NNNHPQQQ 6Algo,,aܜS"QxRk8)((4*,[l+"zرk׮zyy&''K+tsAN=$'''HbK! y ̯^n7l :rO9 Oފj,?_Ƹ^ZsC kPkz+ȇ L8{22jMVVݨ*j#Ѣ~^MO Ǐ'LYVYUPYVUdddŋ 6:uCdWXѺuk3?677^Tlx= }gfV,_C/r͛\x);oej ʺΞxVcM<O\<菂TF1-YBZ7iٹSǔ˗ӐUAY2HjI^;ɓV #&lzK}9u?_eMlE4B-x$./^\LyM lխ`?nٲv5//L#G<@8{\yPw4gI j+ 6kb>}8r칾-LLDD=]]t+))rٲE / z&T-zֈl.s`\HNSK}D"|QG}Kݳ3͟G\BV^a p"7!%OʄM\T./Df3162obReǃ HuiejڱCСCRR.hTb~ֆd E6KݴiwnNVAs3|mPj-)[Aޒ~Qs + DbEJFFfh2EQAÇBUz t-..&S/]ꔳJG2[ѻxi(ΒVJr^WQQu속p 䅆_32mm ә bTE^Ν3p\,Ȯ,tȃ@:\\\bTTT` SKXӇGaCa?D)O7i.L[8y*L۸5;;˳9997x[; )wӦ(U!q6s7w@5FMjqȦĉOAhV͛mK@BFU>yV~4޼yӹsg/gΜ9FFFnڕZ7##D|JbhΒx^Z۷[e3-Ӊ?O w|bcm[?r3 @~Cҡviaƾz;~hz)3A.c*))Ayv"vΛ+!UL_xmmM?K/O[?},(`9M Tٻo0&-g%l|x.C:v8ח8iT"|æW_'_8{;xn?diiQiǢ$ğ`T7o=zi֭[䤣pB{{r%/ ?nlP:Ke‚ }sr/mf`U`r3z7 <ݡCݻg9hE. =M2w9""w=~Wئ٢~85WWW{㟛*by'N8cT'yU'o|#FQɓs<=~ޚz:WiA(((>LSc˶ 񪪪{(M쓒xkP5bW%EE޿%,q`'_TzKEKec_VVMTRB&.}DSS%WEEI |^&3K,y=xͲ2GGGp kOFX_PH@J]g4gIe+i ĮnG.N!VD7gh̩)Їo߼&60019u(8{t gOSU'Ja 0><2I:ot>A4Q]4љߟʪ[ߴ^(OF rN+V%lm_>%}D "@n.ıq|~܉GBKTJ_Kɖ?6 %VWDT%ׇ\r ݈\x%R AM^XGuMarq9dLZ:5A8KAAbN`v @VVNPE*3+>||WGDA/E Y"  :KAAv@g  ,AA%  R;DAAjt  HA{X]]]Q Pβ!n d8{t1h3T!4^SmH, Ɏ4|jYv3222zzzƎYb999H5s)yQ͏ Pq!17q]E69rq$7ױZ G휳xOc#ɓ }*PPPA,7Eފr8ߗǥFުļl] F8KJz[ѓ'DUH__/,4Nyyy\Nx:lf::5k;w ̚1{tmuvpW^ڽ'/?_EYy!A| l=**.)..^* un/c\}%슎R6fbb\+ -܎;IbT8l36#=0U___t[9Y9%%%x˶Qi]tEz:u+,GtU#>~|eЙ28րPj~߼#jgQQQ}{"R3j>/_޽woXkc8rl{ ně׮;*ëi\.wY^|Ot w:z(bM* ͙>sF.ܷn>ol"sϝj&rǍD1{c2g2cs1YtvZן@lV"@p|[2?=%sGO=fyb%=T lڲvKޢĖ@1{otuKO>[ضm'Oդ)%jYٻlݻGC&6 (g|To9=z|;N\l,dUz0Ƹ0-\+xOVC$f@ż'y$ l%XiaaN1yWagkrs775rľ,9΁CkCkAj <^p( ѧ ==1!#nvח\E 4*!4%#xq1~Qn3{khhtءZ RԎt˯2.YpuL3114UyJJJzzzb-3?bihkjjF_>m֌39%%%fff*=]]y2 rse,+/O #F t9fTus X`+#RtTbp_;1lZ2b$q=jBb^GG[pV )JFFf/?|`խk-Q;wϞgl7i^jY-XXgCXSh_^^^PXHlc?~H˜W9b7:wϴqv68!|F&M@ן2my3 nA4,*JN <8V”N  ^Nmsjjj͛]E4 "UL040'&.: 2|P>}wp4ѤwAq<fLnnޑ۴n-6۞F8c2BP'-,̻t|e0" W0\U,-W*+coy)r͙LP.1boTٷpgss&̼Ƞ cO= X^eS '<PCAI^>xZwC%֬L*~jkkxRliř6-X&,oQQ+3n >"RԎ f444{ܳ;Rl6Os}ݳjLhE.0HcoG>l5k|3%l>kƴr{Ѧ٢~85WWW1Mr|{_A[\t܏[y:KH3iխ#ZE#U#bvGup,))mm=p@(366N1 HS ΒΞ&SS\Mٿ7ZVUsdog@le[_)4̹7v?xߩoϏ OR ϑC>@\NJ/y,V| ]<.0z_=4;8h%Ho462< ҇JR^N1=uM"o4ȩqBx5mjʊ *ԷB[઀ļl]("_!}#}gy;~% Z QQ\zذjLLGW}}j;v++)KhH$~qʠ3 gYeeVݺ3kJt[Jz[lSgN 3S</R3M_r_0*p;NAa~# #$;%`~02f͙v管Ys? 7vWQV9rxHP Xmb/l=**.)..^* un/c\}!!C cD߽K[AF˷觜W%U޲-B.Y"=Q@`pM:vI#*_B:߈un]3=!ubAAΒaeeF {^E9(#sGO=fyr=^ضm'O())_nFW7Ds"˗w7E}'d29+ TET=BbRo͛x趛6+(*r aDW+S{\鳼&ğ0ZϧJ+Hi/[y%ƻ*OEUw!/OW[),x7"2 ƾ0|}ǎ`s޽=j$xLanο[m܎ȝǃGjkk0=a۸555X Ziգ7<(>,Nk+% X Uz0B/0-\+x;`xC$f rI^&Igf{0'Ø<ɫc03y5ay`G/v?8Ks *Aj:rغٱ__rt꒞F+ 5JWuu? FpX )O\:k*1lϝZ6-T\1ry\[g[h}Kݳ3͟j <_N@}Adѿx!5oᒥ 7_'ˉ1P~næysf]ycc#r󕔔EY/ nfTJ;EP|W39%%%fff*=]]y2 rse,+/O #F t9fD3|H?|x?1-Fdhmu/( *HUD4 gYQp^1״tJxP8uj;M0"?~߻w/6O*=i}C a4 -XXg[ki.gS,_p9'@__Y𩯯GS,NQ*eA0r^.>a#ڌ/4a]ʴ剓$7#?5O@MMysCz7M~T }==*PRTb_ҡ} /DS&/=MΧ$2*s(I}\0g_g-pݚՂFf# U`y0Z81 -IlPh]a.LGgU䇣f)V$T\%$_PiE-.$ē٦M!f4DR? Cp ǐ4P=LVwCE,2d i'}~uNQ5Ldž7o^Mdj!"E8ƛ\˓{5 A5]?Q+iHYv5fd^~|A $x ȏ' ;K5i5c ' ,AAt  HAAY"  :KAAv@gSQQf?>B-ƃ |#,t⟫o 9A~8>qeeeJNNNƮӢ]]D ÿ.]p(J;4(Z?Yμtަ&-eeCK \ 9lOO=ҴU]Ć U¹ƶjVξ#H}R=GN]v  ߏmǎ?b Ab9/Tg RAP?]yn,t ^77v QCqysj7?`vsݐbtՠ!naq.cFI; px.5>#+'7Գtsu OV"Rի\vuYv3222zzzƎYb99U5sIayyh:l&OYO*9  Rܲ-⯔MhVj>ޓ\VҳgOJ1| {89t[ ԉ:ߵa{ޜ9Wݻ{]vIN# KKY>SFFDH%F,>A+z{gWS(EMv.ڕ=YSeuE"QID*-SvEݯS?8tѩ摙|y>3gf9?אַh XO؊F y%dejZ&DBBȡ0 'XY=tb/BQ vm[ڶu31/"""`g譮WT\%**Z9(^)#K;w|.6Hc:UΝЭ[ÇRWpb͌;p䈜?$7y9JJAf&`.U""pL3M[\eTWC`:5}~JOOw˽o_Oq_m!TR_G-/̞~윭~ۃ<1wn1cQo44Y! #3gAt256 *dA}׭Oϸ8,h׎q,*^\,%)9sM #EYeWTVTTVb!'P0ת 55ՃC GT4:Nߟ 'YAKJJΞ/$0[YYqI) 8I. ȄjMvmm-۷6j%,5:::""m7f'D̘wod_Ϟ?guNh%$wv} Q&bM {B~Fz%iQTTkx^NZ:o78wްf8hd_/̔lm---<*)-6,ZMJ{vr-jO?i]AC VUUe]<s"BN?';vBqp7u$"̻-tHX@j1?US<􌻠``+UB-bBlO޶u34؋,7wqv$8}Xp_ɼy46~hrC~^}kĪ+)Wܺѳg{ϱ*_Lm+S.>-BO%fA\믿.YμźRp"VSSsjvfܣӋ&M>f-K õ3v=/PW˛mkwիVBf?0 ]N \A7~̮o=}vzqE_03̇"V ٳ3khЋK ,,lr?3wSB\ӧO< v ]s=ӧMa:}8y4kϪLeeӌٶ3&OЪ05nnn`a̙3+V`0c b,ru/&{:|pf ;|P555l@ΙZ_b^^^uzsB͊$$%.&_;QPX &&VYYEyNZhjj9exd/t &))2IdM7obVyu*1hK`a#GC&d3̸c.\lbӁ,tu!nS99?qkNQTۂ_ЕlhBI5 kYVlΒ( vѴSE)WK/J457o݆/deeՍ>f.%_IqaJJJEEElkݻ7??%\ˑ7tyjU\M[vla!YBݐSVR;^RZJ8wBMgEܗN316Ղ~|^>x kYJYk! aP_P_L,S߽WQRlhlS 3V(+2W@TE54~ϺH@Oi"]Db"Ģ(-6µ.]qdAbw=zň MjF7p XO,%%]FOjkautgXWW'Gҙs-:Č::^y;}'!ѸU>kv i.//Oϸ7q%$$ZîL,#|5mn.^ B)/'F( rsb _zM }zrssYYׂ5KIIkIXXXlll;DtI(uڕ ;lM[B7oh;}߼ͅ+eee1'☟T'VbNϴ3屉gXw}{A,Rڰ9uӾWH7QYY\ 7%*)90s374mYkaK,*f~E`QQE%k gK=N‘Ѩ'O}H;,a<鸱c'MJK8sέ=zD2kx m H9Wjg4^+VD9j8rĹ2wάM[ٟ0O#22v0ٳ*É'C1Ui] sS3k[3it55U/0?1SXqqvH&Dݰi#ð}JYkMG0k"Cl۾g&�k%ϰS3[OZB¤'NL\vB)AȊ+Y"}UQ\Q#揓%4=mG`vjFup>Xi4n5vخ<ɸ{oU;ݣi՟0X!%%u]/Ft~W/33j~ݛkH{vĚhjb>-kʏ.MܺY n)ݻw-/` kŋ.]sk={H8Wlbdd$5PNWcp9] g::OSSkي%+jrU#17"/0o`4K%LI[vlSg##6Z Z1?m3"ۄXY,YQ&FΛmFYQw] u |$ YY=wD^Q'mywOHƃ EGo +**Q11)P/,wڌ 5toFQ HG%  Y"  %  Y"  %  Y"  %  Y"  [9KIS#  ]>89R0Ǜ%JX#ty۾cl[ln9mݼs$J~QYYI}}VG| A.Ylۺ6R2 Hצ!: 1'xq;isfeZqqqEA2,EEDi4k 𲲲M[\eTW7xV~ÑG+$i4 z;byvv>pECGy3(l'tAǏ֧gonkGoyվ`̿矈Ҵlٴa&nlf9,3iIi5>{c]03ޟ>\V`z ӳbM {B~ˌԛ}~Q!1ӦN記ؠ0~!f'~3/tY|~WP0v`%6!2q|0,Ygq"qq{ ~9DG\ͽ"w9^#0 VP- ee%iii%*ANv0FpV-$%%y<'Hhb\Laq#,**(f߾ىEL"zʦg܅tN ?%Ȳ9H$!.'Ñ#"EZ飫j) HG&6.A^^gL^ӆ/~^\LWvMSл7kf"zWVV$$T[lA.q0UUUi12h={ʲϵ']~!++×A:& q'R룢c gIeeḙ'JJ555M仂~餳 Xklll$ۄ:T2~m>]XD仢]߳66gͮ j&NN/a( ][S߿pz2sl?t7oYJNN.7/b^OOw!+ݼ̏{wwrttWTTx̞E d=SB:%Z hODEmalfYYY)##=nI }a<qHFoX"ʼn:e餎v\B|g^zB/w6l; sN+zc"xg)<&f8 V13cAm;`| 3ރgwloى8S&3p-taN =03v̏zzq Ni}&o1=ʄEgGܗz?}l_´v[wZEe2S^d.' aq$RP ee%ii!"A:mO&9ĩ|(Ztbs$Zv7ol4je%RB_%%EJ0'}!uo2Xi0}\xm2__# 6'֪G!P-B-ԬTTT2 )))X v*zׁ[e[̘3tBsCzc!%y8,kv ///Oϸ7qewtz %$䄅`Bf$h:~duPFb0P?<ސdrj;Yd{scO̘n ~:BVuDŎ [zI {EG:&Y;{&(**:v̘L_kISNG=fuqv\延3} TUU(9nޠa04759~ucGzXz._zv*(&- hlfYYY)##=nI`Z]qdAW:K֫UxZYZy%iiI'$95Wm'7xl|վEjpB7l2z3QKpdآ2ZOOikJ|q<wn.] ij‰MQݍuU#NfxPuMZEde k! n]Oh ]gҩ<:)/'D"PVA&lUиt scZj;Yd{s8gxiu6?J=1ΒlMsݤ E&lS<{L>}qӭTA!i~!(u"q6j5|%wbbbUUU7j+**80LH@K'XY:"A:=mO6NSQ+475޸q#ٯ,7ٞV`U Zmڽ `}zq +A _ ݂ HGCRД| A ' ,AA.:KAA?DAA:KAA?DFmmm]]hM֊b^zjAւA; 啌F~ZXkqq;~ `Ag ]iWD`PggNNk7}bCAx%t560}Ĩт|7QQ:zs?}"BAZ:KjҋTE[|G+g&+$ssADDF}}}gy-Ke'ɓRRDX/d" +;"'Yzׯ\FYzy,; ,`+a#1#dQ?KJJt yR^N5jT'Ggl_7} ].,۾clqpq{C\-'-t'0.ٳOXS }}}\ӧݻr *H6YM߸\yH . slHLOGGQ H+8ˆ ǜ`u579jkk`o*Iqq1Ө^˗`+a"<<|РA...Oh厀m0Qd@nI#n)111sScK v)n6ӾQ0"-]YN?1<;;G__W=w\Ye-r-((U[ 2xcG6mrQ]m8r]Z 5?oatӭ}\V`jh8?͚kw**P $GKIJΜi'!!Y>_8:sBۚ8hyy$6g.w F#fˆC3+-}6a#5-=88XRR9hlvƍ+))QUYO(\彚x Jbe5g% #8(7:n}z=aafAvn|Xr(6F?G'*+<[.֧d#U6˛<%%Šb[{uL EEEFt=t/H'+81ӦN記X8!1toD}] "ۃY%-$ϐ޽'׻i N+z|uAVTTU%cb㢣"uuteNJ癰Jo gOAN[{ǃVz{Y˿|*lu 99.H=o@:"bbbs\nhh!шβ[ɼg%*zq tZp(3 UׯLpgO٤3gOS桊<]C"?Ͷ#(VF?-& ?WUYȽǵuNh%$wv}r{uB/w6l; 3hΠ`p%]y2ϳyM[ͽ"w7`pq$0Nwaz\hA0h᎝AEEtUUS&k!Bn0|(jmIJCk.¡C\]]%$$o߾#DEիZ3iv zvv?`IH`\|շR0׺8;񂙉ܗz$tҷo1=!SL(Vڬ^YLPfuja.pmze~* pB^D j826.A^^gL^ӆ/069翗2ATwPݛs>xrb'^Lv0@LLRKK3?Y6Zۄ}D <GWGgJ!Ocfiſ78m%AHK!Y2Ӊ F^fi*pL(VڬEt4乎lakQ(h]||Mf j8t36.oDJ}}}Tt,Wg|x (+ĀTUUk>-flܗN316Q8y:ldu 6`6>/deexj3 ?~|Y###ܹ-t>DJ^.PRT,/(++#lVBJJ555% %ElmX&<'DRQQ`0`BjmEvAUXXhl4Ǣ[e[̘3tBsCpsѹ۩u=E?=P_-\n_ļѸU>kv },//Oϸ7q% пiߵMw:'U ȺHv̉8)xFVW67N/a\UBBBtt4kӧoܸQ]] ׃S0%d]9~SGN۷UW3C:d nhmX&<'Db0P?<ސ?,<Œ[cO̘n ~v4OE:1Q#V1lRBިHs;˨ةS&1S+*ew`bOđ#GK: bjlfYYY)##=nI:aӖ1F5jaCɜZL:]MMG/~{ܪl\jC`@('2剉mccLسgPUYHKȭ7ܼJ,Z7[W:K xUZ:*˗ˆ E #܋m@l1/\4qBҙO a;;^pE,E:pBAZ84j82>8g"v%0&3$gOٰ"Oi1w5LOk]mh [SZtm:KAA?DAA:KAA?DAA:KAA?DAAw,&Murtpv6#%%%C߼z)/'bpӌ,<Ν݆ڭ۰A:_2;;g=VUQ3f]asvvV{B tlޫ~“vǛ[^?}*۴/*CMMPCÑ ?x`ÇECGy%++qΰN'?z8IfV`ҹg MʠL+)WՆ#G ޥկL+Ϟ>+.)e0APus#EEӋ$%gδ ބkΚ-^ȈݻY ȣ4ڜٳ,dr3.5!d\AA6d#;>9]{5R Y@q֌0zZRZn)ד }E=;s7Q_yy~4큆:k$d?pFѷlNq9PT4k_@@!;K0 1w×%lʨVrO,v<Ƞ&hsk7n^ҳ,u ('p=xɂnO%UUV,rg;8@3!<]'_8 ή`y/b^~>kH\I'O'Qo6lpsN#&kEN+=̆4`xmd~.\w%E8iO5X^^Dy}grsL5qxJo$,<>lM[B7ohbnl4n/~o޲oZh7f(<= 0mms @WG .DFޤm9gga`M fmn.^(C?& (v1ٮ `DA?Y}GmՌ<5hWjyʻ8;r7on( d,}K] 3(YdiIWB8 de9X%Ecoz{yXq(sI'YW^+a+--=iℤ3swzA0?Outæ-cLkۺmL{i3w dlfYYY)##=nIМ֭4uj=@hGCWLqiV0o‘]quP4lWr, _,㑞+Vié|۩0>YËvV896mèoq-L6YPW^bst:$E e޽}{ 짩 '*[⍫irhh\:屌s;>8g=e%\\O@gܹL44>-sq{6qӭ5`Ur0]o+wbbbUUU7j+**ؾ@ H/YTT`e:ED=Sߎݷ;KsS7:ȢI>A8 o7G39j-_ٷx9C:#wf %d,*S~ '  ;KBS1A+t(:DAA,AAAA,AAAA,AAAA,AAAA,AAAAߑ4q>< }ꥼ7+ӆ>HA[Fc,<Ν͖g.?Yfglժ**cƌ>vm==:f+mh&]sx tkkk :Aw7oݾV__u[z]],[  [>]Aj+p<`Ioz8wiDJc3 𷪪jƍ XӋt2,(;'b6?3SJHo؜o{!?v5[AAߟd({dn}z=aafAvO6mKzPSS=?p!GCyo^@3lS=ɀtYBEDD`2(JUFu{wiG4jϊKJ FpP TAݜcQb)Iə3m$$)6\Ep^<q&'ݻd>~GCȣ4ڜٳ3dp3.5E'p`/M?ـssŪ@NWx.^M<&;)NfYOKJK׭03mmƒ),7y9JJAċp=[􍫢 \jG}@wuuu 1w×%lʨVrO,v<Ƞ&sk7n^ҳ_spzt?0iC  ?WUYȝ5f?τ/tY|,;.aۊy!q%Q}Ww\`ffkЩSm.&_1-$ϐ޽'׻iP/43٥+ h{iuu5`^p"kxQ7o}%PphXԝINΫA7TWW EP^FN#^5 mO6,5̩Dܗ<89]I@ٶv-X ǜ8tRGG;.!q$E!!}㪨B$~zY 5U LDDD@#y򥋉N 03v̏zz6*0O:@ wq1ݻw[ G /~5jq-V@W={;Sm e۩iP\/1Da .ΎD3'Nr_QTDMQ)m h%d%;;$$aZf-78鲲2S`a+y9m[ԧ'BN9&ACqr7[NI!]A7ΒS +yz>M:{{u iS'*Ef6!{)apIh4B5}q8^!$ f%% m^ 3a;s-sO>222&JHj.&_;QPX &&VYY{B 'z>h|%:>VV5N#Zqc];O&%%=:ZCY&y9m[RC544$xJqU>pJ YkQGGqdH=&qݼ!aG8K2؜왵REE%ŒRfzMM ,Z*))|CۍC~aEEY»r.Ys EKO'ƙ ],[xY3h~>_yy1'gLՁH>ꃽrrrq 8z7DL6tȦ-~!Aq4166w}{Ak` EeouA>AD!xg)EeJ?> pAEp  H%  Y"  %  Y"  %  Y"  %  Y"  %  YդNΎilf^lΦSRRk0ͫrrAtbgiWWW3P؁oT2=oTWҡbW0:Ai7,oN}'Z111sScK 3Y,?һ|;.Hi߮CFLmm7@A;Դ`IIF"[UUqJJJ[t:UEEׂXq,*^\,%)9sMxѨظ;7<ލ5&>eee_Iʨ69bo.~؂d}klf9:Nߟ 'YAKJJΞ/$XDD, j>Wx.^M2CFƂyW422һ98z7MTT"ēNDGij]qɯwDNjs1da@ӂF9of\xΠԛ|~f={&9cELf99Z[Nh%$wv}x JrYN-+8֎k?;.~[QQ C֧N.-pH,^VEyyޠaG q f&h+A=jII4p@bf`"""~"%`d6}S)XX^XXx[f`>}D*aeIMRRp<͋55yaHK!{G, 0"FyYiX`.!!kYӧjwOCC^\RDHQ>n xS55U4Doqq Q/ eӌٶ3&O@4AAKGqdn%'vň/=gbl$""$"MW̞iU\OL>q CIQ aXO s|IWů_?$huuuD5Aa!shREE%Ē+%k7ok>b >jjjEX|WP9kO 8  H;!%yV9˿?~$uueTԪRu+Ԫ=z+I;{}榦))mڴnnq12lμw@a6|̛]g \}MzzOshLG$9j"/Oy Am&MHj5RÆƭZCJT;m&Q_AAGnj٢2vnlz z,>11?\177Wbk{hsssM?O E 'iqc,^P.jԲ2eƃ+|laSLEQ~waw|oܸ4yfwޝ5g޲Xvvܮ>S#ǎ3k`\ol͖JlbPSn^?%;;hXvO?9kv≤B 9774Oaʳᤷ ngd R<`٥ 0tQ'ON:q >wGW._$IQ"=W-zv?! wJ@Fn۶oUjڴOIǓon+K UF 716&]\9r͛.ZؾST2Ѩff+]jh,8={J,OPo?rѣNE,'d'O p~awoϞ;OM6%͜7nvI Z@cA)Y^]RT@7J~T. Ft]O(`K bE\NQU|jtHdb$fۭ-0##B1JKTl ok_Kr{t59VeDe3z7ef>-ٵ [@_Ȏeed?2= &k7>7EWW#%?4lTY4{nnbm{I0%{6$TuWzFj]3<=YY[<}Bqʛ 2$ _54XN͛:;mryT:fܤ{wvٲmǁ֢bSV m%6OR[U?6dA$Fk7w1d2ݻveτV䎿455M5>"/vQ듷_;yəarsvJ(keUC;韭HK svr"Ӣ?]d!i%^~叧vj؁vyx*kmj_:NncGbg7)&|4&$e#ÆO靻w---wm,QܳcO։w[/S\)&NrN;|sp_E ?_ģĮ\e[^~u-gDG/6i"&תnY~1KbͳճN"Y& / (((022pw bY>-t5} {3Rƣ"M50sJJl^ ϨOvqoFc;ݽj;IV]}ˊ~yŽ45YfUbc[䓉u*^zR3F]kRz(KmkD3Y0{bs:֥5[\m,erýk${a#А-[PDe2|"02#zh մ]4B(W^|vϻ Cm?IxYwֶvi-v Co Q: ?upɭvb9íPL{T?8 673yO#sop$d/di&dY ($KW%y? `Ѕsvd2] XYxxkh 0p*F E"ccKK MtU>??_]@'/jU$h(@"Vvr@:,$K@:^&K7 |ET M(i*TYRJ$K%)%Ԏ6Sڮ aRG-Y&rGiqkKF.drC>A s]!pǓ͜9sÖUdm(+vie%숮@'PJ1KU$V^2hkB}v+z F͈\yRu̒J7˗|7:|{|)ixf!B-I[$d)c֖FLsf̘X)'+ΆYʕHu.]I&S5E)鏦MV uɓ';00kCCC:dll\bZyYK{ yqcG4WR^?####""4STm5".+Wv^^E ;d=?ⴵ4AIENDB`PK 7< layout-cachecd`d(gb`d```2` ECp1x$ W')IPх0@t'07@7L/2`Z03`8 #`;3& ɘ$&h5 aq3As9C9H ˀ8p9,0Y{`NQf*dA#$ ~ Ql 3%b XacijA5!Y I ;dPK23PK 7< content.xmlKJ(Dw,_ҙG=RKnIsrTdD XnwDb"]MD/CD&>@U,n"||~˯os% ց#A8?>:?_p0 9Au ~O?GЍiNE4< g"P_=5~Js/qr9l~dݏ][0ru?QPˬLdym}qqqLOpon2Yp&!ϻ).Duw-P "o6m0 RN;濍~yK_@C< kG T#>"^A¡~`"n#/7H!!,q$fah'pZ=pi͸I#491c5yWh)73yMc%f8{j|mhzpxpQcFg0;GC1g$D߸>&nvȅzk HbGzsu'i/e8nENQ e8<䓆Kw?߉k; rm8GcOá땙 1\h m>#ρp},X)bWxxVMow^0[oC[2#lG%L8-k20I8[~$(Xvaeld+9,PEOIڿEתvww@ӳT}ֽ(K;EtJgWZo~w/[âtoyzzu罓4W8//ٓ7>X `J\(,~ɯ38ձH&xhGm>aXS_ tX{Bne!h5[&#XqSޅ<-uK]z n]~/hyvtvﴤՅξ47y ŵT\tN&%Qj Ax{K-x{WyY~GݲXޅmvϗ '퓳]kc7l?b}]l `<\ =k/5NK+](evY*{% ֚;ykcK}Rݸ|/:!n4u톒Η:gҖvퟶn)P<\J~Jiv;K-m^ԸrzrZ^$? up{NO1!? y ӇKOw"[KYyt7"NOˋ5%n)#5%OcZwZ;(vRV&Z(9K;Mobք8&x\{B>Ux y{,5Xtzݓ򄼽 Bs<}VkJnܞS#횒ك0.+g+vl7ƕ(^.o?)upMݽq嬦)0.%?߉q<-}rrQ>|7ƕ5%n)#5%Oqp) x@yA5%n)#5%x仈%5OOƒ.wJivOǭ\L@xzlMqyFF"yTt[^Yv"`s*]n!m)# SX<]D}v4YI8!݋̦m)#SX<]r~rV6N󢽼YyOb~GRGx.]x4O'KEN|5Н84 VikδNm)#vf־Lñp7ۻHGٮ7S`<@]ĉ6/ΗFvN/Z); P./=?6Qֱ71un~{ "y͝$wQ'n|fo~#οo0 ^\$o[6nqYU*(ʮwlٕluLـ{1۹JXފ\N'MG^i{ &3 :v$fO~$\ʳV;lVl[wm8מXw$`|ȡ̍q& 8 7eu) F7M]_ϦK7;]M|-Z3Z(Cl\c׍?)9F8FG1\.Ǣr%( n4TLu4sꍕ۲̑X`?o\|GnΓC$ܯG(_Z1 û{6ET$8\>y(N`%ul{y@U=2 vZ1M_„[\#j0/ PLvt~BdC8 1Y>Fz3YXݾy;:B긹2gYlqG| }n7s-wn3^,yU(毸[9}]Xj4C)7}J{١^tvYՀP{ݥ\t]匷KFvwH;SoFNѽs+ؒ/!D{.AMۈ\)pA Grށ\~^obn޲*Q>ʪDXR,62?)Oҡ%/tD SqSղ%3'a ]SA Dn0c}p$e!{`Lթ?'FKsC<]‡:OˬsI>%7Fw#?c5pY0C_H@X^xݩomϕ )S/H `pyr #?z `_0MƉS$_Ht"#atF)™;ۂϦFKArw?s:aCCb%ZV3Ѧcݰ㷱+js3e7tPͼ_\ _g"q!Nk?M}AFv "V͂(F <`Fozx28AX j?2VC0/8UB RˀQTA~V M uzHջiNuTMfwH5{TN~'ͳC@*4Db׮y|p6g$獽 NQOĴ/'w ;$~Ny:oO#z?o&w`t'ϮDB;fYNi[Ώ"ordOɏp QG $&?PaIcDB74a |Q%i"{#H3N8rS!-/L[d#5>^*LМ=^&LМ?^Y"L\<^Z,5VIؤۗ+(UR RzY^Xmo;]6&Q8ЌH)J\y1(ã>3琛qS=~]Cф}uW9:D8fg<j+z߮A8ꏻt{w]4k;6[&\71nW{&)Zo'-z;0DXNZ^kSҦEq0.r;=K(˚~>XΚp"anﴘG17-I~1kLSZBYJ6I8Op@VHl!.xRP&!F؂(> 37,;gC4ja470{=q3E#A1A >5OF^7}%.nش`k!ǡThK5Ω}qęL>BqhCc8d8A W>!HXkѾȤ3b'g9_鉗h MtxC#ߏĕ*Ӧv)'9|"M-+r7vLwa$`Y~IE*F#F|qW`'WxL#'%lm<).LD٘[fѴ?7nuicE!Zv#X:_gLykv#9)"c^KN|Fp&%JjdHq6y-qD R4ArMnI"|;ZKqz#D+7C1[ؒ j0魔6nG7O r!{3Mpf9+>J<$l lϸE,S]F6S[O3#ͩNmA3aL=8 Fƫa؋m߅ `%>o5ŭ@>E.Dl;&l`-ܦ@˜@!(h*^_,y>JT/s ˸ )0Xu莗KG{y5VCL™͒kM'-cD "+V6Ӓ@OL?蚍CX6>Bnաt (:3@y LI!R*єӝV:t 'RlfXA !)aBIr= ^y~^dzN$@ 4fƞ2*=8"\ڀHcի!*XɘQTGH.^@`@Tr+_:QKghWjNF#aOI|}`FJ*vN m8QE-eQn=7'X_R[61tV9z79 B"Fs|%u,Wq{\J nAgA3ŘZa3:iI} Rx`[Kp-ZiDgdQU#}rhMk4qfjIO56Ƿ 9N+%eȣe=d=h iF^'MXvT4֚='rD {y+jsw x a$.(6;nf9q3}@@FcT'u^Jh͖A8 RalC)S)P E \ypC1L ꣱h nȼHH1h^_m,`&cnԚy0d23^RZ qpk6(E=E#&;?Uyպ>LHVpL0^*2#ƙsp\>^u+Ӕi˱I4Lf}riD&<.Ya:!y_/r-n5ۧ'!5B>x8-uϺN>{uQB$O/aC\e#F &H?^77O 9ɽģT]rK4~(C4*?(+R`:_DtIDoi&D%.0S288ae)Cc_ E=ҠL׾^WRԶq0s8P2V*!woh\6+IDD?1@OP~9WQ9mu1X*l8myf/vL&\)UW-2ztȁ:_ ;`1q 9 2lbjz}-dW.t!0F3Z!d]ZKXej:g^QᆷQ'-:$rX0F1m%#J' ɫ&B^JTkݐ#;K,$;q8rR<ފ%kާ@@Z^Ykpȼȡx%FE`3T1b2Pz! <~v&`kz ,"ǻ4 5? :#`heZ"JF<2"u͓jGR@;9?xf^ȥP/`@s"慠?sHxzֽ8hu E³R"kO:7X"fqRr!:NrW)R6 7%. m:2+W~B&V+QU %]#ⅰ'% A B>ڌ[DQ9X, ɡ II"`:Du 7 HJ`kDUi-fI+rj>%YX0`VPpLorlz;\8]C7 d\^Fd_tD[[49|?ΞvhBk&׌3e)X ӭEp&9 14ޕj)[RdLx4I\'Hއ2+QڇP`l\?-7˻ T΄N ֡id;ra 8()H<&P$)-T\yAkQ%}tu &$% 0^Ftm/} d c6BazX](U%MP`*]:rھd M[I0#DyW:&$MFפ$"%M!ś^@rD8ji bcPEJ``:8% (:2i8'hIQ DWiQk) X;@k}>IA'åRhDon.H*B 7ʱRt* d7e{SZҩfʵBҳ4c|8( `8%9"G/̇%8y$DM$ 7dkԭz1:?[]3s:;o: /J*ګ ™,'B01v+b0W%uw|r|/ւ>G1- XҦECC# *B/FJñ9̵$_:=I_ȉуq lIv6Ԯr)Ry'3S!S;&Z(?M$妜XHpNi8dV_99/9(vX7ɥn(Yq{'XjS 1_\#aEKlCi X-wΞzubk]6Nв\PZU#fU~xIoZaa? =\S%f'6o%ZyÖ3*D0 q7t ƴLZzc2߳E'dpҎeCmG1AyDУ zPe @bt~^k: DlUH:#Nk545 T`*ײ0Kk}@Kڿu&-ŶI\ZbF"mT\шmڬ4>3#} Cw)tVoN [@_sR$>VTjIa`~!4Yo,LZИZ64OTsRL4/<2[{\IegVv馇k7aUY2zi~!`U2HԴMjPE1Gg!Lz9β'uz@ ZR~w^3vek #?a9Dy <:?u_>i,_}=Uj&sr`qjG߽E?.ͱuՑ6q+# {EONd\ǁp ,. O ~ No"\>;A\s;$aZ,$M[eVYG"k&X!ze$JcuΔf)=R{07^qM4c@`}YhBoahBThB\.A~|7#0Z[x{)H{ϫ\y¸EyzZRb(M}\S sU"Uȭu۽WWnžwT"{@|Y %GDLB"NyBY\+.hH6ZtƙY3=qTyʬ (NNmUM%uOBP$SrgaWd./{hޑ5ߖ˶ZE&ahY-N P?kT$Y_R˅7i%,{IBߧ iqX[lQz}H"HJiDă`ZmKI M%8urrW[Dvn#g.M=F`L_1(HP5'Ы7U oE')9~POLs6CGbv@p&F;HoO7$۽V#@Z\ ?LlKeYPnyJ˄yo^%HLBÌ*ħy?:pN7'hy{N[͘u83FqJ*¬ack<#v͓蚭$6[fa_\,WOF{@͕MuG4u2렒p HfUP\.H! qej, xoaXM]xE͖D-oZ,-•1 qq98L*E{Gv9՞5* |%~>w[1ZRLV"zb^ڤn557B́eL9oHIz2knՅ8b{$vaF붺:FNP/J30=IƻksH\k0y*e3؛Ui[ <57ҽ~^*)*,tbfha"0.1QyfձT:4nC^yck2>@5D)[(#gԖ8͚2Jnƶyζ^O!v?@֨d3[5G՜<Gj1JD!|pD}0LoEǢճ9&b y'8 ȓ,Ϯ4y}Pn@A^?FCL&_ya?k- g3 e4qQf )ȿZJE2;Sʅ$kk.ep0G( +3VAH@;{TXаgB 4*E0RFc.%NJeH2.f,I |$rR{񋎦o*=ReiW`R)f\{!ޢ:،>wX\gQukg[\_ْۧ(KV\>k+L',T> [" {.CvHHe i}非R hH(VPjm/œ:#bމ{4`RhAdvlXdhYi\aIn a/ޙxCtzQ@E'(fs94}io(m^$A[1Sڽ--dA%PM qi 1U߯x/ArMW$Dv[?an( Jٴ.fH l I D5%> qkiYgS,)t\yO7nxs :`-zQ/E&f%Y]}+H-n;_+3/_N66m"y@~] JĐU+ĂEWK;%:`uH"s웸yƓ?pY``D 46.#)ozi C>b>)IyBfFbsJ6h6̪s\'ıZ n)Gn Bb2E12Ա˪V ] ܩkhcoVf?%?+dS'ޞ'>D+ٚ-TZk޿W$t;NtM;o,<#vnHoLcF{lA+NȠ aE蜖~&|1B\(-!|%<[O^0$)=ʄ gIrL}A87_2eNt7]awZXJ`Y'=;$ YX]PHs:8Dr?3Q`I%x}vu*iE1ʑS-G'ϯJWB8 z8<[k(gHw& d1XK&`my XACH-DoQ\2Nz@*b&+J28*`C92ri]oN9^}ڽ8 %N)I,$-K/x)\jdU:&:ÙCjI!7c բ؟ T[B2Ex9!@]աW$e=;/R\i Xy-Ϫ-7WHhhN:m5Nca(?\h@*FT~=6piNʗt݂rV<۸-+=y%vW zӧՔ8 b+-w>=?zS7F4 |pIܼ˓ i03@%I*>4f~d2`ZRV}0"Z곻b";(yPTՌ1s<՞!*i7JPkM`q({< !YY\qSLRld8)[-ar/Jb2 wUef7$dSB)?D"RO#Xnl$# L*htK9 99NofϭyFO1] ]Q# >c-l]kS)-QKF\'Vtm'-̍z򄠴iH@9Ŋzb՜(2%4fdE#̟!|+V(W0bY{$S|on[䚇{*Vb]3zB)׎vZJBȤ*1`ӻ,cWPJUtӸnuIqcow.=wc/k:=u}l.)):L-`J=! Iʓis#P(k+JI:ھ v/x/ZNJEa#UAU6 hkpO(ƾvi7PR:Fkrl-_[1foZl00LUd H\ek]qI,JVJ&%-ly2=l^Zt&* plJlP@xpf5 L%}; SZTV ,E<)T7VezYF"F6{^fmx =Y$|qo@w' oWpD6eUt5vr.^J$KۢY`er?.ЧĹ`ݜ^0'ʑw3O>a9OM8%vS0AkWΎ*ڝhw*WuE ,ax)q4`!)^c.|~˙҃x#c\yfFYLpěVDk6ߝ"?;̅|ȝ]_lܖS<K)$OkpSK/bnwZYN'Uuؗ&?h* pIB`.G~&<6OL{VHҗXKXݯI=J/st \P*(Fint7eLMpg_*Ѷ=F{h\b;[\rK"Ὤ>9ِ%`Y7 T2_N]]@hA*:LU;?$葩;7\ն3NB@-Bnk k(6";l3ͼ컽<uS-U.hq 駜߽ҷ=\ikh*)'hUSxX0u5-$J@ۋRZ*/x['lcE1ݿۂ18 lӵREoj(e>YOu #6jM 1Be#͡(O4D,e@[Dbd-K(.L(J(6gEV}/!o]'TD|fƪ\LMͭU]:ɫYI6g]5]MIB`fU&WK)y_`LKivV="r_5-{zNYlD=;'6:e){zF/ohq2d$>ԃ=q~弃{W7C>,6*~ ND&~!}O^k9so9n F=oCwXT^[| jP<9WElodC}9([=Ң9XA$7{Uo8WPV24>qqZeIBf~4y/HDڧ=/Tܥtk&_ۋ74 ? :OHQpгigQAR*x} zf V[P>.ךv{T$J*d)HdKU;4UA@X-`6ODQ de򟤱HYZ5v }glO" 'Z^X42_at,"HsqcjhUyJNl8 XOVs*蚝>j0! !sPXYtKWq٩ Հudia79YtRj+(yTBJ{?~2*".{[,Z0TJ5sc^)YN+[@eD q4.zdeEF\f>9'2o&5(|ӎ(`hr(MšcCRbA#611z&#pS r? a2Awcn Jq6pb̶k7e{?>:~m#)q*e+9ҧZɥU>a]I>8(!)XݮjR"vMi@`wVgc=f'"Fݮ(UQ ZrKcA9SF2}W}^fZ&jvp|`J-_/ Uj݂֊Zv,mW;w7ظһ0pz4;EN6_'?VoN=VTYGڳCj_bȅP￀<'T| $WEꍢ3R#% =KhG(VFPr`JbyRFXm4O"y׺(,ϭU].># ym-"[Kt(듷A3T1eC%}* ݓ ;Фպ*"v&"jG\,jRulO/?`G]R?CRyԈ75@ƞ*5`*,VFT-hirJXߑFp-XR0Njϝc0-u˾ܒ!Xୣ1ҦЩ#vJ5N+x:n c)_iúI)=ǪZ4G5WW7"BUw,XPB \4NH$Eyںl+jmDwnke-=_j lW zv61HLu" b4~Ö]>BN 20rB4§5<aw7ۘR8҄wc%&Z O8pەzd8Rk#IAC#ī*EuY#"U r#݈@:N@;ؘ\ITmC1@ˉG ԐR-VY?@BoӍՅssASH$rmO %RB![.U|(xAtޤҜ !խd}.$4Ȍ5Oa=Vg؂S+Qōqc1UƎICta ^- Rٍ҅~+<7_ wZqUA9;c fIkﷀ;?zO!/*E'ys7q)c@A QA¹+$!տvoc&::Iѳ)%ݢ$=DH AdR1؈6ݮ<Μ!-w9`/*9հJ/+C`5݅vNYJkFCCAHY*y22 +61sy(ḃ(a5ӤQFk~R0j@"*nhXlæ`ꚥ^$HB/oQm)Rq4?&qլTh67q;#/ܾzvd!W H͍]t]i9 {{,̥<ӊ$TĢ7'M)5H+5pN?QR@ 0`YNU`ersD$Ey[`$ P#!⢡q9eCd_Fr݂>*RcvEbm o!50FzZ\}*7.G&>;2P#)]7!P$̘nZJt;HՁΚ65Wn2#Y;AxTi /tG }34`|>nK"ĿKV G} .ݧLm4 +Y`3Ex^,pQ8I+yQK- 1=n:1̄YLU3Qd`4Mu9OAUWRɧnk;DnHCa6>ԝB%abpsAJ9'R<ǰ0a|sƎ};@!j}ppq] 0H1? ƴP=RGˢ^ վsHM< XS.{j_ys/Nڨ7pGFǍzmQ**%C]r t /7BѨJP\vv9;WeN-٘Ln=Jޏ !;+شq>suW‹wwt~L: FKª* ?OxC{TF#jO ?a+(3skƛ{`!@lmއd=IIڵݾ_NRlk5*l Tcp"] 8HyzCG?Ό73XS K1Жf3JؚIc<`{(J(f3\/"YK4*~v;@JSkFo ۨRtleu`꫄_nHPو/2\H-ᮕD.7dE7gx.]cUY^-/,l2sJA_Gܸ)3/8+?W[[ɇcV pEϓeE,%,gNʥN;96l_n΀%R2zkˁRD^2e0|!Jzz@њӎe 2I+s7'M'Ht0F$V\15WHПX3p'X9UWD7zVS}ԥs:òQwtL>T2oS659>89"u5ڲ>xH674 o'ω5&3&u<^1L;)˕%>f88`ӛr 0JIKaAb$r|{^N=/&Wr?pS*?m-_QXQh+L}rNwzz9[NC٢grנXnvP0'Lc$' +7\>Y(j 5 P ]۹EK&xIZ ,xtW4ցmx=7yy]Tw6t$; biɆƄ,vQ@ H3[u6OԾRݜ6hLKfFL qN>: __Ht 9ŪKI%N(wHzN,)+”eKعv~_ww.W$4ùw,%SP$VpVlQte&Xf`5T[6Jc$},MF%]8};T`_KԈ& C=:i `ꉁx][ecbO V_4zRC&6כ1rdX}Σ nFWd!?v9r{x3t0E97i01DcF}R.eI LDO`}%MVkv?u$;O.K> J~\aׇzI` 9nV#žP Ƒ;T'X+zC8KAwlr٭6 9þ>'sɾ=Y$p3` T}O(_eJ"lWDv 4.4J7ߐ¥Hp,;sc!~VLF smCBJ0bl@$Qъ(:STv:SԳe S*xTX"ch*kFM$4!3hS-WHÇ@o'(UbDɆ_]{/iAI*8E܆]]FQR^v4 Q'quP,/FU ebݩ˰ hv(gIGryåQ= &mu҆w dj$cMZ'4K3N#52鮂_N[>*if2խ<@n* -,ƌ4}EKj͎iQ?(\ñ}T}kO|/ǦAI؂J3͋-sV <5/wj|q%+WiB2ES7n hhf ^/k,Ctf(ts lTpEϥjK)|@FJ~Q&t1zPepJD}Ӫph<L%W{M3SPS,&Iy0g.L3eV 4#Ȯ}nU%Քx< GcA#)+#jprt!o(/-ng%,T~Y ,*l!T9 tĆ4ly%46&\rbbK)|bJ]Cr=e_X6^˟+"SF%DyKF:$/aOܹeXv2V!ٶgd!IiIvW9TK-EZzs<^@) G`U*w+M;eD勶v72>RzcYE/&i"oqXt;Cd)} p :vqK0OتHjqy /+'S):$UQa,)[HHZVo#ˈ0I^KqXcp;TCZBpd D—_/37?MۧC#> 0 V^ Qڥͯq4YI&8uz37Xdv'.\i !SϾ4 % ̑@ԉ$>4%-e<` 8Xҋ׵0x.0 "XfS|qpBm d";=VK8 wnn: %Կ^XWvDB؜!]Eb# Ьv/x$)Z`z碩v ~$b4p":t 㱛vT[N&\3*A 薋&pG;>4%-a2T+lb /JD*]:|e?C7k#'ysSBPx*2r~!Y^oqYpɦW塞f K#2J K"B2RsGEkF3^`X}k[!dfQd_eҟg.w ^.PM@+F0NXmj ТS˙ LOK?-Sac&?{?)-캙*@('[q2ٽSrv% Ș!S>9*mFY@ɁqVLPv) OoysUcNlm>\KD;>DY<4 /g7{x{%wTG5X%SOpPo)\r\h:SDw4IH5~ ltZaDv2vZ1cyelFeI1Ϡ晜;&UDQRļJ8fv$ 㕂e z KJU6-l۲A\'*.jPП<޺R:Ac;s{4x9cJSB[xgu '}̄-#}LƁڧ;||t~~rqd[e}x7olK;:\VH#tx6A# $d(u*"h$]E$0F-O`4RI%Au3 +fnᓛj1˿75Q$).ѐOLN^LfoU} }Ǖ|U}4<^ʳLc6zZLdۤ]@GiX|rRW 86O'p/&wd:y9 II~ԱAKur;Q^qkX5`n#x/dot[⩅ffcė:ޡGs~5lIn݅ܲ@&)޵"+B` 5\#,=|ܨmQYN2Zu%㦡`ROSKVt<  杯uœ4C"7vvkY8?a1ȃ7 YrmH9+#eM6gPHX#X֭YCJhFd8 u@uUg -Zx,I)T*P;ޚ Çّ/ӝJ`:pQҒ=~ _g:rӺ8@!ZQ%T88\zcdRo)<;WjyTv9}̌y_D7(`>A) Oo2roHBW\oDD9p<͠4<A=~Hݝ9(\OeJ j i.9Ą7*҇Co'.x$O`2upy c58Mg'ٍ^^~:@ʏ g;RSddMuhS^t3pjk=S[ގv=Wpq y \ "uaUN%Bk# QsK*} 6q($؊G[DB s$|.cgqPkF}zCH (ita@@O &6zb66q-^wJ+п ^&ڢ1SW|FHR0c5SfI<&^4,0fqN Hys< q:v<ɗb'__? 4UV^?>SV"!KvKϱCPO>[_#R$n I=ܽ/aA԰e~ l;y}%pϟnt0fҧcϩq*B_iQC_ Ń(cDI8³"RH ATe &iweƨ*ia!!܍ւ9VYw]5U(ۜR@_ fK|D= F̒f2.􊁊1&M'+0"kONkd%Pq1ub.b!l RP=G}3 6}bPvD5r{YJٲ+g7umQvZ=&>(S k8 V@&+ _? uOK" ݓrZ1^r E"@] };$(=eB5e4u/4X[ۤlY6b|i~4  VQGkxBtZ9i}bLsG_q(28{]PV[P(H~lS?vVs j 9Gx9>|w82OuhN%ǥP60skb|682֡ `!d:6K0X4 [8_WViY_ɑ wUA-p:2k,}rd E]at`OJwd1;oe;-(>C2}'܁l^p6W-jk{]ݓl۪mٓ??ʝ0&\gޔTR0JbM[G[g*ٝ4%D(W!ëk˯g#2]oPhx9E!.-/ q]OY\IQܤs#`5;!wT㹾WZ3&=dӆ#Գ8f*J$F%$ c/{|mjif/ukv,W4j>~*4^DaI*=,Ŕ8XN*E}GoVYnk?I;SdЬ ϭ(D%g: e$[ 5[uwr˂YLz8M:ce ~kDdWO8qg7{ <&Ɉ,濍tKJsT$VԖ?em?%-Fk=uX1UX]"tH#gr /JG3PjkmQ1pRک֯ X&wZ@}^j/m\ ̳<<%WiE=> ¢SF'˻ Q*"~T&? βKk9ٹsq+K\wH5(,%{Rr~ 8-J`eS ㍋Y\@U'd}.i+{ӟ#bN\2I0*BG$0#$a(9N*<fl%\jWŹRSH!' FbU|YHcNZj,p,X)lk(68Aω?l:ϗ9Qd4ت!DmuqN}S+b*(ik־l!gBxvkL2 4??(l5W,hw5|wj + l+>:>nruϊͲpϊKH}?#!gRn3骒"|ffvA(`D^k#J=5Aj ?{iNs/xKVE\{h5.;KDLev>aC1t]apy~{j.v1Ze[= 73wܚ=75MNsSV{R#@Yqw@"ȞMt˓>D^ZJ*M BAJUr"4lUG.)K.֐ XgP tzz7]RK}У2:*ffk+=ng%XB9e}\Kbmi7"* >ev(n e&x \cu50RS]$O0fUϦh\5IMEc Z^,"P໘vE ^zYr LT匡%~|=n!=@M,jIm@%0@'VJ%-@YQ mEoJeKcusГz\󅚀%L{Xŧ osnWW_.zUxv7tРQlШy;ub ̛eLQ1*5 ,8p:~Ε oJ/-Q H(8(!Ȣ> |R`Ғ/Q9W2?Օ3(σh _Pj}`%<ff( P 'DKoT; Z|P]Aށ4G.ّRlwi 2rcIx[*DHJ{o0 Wb6o)$)]t.6>1;Fq4Sv v!x7.FYFO`-yu9dy߿"67, Ypq]ォw鞩nSWȲע6k8Qj%ʚZHhD(Ѹ]+[#4F'[u~l?C*{xEBnOo%)챫b@ٙdJOvz=koJ0 -őA^6UdomOd Yz3ə_?;ՓܒFRWxW9>MmWk3`L{vV.=dnZx57~ORAu7ûپ 7.k=}tP9;uM `s7H]!oRDt -J]Hri}aAvS,z-?IDWWK]Sj) {(D׆-;_@K}Gy kcFw~s ;mC.*> .1-;[:.~%̇mZV7Wo<h9?q Z畦τ;ǟ ~-Tdy_JzGI7߿q(QϪ\ mcڢubó]qcűn;!GE^]fu4/` :pt80"Qv6F5f L6)qW-A8 1iΟfkogd.{;H g!AO}6n01mENUs8}G}ԎY]C+0-߉lO8w_D&JcK{Hm(ׯ%Xc3 ӱ;%Rz5ݸFg:4 jCrʓI9Ŝ)1kEp`h (y:&0~~`%<>P޺#(_Sw ~*ifhZ;,YY[,2uսbMIv1+?L)%3ۺkEôjpk7YRx(n_aqh!l.1 2C:j_E YIې{\FYrrwwmx-\A@z^̆-Zf}dfi:^/, ј\jѧݮHKʡ2iVi(ї7\bZ&RH_>bř |GA-i墫j*7l@R=,UE {D0WYf{ֺ+;`yĐZV~ `vTm}s;&~d],Q@An\:F)kμ ʮU-h۫IUN7Cq؝~޷~Uг ̋gQ>ۢs}{=7{*ɭj(cw5 Ii?`~`^#;w0f=x%YCGM/KI=0هAez>_!TWd]DE~j(%:8U袦lN0O Nml>-Ảr/GZЧ6Jv^F `<=_*ri}/ wTy lyq[&(Gi~mwJaW؊H.& ++ΫϰG;6Vurbur2ON셝Vvr"F" yx u /a-әW|36 8+ NNr0Mg\ѩ-%]bβ7HG=yzt`~ >w2]&`թQ9$װ$lJؼsZm)=~(fbNUv >8oR~??)-IuꝒ % 8;/u6ub`^}up@$DExq't 4շ!:kUƅ[oa]UfuULSZ@y-mcD=@LMJ159:ZBT֡oh x&V4kp k7qnjS){7 Hɒ0+|. T}+g@-G0݉4CĖrTp$p&he^ʵͰkF3rMg7Wh^U۶#E*b}7b5UBzYmǾA~TozW3rݟȆTGJV鞟Hpk[m~f0tj jg`߼!e#c&Tm F館* G[,mF B"HpY~f#ypȦ`21gӻ01H'$i[ԟ Y4lՂ&p{,2Zh/iIs<\DʜVf)өt%I.D~E&XZv>3Gn1K2%A1XEʞ dċ LXDX g8cU*xtTf~rt-Gs`dSBtE^y~ʼn{qw?]IRiC0up,@45>urZOT8ؒl el(ِdX.q_d3VҐ~ˇKӐVJC ӭ,p&AP+kThL $ b27L^&n"7fԤuԜ|?4#Lܒ[a6l0HfD) g'uv VRL~yR?UHk9LU͉|IXVӺr X֝˛EtB@ w;j5XYA7!{F7j]W 8 ./~ OwGЬce0^2Ԉ .xr'ZԚ(NwXRq B͎cSI9Y;i}$x~O ʉx\wYnFM[ c?@),D M -)2:E)zAwP:a  S<"PlYzIuzuxwA?8ClAl#!$ZԳEE _auS2~x&OiMRL/&hgaTl 6:><2o!n}!3Z YJ9"fkaadMKͣPgM"̠J$P8(K|AQvL\2dfJ] @$789Ev_wyM}"g:I^Ih! 88?'OXi33 ]y0u=j6Ɍ A"wEI} R^ IX@βf}H&ij)=oQ~/8PKPDvPK 7< styles.xmlksܶ{Sx;ɲNIR;Ikn-;$@_ŋIGJ3] yRS_澇I?\߼dN"|pS<Kv ݐfЍ}#Y/;X6Ƣ%=:h7vdkD$+OZRTyKEp`(ma 8G'i`-7]?U,+uVcH4*Rps7i6A'3r`jA*JmbgN:,w ?^9a¯fPk1/-qp|+Z(ݡGͲMҺ脾1_">`D5A¯EZ=2,ܑ ֋=5g{>aVk}y0Cإb.Np.zsDjyl5Xο_UL KƓu5+Daw}ӓ,8}01V?prí{RdZ+V,[eYEdZYYcxCP$ORr)9~q%kBVcnR#ioj9Q[gt bOlpAeڑJjEɔ~1'VKSN&<$ُ؊ z~BH}/~>%l'&CM4u+)Q5Pχ-ma \-m|5 Nny#cr{*ΞUȳ+Vu$Dni̦c=j0"py-zv1cF ?L4;zq5[VT(R%>h] O,nDAym)Fn|̾Uxڧ4vdI<:e3'pM?ߖ!<'4TSOPϹ*͑C[? gj[F+ {%)M`6'L"=E1q7cMkwrKΟz#}ڞsRAG+ j6ҟRYP*&W4Lݥ# ¢>xӨ6g myNbк#վ}rbp(\W_5 #v̊y+La kMg0x^p"#gV&MU$z ke]&izK{p i5=WS/\3X2JskpUB"B`kH=($o乛Cs:?<CtO5&Z-T y9(q鐄d=oPd!Kqѭ5Sd+jO뷢*=۰ ,Mu)sU@wjGvj"4őZƕS{X4^G#6^=&7@3@U6oH D,}iUدKƵzmj3Dj[Ò YUPK 78meta.xml OpenOffice.org/3.1$Linux OpenOffice.org_project/310m19$Build-9420Henrik Just2003-07-03T08:45:42Henrik Just2010-05-31T08:56:272004-06-29T10:09:33en-US230PT33H04M05SPK 7<Thumbnails/thumbnail.pngWi3 jiR*JZDy5"j'"^DX+4o!DJ;s̽ϗ̜9_Μ9</;r?DŸaabh^DnS_ Z~`$X@nxdoɔ֭97ĉj`G9#2r%Ez+M&b?⺼'Ѷg'|593t)גO;#e!QǒRffR[`FwO χA" Pzw'il3b,ET:0}jS,"}tfJ%^t6z2~%.ix7+CdL:8VI.QėOE:~ *I0lkdԎ~=9_Meap|f=-r.T4d}eFȂu! 0/jQT:_}jCVIJݧř^CwMY%2X痝VE̯Ѱm[͉ɋ{hkxQ[roKI^=3@003z<۳wyBTTgr˲?p:oZh 8DO2}SC^<݈ 5H_٬jQCRB5~s'W@݅U <3)ٍADz|kn8/q m!EME9Jeİ7uxx*fxcgÜ<Օ6_^ڨ&:Źe]+`s,zuIm5(c&!2Zooն RHw˷{_%O xui3⩮O֘~a%t<[:2 2 z[UJ=n1pT6h߶0H>У ab}9bڌL9ZRT .}3uyKmK '}xo\]m5}lM2d:AN"f"mx4C<Ʒ&<|kEhߠLcPcp9o4_>B<>DCM6s͑#F; ̌yר` a"W =֓1q jaV˘:GNF#ي+!k*U6xӖogD;=SS%eeл*^(Tp.l8u(nH27Mc*+{7Oᥟ|s&d_55SZ'`ckߍk~8L]KT&))dJ~x Omnjy;ENx4u f9÷/};?ʹZ4~zv])bjfe=~Y.at" ? uaQT^x%,'3u(g<8#%l L6˾ga&6%ya#913>k!nY5Ac쯓CIZ*w,3RT8z>GH:MJ^f |}}|"f6[Ʌ&L #hXGCBϷ3W*u_3fJo舞!s}a${g^yM8hDeU{sŨPA]&mqUJZb'/ mP=mٹwcrl;TKX޸u$}uQΰRKT3CۃCW^NM%zn?D%:GSwVѡ <—a"Eh;TŢ}4}3Y.:^ohe^bIW9kbIq@nl`Tzl۞^XXĒkl\3!bI~I\h/k+oo[+orep1̔h+!I9H'D0dӏc׺-Ǥ:0@wM:Okaٛؐs<8;\LY 9'S^)SZb`:(rb"2uDksW 2ODJ!i/,DqnMr7ie! 3 Pɋno;g dJTo L҅DŽv [ܥY~2YֱZ+gE1 d]f n"^dX98Is w6DVy0?ǾP@:VV#6r>:d}˨kE](r3/pq/eZ^]_U/f%F>]Jc?԰5+ѱkmdm o4*GGss_fg(pۘ`ȿblǫecncW})N #j#_L!"/mБ^IR{c'Y |? mKx7E/c8 +鿛Ev;~W]Ugl{t@-Nu_(<ǨpަTu$DVޑEeB ]N<ನ<:𳥗3U>grEe}|;Zon^kFYTQN}ɴuw6_ܻ@^wgId=DSe,yweg>my+Q {S_>~c4 (%e].sD}R%8D9؋A<)-W" IzlyEBO^wWBrMaZ6 jj~>#Fi_i{ yJMgӻP-UkKY8Oc3&F/PKcPK 7< settings.xmlZ[SJ~?u](e+DAam4u2pןrh2tMLA*_LK.sSz=ץ|JTxQ\*|Rr*I^DI+}^]%WWa)f_fg_gb1]-}U%?B+2$ ldi2UV/ S_C`bslLʠԇ{2۞>w$3;zLx~6ɹ|'/ ɾʒYf>bQ6 2hn!0o/rcnKt?*3 _ݠwjsי^~֋B?zy>/*^"Z/ܠw5GŨݯL=Y<X ZSƘA~4j ΅5HqCBg Kֽl#=c lw%f kKvl@^M҇6KOeB FFI!a˙a6qގ#[01}Zm|Kj\懎z'$.U@O&M3]IonI<,9 \(KNT7|>J6#gTXÇxZvI# ג7BbX=E̱Z3\ϳrjd[Y | s=\}y,xgT.]n"qښQ; 9@̷0V;܏-BGw5olʳЊO1tO5Gkihk+ N% )T'N[kX1{,L~ﴮlT[flGHi0U4 H eF0)D^7ʘb+&fxl\1.0,6~Q_3miS3t ⽎ηi|"=U"Gd4ޠT Oᆚdf9B/ \a4{+vn|3(;SPK=(^u%PK 7<META-INF/manifest.xmlR @ Ii'Աu}JoRf0pq/ZKs.X\?u2yV5)$ .ŢcJ4z)$ar՚x*͜pb y `Z^$p#$퓃  3F 0I6ۻ"CxBr=dx)SpWJI1jD>67za6qBU[ʽFwE4R3Hp7!3|$խKG2\tGW;f\Tljd^d|,\ '!S߂E|Lwj QUj2-ԗgu_r}oF(f|z1Dpa7? _:%c;@v~绍bB:/ųe~ޅpz]"PKң PK 7<^2 ''mimetypePK 7<MConfigurations2/statusbar/PK 7<'Configurations2/accelerator/current.xmlPK 7<Configurations2/floater/PK 7<Configurations2/popupmenu/PK 7<JConfigurations2/progressbar/PK 7<Configurations2/menubar/PK 7<Configurations2/toolbar/PK 7<Configurations2/images/Bitmaps/PK 7<077--Pictures/1000000000000207000002648CF7BB5B.pngPK 7<"-Pictures/100000000000020A0000026641524660.pngPK 7 YU (styles.xmlPK 785meta.xmlPK 7_KX IЍG ` aNNAˋr&_~_~&LFC,+:=??_Lrr.k#j:d!(+[}򿙹_(mNM$Ǐ۾-aYgvau xTE ƂP43!ÝThHsdgV#¢97j_Ak,tJJ*&vrJHTR5Q}[FPT|:*R%W-ME&\N { p[ &} K(hDsJR9·Xɲ8)'aNJvȖj2>̈`>^6` I8Gc#3WҎbcpL=23g u,%s%}Ak2 Oe;(!h^~l l4I4)n8νY ŽR a On~i}ȑxi!'p;ai`:XM|ea8$U,(#uteR5ְFؕ."\&y7(MOO6|bU XcH \هJhf!.({)j~t'b-i筿&$;vwWx`[qȇ' #qY^%/(؉ɿ[p~O7r 는נ2.bp k$(KCMJ@;p/Fjwأ3|,5W^xOzj-]u_Hq-VRtMdeЄscDM}ݑi\ YL0OLk}CjgwLw+%7mmOǏ#Q KBͬ:T5;sVYNtFKCد, E; sZK8$Q2.cnXpL&0mtVVu˺Sfb}(sظ:˅ɒlW/{ L~Z"tlW6hlWDv/_帕q1ӧUŹ;P ;rWuGTyi5db.I/q3MfX!2[!GnzSn`sOxRWzI63*lfV ~;4CnG$}2S φzőxd(|<7[Pq54].[45)jHa߃\hdLz#\fsgɘ;xKN js0aB"5sIFfxOpġK`_͛g|Մコ zpLFdngW3zeMU٩SoK l}d] ಌ*PߢQҫ4rlMVȉzG9۳1Wxk} 2 *𬂃6H :j1^s> d͈v@bRڄ3 G0Hñrs} U3*RM >fsFPX?%HjDsw"^.ԴEX+V+ݦr<[BDIdT,Sp-@ƨe#z+ i6əǗeI(oI0M 6)؏du5jK!}Ɣʮ[lkP84 83;v__fRcj:mA$ 1 Lم)a밹,+3VӺpI77GJ_#hZd1Up핺pFfڕ"\ u2Q4I<ΗӂNהě]RmKwq'͙5КsZ<s&Y3k!VGx+Z Hv:(dA'"izX" \WL\p d2)nM4($'9I}Mt*7. %0C¯s{6kb_iӭU6VIx$ ? n ^?tq< eCVm7@$*]yF-̩ $U#3iTYՂ7T%^aeU9O8wCM+eдZ6"iR+λRPV/s~})DF[hy&3s_+anb;ԉ{1~z;p^iKtm2V;SEQ>ߋc~Sm<) R-'@qEQ@O겑4T[^BcxBA(֙)@fz:Ae 'Z,Jl^wV?F%tx*[j WT,%㽷FRGUeyҡֹjuJ֒-*( beiTƑ/?/ꋗKY~JԼf^mVwku T-̮B6m FY]N4 _v>"sN[ay~(qrU2bNXxpk١bg"O(M9}P|kekF5˸y`;F\tp` ܆Vߡb6&qqZU5c #Lqbz5jwV@ 3C)FK!QFՄm͐\|~$T֌jZ[]*@FgPN8hs[8A njE?>==oC#6587@  K!=}kяѴmX6Ym:ln۸֥ 7m,-6(7݂HLq'[vYջmʂLfgxތ}/p!z}ױL )8/\G-nXUil;U0(zbJ$  ?pkycFDd5;I$;*7TZ [GdY}'*lOEGe`(9J6JAeG]0sF Pi{RL0,?>D"}V/dh$8:= K`c KqyqSynI.m@qPhStC=L>GxqX۳(AЩTG+t^D Pf|L1&ݔ>G47uGns+`Lp#|ܗ! {z0 ۧkwS#^!6Gv]<>Qme\qJ.8l9EfwLy{xCfx+ pfJ+iSyDr|YHmC%3JyX7_L6{uN9?nQٍѵu%W$3'^ToTVtd2/dlNaiˬJ"֗q/&!{&6Ϥ<5>^7 J;O'X!W#Fے2/u7*YQ2 !~T8m7l}J%c9+ʘcv: G tۉMR+ HTU/D S|y t޿{G BN$JuZ\Su(=HG85͕J.e%[hI?bUϢR8?[> .u^UY/;!.*x&۞ uY)@z\w&}>==qTQ<(KHE*3]<,={G|S8o0mmVR>>/Vx Π{ʵ$*N7ZϏM,>GytqT&AkoC-/pxCZHe9I6Jr\pKU*bQW!'do2Y&'(*ҘC Hr|מgw"n/cNmw)Wf`TUq[dpLqV@<zR[, {`2]愯:lY56NˣYλZ~c:p(DM1H>7:Da}}XXLg;Ky/ yR-?R8Ew)FVXSG%,˩;#CɵﱔO M,^jo4vYz[-+Wjӝ([WX-*2րߋ TR')y4 Srw2jdb,IFA~fgtr>X[%&ZO KUogs%MˉQ78V6n5L>ϔi2@Y.h2xlI󻓗>Xb|<@G)5z:pb3>-ILJZI%.Y&i,%L*$.ˣY2>Y9q~" 1e zv}?M]oڣ$9Ϙ-,k1=㌜w>ѪO]d#SK ȴXC*ɖn`-6u&aޤ6ưT#b[mqM$-fK!}{}{}{}{} \newcommand\multiscripts[5]{% \mathchoice% {\idxdheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5}% {\idxtheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5}% {\idxsheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5}% {\idxssheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5} }% \newcommand\mathoverstrike[1]{% \mathchoice% {\idxdheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% {\idxtheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% {\idxsheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% {\idxssheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% } \endinput 1.0.2/source/distro/latex/obsolete/000075500000000000000000000000001140165031200201015ustar00viewvcviewvc000000100000001.0.2/source/distro/latex/obsolete/writer.sty000064400000000000000000000077371140165031200221740ustar00viewvcviewvc00000010000000%% File: ooomath.sty, Copyright (C) 2002-2004 Henrik Just %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.2 %% of this license or (at your option) any later version. %% The latest version of this license is in %% http://www.latex-project.org/lppl.txt %% and version 1.2 or later is part of all distributions of LaTeX %% version 1999/12/01 or later. %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{ooomath}[2004/08/08 v1.0 - stylefile used by Writer2LaTeX] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Some math mode macros defining additional symbols % \ddotsup is taken from "The comprehensive LaTeX symbol list" \newcommand\defeq{\stackrel{\mathrm{def}}{=}} \newcommand\lambdabar{\mathchar'26\mkern-10mu\lambda} \newcommand\ddotsup{\mathinner{\mkern1mu\raise\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu\raise4\p@\hbox{.}\mkern2mu\raise7\p@ \hbox{.}\mkern1mu}} % Fallback definitions for math mode macros defined in other packages \providecommand\multimapdotbothA{\bullet\kern-0.4em-\kern-0.4em\circ} \providecommand\multimapdotbothB{\circ\kern-0.4em-\kern-0.4em\bullet} \providecommand\oiint{\oint} % should be area integral... \providecommand\oiiint{\oint} % should be volume integral... \providecommand\llbracket{[} % should be double... \providecommand\rrbracket{]} % should be double... % More math mode macros \newcommand\wideslash[2]{{}^{#1}/_{#2}} % too small \newcommand\widebslash[2]{{}_{#1}\backslash^{#2}} % too small \newcommand\normalsubformula[1]{\text{$#1$}} \newcommand\boldsubformula[1]{\text{\mathversion{bold}$#1$}} % Multiscripts, based on leftidx.sty by Harald Harders \newlength{\idxmathdepth} \newlength{\idxmathtotal} \newlength{\idxmathwidth} \newlength{\idxraiseme} % \newcommand{\idxdheight}[1]{% \protect\settoheight{\idxmathtotal}{\(\displaystyle#1\)}% \protect\settodepth{\idxmathdepth}{\(\displaystyle#1\)}% \protect\settowidth{\idxmathwidth}{\(\displaystyle#1\)}% \protect\addtolength{\idxmathtotal}{\idxmathdepth}% \protect\setlength{\idxraiseme}{\idxmathtotal/2-\idxmathdepth}} \newcommand{\idxtheight}[1]{% \protect\settoheight{\idxmathtotal}{\(\textstyle #1\)}% \protect\settodepth{\idxmathdepth}{\(\textstyle #1\)}% \protect\settowidth{\idxmathwidth}{\(\textstyle#1\)}% \protect\addtolength{\idxmathtotal}{\idxmathdepth}% \protect\setlength{\idxraiseme}{\idxmathtotal/2-\idxmathdepth}} \newcommand{\idxsheight}[1]{% \protect\settoheight{\idxmathtotal}{\(\scriptstyle #1\)}% \protect\settodepth{\idxmathdepth}{\(\scriptstyle #1\)}% \protect\settowidth{\idxmathwidth}{\(\scriptstyle#1\)}% \protect\addtolength{\idxmathtotal}{\idxmathdepth}% \protect\setlength{\idxraiseme}{\idxmathtotal/2-\idxmathdepth}} \newcommand{\idxssheight}[1]{% \protect\settoheight{\idxmathtotal}{\(\scriptscriptstyle #1\)}% \protect\settodepth{\idxmathdepth}{\(\scriptscriptstyle #1\)}% \protect\settowidth{\idxmathwidth}{\(\scriptscriptstyle#1\)}% \protect\addtolength{\idxmathtotal}{\idxmathdepth}% \protect\setlength{\idxraiseme}{\idxmathtotal/2-\idxmathdepth}} % \multiscripts{}{}{}{}{} \newcommand\multiscripts[5]{% \mathchoice% {\idxdheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5}% {\idxtheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5}% {\idxsheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5}% {\idxssheight{#4}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#1\underset{#2} {\overset{#3}{#4}}\rule[-\idxmathdepth]{0mm}{\idxmathtotal}#5} }% \newcommand\mathoverstrike[1]{% \mathchoice% {\idxdheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% {\idxtheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% {\idxsheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% {\idxssheight{#1}\rlap{\rule[\idxraiseme]{\idxmathwidth}{0.4pt}}{#1}}% } \endinput 1.0.2/source/distro/samples/000075500000000000000000000000001140165031200166145ustar00viewvcviewvc000000100000001.0.2/source/distro/samples/config/000075500000000000000000000000001140165031200200615ustar00viewvcviewvc000000100000001.0.2/source/distro/samples/config/google-docs-config.xml000064400000000000000000000131301140165031200242460ustar00viewvcviewvc00000010000000 1.0.2/source/distro/samples/xhtml/000075500000000000000000000000001140165031200177505ustar00viewvcviewvc000000100000001.0.2/source/distro/samples/xhtml/sample-xhtml.odt000064400000000000000000000304651140165031200231030ustar00viewvcviewvc00000010000000PKsD6^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKsD6Configurations2/statusbar/PKsD6'Configurations2/accelerator/current.xmlPKPKsD6Configurations2/floater/PKsD6Configurations2/popupmenu/PKsD6Configurations2/progressbar/PKsD6Configurations2/menubar/PKsD6Configurations2/toolbar/PKsD6Configurations2/images/Bitmaps/PKsD6 content.xml[[o~ 4hHcH 7ۭSH ;-J"!gI%)aҟ_sȹiFہm Hfs!5y*iÕa2Tq7'xf3Q4fC%-K[R-GnF̌l8R 9רJ=rkњW-[ٶHK5;*w-3Uj˼2?SzPkV_ƽ(`y2Pz 7[tI€ L0 6fi&42ji#n:#; T Gޓ}xO*oLbGL0*sAmu!TIk7=u_)U ~:sN^^%_jn{C*qo PipD;Er}u.XLKb~ϥT"2YIۨhzMP ̠xg4dL/ {7u\l1My['Q pH5B+>_X򏝺W~PZFJs*[qok…Rޢح,1?,NN"~2\dOv(a GNUTx#$856c+horfLygΆ[*x蠨(أ^ږ r܃uPvIYuTn]3)L71N;*=RmP6t޲L \UȲo ,8GϿV bA7),ո7L{߾p㉹ :%y9q*Sَ}v@)0 )!gGC#uHNJ/#ΞOyzNG/7ΟӗSãS&Ue:ك'l WnqtG/Wg*L͸7O& #f\$[dy(nz"nA}Z%gaͣ Djx>ڮ0)xzy䭨- ~(jh^3@L/W$uc|LXY8"3gY4-ظ}.،’)[;4Q Qmaͻ|=-: ,h&.EBp >kV) ALMbh)s3Z<Gf|#3.؀KިT Qq1 >Xz7R^ŌLS.l{q}WC`022d+NCjp;7A@ňXp˰JXҹk^ӵd&x{&j^tͩ! q滋QAICQz]Q0W¾M^`ρ{c&#j+QvKT4FfTݩ ut꟩nј.\ ~ șh 䧦s_\fR+ChVJp R"Sgh14&J&;N>PᶾJ@m_A5*6VX;,J- c#Ї\.@=\ ~{2ml݅v:"xuOᰮ+]uvryN;FRiǨ Y;>O:~/ZwN;R!tқWOqds{9z$qf?@aU,Wk8}rHׅĹ]! N]?o&l\PK&iUo1PKsD6 styles.xmln_!hѾɖL6v'NbmL_D[J@R=_CR(e{&s(y` -,=\4!cpOfCbJh\ s bŊ"N@9+h CWJ^Q̦+dZམJ,q;h=]BvS%.&Щ{4/ =-)~{S!|feb\Q8nʊe +8R/fͱ@SJE1$QTvrFl\M M2=7M#~@6X>U*flƶ)@oPnsE1"0Qeqqx9`E%S>P6(AxsYG@鐯i{G+'١lDDž|T!CEL$83iYA)!6dS*|ʼҎ'"A%#UN'qJOd 0RV$ڰa3#ߧ}F! ;)įYmLUY}εF[ʔľJ; 'f) 6Pl)?"P~AFIcL*"f0`:$T3)$[!D(|nn2vL+RG5l M^ΙW;% J)jg6;V W1!O{(W俚ғa;5L%(-"jpXo[,R9lh[d5Bc;&]c~5 ]Ӥ`;:-gEB3numN1#3) ښ !v85Z7p%VmƔBʋF767IڄB mVkQA4`޶UbdsQْ 5$z9tv O+ FLK 䀳cx6n;,cH CX@Men6 $Hx?^A &)&3cKژjX^[7>?SR#7+γGy}s`$ah*K[}< R8ӭSN^UT`X1=wt61&{55iN4;IԱ1m G !Oz^HWmT]bHjzζDh6j6hZoҲhI5V>/|Sj%֤9pqTXW\.M&לu77Ҋ_v$n><@:_#lڏ թv?uM3x^%:q *˰h [p:B&nZ%j$oiyNHDF0@?e*?o6[e )lk>k-^nD5wUhGuX;z섦y/7HR]>sT&o!@I{f|SxC 2XF?z9z(@b\>ԅdiJ'X\偾x%IU7WQ^E*껫*Uԋp|>ņl+ uczx뎤7ٶ2~ [/1<()W%~-`]>'c`BhFr,2gXjthMq,/5.ݢcU޴ٽun^9wqRqO. PKm$3PKsD6meta.xml͎0} dֱ ,`.*uQR2ro[1eP"K{򗏦5b"0*m_r{:i \Y7`<@D]FaEr H1 |~,t6fNQ } [v~4"!as8{NORSW&^Ey+ittћ.Oq#bAjӘLWH+^[Wy,QEY^l.%bJe37e*~سs?i\A׷5QCQ*2Nbèף4[Ѕ=rFLRAS5zOg¶5%GY]GICg{ г`(Y/Ddq71Wr3ߘ!ݵzU;V_xrVɚӦcJRg+ϷmyՁ'9̶FSZA}d5ꇹFOQ c# *+qv1piߋZ1ª ت{SETiK1ev2dCdۙ&] U4+@@QNU mLojv VK *8{"x}K}pS"4/u sniho'ɔ, 0ЎԛUK,ǪaBgCT999]ښ7+=h,ٱT/7Cn!nKzc&]]iH[E\Q߅/+YT];=4ܼ}@`) ^}h7j8W+0.~!:+oKwEύw^"41ɶ}AczMyVVp2ߥy_Ol.?Y?jA,v,\L/= A k=MbţsbFu8&(M9h+Ra61S[֓{¥nTv8kKm+ٟoNyx!k>/awdz*ϬKsaPQ8ѐsn* ;3tc5}z=ercвtBd>lY~rPAq8'Ss+wl︞>-6%Ż卙[vD/sLcX{t\N4 ĭtȣV$dAyUK?R:9ZפXi쭭L}T2З~!y_He<3qW Xi'hd|0]n =ZІsʵzl^!_ @Tr!(aW7;mRb[@L+F1[_ͮN1>[K5~מʒ2+vKZrlϪd j6-^Sn=[/3 ڠA.=“ӕةe10RCfiLdk0:f05XUC\A?@ ~ip7 Bt⍗8TO[-w߭(>Ly :K<C$nʥ98fnûOު;ͤ F1dClFoWPD0#%΍]`gmwg&iUݵXX PRTn,nd,Sv@0@0t3*?`>X{T5Q\Ⱦ8^ucݣFxg+J.6(c}+X;e/4= ^?[SͲQjsI&mG}/v[^@ kbdu}hrizW^dͦ1h*g/aXR'F5{G|{ I)xNL7oY0Sԋ/ A YabUͩƒ)`#yqnװ]?R|kd{o{tnRrlX ݈P7Knt߅-\FڍϿ鬆=I۷}={ELHFZ7[o~E0(vWT({m8?PALxn/1+2 7x4(G'JWD/dr]|_q3pN~bāHF(>;qhb3{O-}][hP]>ō:Z1pQuZŰ2h7OwA(cۑמ=7GИe¹*}z|(C>^{uVe+Ḛ'=N ĺHԹї)]s;F3(`?Stv(NGןGq` Tf!Th8{"=p9)>ɨ׭2fU^a^J0Sh4Ն\}$\zvaFF#) ,ьW~?njUPK<PKsD6 settings.xmlYms8~"7)/M+^LHo^/@.%4s|`KhWϮ֗_1;RE7ڻsAæ8|iv)ȇF 4hCN窱~tRH58A5 эl}g"tZ'J%˲wwBϟ+P_y Jd&իՋsYOimUuX_# YZAƏ9vZ[ K\[zOnSZ;N Db?-D6 ! (wZZPRd EE甩ş49xKjss0,0*-sz,rR *18yROҹqat|B=Jt[h-Ȼ('%B0BB[S05]7J񞛯c&trxZH%՘~% RI']Koh43E[Sڰ|طXx_)O}W}#ԉR;*BB7JC-Z 3Ġ8Lurj܊Yݎw% ߶dHS`<7ϑ(l+äWK^)Rhmt;XP/rT\r΂kb@T _+0fax{[,R]z¯OW^<$\wQɊ>!&d}mMJ.a0;V`* @N`$M kDmBNOg!6T 0ǐg=cOhOcAnS$Vt{ xz3);ud-i˖/_o c"1n̥f]ǔ{t}M+4)ҋ{Szqh$2m7=).t%]۲~)Ai,rBhS9"免S{] y؎I?* 7n+E/[PK̴RPKsD6META-INF/manifest.xmlKj0@=VU1q-&fW6X; F#h[S0Oͣ)k7vc^aaӠHѵHS"Z^%ۯɴ|.Ax.25| h;7GWsh,.dLB%Mync Y'@,`(Uq:bbqW`<0RO G?Fr7=^ ޛbpmaD-*긓_PrS4I7ZOHNzbK|0Hc-2xd7!ɧa87|"sϩ]PK5b9>JPKsD6^2 ''mimetypePKsD6MConfigurations2/statusbar/PKsD6'Configurations2/accelerator/current.xmlPKsD6Configurations2/floater/PKsD6Configurations2/popupmenu/PKsD6JConfigurations2/progressbar/PKsD6Configurations2/menubar/PKsD6Configurations2/toolbar/PKsD6Configurations2/images/Bitmaps/PKsD6&iUo1 -content.xmlPKsD6m$3 5 styles.xmlPKsD6\meta.xmlPKsD6<QThumbnails/thumbnail.pngPKsD6̴R $&settings.xmlPKsD65b9>J+META-INF/manifest.xmlPK1-1.0.2/source/distro/xslt/000075500000000000000000000000001140165031200161425ustar00viewvcviewvc000000100000001.0.2/source/distro/xslt/pmathml.xsl000064400000000000000000000502051140165031200203360ustar00viewvcviewvc00000010000000 '<!--' in mpdialog mode, we just write out some JavaScript to display dialog to the reader asking whether they want to install MathPlayer Depending on the response we get, we then instantiate an XSL processor and reprocess the doc, passing $secondpass according to the reader response. Using d-o-e is fairly horrible, but this code is only for IE anyway, and we need to force HTML semantics in this case. var cookieName = "MathPlayerInstall="; function MPInstall(){ var showDialog=true; var c = document.cookie; var i = c.indexOf(cookieName); if (i >= 0) { if ( c.substr(i + cookieName.length, 1) >= 2) { showDialog=false; } } if (showDialog) { MPDialog(); c = document.cookie; i = c.indexOf(cookieName); } if (i >= 0) return c.substr(i + cookieName.length, 1); else return null; } function MPDialog() { var vArgs=""; var sFeatures="dialogWidth:410px;dialogHeight:190px;help:off;status:no"; var text = ""; text += "javascript:document.write('" text += '<script>' text += 'function fnClose(v) { ' text += 'var exp = new Date();' text += 'var thirtyDays = exp.getTime() + (30 * 24 * 60 * 60 * 1000);' text += 'exp.setTime(thirtyDays);' text += 'var cookieProps = ";expires=" + exp.toGMTString();' text += 'if (document.forms[0].dontask.checked) v+=2;' text += 'document.cookie="' + cookieName + '"+v+cookieProps;' text += 'window.close();' text += '}' text += '</' + 'script>' text += '<head><title>Install MathPlayer?</title></head>' text += '<body bgcolor="#D4D0C8"><form>' text += '<table cellpadding=10 style="font-family:Arial;font-size:10pt" border=0 width=100%>' text += '<tr><td align=left>This page requires Design Science\\\'s MathPlayer&trade;.<br>' text += 'Do you want to download and install MathPlayer?</td></tr>'; text += '<tr><td align=center><input type="checkbox" name="dontask">' text += 'Don\\\'t ask me again</td></tr>' text += '<tr><td align=center><input id=yes type="button" value=" Yes "' text += ' onClick="fnClose(1)">&nbsp;&nbsp;&nbsp;' text += '<input type="button" value=" No " onClick="fnClose(0)"></td></tr>' text += '</table></form>'; text += '</body>' text += "')" window.showModalDialog( text , vArgs, sFeatures ); } function WaitDialog() { var vArgs=""; var sFeatures="dialogWidth:510px;dialogHeight:150px;help:off;status:no"; var text = ""; text += "javascript:document.write('" text += '<script>' text += 'window.onload=fnLoad;' text += 'function fnLoad() {document.forms[0].yes.focus();}' text += 'function fnClose(v) { ' text += 'window.returnValue=v;' text += 'window.close();' text += '}' text += '</' + 'script>' text += '<head><title>Wait for Installation?</title></head>' text += '<body bgcolor="#D4D0C8" onload="fnLoad()"><form><' text += 'table cellpadding=10 style="font-family:Arial;font-size:10pt" border=0 width=100%>' text += '<tr><td align=left>Click OK once MathPlayer is installed ' text += 'to refresh the page.<br>' text += 'Click Cancel to view the page immediately without MathPlayer.</td></tr>'; text += '<tr><td align=center><input id=yes type="button" ' text += 'value=" OK " onClick="fnClose(1)">&nbsp;&nbsp;&nbsp;' text += '<input type="button" value="Cancel" onClick="fnClose(0)"></td></tr>' text += '</table></form>'; text += '</body>' text += "')" return window.showModalDialog( text , vArgs, sFeatures ); } var result = MPInstall(); var action = "fallthrough"; if (result == 1 || result == 3) { window.open("http://www.dessci.com/webmath/mathplayer"); var wait = WaitDialog(); if ( wait == 1) { action = "install"; document.location.reload(); } } if (action == "fallthrough") { var xsl = new ActiveXObject("Microsoft.FreeThreadedXMLDOM"); xsl.async = false; xsl.validateOnParse = false; xsl.load("pmathmlcss.xsl"); var xslTemplate = new ActiveXObject("MSXML2.XSLTemplate.3.0"); xslTemplate.stylesheet=xsl.documentElement; var xslProc = xslTemplate.createProcessor(); xslProc.input = document.XMLDocument; xslProc.transform(); var str = xslProc.output; var repl = "replace"; if (window.navigator.appVersion.match(/Windows NT 5.1/)) { repl = ""; } var newDoc = document.open("text/html", repl); newDoc.write(str); document.close(); } mathplayer-dl techexplorer-plugin techexplorer-plugin mathplayer-dl IE5 hacks This code will be ignored by an XSLT engine as a top level element in a foreign namespace. It will be executed by an IE5XSL engine and insert <!-- into the output stream, ie the start of a comment. This will comment out all the XSLT code which will be copied to the output. A similar clause below will close this comment, it is then followed by the IE5XSL templates to be executed. This trick is due to Jonathan Marsh of Microsoft, and used in the stylesheet for the XPath 2 data model draft. XSLT stylesheet MSXSL script block The following script block implements an extension function that tests whether a specified ActiveX component is known to the client. This is used below to test for the existence of MathML rendering components. function isinstalled(ax) { try { var ActiveX = new ActiveXObject(ax); return "true"; } catch (e) { return "false"; } } The main bulk of this stylesheet is an identity transformation so... XHTML elements are copied sans prefix (XHTML is default namespace here, so these elements will still be in XHTML namespace IE's treatment of XHTML as HTML needs a little help here... > This just ensures the mathml prefix declaration isn't copied from the source at this stage, so that the system will use the mml prefix coming from this stylesheet We modify the head element to add code to specify a Microsoft "Behaviour" if the behaviour component is known to the system. Test for MathPlayer (Design Science) Test for Techexplorer (IBM) Test for Microsoft. In this case we just output a small HTML file that executes a script that will re-process the source docuument with a different stylesheet. Doing things this way avoids the need to xsl:import the second stylesheet, which would very much increase the processing overhead of running this stylesheet. Further tests (eg for netscape/mozilla) could be added here if necessary namespace="mml" implementation="#mmlFactory" Somewhat bizarrely in an otherwise namespace aware system, Microsoft behaviours are defined to trigger off the prefix not the Namespace. In the code above we associated a MathML rendering behaviour (if one was found) with the prefix mml: so here we ensure that this is the prefix that actually gets used in the output. Copy semantics element through in IE (so mathplayer gets to see mathplayer annotations, otherwise use first child or a presentation annotation. > /> " " IE5XSL stylesheet In a rare fit of sympathy for users of the-language-known-as-XSL-in-IE5 this file incorporates a version of the above code designed to work in the Microsoft dialect. This is needed otherwise users of a MathML rendering behaviour would have to make a choice whether they wanted to use this stylesheet (keeping their source documents conforming XHTML+MathML) or to use the explicit Microsoft Object code, which is less portable, but would work in at least IE5.5. This entire section of code, down to the end of the stylesheet is contained within this ie5:if. Thus XSLT sees it as a top level element from a foreign namespace and silently ignores it. IE5XSL sees it as "if true" and so executes the code. First close the comment started at the beginning. This ensures that the bulk of the XSLT code, while being copied to the result tree by the IE5XSL engine, will not be rendered in the browser. Lacking attribute value templates in xsl:element, and the local-name() function, we resort to constructing the start and end tags in strings in javascript, then using no-entities attribute which is the IE5XSL equivalent of disable-output-encoding '-->' function mpisinstalled() { try { var ActiveX = new ActiveXObject("MathPlayer.Factory.1"); return "true"; } catch (e) { return "false"; } } '<mml:' + this.nodeName.substring(this.nodeName.indexOf(":")+1) ' ' + this.nodeName="" '>' '</mml:' + this.nodeName.substring(this.nodeName.indexOf(":")+1) + '>' '<math>' '</math>' '<mml:' + this.nodeName.substring(this.nodeName.indexOf(":")+1) ' ' + this.nodeName="" '>' '</mml:' + this.nodeName.substring(this.nodeName.indexOf(":")+1) + '>' namespace="mml" implementation="#mmlFactory" 1.0.2/source/distro/xslt/pmathmlcss.xsl000064400000000000000000000616711140165031200210600ustar00viewvcviewvc00000010000000 Dictionary The following elements in the x: namespace form an implementation of an "Operator Dictionary" for this MathML Implementation. In the case of stretch operators, the element specifies the symbol parts via the latin-1 equivalent character based on the encoding in the symbol font. It is a clear "failure to comply to the spec" that using latin 1 characters (or numeric character references) in the latin 1 range access glyphs in teh symbol font via font position, however most of these character parts are not in Unicode (until 3.2), so there is no standard way to access these characters. { { ( ) [ ] [[ ]] | ||   ~ _v_ Remove these for now, as XML parser in IE6 is broken and doesn't accept plane 1 characters. Grab all of the above into a variable. HTML elements XHTML elements get passed straight through, sans namespace prefix. Template for the head element copies the original content, aand in addition adds a script element and CSS style element that implement the core of the MathML renderer. The malign function first finds the left most item in the aligngroup, and then modifies the left margin of each item to make them align. (Currently only left alignment is supported.) The mrowStretch function implements stretchy brackets. It is called repeatedly, once for each mo child,after a span corresponding to an mrow. The arguments are the id of teh span and the characters to use for the parts of the stretch operator. constructed fence. The Inline CSS style block handles all font and size specification for the various MathML operators. Unimplemented MathML elements get copied literally, in red, mainly as a debugging aid. <> </> mi: set default font based on string length, otherwise behaviour based on entries in the operator dictionary if one exists, or content is copied through to the output unchanged. mi1 Handling of mathvariant attribute. The choice of font families here (currently) avoids math-specific fonts but does use several fionts coming with windows 9.x and/or office 2000. font-weight: bold; font-style: upright font-style: upright; font-weight: bold; font-style: italic; font-style: italic; font-family: monospace; font-family: sans-serif; font-family: sans-serif; font-weight: bold; font-family: old english text mt doublestruck font-family: brush script mt italic mo: Generate a unique ID so that a script at the end of any surrounding mrow may replace the conent by a suitably stretched operator if need be. mn: a simple span munder: currently only supports underline, with a bottom border border-width: 0pt 0pt .1em 0pt; border-style: solid;" mover: currently only supports overline, with a top border border-width: .1em 0pt 0pt 0pt; border-style: solid;" munderover:
mtext: a simple span mstyle: not many attributes currently supported color: ; background-color: ; mglyph: Uses disable output escaping to construct a numeric character reference. Uses IE's non conforming behaviour of using this number to access the font encoding rather than unicode. ; ms: a simple span with left and right character added to the content. " " ( ) ,
    \ \ \ font-size: 75% ; font-size: 100% ;
left 
1.0.2/source/idl/000075500000000000000000000000001140165031200144145ustar00viewvcviewvc000000100000001.0.2/source/idl/readme-idl.txt000064400000000000000000000021761140165031200171660ustar00viewvcviewvc00000010000000This directory contains idl specifications for the custom uno interfaces defined by the Writer2LaTeX and Writer2xhtml extensions To avoid dependencies on the OOo SDK in the build process, compiled versions are included here. If you need to rebuild it, the complete SDK is required. These are the steps: To create the registry database for Writer2LaTeX: idlc -I\idl XW2LStarMathConverter.idl regmerge writer2latex.rdb /UCR XW2LStarMathConverter.urd To create the java interface javamaker -BUCR -Torg.openoffice.da.writer2latex.XW2LStarMathConverter -nD \program\types.rdb writer2latex.rdb and likewise for Writer2xhtml: idlc -I\idl XBatchConverter.idl regmerge writer2xhtml.rdb /UCR XBatchConverter.urd To create the java interfaces javamaker -BUCR -Torg.openoffice.da.writer2xhtml.XBatchConverter -nD \program\types.rdb writer2xhtml.rdb javamaker -BUCR -Torg.openoffice.da.writer2xhtml.XBatchHandler -nD \program\types.rdb writer2xhtml.rdb If you need to use the interfaces from C++ you will also need to run cppumaker 1.0.2/source/idl/writer2latex/000075500000000000000000000000001140165031200170505ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2latex/XW2LStarMathConverter.idl000064400000000000000000000011471140165031200236350ustar00viewvcviewvc00000010000000#ifndef __org_openoffice_da_writer2latex_XW2LStarMathConverter_idl__ #define __org_openoffice_da_writer2latex_XW2LStarMathConverter_idl__ #include module org { module openoffice { module da { module writer2latex { interface XW2LStarMathConverter : com::sun::star::uno::XInterface { // method org::openoffice::da::writer2latex::XW2LStarMathConverter::convertFormula string convertFormula ( [in] string sStarMathFormula ); // method org::openoffice::da::writer2latex::XW2LStarMathConverter::getPreamble string getPreamble ( ); }; }; }; }; }; #endif 1.0.2/source/idl/writer2latex/writer2latex.rdb000064400000000000000000000200001140165031200221650ustar00viewvcviewvc00000010000000CSMHIG'CSMHIG'"Xx .yF7{^]sl).^]sF7{I=y I=y NDN(F7{AdAd F7{awyF7{$Qݨg$ b Ϳy 2< b6a3 y UCR2< bCi NDN( org2< bv DbmAd openoffice2< b nT  Qݨg$ da2< bw4⥝l).^]s writer2latex2< bU;_I=y XW2LStarMathConverter2< bAV5F7{aw@$VL_value :rM4Vx; org/openoffice/da/writer2latex/XW2LStarMathConverter*]" com/sun/star/uno/XInterface convertFormula string string sStarMathFormula getPreamble string by$wQO٥F7{I=y @$VL_valueNI4VxI% org/openoffice/da/writer2latex b 94Vx9 org/openoffice boY "F7{Ad@$VL_valueee3.4Vx. org1.0.2/source/idl/writer2latex/org/000075500000000000000000000000001140165031200176375ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2latex/org/openoffice/000075500000000000000000000000001140165031200217545ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2latex/org/openoffice/da/000075500000000000000000000000001140165031200223405ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2latex/org/openoffice/da/writer2latex/000075500000000000000000000000001140165031200247745ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2latex/org/openoffice/da/writer2latex/XW2LStarMathConverter.class000064400000000000000000000010551140165031200321140ustar00viewvcviewvc00000010000000.4org/openoffice/da/writer2latex/XW2LStarMathConverterjava/lang/Objectcom/sun/star/uno/XInterfaceconvertFormula&(Ljava/lang/String;)Ljava/lang/String; getPreamble()Ljava/lang/String; UNOTYPEINFO)[Lcom/sun/star/lib/uno/typeinfo/TypeInfo;&com/sun/star/lib/uno/typeinfo/TypeInfo ,com/sun/star/lib/uno/typeinfo/MethodTypeInfo(Ljava/lang/String;II)V   ()VCode  0$YYSYYS1.0.2/source/idl/writer2xhtml/000075500000000000000000000000001140165031200170675ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2xhtml/XBatchConverter.idl000064400000000000000000000033561140165031200226310ustar00viewvcviewvc00000010000000#ifndef __org_openoffice_da_writer2xhtml_XBatchConverter_idl__ #define __org_openoffice_da_writer2xhtml_XBatchConverter_idl__ #include #include module org { module openoffice { module da { module writer2xhtml { // This interface is an IDL version of the java interface (writer2latex.api.BatchHandler) interface XBatchHandler : com::sun::star::uno::XInterface { // method org::openoffice::da::writer2xhtml::XBatchHandler::startConversion void startConversion (); // method org::openoffice::da::writer2xhtml::XBatchHandler::endConversion void endConversion (); // method org::openoffice::da::writer2xhtml::XBatchHandler::startDirectory void startDirectory ( [in] string sName ); // method org::openoffice::da::writer2xhtml::XBatchHandler::endDirectory void endDirectory ( [in] string sName, [in] boolean bSuccess ); // method org::openoffice::da::writer2xhtml::XBatchHandler::startFile void startFile ( [in] string sName ); // method org::openoffice::da::writer2xhtml::XBatchHandler::endFile void endFile ( [in] string sName, [in] boolean bSuccess ); // method org::openoffice::da::writer2xhtml::XBatchHandler::cancel boolean cancel (); }; // This interface is an IDL version of the java interface (writer2latex.api.BatchConverter) interface XBatchConverter : com::sun::star::uno::XInterface { // method org::openoffice::da::writer2xhtml::XBatchConverter::convert void convert ( [in] string sSourceURL, [in] string sTargetURL, [in] sequence< com::sun::star::beans::PropertyValue > lArguments, [in] XBatchHandler handler ); } ; }; }; }; }; #endif 1.0.2/source/idl/writer2xhtml/writer2xhtml.rdb000064400000000000000000000400001140165031200222250ustar00viewvcviewvc00000010000000CSMHAi$&CSMHAi$&"X',yF7{^]s }<^]sNDN(F7{Ad$Ad yF7{|F7{A F7{$"Qݨg$ F7{XS8XX b Ϳy 2< b6a3 y UCR2< bCi NDN( org2< bv DbmAd openoffice2< b nT  Qݨg$ da2< bwt}<^]s writer2xhtml2< bUvqX XBatchConverter2< bAmF7{|@$VL_valueY7.|w4Vxw 5 org/openoffice/da/writer2xhtml/XBatchConverter" *]com/sun/star/uno/XInterface convert void string sSourceURL string sTargetURL) []com/sun/star/beans/PropertyValue lArguments3 org/openoffice/da/writer2xhtml/XBatchHandler handler&   by$w3/RS8X XBatchHandler2< b 94Vx9 org/openoffice b94"$"F7{Ad@$VL_valueee3.4Vx. orgLSE 1283019560 __utma 230736537.1184518145.1219947560.1219947560.1219947560.1 www.estro.be FALSE / FALSE 2166017768 CFID 4283449 www.estro.be FALSE / FALSE 2166017768 CFTOKEN 81379813 .groups.google.com TRUE / FALSE 1235630279 __utmz 118165087.1219862280.1.1.utmccn=(referral)|utmcsr=planet.go-oo.org|utmcct=/|utmcmd=referral groups.google.com FALSE / FALSE 1704067201 GTZ -120 .groups.google.com TRUE / FALSE 1282934279 __utma 118165087.749870298.1219862280.1219862280.1219862280.1 .au.dk TRUE / FALSE 1257878544 __utma 196351036.817218794.1194806545.1194806545.1194806545.1 .jmagick.wiki.sourceforge.net TRUE / FALSE 1282924257 __utma 251882130.4398841614876302000.1219851993.1219851993.1219851993.1 .jmagick.wiki.sourceforge.net TRUE / FALSE 1235619993 __utmz 251882130.1219851993.1.1.utmcsr=jmagick.org|utmccn=(referral)|utmcmd=referral|utmcct=/support.html .wiki.sourceforge.net TRUE / FALSE 1282924002 __utma 167174968.1912001107.1219852003.1219852003.1219852003.1 .wiki.sourceforge.net TRUE / FALSE 1235620002 __utmz 167174968.1219852003.1.1.utmccn=(referral)|utmcsr=jmagick.org|utmcct=/support.html|utmcmd=referral www.abconsult.dk FALSE /abinitio/ FALSE 1392580788 true .seniorinternet.dk TRUE / FALSE 1282852751 __utma 86981786.586724153.1219780751.1219780751.1219780751.1 .seniorinternet.dk TRUE / FALSE 1235548751 __utmz 86981786.1219780751.1.1.utmccn=(organic)|utmcsr=google|utmctr=l%C3%A6der+h%C3%A5ndarbejde|utmcmd=organic .mcinternet.dk TRUE / FALSE 1282852624 __utma 137503020.770137179.1219780624.1219780624.1219780624.1 www.mcinternet.dk FALSE / FALSE 1577835112 Vote sessionID=26%2D08%2D2008+21%3A25%3A03 .mcinternet.dk TRUE / FALSE 1235548624 __utmz 137503020.1219780624.1.1.utmccn=(organic)|utmcsr=google|utmctr=l%C3%A6der+behandling|utmcmd=organic 64.18.163.122 FALSE / FALSE 1235542820 __utmz 93996826.1219774820.1.1.utmccn=(organic)|utmcsr=google|utmctr=javadoc+package.html|utmcmd=organic 64.18.163.122 FALSE / FALSE 1282846820 __utma 93996826.1763044081.1219774820.1219774820.1219774820.1 www.paypal.com FALSE / FALSE 2131364181 Apache 62.107.72.163.158231185283070695 .www.nordea.dk TRUE / FALSE 1534179647 main%5Fdefault%5Fcookie bln%5Fcookie%5Fenabled=true .codeweavers.com TRUE / FALSE 1235457913 __utmz 85114251.1219689913.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=mac%20crossover .codeweavers.com TRUE / FALSE 1282761961 __utma 85114251.2610254791549191700.1219689913.1219689913.1219689913.1 .mybroadband.co.za TRUE / FALSE 1235120229 __utmz 235500445.1219352230.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=php%20calculate%20week%20number .mybroadband.co.za TRUE / FALSE 1282424229 __utma 235500445.375654242013335800.1219352230.1219352230.1219352230.1 mybroadband.co.za FALSE / FALSE 1250888215 bblastactivity 0 mybroadband.co.za FALSE / FALSE 1250888215 bblastvisit 1219350315 serv.mybroadband.co.za FALSE / FALSE 1250888227 OAID 758d23b19058240a2e89c0db0320b859 217.60.229.13 FALSE /phpmyadmin/ FALSE 1223579950 pma_navi_width 200 .mozilla-europe.org TRUE / FALSE 1235018258 __utmz 210549513.1219250258.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none) .mozilla-europe.org TRUE / FALSE 2147385600 __utma 210549513.1992321019.1219250258.1219250258.1219250258.1 .mysql.com TRUE / FALSE 1282145816 __utma 183337658.514440820.1210861443.1210861443.1219073816.2 .mysql.com TRUE / FALSE 1526221434 MyPrefs ud5fui6bfvpenpks2jd9dusjhg5pgdfv .mysql.com TRUE / FALSE 1234841816 __utmz 183337658.1219073816.2.2.utmccn=(referral)|utmcsr=217.60.229.13|utmcct=/phpmyadmin/tbl_indexes.php|utmcmd=referral .experts-exchange.com TRUE / FALSE 3366463817 USE_CDN2 1 .experts-exchange.com TRUE / FALSE 1376753724 s_vi [CS]v1|48A98F570000428A-A000B1F0000327E[CE] .experts-exchange.com TRUE / FALSE 3366557371 EEPAGES 4 .experts-exchange.com TRUE / FALSE 3366557371 CLOAD 1 .experts-exchange.com TRUE / FALSE 1313681723 s_lastvisit 1219073723540 .experts-exchange.com TRUE / FALSE 3366557350 EEQUESTIONPAGEID 9 .experts-exchange.com TRUE / FALSE 3366557350 EESESSIONS 3 .experts-exchange.com TRUE / FALSE 3366463817 REFERRER http://www.google.dk/search?hl=da&client=firefox-a&rls=org.mozilla%3Ada%3Aofficial&hs=pj2&q=tlistbox+add+append&btnG=S%C3%B8g&meta= .experts-exchange.com TRUE / FALSE 3366463817 eeNav false .gidforums.com TRUE / FALSE 1250609663 bblastactivity 0 .gidforums.com TRUE / FALSE 1250609663 bblastvisit 1218739888 .gidforums.com TRUE / FALSE 1281811901 __gads ID=356effbf7eb25da3:T=1218739901:S=ALNI_MZC1UOcIEMEY9yrv9xOV14zqBTbUg .gidforums.com TRUE / FALSE 1281813794 __utma 128504474.2395862561242243000.1218741795.1218741795.1218741795.1 .gidforums.com TRUE / FALSE 1234509794 __utmz 128504474.1218741795.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=phpmyadmin%20foreign%20key .thedesignspace.net TRUE / FALSE 1282145131 __utma 11084785.1702056589.1219073132.1219073132.1219073132.1 .thedesignspace.net TRUE / FALSE 1234841131 __utmz 11084785.1219073132.1.1.utmccn=(organic)|utmcsr=google|utmctr=phpmyadmin+relations|utmcmd=organic www.wellho.net FALSE / FALSE 1533569402 whcmy whc48a98de897766 sales.liveperson.net FALSE / FALSE 1250587230 HumanClickID -4270115258464 server.iad.liveperson.net FALSE / FALSE 1250587164 HumanClickID -1510253575690 .sas.com TRUE / FALSE 1234819164 __utmz 234506268.1219051164.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=ibm%20rdbms .sas.com TRUE / FALSE 1282123164 __utmv 234506268.emea%3Adenmark .sas.com TRUE / FALSE 1282123164 __utma 234506268.1108186196330011900.1219051164.1219051164.1219051164.1 server.iad.liveperson.net FALSE /hc/42179880 FALSE 1250587167 HumanClickID -1510253575690-1219049275:-1:-1:-1:-1 .geocities.com TRUE / FALSE 2127587492 BX fq0o7914aiali&b=3&s=gk .msfn.org TRUE / FALSE 2147385600 __qca 1183032800-95498437-64162351 .about.com TRUE / FALSE 1248001330 TMog 84CBSF0J20SA0[6c .about.com TRUE / FALSE 1608001335 up 84CBSL1e20SA02Wk .about.com TRUE / FALSE 1705665336 TID 3fg20oa140176l .about.com TRUE / FALSE 1808001272 jsc 13 .about.com TRUE / FALSE 7219066989 zFD 88H484C1088041840110800502 .about.com TRUE / FALSE 1258980110 zGTL 88H001 .nytimes.com TRUE / FALSE 1258980721 zFN 88H584C183O483A1839108805184011830637B0110800C05700303 .nytimes.com TRUE / FALSE 1258980721 zFD 88H584C183O483A1839108805184011830637B0110800C05700303 .about.com TRUE / FALSE 1258980721 zGT 88H001 .about.com TRUE / FALSE 1716644111 TData .nytimes.com TRUE / FALSE 1258980110 zGT 88H001 .nytimes.com TRUE / FALSE 1521704353 WT_FPC id=62.107.119.9-1327149696.29893724:lv=1206344353790:ss=1206344161390 .nytimes.com TRUE / FALSE 1521898755 s_pers %20s_vsn_nytimesglobal_1%3D277451451579%7C1510403754100%3B%20s_vnum1%3D1206361.0.2/source/idl/writer2xhtml/org/000075500000000000000000000000001140165031200176565ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2xhtml/org/openoffice/000075500000000000000000000000001140165031200217735ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2xhtml/org/openoffice/da/000075500000000000000000000000001140165031200223575ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2xhtml/org/openoffice/da/writer2xhtml/000075500000000000000000000000001140165031200250325ustar00viewvcviewvc000000100000001.0.2/source/idl/writer2xhtml/org/openoffice/da/writer2xhtml/XBatchConverter.class000064400000000000000000000010641140165031200311230ustar00viewvcviewvc00000010000000..org/openoffice/da/writer2xhtml/XBatchConverterjava/lang/Objectcom/sun/star/uno/XInterfaceconvertx(Ljava/lang/String;Ljava/lang/String;[Lcom/sun/star/beans/PropertyValue;Lorg/openoffice/da/writer2xhtml/XBatchHandler;)V UNOTYPEINFO)[Lcom/sun/star/lib/uno/typeinfo/TypeInfo;&com/sun/star/lib/uno/typeinfo/TypeInfo ,com/sun/star/lib/uno/typeinfo/MethodTypeInfo (Ljava/lang/String;II)V   ()VCode  " YYS1.0.2/source/idl/writer2xhtml/org/openoffice/da/writer2xhtml/XBatchHandler.class000064400000000000000000000013361140165031200305330ustar00viewvcviewvc00000010000000.',org/openoffice/da/writer2xhtml/XBatchHandlerjava/lang/Objectcom/sun/star/uno/XInterfacestartConversion()V endConversionstartDirectory(Ljava/lang/String;)V endDirectory(Ljava/lang/String;Z)V startFileendFilecancel()Z UNOTYPEINFO)[Lcom/sun/star/lib/uno/typeinfo/TypeInfo;&com/sun/star/lib/uno/typeinfo/TypeInfo,com/sun/star/lib/uno/typeinfo/MethodTypeInfo(Ljava/lang/String;II)V       #Code      %&ymYYSYYSYYSYYSYY SYY!SYY"S$1.0.2/source/java/000075500000000000000000000000001140165031200145655ustar00viewvcviewvc000000100000001.0.2/source/java/org/000075500000000000000000000000001140165031200153545ustar00viewvcviewvc000000100000001.0.2/source/java/org/openoffice/000075500000000000000000000000001140165031200174715ustar00viewvcviewvc000000100000001.0.2/source/java/org/openoffice/da/000075500000000000000000000000001140165031200200555ustar00viewvcviewvc000000100000001.0.2/source/java/org/openoffice/da/comp/000075500000000000000000000000001140165031200210135ustar00viewvcviewvc000000100000001.0.2/source/java/org/openoffice/da/comp/w2lcommon/000075500000000000000000000000001140165031200227305ustar00viewvcviewvc000000100000001.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/000075500000000000000000000000001140165031200242155ustar00viewvcviewvc000000100000001.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/ByteArrayXStream.java000064400000000000000000000165211140165031200302730ustar00viewvcviewvc00000010000000/************************************************************************ * * ByteArrayXStream.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-07-22) * */ package org.openoffice.da.comp.w2lcommon.filter; // This class is based on these java uno adapter classes: // com.sun.star.lib.uno.adapter.ByteArrayToXInputStreamAdapter; // com.sun.star.lib.uno.adapter.XOutputStreamToByteArrayAdapter; // See http://go-oo.org/lxr/source/udk/javaunohelper/com/sun/star/lib/uno/adapter/XOutputStreamToByteArrayAdapter.java // and http://go-oo.org/lxr/source/udk/javaunohelper/com/sun/star/lib/uno/adapter/ByteArrayToXInputStreamAdapter.java // for original source import com.sun.star.io.XInputStream; import com.sun.star.io.XOutputStream; import com.sun.star.io.XSeekable; import com.sun.star.io.XStream; /**

This is a java-uno adapter class which implements XStream using a * byte array. (We need this because XGraphicProvider demans read/write access * when storing a graphic to a stream.)

*/ public class ByteArrayXStream implements XInputStream, XOutputStream, XSeekable, XStream { // Keep data about our byte array (we read and write to the same byte array) private int initialSize = 100240; // 10 kb private int size = 0; // The current buffer size private int position = 0; // The current write position, always<=size private int readPosition = 0; // The current read position, always<=position private boolean closed = false; // The XStream is closed private byte[] buffer; // The buffer // Constructor: Initialize the byte array public ByteArrayXStream() { size = initialSize; buffer = new byte[size]; } // Implementation of XOutputStream public void closeOutput() throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { // trim buffer if ( buffer.length > position) { byte[] newBuffer = new byte[position]; System.arraycopy(buffer, 0, newBuffer, 0, position); buffer = newBuffer; } closed = true; } public void flush() throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { } public void writeBytes(byte[] values) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { if ( values.length > size-position ) { byte[] newBuffer = null; while ( values.length > size-position ) size *= 2; newBuffer = new byte[size]; System.arraycopy(buffer, 0, newBuffer, 0, position); buffer = newBuffer; } System.arraycopy(values, 0, buffer, position, values.length); position += values.length; } // Implementation of XInputStream private void _check() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { if(closed) { throw new com.sun.star.io.IOException("input closed"); } } public int available() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { _check(); return position - readPosition; } public void closeInput() throws com.sun.star.io.NotConnectedException, com.sun.star.io.IOException { closed = true; } public int readBytes(byte[][] values, int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { _check(); try { int remain = (int)(position - readPosition); if (param > remain) param = remain; /* ARGH!!! */ if (values[0] == null){ values[0] = new byte[param]; // System.err.println("allocated new buffer of "+param+" bytes"); } System.arraycopy(buffer, readPosition, values[0], 0, param); // System.err.println("readbytes() -> "+param); readPosition += param; return param; } catch (ArrayIndexOutOfBoundsException ae) { // System.err.println("readbytes() -> ArrayIndexOutOfBounds"); ae.printStackTrace(); throw new com.sun.star.io.BufferSizeExceededException("buffer overflow"); } catch (Exception e) { // System.err.println("readbytes() -> Exception: "+e.getMessage()); e.printStackTrace(); throw new com.sun.star.io.IOException("error accessing buffer"); } } public int readSomeBytes(byte[][] values, int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { // System.err.println("readSomebytes()"); return readBytes(values, param); } public void skipBytes(int param) throws com.sun.star.io.NotConnectedException, com.sun.star.io.BufferSizeExceededException, com.sun.star.io.IOException { // System.err.println("skipBytes("+param+")"); _check(); if (param > (position - readPosition)) throw new com.sun.star.io.BufferSizeExceededException("buffer overflow"); readPosition += param; } // Implementation of XSeekable public long getLength() throws com.sun.star.io.IOException { // System.err.println("getLength() -> "+m_length); if (buffer != null) return position; else throw new com.sun.star.io.IOException("no bytes"); } public long getPosition() throws com.sun.star.io.IOException { // System.err.println("getPosition() -> "+m_pos); if (buffer != null) return readPosition; else throw new com.sun.star.io.IOException("no bytes"); } public void seek(long param) throws com.sun.star.lang.IllegalArgumentException, com.sun.star.io.IOException { // System.err.println("seek("+param+")"); if (buffer != null) { if (param < 0 || param > position) throw new com.sun.star.lang.IllegalArgumentException("invalid seek position"); else readPosition = (int)param; } else throw new com.sun.star.io.IOException("no bytes"); } // Implementation of XStream public XInputStream getInputStream() { return this; } public XOutputStream getOutputStream() { return this; } // Get the buffer public byte[] getBuffer() { return buffer; } } 1.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/EPSCleaner.java000064400000000000000000000050371140165031200270060ustar00viewvcviewvc00000010000000/************************************************************************ * * EPSCleaner.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2009 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2009-03-09) */ package org.openoffice.da.comp.w2lcommon.filter; /** This class removes redundant binary information from EPS files created by OOo. * See the issue http://qa.openoffice.org/issues/show_bug.cgi?id=25256 * According to this message http://markmail.org/message/dc6rprmtktxuq35v * on dev@openoffice.org the binary data is an EPSI preview in TIFF format * TODO: Is it possible to avoid this export? */ public class EPSCleaner { // Signatures for start and end in eps private byte[] psStart; private byte[] psEnd; public EPSCleaner() { try { psStart = "%!PS-Adobe".getBytes("US-ASCII"); psEnd = "%%EOF".getBytes("US-ASCII"); } catch (java.io.UnsupportedEncodingException ex) { // US-ASCII *is* supported :-) } } // public byte[] cleanEps(byte[] blob) { int n = blob.length; int nStart = 0; for (int i=0; i=blob.length) { return false; } for (int i=0; i=0) { origName=origName.substring(origName.lastIndexOf("/")+1,origName.length()); } if (origName.lastIndexOf(".")>=0) { name = origName.substring(0,(origName.lastIndexOf("."))); } else { name=origName; } } } else{ name = "OutFile"; } return name; } public String replace(String origString, String origChar, String replaceChar){ String tmp=""; int index=origString.indexOf(origChar); if(index !=-1){ while (index !=-1){ String first =origString.substring(0,index); first=first.concat(replaceChar); tmp=tmp.concat(first); origString=origString.substring(index+1,origString.length()); index=origString.indexOf(origChar); if(index==-1) { tmp=tmp.concat(origString); } } } return tmp; } public String needsMask(String origString) { if (origString.indexOf("&")!=-1){ origString=replace(origString,"&","&"); } if (origString.indexOf("\"")!=-1){ origString=replace(origString,"\"","""); } if (origString.indexOf("<")!=-1){ origString=replace(origString,"<","<"); } if (origString.indexOf(">")!=-1){ origString=replace(origString,">",">"); } return origString; } // Implementation of XExportFilter: public boolean exporter(com.sun.star.beans.PropertyValue[] aSourceData, java.lang.String[] msUserData) throws com.sun.star.uno.RuntimeException{ sURL=null; filterData = null; // Get user data from configuration (type detection) //String udConvertClass=msUserData[0]; //String udImport =msUserData[2]; //String udExport =msUserData[3]; sdMime = msUserData[5]; // Get source data (only the OutputStream and the URL are actually used) com.sun.star.beans.PropertyValue[] pValue = aSourceData; for (int i = 0 ; i < pValue.length; i++) { try{ if (pValue[i].Name.compareTo("OutputStream")==0){ xos=(com.sun.star.io.XOutputStream)AnyConverter.toObject(new Type(com.sun.star.io.XOutputStream.class), pValue[i].Value); } //if (pValue[i].Name.compareTo("FileName")==0){ // sFileName=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value); //} if (pValue[i].Name.compareTo("URL")==0){ sURL=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value); } //if (pValue[i].Name.compareTo("Title")==0){ // title=(String)AnyConverter.toObject(new Type(java.lang.String.class), pValue[i].Value); //} if (pValue[i].Name.compareTo("FilterData")==0) { filterData = pValue[i].Value; } } catch(com.sun.star.lang.IllegalArgumentException AnyExec){ System.err.println("\nIllegalArgumentException "+AnyExec); } } if (sURL==null){ sURL=""; } // Create a pipe to be used by the XDocumentHandler implementation: try { Object xPipeObj=xMSF.createInstance("com.sun.star.io.Pipe"); xInStream = (XInputStream) UnoRuntime.queryInterface( XInputStream.class , xPipeObj ); xOutStream = (XOutputStream) UnoRuntime.queryInterface( XOutputStream.class , xPipeObj ); } catch (Exception e){ System.err.println("Exception "+e); return false; } return true; } // Implementation of XDocumentHandler: // Flat xml is created by the sax events and passed through the pipe // created by exporter() public void startDocument () { //Do nothing } public void endDocument()throws com.sun.star.uno.RuntimeException { try{ xOutStream.closeOutput(); convert(xInStream,xos); } catch (IOException e){ MessageBox msgBox = new MessageBox(xComponentContext); msgBox.showMessage(__displayName+": IO error in conversion", e.toString()+" at "+e.getStackTrace()[0].toString()); throw new com.sun.star.uno.RuntimeException(e.getMessage()); } catch (Exception e){ MessageBox msgBox = new MessageBox(xComponentContext); msgBox.showMessage(__displayName+": Internal error in conversion", e.toString()+" at "+e.getStackTrace()[0].toString()); throw new com.sun.star.uno.RuntimeException(__displayName+" Exception"); } } public void startElement (String str, com.sun.star.xml.sax.XAttributeList xattribs) { str="<".concat(str); if (xattribs !=null) { str= str.concat(" "); int len=xattribs.getLength(); for (short i=0;i"); try{ xOutStream.writeBytes(str.getBytes("UTF-8")); } catch (Exception e){ System.err.println("\n"+e); } } public void endElement(String str){ str=""); try{ xOutStream.writeBytes(str.getBytes("UTF-8")); } catch (Exception e){ System.err.println("\n"+e); } } public void characters(String str){ str=needsMask(str); try{ xOutStream.writeBytes(str.getBytes("UTF-8")); } catch (Exception e){ System.err.println("\n"+e); } } public void ignorableWhitespace(String str){ } public void processingInstruction(String aTarget, String aData){ } public void setDocumentLocator(com.sun.star.xml.sax.XLocator xLocator){ } // This is the actual conversion method, using Writer2LaTeX to convert // the flat xml recieved from the XInputStream, and writing the result // to the XOutputStream. The XMLExporter does not support export to // compound documents with multiple output files; so the main file // is written to the XOutStream and other files are written using ucb. public void convert (com.sun.star.io.XInputStream xml,com.sun.star.io.XOutputStream exportStream) throws com.sun.star.uno.RuntimeException, IOException { // Initialise the file access sfa2 = null; try { Object sfaObject = xComponentContext.getServiceManager().createInstanceWithContext( "com.sun.star.ucb.SimpleFileAccess", xComponentContext); sfa2 = (XSimpleFileAccess2) UnoRuntime.queryInterface(XSimpleFileAccess2.class, sfaObject); } catch (com.sun.star.uno.Exception e) { // failed to get SimpleFileAccess service (should not happen) } // Get base name from the url provided by OOo String sName= getFileName(sURL); // Adapter for input stream (OpenDocument flat xml) XInputStreamToInputStreamAdapter xis =new XInputStreamToInputStreamAdapter(xml); // Adapter for output stream (Main output file) XOutputStreamToOutputStreamAdapter newxos =new XOutputStreamToOutputStreamAdapter(exportStream); // Create converter Converter converter = ConverterFactory.createConverter(sdMime); if (converter==null) { throw new com.sun.star.uno.RuntimeException("Failed to create converter to "+sdMime); } // Apply the FilterData to the converter if (filterData!=null) { FilterDataParser fdp = new FilterDataParser(xComponentContext); fdp.applyFilterData(filterData,converter); } // Do conversion converter.setGraphicConverter(new GraphicConverterImpl(xComponentContext)); ConverterResult dataOut = null; //try { dataOut = converter.convert(xis,sName); //} //catch (IOException e) { // Fail silently //} // Write out files Iterator docEnum = dataOut.iterator(); // Remove the file name part of the url String sNewURL = null; if (sURL.lastIndexOf("/")>-1) { // Take the url up to and including the last slash sNewURL = sURL.substring(0,sURL.lastIndexOf("/")+1); } else { // The url does not include a path; this should not really happen, // but in this case we will write to the current default directory sNewURL = ""; } while (docEnum.hasNext() && sURL.startsWith("file:")) { OutputFile docOut = (OutputFile)docEnum.next(); if (dataOut.getMasterDocument()==docOut) { // The master document is written to the XOutStream supplied // by the XMLFilterAdaptor docOut.write(newxos); newxos.flush(); newxos.close(); } else { // Additional documents are written directly using ucb // Get the file name and the (optional) directory name String sFullFileName = docOut.getFileName(); String sDirName = ""; String sFileName = sFullFileName; int nSlash = sFileName.indexOf("/"); if (nSlash>-1) { sDirName = sFileName.substring(0,nSlash); sFileName = sFileName.substring(nSlash+1); } try{ // Create subdirectory if required if (sDirName.length()>0 && !sfa2.exists(sNewURL+sDirName)) { sfa2.createFolder(sNewURL+sDirName); } // writeFile demands an InputStream, so we need a pipe Object xPipeObj=xMSF.createInstance("com.sun.star.io.Pipe"); XInputStream xInStream = (XInputStream) UnoRuntime.queryInterface(XInputStream.class, xPipeObj ); XOutputStream xOutStream = (XOutputStream) UnoRuntime.queryInterface(XOutputStream.class, xPipeObj ); OutputStream outStream = new XOutputStreamToOutputStreamAdapter(xOutStream); // Feed the pipe with content... docOut.write(outStream); outStream.flush(); outStream.close(); xOutStream.closeOutput(); // ...and then write the content to the url sfa2.writeFile(sNewURL+sFullFileName,xInStream); } catch (Throwable e){ MessageBox msgBox = new MessageBox(xComponentContext); msgBox.showMessage(__displayName+": Error writing files", e.toString()+" at "+e.getStackTrace()[0].toString()); } } } } // Implement methods from interface XTypeProvider // Implementation of XTypeProvider public com.sun.star.uno.Type[] getTypes() { Type[] typeReturn = {}; try { typeReturn = new Type[] { new Type( XTypeProvider.class ), new Type( XExportFilter.class ), new Type( XServiceName.class ), new Type( XServiceInfo.class ) }; } catch( Exception exception ) { } return( typeReturn ); } public byte[] getImplementationId() { byte[] byteReturn = {}; byteReturn = new String( "" + this.hashCode() ).getBytes(); return( byteReturn ); } // Implement method from interface XServiceName public String getServiceName() { return( __serviceName ); } // Implement methods from interface XServiceInfo public boolean supportsService(String stringServiceName) { return( stringServiceName.equals( __serviceName ) ); } public String getImplementationName() { return __implementationName; //return( W2LExportFilter.class.getName() ); } public String[] getSupportedServiceNames() { String[] stringSupportedServiceNames = { __serviceName }; return( stringSupportedServiceNames ); } } 1.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/FilterDataParser.java000064400000000000000000000232211140165031200302540ustar00viewvcviewvc00000010000000/************************************************************************ * * FilterDataParser.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-11-22) * */ package org.openoffice.da.comp.w2lcommon.filter; import java.io.InputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Enumeration; import com.sun.star.beans.PropertyValue; import com.sun.star.io.NotConnectedException; import com.sun.star.io.XInputStream; import com.sun.star.io.XOutputStream; import com.sun.star.ucb.CommandAbortedException; import com.sun.star.ucb.XSimpleFileAccess2; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.util.XStringSubstitution; import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter; import com.sun.star.lib.uno.adapter.XOutputStreamToOutputStreamAdapter; import org.openoffice.da.comp.w2lcommon.helper.PropertyHelper; import writer2latex.api.Converter; /** This class parses the FilterData property passed to the filter and * applies it to a Converter * All errors are silently ignored */ public class FilterDataParser { //private static XComponentContext xComponentContext = null; private XSimpleFileAccess2 sfa2; private XStringSubstitution xPathSub; public FilterDataParser(XComponentContext xComponentContext) { //this.xComponentContext = xComponentContext; // Get the SimpleFileAccess service sfa2 = null; try { Object sfaObject = xComponentContext.getServiceManager().createInstanceWithContext( "com.sun.star.ucb.SimpleFileAccess", xComponentContext); sfa2 = (XSimpleFileAccess2) UnoRuntime.queryInterface(XSimpleFileAccess2.class, sfaObject); } catch (com.sun.star.uno.Exception e) { // failed to get SimpleFileAccess service (should not happen) } // Get the PathSubstitution service xPathSub = null; try { Object psObject = xComponentContext.getServiceManager().createInstanceWithContext( "com.sun.star.util.PathSubstitution", xComponentContext); xPathSub = (XStringSubstitution) UnoRuntime.queryInterface(XStringSubstitution.class, psObject); } catch (com.sun.star.uno.Exception e) { // failed to get PathSubstitution service (should not happen) } } /** Apply the given FilterData property to the given converter * @param data an Any containing the FilterData property * @param converter a writer2latex.api.Converter implementation */ public void applyFilterData(Object data, Converter converter) { // Get the array from the data, if possible PropertyValue[] filterData = null; if (AnyConverter.isArray(data)) { try { Object[] arrayData = (Object[]) AnyConverter.toArray(data); if (arrayData instanceof PropertyValue[]) { filterData = (PropertyValue[]) arrayData; } } catch (com.sun.star.lang.IllegalArgumentException e) { // Failed to convert to array; should not happen - ignore } } if (filterData==null) { return; } PropertyHelper props = new PropertyHelper(filterData); // Get the special properties TemplateURL, ConfigURL and AutoCreate Object tpl = props.get("TemplateURL"); String sTemplate = null; if (tpl!=null && AnyConverter.isString(tpl)) { try { sTemplate = substituteVariables(AnyConverter.toString(tpl)); } catch (com.sun.star.lang.IllegalArgumentException e) { // Failed to convert to String; should not happen - ignore } } Object auto = props.get("AutoCreate"); boolean bAutoCreate = false; if (auto!=null && AnyConverter.isString(auto)) { try { if ("true".equals(AnyConverter.toString(auto))) { bAutoCreate = true; } } catch (com.sun.star.lang.IllegalArgumentException e) { // Failed to convert to String; should not happen - ignore } } Object cfg = props.get("ConfigURL"); String sConfig = null; if (cfg!=null && AnyConverter.isString(cfg)) { try { sConfig = substituteVariables(AnyConverter.toString(cfg)); } catch (com.sun.star.lang.IllegalArgumentException e) { // Failed to convert to String; should not happen - ignore } } // Load the template from the specified URL, if any if (sfa2!=null && sTemplate!=null && sTemplate.length()>0) { try { XInputStream xIs = sfa2.openFileRead(sTemplate); if (xIs!=null) { InputStream is = new XInputStreamToInputStreamAdapter(xIs); converter.readTemplate(is); is.close(); xIs.closeInput(); } } catch (IOException e) { // ignore } catch (NotConnectedException e) { // ignore } catch (CommandAbortedException e) { // ignore } catch (com.sun.star.uno.Exception e) { // ignore } } // Create config if required try { if (bAutoCreate && sfa2!=null && sConfig!=null && !sConfig.startsWith("*") && !sfa2.exists(sConfig)) { // Note: Requires random access, ie. must be a file URL: XOutputStream xOs = sfa2.openFileWrite(sConfig); if (xOs!=null) { OutputStream os = new XOutputStreamToOutputStreamAdapter(xOs); converter.getConfig().write(os); os.flush(); os.close(); xOs.closeOutput(); } } } catch (IOException e) { // ignore } catch (NotConnectedException e) { // ignore } catch (CommandAbortedException e) { // Ignore } catch (com.sun.star.uno.Exception e) { // Ignore } // Load the configuration from the specified URL, if any if (sConfig!=null) { if (sConfig.startsWith("*")) { // internal configuration try { converter.getConfig().readDefaultConfig(sConfig.substring(1)); } catch (IllegalArgumentException e) { // ignore } } else if (sfa2!=null) { // real URL try { XInputStream xIs = sfa2.openFileRead(sConfig);; if (xIs!=null) { InputStream is = new XInputStreamToInputStreamAdapter(xIs); converter.getConfig().read(is); is.close(); xIs.closeInput(); } } catch (IOException e) { // Ignore } catch (NotConnectedException e) { // Ignore } catch (CommandAbortedException e) { // Ignore } catch (com.sun.star.uno.Exception e) { // Ignore } } } // Read further configuration properties Enumeration keys = props.keys(); while (keys.hasMoreElements()) { String sKey = (String) keys.nextElement(); if (!"ConfigURL".equals(sKey) && !"TemplateURL".equals(sKey) && !"AutoCreate".equals(sKey)) { Object value = props.get(sKey); if (AnyConverter.isString(value)) { try { converter.getConfig().setOption(sKey,AnyConverter.toString(value)); } catch (com.sun.star.lang.IllegalArgumentException e) { // Failed to convert to String; should not happen - ignore } } } } } private String substituteVariables(String sUrl) { if (xPathSub!=null) { try { return xPathSub.substituteVariables(sUrl, false); } catch (com.sun.star.container.NoSuchElementException e) { // Found an unknown variable, no substitution // (This will only happen if false is replaced by true above) return sUrl; } } else { // Not path substitution available return sUrl; } } } 1.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl.java000064400000000000000000000044471140165031200311600ustar00viewvcviewvc00000010000000/************************************************************************ * * GraphicConverterImpl.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-07-21) * */ package org.openoffice.da.comp.w2lcommon.filter; import com.sun.star.uno.XComponentContext; import writer2latex.api.GraphicConverter; public class GraphicConverterImpl implements GraphicConverter { private GraphicConverter graphicConverter1; private GraphicConverter graphicConverter2; public GraphicConverterImpl(XComponentContext xComponentContext) { graphicConverter1 = new GraphicConverterImpl1(xComponentContext); graphicConverter2 = new GraphicConverterImpl2(xComponentContext); } public boolean supportsConversion(String sSourceMime, String sTargetMime, boolean bCrop, boolean bResize) { return graphicConverter1.supportsConversion(sSourceMime, sTargetMime, bCrop, bResize) || graphicConverter2.supportsConversion(sSourceMime, sTargetMime, bCrop, bResize); } public byte[] convert(byte[] source, String sSourceMime, String sTargetMime) { byte[] result = null; // Prefer the simple implementation (GraphicProvider) if (graphicConverter1.supportsConversion(sSourceMime, sTargetMime, false, false)) { result = graphicConverter1.convert(source, sSourceMime, sTargetMime); } // If this is not possible or fails, try the complex implementation if (result==null) { result = graphicConverter2.convert(source, sSourceMime, sTargetMime); } return result; } } 1.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl1.java000064400000000000000000000134251140165031200312350ustar00viewvcviewvc00000010000000/************************************************************************ * * GraphicConverterImpl1.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2009 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2009-03-08) */ // package org.openoffice.da.comp.w2lcommon.filter; // Java uno helper class import com.sun.star.lib.uno.adapter.ByteArrayToXInputStreamAdapter; // UNO classes import com.sun.star.beans.PropertyValue; import com.sun.star.graphic.XGraphic; import com.sun.star.graphic.XGraphicProvider; //import com.sun.star.io.XInputStream; //import com.sun.star.io.XOutputStream; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.uno.XComponentContext; import com.sun.star.uno.UnoRuntime; //import java.io.InputStream; //import java.io.OutputStream; import writer2latex.api.GraphicConverter; import writer2latex.api.MIMETypes; /** A GraphicConverter implementation which uses the GraphicProvider service * to convert the graphic. This service does only support simple format * conversion using the "internal" graphics filters in Draw. Advanced features * like pdf, crop and resize thus cannot be handled. */ public class GraphicConverterImpl1 implements GraphicConverter { private XGraphicProvider xGraphicProvider; private EPSCleaner epsCleaner; public GraphicConverterImpl1(XComponentContext xComponentContext) { try { // Get the XGraphicProvider interface of the GraphicProvider service XMultiComponentFactory xMCF = xComponentContext.getServiceManager(); Object graphicProviderObject = xMCF.createInstanceWithContext("com.sun.star.graphic.GraphicProvider", xComponentContext); xGraphicProvider = (XGraphicProvider) UnoRuntime.queryInterface(XGraphicProvider.class, graphicProviderObject); } catch (com.sun.star.uno.Exception ex) { System.err.println("Failed to get XGraphicProvider object"); xGraphicProvider = null; } epsCleaner = new EPSCleaner(); } public boolean supportsConversion(String sSourceMime, String sTargetMime, boolean bCrop, boolean bResize) { // We don't support cropping and resizing if (bCrop || bResize) { return false; } // We can convert vector formats to eps: if (MIMETypes.EPS.equals(sTargetMime) && (MIMETypes.WMF.equals(sSourceMime) && MIMETypes.SVM.equals(sSourceMime))) { return true; } // And we can convert all formats to bitmaps boolean bSupportsSource = MIMETypes.PNG.equals(sSourceMime) || MIMETypes.JPEG.equals(sSourceMime) || MIMETypes.GIF.equals(sSourceMime) || MIMETypes.TIFF.equals(sSourceMime) || MIMETypes.BMP.equals(sSourceMime) || MIMETypes.WMF.equals(sSourceMime) || MIMETypes.SVM.equals(sSourceMime); boolean bSupportsTarget = MIMETypes.PNG.equals(sTargetMime) || MIMETypes.JPEG.equals(sTargetMime) || MIMETypes.GIF.equals(sTargetMime) || MIMETypes.TIFF.equals(sTargetMime) || MIMETypes.BMP.equals(sTargetMime); return bSupportsSource && bSupportsTarget; } public byte[] convert(byte[] source, String sSourceMime, String sTargetMime) { // It seems that the GraphicProvider can only create proper eps if // the source is a vector format, hence if (MIMETypes.EPS.equals(sTargetMime)) { if (!MIMETypes.WMF.equals(sSourceMime) && !MIMETypes.SVM.equals(sSourceMime)) { return null; } } ByteArrayToXInputStreamAdapter xSource = new ByteArrayToXInputStreamAdapter(source); ByteArrayXStream xTarget = new ByteArrayXStream(); try { // Read the source PropertyValue[] sourceProps = new PropertyValue[1]; sourceProps[0] = new PropertyValue(); sourceProps[0].Name = "InputStream"; sourceProps[0].Value = xSource; XGraphic result = xGraphicProvider.queryGraphic(sourceProps); // Store as new type PropertyValue[] targetProps = new PropertyValue[2]; targetProps[0] = new PropertyValue(); targetProps[0].Name = "MimeType"; targetProps[0].Value = sTargetMime; targetProps[1] = new PropertyValue(); targetProps[1].Name = "OutputStream"; targetProps[1].Value = xTarget; xGraphicProvider.storeGraphic(result,targetProps); // Close the output and return the result xTarget.closeOutput(); xTarget.flush(); if (MIMETypes.EPS.equals(sTargetMime)) { return epsCleaner.cleanEps(xTarget.getBuffer()); } else { return xTarget.getBuffer(); } } catch (com.sun.star.io.IOException e) { return null; } catch (com.sun.star.lang.IllegalArgumentException e) { return null; } catch (com.sun.star.lang.WrappedTargetException e) { return null; } catch (Throwable e) { return null; } } } 1.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/GraphicConverterImpl2.java000064400000000000000000000250511140165031200312340ustar00viewvcviewvc00000010000000/************************************************************************ * * GraphicConverterImpl2.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2009 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2009-03-08) * */ package org.openoffice.da.comp.w2lcommon.filter; import java.util.Hashtable; import com.sun.star.awt.Point; import com.sun.star.awt.Size; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.drawing.XDrawPage; import com.sun.star.drawing.XDrawPages; import com.sun.star.drawing.XDrawPagesSupplier; import com.sun.star.drawing.XShape; import com.sun.star.frame.XComponentLoader; import com.sun.star.frame.XStorable; import com.sun.star.lang.XComponent; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.uno.XComponentContext; import com.sun.star.uno.UnoRuntime; import com.sun.star.util.XRefreshable; import com.sun.star.lib.uno.adapter.ByteArrayToXInputStreamAdapter; import com.sun.star.lib.uno.adapter.XOutputStreamToByteArrayAdapter; import writer2latex.api.GraphicConverter; import writer2latex.api.MIMETypes; /** A GraphicConverter implementation which uses a hidden Draw document to * store the graphic, providing more control over the image than the * simple GraphicProvider implementation. */ public class GraphicConverterImpl2 implements GraphicConverter { private XComponentContext xComponentContext; private Hashtable importFilter; private Hashtable exportFilter; private EPSCleaner epsCleaner; public GraphicConverterImpl2(XComponentContext xComponentContext) { this.xComponentContext = xComponentContext; importFilter = new Hashtable(); importFilter.put(MIMETypes.BMP, "BMP - MS Windows"); //importFilter.put(MIMETypes.EMF, "EMF - MS Windows Metafile"); importFilter.put(MIMETypes.EPS, "EPS - Encapsulated PostScript"); importFilter.put(MIMETypes.GIF, "GIF - Graphics Interchange Format"); importFilter.put(MIMETypes.JPEG, "JPG - JPEG"); importFilter.put(MIMETypes.PNG, "PNG - Portable Network Graphic"); importFilter.put(MIMETypes.SVM, "SVM - StarView Metafile"); importFilter.put(MIMETypes.TIFF, "TIF - Tag Image File"); importFilter.put(MIMETypes.WMF, "WMF - MS Windows Metafile"); exportFilter = new Hashtable(); exportFilter.put(MIMETypes.BMP,"draw_bmp_Export"); //exportFilter.put(MIMETypes.EMF,"draw_emf_Export"); exportFilter.put(MIMETypes.EPS,"draw_eps_Export"); exportFilter.put(MIMETypes.GIF,"draw_gif_Export"); exportFilter.put(MIMETypes.JPEG,"draw_jpg_Export"); exportFilter.put(MIMETypes.PNG,"draw_png_Export"); //exportFilter.put(MIMETypes.SVG,"draw_svg_Export"); exportFilter.put(MIMETypes.SVM,"draw_svm_Export"); exportFilter.put(MIMETypes.TIFF,"draw_tif_Export"); exportFilter.put(MIMETypes.WMF,"draw_wmf_Export"); exportFilter.put(MIMETypes.PDF,"draw_pdf_Export"); epsCleaner = new EPSCleaner(); } public boolean supportsConversion(String sSourceMime, String sTargetMime, boolean bCrop, boolean bResize) { // We don't support cropping and resizing if (bCrop || bResize) { return false; } // We currently support conversion of bitmaps and svm into pdf and eps // Trying wmf causes an IllegalArgumentException "URL seems to be an unsupported one" // Seems to be an OOo bug; workaround: Use temporary files..?? boolean bSupportsSource = MIMETypes.SVM.equals(sSourceMime) || MIMETypes.PNG.equals(sSourceMime) || MIMETypes.JPEG.equals(sSourceMime) || MIMETypes.GIF.equals(sSourceMime) || MIMETypes.TIFF.equals(sSourceMime) || MIMETypes.BMP.equals(sSourceMime); // || MIMETypes.WMF.equals(sSourceMime) boolean bSupportsTarget = MIMETypes.PDF.equals(sTargetMime) || MIMETypes.EPS.equals(sTargetMime); return bSupportsSource && bSupportsTarget; } public byte[] convert(byte[] source, String sSourceMime, String sTargetMime) { // Open a hidden sdraw document XMultiComponentFactory xMCF = xComponentContext.getServiceManager(); try { // Load the graphic into a new draw document as xDocument // using a named filter Object desktop = xMCF.createInstanceWithContext( "com.sun.star.frame.Desktop", xComponentContext); XComponentLoader xComponentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, desktop); PropertyValue[] fileProps = new PropertyValue[3]; fileProps[0] = new PropertyValue(); fileProps[0].Name = "FilterName"; fileProps[0].Value = (String) importFilter.get(sSourceMime); fileProps[1] = new PropertyValue(); fileProps[1].Name = "InputStream"; fileProps[1].Value = new ByteArrayToXInputStreamAdapter(source); fileProps[2] = new PropertyValue(); fileProps[2].Name = "Hidden"; fileProps[2].Value = new Boolean(true); XComponent xDocument = xComponentLoader.loadComponentFromURL( "private:stream", "_blank", 0, fileProps); // Get the first draw page as xDrawPage XDrawPagesSupplier xDrawPagesSupplier = (XDrawPagesSupplier) UnoRuntime.queryInterface(XDrawPagesSupplier.class, xDocument); XDrawPages xDrawPages = xDrawPagesSupplier.getDrawPages(); Object drawPage = xDrawPages.getByIndex(0); XDrawPage xDrawPage = (XDrawPage) UnoRuntime.queryInterface( XDrawPage.class, drawPage); // Get the shape as xShape Object shape = xDrawPage.getByIndex(0); XShape xShape = (XShape) UnoRuntime.queryInterface(XShape.class, shape); // Move the shape to upper left corner of the page Point position = new Point(); position.X = 0; position.Y = 0; xShape.setPosition(position); // Adjust the page size and margin to the size of the graphic XPropertySet xPageProps = (XPropertySet) UnoRuntime.queryInterface( XPropertySet.class, xDrawPage); Size size = xShape.getSize(); xPageProps.setPropertyValue("Width", new Integer(size.Width)); xPageProps.setPropertyValue("Height", new Integer(size.Height)); xPageProps.setPropertyValue("BorderTop", new Integer(0)); xPageProps.setPropertyValue("BorderBottom", new Integer(0)); xPageProps.setPropertyValue("BorderLeft", new Integer(0)); xPageProps.setPropertyValue("BorderRight", new Integer(0)); // Export the draw document (xDocument) refreshDocument(xDocument); XOutputStreamToByteArrayAdapter outputStream = new XOutputStreamToByteArrayAdapter(); PropertyValue[] exportProps = new PropertyValue[3]; exportProps[0] = new PropertyValue(); exportProps[0].Name = "FilterName"; exportProps[0].Value = (String) exportFilter.get(sTargetMime); exportProps[1] = new PropertyValue(); exportProps[1].Name = "OutputStream"; exportProps[1].Value = outputStream; exportProps[2] = new PropertyValue(); exportProps[2].Name = "Overwrite"; exportProps[2].Value = new Boolean(true); XStorable xStore = (XStorable) UnoRuntime.queryInterface ( XStorable.class, xDocument); xStore.storeToURL ("private:stream", exportProps); outputStream.closeOutput(); byte[] result = outputStream.getBuffer(); xDocument.dispose(); if (MIMETypes.EPS.equals(sTargetMime)) { return epsCleaner.cleanEps(result); } else { return result; } } catch (com.sun.star.beans.PropertyVetoException e) { } catch (com.sun.star.beans.UnknownPropertyException e) { } catch (com.sun.star.io.IOException e) { } catch (com.sun.star.lang.IllegalArgumentException e) { } catch (com.sun.star.lang.IndexOutOfBoundsException e) { } catch (com.sun.star.lang.WrappedTargetException e) { } catch (com.sun.star.uno.Exception e) { } // Conversion failed, for whatever reason return null; } protected void refreshDocument(XComponent document) { XRefreshable refreshable = (XRefreshable) UnoRuntime.queryInterface(XRefreshable.class, document); if (refreshable != null) { refreshable.refresh(); } } /* Dim SelSize As New com.sun.star.awt.Size SelSize = oGraphic.Size oDrawGraphic.GraphicURL = oGraphic.GraphicURL oDrawGraphic.Size = SelSize oDrawPage.add(oDrawGraphic) oDrawGraphic.GraphicCrop = oGraphic.GraphicCrop oDrawPage.Width = oGraphic.Size.Width oDrawPage.Height = oGraphic.Size.Height Dim aFilterData (1) As new com.sun.star.beans.PropertyValue aFilterData(0).Name = "PixelWidth" ' aFilterData(0).Value = oDrawPage.Width/100 * iPixels / 25.40 aFilterData(1).Name = "PixelHeight" aFilterData(1).Value = oDrawPage.Height/100 * iPixels / 25.40 Export( oDrawPage, sURLImageResized , aFilterData() ) On error resume Next oDrawDoc.Close(True) On error goto 0 SUB Export( xObject, sFileUrl As String, aFilterData ) Dim xExporter As Object xExporter = createUnoService( "com.sun.star.drawing.GraphicExportFilter" ) xExporter.SetSourceDocument( xObject ) Dim aArgs (2) As new com.sun.star.beans.PropertyValue 'sFileURL = ConvertToURL(sFileURL) aArgs(0).Name = "FilterName" aArgs(0).Value = "jpg" aArgs(1).Name = "URL" aArgs(1).Value = sFileURL 'print sFileURL aArgs(2).Name = "FilterData" aArgs(2).Value = aFilterData xExporter.filter( aArgs() ) END SUB*/ } 1.0.2/source/java/org/openoffice/da/comp/w2lcommon/filter/OptionsDialogBase.java000064400000000000000000000506151140165031200304350ustar00viewvcviewvc00000010000000/************************************************************************ * * OptionsDialogBase.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-10-14) * */ package org.openoffice.da.comp.w2lcommon.filter; import java.util.HashSet; import com.sun.star.awt.XDialogEventHandler; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertyAccess; import com.sun.star.beans.XPropertySet; import com.sun.star.container.XNameAccess; import com.sun.star.document.XDocumentInfoSupplier; import com.sun.star.frame.XDesktop; import com.sun.star.lang.XComponent; import com.sun.star.lang.IllegalArgumentException; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.XServiceName; import com.sun.star.lang.XTypeProvider; import com.sun.star.ui.dialogs.XExecutableDialog; import com.sun.star.uno.Type; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.util.XChangesBatch; import com.sun.star.util.XMacroExpander; import org.openoffice.da.comp.w2lcommon.helper.DialogBase; import org.openoffice.da.comp.w2lcommon.helper.PropertyHelper; /** This class provides an abstract uno component which implements a filter ui */ public abstract class OptionsDialogBase extends DialogBase implements XPropertyAccess { // Filter ui requires XExecutableDialog + XPropertyAccess ////////////////////////////////////////////////////////////////////////// // The subclass must override the following; and override the // implementation of XDialogEventHandler if needed /** Load settings from the registry to the dialog * The subclass must implement this */ protected abstract void loadSettings(XPropertySet xRegistryProps); /** Save settings from the dialog to the registry and create FilterData * The subclass must implement this */ protected abstract void saveSettings(XPropertySet xRegistryProps, PropertyHelper filterData); /** Return the name of the library containing the dialog */ public abstract String getDialogLibraryName(); /** Return the name of the dialog within the library */ public abstract String getDialogName(); /** Return the path to the options in the registry */ public abstract String getRegistryPath(); /** Create a new OptionsDialogBase */ public OptionsDialogBase(XComponentContext xContext) { super(xContext); this.xMSF = null; // must be set properly by subclass mediaProps = null; sConfigNames = null; lockedOptions = new HashSet(); } ////////////////////////////////////////////////////////////////////////// // Implement some methods required by DialogBase /** Initialize the dialog (eg. with settings from the registry) */ public void initialize() { try { // Prepare registry view Object view = getRegistryView(false); XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view); // Load settings using method from subclass loadSettings(xProps); // Dispose the registry view disposeRegistryView(view); } catch (com.sun.star.uno.Exception e) { // Failed to get registry view } } /** Finalize the dialog after execution (eg. save settings to the registry) */ public void finalize() { try { // Prepare registry view Object rwview = getRegistryView(true); XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,rwview); // Save settings and create FilterData using method from subclass PropertyHelper filterData = new PropertyHelper(); saveSettings(xProps, filterData); // Commit registry changes XChangesBatch xUpdateContext = (XChangesBatch) UnoRuntime.queryInterface(XChangesBatch.class,rwview); try { xUpdateContext.commitChanges(); } catch (Exception e) { // ignore } // Dispose the registry view disposeRegistryView(rwview); // Update the media properties with the FilterData PropertyHelper helper = new PropertyHelper(mediaProps); helper.put("FilterData",filterData.toArray()); mediaProps = helper.toArray(); } catch (com.sun.star.uno.Exception e) { // Failed to get registry view } } ////////////////////////////////////////////////////////////////////////// // Some private global variables // The service factory protected XMultiServiceFactory xMSF; // The media properties (set/get via XPropertyAccess implementation) private PropertyValue[] mediaProps; // Configuration names (stored during execution of dialog) private String[] sConfigNames; // Set of locked controls private HashSet lockedOptions; ////////////////////////////////////////////////////////////////////////// // Some private utility methods // Perform macro extansion private String expandMacros(String s) { if (s.startsWith("vnd.sun.star.expand:")) { // The string contains a macro, usually as a result of using %origin% in the registry s = s.substring(20); Object expander = xContext.getValueByName("/singletons/com.sun.star.util.theMacroExpander"); XMacroExpander xExpander = (XMacroExpander) UnoRuntime.queryInterface (XMacroExpander.class, expander); try { return xExpander.expandMacros(s); } catch (IllegalArgumentException e) { // Unknown macro name found, proceed and hope for the best return s; } } else { return s; } } // Get the template name from the document with ui focus private String getTemplateName() { try { // Get current component Object desktop = xContext.getServiceManager() .createInstanceWithContext("com.sun.star.frame.Desktop",xContext); XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(XDesktop.class,desktop); XComponent xComponent = xDesktop.getCurrentComponent(); // Get the document info property set XDocumentInfoSupplier xDocInfoSuppl = (XDocumentInfoSupplier) UnoRuntime.queryInterface(XDocumentInfoSupplier.class, xComponent); Object docInfo = xDocInfoSuppl.getDocumentInfo(); XPropertySet xDocInfo = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, docInfo); return getPropertyValueAsString(xDocInfo,"Template"); } catch (Exception e) { return ""; } } // Get a view of the options root in the registry private Object getRegistryView(boolean bUpdate) throws com.sun.star.uno.Exception { Object provider = xMSF.createInstance( "com.sun.star.configuration.ConfigurationProvider"); XMultiServiceFactory xProvider = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class,provider); PropertyValue[] args = new PropertyValue[1]; args[0] = new PropertyValue(); args[0].Name = "nodepath"; args[0].Value = getRegistryPath(); String sServiceName = bUpdate ? "com.sun.star.configuration.ConfigurationUpdateAccess" : "com.sun.star.configuration.ConfigurationAccess"; Object view = xProvider.createInstanceWithArguments(sServiceName,args); return view; } // Dispose a previously obtained registry view private void disposeRegistryView(Object view) { XComponent xComponent = (XComponent) UnoRuntime.queryInterface(XComponent.class,view); xComponent.dispose(); } ////////////////////////////////////////////////////////////////////////// // Implement uno interfaces // Override getTypes() from the interface XTypeProvider public Type[] getTypes() { Type[] typeReturn = {}; try { typeReturn = new Type[] { new Type( XServiceName.class ), new Type( XServiceInfo.class ), new Type( XTypeProvider.class ), new Type( XExecutableDialog.class ), new Type( XPropertyAccess.class ), new Type( XDialogEventHandler.class ) }; } catch(Exception exception) { } return typeReturn; } // Implement the interface XPropertyAccess public PropertyValue[] getPropertyValues() { return mediaProps; } public void setPropertyValues(PropertyValue[] props) { mediaProps = props; } ////////////////////////////////////////////////////////////////////////// // Various utility methods to be used by the sublasses // Helpers to load and save settings protected void updateLockedOptions() { lockedOptions.clear(); short nItem = getListBoxSelectedItem("Config"); int nStdConfigs = getListBoxStringItemList("Config").length - sConfigNames.length; if (nItem>=nStdConfigs) { // Get current configuration name String sName = sConfigNames[nItem-nStdConfigs]; try { // Prepare registry view Object view = getRegistryView(false); XPropertySet xProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,view); // Get the available configurations Object configurations = getPropertyValue(xProps,"Configurations"); XNameAccess xConfigurations = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class,configurations); // Get the LockedOptions node from the desired configuration String sLockedOptions = ""; Object config = xConfigurations.getByName(sName); XPropertySet xCfgProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,config); sLockedOptions = getPropertyValueAsString(xCfgProps,"LockedOptions"); // Dispose the registry view disposeRegistryView(view); // Feed lockedOptions with the comma separated list of options int nStart = 0; for (int i=0; i=nStdConfigs) { // only handle registry configurations int i = nConfig-nStdConfigs; try { Object config = xNameAccess.getByName(sConfigNames[i]); XPropertySet xCfgProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class,config); filterData.put("ConfigURL",expandMacros(getPropertyValueAsString(xCfgProps,"ConfigURL"))); filterData.put("TemplateURL",expandMacros(getPropertyValueAsString(xCfgProps,"TargetTemplateURL"))); setPropertyValue(xProps,"ConfigName",sConfigNames[i]); bFound = true; } catch (Exception e) { } } setPropertyValue(xProps,"Config",nConfig); if (!bFound) { setPropertyValue(xProps,"ConfigName",""); } return nConfig; } // Check box option (boolean) protected boolean loadCheckBoxOption(XPropertySet xProps, String sName) { boolean bValue = getPropertyValueAsBoolean(xProps,sName); setCheckBoxStateAsBoolean(sName, bValue); return bValue; } protected boolean saveCheckBoxOption(XPropertySet xProps, String sName) { boolean bValue = getCheckBoxStateAsBoolean(sName); setPropertyValue(xProps, sName, bValue); return bValue; } protected boolean saveCheckBoxOption(XPropertySet xProps, PropertyHelper filterData, String sName, String sOptionName) { boolean bValue = saveCheckBoxOption(xProps, sName); if (!isLocked(sOptionName)) { filterData.put(sOptionName, Boolean.toString(bValue)); } return bValue; } // List box option protected short loadListBoxOption(XPropertySet xProps, String sName) { short nValue = getPropertyValueAsShort(xProps, sName); setListBoxSelectedItem(sName ,nValue); return nValue; } protected short saveListBoxOption(XPropertySet xProps, String sName) { short nValue = getListBoxSelectedItem(sName); setPropertyValue(xProps, sName, nValue); return nValue; } protected short saveListBoxOption(XPropertySet xProps, PropertyHelper filterData, String sName, String sOptionName, String[] sValues) { short nValue = saveListBoxOption(xProps, sName); if (!isLocked(sOptionName) && (nValue>=0) && (nValuePropertyValue array */ public class PropertyHelper { private Hashtable data; public PropertyHelper() { data = new Hashtable(); } public PropertyHelper(PropertyValue[] props) { data = new Hashtable(); int nLen = props.length; for (int i=0; iJavaLoader * * @return returns a XSingleServiceFactory for creating the * component * * @param implName the name of the implementation for which a * service is desired * @param multiFactory the service manager to be used if needed * @param regKey the registryKey * * @see com.sun.star.comp.loader.JavaLoader */ public static XSingleServiceFactory __getServiceFactory(String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey) { xMultiServiceFactory = multiFactory; XSingleServiceFactory xSingleServiceFactory = null; if (implName.equals(W2LExportFilter.class.getName()) ) { xSingleServiceFactory = FactoryHelper.getServiceFactory(W2LExportFilter.class, W2LExportFilter.__serviceName, multiFactory, regKey); } else if (implName.equals(LaTeXOptionsDialog.__implementationName)) { xSingleServiceFactory = FactoryHelper.getServiceFactory(LaTeXOptionsDialog.class, LaTeXOptionsDialog.__serviceName, multiFactory, regKey); } else if (implName.equals(W2LStarMathConverter.__implementationName)) { xSingleServiceFactory = FactoryHelper.getServiceFactory(W2LStarMathConverter.class, W2LStarMathConverter.__serviceName, multiFactory, regKey); } return xSingleServiceFactory; } /** * Writes the service information into the given registry key. * This method is called by the JavaLoader *

* @return returns true if the operation succeeded * @param regKey the registryKey * @see com.sun.star.comp.loader.JavaLoader */ public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) { return FactoryHelper.writeRegistryServiceInfo(W2LExportFilter.__implementationName, W2LExportFilter.__serviceName, regKey) & FactoryHelper.writeRegistryServiceInfo(LaTeXOptionsDialog.__implementationName, LaTeXOptionsDialog.__serviceName, regKey) & FactoryHelper.writeRegistryServiceInfo(W2LStarMathConverter.__implementationName, W2LStarMathConverter.__serviceName, regKey); } } 1.0.2/source/java/org/openoffice/da/comp/writer2latex/W2LStarMathConverter.java000064400000000000000000000075141140165031200302610ustar00viewvcviewvc00000010000000/************************************************************************ * * W2LStarMathConverter.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. */ // Version 1.0 (2008-11-22) package org.openoffice.da.comp.writer2latex; import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.XTypeProvider; import com.sun.star.uno.Type; //import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; import com.sun.star.lang.XServiceName; import writer2latex.api.ConverterFactory; import writer2latex.api.StarMathConverter; // Import interface as defined in uno idl import org.openoffice.da.writer2latex.XW2LStarMathConverter; /** This class provides a uno component which implements the interface * org.openoffice.da.writer2latex.XW2LConverter */ public class W2LStarMathConverter implements XW2LStarMathConverter, XServiceName, XServiceInfo, XTypeProvider { /** The component will be registered under this name. */ public static final String __serviceName = "org.openoffice.da.writer2latex.W2LStarMathConverter"; public static final String __implementationName = "org.openoffice.da.comp.writer2latex.W2LStarMathConverter"; //private static XComponentContext xComponentContext = null; private static StarMathConverter starMathConverter; public W2LStarMathConverter(XComponentContext xComponentContext1) { starMathConverter = ConverterFactory.createStarMathConverter(); } // Implementation of XW2LConverter: public String convertFormula(String sStarMathFormula) { return starMathConverter.convert(sStarMathFormula); } public String getPreamble() { return starMathConverter.getPreamble(); } // Implement methods from interface XTypeProvider // Implementation of XTypeProvider public com.sun.star.uno.Type[] getTypes() { Type[] typeReturn = {}; try { typeReturn = new Type[] { new Type( XW2LStarMathConverter.class ), new Type( XTypeProvider.class ), new Type( XServiceName.class ), new Type( XServiceInfo.class ) }; } catch( Exception exception ) { } return( typeReturn ); } public byte[] getImplementationId() { byte[] byteReturn = {}; byteReturn = new String( "" + this.hashCode() ).getBytes(); return( byteReturn ); } // Implement method from interface XServiceName public String getServiceName() { return( __serviceName ); } // Implement methods from interface XServiceInfo public boolean supportsService(String stringServiceName) { return( stringServiceName.equals( __serviceName ) ); } public String getImplementationName() { return( __implementationName ); } public String[] getSupportedServiceNames() { String[] stringSupportedServiceNames = { __serviceName }; return( stringSupportedServiceNames ); } } 1.0.2/source/java/org/openoffice/da/comp/writer2xhtml/000075500000000000000000000000001140165031200234665ustar00viewvcviewvc000000100000001.0.2/source/java/org/openoffice/da/comp/writer2xhtml/BatchConverter.java000064400000000000000000000473111140165031200272500ustar00viewvcviewvc00000010000000/************************************************************************ * * BatchConverter.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2009 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2009-02-16) * */ package org.openoffice.da.comp.writer2xhtml; import java.io.IOException; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter; import com.sun.star.lib.uno.adapter.XOutputStreamToOutputStreamAdapter; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.UnknownPropertyException; import com.sun.star.beans.XPropertySet; import com.sun.star.document.XDocumentInfoSupplier; import com.sun.star.frame.XComponentLoader; import com.sun.star.frame.XStorable; import com.sun.star.io.NotConnectedException; import com.sun.star.io.XInputStream; import com.sun.star.io.XOutputStream; import com.sun.star.lang.WrappedTargetException; import com.sun.star.lang.XComponent; import com.sun.star.lang.XServiceInfo; import com.sun.star.lang.XServiceName; import com.sun.star.lang.XTypeProvider; import com.sun.star.sheet.XSpreadsheetDocument; import com.sun.star.text.XTextDocument; import com.sun.star.ucb.CommandAbortedException; import com.sun.star.ucb.XSimpleFileAccess2; import com.sun.star.uno.AnyConverter; import com.sun.star.uno.Type; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext; //import writer2latex.api.BatchConverter; //import writer2latex.api.BatchHandler; //import writer2latex.api.Converter; import writer2latex.api.ConverterFactory; import writer2latex.api.IndexPageEntry; import writer2latex.api.MIMETypes; import writer2latex.api.OutputFile; // Import interfaces as defined in uno idl import org.openoffice.da.writer2xhtml.XBatchConverter; import org.openoffice.da.writer2xhtml.XBatchHandler; import org.openoffice.da.comp.w2lcommon.helper.PropertyHelper; /** This class provides a uno component which implements the interface * org.openoffice.da.writer2xhtml.XBatchConverter */ public class BatchConverter implements XBatchConverter, XServiceName, XServiceInfo, XTypeProvider { /** The component will be registered under this name. */ public static final String __serviceName = "org.openoffice.da.writer2xhtml.BatchConverter"; public static final String __implementationName = "org.openoffice.da.comp.writer2xhtml.BatchConverter"; private XComponentContext xComponentContext = null; private XSimpleFileAccess2 sfa2 = null; private writer2latex.api.BatchConverter batchConverter = null; private XBatchHandler handler; // Based on convert arguments private boolean bRecurse = true; private String sWriterFilterName = "org.openoffice.da.writer2xhtml"; private Object writerFilterData = null; private String sCalcFilterName = "org.openoffice.da.calc2xhtml"; private Object calcFilterData = null; private boolean bIncludePdf = true; private boolean bIncludeOriginal = false; private boolean bUseTitle = true; private boolean bUseDescription = true; private String sUplink = ""; private String sDirectoryIcon = ""; private String sDocumentIcon = ""; private String sTemplateURL = null; public BatchConverter(XComponentContext xComponentContext) { this.xComponentContext = xComponentContext; // Get the SimpleFileAccess service try { Object sfaObject = xComponentContext.getServiceManager().createInstanceWithContext( "com.sun.star.ucb.SimpleFileAccess", xComponentContext); sfa2 = (XSimpleFileAccess2) UnoRuntime.queryInterface(XSimpleFileAccess2.class, sfaObject); } catch (com.sun.star.uno.Exception e) { // failed to get SimpleFileAccess service (should not happen) } } // Helper: Get a string from an any private String getValue(Object any) { if (AnyConverter.isString(any)) { try { return AnyConverter.toString(any); } catch (com.sun.star.lang.IllegalArgumentException e) { return ""; } } else { return ""; } } // Implementation of XBatchConverter: public void convert(String sSourceURL, String sTargetURL, PropertyValue[] lArguments, XBatchHandler handler) { // Create batch converter (currently we don't need to set a converter) batchConverter = ConverterFactory.createBatchConverter(MIMETypes.XHTML); this.handler = handler; // Read the arguments int nSize = lArguments.length; for (int i=0; i0) { entry.setDisplayName(sLoadedTitle); } } Object loadedDescription = infoProps.getPropertyValue("Description"); if (AnyConverter.isString(loadedDescription)) { String sLoadedDescription = AnyConverter.toString(loadedDescription); if (bUseDescription && sLoadedDescription.length()>0) { entry.setDescription(sLoadedDescription); } } } catch (UnknownPropertyException e) { } catch (WrappedTargetException e) { } catch (com.sun.star.lang.IllegalArgumentException e) { } } // Determine the type of the component boolean bText = false; boolean bSpreadsheet = false; if (UnoRuntime.queryInterface(XTextDocument.class, xDocument)!=null) { bText=true; } else if (UnoRuntime.queryInterface(XSpreadsheetDocument.class, xDocument)!=null) { bSpreadsheet=true; } if (!bText && !bSpreadsheet) { handler.endFile(sSourceFileURL,false); xDocument.dispose(); return null; } // Convert using requested filter boolean bHtmlSuccess = true; PropertyHelper exportProps = new PropertyHelper(); exportProps.put("FilterName", bText ? sWriterFilterName : sCalcFilterName); exportProps.put("Overwrite", new Boolean(true)); if (bText && writerFilterData!=null) { exportProps.put("FilterData", writerFilterData); } if (bSpreadsheet && calcFilterData!=null) { exportProps.put("FilterData", calcFilterData); } try { XStorable xStore = (XStorable) UnoRuntime.queryInterface (XStorable.class, xDocument); xStore.storeToURL (sTargetFileURL, exportProps.toArray()); } catch (com.sun.star.io.IOException e) { // Failed to convert; continue anyway, but don't link to the file name entry.setFile(null); bHtmlSuccess = false; } // Convet to pdf if requested boolean bPdfSuccess = true; if (bIncludePdf) { PropertyValue[] pdfProps = new PropertyValue[2]; pdfProps[0] = new PropertyValue(); pdfProps[0].Name = "FilterName"; pdfProps[0].Value = bText ? "writer_pdf_Export" : "calc_pdf_Export"; pdfProps[1] = new PropertyValue(); pdfProps[1].Name = "Overwrite"; pdfProps[1].Value = new Boolean(true); String sPdfFileURL = ensureSlash(sTargetURL) + getBaseName(sSourceFileURL) + ".pdf"; try { XStorable xStore = (XStorable) UnoRuntime.queryInterface (XStorable.class, xDocument); xStore.storeToURL (sPdfFileURL, pdfProps); entry.setPdfFile(sPdfFileURL); } catch (com.sun.star.io.IOException e) { // Not critical, continue without pdf bPdfSuccess = false; } } xDocument.dispose(); // Include original document if required if (bIncludeOriginal) { // TODO } // Report a failure to the user if either of the exports failed handler.endFile(sSourceFileURL,bHtmlSuccess && bPdfSuccess); // But return the index entry even if only one succeded if (bHtmlSuccess || bPdfSuccess) { return entry; } else { return null; } } private String getName(String sURL) { int n = sURL.lastIndexOf("/"); return n>-1 ? sURL.substring(n+1) : sURL; } private String getBaseName(String sURL) { String sName = getName(sURL); int n = sName.lastIndexOf("."); return n>-1 ? sName.substring(0,n) : sName; } private String ensureSlash(String sURL) { return sURL.endsWith("/") ? sURL : sURL+"/"; } private String decodeURL(String sURL) { try { return new URI(sURL).getPath(); } catch (URISyntaxException e) { return sURL; } } // Implement methods from interface XTypeProvider public com.sun.star.uno.Type[] getTypes() { Type[] typeReturn = {}; try { typeReturn = new Type[] { new Type( XBatchConverter.class ), new Type( XTypeProvider.class ), new Type( XServiceName.class ), new Type( XServiceInfo.class ) }; } catch( Exception exception ) { } return( typeReturn ); } public byte[] getImplementationId() { byte[] byteReturn = {}; byteReturn = new String( "" + this.hashCode() ).getBytes(); return( byteReturn ); } // Implement method from interface XServiceName public String getServiceName() { return( __serviceName ); } // Implement methods from interface XServiceInfo public boolean supportsService(String stringServiceName) { return( stringServiceName.equals( __serviceName ) ); } public String getImplementationName() { return( __implementationName ); } public String[] getSupportedServiceNames() { String[] stringSupportedServiceNames = { __serviceName }; return( stringSupportedServiceNames ); } } 1.0.2/source/java/org/openoffice/da/comp/writer2xhtml/BatchHandlerAdapter.java000064400000000000000000000041011140165031200301450ustar00viewvcviewvc00000010000000/************************************************************************ * * BatchHandlerAdapter.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-10-05) * */ package org.openoffice.da.comp.writer2xhtml; import writer2latex.api.BatchHandler; import org.openoffice.da.writer2xhtml.XBatchHandler; /** The uno interface provides an XBatchHandler implementation, the java * interface requires a BatchHandler implementation. This simple class * implements the latter using an instance of the former. */ public class BatchHandlerAdapter implements BatchHandler { private XBatchHandler unoHandler; public BatchHandlerAdapter(XBatchHandler unoHandler) { this.unoHandler = unoHandler; } public void startConversion() { unoHandler.startConversion(); } public void endConversion() { unoHandler.endConversion(); } public void startDirectory(String sName) { unoHandler.startDirectory(sName); } public void endDirectory(String sName, boolean bSuccess) { unoHandler.endDirectory(sName, bSuccess); } public void startFile(String sName) { unoHandler.startFile(sName); } public void endFile(String sName, boolean bSuccess) { unoHandler.endFile(sName, bSuccess); } public boolean cancel() { return unoHandler.cancel(); } } 1.0.2/source/java/org/openoffice/da/comp/writer2xhtml/W2XExportFilter.java000064400000000000000000000033601140165031200273230ustar00viewvcviewvc00000010000000/************************************************************************ * * W2XExportFilter.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-07-21) * */ package org.openoffice.da.comp.writer2xhtml; import com.sun.star.uno.XComponentContext; import org.openoffice.da.comp.w2lcommon.filter.ExportFilterBase; /** This class implements the xhtml export filter component */ public class W2XExportFilter extends ExportFilterBase { /** Service name for the component */ public static final String __serviceName = "org.openoffice.da.comp.writer2xhtml.W2XExportFilter"; /** Implementation name for the component */ public static final String __implementationName = "org.openoffice.da.comp.writer2xhtml.W2XExportFilter"; /** Filter name to include in error messages */ public static final String __displayName = "Writer2xhtml"; public W2XExportFilter(XComponentContext xComponentContext1) { super(xComponentContext1); xMSF = W2XRegistration.xMultiServiceFactory; } } 1.0.2/source/java/org/openoffice/da/comp/writer2xhtml/W2XRegistration.java000064400000000000000000000116531140165031200273520ustar00viewvcviewvc00000010000000/************************************************************************ * * W2XRegistration.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-10-04) * */ package org.openoffice.da.comp.writer2xhtml; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.lang.XSingleServiceFactory; import com.sun.star.registry.XRegistryKey; import com.sun.star.comp.loader.FactoryHelper; /** This class provides a static method to instantiate our uno components * on demand (__getServiceFactory()), and a static method to give * information about the components (__writeRegistryServiceInfo()). * Furthermore, it saves the XMultiServiceFactory provided to the * __getServiceFactory method for future reference by the componentes. */ public class W2XRegistration { public static XMultiServiceFactory xMultiServiceFactory; /** * Returns a factory for creating the service. * This method is called by the JavaLoader * * @return returns a XSingleServiceFactory for creating the * component * * @param implName the name of the implementation for which a * service is desired * @param multiFactory the service manager to be used if needed * @param regKey the registryKey * * @see com.sun.star.comp.loader.JavaLoader */ public static XSingleServiceFactory __getServiceFactory(String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey) { xMultiServiceFactory = multiFactory; XSingleServiceFactory xSingleServiceFactory = null; if (implName.equals(W2XExportFilter.class.getName()) ) { xSingleServiceFactory = FactoryHelper.getServiceFactory(W2XExportFilter.class, W2XExportFilter.__serviceName, multiFactory, regKey); } else if (implName.equals(BatchConverter.__implementationName) ) { xSingleServiceFactory = FactoryHelper.getServiceFactory(BatchConverter.class, BatchConverter.__serviceName, multiFactory, regKey); } else if (implName.equals(XhtmlOptionsDialog.__implementationName)) { xSingleServiceFactory = FactoryHelper.getServiceFactory(XhtmlOptionsDialog.class, XhtmlOptionsDialog.__serviceName, multiFactory, regKey); } else if (implName.equals(XhtmlOptionsDialogXsl.__implementationName)) { xSingleServiceFactory = FactoryHelper.getServiceFactory(XhtmlOptionsDialogXsl.class, XhtmlOptionsDialogXsl.__serviceName, multiFactory, regKey); } else if (implName.equals(XhtmlOptionsDialogCalc.__implementationName)) { xSingleServiceFactory = FactoryHelper.getServiceFactory(XhtmlOptionsDialogCalc.class, XhtmlOptionsDialogCalc.__serviceName, multiFactory, regKey); } return xSingleServiceFactory; } /** * Writes the service information into the given registry key. * This method is called by the JavaLoader *

* @return returns true if the operation succeeded * @param regKey the registryKey * @see com.sun.star.comp.loader.JavaLoader */ public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) { return FactoryHelper.writeRegistryServiceInfo(BatchConverter.__implementationName, BatchConverter.__serviceName, regKey) & FactoryHelper.writeRegistryServiceInfo(W2XExportFilter.__implementationName, W2XExportFilter.__serviceName, regKey) & FactoryHelper.writeRegistryServiceInfo(XhtmlOptionsDialog.__implementationName, XhtmlOptionsDialog.__serviceName, regKey) & FactoryHelper.writeRegistryServiceInfo(XhtmlOptionsDialogXsl.__implementationName, XhtmlOptionsDialogXsl.__serviceName, regKey) & FactoryHelper.writeRegistryServiceInfo(XhtmlOptionsDialogCalc.__implementationName, XhtmlOptionsDialogCalc.__serviceName, regKey); } } 1.0.2/source/java/org/openoffice/da/comp/writer2xhtml/XhtmlOptionsDialog.java000064400000000000000000000204631140165031200301260ustar00viewvcviewvc00000010000000/************************************************************************ * * XhtmlOptionsDialog.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-11-16) * */ package org.openoffice.da.comp.writer2xhtml; import com.sun.star.awt.XDialog; import com.sun.star.beans.XPropertySet; import com.sun.star.uno.XComponentContext; import org.openoffice.da.comp.w2lcommon.helper.PropertyHelper; import org.openoffice.da.comp.w2lcommon.filter.OptionsDialogBase; /** This class provides a uno component which implements a filter ui for the * Xhtml export */ public class XhtmlOptionsDialog extends OptionsDialogBase { /** The component will be registered under this name. */ public static String __serviceName = "org.openoffice.da.writer2xhtml.XhtmlOptionsDialog"; /** The component should also have an implementation name. */ public static String __implementationName = "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialog"; public String getDialogLibraryName() { return "W2XDialogs"; } /** Return the name of the dialog within the library */ public String getDialogName() { return "XhtmlOptions"; } /** Return the name of the registry path */ public String getRegistryPath() { return "/org.openoffice.da.Writer2xhtml.Options/XhtmlOptions"; } /** Create a new XhtmlOptionsDialog */ public XhtmlOptionsDialog(XComponentContext xContext) { super(xContext); xMSF = W2XRegistration.xMultiServiceFactory; } /** Load settings from the registry to the dialog */ protected void loadSettings(XPropertySet xProps) { // Style loadConfig(xProps); loadCheckBoxOption(xProps, "ConvertToPx"); loadNumericOption(xProps, "Scaling"); loadNumericOption(xProps, "ColumnScaling"); loadCheckBoxOption(xProps, "OriginalImageSize"); // Special content loadCheckBoxOption(xProps, "Notes"); loadCheckBoxOption(xProps, "UseDublinCore"); // AutoCorrect loadCheckBoxOption(xProps, "IgnoreHardLineBreaks"); loadCheckBoxOption(xProps, "IgnoreEmptyParagraphs"); loadCheckBoxOption(xProps, "IgnoreDoubleSpaces"); // Files loadCheckBoxOption(xProps, "Split"); loadListBoxOption(xProps, "SplitLevel"); loadListBoxOption(xProps, "RepeatLevels"); loadCheckBoxOption(xProps, "SaveImagesInSubdir"); loadTextFieldOption(xProps, "XsltPath"); updateLockedOptions(); enableControls(); } /** Save settings from the dialog to the registry and create FilterData */ protected void saveSettings(XPropertySet xProps, PropertyHelper helper) { // Style short nConfig = saveConfig(xProps, helper); String[] sCoreStyles = { "Chocolate", "Midnight", "Modernist", "Oldstyle", "Steely", "Swiss", "Traditional", "Ultramarine" }; switch (nConfig) { case 0: helper.put("ConfigURL","*default.xml"); break; case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: helper.put("ConfigURL","*cleanxhtml.xml"); helper.put("custom_stylesheet", "http://www.w3.org/StyleSheets/Core/"+sCoreStyles[nConfig-1]); break; case 9: helper.put("ConfigURL","$(user)/writer2xhtml.xml"); helper.put("AutoCreate","true"); } saveCheckBoxOption(xProps, helper, "ConvertToPx", "convert_to_px"); saveNumericOptionAsPercentage(xProps, helper, "Scaling", "scaling"); saveNumericOptionAsPercentage(xProps, helper, "ColumnScaling", "column_scaling"); saveCheckBoxOption(xProps, helper, "OriginalImageSize", "original_image_size"); // Special content saveCheckBoxOption(xProps, helper, "Notes", "notes"); saveCheckBoxOption(xProps, helper, "UseDublinCore", "use_dublin_core"); // AutoCorrect saveCheckBoxOption(xProps, helper, "IgnoreHardLineBreaks", "ignore_hard_line_breaks"); saveCheckBoxOption(xProps, helper, "IgnoreEmptyParagraphs", "ignore_empty_paragraphs"); saveCheckBoxOption(xProps, helper, "IgnoreDoubleSpaces", "ignore_double_spaces"); // Files boolean bSplit = saveCheckBoxOption(xProps, "Split"); short nSplitLevel = saveListBoxOption(xProps, "SplitLevel"); short nRepeatLevels = saveListBoxOption(xProps, "RepeatLevels"); if (!isLocked("split_level")) { if (bSplit) { helper.put("split_level",Integer.toString(nSplitLevel+1)); helper.put("repeat_levels",Integer.toString(nRepeatLevels)); } else { helper.put("split_level","0"); } } saveCheckBoxOption(xProps, helper, "SaveImagesInSubdir", "save_images_in_subdir"); saveTextFieldOption(xProps, helper, "XsltPath", "xslt_path"); } // Implement XDialogEventHandler public boolean callHandlerMethod(XDialog xDialog, Object event, String sMethod) { if (sMethod.equals("ConfigChange")) { updateLockedOptions(); enableControls(); } else if (sMethod.equals("SplitChange")) { enableSplitLevel(); } return true; } public String[] getSupportedMethodNames() { String[] sNames = { "ConfigChange", "SplitChange" }; return sNames; } private void enableControls() { // Style setControlEnabled("ScalingLabel",!isLocked("scaling")); setControlEnabled("Scaling",!isLocked("scaling")); setControlEnabled("ColumnScalingLabel",!isLocked("column_scaling")); setControlEnabled("ColumnScaling",!isLocked("column_scaling")); setControlEnabled("ConvertToPx",!isLocked("convert_to_px")); setControlEnabled("OriginalImageSize",!isLocked("original_image_size")); // Special content setControlEnabled("Notes",!isLocked("notes")); setControlEnabled("UseDublinCore",!isLocked("use_dublin_core")); // AutoCorrect setControlEnabled("IgnoreHardLineBreaks",!isLocked("ignore_hard_line_breaks")); setControlEnabled("IgnoreEmptyParagraphs",!isLocked("ignore_empty_paragraphs")); setControlEnabled("IgnoreDoubleSpaces",!isLocked("ignore_double_spaces")); // Files boolean bSplit = getCheckBoxStateAsBoolean("Split"); setControlEnabled("Split",!isLocked("split_level")); setControlEnabled("SplitLevelLabel",!isLocked("split_level") && bSplit); setControlEnabled("SplitLevel",!isLocked("split_level") && bSplit); setControlEnabled("RepeatLevelsLabel",!isLocked("repeat_levels") && !isLocked("split_level") && bSplit); setControlEnabled("RepeatLevels",!isLocked("repeat_levels") && !isLocked("split_level") && bSplit); setControlEnabled("SaveImagesInSubdir",!isLocked("save_images_in_subdir")); setControlEnabled("XsltPathLabel",(this instanceof XhtmlOptionsDialogXsl) && !isLocked("xslt_path")); setControlEnabled("XsltPath",(this instanceof XhtmlOptionsDialogXsl) && !isLocked("xslt_path")); } private void enableSplitLevel() { if (!isLocked("split_level")) { boolean bState = getCheckBoxStateAsBoolean("Split"); setControlEnabled("SplitLevelLabel",bState); setControlEnabled("SplitLevel",bState); if (!isLocked("repeat_levels")) { setControlEnabled("RepeatLevelsLabel",bState); setControlEnabled("RepeatLevels",bState); } } } } 1.0.2/source/java/org/openoffice/da/comp/writer2xhtml/XhtmlOptionsDialogCalc.java000064400000000000000000000153251140165031200307120ustar00viewvcviewvc00000010000000/************************************************************************ * * XhtmlOptionsDialogCalc.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2009 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2009-02-18) * */ package org.openoffice.da.comp.writer2xhtml; import com.sun.star.awt.XDialog; import com.sun.star.beans.XPropertySet; import com.sun.star.uno.XComponentContext; import org.openoffice.da.comp.w2lcommon.helper.PropertyHelper; import org.openoffice.da.comp.w2lcommon.filter.OptionsDialogBase; /** This class provides a uno component which implements a filter ui for the * Xhtml export in Calc */ public class XhtmlOptionsDialogCalc extends OptionsDialogBase { /** The component will be registered under this name. */ public static String __serviceName = "org.openoffice.da.writerxhtml.XhtmlOptionsDialogCalc"; /** The component should also have an implementation name. */ public static String __implementationName = "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialogCalc"; public String getDialogLibraryName() { return "W2XDialogs"; } /** Return the name of the dialog within the library */ public String getDialogName() { return "XhtmlOptionsCalc"; } /** Return the name of the registry path */ public String getRegistryPath() { return "/org.openoffice.da.Writer2xhtml.Options/XhtmlOptionsCalc"; } /** Create a new XhtmlOptionsDialogCalc */ public XhtmlOptionsDialogCalc(XComponentContext xContext) { super(xContext); xMSF = W2XRegistration.xMultiServiceFactory; } /** Load settings from the registry to the dialog */ protected void loadSettings(XPropertySet xProps) { // Style loadConfig(xProps); loadCheckBoxOption(xProps, "ConvertToPx"); loadNumericOption(xProps, "Scaling"); loadNumericOption(xProps, "ColumnScaling"); loadCheckBoxOption(xProps, "OriginalImageSize"); // Special content loadCheckBoxOption(xProps, "Notes"); loadCheckBoxOption(xProps, "UseDublinCore"); // Sheets loadCheckBoxOption(xProps, "DisplayHiddenSheets"); loadCheckBoxOption(xProps, "DisplayHiddenRowsCols"); loadCheckBoxOption(xProps, "DisplayFilteredRowsCols"); loadCheckBoxOption(xProps, "ApplyPrintRanges"); loadCheckBoxOption(xProps, "UseTitleAsHeading"); loadCheckBoxOption(xProps, "UseSheetNamesAsHeadings"); // Files loadCheckBoxOption(xProps, "CalcSplit"); loadCheckBoxOption(xProps, "SaveImagesInSubdir"); updateLockedOptions(); enableControls(); } /** Save settings from the dialog to the registry and create FilterData */ protected void saveSettings(XPropertySet xProps, PropertyHelper helper) { // Style short nConfig = saveConfig(xProps, helper); if (nConfig==0) { helper.put("ConfigURL","*default.xml"); } else if (nConfig==1) { helper.put("ConfigURL","$(user)/writer2xhtml.xml"); helper.put("AutoCreate","true"); } saveCheckBoxOption(xProps, helper, "ConvertToPx", "convert_to_px"); saveNumericOptionAsPercentage(xProps, helper, "Scaling", "scaling"); saveNumericOptionAsPercentage(xProps, helper, "ColumnScaling", "column_scaling"); saveCheckBoxOption(xProps, helper, "OriginalImageSize", "original_image_size"); // Special content saveCheckBoxOption(xProps, helper, "Notes", "notes"); saveCheckBoxOption(xProps, helper, "UseDublinCore", "use_dublin_core"); // Sheets saveCheckBoxOption(xProps, helper, "DisplayHiddenSheets", "display_hidden_sheets"); saveCheckBoxOption(xProps, helper, "DisplayHiddenRowsCols", "display_hidden_rows_cols"); saveCheckBoxOption(xProps, helper, "DisplayFilteredRowsCols", "display_filtered_rows_cols"); saveCheckBoxOption(xProps, helper, "ApplyPrintRanges", "apply_print_ranges"); saveCheckBoxOption(xProps, helper, "UseTitleAsHeading", "use_title_as_heading"); saveCheckBoxOption(xProps, helper, "UseSheetNamesAsHeadings", "use_sheet_names_as_headings"); // Files saveCheckBoxOption(xProps, helper, "CalcSplit", "calc_split"); saveCheckBoxOption(xProps, helper, "SaveImagesInSubdir", "save_images_in_subdir"); } // Implement XDialogEventHandler public boolean callHandlerMethod(XDialog xDialog, Object event, String sMethod) { if (sMethod.equals("ConfigChange")) { updateLockedOptions(); enableControls(); } return true; } public String[] getSupportedMethodNames() { String[] sNames = { "ConfigChange" }; return sNames; } private void enableControls() { // Style setControlEnabled("ConvertToPx",!isLocked("convert_to_px")); setControlEnabled("ScalingLabel",!isLocked("scaling")); setControlEnabled("Scaling",!isLocked("scaling")); setControlEnabled("ColumnScalingLabel",!isLocked("column_scaling")); setControlEnabled("ColumnScaling",!isLocked("column_scaling")); setControlEnabled("OriginalImageSize",!isLocked("original_image_size")); // Special content setControlEnabled("Notes",!isLocked("notes")); setControlEnabled("UseDublinCore",!isLocked("use_dublin_core")); // Sheets setControlEnabled("DisplayHiddenSheets", !isLocked("display_hidden_sheets")); setControlEnabled("DisplayHiddenRowsCols", !isLocked("display_hidden_rows_cols")); setControlEnabled("DisplayFilteredRowsCols", !isLocked("display_filtered_rows_cols")); setControlEnabled("ApplyPrintRanges", !isLocked("apply_print_ranges")); setControlEnabled("UseTitleAsHeading", !isLocked("use_title_as_heading")); setControlEnabled("UseSheetNamesAsHeadings", !isLocked("use_sheet_names_as_headings")); // Files setControlEnabled("CalcSplit",!isLocked("calc_split")); setControlEnabled("SaveImagesInSubdir",!isLocked("save_images_in_subdir")); } } 1.0.2/source/java/org/openoffice/da/comp/writer2xhtml/XhtmlOptionsDialogXsl.java000064400000000000000000000033051140165031200306110ustar00viewvcviewvc00000010000000/************************************************************************ * * XhtmlOptionsDialogXsl.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-09-11) * */ package org.openoffice.da.comp.writer2xhtml; import com.sun.star.uno.XComponentContext; /** This class provides a uno component which implements a filter ui for the * Xhtml export (xsl variant) * This variant of the dialog has the XsltPath setting enabled */ public class XhtmlOptionsDialogXsl extends XhtmlOptionsDialog { /** The component will be registered under this name. */ public static String __serviceName = "org.openoffice.da.writer2xhtml.XhtmlOptionsDialogXsl"; /** The component should also have an implementation name. */ public static String __implementationName = "org.openoffice.da.comp.writer2xhtml.XhtmlOptionsDialogXsl"; /** Create a new XhtmlOptionsDialogXsl */ public XhtmlOptionsDialogXsl(XComponentContext xContext) { super(xContext); } } 1.0.2/source/java/writer2latex/000075500000000000000000000000001140165031200172215ustar00viewvcviewvc000000100000001.0.2/source/java/writer2latex/Application.java000064400000000000000000000354061140165031200223370ustar00viewvcviewvc00000010000000/************************************************************************ * * Application.java * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Copyright: 2002-2008 by Henrik Just * * All Rights Reserved. * * Version 1.0 (2008-11-22) * */ package writer2latex; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; //import java.io.FileOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; import writer2latex.api.BatchConverter; import writer2latex.api.Converter; import writer2latex.api.ConverterFactory; import writer2latex.api.ConverterResult; import writer2latex.api.MIMETypes; //import writer2latex.api.OutputFile; import writer2latex.util.Misc; /** *

Commandline utility to convert an OpenOffice.org Writer XML file into XHTML/LaTeX/BibTeX

*

The utility is invoked with the following command line:

*
java -jar writer2latex.jar [options] source [target]
*

Where the available options are *

    *
  • -latex, -bibtex, -xhtml, -xhtml+mathml, -xhtml+mathml+xsl *
  • -recurse *
  • -ultraclean, -clean, -pdfscreen, * -pdfprint, -cleanxhtml *
  • -config[=]filename *
  • -template[=]filename *
  • -option[=]value *
*

where option can be any simple option known to Writer2LaTeX * (see documentation for the configuration file).

*/ public final class Application { /* Based on command-line parameters. */ private String sTargetMIME = MIMETypes.LATEX; private boolean bRecurse = false; private Vector configFileNames = new Vector(); private String sTemplateFileName = null; private Hashtable options = new Hashtable(); private String sSource = null; private String sTarget = null; /** * Main method * * @param args The argument passed on the command line. */ public static final void main (String[] args){ try { Application app = new Application(); app.parseCommandLine(args); app.doConversion(); } catch (IllegalArgumentException ex) { String msg = ex.getMessage(); showUsage(msg); } } // Convert the directory or file private void doConversion() { // Step 1: Say hello... String sOutputFormat; if (MIMETypes.LATEX.equals(sTargetMIME)) { sOutputFormat = "LaTeX"; } else if (MIMETypes.BIBTEX.equals(sTargetMIME)) { sOutputFormat = "BibTeX"; } else { sOutputFormat = "xhtml"; } System.out.println(); System.out.println("This is Writer2" + sOutputFormat + ", Version " + ConverterFactory.getVersion() + " (" + ConverterFactory.getDate() + ")"); System.out.println(); System.out.println("Starting conversion..."); // Step 2: Examine source File source = new File(sSource); if (!source.exists()) { System.out.println("I'm sorry, I can't find "+sSource); System.exit(1); } if (!source.canRead()) { System.out.println("I'm sorry, I can't read "+sSource); System.exit(1); } boolean bBatch = source.isDirectory(); // Step 3: Examine target File target; if (bBatch) { if (sTarget==null) { target=source; } else { target = new File(sTarget); } } else { if (sTarget==null) { target = new File(source.getParent(),Misc.removeExtension(source.getName())); } else { target = new File(sTarget); if (sTarget.endsWith(File.separator)) { target = new File(target,Misc.removeExtension(source.getName())); } } } // Step 4: Create converters Converter converter = ConverterFactory.createConverter(sTargetMIME); if (converter==null) { System.out.println("Failed to create converter for "+sTargetMIME); System.exit(1); } BatchConverter batchCv = null; if (bBatch) { batchCv = ConverterFactory.createBatchConverter(MIMETypes.XHTML); if (batchCv==null) { System.out.println("Failed to create batch converter"); System.exit(1); } batchCv.setConverter(converter); } // Step 5: Read template if (sTemplateFileName!=null) { try { System.out.println("Reading template "+sTemplateFileName); byte [] templateBytes = Misc.inputStreamToByteArray(new FileInputStream(sTemplateFileName)); converter.readTemplate(new ByteArrayInputStream(templateBytes)); if (batchCv!=null) { // Currently we use the same template for the directory and the files batchCv.readTemplate(new ByteArrayInputStream(templateBytes)); } } catch (FileNotFoundException e) { System.out.println("--> This file does not exist!"); System.out.println(" "+e.getMessage()); } catch (IOException e) { System.out.println("--> Failed to read the template file!"); System.out.println(" "+e.getMessage()); } } // Step 6: Read config for (int i=0; i This configuration is unknown!"); System.out.println(" "+e.getMessage()); } } else { System.out.println("Reading configuration file "+sConfigFileName); try { byte[] configBytes = Misc.inputStreamToByteArray(new FileInputStream(sConfigFileName)); converter.getConfig().read(new ByteArrayInputStream(configBytes)); if (bBatch) { // Currently we use the same configuration for the directory and the files batchCv.getConfig().read(new ByteArrayInputStream(configBytes)); } } catch (IOException e) { System.err.println("--> Failed to read the configuration!"); System.out.println(" "+e.getMessage()); } } } // Step 7: Set options from command line Enumeration keys = options.keys(); while (keys.hasMoreElements()) { String sKey = (String) keys.nextElement(); String sValue = (String) options.get(sKey); converter.getConfig().setOption(sKey,sValue); if (batchCv!=null) { batchCv.getConfig().setOption(sKey,sValue); } } // Step 8: Perform conversion if (bBatch) { batchCv.convert(source,target,bRecurse, new BatchHandlerImpl()); } else { System.out.println("Converting "+source.getPath()); ConverterResult dataOut = null; try { dataOut = converter.convert(source,target.getName()); } catch (FileNotFoundException e) { System.out.println("--> The file "+source.getPath()+" does not exist!"); System.out.println(" "+e.getMessage()); System.exit(1); } catch (IOException e) { System.out.println("--> Failed to convert the file "+source.getPath()+"!"); System.out.println(" "+e.getMessage()); System.exit(1); } // TODO: Should do some further checking on the feasability of writing // the directory and the files. File targetDir = target.getParentFile(); if (targetDir!=null && !targetDir.exists()) { targetDir.mkdirs(); } try { dataOut.write(targetDir); } catch (IOException e) { System.out.println("--> Error writing out file!"); System.out.println(" "+e.getMessage()); System.exit(1); } } // Step 9: Say goodbye! System.out.println("Done!"); } /** * Display usage. */ private static void showUsage(String msg) { System.out.println(); System.out.println("This is Writer2LaTeX, Version " + ConverterFactory.getVersion() + " (" + ConverterFactory.getDate() + ")"); System.out.println(); if (msg != null) System.out.println(msg); System.out.println(); System.out.println("Usage:"); System.out.println(" java -jar /writer2latex.jar []"); System.out.println("where the available options are:"); System.out.println(" -latex"); System.out.println(" -bibtex"); System.out.println(" -xhtml"); System.out.println(" -xhtml+mathml"); System.out.println(" -xhtml+mathml+xsl"); System.out.println(" -recurse"); System.out.println(" -template[=]