pax_global_header00006660000000000000000000000064123432112450014507gustar00rootroot0000000000000052 comment=b08ca1cb91bb733e0334af989a3a663a8617d19b stopmotion-0.8.0/000077500000000000000000000000001234321124500137275ustar00rootroot00000000000000stopmotion-0.8.0/.gitignore000066400000000000000000000006261234321124500157230ustar00rootroot00000000000000*.o *.so /moc_*.cpp /Makefile /stopmotion /translations/stopmotion_*.qm /stopmotion /Makefile /Makefile.Debug /Makefile.Release /stopmotion.pro.user /build/ /divx2pass.log /src/test/build/ /src/test/test /src/test/Makefile /src/test/Makefile.Debug /src/test/Makefile.Release /src/test/test-d /src/test/test /src/test/testoom /stopmotion-d # Eclipse project and settings files .settings/ .cproject .project stopmotion-0.8.0/AUTHORS000066400000000000000000000022031234321124500147740ustar00rootroot00000000000000Original authors: Bjørn Erik Nilsen Fredrik Berg Kjølstad Contributors: Eric Stolten Josh Green Tim Band Jehan Pagès Tim Band Ying-Chun Liu (PaulLiu) Barak A. Pearlmutter Cyril Brulebois Translators: George Helebrant (Czech) Gorazd Bizjak and Matej Lavreni (Slovenian) Guillaume B (French) Martin Herweg (German) José Jorge (Portuguese) Manuel Quiñones (Spanish) David Hjelm (Swedish) Koray Löker (Turkish) Diego Giordano (Italian) Matteo Comisso (Italian) Wei-Lun Chao (Traditional Chinese) Maysara Abdulhaq and Ahmad Gharbeia of Arab Digital Expression Foundation (Arabic) Denis Fokin (Russian) Yaron (sh-yaron) (Hebrew) Logo: Gorazd Bizjak Please use the mailing list: linuxstopmotion-users-devs@lists.sourceforge.net stopmotion-0.8.0/COPYING000066400000000000000000000431311234321124500147640ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. stopmotion-0.8.0/README000066400000000000000000000023551234321124500146140ustar00rootroot00000000000000WHAT IS THIS ------------ Stopmotion is a program to create stop motion animations. See http://linuxstopmotion.org for more info. INSTALLATION ------------ 1) qmake 2) make install You need the following libraries installed to compile: - Qt4 - libtar - SDL - SDL_image - XML2 - vorbisfile - FAM/Gamin - pkg-config WHO CAN USE IT -------------- Everyone can use this application as it is distributed under the GPL licence (See the file COPYING for more details). DO YOU WANT TO CONTRIBUTE? -------------------------- Do not hesitate to contact us if you want to contribute with translations, graphics, code, +++ The mailing list is at linuxstopmotion-users-devs@lists.sourceforge.net Your help is very much appreciated. DEVELOPMENT ----------- After qmake, the following make targets are available: make debug # build a debug version of the project, called stopmotion-d make release # build a release version of the project, called stopmotion make # build both debug and release versions make install # build and install the release version in /usr/local make test # build and run the unit tests To install to a specific location (other than /usr/local): qmake PREFIX=/path/to/installation make install stopmotion-0.8.0/graphics/000077500000000000000000000000001234321124500155275ustar00rootroot00000000000000stopmotion-0.8.0/graphics/icons/000077500000000000000000000000001234321124500166425ustar00rootroot00000000000000stopmotion-0.8.0/graphics/icons/addframeicon.xpm000066400000000000000000000156441234321124500220160ustar00rootroot00000000000000/* XPM */ static const char *addframeicon[] = { "32 32 302 2", " s None c None", ".. c #528740", "#. c #115306", "a. c #000000", "b. c #235074", "c. c #8093a4", "d. c #d0dbcf", "e. c #175500", "f. c #699fce", "g. c #356d96", "h. c #253c1b", "i. c #5ca444", "j. c #5191c1", "k. c #a6b8c9", "l. c #d2e5cf", "m. c #969ca2", "n. c #271d24", "o. c #696766", "p. c #5291c1", "q. c #585759", "r. c #bbcedc", "s. c #5d8ab1", "t. c #218102", "u. c #4b88bd", "v. c #373a39", "w. c #306082", "x. c #52708d", "y. c #5aac41", "z. c #1d6402", "A. c #54a640", "B. c #c3d5e1", "C. c #4b83b2", "D. c #b5c2cc", "E. c #a0ba94", "F. c #234916", "G. c #a0aa9b", "H. c #3d3c3c", "I. c #509340", "J. c #b3c8d7", "K. c #ecf2ea", "L. c #237005", "M. c #1b600d", "N. c #41769a", "O. c #9ebbd2", "P. c #313832", "Q. c #323a31", "R. c #adc0ce", "S. c #4c8ebf", "T. c #8397a7", "U. c #25620b", "V. c #1d1f1c", "W. c #dfe4e9", "X. c #38729d", "Y. c #76a3c7", "Z. c #b3c1cd", "0. c #a2c295", "1. c #6995bd", "2. c #1d3d0f", "3. c #639ed0", "4. c #575357", "5. c #3a383a", "6. c #b0c3d1", "7. c #6e93b0", "8. c #605f5e", "9. c #105900", ".# c #2b7c08", "## c #65b346", "a# c #2f8d09", "b# c #787679", "c# c #5e89b2", "d# c #7098bb", "e# c #519e40", "f# c #423f3f", "g# c #b7c7d3", "h# c #b0cde3", "i# c #406640", "j# c #2c730c", "k# c #b4cbdf", "l# c #504e4d", "m# c #a7b9c5", "n# c #8aa1b4", "o# c #144f0d", "p# c #619bc9", "q# c #6098c6", "r# c #d3e7cf", "s# c #37709a", "t# c #b1cde3", "u# c #4081b5", "v# c #508ab8", "w# c #224f6d", "x# c #3a393a", "y# c #aebdc7", "z# c #5485a8", "A# c #898682", "B# c #5c93c0", "C# c #353434", "D# c #312a30", "E# c #6b9ac4", "F# c #98b9d0", "G# c #4d88b5", "H# c #8fb9da", "I# c #a9a8a9", "J# c #1e1729", "K# c #8f8989", "L# c #467ead", "M# c #666261", "N# c #d8ecd1", "O# c #323231", "P# c #cacbcb", "Q# c #3d4d62", "R# c #120613", "S# c #aec4d6", "T# c #4881b0", "U# c #d9ecd1", "V# c #263524", "W# c #6a9bc4", "X# c #3f4e5d", "Y# c #1a181c", "Z# c #d0dfcf", "0# c #a7a6a6", "1# c #5f5f5f", "2# c #403f40", "3# c #b3caab", "4# c #9cbcd3", "5# c #237c01", "6# c #92b9da", "7# c #5aad42", "8# c #437140", "9# c #2f8f09", ".a c #5f90bd", "#a c #8e979e", "aa c #485e7d", "ba c #4d9740", "ca c #5492c2", "da c #6fa6d5", "ea c #297508", "fa c #939392", "ga c #041800", "ha c #144401", "ia c #3d78a4", "ja c #3a6c8f", "ka c #6996b5", "la c #d4e9cf", "ma c #bacdda", "na c #3e506a", "oa c #478540", "pa c #404040", "qa c #143515", "ra c #6b99b8", "sa c #2f5f80", "ta c #4b7696", "ua c #4788bb", "va c #447eae", "wa c #39739e", "xa c #5381a2", "ya c #b0c4d2", "za c #709bbb", "Aa c #195e07", "Ba c #4a83b4", "Ca c #99b590", "Da c #5390bf", "Ea c #305f80", "Fa c #5b5f69", "Ga c #a9a8aa", "Ha c #66b447", "Ia c #257e05", "Ja c #383a3b", "Ka c #d4e3f1", "La c #5c8eb6", "Ma c #2b3b26", "Na c #acbfcc", "Oa c #176f00", "Pa c #649cce", "Qa c #191224", "Ra c #3c393b", "Sa c #588cb3", "Ta c #1f450d", "Ua c #306992", "Va c #2c5a7a", "Wa c #235980", "Xa c #85b0d3", "Ya c #71a5cd", "Za c #5389b5", "0a c #70a3ce", "1a c #203f14", "2a c #1e2a19", "3a c #eef4eb", "4a c #77a9cf", "5a c #d1e1cf", "6a c #97bcd9", "7a c #2e2d2c", "8a c #192c10", "9a c #403f41", ".b c #244864", "#b c #535251", "ab c #d6eacf", "bb c #2f2e30", "cb c #cee0ef", "db c #242424", "eb c #485d7a", "fb c #403d42", "gb c #6695bb", "hb c #b8cedf", "ib c #528dc1", "jb c #ffffff", "kb c #d6e8d0", "lb c #d8e0e5", "mb c #9abfdc", "nb c #999b9c", "ob c #75aad8", "pb c #cbd1d7", "qb c #4b81b1", "rb c #437faa", "sb c #45677f", "tb c #c4d6e3", "ub c #5b87a8", "vb c #577ca0", "wb c #a2b9cc", "xb c #7ea6c7", "yb c #d4e1cf", "zb c #161815", "Ab c #4f8aba", "Bb c #acaba9", "Cb c #666c70", "Db c #143e12", "Eb c #98ad90", "Fb c #16486f", "Gb c #b0c9de", "Hb c #90b2cd", "Ib c #bbd4b0", "Jb c #464547", "Kb c #8998a4", "Lb c #39739f", "Mb c #457e40", "Nb c #244516", "Ob c #abb2b8", "Pb c #99afc0", "Qb c #9fb3c2", "Rb c #cfd9cf", "Sb c #b5b3b2", "Tb c #242325", "Ub c #144568", "Vb c #326284", "Wb c #918d89", "Xb c #acbfcd", "Yb c #4b8dbe", "Zb c #1c4709", "0b c #9fafbb", "1b c #0e1e2a", "2b c #070609", "3b c #383739", "4b c #7f7a79", "5b c #397aae", "6b c #5695cb", "7b c #a6c5dd", "8b c #224b14", "9b c #4a7390", ".c c #3d495d", "#c c #4e90c1", "ac c #b6cad9", "bc c #191218", "cc c #d1d8dd", "dc c #557796", "ec c #639d4a", "fc c #abbdca", "gc c #adc6dc", "hc c #8fa9c0", "ic c #3b383d", "jc c #729dc0", "kc c #a6b8c4", "lc c #9f9f9f", "mc c #1f151f", "nc c #4c9240", "oc c #238902", "pc c #b3b8be", "qc c #565555", "rc c #4b8bbb", "sc c #3c383d", "tc c #5c98c5", "uc c #142411", "vc c #749fbf", "wc c #161a1e", "xc c #406d40", "yc c #9fad99", "zc c #d2e4cf", "Ac c #104200", "Bc c #4d4e4c", "Cc c #487b9f", "Dc c #164a12", "Ec c #9b9a99", "Fc c #98aebd", "Gc c #9eb2bf", "Hc c #d6ebd0", "Ic c #d3e4cf", "Jc c #143c14", "Kc c #cfdbcf", "Lc c #869aa9", "Mc c #d8e6d2", "Nc c #80a5c4", "Oc c #4777a1", "Pc c #336a93", "Qc c #24516f", " a.a. ", " a.a. ", " a.a. ", " a.a.a.a.a.a.a.a.", " a.a.a.a.a.a.a.a.", " a.a. ", " a.a. ", " a.a. ", " ", " jbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjb ", " jblbkckcm#fcNaNaXbR.yaJ.acr.tbB.mag#D.W.jb ", " jbGcw#w#QcVaEasaw.VbjaN.Ccz#rakaxa9bsby#jb ", " jbFcUbWaUaPcg.s#X.waiarbSavc4#F#zaubta6.jb ", " jbPbFbLbcav#G#rcYbS.S.j.YambKacb6aY.Lahbjbjbjbjbjbjb ", " jbQbb.7.7bO.NcT#5bu#ua#ctc4ah#t#XaW#Zak#jbmag#D.W.jb ", " jb0b.bLcccpbk.s.L#BaAbDap.p#H#6#0aB#C.Gbjbxa9bsby#jb ", " jbm.1bCbBbSbpcwbHbxbjcgbq#3.obda6bu.vagcjbzaubta6.jb ", " jbnbwcqcA#Wbfa#aKbT.n#hcd#.af.PaibqbOcS#jb6aY.Lahbjb ", " jb0#C##bo.8.l#C#pa1#EcP#c.dc1.E#c#vbx.Z.jbXaW#Zak#jb ", " jbI#Ra5.x#2#H.7af#M#4bK#Fa.cebaanaQ#X#Objb0aB#C.Gbjb ", " jbGaicY#2bTb3b9aq.b#4.D#n.mcJ#QaR#bcdblcjb6bu.vagcjb ", " jbG.h.2aV.bbscfbJbBcO#zb8a2.F.8bZbTaNbycjbibqbOcS#jb ", " jbEbha1aMaQ.v.JaP.V#ucgaAcz.ea.#5#L.U.E.jbc#vbx.Z.jb ", " jbCae.AaM.DcJcqaDbo##.9.Oat.a#9#ocIaj#0.jbnaQ#X#Objb ", " jb3#..I.baMbxci#8#oance#A.7#Ha##y.i.ecIbjbR#bcdblcjb ", " jbK.ybIcl.Z#KcRbd.5azcr#laHcU#N#abkbMc3ajbZbTaNbycjb ", " jbEbha1aMaQ.v.JaP.V#ucgaAcz.ea.#5#L.U.E.jb ", " jbCae.AaM.DcJcqaDbo##.9.Oat.a#9#ocIaj#0.jb ", " jb3#..I.baMbxci#8#oance#A.7#Ha##y.i.ecIbjb ", " jbK.ybIcl.Z#KcRbd.5azcr#laHcU#N#abkbMc3ajb ", " ", " "}; stopmotion-0.8.0/graphics/icons/cameraoff.xpm000066400000000000000000000034241234321124500213160ustar00rootroot00000000000000/* XPM */ static const char *cameraoff[] = { "45 32 12 1", " s None c None", ". c #a0a0a4", "# c #ffff00", "a c #000000", "b c #c0c0c0", "c c #ff0033", "d c #222222", "e c #444444", "f c #999999", "g c #777777", "h c #555555", "i c #111111", " ", " ", " ", " ", " ", " ", " a", " iii a iii aa", " ihhhihihhi aa", " ihiiihihiii aa", " ihiiiiiiiiii aa", " ihiiiiiiiii a", "## aaa ii ihiiiiiiii ", "#### aaa iha iiiiiiiiiiiiiii ", "###### aaa iihi ahhhhhhhhhhhhhhhi", "######## aaa iiiiihiiiiiiiiiiiiiihi", "########## i iiihiicciiiiiggggggii", "############ ii iiiihiiiiiiiiigiiiiiigi", "############ igi iii abibiiiiiiiggiigiiiiiiii", "#############ihi ifi a.i.iggggggiihigiieeiiii", "#############iii igi afifihhhhhhfihigiieeiigi", "#############iii ihi agigieeeeeeeihigiiiiiigi", "#############iii iei ahihidddddddihigiieeiigi", "#############iii idi aeieiiiiiiiiihigiieeiiii", "############ iii iii adidiiiiiiihhiigiiiiiiii", "############ ii iiihhhhhhhiiiigiiiiiigi", "########## i iiiiiiiiiiiiggggggii", "######## iiiiiiiiiiiiiiiiii ", "###### ", "#### ", "## ", " "}; stopmotion-0.8.0/graphics/icons/cameraon.xpm000066400000000000000000000026221234321124500211570ustar00rootroot00000000000000/* XPM */ static const char *cameraon[] = { /* columns rows colors chars-per-pixel */ "32 32 11 1", " c black", ". c #111111", "X c #222222", "o c #444444", "O c #555555", "+ c #777777", "@ c #FF0033", "# c gray60", "$ c #A0A0A4", "% c #C0C0C0", "& c None", /* pixels */ "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", "&&&&&&&&&&&&&&&&&&&&...& &...& ", "&&&&&&&&&&&&&&&&&&&.OOO.O.OO.& ", "&&&&&&&&&&&&&&&&&&.O...O.O...& ", "&&&&&&&&&&&&&&&&&.O..........& ", "&&&&&&&&&&&&&&&&&.O.........&&& ", "&&&&&& &..&&&&&.O........&&&&&", "&&&&&& &.O &&&...............&", "&&&&&& &..O.& OOOOOOOOOOOOOOO.", "&&&&&& &.....O..............O.", ".&&&&&&&&&&...O..@@.....++++++..", "..&&&&&&&....O.........+......+.", ".+.&...& %.%.......++..+........", ".O.&.#.& $.$.++++++..O.+..oo....", "...&.+.& #.#.OOOOOO#.O.+..oo..+.", "...&.O.& +.+.ooooooo.O.+......+.", "...&.o.& O.O.XXXXXXX.O.+..oo..+.", "...&.X.& o.o.........O.+..oo....", "...&...& X.X.......OO..+........", "..&&&&&&&...OOOOOOO....+......+.", ".&&&&&&&&&&&............++++++..", "&&&&&&&&&&&&&..................&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&" }; stopmotion-0.8.0/graphics/icons/capture.xpm000066400000000000000000000016711234321124500210400ustar00rootroot00000000000000/* XPM */ static const char *captureicon[]={ "32 22 7 1", ". c None", "# c #000000", "d c #585858", "c c #7f7f7f", "e c #a0a0a0", "a c #bfbfbf", "b c #fefefe", ".............######.............", "............#abaaaa#............", "...........#abbaaaaa#...........", "...........#bbbaaaaa#.....ccc...", "...#ccc#..#abbaaaaaaa#...ccccc..", "..############################..", ".#ddddddeeeeeeeeeeeeeeeeeeeeee#.", ".#ddddddeeeeeeeeeeeeeeeeeeeeee#.", ".#ddddddeeee########eeeeeeeeee#.", ".#ddddddeee##cccccc##eeeeeeeee#.", ".#ddddddee##ccaaaacc##eeeeeeee#.", ".#ddddddee#ccabbbaacc#eeeeeeee#.", ".#ddddddee#caabbaaaac###eeeeee#.", ".#ddddddee#cabbbaaaac#e#eeeeee#.", ".#ddddddee#cabbaaaaac#e#eeeeee#.", ".#ddddddee#cbbbaaaaac###eeeeee#.", ".#ddddddee#cabbaaaaac#eeeeeeee#.", ".#ddddddee##caaaaaac##eeeeeeee#.", ".#ddddddeee##caaaac##eeeeeeeee#.", ".#ddddddeeee########eeeeeeeeee#.", ".#ddddddeeeeeeeeeeeeeeeeeeeeee#.", ".##############################."}; stopmotion-0.8.0/graphics/icons/clapper.xpm000066400000000000000000000023601234321124500210170ustar00rootroot00000000000000/* XPM */ static const char *clapper[]={ "32 32 4 1", ". c None", "# c #000000", "b c #ffff00", "a c #ffffff", "................................", "................................", "......##........................", ".....#aa##......................", "....#########...................", ".....##aaaaa###.................", ".......##########...............", ".........##aaaaa##..............", "...........#########............", ".............##aaaaa##..........", "...............#########........", ".................##aaaaa###.....", "...................#####bab#....", ".....................###aba#....", "...#####################bab#....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "...########################.....", "................................", "................................"}; stopmotion-0.8.0/graphics/icons/close.xpm000066400000000000000000000057531234321124500205070ustar00rootroot00000000000000/* XPM */ static const char *closeicon[]={ "16 16 151 2", ".f c #a7190f", ".e c #aa3127", ".u c #ab3228", "#2 c #af3930", ".d c #af443c", "ar c #b03931", "ae c #b7554e", ".c c #b7776e", "aq c #b8564f", ".G c #ba554a", "#0 c #bd3e2f", "#O c #bd3f30", "#E c #bd4131", "#w c #bd4838", "#m c #bd4e3f", "#b c #bd4f3f", ".4 c #bd4f40", ".T c #bd5041", "ac c #be4f43", ".a c #bebab3", ".g c #c0bcb5", ".b c #c0bdb5", ".t c #c1beb6", ".# c #c3bfb8", ".H c #c5c2ba", "ap c #ca948e", ".U c #cac6bf", ".5 c #cdc9c2", "Qt c #cfcbc3", "#c c #d1cdc7", "#n c #d4d1ca", "#x c #d7d4ce", "as c #d9d5ce", "#F c #dad7d2", "#P c #dddbd5", "#1 c #e0ddd8", "ao c #e2e0db", "ad c #e3e0db", "at c #e4e2dd", "au c #e6e4df", ".h c #f3d5cc", "an c #f67f73", "af c #f6a99b", ".s c #f6b5a6", "#M c #ff5d4a", "a. c #ff5e4b", "#Y c #ff624d", "#D c #ff624f", "#9 c #ff6450", "#u c #ff6653", "a# c #ff6751", "#8 c #ff6956", "#X c #ff6958", "#7 c #ff6d5a", "#t c #ff6f5c", "#V c #ff705e", "#6 c #ff7360", "#U c #ff7562", "#k c #ff7963", "#j c #ff7f6b", "aa c #ff8175", "#R c #ff8574", "#5 c #ff8671", "#C c #ff887a", "#W c #ff897a", "#q c #ff8d7a", "#s c #ff9183", "#K c #ff9284", "#T c #ff9384", "#Q c #ff957f", "#J c #ff9687", "#e c #ff9984", "#i c #ff9a8b", "ab c #ff9a8c", "#H c #ff9b85", "#Z c #ff9d8e", "#A c #ffa091", "#z c #ffa18b", "#r c #ffa393", "## c #ffa488", "#N c #ffa495", ".2 c #ffa589", "#p c #ffa68f", "#f c #ffa99a", "am c #ffaa9b", ".R c #ffad91", "#4 c #ffada1", ".Q c #ffae95", ".N c #ffae96", "al c #ffafa1", ".M c #ffb098", "#d c #ffb09a", "#v c #ffb2a4", "ak c #ffb5a6", ".D c #ffb69a", "#. c #ffb8a2", ".C c #ffb99e", "aj c #ffbaac", ".B c #ffbba1", ".J c #ffbba5", ".A c #ffbda4", ".O c #ffbda9", ".0 c #ffbdaa", ".Z c #ffbeac", "ai c #ffbeb0", ".z c #ffbfa6", ".8 c #ffbfad", ".L c #ffc1ae", ".y c #ffc2aa", ".7 c #ffc2ab", ".x c #ffc4ad", "ah c #ffc4b5", "#l c #ffc5b7", ".W c #ffc6af", "ag c #ffc6b7", ".w c #ffc7af", ".E c #ffc7b9", ".I c #ffcab3", "#3 c #ffd1c2", "#L c #ffd1cb", "#a c #ffd2c4", ".3 c #ffd5c7", ".S c #ffd7ca", "#S c #ffd7d1", ".F c #ffd8ca", "#I c #ffd9d4", ".r c #ffddcd", "#G c #ffe0d1", ".q c #ffe1d2", ".v c #ffe2d7", ".1 c #ffe4dd", "#y c #ffe5d6", ".p c #ffe5d7", ".P c #ffe5dd", ".K c #ffe8e1", ".o c #ffe9dc", "#o c #ffebdd", ".n c #ffeee0", ".m c #fff2e4", ".l c #fff7e9", "#B c #fff7f5", "#h c #fff7f6", ".6 c #fff8eb", "#g c #fff8f7", ".9 c #fff9f8", ".k c #fffaed", ".Y c #fffaf8", ".V c #fffbef", ".j c #fffdf1", ".i c #fffdf3", ".X c #ffffff", "Qt.#.a.a.a.a.a.a.a.a.a.a.a.a.#Qt", ".b.c.d.e.f.f.f.f.f.f.f.f.e.d.c.b", ".g.d.h.i.j.k.l.m.n.o.p.q.r.s.d.g", ".t.u.i.v.w.x.y.z.A.B.C.D.E.F.G.t", ".H.f.i.I.J.K.L.M.N.O.P.Q.R.S.T.H", ".U.f.V.W.K.X.Y.Z.0.Y.X.1.2.3.4.U", ".5.f.6.7.8.Y.X.Y.Y.X.9#.###a#b.5", "#c.f.m#d#e#f#g.X.X#h#i#j#k#l#m#c", "#n.f#o#p#q#r#g.X.X#h#s#t#u#v#w#n", "#x.f#y#z#A#g.X#h#h.X#B#C#D#f#E#x", "#F.f#G#H#I.X#h#J#K#B.X#L#M#N#O#F", "#P.f.F#Q#R#S#T#U#V#W#L#X#Y#Z#0#P", "#1#2#3#4#5#6#V#7#8#9a.a#aaabac#1", "adaeafagahaiajakalam#N#Zabanaead", "aoapaqar.f.f.f.f.f.f.f.faraqapao", "asatauauauauauauauauauauauauatas"}; stopmotion-0.8.0/graphics/icons/closescene.xpm000066400000000000000000000006601234321124500215150ustar00rootroot00000000000000/* XPM */ static const char *closescene[]={ "16 16 4 1", "b c None", ". c None", "a c #000000", "# c #89878a", "................", "................", "..........#.....", ".........#a.....", ".......##aa.....", "......#aaaa.....", "....##aaaaa.....", "...#aaaaaaa.....", "..#aaaaaaaa.....", "..#aaaaaaaa..bb.", "...#aaaaaaa..bb.", "....##aaaaa.....", "......#aaaa.....", ".......##aa.....", ".........#a.....", "..........#....."}; stopmotion-0.8.0/graphics/icons/configureicon.xpm000066400000000000000000000042331234321124500222240ustar00rootroot00000000000000/* XPM */ static const char *configureicon[]={ "18 18 89 2", "Qt c None", ".b c #000000", ".n c #010101", ".8 c #050504", ".z c #143433", ".i c #173a38", ".L c #215250", ".7 c #235351", ".q c #296967", ".h c #2a6a68", ".3 c #2b2b2c", ".A c #2c5a58", ".O c #2f5d5b", ".o c #357270", "#l c #38250a", ".1 c #39393b", "#o c #397573", "#e c #3a260a", "#d c #3b7674", ".w c #3c3c3e", "#i c #3c7675", ".c c #414143", ".a c #424244", ".# c #49494b", "#. c #4b320e", ".j c #4d4d4f", ".y c #4d908e", ".U c #50491d", ".E c #559b99", ".r c #565657", ".v c #58585a", ".m c #5b5b5d", "#w c #604012", ".D c #625821", ".B c #636365", ".N c #65acaa", ".G c #69696a", "#c c #6b4815", ".6 c #6f4d1c", ".Y c #6f4e1d", ".Q c #72bab8", ".0 c #73bab8", "#k c #7cc2c0", ".T c #828283", "## c #84612b", "#f c #906c33", ".9 c #949495", ".V c #978530", ".M c #97d4d2", "#v c #987339", "#q c #99743a", ".k c #99999a", ".5 c #9c7741", ".S c #a0a0a1", "#m c #a48350", ".u c #aaaaaa", ".F c #aadbdd", ".2 c #acacad", ".p c #acdbdc", ".l c #b1b1b2", "#s c #b38a56", "#b c #b48d5b", ".t c #b4b4b6", ".H c #b7b7b8", ".g c #bcbcbe", "#j c #bde5e3", "#h c #be9a6d", ".Z c #bee1e0", ".C c #c0c0c1", "#t c #c1e5e5", "#p c #c4e7e5", ".P c #c5e6e6", ".X c #c7ab56", ".f c #c9c9cb", ".x c #c9e7e8", ".4 c #ceac7f", ".K c #cfb262", "#u c #d3b186", "#a c #debd96", ".I c #dededf", ".e c #e3e3e4", "#r c #e5c49d", "#g c #e7ceab", "#n c #ebd4b3", ".R c #ebebec", ".d c #eeeeee", ".J c #f0e4bb", ".s c #f4f4f4", ".W c #fdf5dc", "QtQtQtQtQtQtQt.#.a.a.bQtQtQtQtQtQtQt", "QtQtQtQtQtQt.c.d.e.f.g.b.h.iQtQtQtQt", "QtQtQtQt.j.b.k.l.m.n.b.o.p.qQtQtQtQt", "QtQtQt.r.s.t.u.v.wQt.o.x.y.z.A.iQtQt", "QtQtQt.B.C.s.D.DQt.h.p.E.z.A.F.bQtQt", "Qt.w.G.H.I.D.J.K.D.L.M.N.O.P.Q.hQtQt", ".w.R.S.T.m.U.V.W.X.Y.Z.M.Q.0.h.iQtQt", ".1.2.R.v.3Qt.U.V.4.5.6.h.h.7.iQtQtQt", "Qt.8.9.bQtQtQt#.###a#b#c.bQtQtQtQtQt", "QtQt.b.aQtQt#d.y#e#f#g#h#cQtQtQtQtQt", "QtQtQtQtQt#i#j#k.L#l#m#n#h#cQtQtQtQt", "QtQtQtQt#o#p#k.h.bQt#l#q#r#s#cQtQtQt", "QtQtQt.A#t#k.h.bQtQtQt#l#q#u#v#cQtQt", "QtQtQt.i#k.h.bQtQtQtQtQt#l#v#w#lQtQt", "QtQtQtQt.i.bQtQtQtQtQtQtQt#l#lQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/copyicon.xpm000066400000000000000000000033461234321124500212210ustar00rootroot00000000000000/* XPM */ static const char *copyicon[]={ "16 16 71 2", ".f c None", ".p c #ffffff", "#c c #37342f", "#b c #3b3732", ".4 c #3c3832", "#a c #3f3b34", ".T c #413c36", "## c #433e37", ".P c #454039", "#. c #47413a", ".M c #4a443c", ".9 c #4b453d", ".I c #4f4840", ".8 c #534b43", ".E c #534c43", ".7 c #574f45", ".A c #585046", ".6 c #5b5248", ".u c #5d544a", ".V c #5f564c", ".t c #61584d", ".Q c #645a4f", ".s c #655b50", ".o c #665c50", ".r c #695e52", ".m c #6d6256", ".j c #6e6356", ".i c #726659", ".e c #776a5d", ".d c #7b6e5f", ".v c #7c6e60", ".c c #7f7162", ".q c #807263", ".b c #837465", ".k c #857667", ".a c #877868", ".g c #8a7a6a", ".# c #8b7b6b", "Qt c #8f7f6e", ".F c #aaaaaa", "#e c #b1b1b1", "#d c #b5b5b5", ".5 c #bababa", ".D c #bbac94", ".H c #bca687", ".z c #bcb4ad", ".O c #bda07a", ".L c #bda280", ".3 c #be9b6d", ".U c #bebebe", ".S c #bf9f73", ".2 c #bf9f76", ".1 c #bfa682", ".0 c #c1aa8a", ".Z c #c1ae96", ".Y c #c2b59f", ".X c #c3b9aa", ".J c #c3c3c3", ".W c #c5beb4", ".h c #dedede", ".y c #e0dedd", ".R c #e6c9a3", ".N c #e9d0ac", ".K c #ecd6b9", ".G c #efdcc2", ".C c #f1e3ce", ".B c #f4e9db", ".x c #f8f0e5", ".w c #f9f6f2", ".n c #faf7f5", ".l c #ffffff", "Qt.#.a.b.c.d.e.f.f.f.f.f.f.f.f.f", ".g.h.h.h.h.h.i.j.f.f.f.f.f.f.f.f", ".k.h.l.l.l.l.m.n.o.f.f.f.f.p.f.f", ".q.h.l.l.l.l.r.s.t.u.f.f.f.f.f.f", ".v.h.l.l.l.w.x.y.z.A.s.d.e.f.f.f", ".e.h.l.l.w.x.B.C.D.E.F.h.i.j.f.f", ".i.h.l.w.x.B.C.G.H.I.J.l.m.n.o.f", ".m.h.w.x.B.C.G.K.L.M.J.l.r.s.t.u", ".r.h.x.B.C.G.K.N.O.P.J.w.x.y.z.A", ".Q.h.B.C.G.K.N.R.S.T.U.x.B.C.D.E", ".V.W.X.Y.Z.0.1.2.3.4.5.B.C.G.H.I", ".6.7.8.I.9#.###a#b#c#d.C.G.K.L.M", ".f.f.f.f.f.f.9.F.5#d#e.G.K.N.O.P", ".f.f.f.f.f.f.Q.h.B.C.G.K.N.R.S.T", ".f.f.f.f.f.f.V.W.X.Y.Z.0.1.2.3.4", ".f.f.f.f.f.f.6.7.8.I.9#.###a#b#c"}; stopmotion-0.8.0/graphics/icons/cuticon.xpm000066400000000000000000000036021234321124500210350ustar00rootroot00000000000000/* XPM */ static const char *cuticon[]={ "16 16 81 2", ".# c None", "Qt c None", ".l c #000000", ".4 c #101214", "## c #141414", "#e c #161616", ".M c #181d25", "#k c #1b1b1b", ".H c #1c1810", "#h c #1e1e1e", ".W c #261600", "#o c #262626", ".q c #271600", ".X c #291900", "#c c #292929", ".j c #2b1800", ".2 c #2c2c2c", ".o c #2d2518", ".9 c #2d2d2d", "#n c #2e2e2e", "#f c #303030", ".5 c #322100", "#i c #363636", ".G c #372200", ".x c #382400", ".Z c #392500", "#l c #3e3e3e", ".S c #412d09", ".d c #412f0f", ".t c #422b00", ".n c #432b00", ".U c #454647", ".B c #46320a", ".i c #493103", ".e c #4b3103", ".a c #4e3910", ".Q c #503400", ".K c #514939", "#m c #515151", ".p c #543d12", ".u c #594620", ".Y c #5b3c00", ".y c #5f3f00", ".8 c #5f5f5f", "#b c #636363", ".w c #6a5222", ".0 c #6b6b6b", ".T c #6c6c6c", ".6 c #707070", ".F c #754e00", ".c c #7a6233", ".R c #7f5300", ".L c #7f5501", ".O c #805100", ".D c #826d48", ".b c #846f3d", ".z c #8a5900", ".m c #987200", ".s c #9d7800", ".P c #ae7609", ".I c #af780f", ".g c #b0934c", ".A c #b57a00", ".J c #b59958", ".r c #ba9625", ".E c #bb9124", ".h c #bc972f", ".v c #beac80", ".f c #c5ac67", "#g c #cdcdcd", "#a c #d3d3d3", "#j c #d4d4d4", ".k c #d8c17a", "#d c #dddddd", ".C c #e3d1a2", ".1 c #ececec", ".N c #ede6da", "#. c #ededed", ".V c #f0f4fa", ".3 c #f1f2f3", ".7 c #f3f3f3", "QtQtQtQtQt.#.a.b.c.d.#.#QtQtQtQt", "QtQtQtQt.#.e.f.g.h.i.#.#QtQtQt.#", "QtQtQtQt.#.j.k.l.m.n.#.o.p.q.#.#", "QtQtQtQt.#.l.r.l.s.t.#.u.v.w.l.#", "QtQtQtQt.#.x.y.z.A.l.B.C.D.E.F.#", "QtQtQtQt.#.#.G.H.I.l.J.K.l.L.F.#", "QtQtQtQtQt.#.#.M.N.O.P.Q.R.F.S.#", "QtQtQt.#.#.#.T.U.V.W.#.X.Y.Z.#.#", "QtQtQt.#.#.0.1.2.3.4.#.#.5.#.#.#", "QtQtQt.#.6.7.8.9#.##.#.#.#.#.#.#", "QtQt.#.6#a#b.##c#d##.#.#.#.#.#.#", "Qt.##e.6.T.#.##f#g##.#.#.#.#.#.#", "Qt.##h.2.#.#.##i#j#k.#.#.#.#.#.#", "Qt.#.#.#.#.#.##l#m.T.#.#.#.#.#.#", "QtQt.#.#.#.#.##n#o.#.#.#.#.#.#.#", "Qt.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#"}; stopmotion-0.8.0/graphics/icons/fastforward.xpm000066400000000000000000000006321234321124500217130ustar00rootroot00000000000000/* XPM */ static const char *fastforwardicon[]={ "16 16 2 1", ". c None", "# c #000000", "................", "................", "..#.....#.......", "..##....##......", "..###...###.....", "..####..####....", "..#####.#####...", "..############..", "..############..", "..#####.#####...", "..####..####....", "..###...###.....", "..##....##......", "..#.....#.......", "................", "................"}; stopmotion-0.8.0/graphics/icons/filenewicon.xpm000066400000000000000000000037311234321124500216760ustar00rootroot00000000000000/* XPM */ static const char *filenewicon[]={ "18 18 77 2", "Qt c None", ".j c #303030", ".n c #424242", ".k c #494600", ".# c #585858", ".m c #6b6b6b", ".f c #6d6d6d", ".h c #707070", ".l c #898989", ".r c #8f8984", ".c c #999999", ".b c #bcb7b1", ".w c #beb6af", ".x c #c0c000", ".C c #c1c10a", "#k c #c79f80", "#b c #c8a487", "#j c #c9a68a", ".6 c #caa98e", "#i c #cbac93", ".0 c #cbad95", "#h c #cdb19c", ".U c #cdb29c", ".O c #ceb6a3", ".i c #cecece", "#g c #cfb7a5", ".J c #d0bbaa", "#f c #d1beae", ".B c #d1bfb0", "#e c #d3c3b7", "#d c #d5c9c0", "#c c #d7cfc9", ".a c #dedede", ".q c #e2e0de", ".v c #e7e0d9", "#a c #e9c7aa", ".e c #eaeaea", ".5 c #ecceb4", "## c #eed4bd", ".Z c #eed4be", ".4 c #eed5be", "#. c #f0d9c5", ".Y c #f0dbc7", ".3 c #f1dac7", ".T c #f1dbc7", ".N c #f2ddcb", ".2 c #f2e0cf", ".9 c #f2e0d0", ".S c #f3e1d1", ".I c #f4e3d5", ".M c #f4e4d5", ".8 c #f5e5d8", ".X c #f5e6d9", ".1 c #f5e7da", ".R c #f6e7da", ".H c #f6e9de", ".A c #f6e9df", ".p c #f6f5f5", ".L c #f7e9de", ".Q c #f8ece2", ".W c #f8ede3", ".K c #f9eee6", ".G c #f9efe7", ".z c #faf1ea", ".7 c #faf1eb", ".V c #faf3ec", ".P c #faf3ed", ".F c #faf5ef", ".u c #fbf6f2", ".y c #fbf7f3", ".g c #fcfcfc", ".E c #fdfbf9", ".t c #fefcfb", ".s c #ffff00", ".o c #ffff85", ".D c #ffffc0", ".d c #ffffff", "QtQtQtQtQt.#.#.#.#.#.#.#.#.#QtQtQtQt", "QtQtQtQtQt.#.a.a.a.a.a.b.#.c.#QtQtQt", "QtQtQtQtQt.#.a.d.d.d.d.e.f.d.c.#QtQt", "QtQtQtQtQt.#.a.d.d.d.d.g.h.i.d.c.jQt", "QtQtQtQtQt.k.a.d.d.d.d.d.l.h.m.n.jQt", "QtQt.kQt.k.o.k.d.k.d.d.d.p.q.b.r.jQt", "Qt.k.o.k.k.s.k.k.o.k.d.d.t.u.v.w.jQt", "QtQt.k.s.x.s.x.s.k.d.d.t.y.z.A.B.jQt", "Qt.k.k.C.D.o.D.x.k.k.E.F.G.H.I.J.jQt", ".k.o.s.s.o.d.o.s.s.o.k.K.L.M.N.O.jQt", "Qt.k.k.x.D.o.D.x.k.k.P.Q.R.S.T.U.jQt", "QtQt.k.s.x.s.x.s.k.V.W.X.S.Y.Z.0.jQt", "Qt.k.o.k.k.s.k.k.o.k.1.2.3.4.5.6.jQt", "QtQt.kQt.k.o.k.7.k.8.9#.##.5#a#b.jQt", "QtQtQtQtQt.k#c#c#d#e#f#g#h#i#j#k.jQt", "QtQtQtQtQt.#.j.j.j.j.j.j.j.j.j.j.jQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/fileopenicon.xpm000066400000000000000000000036271234321124500220520ustar00rootroot00000000000000/* XPM */ static const char *fileopenicon[]={ "18 18 73 2", ".# c None", "Qt c None", ".a c #000000", ".L c #021b2c", ".b c #093759", ".7 c #0e3e60", ".K c #1f5070", ".z c #343434", "## c #346c84", ".Y c #377087", ".S c #397389", ".A c #3b5b70", ".5 c #3f7b95", ".Z c #407d98", "#e c #43809c", ".0 c #4482a0", ".6 c #4584a1", ".Q c #4585a4", "#a c #4685a2", ".G c #4887a4", ".B c #4887a5", ".H c #4987a5", ".C c #4a87a5", ".v c #4a88a5", ".w c #4b88a5", ".R c #4c89a5", ".x c #4c89a6", ".q c #4d89a6", ".I c #4d8aa6", ".r c #4e8aa6", ".y c #4f8aa6", ".J c #4f8ba6", ".s c #508ba6", "#g c #515c63", ".D c #518ba6", ".t c #518ca7", ".i c #528ca7", ".l c #538ca7", ".u c #538da7", ".m c #548da7", ".n c #558da7", ".j c #558ea7", ".o c #568ea7", ".k c #568ea8", ".p c #578ea8", ".e c #578fa8", ".f c #588fa8", ".g c #5990a8", ".h c #5a90a8", ".c c #5a91a9", ".d c #5b91a9", "#f c #6c6c6c", "#d c #818181", "#. c #919191", "#c c #9a9a9a", ".9 c #ababab", "#b c #b3b3b3", ".4 c #bbbbbb", ".8 c #c4c4c4", ".3 c #d5d5d5", ".X c #d8d8d8", ".2 c #dadada", ".W c #dddddd", ".1 c #dfdfdf", ".V c #e2e2e2", ".P c #e5e5e5", ".U c #e7e7e7", ".O c #eaeaea", ".T c #ececec", ".N c #efefef", ".F c #f1f1f1", ".M c #f4f4f4", ".E c #f7f7f7", "QtQtQtQtQtQt.#.#QtQt.aQt.a.a.a.aQtQt", "QtQtQtQt.b.b.#QtQtQt.a.a.a.aQt.a.aQt", "QtQtQt.b.c.d.b.bQtQt.a.a.aQtQtQt.a.a", "QtQtQt.b.e.f.g.h.bQt.a.a.a.aQtQtQt.a", "QtQt.b.i.j.k.e.f.bQtQtQtQtQtQtQtQt.a", "QtQt.b.i.l.m.n.o.p.b.bQtQtQtQtQt.aQt", "Qt.b.q.r.s.t.i.u.m.j.k.b.bQtQtQtQtQt", "Qt.b.v.w.x.y.s.t.i.u.m.j.k.bQtQtQtQt", ".z.A.A.B.C.w.r.y.s.D.i.l.m.bQtQtQtQt", ".z.E.F.A.A.G.H.x.I.r.J.s.K.LQtQtQtQt", ".z.M.N.O.P.A.A.Q.w.R.q.r.b.S.bQtQtQt", ".z.F.T.U.V.W.X.A.A.v.w.b.Y.Z.0.bQtQt", "Qt.z.z.P.1.2.3.3.4.A.A.b.5.6.7QtQtQt", "QtQtQt.z.z.X.3.8.9#..z###a.bQtQtQtQt", "QtQtQtQtQt.z.z#b#c#d.z#e.bQtQtQtQtQt", "QtQtQtQtQtQtQt.z.z#f#g.bQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQt.z.zQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/filesaveasicon.xpm000066400000000000000000000044741234321124500223740ustar00rootroot00000000000000/* XPM */ static const char *filesaveasicon[]={ "18 18 99 2", "Qt c None", ".t c #000000", ".a c #c87f44", ".G c #100e0b", ".S c #1a1a1a", ".c c #1b1b1b", ".f c #1c1c1c", ".U c #202020", ".H c #291806", ".V c #332215", "#e c #3c3c3c", ".5 c #3d3d3d", ".d c #3f3f3f", ".e c #404040", "#w c #424242", "#G c #535353", "#E c #545454", "#A c #585858", ".b c #5b3e26", "#v c #5b5b5b", "#o c #5f5f5f", "#n c #606060", "#m c #626262", ".0 c #629b9b", "#l c #646464", "#g c #666666", "#f c #676767", ".B c #68a4a4", ".I c #693502", "#c c #696969", ".C c #69a5a5", ".Z c #6a5344", "#k c #6b6b6b", ".3 c #6d6d6d", "#j c #6e6e6e", ".A c #6e9e98", ".R c #707070", ".W c #71452a", ".T c #717171", "#i c #727272", ".F c #737373", "#h c #757575", ".s c #777777", "#d c #797979", ".4 c #7a7a7a", "#D c #7b7b7b", "#C c #7d7d7d", "#z c #838383", "#y c #858585", "#u c #8b8b8b", "#t c #8e8e8e", ".X c #9e6749", ".z c #a18761", "#F c #a7a7a7", ".1 c #a9b9b4", ".D c #abbbb6", "#B c #b2b2b2", ".u c #b65c03", ".Y c #b67d5f", ".9 c #b9b2ac", "#x c #bcbcbc", "#. c #beb7b0", ".8 c #beb8b3", "#s c #c7c7c7", ".7 c #cbc6c2", ".k c #cc9a72", ".j c #d09d6b", "#r c #d1d1d1", ".y c #d2975f", "## c #d6cbc3", ".M c #dba88d", "#q c #dbdbdb", ".l c #ded0c3", ".v c #e17504", ".6 c #e2dedb", "#p c #e6e6e6", ".J c #e87b0c", ".N c #e9dbd2", ".g c #ea7804", ".K c #ec842f", ".L c #eea275", ".i c #eeb36f", "#a c #efe2d6", "#b c #f4e5d8", ".x c #f5c17f", ".2 c #f5e7db", ".Q c #f6e8dd", ".E c #f6eae0", ".O c #f6ece3", ".P c #f7ebe1", ".r c #f7ece2", ".w c #f89a30", ".q c #f8eee6", ".p c #f9f1ea", ".h c #faa94a", ".o c #faf4ee", ".m c #faf7f4", ".n c #fbf6f2", ".# c #fdd7a6", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", ".#.a.b.c.d.e.e.e.e.e.e.e.f.fQtQtQtQt", ".g.h.i.j.k.l.m.n.o.p.q.r.e.s.fQtQtQt", ".t.u.v.w.x.y.z.A.B.C.D.E.e.F.fQtQtQt", "Qt.G.H.I.J.K.L.M.N.O.P.Q.e.R.fQtQtQt", "Qt.S.T.U.V.W.X.Y.Z.0.1.2.e.3.fQtQtQt", "Qt.f.4.5.6.7.8.9#.###a#b.e#c.fQtQtQt", "Qt.f#d.s.d.5#e#e#e.5.d.e#f#g.fQtQtQt", "Qt.f#h.F#i.R#j.3#k#c#f#g#l#m.fQtQtQt", "Qt.f#i.R#j.e.e.e.e.e.e.e#n#o.fQtQtQt", "Qt.f#j.3.e#p#q#r#s.e#t#u.e#v.fQtQtQt", "Qt.f#k#c.e#q#w#w#x.e#y#z.e#A.fQtQtQt", "Qt.f#f#g.e#r#w#g#B.e#C#D.e#E.fQtQtQt", "Qt.f#l#m.e#s#x#B#F.e#h.F.e#G.fQtQtQt", "QtQt.f.f.f.e.e.e.e.f.f.f.f.fQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/filesaveicon.xpm000066400000000000000000000035641234321124500220470ustar00rootroot00000000000000/* XPM */ static const char *filesaveicon[]={ "18 18 71 2", "Qt c None", ".# c None", ".a c None", ".b c #1c1c1c", ".c c #404040", ".7 c #424242", "#e c #535353", "#c c #545454", "#. c #585858", ".6 c #5b5b5b", ".Z c #5f5f5f", ".Y c #606060", ".X c #626262", ".W c #646464", ".R c #666666", ".Q c #676767", ".O c #696969", ".p c #69a5a5", ".V c #6b6b6b", ".F c #6d6d6d", ".U c #6e6e6e", ".B c #707070", ".T c #727272", ".r c #737373", ".S c #757575", ".m c #777777", ".P c #797979", "#b c #7b7b7b", ".G c #7c7c7c", "#a c #7d7d7d", ".C c #808080", ".s c #838383", ".9 c #858585", ".d c #878787", ".5 c #8b8b8b", ".4 c #8e8e8e", "#d c #a7a7a7", ".o c #abbbb6", "## c #b2b2b2", ".8 c #bcbcbc", ".3 c #c7c7c7", ".2 c #d1d1d1", ".1 c #dbdbdb", ".0 c #e6e6e6", ".N c #f4e5d8", ".E c #f5e7db", ".M c #f5e8dc", ".A c #f6e8dd", ".q c #f6eae0", ".z c #f7ebe1", ".l c #f7ece2", ".L c #f7ede4", ".y c #f8eee5", ".k c #f8eee6", ".K c #f9f0e8", ".x c #f9f0e9", ".j c #f9f1ea", ".J c #faf2ec", ".w c #faf3ed", ".i c #faf4ee", ".I c #fbf5f0", ".v c #fbf6f1", ".h c #fbf6f2", ".H c #fcf8f4", ".u c #fcf8f5", ".g c #fcf9f6", ".D c #fcf9f7", ".t c #fdfbf9", ".f c #fdfcfa", ".n c #fefdfc", ".e c #ffffff", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a", "QtQt.b.b.c.c.c.c.c.c.c.c.b.bQtQtQtQt", "Qt.b.d.c.e.f.g.h.i.j.k.l.c.m.bQtQtQt", "Qt.b.d.c.n.o.p.p.p.p.o.q.c.r.bQtQtQt", "Qt.b.s.c.t.u.v.w.x.y.z.A.c.B.bQtQtQt", "Qt.b.C.c.D.o.p.p.p.p.o.E.c.F.bQtQtQt", "Qt.b.G.c.H.I.J.K.L.q.M.N.c.O.bQtQtQt", "Qt.b.P.m.c.c.c.c.c.c.c.c.Q.R.bQtQtQt", "Qt.b.S.r.T.B.U.F.V.O.Q.R.W.X.bQtQtQt", "Qt.b.T.B.U.c.c.c.c.c.c.c.Y.Z.bQtQtQt", "Qt.b.U.F.c.0.1.2.3.c.4.5.c.6.bQtQtQt", "Qt.b.V.O.c.1.7.7.8.c.9.s.c#..bQtQtQt", "Qt.b.Q.R.c.2.7.R##.c#a#b.c#c.bQtQtQt", "Qt.b.W.X.c.3.8###d.c.S.r.c#e.bQtQtQt", "QtQt.b.b.b.c.c.c.c.b.b.b.b.bQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/gimp.xpm000066400000000000000000000064071234321124500203330ustar00rootroot00000000000000/* XPM */ static const char *const gimpicon[] = { "48 48 52 1", "# c None", ". c None", "H c #080704", "E c #140d04", "D c #1a140b", "F c #1d1c18", "G c #26231c", "J c #2b2c26", "C c #2c1c0c", "t c #34342d", "B c #3a250c", "P c #3b3b32", "A c #412b10", "M c #433e32", "I c #46463e", "z c #4a341a", "s c #514531", "N c #514d3f", "o c #575449", "i c #5a5b55", "Q c #615341", "r c #615c4d", "x c #666458", "u c #6a6c66", "k c #706d5d", "K c #715e44", "w c #73654e", "U c #74736a", "y c #7a7c7a", "L c #80684c", "l c #817c6b", "g c #83837c", "O c #8a7254", "e c #8a8c8a", "n c #8f8d85", "q c #95948f", "V c #9a7e5c", "c c #9a9b99", "j c #a29e94", "p c #a2a49f", "v c #aaabaa", "W c #ac8c64", "m c #afada3", "d c #b3b5b2", "X c #ba9b6f", "h c #babcb8", "f c #c2c4c2", "b c #cbccca", "a c #d2d5d4", "R c #dbdcd8", "S c #e8eae8", "T c #f3f5f3", "................................................", "................................................", "................................................", "................................................", "......................................####......", "......................................#aba#.....", ".....................................##bcb#.....", ".......aba..........................##adef#.....", ".......affa............bd...........#bfggh#.....", ".......abhfb..........agia.........##bjkld#.....", "........ahmdbbbfbfffffhnofff..##..##bpkklh#.....", "........afjqmffhqlrrooostueevhf####bdlwxyd#.....", ".........amjggxzABBBCCCDCDDDEFivffbpkxxrld#.....", ".........bhqwzABAGBCCCCCDDDEDHEIdfqkxxrilh#.....", "..........fjzAABBBBGCCDDCEEEEEHHelkxxroonm#.....", "..........fmzAAABBCCCCCDDDDEEHDJrrxKrooipv##....", "..........fhLzBBBBCCCCCFDFDFJtMNirrrrookc###....", "..........fhqOrNMMPztJJAtJJttPINNoiooQoy###.....", "..........RSTRnOknvdpnrIIsMMMMIsNNNNNNky###.....", ".........aTTTTandRaaaamUiQNNINIIsIsNNou####.....", ".bpiIPxmhRTSdcSaTTSSRSRhwxroNIIMMPMINi####......", ".dixuIJNVbTpyDnSTSShyyRbkxoosIMPPPMPIi####......", ".yxdduJJNqSUDHoaTTaqyEehxxrNsMPPPPttIi###.......", ".oxvpitJMkmhMIgpSSfMGHypxroNIMPPttJtNx##........", ".IIuxItPIoyylllVhRbuDPckrQNNIMPPPJJPi###........", ".IJIIPIIiixLUllllpffcqUrroNIMMtttFJIx#..........", ".uJtPPNixurxkUUOUUkkuxxrNPIMMPPPJGtN##..........", ".pJtIIiiUuirxwkkkkuKrrroPPIMPPttJJP##...........", "..yINiuuyisNorxwrxrroosPMNNMtPPJFtN##...........", "..dyiuuyUNIsNoorrooiNMzsQKKwwLLrioiuephffd......", "...fcguuNIIIINsNNIMPGJMsKKLOVWXXqqegyeeiPIupb...", ".....hgNPttPPJJGGFFGtPNxkQsoKLXXepvhhdNPINiuch..", ".....#hvuMFEHHHEFGtPNirrstpppppppppqcviPNixuye..", "......###qUiPJGFJPINriIpppppp#####p##ccyiiuyc...", ".........#############ppp##############pvvddf...", "...........#############################........", "............#######################.............", "............##################..................", "................##########......................", ".....................##.........................", "................................................", "................................................", "................................................", "................................................", "................................................", "................................................", "................................................", "................................................"}; stopmotion-0.8.0/graphics/icons/home.xpm000066400000000000000000000006461234321124500203260ustar00rootroot00000000000000static const char *home[] = { "16 15 4 1", "# c #000000", "a c #ffffff", "b c #c0c0c0", ". c None", ".......##.......", "..#...####......", "..#..#aabb#.....", "..#.#aaaabb#....", "..##aaaaaabb#...", "..#aaaaaaaabb#..", ".#aaaaaaaaabbb#.", "###aaaaaaaabb###", "..#aaaaaaaabb#..", "..#aaa###aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#aaa#.#aabb#..", "..#####.######.." }; stopmotion-0.8.0/graphics/icons/languages.xpm000066400000000000000000000016741234321124500213460ustar00rootroot00000000000000/* XPM */ static const char *languages[] = { "18 18 33 1", " s None c None", ". c #000000", "# c #006666", "a c #a0a0a4", "b c #000055", "c c #cc9999", "d c #ccffff", "e c #ccff99", "f c #999966", "g c #666699", "h c #669999", "i c #339966", "j c #66ff99", "k c #000099", "l c #c0c0c0", "m c #006699", "n c #009999", "o c #ffffff", "p c #ffff99", "q c #cccccc", "r c #dddddd", "s c #cc9966", "t c #999999", "u c #99ff99", "v c #777777", "w c #666666", "x c #444444", "y c #669966", "z c #555555", "A c #fffbf0", "B c #333333", "C c #339999", "D c #336699", " qvvh ", " qttfDva#b# ", " rstwh#acmmbhB ", " rvh##mqqCkmm#DB ", " a#Dhq#AhhCmehqb# ", " DDhphahqhlmbmmaz.", "a#kmkqqArmanmkmbDB", "ah#hmahohbhnjkmb#B", "mq#bmfqBam#bbmkbbb", "DbmkkhfA#mkbbbqmbb", "g#mAomqoeoCbmnb#bb", "aamlnbqh#Ap#meba#b", " qbCebmo#AubCqhhy.", " CCC#ArdqhC#mh.t.w", " hDrrq#rmCqhbhb# ", " ahCCqqqrqaivxx ", " aalqaqqltvz# ", " DtthvzBBB "}; stopmotion-0.8.0/graphics/icons/loop.xpm000066400000000000000000000011431234321124500203400ustar00rootroot00000000000000/* XPM */ static const char *loopicon[]={ "16 16 16 1", "# c None", ". c None", "a c #000000", "l c #080808", "d c #0e0e0e", "j c #101010", "k c #171717", "f c #191919", "i c #1f1f1f", "e c #252525", "g c #2a2a2a", "c c #5c5c5c", "m c #606060", "n c #676767", "b c #6b6b6b", "h c #737373", "................", "........####....", ".......##a####..", "...#####aa#####.", "#.#baaaaaaccb###", "##bdaaeaaaaadb##", "#bfg###aaahhgfb#", "#ij#####aa###ji#", "#ak####.#a###ka#", "#ak#.######.#ka#", "#blm########mlb#", "##maaaaaaaaaam#.", "#.#naaaaaaaan#..", ".#############..", ".##.#######.....", "........##......"}; stopmotion-0.8.0/graphics/icons/newscene.xpm000066400000000000000000000023721234321124500212030ustar00rootroot00000000000000/* XPM */ static const char *newscene[] = { "32 32 4 1", " s None c None", ". c #ffff00", "# c #000000", "a c #ffffff", " ## ", " ## ", " ## ## ", " #aa## ########", " ######### ########", " ##aaaaa### ## ", " ########## ## ", " ##aaaaa## ## ", " ######### ", " ##aaaaa## ", " ######### ", " ##aaaaa### ", " #####.a.# ", " ###a.a# ", " #####################.a.# ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ", " "}; stopmotion-0.8.0/graphics/icons/nextframe.xpm000066400000000000000000000031531234321124500213630ustar00rootroot00000000000000/* XPM */ static const char *nextframeicon[]={ "32 32 29 1", "# c None", ". c None", "a c #000000", "y c #010000", "d c #010002", "l c #020003", "b c #030104", "c c #040205", "z c #050304", "j c #050306", "n c #060407", "p c #070508", "r c #080609", "g c #09070a", "s c #0a080b", "h c #0b090c", "t c #0d0b0e", "k c #121013", "w c #706e71", "i c #7a787b", "o c #7d7b7e", "v c #7e7c7f", "u c #7f7d80", "q c #807e81", "A c #817f80", "m c #848285", "e c #858386", "f c #868487", "x c #8a888b", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "........#.......................", "........#.......................", ".....abb#..cde..................", ".....abd#..bdddf................", ".....abd#..dghdddi..............", ".....abd#..jcdjhdklm............", ".....aal#..ddjndndbdno..........", ".....aad#..ldbdldpdgddlq........", ".....aar#..drrddddddstddhi......", ".....aad#..dlddjldrcdddlli......", ".....abb#..bbdjlddcdndtu........", ".....abd#..ddlddlrddnv..........", ".....abb#..tddcrdbbf............", ".....abb#..ddhddhw..............", ".....abb#..dpddx................", ".....abb#..yzA..................", "........##......................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................"}; stopmotion-0.8.0/graphics/icons/note.xpm000066400000000000000000000023551234321124500203420ustar00rootroot00000000000000/* XPM */ static const char *note[]={ "32 32 4 1", ". c None", "a c #000000", "b c #0000ff", "# c #ffffff", "................................", "................................", "................................", "................................", "................................", "................................", "....................##..........", "..................##aa#.........", "................##aa#a#.........", "..............##aa###a#.........", ".............#aa##..#a#.........", "............#a##....#a#.........", "............#a#.....#a#.........", "............#a#.....#a#.........", "............#a#...###a#.........", "............#a#..#aaaa#.........", "............#a#.#a##ba#.........", "............#a#.#a#bba#.........", "............#a#.#abbba#.........", "..........###a#..#aaa#..........", ".........#aaaa#...###...........", "........#a##ba#.................", "........#a#bba#.................", "........#abbba#.................", ".........#aaa#..................", "..........###...................", "................................", "................................", "................................", "................................", "................................", "................................"}; stopmotion-0.8.0/graphics/icons/openscene.xpm000066400000000000000000000006571234321124500213570ustar00rootroot00000000000000/* XPM */ static const char *openscene[]={ "16 16 4 1", "# c None", ". c None", "b c #000000", "a c #89878a", "................", "...##.##..###...", "..a##.##...##...", "..ba#####.##....", "..bbaa##.###....", "..bbbba#####....", "..bbbbbaa###....", "..bbbbbbba####..", "..bbbbbbbba##...", "..bbbbbbbba##...", "..bbbbbbba##....", "..bbbbbaa###....", ".#bbbba########.", "##bbaa#########.", "##ba####.######.", "..a###....#####."}; stopmotion-0.8.0/graphics/icons/pasteicon.xpm000066400000000000000000000045701234321124500213630ustar00rootroot00000000000000/* XPM */ static const char *pasteicon[]={ "18 18 103 2", "Qt c None", ".6 c #000000", "#A c #020202", "#B c #050505", ".N c #1c1c1c", ".# c #232110", ".F c #242424", ".z c #262626", ".s c #292929", "#u c #2e2e2e", "#K c #303030", "#o c #383838", "#c c #393939", ".7 c #3a3a3a", ".Y c #3b3b3b", ".d c #3c3c3c", ".i c #3d3d3d", ".M c #424242", ".D c #444444", ".v c #4b452a", ".c c #5a5000", ".E c #666666", "#x c #686868", "#w c #696969", "#v c #6a6a6a", ".L c #6d6d6d", ".R c #707070", ".a c #716b32", ".y c #747474", ".x c #787878", "#r c #7a7a7a", "#q c #7b7b7b", "#p c #7c7c7c", ".w c #7d7d7d", "#l c #7e7e7e", "#k c #7f7f7f", "#j c #808080", "#f c #818181", "#e c #838383", ".o c #857414", "#. c #858585", ".l c #86761f", ".9 c #878787", ".1 c #898989", ".b c #8a7e2d", ".8 c #8a8a8a", ".0 c #8b8b8b", ".X c #8d8d8d", ".Z c #8e8e8e", ".W c #8f8f8f", ".Q c #909090", ".V c #919191", ".U c #929292", ".J c #939393", ".C c #959595", ".I c #969696", ".P c #979797", ".B c #999999", ".H c #9b9b9b", ".A c #9c9c9c", ".u c #9f9f9f", ".t c #a2a2a2", ".e c #a49941", ".h c #aba062", "#i c #afafaf", "#d c #b6b6b6", ".n c #bbb574", ".r c #bcbcbc", "#b c #bdac92", ".5 c #bdb4ac", "#h c #bea585", "#n c #bfa47f", ".q c #bfbfbf", "#J c #c09b6b", "#z c #c09f71", "#t c #c0a077", "#I c #c1a174", "#H c #c2a67f", "#G c #c2ab89", ".p c #c2c2c2", "#F c #c3af94", "#E c #c3b59e", "#D c #c4b9a9", "#C c #c6beb3", ".T c #c9c9c9", ".O c #cfcfcf", ".g c #d2cc8f", ".G c #d5d5d5", ".k c #dcdcdc", ".K c #dedede", ".4 c #e1dedc", ".j c #e2e2e2", "#y c #e9c9a0", "#s c #ebd0aa", "#m c #edd6b8", "#g c #f0ddc1", "#a c #f1e3ce", "## c #f5e9da", ".m c #f6f6db", ".3 c #f8f0e5", ".2 c #f9f6f2", ".S c #fbf7f4", ".f c #ffffff", "QtQtQtQtQt.#.a.b.cQtQtQtQtQtQtQtQtQt", "Qt.d.d.d.d.e.f.g.h.c.d.d.d.dQtQtQtQt", ".i.j.k.k.l.m.g.n.e.o.c.p.q.r.sQtQtQt", ".d.k.t.u.l.c.c.v.v.v.v.w.x.y.zQtQtQt", ".d.k.u.A.B.C.D.D.D.D.D.D.D.E.FQtQtQt", ".d.G.H.B.I.J.D.K.K.K.K.K.L.M.NQtQtQt", ".d.O.P.C.J.Q.D.K.f.f.f.f.R.S.MQtQtQt", ".d.T.U.V.W.X.D.K.f.f.f.f.R.R.M.MQtQt", ".Y.p.Z.X.0.1.D.K.f.f.f.2.3.4.5.6QtQt", ".7.r.8.1.9#..D.K.f.f.2.3###a#b.6QtQt", "#c#d#.#.#e#f.D.K.f.2.3###a#g#h.6QtQt", "#c#i#f#j#k#l.D.K.2.3###a#g#m#n.6QtQt", "#o#i.w#p#q#r.D.K.3###a#g#m#s#t.6QtQt", "#u.E#v#v#w#x.D.K###a#g#m#s#y#z.6QtQt", "Qt#A#A#A#A#B.D#C#D#E#F#G#H#I#J.6QtQt", "QtQtQtQtQtQt.D.6.6.6.6.6.6.6.6#KQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/pause.xpm000066400000000000000000000006241234321124500205070ustar00rootroot00000000000000/* XPM */ static const char *pauseicon[]={ "16 16 2 1", ". c None", "# c #000000", "................", "................", "................", "................", "....###..###....", "....###..###....", "....###..###....", "....###..###....", "....###..###....", "....###..###....", "....###..###....", "....###..###....", "................", "................", "................", "................"}; stopmotion-0.8.0/graphics/icons/play.xpm000066400000000000000000000006231234321124500203360ustar00rootroot00000000000000/* XPM */ static const char *playicon[]={ "16 16 2 1", ". c None", "# c #000000", "................", "................", ".....#..........", ".....##.........", ".....###........", ".....####.......", ".....#####......", ".....######.....", ".....######.....", ".....#####......", ".....####.......", ".....###........", ".....##.........", ".....#..........", "................", "................"}; stopmotion-0.8.0/graphics/icons/previousframe.xpm000066400000000000000000000032151234321124500222600ustar00rootroot00000000000000/* XPM */ static const char *previousframeicon[]={ "32 32 31 1", "# c None", ". c None", "d c #000000", "y c #010000", "c c #010002", "x c #020001", "h c #020003", "f c #030104", "e c #040205", "j c #050306", "z c #060405", "b c #060407", "p c #070508", "A c #080607", "n c #080609", "k c #09070a", "C c #0a0809", "i c #0a080b", "q c #0b090c", "r c #0c0a0d", "u c #0d0b0e", "B c #100e0f", "s c #100e11", "m c #7b797c", "v c #807e81", "t c #817f82", "a c #848285", "g c #868487", "l c #888689", "w c #8a8889", "o c #8a888b", "................................", "................................", "................................", "................................", "................................", "................................", "................................", "................................", ".....................####.......", ".................abc..#ccd......", "...............aeecb..#cfd......", ".............gcchccc..#hcd......", "...........acbcicjkc.##chd......", ".........lhchjcjcccc.##ckd......", ".......mekcccncccccc.##hcd......", ".....ocpccqfccjjcccc.##ecd......", ".....orcchnccbjccccc.##ccd......", ".......ahccsiccfcccc.##pqd......", ".........tecckcpcccc.##ccd......", "...........occuccccc.##ccd......", ".............vcccccc.##cfd......", "...............wxyyz.##yAd......", ".................wBy.##Cyd......", ".....................##.........", ".....................##.........", ".....................#..........", "................................", "................................", "................................", "................................", "................................", "................................"}; stopmotion-0.8.0/graphics/icons/quiticon.xpm000066400000000000000000000055071234321124500212320ustar00rootroot00000000000000/* XPM */ static const char *quiticon[]={ "16 16 141 2", "Qt c None", ".k c #9f1005", "af c #9f1105", ".# c #a01105", "aj c #a01201", ".M c #a01205", "ak c #a11703", "#1 c #a21705", "#9 c #a21905", "#R c #a21907", "#J c #a21b09", "#D c #a51d0c", "#w c #a51f0e", "#o c #a52110", "#h c #a72312", ".9 c #a72413", ".x c #a72718", ".Z c #a82b19", ".i c #aa2e20", ".h c #ac3120", ".g c #ac3122", ".j c #ac3421", "#2 c #ac3422", ".f c #ac3423", ".e c #ac3525", ".c c #ae3829", ".d c #af3526", ".b c #af3829", ".N c #b03f2f", ".a c #b14030", ".z c #b23e18", ".P c #b8522c", ".A c #b8532e", ".B c #b95831", ".Q c #bb5e37", ".C c #bc5c36", ".D c #bd6038", ".G c #c06b43", "## c #c26d46", ".H c #c26e48", "#j c #c3714a", ".R c #c46b49", ".I c #c4724b", "#q c #c4744d", ".J c #c4754e", "#4 c #c5764f", "#c c #c57750", ".m c #c6714c", ".K c #c67953", ".W c #c67b54", ".0 c #c77753", ".n c #c77954", "ai c #c77955", "ae c #c77c57", ".X c #c77e57", "#i c #c87754", ".o c #c87c54", ".O c #c87c57", ".p c #c87e58", "#s c #c8815a", ".7 c #c8825c", ".r c #c98159", "#z c #c98560", "#f c #c98661", ".q c #ca8158", ".V c #ca815d", ".t c #ca875c", "#F c #ca8862", "#m c #ca8963", ".u c #ca8a5e", "#S c #ca8a5f", "#E c #cc815e", ".s c #cc855a", "#3 c #cc8a5f", ".6 c #cd8863", ".v c #ce8f63", "#T c #cf8b6a", "a# c #cf926e", ".8 c #cf9469", ".Y c #d09468", "#n c #d0976d", "#g c #d1956b", "#v c #d19b72", "#C c #d29d76", ".E c #d39173", "#H c #d39977", ".L c #d39e72", "#6 c #d49e7f", "#Q c #d4a17d", ".F c #d59376", "#P c #d59e7f", "#Z c #d5a283", ".w c #d5a576", "a. c #d5a677", "#I c #d79f79", "#u c #d7a07f", "ag c #d7a582", "#8 c #d7a585", "#0 c #d7a685", "#p c #d8997b", "#x c #d89b7e", "#Y c #d9a185", "ac c #d9a88b", "#7 c #daa98d", "#K c #dba285", "ah c #dbb092", ".2 c #dca288", "#B c #dcac90", ".y c #dcb492", ".l c #ddb593", "aa c #e1b195", "ab c #e1b59a", "#. c #e2ab93", "#U c #e2b39a", ".3 c #e3b097", "#V c #e3b59b", "#d c #e5b59e", "ad c #e5c8ae", "#N c #e9c0a9", "#t c #ecc5b1", "#A c #edc7b2", "#b c #eec6b3", "#e c #f0cdba", "#M c #f1cfbc", "#a c #f2cfbd", ".U c #f3d0bf", ".S c #f7d4c5", ".1 c #f8d7c8", "#O c #f9ded0", "#L c #fadfd1", "#W c #fce4d5", "#5 c #fde7da", ".4 c #ffefe5", "#k c #fff0e6", "#r c #fff0e7", "#y c #fff1e7", "#l c #fff2e8", "#G c #fff5ec", ".5 c #fffaf3", "#X c #fffff9", ".T c #ffffff", "QtQt.#.a.b.c.d.e.f.g.h.i.j.kQtQt", "Qt.b.l.m.n.o.p.q.r.s.t.u.v.w.xQt", ".#.y.z.A.B.C.D.E.F.G.H.I.J.K.L.M", ".N.O.P.Q.R.S.T.T.T.T.U.V.W.X.Y.Z", ".b.0.B.R.T.T.1.2.3.4.T.5.6.7.8.9", ".c.o.C.S.T#.###a#b#c#d.T#e#f#g#h", ".d.p#i.T.1###j.4#k.W.X#l.T#m#n#o", ".e.q.E.T#p#j#q#k#r.X#s#t.T#u#v#w", ".f.r.F.T#x#q#c#r#y#s#z#A.T#B#C#D", ".g.s#E.T.U#c.W#y#l#z#F#G.T#H#I#J", ".h.t.H.4.T#K.X#L#M#F#N.T#O#P#Q#R", ".i#S.I#T.T.T#L#U#V#W.T#X#Y#Z#0#1", "#2#3#4.W.6#L.T.T.T.T#5#Y#6#7#8#9", ".ka..K.X.7#fa#aaab#H#P#Zacadaeaf", "Qt.x.L.Y.8#g#n#v#C#I#QagahaiajQt", "QtQt.M.Z.9#h#o#w#D#J#R#1akafQtQt"}; stopmotion-0.8.0/graphics/icons/redoicon.xpm000066400000000000000000000034761234321124500212040ustar00rootroot00000000000000/* XPM */ static const char *redoicon[]={ "18 17 70 2", "Qt c None", ".8 c #000000", ".3 c #000001", ".6 c #010003", ".7 c #020005", ".5 c #03080a", ".X c #03090a", ".S c #030c0b", ".L c #040b06", ".T c #041714", "#d c #050a0c", "#. c #050b0c", "#a c #050d0e", ".F c #050e0d", ".Y c #071112", ".E c #081914", "#c c #090f10", ".Q c #0a1910", ".M c #0a1f18", ".y c #0b281e", ".R c #0d2419", ".N c #0d3525", ".D c #0f2417", ".4 c #10211f", ".G c #123926", "#b c #142724", ".9 c #14311f", ".v c #143120", ".z c #143d29", ".o c #153220", "## c #162d26", ".i c #163321", ".u c #173a23", ".b c #1b4029", ".c c #1b422a", ".x c #1e4335", ".# c #1e472e", ".g c #214a30", ".t c #224b30", ".h c #224b31", ".l c #227d37", ".a c #234e33", ".n c #245135", ".U c #259039", ".O c #2a8f3d", ".q c #2f9645", ".H c #36a34d", ".w c #38774e", ".r c #3bb057", ".V c #3e9951", ".A c #3faf57", ".B c #42b75b", ".s c #43ba5c", ".2 c #468166", ".Z c #55ae72", ".1 c #5aa77b", ".0 c #5ab975", ".C c #7ba08a", ".J c #88ab9c", ".k c #90bd9f", ".I c #9dc6aa", ".d c #afbeba", ".W c #b2d1bc", ".p c #bdcec7", ".j c #bfd0c8", ".m c #c0d1c9", ".f c #c1cecc", ".K c #c2dbca", ".P c #cfe0d4", ".e c #dbeadf", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQt.#.#.aQtQtQtQtQtQtQtQtQtQt", "QtQtQt.b.c.d.e.f.g.hQtQtQtQtQtQtQtQt", "QtQt.i.j.k.l.l.l.e.m.gQtQtQtQt.nQtQt", "Qt.o.p.l.l.q.r.s.l.l.e.tQtQt.n.uQtQt", "Qt.v.l.w.x.y.y.z.A.B.l.e.g.n.C.uQtQt", ".D.l.n.EQtQtQtQt.F.G.H.l.I.J.K.uQtQt", ".L.l.MQtQtQtQtQtQtQt.N.H.l.O.P.uQtQt", ".Q.R.SQtQtQtQtQtQtQt.T.l.U.V.W.uQtQt", "Qt.X.YQtQtQtQtQtQt.E.l.Z.0.1.2.uQtQt", "Qt.3.4.5QtQtQtQt.6.6.6.7.6.6.8.9QtQt", "QtQt#.##.FQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQt#a#b#cQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQt.3#d.3QtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/removeframeicon.xpm000066400000000000000000000156471234321124500225660ustar00rootroot00000000000000/* XPM */ static const char *removeframeicon[] = { "32 32 302 2", " s None c None", ".. c #528740", "#. c #115306", "a. c #000000", "b. c #235074", "c. c #8093a4", "d. c #d0dbcf", "e. c #175500", "f. c #699fce", "g. c #356d96", "h. c #253c1b", "i. c #5ca444", "j. c #5191c1", "k. c #a6b8c9", "l. c #d2e5cf", "m. c #969ca2", "n. c #271d24", "o. c #696766", "p. c #5291c1", "q. c #585759", "r. c #bbcedc", "s. c #5d8ab1", "t. c #218102", "u. c #4b88bd", "v. c #373a39", "w. c #306082", "x. c #52708d", "y. c #5aac41", "z. c #1d6402", "A. c #54a640", "B. c #c3d5e1", "C. c #4b83b2", "D. c #b5c2cc", "E. c #a0ba94", "F. c #234916", "G. c #a0aa9b", "H. c #3d3c3c", "I. c #509340", "J. c #b3c8d7", "K. c #ecf2ea", "L. c #237005", "M. c #1b600d", "N. c #41769a", "O. c #9ebbd2", "P. c #313832", "Q. c #323a31", "R. c #adc0ce", "S. c #4c8ebf", "T. c #8397a7", "U. c #25620b", "V. c #1d1f1c", "W. c #dfe4e9", "X. c #38729d", "Y. c #76a3c7", "Z. c #b3c1cd", "0. c #a2c295", "1. c #6995bd", "2. c #1d3d0f", "3. c #639ed0", "4. c #575357", "5. c #3a383a", "6. c #b0c3d1", "7. c #6e93b0", "8. c #605f5e", "9. c #105900", ".# c #2b7c08", "## c #65b346", "a# c #2f8d09", "b# c #787679", "c# c #5e89b2", "d# c #7098bb", "e# c #519e40", "f# c #423f3f", "g# c #b7c7d3", "h# c #b0cde3", "i# c #406640", "j# c #2c730c", "k# c #b4cbdf", "l# c #504e4d", "m# c #a7b9c5", "n# c #8aa1b4", "o# c #144f0d", "p# c #619bc9", "q# c #6098c6", "r# c #d3e7cf", "s# c #37709a", "t# c #b1cde3", "u# c #4081b5", "v# c #508ab8", "w# c #224f6d", "x# c #3a393a", "y# c #aebdc7", "z# c #5485a8", "A# c #898682", "B# c #5c93c0", "C# c #353434", "D# c #312a30", "E# c #6b9ac4", "F# c #98b9d0", "G# c #4d88b5", "H# c #8fb9da", "I# c #a9a8a9", "J# c #1e1729", "K# c #8f8989", "L# c #467ead", "M# c #666261", "N# c #d8ecd1", "O# c #323231", "P# c #cacbcb", "Q# c #3d4d62", "R# c #120613", "S# c #aec4d6", "T# c #4881b0", "U# c #d9ecd1", "V# c #263524", "W# c #6a9bc4", "X# c #3f4e5d", "Y# c #1a181c", "Z# c #d0dfcf", "0# c #a7a6a6", "1# c #5f5f5f", "2# c #403f40", "3# c #b3caab", "4# c #9cbcd3", "5# c #237c01", "6# c #92b9da", "7# c #5aad42", "8# c #437140", "9# c #2f8f09", ".a c #5f90bd", "#a c #8e979e", "aa c #485e7d", "ba c #4d9740", "ca c #5492c2", "da c #6fa6d5", "ea c #297508", "fa c #939392", "ga c #041800", "ha c #144401", "ia c #3d78a4", "ja c #3a6c8f", "ka c #6996b5", "la c #d4e9cf", "ma c #bacdda", "na c #3e506a", "oa c #478540", "pa c #404040", "qa c #143515", "ra c #6b99b8", "sa c #2f5f80", "ta c #4b7696", "ua c #4788bb", "va c #447eae", "wa c #39739e", "xa c #5381a2", "ya c #b0c4d2", "za c #709bbb", "Aa c #195e07", "Ba c #4a83b4", "Ca c #99b590", "Da c #5390bf", "Ea c #305f80", "Fa c #5b5f69", "Ga c #a9a8aa", "Ha c #66b447", "Ia c #257e05", "Ja c #383a3b", "Ka c #d4e3f1", "La c #5c8eb6", "Ma c #2b3b26", "Na c #acbfcc", "Oa c #176f00", "Pa c #649cce", "Qa c #191224", "Ra c #3c393b", "Sa c #588cb3", "Ta c #1f450d", "Ua c #306992", "Va c #2c5a7a", "Wa c #235980", "Xa c #85b0d3", "Ya c #71a5cd", "Za c #5389b5", "0a c #70a3ce", "1a c #203f14", "2a c #1e2a19", "3a c #eef4eb", "4a c #77a9cf", "5a c #d1e1cf", "6a c #97bcd9", "7a c #2e2d2c", "8a c #192c10", "9a c #403f41", ".b c #244864", "#b c #535251", "ab c #d6eacf", "bb c #2f2e30", "cb c #cee0ef", "db c #242424", "eb c #485d7a", "fb c #403d42", "gb c #6695bb", "hb c #b8cedf", "ib c #528dc1", "jb c #ffffff", "kb c #d6e8d0", "lb c #d8e0e5", "mb c #9abfdc", "nb c #999b9c", "ob c #75aad8", "pb c #cbd1d7", "qb c #4b81b1", "rb c #437faa", "sb c #45677f", "tb c #c4d6e3", "ub c #5b87a8", "vb c #577ca0", "wb c #a2b9cc", "xb c #7ea6c7", "yb c #d4e1cf", "zb c #161815", "Ab c #4f8aba", "Bb c #acaba9", "Cb c #666c70", "Db c #143e12", "Eb c #98ad90", "Fb c #16486f", "Gb c #b0c9de", "Hb c #90b2cd", "Ib c #bbd4b0", "Jb c #464547", "Kb c #8998a4", "Lb c #39739f", "Mb c #457e40", "Nb c #244516", "Ob c #abb2b8", "Pb c #99afc0", "Qb c #9fb3c2", "Rb c #cfd9cf", "Sb c #b5b3b2", "Tb c #242325", "Ub c #144568", "Vb c #326284", "Wb c #918d89", "Xb c #acbfcd", "Yb c #4b8dbe", "Zb c #1c4709", "0b c #9fafbb", "1b c #0e1e2a", "2b c #070609", "3b c #383739", "4b c #7f7a79", "5b c #397aae", "6b c #5695cb", "7b c #a6c5dd", "8b c #224b14", "9b c #4a7390", ".c c #3d495d", "#c c #4e90c1", "ac c #b6cad9", "bc c #191218", "cc c #d1d8dd", "dc c #557796", "ec c #639d4a", "fc c #abbdca", "gc c #adc6dc", "hc c #8fa9c0", "ic c #3b383d", "jc c #729dc0", "kc c #a6b8c4", "lc c #9f9f9f", "mc c #1f151f", "nc c #4c9240", "oc c #238902", "pc c #b3b8be", "qc c #565555", "rc c #4b8bbb", "sc c #3c383d", "tc c #5c98c5", "uc c #142411", "vc c #749fbf", "wc c #161a1e", "xc c #406d40", "yc c #9fad99", "zc c #d2e4cf", "Ac c #104200", "Bc c #4d4e4c", "Cc c #487b9f", "Dc c #164a12", "Ec c #9b9a99", "Fc c #98aebd", "Gc c #9eb2bf", "Hc c #d6ebd0", "Ic c #d3e4cf", "Jc c #143c14", "Kc c #cfdbcf", "Lc c #869aa9", "Mc c #d8e6d2", "Nc c #80a5c4", "Oc c #4777a1", "Pc c #336a93", "Qc c #24516f", " ", " ", " ", " a.a.a.a.a.a.a.a.", " a.a.a.a.a.a.a.a.", " ", " ", " ", " ", " jbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjbjb ", " jblbkckcm#fcNaNaXbR.yaJ.acr.tbB.mag#D.W.jb ", " jbGcw#w#QcVaEasaw.VbjaN.Ccz#rakaxa9bsby#jb ", " jbFcUbWaUaPcg.s#X.waiarbSavc4#F#zaubta6.jb ", " jbPbFbLbcav#G#rcYbS.S.j.YambKacb6aY.Lahbjbjbjbjbjbjb ", " jbQbb.7.7bO.NcT#5bu#ua#ctc4ah#t#XaW#Zak#jbmag#D.W.jb ", " jb0b.bLcccpbk.s.L#BaAbDap.p#H#6#0aB#C.Gbjbxa9bsby#jb ", " jbm.1bCbBbSbpcwbHbxbjcgbq#3.obda6bu.vagcjbzaubta6.jb ", " jbnbwcqcA#Wbfa#aKbT.n#hcd#.af.PaibqbOcS#jb6aY.Lahbjb ", " jb0#C##bo.8.l#C#pa1#EcP#c.dc1.E#c#vbx.Z.jbXaW#Zak#jb ", " jbI#Ra5.x#2#H.7af#M#4bK#Fa.cebaanaQ#X#Objb0aB#C.Gbjb ", " jbGaicY#2bTb3b9aq.b#4.D#n.mcJ#QaR#bcdblcjb6bu.vagcjb ", " jbG.h.2aV.bbscfbJbBcO#zb8a2.F.8bZbTaNbycjbibqbOcS#jb ", " jbEbha1aMaQ.v.JaP.V#ucgaAcz.ea.#5#L.U.E.jbc#vbx.Z.jb ", " jbCae.AaM.DcJcqaDbo##.9.Oat.a#9#ocIaj#0.jbnaQ#X#Objb ", " jb3#..I.baMbxci#8#oance#A.7#Ha##y.i.ecIbjbR#bcdblcjb ", " jbK.ybIcl.Z#KcRbd.5azcr#laHcU#N#abkbMc3ajbZbTaNbycjb ", " jbEbha1aMaQ.v.JaP.V#ucgaAcz.ea.#5#L.U.E.jb ", " jbCae.AaM.DcJcqaDbo##.9.Oat.a#9#ocIaj#0.jb ", " jb3#..I.baMbxci#8#oance#A.7#Ha##y.i.ecIbjb ", " jbK.ybIcl.Z#KcRbd.5azcr#laHcU#N#abkbMc3ajb ", " ", " "}; stopmotion-0.8.0/graphics/icons/removescene.xpm000066400000000000000000000023751234321124500217120ustar00rootroot00000000000000/* XPM */ static const char *removescene[] = { "32 32 4 1", " s None c None", ". c #ffff00", "# c #000000", "a c #ffffff", " ", " ", " ## ", " #aa## ########", " ######### ########", " ##aaaaa### ", " ########## ", " ##aaaaa## ", " ######### ", " ##aaaaa## ", " ######### ", " ##aaaaa### ", " #####.a.# ", " ###a.a# ", " #####################.a.# ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ######################## ", " ", " "}; stopmotion-0.8.0/graphics/icons/rewind.xpm000066400000000000000000000006251234321124500206630ustar00rootroot00000000000000/* XPM */ static const char *rewindicon[]={ "16 16 2 1", ". c None", "# c #000000", "................", "................", ".......#.....#..", "......##....##..", ".....###...###..", "....####..####..", "...#####.#####..", "..############..", "..############..", "...#####.#####..", "....####..####..", ".....###...###..", "......##....##..", ".......#.....#..", "................", "................"}; stopmotion-0.8.0/graphics/icons/steptobeginning.xpm000066400000000000000000000006361234321124500225740ustar00rootroot00000000000000/* XPM */ static const char *steptobeginningicon[]={ "16 16 2 1", ". c None", "# c #000000", "................", "................", "...........#....", "..........##....", "...###...###....", "...###..####....", "...###.#####....", "...#########....", "...#########....", "...###.#####....", "...###..####....", "...###...###....", "..........##....", "...........#....", "................", "................"}; stopmotion-0.8.0/graphics/icons/steptoend.xpm000066400000000000000000000006301234321124500213740ustar00rootroot00000000000000/* XPM */ static const char *steptoendicon[]={ "16 16 2 1", ". c None", "# c #000000", "................", "................", "....#...........", "....##..........", "....###...###...", "....####..###...", "....#####.###...", "....#########...", "....#########...", "....#####.###...", "....####..###...", "....###...###...", "....##..........", "....#...........", "................", "................"}; stopmotion-0.8.0/graphics/icons/stop.xpm000066400000000000000000000006231234321124500203560ustar00rootroot00000000000000/* XPM */ static const char *stopicon[]={ "16 16 2 1", ". c None", "# c #000000", "................", "................", "................", "................", "....########....", "....########....", "....########....", "....########....", "....########....", "....########....", "....########....", "....########....", "................", "................", "................", "................"}; stopmotion-0.8.0/graphics/icons/undoicon.xpm000066400000000000000000000034761234321124500212200ustar00rootroot00000000000000/* XPM */ static const char *undoicon[]={ "18 17 70 2", "Qt c None", ".4 c #000000", ".9 c #000001", ".5 c #010003", ".6 c #020005", ".7 c #03080a", ".2 c #03090a", ".U c #030c0b", ".P c #040b06", ".T c #041714", "#d c #050a0c", "## c #050b0c", "#c c #050d0e", ".I c #050e0d", ".1 c #071112", ".J c #081914", "#a c #090f10", ".W c #0a1910", ".O c #0a1f18", ".z c #0b281e", ".V c #0d2419", ".N c #0d3525", ".K c #0f2417", ".8 c #10211f", ".H c #123926", "#b c #142724", ".3 c #14311f", ".C c #143120", ".y c #143d29", ".u c #153220", "#. c #162d26", ".n c #163321", ".o c #173a23", ".h c #1b4029", ".g c #1b422a", ".A c #1e4335", ".a c #1e472e", ".c c #214a30", ".p c #224b30", ".b c #224b31", ".k c #227d37", ".# c #234e33", ".i c #245135", ".S c #259039", ".M c #2a8f3d", ".s c #2f9645", ".G c #36a34d", ".B c #38774e", ".r c #3bb057", ".R c #3e9951", ".x c #3faf57", ".w c #42b75b", ".q c #43ba5c", ".X c #468166", ".0 c #55ae72", ".Y c #5aa77b", ".Z c #5ab975", ".v c #7ba08a", ".E c #88ab9c", ".l c #90bd9f", ".F c #9dc6aa", ".f c #afbeba", ".Q c #b2d1bc", ".t c #bdcec7", ".m c #bfd0c8", ".j c #c0d1c9", ".d c #c1cecc", ".D c #c2dbca", ".L c #cfe0d4", ".e c #dbeadf", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQt.#.a.aQtQtQtQtQtQtQt", "QtQtQtQtQtQt.b.c.d.e.f.g.hQtQtQtQtQt", ".iQtQtQtQt.c.j.e.k.k.k.l.m.nQtQtQtQt", ".o.iQtQt.p.e.k.k.q.r.s.k.k.t.uQtQtQt", ".o.v.i.c.e.k.w.x.y.z.z.A.B.k.CQtQtQt", ".o.D.E.F.k.G.H.IQtQtQtQt.J.i.k.KQtQt", ".o.L.M.k.G.NQtQtQtQtQtQtQt.O.k.PQtQt", ".o.Q.R.S.k.TQtQtQtQtQtQtQt.U.V.WQtQt", ".o.X.Y.Z.0.k.JQtQtQtQtQtQt.1.2QtQtQt", ".3.4.5.5.6.5.5.5QtQtQtQt.7.8.9QtQtQt", "QtQtQtQtQtQtQtQtQtQtQt.I#.##QtQtQtQt", "QtQtQtQtQtQtQtQtQtQt#a#b#cQtQtQtQtQt", "QtQtQtQtQtQtQtQt.9#d.9QtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; stopmotion-0.8.0/graphics/icons/videoexport.xpm000066400000000000000000000010241234321124500217350ustar00rootroot00000000000000/* XPM */ static const char *videoexport[] = { "18 18 5 1", ". c #ffff00", "# c #000000", "a c #ffffff", "b c #00ffff", "c c #c0c0c0", "##################", "cc#cc#cc#c#cc#cc#c", "cc#cc#cc#c#cc#cc#c", "##################", "c##cccccccccccc###", "c#cccccc##cccccc#c", "c#ccbbba##aabbcc#c", "c#ccaaa####baacc#c", "c#baa###..###aac#c", "c#ba#aa#aa#ba#aa#c", "c#baaaa#aa#baaaa#c", "c#baaaa#aa#baaaa#c", "c#abbbb#aa#abbbb#c", "c#abbba####abbbb#c", "##################", "cc#cc#cc#c#cc#cc#c", "cc#cc#cc#c#cc#cc#c", "##################"}; stopmotion-0.8.0/graphics/icons/whatsthisicon.xpm000066400000000000000000000010761234321124500222630ustar00rootroot00000000000000/* XPM */ static const char *whatsthisicon[]={ "16 16 13 1", ". c None", "a c #000000", "# c #000080", "f c #7e7c77", "b c #817f7a", "e c #898681", "c c #8a8782", "d c #8b8984", "k c #8c8a85", "g c #8e8b86", "i c #97948e", "j c #999691", "h c #a29f99", ".........####a..", "........######a.", "a......##abcd##a", "aa.....#ab....#a", "aaa....##a....#a", "aaaa....##...##a", "aaaaa.......##ab", "aaaaaa.....##ab.", "aaaaaaa...##ab..", "aaaaaaaa..##ae..", "aaaaafeg...ab...", "aafaae......h...", "ag..aa....##a...", "....aai...##aj..", ".....aa....jkj..", ".....aai........"}; stopmotion-0.8.0/graphics/icons/windowicon.xpm000066400000000000000000000007351234321124500215550ustar00rootroot00000000000000/* XPM */ static char * windowicon[] = { "16 16 7 1", " c None", ". c #D40000", "+ c #D50000", "@ c #D30000", "# c #0000C6", "$ c #0000C5", "% c #000000", " ", " .+ .. ", " +.... .... ", " ...... @.....", " ..... ......", " .... .... ", " @@ .. ", " ", "##$ %%%%% ", "###$ %%%%%% ", "##### %%%%%% ", "##### %%%%%% ", "#### %%%%%% ", "### %%%%% ", "#$ ", " "}; stopmotion-0.8.0/graphics/stopmotion.png000066400000000000000000000015211234321124500204470ustar00rootroot00000000000000PNG  IHDR9sBIT|d pHYs y yQztEXtSoftwarewww.inkscape.org<IDATHŗMlLQjiłH:ڪ KXTQvӊD҅%@Zm D5ABl}-fF&{oOxWswrMKެͬ^mH @- ˤ0ߐẎq ;RO.Ƣ}$4Wl ;Nnqi"t_ lN0@[7 °pL ֬ fɠ)pl=f}sgǮr*$ʋ !av3{! $%_ :rzz|=jpV$``_LR ?")1i<LL~r<0Xb;eN>kr AL˸42[C܃$`Ho5X0 }%EA5lKB/ 3[6\~%h{ҚiF\|G%,.,+\Ff}B<#Qa 2nWY\BQوfOjgtGfmTzjP Azg).Ufg,qu%GRggyN0EjV~dC L>mmR15 q_,ڣRs_AW3%Sj{蔔<^>ڥu Ŕ}^ G QZ}0/IENDB`stopmotion-0.8.0/graphics/stopmotion.svg000066400000000000000000000415331234321124500204710ustar00rootroot00000000000000 image/svg+xml stopmotion-0.8.0/graphics/stopmotion.xpm000066400000000000000000000023731234321124500204750ustar00rootroot00000000000000/* XPM */ static char * logoLSM_icon32x32_xpm[] = { "32 32 4 1", " c None", ". c #D40000", "+ c #0000C6", "@ c #000000", " ", " ", " ", " ..... ..... ", " ....... ........ ", " ......... ......... ", " .......... .......... ", " ........... .......... ", " ........... .......... ", " .......... .......... ", " ......... ......... ", " ....... ........ ", " ..... ...... ", " ", " ", " ", " ++ @@@@@@@ ", " ++++ @@@@@@@@@@ ", " +++++ @@@@@@@@@@@ ", " ++++++ @@@@@@@@@@@ ", " ++++++++ @@@@@@@@@@@ ", " +++++++++ @@@@@@@@@@@ ", " +++++++++ @@@@@@@@@@@ ", " ++++++++ @@@@@@@@@@@ ", " +++++++ @@@@@@@@@@@ ", " ++++++ @@@@@@@@@@@ ", " +++++ @@@@@@@@@@@ ", " +++ @@@@@@@@@ ", " ++ ", " ", " ", " "}; stopmotion-0.8.0/graphics/stopmotion_logo.xpm000066400000000000000000007405251234321124500215250ustar00rootroot00000000000000/* XPM */ static const char *const stopmotion_logo[] = { /* columns rows colors chars-per-pixel */ "556 219 98 2", " c #000000", ". c #0C0C0C", "X c #131313", "o c #1C1C1C", "O c #232323", "+ c #2B2B2B", "@ c #343434", "# c #3B3B3B", "$ c #454545", "% c #4D4D4D", "& c #535353", "* c #5C5C5C", "= c #636363", "- c #6C6C6C", "; c #757575", ": c #7C7C7C", "> c #0037C2", ", c #0138C2", "< c #083DC4", "1 c #0F43C6", "2 c #1447C7", "3 c #1749C8", "4 c #1C4DC9", "5 c #2554CB", "6 c #2957CC", "7 c #305DCD", "8 c #3561CF", "9 c #3C66D0", "0 c #3F68D1", "q c #5277D6", "w c #587CD7", "e c #6586DA", "r c #6788DB", "t c #6A8ADB", "y c #7794DE", "u c #7E9AE0", "i c #C20000", "p c #C40A0A", "a c #C61212", "s c #C71818", "d c #C81C1C", "f c #C92222", "g c #CC2C2C", "h c #CD3333", "j c #CF3939", "k c #D03D3D", "l c #D14242", "z c #D34B4B", "x c #D55353", "c c #D75959", "v c #D85E5E", "b c #D96262", "n c #DB6C6C", "m c #DD7373", "M c #DE7979", "N c #E07E7E", "B c #848484", "V c gray55", "C c #929292", "Z c #9C9C9C", "A c #A3A3A3", "S c #ADADAD", "D c #B4B4B4", "F c #BBBBBB", "G c #88A2E3", "H c #97ADE6", "J c #B6C6EE", "K c #E18484", "L c #E28B8B", "P c #E49393", "I c #E79C9C", "U c #E8A2A2", "Y c #EAABAB", "T c #ECB4B4", "R c #EEBBBB", "E c #C4C4C4", "W c #CCCCCC", "Q c #D4D4D4", "! c #DBDBDB", "~ c #CFD9F4", "^ c #DEE5F6", "/ c #F0C2C2", "( c #F2CBCB", ") c #F4D4D4", "_ c #F6DCDC", "` c #E5E5E5", "' c #EBEBEB", "] c #E0E7F8", "[ c #E3E9F8", "{ c #ECF0FA", "} c #F7E0E0", "| c #F8E4E4", " . c #FAECEC", ".. c #F4F4F4", "X. c #F2F5FC", "o. c #F7F9FD", "O. c #FBF3F3", "+. c #FEFEFE", /* pixels */ "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.| T K z l M Y | +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+._ I m l x L R O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.T f i i i i i i i i d Y +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.K p i i i i i i i i j ) +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. .v i i i i i i i i i i i i x .+.+.+.+.+.+.+.+.+.+.+.+.+.) h i i i i i i i i i i i p K O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.R s i i i i i i i i i i i i i i s R +.+.+.+.+.+.+.+.+.+.+.K p i i i i i i i i i i i i i i h | +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.| a i i i i i i i i i i i i i i i i a | +.+.+.+.+.+.+.+.+.T i i i i i i i i i i i i i i i i i j +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.z i i i i i i i i i i i i i i i i i i z +.+.+.+.+.+.+.+.| s i i i i i i i i i i i i i i i i i i P +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.I i i i i i i i i i i i i i i i i i i i i I +.+.+.+.+.+.+.x i i i i i i i i i i i i i i i i i i i p _ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.p i i i i i i i i i i i i i i i i i i i i a O.+.+.+.+.+.R i i i i i i i i i i i i i i i i i i i i i x +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+./ i i i i i i i i i i i i i i i i i i i i i i ( +.+.+.+.+.M i i i i i i i i i i i i i i i i i i i i i a +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.L i i i i i i i i i i i i i i i i i i i i i i P +.+.+.+.+.l i i i i i i i i i i i i i i i i i i i i i i _ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.c i i i i i i i i i i i i i i i i i i i i i i b +.+.+.+.+.a i i i i i i i i i i i i i i i i i i i i i i Y +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.g i i i i i i i i i i i i i i i i i i i i i i h +.+.+.+._ i i i i i i i i i i i i i i i i i i i i i i i m +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.d i i i i i i i i i i i i i i i i i i i i i i f +.+.+.+.) i i i i i i i i i i i i i i i i i i i i i i i n +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.x i i i i i i i i i i i i i i i i i i i i i i c +.+.+.+.+.p i i i i i i i i i i i i i i i i i i i i i i I +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.K i i i i i i i i i i i i i i i i i i i i i i L +.+.+.+.+.j i i i i i i i i i i i i i i i i i i i i i i ) +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.T i i i i i i i i i i i i i i i i i i i i i i R +.+.+.+.+.n i i i i i i i i i i i i i i i i i i i i i p +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.| p i i i i i i i i i i i i i i i i i i i i p O.+.+.+.+.+.U i i i i i i i i i i i i i i i i i i i i i l +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.M i i i i i i i i i i i i i i i i i i i i M +.+.+.+.+.+.+.h i i i i i i i i i i i i i i i i i i i i / +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.g i i i i i i i i i i i i i i i i i i g O.+.+.+.+.+.+.+.) p i i i i i i i i i i i i i i i i i i n +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.( p i i i i i i i i i i i i i i i i i ( +.+.+.+.+.+.+.+.+.L i i i i i i i i i i i i i i i i i f O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.L i i i i i i i i i i i i i i i i L +.+.+.+.+.+.+.+.+.+.+.z i i i i i i i i i i i i i i i p / +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+./ f i i i i i i i i i i i i s R +.+.+.+.+.+.+.+.+.+.+.+.+.P p i i i i i i i i i i i i l | +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.n i i i i i i i i i i v O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+._ j i i i i i i i i i p L +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.( P b h i i g v P ( +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.R L x f i p j n I | +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.O.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ ^ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.{ e , > 7 ~ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.' ' ..' ..' ' ' ..' ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.t > > > > < H +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - @ . X $ V o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.2 > > > > > > w X.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A X @ Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > 5 ~ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S X ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > < H +.+.+.+.+.+.+.+.+.+.+.+.+.+.' X % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > w X.+.+.+.+.+.+.+.+.+.+.+.+.; E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > 5 ~ +.+.+.+.+.+.+.+.+.+.+.$ C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > < H +.+.+.+.+.+.+.+.+.+.X = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > w X.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > 5 ~ +.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > < H +.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > w X.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > > 6 { +.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > > > q +.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > > > < o.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > > > 2 +.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > > > e +.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > > 9 o.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > > > y +.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > > 2 J +.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > > 9 [ +.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > > > y +.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.o.....O.o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > > 2 J +.+.+.+.+.+.+.+.+.+.o - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > > 9 ] +.+.+.+.+.+.+.+.+.+.+.& A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.^ > > > > > > > > > > > y +.+.+.+.+.+.+.+.+.+.+.+.+.C . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] > > > > > > > > > 2 J +.+.+.+.+.+.+.+.+.+.+.+.+.+.o.+ ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q Q ! Q Q ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.] > > > > > > > > 9 ] +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W . @ o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.3 > > > > > > y +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! @ - ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.u > > > > 2 J +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S ; $ + @ + + @ + + @ + + @ & V W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.G 7 4 t [ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...' ....' ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O o o o o = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...Q D Z : B A E ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E ; O . . . X O + @ $ % * * - - - - = = * * * * & % & - V A E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' E S B ; C S E ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...Q S C ; C D Q ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' Q S V ; B C A W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' W D Z B ; C S E ! o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...Q F A B ; V A F ! ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...Q D V ; B C S F ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! V # . X @ * F +.+.+.+.+.+.+.+.+.+.+.+.+.+.E E E E E E E E . # E E E E E E E E E o.+.+.+.+.+.+.o.$ o V ' +.+.+.+.+.+.+.+.+.+.+.! E E E E ! +.+.+.+.+.+.+.+.+.D $ . X - E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...E E E E E +.+.+.+.+.+.+.+.` : X $ D +.+.+.+.+.+.+.+.+.+.+.+.+.+...Z + . % Z o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q B + . * D o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...E E E E E E E D & E E E E E E E E E +.+.+.+.+.+.+.+.! E E E E E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` C # % Z ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...E E E E E ' +.+.+.+.+.+.+...C + + = S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E % O Z +.+.+.+.+.+.+.+.+.+.+... ` +.+.+.+.+.+.* . Q +.+.+.+.+.+.+.+.+.+.$ . : +.+.+.+.+.+...V O X B o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q ..+.+.+.+.+.Q * . + C +.+.+.+.+.+.+.+.+.+.` - . o C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C + X = ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.! . +.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F # . . % W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D A +.+.+.+.+.` : X + D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! % $ ! +.+.+.+.+.+.+.+.+.o. ` +.+.+.+.+.C o ' +.+.+.+.+.+.+.+.+.% : +.+.+.+.+.S . + E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W o.+.+.+.+.V * +.+.+.+.+.+.+.+.F X % ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W @ . V o.+.+.+.+.+.+.+.+.+.+.+.+.Q +.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` & - ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D Z +.+.+.+.S . $ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E X . F +.+.+.+.+.+.+.+.o. ' +.+.+.+.+.# . @ $ $ $ @ + o . # +.+.+.+.+.+.+.+.+.$ : +.+.+.+.B . - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W ..+.+.+.- % o.+.+.+.+.+.C . + ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O.- + W +.+.+.+.+.+.+.+.+.+.+.Q . o.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . X S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D Z +.+.+.V . @ ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D X = B A F E A : * @ . E +.+.+.+.+.+.+... ` +.+.+.+.... @ S ..+.+.+.+.+.+.+.+.+...` Q Q Q ! ! ` ' ....o.+.` E A % Q +.+.+.+.+.+.+.+.$ : +.+...* # - V A F E A B = o % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W O.+...$ . & V A F E D C & . % +.+.+.+.- . % B Z F E Z ; % O . % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.$ X * B Z F E S V - @ . F +.+.+.+.+.+.+.+.+.+.! . +.+.+.+.+.+.+.+.% . o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; % ; Z D E D C ; $ C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D Z +.+.* o - C S E E S C * X O ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! X % D +.+.+.+.+.+.+.+.+.+.Q * X ` +.+.+.+.+.+.+.; ; ; ; ; ; ; ; O ; ; ; ; ; ; ; ; ; ..+.+.+.+.D O ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E X V +.+.+.+.+.+.+.+.$ B +.+.# @ C ` +.+.+.+.+.+.+.+.+.+.D % * +.+.+.+.+.+.+.+.+.+.+.+.+.+.Q o.+.= + S ..+.+.+.+.+.+.+.+...; . F +.+.S X V ' +.+.+.+.+.+.+.+.+.` - . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...# $ A ..+.+.+.+.+.+.+.+.+.E - . . F +.+.+.+.+.+.+.+.+.' ; ; ; ; ; ; ; - @ ; ; ; ; ; ; ; ; : +.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- + V ' +.+.+.+.+.+.+.+.+.! B o V +.+.+.+.+.+.+.+.+.+.+.+.+.+.F A +.: * E +.+.+.+.+.+.+.+.+.+.E @ ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ . D +.+.+.+.+.+.+.+.+.+.+.+.+.+.! & % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.; . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S $ +.+.+.+.+.+.+.+.% : +.Z . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F X = +.+.+.+.+.+.+.+.+.+.+.+.+.W ..D . V o.+.+.+.+.+.+.+.+.+.+.+.+.E . # +...X @ ! +.+.+.+.+.+.+.+.+.+.+.+.+.E X X o.+.+.+.+.+.+.+.+.+.+.+.+.+.+...@ X S +.+.+.+.+.+.+.+.+.+.+.+.+.+.! $ . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.+.+.- . B +.+.+.+.+.+.+.+.+.+.+.+.+.+.o.- V +.+.+.+.+.+.+.+.+.+.+.+.+.D Z ! . @ E +.+.+.+.+.+.+.+.+.+.+.+.+.+.V E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% D +.+.+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.& # +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . o.+.+.+.+.+.+.+.$ : ' X # ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` $ S +.+.+.+.+.+.+.+.+.+.+.+.Q ` X . . E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F E * & +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W A +.+.+.+.+.+.+.+.+.+.+.+.+.+.- % ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C . X ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.S + W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E X E +.+.+.+.+.+.+.+.+.+.+.+.D Z % % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...+ $ +.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.% : +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B Q +.+.+.+.+.+.+.$ B * @ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.# o ..+.+.+.+.+.+.+.+.+.+.+.W $ D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.# O + ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.& @ +.+.+.+.+.+.+.+.+.+.+.+.+.F % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.' . O ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q X O o.+.+.+.+.+.+.+.+.+.+.+.F & * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* . ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! X . ` +.+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.$ E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D W +.+.+.+.+.+.+.$ @ O ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' X ; +.+.+.+.+.+.+.+.+.+.+.W : +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! ..+.+.+.+.+.+.+.+.+.+.+...O # ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z S +.+.+.+.+.+.+.+.+.+.+.+.+.+.' - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.% X ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E . ; +.+.+.+.+.+.+.+.+.+.+.D @ o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` . A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; C +.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.$ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q F +.+.+.+.+.+.+.$ Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E ! +.+.+.+.+.+.+.+.+.+.W X ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+ % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* E +.+.+.+.+.+.+.+.+.+.+.; o ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; X ..+.+.+.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.S W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S Q +.+.+.+.+.+.+.+.+.+.D . Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! * +.+.+.+.+.+.+.+.+.+.+.+.o.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.# o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... D +.+.+.+.+.+.+.% * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* ; +.+.+.+.+.+.+.+.+.+.Q Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z V +.+.+.+.+.+.+.+.+.+...X S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...X Z +.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.@ - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% * +.+.+.+.+.+.+.+.+.+.D : +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X $ +.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.@ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! S +.+.+.+.+.+.+.$ . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q X +.+.+.+.+.+.+.+.+.+.W . ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A O +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F - +.+.+.+.+.+.+.+.+.+.Z # +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S @ +.+.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.Q X ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . ' +.+.+.+.+.+.+.+.+.F . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ O +.+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.@ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q A +.+.+.+.+.+.+.$ & +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* D +.+.+.+.+.+.+.+.+.Q * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! * +.+.+.+.+.+.+.+.+.+.+ E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ E +.+.+.+.+.+.+.+.+.+.+.+.' ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.- C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- V +.+.+.+.+.+.+.+.+.D = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ o +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E A S A A S +.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.# . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E Z +.+.+.+.+.+.+.$ S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D & +.+.+.+.+.+.+.+.+.W S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... % +.+.+.+.+.+.+.+.+.E + +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C * +.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.... . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q O +.+.+.+.+.+.+.+.+.D D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.... A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.% X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D A +.+.+.+.+.+.+.$ . ..o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.X X +.+.+.+.+.+.+.+.+.W Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X # +.+.+.+.+.+.+.+.+.B V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' . o +.+.+.+.+.+.+.+.+.+.+.+.' - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.F % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ ! +.+.+.+.+.+.+.+.D . ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.= . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A D +.+.+.+.+.+.+.$ $ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.= ! +.+.+.+.+.+.+.+.Q ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O. ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.$ . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.& ! +.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.B D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C A +.+.+.+.+.+.+.+.F @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A ; o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.: ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C E +.+.+.+.+.+.+.% = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C S +.+.+.+.+.+.+.+.W X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.. + +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z A +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.$ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q = +.+.+.+.+.+.+.+.D * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ X B ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.V Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B Q +.+.+.+.+.+.+.$ : +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D ; +.+.+.+.+.+.+.+.W @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... O +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.W = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W * +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.. + +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. + +.+.+.+.+.+.+.+.D ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! X . % A ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.A E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; ` +.+.+.+.+.+.+.$ Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q $ +.+.+.+.+.+.+.+.W % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... # +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.Z Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.. @ +.+.+.+.+.+.+.+.+.+.+.' ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.! = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ +.+.+.+.+.+.+.+.D C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q X + = Z Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.F S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* ..+.+.+.+.+.+.+.$ S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' @ +.+.+.+.+.+.+.+.Q ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... & +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.V E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ O +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.W C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; ' +.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' - X % B F o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.W C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.$ W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. + +.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.: ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ X +.+.+.+.+.+.+.+.+.+.+.' - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.D A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B ! +.+.+.+.+.+.+.F Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! % . $ V W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.! ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ X +.+.+.+.+.+.+.+.$ ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+ X +.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.- ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.& o.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.A D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C E +.+.+.+.+.+.+.D A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E - X @ E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+... = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+ O +.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.Q B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.* +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- ..+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.C E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E ; O * ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.X @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. $ +.+.+.+.+.+.+.+.$ o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.W V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.* +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.= ' +.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . o.+.+.+.+.+.+.+.C E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A D +.+.+.+.+.+.+.F A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' S ; # . X Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.o.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.# . o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q - +.+.+.+.+.+.+.+.$ ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O X +.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.- ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.& . +.+.+.+.+.+.+.+.+.+.+.' ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.A D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C E +.+.+.+.+.+.+.D A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.E V % . C +.+.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A C +.+.+.+.+.+.+.+.$ E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. O +.+.+.+.+.+.+.+.W V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.; ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ X +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.D A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B ! +.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...D = . D +.+.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- F +.+.+.+.+.+.+.+.$ A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' @ +.+.+.+.+.+.+.+.Q B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.V E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+ + +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.W C +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; ' +.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' ; . o ..+.+.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ ! +.+.+.+.+.+.+.+.% V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W % +.+.+.+.+.+.+.+.W V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.A Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.. @ +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.! * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.# +.+.+.+.+.+.+.+.F Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' + : +.+.+.+.+.+.+.+.+.+.+.o.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.... + +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.. o +.+.+.+.+.+.+.+.+.$ = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D ; +.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.Q * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W - +.+.+.+.+.+.+.+.+.+.+.' ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.. + +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. + +.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' O O +.+.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.$ ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W * +.+.+.+.+.+.+.+.+.$ % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C S +.+.+.+.+.+.+.+.W V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.+.. + +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z A +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . o.+.+.+.+.+.+.+.+.% ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q - +.+.+.+.+.+.+.+.D A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.` . Q +.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V A +.+.+.+.+.+.+.+.+.$ X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* ! +.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.% ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% ! +.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.B S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V A +.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ O + O + = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% A +.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+ ' +.+.+.+.+.+.+.+.+.$ E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.X X +.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.V V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' . O +.+.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.E % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ ! +.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ O +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C B +.+.+.+.+.+.+.+.+.+.+. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E @ +.+.+.+.+.+.+.+.+.+.% - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D * +.+.+.+.+.+.+.+.+.Q V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.+.W O +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.C = +.+.+.+.+.+.+.+.+.+.+.+.' - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.o.. ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E + +.+.+.+.+.+.+.+.+.F A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q - +.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* A +.+.+.+.+.+.+.+.+.+.$ X ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.& F +.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.@ E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+ W +.+.+.+.+.+.+.+.+.+.+.+.` - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.- V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- C +.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! B +.+.+.+.+.+.+.+.+.+.o.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.... . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q X o.+.+.+.+.+.+.+.+.+.+.$ B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q o +.+.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.A @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z @ +.+.+.+.+.+.+.+.+.+.+.+.+.' - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.Q . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . ..+.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E & +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F A +.+.+.+.+.+.+.+.+.+.+.. % +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.- - +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% : +.+.+.+.+.+.+.+.+.+.+.$ . ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% : +.+.+.+.+.+.+.+.+.+.W V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+...X A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...X A +.+.+.+.+.+.+.+.+.+.+.+.+.` ; +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . o.+.+.+.+.+.+.+.+.+.+.$ * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ = +.+.+.+.+.+.+.+.+.+.F A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O . ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; E +.+.+.+.+.+.+.+.+.+.+.. $ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! . . W +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D . ` +.+.+.+.+.+.+.+.+.+.+.$ * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E . ! +.+.+.+.+.+.+.+.+.+.Q B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.+.; X ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.= X o.+.+.+.+.+.+.+.+.+.+.+.+.+.' = +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.D E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . Q +.+.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; # +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.... X ..+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; o ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q . V +.+.+.+.+.+.+.+.+.+.+.+.$ . @ V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! X : +.+.+.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O . @ +.+.+.+.+.+.+.+.+.+.+...O @ ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.. & +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.% . Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . ; +.+.+.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! : +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% ; +.+.+.+.+.+.+.+.+.+.+.+.# X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.O @ o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' o @ o.+.+.+.+.+.+.+.+.+.+.+.+.% . W D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...@ O ..+.+.+.+.+.+.+.+.+.+.+.Q V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.+.+.E $ o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.' X X ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q X + o.+.+.+.+.+.+.+.+.+.+.+.D A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; : o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.* ! +.+.+.+.+.+.+.+.+.+.+.+.& E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E # ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q O . W +.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.* . V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! @ F +.+.+.+.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.+.+.+.+.+.- # ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B . X ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.@ ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.D O E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S X W +.+.+.+.+.+.+.+.+.+.+.+.F Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...o + D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E + : +.+.+.+.+.+.+.+.+.+.+.+.+.- @ ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B X D +.+.+.+.+.+.+.+.+.+.+.+.+.+.Z . C +.+.+.+.+.+.+.+.+.+.+.+.+.+.$ X +.' . $ ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.D X ; +.+.+.+.+.+.+.+.+.+.+.+.+.Q B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.+.+.+...# . A +.+.+.+.+.+.+.+.+.+.+.+.+.+.! # . E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% % o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.+.+.; . ; o.+.+.+.+.+.+.+.+.+.+.+.+.+...= C +.+.+.+.+.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F . @ F +.+.+.+.+.+.+.+.+.+.` V + % +.+.+.+.+.+.+.+.+.+.+.+.+.+.A O V E ' ! Q E D o.+.+.+.+.+.+.+.+.+.+.+.+.: $ A o.+.+.+.+.+.+.+.+.' Z @ B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.C . * D o.+.+.+.+.+.+.+.+.o.A # = +.+.+.+.+.+.+.+.+.+.+.+.+.+.W V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.+.+.+.+...% @ Z ' +.+.+.+.+.+.+.+.+.F * . . E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B @ C W ' ! W E F +.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.; O B ! +.+.+.+.+.+.+.+.+.! ; X Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D . X @ * : A D Z B = # # ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+ ` +.+.+.+.+.+.+.+.+.+.+.+.+.; X * ; C D S C ; % . B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.V X & ; V S D C ; & X * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+...% . % ; V S D Z : * O X E +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...X . +.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.B # - B A F Z B = @ Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D . - o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.C . . Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.D . : o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+... * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.: . @ Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.V +.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A X o D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' % + D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.* ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! $ % ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% X +.+.+.+.+.Q O @ Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q # X Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...% . +.+.+.+.+.+.+.+.% +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' * ; ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F A +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S D +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D % + S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W $ ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Z @ @ S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+...A @ + V +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.W B +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.O. * +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o . @ +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.A @ X - ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F @ +.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E $ . . & Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.D Z +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.S S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! B $ . O # V ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q S C ; & % & * = ; ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! : + @ V ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.E * X O ; Q +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...! Q Q Q ! ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.Q Q Q ! Q ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! ! Q Q Q ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! C @ X - F +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.E S V ; % % & * - ; +.+.+.+.+.+.+.+.` Q ! Q Q ! +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.' A % . . & S ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...Q ! Q Q Q ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...Q Q Q ! Q ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.! D A V B B A E ` o.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...Q F Z B V A F ! ..+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+...W D V : Z D Q ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+...! E A V : Z D Q ' +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.o.! E S C : C D E ` +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.% X +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.$ . +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.F S S A A S +.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.", "+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+.+." }; stopmotion-0.8.0/manual/000077500000000000000000000000001234321124500152045ustar00rootroot00000000000000stopmotion-0.8.0/manual/graphic/000077500000000000000000000000001234321124500166215ustar00rootroot00000000000000stopmotion-0.8.0/manual/graphic/1.png000066400000000000000000000002141234321124500174640ustar00rootroot00000000000000PNG  IHDR(ѿˊ pHYs  tIME dG+IDATH1 %0ԇ'bX,bX,-} IENDB`stopmotion-0.8.0/manual/graphic/10.png000066400000000000000000000005141234321124500175470ustar00rootroot00000000000000PNG  IHDR(ѿˊbKGD pHYs  tIME $$AIDATHkP %}'8Л`?; skݎZoPr $Hཇ{; , , ҂=WiGDϷk+ʒ19uOABRJIӴKS㔦ieb8IʱR ߇B{cs.4q$I;s(JBƘy B,o8Bib?$RB~^ ؞ =IENDB`stopmotion-0.8.0/manual/graphic/3.png000066400000000000000000000006621234321124500174750ustar00rootroot00000000000000PNG  IHDR(ѿˊbKGD pHYs  tIME #"L r3?IDATHOK0ƥXx轠`i.C{p =AO=&iƲ]¦Ï7O1r)!]4z$dY&߿o~~QJUUE%;m, zz,1F)vILwRJ1ƌ1EÎs!LӴ,KEQ!i>mیmBfYVM mxx=>z`osQJ'fq]1j+[ ,84Mv^f!DJu0 ]כ(cNG44=k?H-^Z@IENDB`stopmotion-0.8.0/manual/graphic/4.png000066400000000000000000000006301234321124500174710ustar00rootroot00000000000000PNG  IHDR(ѿˊbKGD pHYs  tIME #0{%IDATH͊0fzA+ EA!|k݈+7J7ĪĨ0LE{Zeڽi6e=eYYmY˲<{)!1F)( EQNOy۶0p9y'I9UeX4@)ͲluyR9Bt]'XWi\.!_NAض-(r߇as0z"8p8$6x?/B4M8}/Ia GQt>c,OX$뚦E\ߗ}IENDB`stopmotion-0.8.0/manual/graphic/5.png000066400000000000000000000006521234321124500174760ustar00rootroot00000000000000PNG  IHDR(ѿˊbKGD pHYs  tIME #;(K7IDATH0p'NB" >C$ ]e(X]@)e"=P~C lc,ztB pݲ,(I3(0PJj6MӢ(f^!$rΕR]u]=ϓRumY(b<O&o1^-cJi焐0 g0x$\.}ߏF#B Z4i#k4z99_,zv{<!q 뺮m!\WJtIENDB`stopmotion-0.8.0/manual/graphic/6.png000066400000000000000000000006301234321124500174730ustar00rootroot00000000000000PNG  IHDR(ѿˊbKGD pHYs  tIME $R%IDATHj@`&L5ss[|A|sAK V\e}Ә:03iQO҃jWx-|:( 4MR1}!r0ƄyvWaq5M# xǺ+Ba!Ksγ,Bc,qզiQ%缮kx\ic !ty0qUӪv qEN=NJSaFg IENDB`stopmotion-0.8.0/manual/graphic/7.png000066400000000000000000000006421234321124500174770ustar00rootroot00000000000000PNG  IHDR(ѿˊbKGD pHYs  tIME $j /IDATH׿O0qCL 9'f9aRK9H7|_ӗW(S&pE>Ǣ(0:2nrĴw]9lzVRJ-KtVC.˒"nHkEQC#BM}j叔}4[&:Gl/O c̴zTx2۶=;Qib !ByQ8sJ)PUUu O=vSDQQXf{||s"X-iPFaFa?~b_>"B@2o`zFUC_IJ]#Dc@S 3L5^8LEQt|H9dp>c`V2"%I:MAAk̂ܪxH"M p]Jhんا8~{m~-?_ñ _\4Bz9~I (6Ћ.5f:!Β* zjOp]f}DY\yL3Lf C?,l(H`&s[*NGq):y8I`pJŃDC.>` &n \#NpFb _ZMOz&"3֎&9^ctDs785Sg[>lv3>OɓAlgu1Ux|5eq~<;|_n [!ѯaGM8r|Ơ%y-XO1tI؎AAU/A7݊ W~F ;;IHeɫρ6:L$ΦcwwKL bbw{7e#DIENDB`stopmotion-0.8.0/manual/icons/cameraon.png000066400000000000000000000003661234321124500206170ustar00rootroot00000000000000PNG  IHDRj !PLTEUUU3wwwDDD"""yutRNS@f pHYs  nIDATA am.VsӍH;036 2 &<^pFס+l8ѳI)lV Zfl3̶.Mm7,V\D,Ef+}IENDB`stopmotion-0.8.0/manual/icons/fastforward.png000066400000000000000000000002111234321124500213410ustar00rootroot00000000000000PNG  IHDR(-SPLTEU~tRNS@f1IDATc` `D"!LF `0F `(#Ptkt"U !qIENDB`stopmotion-0.8.0/manual/icons/newscene.png000066400000000000000000000002761234321124500206410ustar00rootroot00000000000000PNG  IHDRĴl;IDAT8I {,xhTő9p1+HbbDn4 0Ғx{\a-bZg> _' O^ipKrn[y3yO7aDƙ,/p'~B,9X /IENDB`stopmotion-0.8.0/manual/icons/play.png000066400000000000000000000001751234321124500177750ustar00rootroot00000000000000PNG  IHDR(-SPLTEU~tRNS@f%IDATc``@aDaDaDaD.@PBC0+ƐIENDB`stopmotion-0.8.0/manual/icons/removeframeicon.png000066400000000000000000000013341234321124500222070ustar00rootroot00000000000000PNG  IHDRj kPLTE݀www̠UUU"""DDD3ffY{8^YZ,i.nJ^8k@lg'V|+oCTdTUh,Vw'fDGMJMRVZ Ԇiag4uBzA:B *)+,*)wvG?K/)=9?e#$759G;8=CBD\X\# +  $$$aSB-9(291:8=  >^.a$bZJFPC (4Z p(ghɵͭ׫ΫլܭݭᱵժֱutRNS@f pHYs   IDATueW0&)iC 2dp.e ;_DNB?Q L<]̠H&La(e:IPN_ɜ >`Bڔ `{,x|٩ݒrM1Sy򸠰/)-+D k7B]={(htjzfvnr,xk{g7?8<:F|rzvH\\^]"xL&_^=Sy#Oi% IENDB`stopmotion-0.8.0/manual/icons/removescene.png000066400000000000000000000005221234321124500213370ustar00rootroot00000000000000PNG  IHDRj TPLTE݀www̠UUU"""DDD3ffΆtRNS@f pHYs  IDAT[ K TߧJ[u~ș{D 0(!+"j 1r"9I} "p@o,ۢ 4j_ӉEFmv8Z! Zxc|ә/Wluza~?8yN`3<k q IENDB`stopmotion-0.8.0/manual/icons/rewind.png000066400000000000000000000002111234321124500203070ustar00rootroot00000000000000PNG  IHDR(-SPLTEU~tRNS@f1IDATc``D",F a1I(FP·Z0 ŴaHN"BU>uAIENDB`stopmotion-0.8.0/manual/icons/steptobeginning.png000066400000000000000000000002171234321124500222240ustar00rootroot00000000000000PNG  IHDRaVIDAT8ՓA ! 9{ZWM'{ iʴ}䯰X0Y-I; $MP%'H$'a_0.q DwdGIENDB`stopmotion-0.8.0/manual/icons/steptoend.png000066400000000000000000000002161234321124500210310ustar00rootroot00000000000000PNG  IHDRaUIDAT8͒ CyDJ{)%!S%@(rBR-$ 1XWA$^vlܫ,%SIENDB`stopmotion-0.8.0/manual/icons/stop.png000066400000000000000000000001571234321124500200150ustar00rootroot00000000000000PNG  IHDRa6IDAT8c?%"݃tFFFl@0``` 0Pi0j !#IENDB`stopmotion-0.8.0/manual/index.html000066400000000000000000000064031234321124500172040ustar00rootroot00000000000000 Stopmotion user manual

1. What is Stopmotion? Where can I get it?

Stopmotion is a program for creating stop motion animation movies from pictures you already have on your harddrive and from pictures you import live from a webcamera.

A stop motion animation is an animation which is built by taking many pictures of some object while moving it a little between each picture. When these pictures are run you get an animation.

You can download the latest version of Stopmotion from the > Stopmotion webpage http://stopmotion.bjoernen.com >.

stopmotion-0.8.0/manual/screenshots/000077500000000000000000000000001234321124500175445ustar00rootroot00000000000000stopmotion-0.8.0/manual/screenshots/add_frame_dialog.png000066400000000000000000002053241234321124500235010ustar00rootroot00000000000000PNG  IHDRI]bKGD pHYs  tIME1f} IDATx}yxEU1}g8AnDʮ  *+7+}(r@ `H!$}Q?:a|oZxA" >0&%Fj[=@bHn1456{ou}][euZ ^NoǺO^vw?{M?}/_NH^ws7 ~79>cÛ> ! !D,Uo!7_In}ɟԩZ[i`ϥn. m?;" ~xSi?ӨvD`qGA@#'}T؍ 7m3wnΝ;#T :qrM7xT^h4kcnضďy.j8 `R (ɹ#-Пm=ѦV!8ad'LD6~]?\y>帻NyZu˦?]R#ŁQh:_T՞K7ЌV2_ٖ"=czO*'/ @W_}u人{/66MMMDxϜ?›,X0re˖/Zhs̹=1ҀoG[DsDžeO8H?<; x% %xJ݄gȁSWZ+EƒU^c~^/iRޔ{>2}>3%b D;e~!o曬(.HNH'?G]ְibr=^qNGRB.4Xy).Bư?]lT7;_&S#;vN/.a䀄Y3MV;j7䜉YL_dy0+5⡩74nhLV׮E %FiU 1wȠ̔&rq\VjC(8yR&zr׾8ZZc}jVo>_TOhPzR,5.{gQqMFū 9]!:[XIњ @N{sԩx hѢz>c=jժ%K477̙3^œ\cv'G+Uy nVT@}.+/2 Sjoq<c3/̛6P"^ڝt}dDvbj|0A@ p dw~iw L;=oΛ6p79~%_|J\OW_#ŕ}rX*5kjDEr-gӗ6GiBNMM^0spPB&42MD-3K9ydڷGB}J}MͰF;7E^7}09) xߩko;+75|pFtٍؘ`{UDv)dnh]vGI >8қ%"D8r<"X75c u='B?aE4,!>f0JXL1%Ё---s"ϋgy{yǫq\>۔̈́L2T\|uBL2GO ̈N9nсW'?yNj':&;,o3Ǽq1Ac5Sy* c,yh+u-mXI cKO^38ig$bORXIU0MeujwxRO\ w"rC2cN7,gym.4 XVz$%9Y㇥ Rz\A-)v Q)gEzdŪ;'.=ꬔ0} c|rؑb1E4'1$081E2Ylly8<<|q\\> SêK.(vY`\3=8a’N_\ʙ:&"XZeX/U6>&J_4}L?7o2hoB?\̲\Em?Um_xa;Rc|)..7qE&?z ϔxXIܝ%n7[Pp!q╆W|xZ# ua°#Ry/5n9x}w8%V RaP{)dO^uʻڰdɸ!74Rt'N8&M4iҤ_&H,)*.4DwL>רyi۱#wxHBLK4MbN Iyވ1N7[l7$.H&N`-J(J&Q[l.)2H))@i8 B E+ )d"m4ISI$P\D6 fZB1j@]ZݥRH4J4ڄސhRBSŰ6f"R)EfVcp&Z)VHEB5mBDjD,*l07A2Mܬ4J 6;B2[BZ,4#lE!9=f+ҊG%n{yw [KUUUk׮CCH?T8%iTEuEۺ\ 0rxm`TÂ**j[|x}BM .emjv-6Q]V F[s{hvߤ74[.z7ecb.彄1pg3ө.7rۻ{{KFYm%[L޳έkn{.<!9bw[:,wuMB\VzO,.W~hmme2Z=nhhB/R[HO1~Ǩ>qh'f{wzY,' tz*X/Oy?G@{qO%vD>Ǎ#HqIdL֐2}Q@.xJ.CQ7R7u;K7]eFC9t[ͺ؛)Puwea]f !y-29 a롥0n]?ʁ]Tn_ΚM󫷻}niͫ)gAqG קuozMM}]v?{|N-D$ |RL~ T@ O@x* S@ ~%Zr<_[[_WS8$EwDDӉ $ $IZVc]}K+5E$nOߨ@Qaa!6w9 #UJeIi7%"*2\ rj ǭ $Bu=ǁmЬ79( %n<*+]+{d26DD&J RiA\Jef.)-  ML38'Jj<:**.6|%eeϝϫe)~b&>.6u[7yrY[6xtC<@Onikr8+TݞPuG$Zf2!JrDHLZ]S. ŵ8k "bBVRZ1~%be߃@~cs;@weVsow45%ĸv($/xS\F~7cS;w9"G7b=~Ըo8B%fw&--MPg>ãX<0}w\dؼupuQ齻/xě6 s 7yp>}qc ˟)r_yi u%?x͏V^XmC?s^DZQq%66,>>(..[ZZ^y#466#_|w}wʔ)vK{1|QT8^eoΧ_ZUXtG/8{gFceeW\[[[y3?q,_ csOWe.d4t~Y$IZ,֟.ĄZ[U}zL& Wrn7܂NNߺ .@oWZ|I|u|5??ri43g~~=77W$iZ?󑟟o۽QØA3͵kʄ.}_^y]mܘM}㼼꿿*9)ws盛[YY;v{ .Vg߁eK']j+MWouxXBqg+>s 1mrlf='X-`Ѐ>j0aJ0: tS&3ۻ/_>O}zΜ1%^Wһo`GB5u_mλd}&%%m޼ywۮAcԡ=wok3;fm6=!>_k7̽!ZM'%&˛8>.v}mms.\Q+*wȑ#׮]:uԔ)S=\\\\~~1cNظe X}Gwyŋ kll\fMuuqMFtaa-[ رc ._p{wׯ ǏgϞ˗0`ƌN7oq9sǬYΜ9sҥ'xBC9w}Z6lH$SLQT[lQ˗/W(ǎ۱c6lܹsE"Q~~u$IFFFtt!Cnqܹs P[[~򸸸ŋC G4ks=*n>43mMBCV#>c,E<C HH(p_-6>4O7pǷs\\{0 o!JÆ qם|p2n/xc|*Aze.d„@ZZܹswؾ{'Sm?O=8wƴ)̽ou ?3M߯3gYoh1bxiq:dI̾R|=_xt>l駑OxK\G&';u'Deˎ=z᪪~{ʔ)SN}+**֬Ys} 6lҥg9yY]bE޽,Y{cǎ9˗/4(((h֬YofRRڵkI\lٳg7o޼x✜?7L+V׿ s ھ}ݻǍ2 Ճ lذchѢo~0׿zc]lʕ4M/8^x!&&fʕGjjj^~Aʚ3gN^^y啻Kk&Y[[ۥKF} IDATw= .X,gΜa?~t7۶m!lhhhiid~p\f/LLL;wKu¦M6}3glٲv\rĈg/ >{wƌ?֯_qk6c Hd2.]\x| Q CN:h@iՊ(;:XdxW^3'H$Çeێ<])cQ*BRx1T z( B I%jBH";I$IR5jTztдZ^f{q(R=Z$t:ݸq$Z;v()) {ob8##… {.//7 III DEE (Jbǎ F7|òlAAAIIInno7w} Ŕ)S}c;v>>}:;;[hBxxرc^PP5d/]CGZ lFjuچ B8[prM {=]},&*bժU_~e6 W r1y T#xCH=L2qRSbcjd;ṵ$ED?C[}0aC{`+/kC7u6%a4R^W~;w0}N!D4 )bYVai K" cI :tD"ɉi:$~$ID"!I999QF$t:1BDҩ^z,8w -ۍ1vEAE"I!$].P8A^'IRT2D&DEEձ,0H$8#&NQVVSdddN0 88r 8.///!!r!N8qE$1F Dkkݻ7n[oFxg!v@LLСC)>|x޽׻wﲲO>DT~OJļxwq|d*ujiAuDWsGWVf'NF$"]] o @0P@ &rÊgS D1!1#IuRlaRq5F+jz_;hzBbBd)K"qwzoRyOl?|#ǎeZ33ӓwޛni RIV fDBuuӤOdjJK]X'lܸ-~We O?B1Ȩv sܹtyܹ-0~O>F*Z,#F̜9>0aB^^^M{G|֑#GzHMMU*{izΝlYf $$$ܹsذaaaagƍ,˖sk׮]vZjƍ#F111~ r<44t͚54hPdddbbロxĉ{Gfee8qYNj龲QKW/^;r&{l}w}R w0w_ԿL;̻y<`)P*<xB/[Եn7rpOիdrٕ+1/">鮯oKIN˜c=1[ZZ?_2ltTT*i3gϝ>##:i<˰:Wn먶jMR\I(%n6=G}FFF}%((HTZ,l/` ;2CvaG.S ø\ǃALPlYmBn78mbN DAj j5]~ KG[W,M"a1fN}~]ֻGrk`,({**x(:u ڵrҥ[ڹmL&RЯg0 #XCݶm;z0>۷o V \.%J.WiuYg?/^16~eˆsUvBVrCmyZݻ01"Cc pBnЅr8޻WtTQ]} _0LAQ?2(v50HE{E_V*+  ~<;xPxps :|xVCn%&Äxnl*`YV 20!:c󸴼Czaj]U6td9|(|{ BXߠ/V:u_˗/߷kk׭Ͽt%O<45%ITt~ȿ(3f̘i5fNjj={9$N<nݻBSO 0UU*7I.X'ȅ=OuhRO/z6ޮQk>]]z1GpsEp7Le2SvnmL&N>x?-auHII#Zz&O0y+ŗo+g #Q "/\2xR!Μ*StR=閎1bĈ?n}?>ok].u;hm6vPyʬJ^)RzOL*v" 9wڂ+忶o͆FnVm7[":T5uz!3 >U'4`,1Q.\ m` w1_rr!)I/\ n希+WK#7YX,rBntyKa?j9XMNHĒ͗6ePd0x2,<,T6zӛ5АL^MD*ס!bXo;),HnrLo'IRa]}S !T@ -Gvi:+CÒ" bD6UFA C#yR$E!  gM@ 禥RSiH5WS+q6{hl\SmmLbbCiEdJR[c.6尓$=FJD%*1N4E٭NCZF#L8,&vB2 xt:HraA&Ϝ96|]-UA `2c0$v BI1l* ,HchNI*-{I{$*EJf:%c{q,XաjAI%!8NJBAZRqʤ!% 2,y8!AcL~).j7 UUU 뛝]UUվ|:\r_\p᫯=i?CV;tիWחcǎUիV6l7o^}}os!e׿}}ѵkzW\9l0_{ oX~}mm#}̝;n:thW(K,7oΝ;/^uwuuuSLH$|rjjW:xX,.--dӦMH$[n vZddѣ%IYYى' EHHHtt7@?ظqc}}Y8!x7O~^zo߾Æ ;uTlllEE… 5_VV6f̘  R L>}zԩs]bży󄐡cǎlmm~뭷 Ù3g?4]SS#ٱcw}߮Z%c)!00  ǘÀ4viKnA0@R(_2XIfq+kXijI1ڰ`F =QMU5UT c{Q"Q:-Th(Vʝ.;y$ wi$ t"$8N8Jk2X#XK\UH*-fK"@YV{ev÷LV322>G>裝̚5kƌC y~B1w\!˗###fO>)FuYNLCInx=0Ld}5kZ/,,5j 7obٹs_򗌌'OF-p{$`T%zal|xsA$U0ᴚC2byI[k0l-FcUPYRBt:Z&  D$i.KL` 1),VXy>>(!2 BH D$qBH9 (?QEZmHHZe tކ{EN뮻|AAq dW@dW& Mv QOzBB4: @@;I?A€s9NfGŤ&A]SS˲PV#VE"1zX5[9[Lmqn'˹8ITREZD3N-]N"H8>s?;xIPHRSLٹs˗iӦDqر999j:..Ov\III,677F&rkkkTTԨQ {1ׯ_/ܥԩSǏoiiyRB1x௾tӦM:ꁨ aBB | :? 8 XWY]|'"SiH1Z})J)C LdS]ls]- IDATJ)%IrJA(LFX*HR$S"sy ;)$>[na:rE6lPZZSOEEEA,YyfJ%DU>|l^fMRR#<"q6>8q]w?uTddҥK###NnZfZ~m`Кzh4/¶m۔Jerrr0]we4⋌C]O?}衇 !\h녆 F_}n7nرcs̔ZZZԴhѢpL&kDf14_:H!+* )$AmB ku#Ȭ7ȃvI$ Ř@AA< rm"VH!@]݂~6&L~7"O: A!X%JH)CASkb2za,?wI wZ2e8椤bR$26tIH$ y|U>~tҝ}!# 8 8.yEm Dd!lBȾu;w-b 08w8ĦvU:U=<h2{z^o2MH I#̀?S?*?u5ktM>+^~劊%K/+>ϞuY?_~{wyn^zH$aÆM6KӧO7v/p8zիW,˖-K瞏>?~/ /ѣsNOO+Ҍg}3x'֮]s^{]~ KxwIJe˲yxꫯ۷oՑH_O>jΟ?e]c1V\Y__K/UUUo]v]}#p/PC=4fJTU3RB]O$rK .&uE':/tB;#*MD8%VO*y]#j(FN֙lJh :@o#;ӿO-7tSwwÇ NO=T9w D"7.ZpL>}ժUsmhh7n\FFFAAfO$]]]{쩪r\3f0_[[UW]5sxeLZQE6o6qtɘJ=LE9%#`3$eW*i9㝝HK0|1E$f2@ZZ~XYY۶m~w믿4mɒ%`_d{ߑ$ lmm}w/|…|j.]G/kI"`j,;Z|]]]Hk8w`gV5hS㠫@)PdiOQEttKrS yJH222di0MĚj׭^p`յCkE%Qa?V|طΈV ~5A0n5EQ8X,d2)l䪪ʲ,˲iEE'߃ 2zh[ZZZ__o'Mgu]F\sf={/$bfUU5͊4bs _%IW\QSgv\^xo l6駟n***zzz xQ}pod2lFjl$d2h tҥwqd#G>tfee566i !h4>#67Nʱ,$pfEaD4(c"P)yqu]&UeOlss'H2H<$Wa"Z'#QEyT0ǁ^1x]Q9Jy[G=A{ L9rY <(n$1Ss8-o鰌9A[vOS#~S<߿R]]mٳwނrhkkkaay6Mrssu]߷oNKK#T}4U%YV#2J93===@ pBxBv(F 233}>_,klly`3߹sgvvcrg2nwSSS,3GE'|>dhd8;1l6kE?FA())ٽ{aZBȾ} RSS%Ijoo===dۺul㊊jkku]ߵkWVV2!U<O$dҠW0d2s}/ZiTd䲧Zd3c:!Fp\;u͵Jw; hqH(15UQd(`d##'Ӛieh%)9)Nc}Z[T! d}t HBݻy#N0[܎@{2қHdx'MPx!$!"b={ýRC6Ydj9xGE$X QB<s)**B]~Պ5*%%/ zms9l̘13fC۽h"9x`aa֭[ZfgPJ$#4D0 #xP Xa(WӍ0xs<c8ADA`Gq 9yD(1#Ì0jw&8ʕXH %SwB@UH3BP`H;'t~*L~g;v(c, XZZ:NA6mԩx<d_PP0p5eʔXGm$ 33Ө8NNy?H>|-kMt:M6pKq>%%%ߧXց `xC%4vzCCqHdߧT,[fƍ6V$ )mn1$IƍK &0nl6z뭹s\;:dQk݁θ:A` Y.rT9120F (Ps0)?xJ%̋D${wkҀ@ 4=:5%̈ cQBu008,p@ȨovjO5Yʼnt&Dʡ8@Bs-$(xYg!0IF>1;, @ vyű&Spr [k׮իWOl2A`yy7޸k׮K~Ww߼yN:(!P=Xu)Ç #$NH;&5z_ cad 2F< TT4) X%i5DKDCh s $YMXg2,(8 5C(*A G }[QŎJ}U?RXcGգO6mҤI6mo0˗/OMM}/{1ꫯΘ1裏!e]?()ܳgy$)**0gΜc} -{5Gҏnx4b:l'֦G[9( =bhf^fOx u@(v}7\4!rAmә3gN2e/[oUVVCuYK.eg~M&_|D>_Wwqǁ ox{cÆ ێ9<4E T?T7HwtBfjn>\J`rr0N@(FMh4ӸNMhDѩNAP.Hx$S$8pDI=uh 0\(9 V7/Jȑ@HD#|2Sτӽ~Bs~T}رyyy/@k׮YfɲuԶ#Fذas=pꩧ~b|x-H hbr2eڸ/hk3\sgOPh>{Mm~C#w+TUYdʹp'[w5n~uf`[pW6}bI[g*}?֏iI& lmnIM/۷$Icǎݺuq"Ȑ!Cl69x`EEfcB!o4L&f۷oUUU---&L|͕+W:ƹsݹs<Çy~d'<-D|?oFE)=x%)%ގíhD2;:ڂɮ()*:UQQU U)Q) ()\0"u")a^H=Q>9uc2"y( L,odo !7o>vU7[CǛU_7FAՁP /nt"l_ >`$v˲ ^oooju\x쳊ǯ^:++kݺuF:ub---X㸬 w1nnn2eJ,Mm۶UTTl߾]ӴcgJǩW8 GÊ;CNK}j<BN_xGMх6;sjٮP3.uFbI;2FwFc P=aE.rJI@1jM8/XbEUU,//߰aCzz-[&Mt:ۗ.\v-|p2 MMMx;##0̭[feemٲc:WT=,-͚1Sd֨= N]UCDrgx E(10BW!CcdgiE*pQR474[mt?9"`RȓS,oظP(҉9l>-В =T^,ivC&cxlˮ#̚5kǎ ,@ϟ?{/rrrΝqܥ^K/&L(//aʔ)ϷZuuuO<ƍyy'{W_}8kQRRRYY9&¥^oܸcR@xh/v8l>GvoyyemVYMpƔa?mtY ^_`o.;ue.,{68_ta^ ;ݡu_|_ud&:'xl͛w]w-Xl6I?}Qiivܹsz)Bȴi 7x/wyg޽?-[;vl[[ѣ:"*W_GeEe]brd @jp)e6w\ ѠI(Hch5c#9!!#Z䜢L.@t)۹[ To8xՌ` < Gm(1ԴQYC 嬊LU!4aM F%BsMbQ$h莏<4qyF"A-_/]rũJ)yh`01ƌć Fɕgh$t(vuu-X`ҥnءA_'[IE(~7>{7hv9\pZ]yъ駗H#$tj$9ci1c(e v" t"$S5B(J){o|m1UIU0xB*J]v›m6tWĢ7w$[̟?Pvco,:4V?a,BAח@1 @c0Ay(bMM… /^lyXd`۴iӳ>oL{k@97:A4NCtہvX1ֵ%6=B!x9EJ S/f 7};I]FMFECz׽YAy͛q^7G9_5͢F:Bs0_Qfs3Z#фb+-+}Yov}c;3ҌP= sIiNw.%9 j\3/9&h[|ksPU 1hZ~ҸV g׿W_}5>|xG;)ů[q1X)c4B)Qw3TU iD2h  <͜=+ݥNJJ\6';7.Pu,t ƈukv$%"LcJ:QL8aaÆs=ѫ?,^s .bfyJ\I>WOE<%5H $LFT!GI"UL"i0T1"cI7LaۮC->G`ncT7F3֠WO*=iddd\tE# E4sH' [m\ӛ[ BLp5?4쾓ETUu+aMAqLcF;Bˀ0J4t&E-f 7+##W]'VÜAm2 -ɳ;-XAiMovgloZp{(D J$j,1  q{Μӧ+X) ]P(F( U)q"ÇWZ5(i/~53SnIlK!BTjP !4g~I, G^OZ,қV, %)#R"WJ 00!N!rSNERyި<-'KE1$eEiÆ4}S$, jJ[WL<TLVpۑQdqT*aMW)QɘS"oD)]G5aw2^۷o.++g6d[n>xuO?=tPUUՔ)SB@`ʕ@`ڴiczSSӪU8;묳2337lٙ5k֬JuYo[|>_UEOrw3O)37`HgaѸڽ=(L(PQ]NxO*r;O.W(K#V_s4P۾e˖۷YfEEEgF% )2fPWWתUb،3}>ڵk[ZZRSS8CmذΙ3$rdg0#,P1H$RN^Ą'i 1FhUt2h 6w6;sˇcK_`x);2Id>5bJ#-6WD~Nsh+T'BR촺)݁`,{49N"B$xDER:r3dP|ǎ<̿سgϢEwoeI^'Nm-qz,g}>$W8}b9a٣J`*̈́ʂ67fKs"ڱcҥK?5kf͚{M&K.mnny'joooii>|xKK#'O&,X0?~_<묳^ykSN|ȑ#W^M333#_^gΜ9sLHKKo+uV RPP`<<,''Gݻwwuu#GjӧOo^rC]Ҭ[y?=r/xV9ho#a^ؕK_7b?Y{[|޷>Ey#)v_>IXYP6RYi$H*UM?8g{mg9L(Z(#o6o8=UVx>aJe1F(yN(cR alyBBsRwWiR IDATpo?n˭^zw_>~|;h޵eWIFuDܿ㫚Nɐk;ƘQo|4M뷋a,۷o~0]}ݭ[d,;;K/u\7t`ĈկX,믟4iҮ]֯_BWqcYYބBQ !DeTB4 :5 `{r F,&LQƘ1R44gaEiHӴ=DRRb<1D2gΙMۣ$.C@ *HH䓼;3s?^xaС< Aoʕ+92ux 7E͟?_Pe˖-[vZtY!N9sfӦMcƌܹsÅ;R5s̯jԩ{ &gM꣐TQ};7{橖~_7?^u~E.ō?d x~gxա1!e:!NUR7|/񗮗 Vo9j덟qΔzKY~F][[K/u_Yf}/HļyRRR K/~)Ųum۶9⋆ q*,,/BdddQQD":vH[oto߾A<ʲ E 1xa@`8`8$MD1sO 0 _X3n1}Ukq<@`az1@ډQgmzxA~{Zx;cԠ=iF9pa8H8XNd]s8( _:n޼ٲjΟ?_ŸM6݃7LcϞ=iii[nmyt:o`Ϝ>+9sfҿ?kgcçS6e?s㷧`ʍjŽoLC]]]Z94cƌf~ *]hѢob`p8J֭[O>f͚Gٱ//A ?z0z18_x|mTov0XwZCEC"a8aXz4%g \6șӧF% 'h6JK R)b8bH  r88 p@<4"j_Bmm~x뻶p@?cWޣ`XtiQQBX`=7mݹwNp4&)cO~ͿW[[-^G]SS( HTTcCCâEjjjj{R-: 8<4DNcHX8,'^"Lœ<}z^JKK׬Y/^pa͚5 ,nx8qaJ5A0:X0 p 8!E9ЄkzE` D&A@@@@ H 25 JbhN#L 020A&1'a{!p`d@tҥK>o˗/u $/^g-[nݺ%%%)))/ѣ o|o2,YrMJ.o,pq‚b"_8p31Gmzܩ̾%S4媙:; }{t ǵye˖u޽iWfYVXjR\vC~'ɴ|̛7oڵ<'%%m۶-))i׮]:tsn<,e2eq+L8xy8p4" p$T+σt@ LR1H%_/V'Pr$ VLj)(~OVq> AFB*)(e )WDyK4 `;^>K.GBB>//cǾKsXpSO=uԩ!C끁[dm۶E}7ZV,+JIFcJJGaaA铛{ņQFufm߾=77711QՎ?M ݻٳ_B.T˲M6DJ*ٓ([?{C3>rq1u2 jήrޢh&cLd ˵]Z~.x z*ݍߖ&_-%4=YO?p}ӧgff~'.]jO<񄇇gqqM6B ޅaLLPYY}vFѽ{gϖL &[Ԓ֎7>9`0Ϻ'kOR2)@P"P@@ ;`b  A"<eqB8 t"<N(]#AuO hZAh6u:@ljں:(FSUUU__/JbRBvvaÆ-[,99.l6۪U$ɐ!CܒUV=:tYݲe˅ b׵kZ,<.BddUirƲ\r|C^Uk\*R+rye틩:ʍ_Eݢ۶M ^؄aCg{otjiVNɿ'|pN,ĝ:VaRH$*J~!0edd 6,%%_l N߯_+Vܾ};///%%婧裏x˟M6YVwPjjy$RN@NX``@Q;p9I!!2 Rjxj@Pj X,YBI P8b E@8f' @)J0p(Sp AJ1 "A \#SMz"5Z 0 CMӂz !IJ,EQBX߱c-݈;<<<77WHtҧONg6333Ǎ׮]q x\,8c8a98,0 _C;x;}du˓=ڮua@_uׄ0/wK o{JE5YB۠/SzOZPR u;}b?zQolnY'$Vzv ϹQaХ]0f6mEQǏ_~}YYYvvoѡC͛7{{{4}ϙ3Gfdd 0য়~t IIIƍiiio&\vmAlXO1bĊ+Fyw`jND,v RЗ!0 WIMIL p 0ap<x;t1 `,KX8@ 2&ܵ <` OC *5%ΙMjv}\lK΂)O?K'00cǎCq<$$鲲aÆu(b6ǎ.J۴iS^^RƎp8 +++#""L"JYlڵX,}1ͣGn׮MZ"BRo>""B"GDD?~ʔ)-["i7eU'sss?3H](,,TKqybEdq׆zWw`;0K/QXSLȵ[U*hV6xjpu@!V4I '(u?ϰ\ͯ;˪t }TB_/~;iBoad2ڵkԩScƌ(M6:yp( 㪫{a jjjڶm;i$Ht:YmӦM]]իW;up8Əߺuk:GGG#۴is…{|@k֬Gi_T< d=" sp (0si/y!z <뢴ׁ; sT#`x @8 󀱀 ,H 9yqiE6v=/F\7|mZ?sw!B p, ( tRP"0 q'{xpbEFE bJA,%N q΀ 8`̉J=> _n*I,w#Ip@Ը@Z 0. pE,Nre^DeC$kw {$N XX5khhzj'dϞ=AHL|tQ7ܸq|K.;oOI$<'P8 x ;1(ā]!/#p tF9 a  ywf.0lW 3V5'`yܕam6[3ƍ'Nݻw3t:Ny^키SXwynP,7Fqg$ɟ'kΌI9l[PEHDap0,I";;M4Ep> **w:oc6nȲO|QQQ@@kiӦYfmܸQetڍD~~~8{?O㏿~<}AY>33sʕ2w{1 oСwXXX^^^XXL&Ǖ G[|iډ'wڴigΜٵkH$*--9ri***-[v=zܼysҥyPaaaӧOl+咼j^DZ}mIoz~ʎ!2[G^*Vid61n.(G7dۣmv&< |AIofZX|hynܐΣu3̱3yMWqUTT4qܙ3g^z%L6hР_~Y̞=[*vMh v)J//[n G)jwٶm[BBBc/L͛oFhhhIIɐ!C&OvYVUU5iҤqƕ|G:W^n㏕J;B (x!S ,Z,AԧRNgCCPTl6z Är`0FDBQD"Dz>///##rUTT4dȐ+Wfgg_pf͛Ngjj-[._RG!X;e6R*,VVay/\"қl`0Z)I0 pZYU.ɩZ&/,ܒSiU߮l27K5qDVt͏Q nt:eZm2 @]Q%J熆 6 :ð˗/;%30Laa -[vт\PPGkk׮efŊ:uڴi+Wc0^y2#{JRjHP(xw:e+4Y)piiiC iivFDD@BB_hh(qfB+3$H \$"MVΈEc4M$n0NV*@"y; {$ :|]zf8t"7,KXl̜byVf[5B.M4M 7V(BaaZ%\.gYaǺ8/ beΝcƌ-TTTDDDXXXcz׮]5Mxxf3EEEJO=;05ʕc{ǩ,ݞ۩S'N8ӧOo3 77m۶AAA͛@l2bĈG.Y$33p4jڪ* x ai//jO,.:lqW/uM\/n77R% x)>WN@SdZ"vmilX7[N@XXycVgIEJB"3ۛaTW_1ٳ˗VkY+VWW744X;ڵk 4'wr9Mϧ~:tŋ,XP__?o<x>Ӌ/,;| y-[H$??ۋDe˖,73 3cƌ &t֭O>ol6:dee5}4M=:%%ڵkb/0lxq\/ߪ*)qC"j '-9x4jٗ@ύҶ{ȸz (wgrq"fNmJ_4wxx?5y^YV!j3f￿`N';O0o=uW(IIIk֬(*:::,,̙3ׯOJJz>p:ƍ._e˖e˖dڰaCCCC```TTԕ+WXm: e ݝ+[U ߮l76V`  Uz=Y-S>`0rai[n!!!VSez8WP###)\R8QQQzQQQ&Mi[V=8  =z3 S^^~%T-aZ FcJ8e47lذw]Jv[en ahnժկje& u "(44qvи P(&$Ie+Pffرcq_xwi9޲Yk,vW(άmtFx]-vҕ5pff/.%3X$B==ܡo~Uf#~~~M0b5{U*۵k1 k|T*m7FƅWUYYyQ8}I]a P19~q*00pРAw}k׮P .ҵGtttCCÔ)Svz-]x)<3 ؀Э:*u[fU~k֭['%%-ꫯ۪+**d2ݻwwǦDp\^L&ӧ}l.j7//ݗ m=oT*=r'tߊwq ÈDǜsb_6ͧʎ?NZǁ1ci#H-rKo7!HHʑqaۣm?|FFF.]YRyyy7n޽;AeggWUUEFF`f2Ο?o2BBBŋ8wY5$%%yWxzMG겲䅛jr㡔v e_cLd_-5l6/:O`>s ?uLdR.9~`0 ;pTԟzۭ3v -zy߶m۾䦾酅~iyyyjj~_WVV._;w۷/??ʕbo>ydjjHKK;pjZfߺu+S["4kR϶ gJ!ܿmĘ 00ct"*)8kObZDn8y[UUUsεl)UZZZ||̙3WXѻw77JMMMKK8x;_tϯ?t:͛t2 !ݚW돿0TL3,wL_ɯޡu:m+ܜa8$"}Χ@Q zd~~~J׷q JZniXl>>>BCC|Yf5݋F n|}}kkkjuV!ժj)"Fd#qB.q iӦD;v;v֭[[jwѷo_PTۿ;={0 (z-[6qΝ;"Fmg^K"8_\}s>?buؘGN\ ^tP M޸tʎCrJF/\-~M|4!N3,&jqs2FkX,ǹo<(9q}5,ű iܹ$''oڴnVn+GرU3ؐy|f ^=ٙiYMU=RQ,y}ڝ?gdl?}FU*fS(*Ic}F.\x7oV+**N+r|ZZڹSjEi27ʍ N}F=N8[5~IIKK<~ K.y^1w- 񅕿Qyŏ/.qY۶?{a9ֽZ@N{̃SAE 0 ]s ~("{#ygG徽xLd6z Z8sCEsXm6?7SuSl޼Ypmx{{o?8뮛_7KtVYڿÇf͚EQP/'''))iԨQUWWoܸj]v07o&I2999<<RRR~߲}pH$g}H]]]qqӧ D#JKK7nh2&NaإK6oެVM&8,}GBBBVZqN:F#4hI$Z-ʪǎ;}ܦ0ovIIJZ|yaak{=?8w󌌌fyɒ%BYB7H$n?0LHSGt)M6eee?Cӄ(""gr .H$ݻ>\ӥÇ'''7..ȑ#67=~f^{7J>cƌ:thNM4IP?>66077V IDAT7((l6 eee=>nAR;"IW0*--Uվ>>>~m///HT__t:5jlzn 4HTf544 m8.L9R` kT*1 3 VUyyyzaZ-qAAA~mJ̋Y@⼼ʚE4a Bq!:$qq}p8ZKxꩧ?vgyF,9r۶mϟ?rHRRX,ҥ޽{窪۷j k4=z^reǎ>>>)))^nݺu'N,9Jݺu۾}{nnǃ*UVJOO8.<<<&&F՞:ujϞ= ϝ;nݺQFD"XZZjZKKKqݻwFF/]t:7o|ma/iii999)))B C۷ٳOv^ryߣGѸsI&3jԨ~8>s.==}ƌQQQ+;w$Irܹ2,<<|ĉ[nd/( !f0^|Řy^P̏5${7ƊD{d2ٳwQYY9k֬@ Νk.J5oT*$RǖJcnA4ǺH|ɓFӧ,YT*wȑ#Gw/,,,???44T* SFPceggkMw,X3ό5ܹs|ʔ)C 1L_}եK TQQꫯ AllG}/A+STEEEV5000 cҥٽ{VÆ |L&k:ڵ:,fffnݺݻw.[lΜ93fHKKu6~򩐐V[>8EMv] AMv;M2yaBC"H$aAe<ϟ9s&>>e*ЪUB֭[HHHDD˲f9??Сr|Ȑ!~ XeYVJ"t",˛8㿥}yfMMM>}Z>4dZ=z|P(+o߾T*w+~coTTTTnn.˲.\ 񉊊t˲999ឞd2Z,rangeeK`Yt^fhrB4M7wQT]fwf)l !A JG)*A@(((R* @ $!lnٝ߾BEߓ'OrΙ{{s=G&0L.۟G`.KA,R+z}mm-J /** plpA1 ;}tAyǵZ-wJvdfBlŢL&c( SC]l_QQ1uT2AoΝ;P}vWW=zl۶b`?8:~D"<<\.JVډ0:Μwb9g@!0B%8l&I,o oSl6=2ȑ#VR:p8ɓ',{V1==_f``3LJJ;ĨQM$źs ~ipp01} K@K @5ں#l @eRիWR lFӮ0))I(rt.,))9w\FFF TpBBBO}}FfsCClY )` bv],RԠ%JG\T*dr;hlhhlsBV766R(PK$DJ&k׮ LV777(JCBpDrرα&-[r[ZZfΜrWVϟ?_(?~b͜9Noٲ,ɓ'lܸGP( :%J ?u~BE<\? 6lؠhz}zzb]\\ZZZf̘}ׯ ׬Yrf͚E <}jus'O K7oq| Xtihhm6ѣGnjpBRyYf͘1ZK,;wnvvs`M&l6 fY,d0$8c0Vl~AAAC={PN2eܹUUUw ,6mڡC0 ;uꔗҥKG :ާO?<** 4 77bY, rdZ  6 TX,DQ<) vۃh={\bL&+--9s&J֭ۮ]ڤRiTT w, AyWVV&&&:{!>}dffJ$y]zuӦMuuuݻw+**V\iBCCoΩtjh ffՕFHTVV֯_?7ߴ/A?: G,$N6BXVRgѣW^zJfy6lv횯R>|ȑ#Lc1 ݮv;Э b. t:h4FF&) B1 (6PN#Hcƌٸq\./.. A ~7999e߾}ݺu۾}{Ϟ=[[[lFA2Lzlh Znb^;8R |8MfΜa p=n~EDrҥիW/ZY%@?%!dh4pp8p`0.\dBQh4Z,wYf}ǎkRGDD{{{cf0ZZZi4Zbbb: 6mf3`...znz`wt\R5툀4ϟ;wnHHŋ)III #--M"zt:Df<==#""KS|UNw̙D׽{^ҥ]r8"LVWWk0D"fH$Va8oR[[hNϷX,VR^^2BX,oݺ󓒒]:|a2L l6K$m6[yy#RU~~hr劯/aq@iwsa4hPQQѣL7|A?󬬬7xL&;v[lݻw\\89xb}].;xUV[8;ԬYf޽`ٳ9>>>!!ʕ+ P(cƌY|ŋAgr ?(:hР ǓgΜ {A_lAgΜYvmiiG=iҤ#G~0 l6oݺuĉL&4iV]táAffٳ}}}V+۟Oqb|G;]%Wam߹s'RwFӯ_jժ#G<.jݮ]y̙37ol] vj]v-y333)p^Rmmm .;vkFĹ.ϨBXz#-+++3|DI@/?rjH$4iRisssO:pVس>_]l6ۙ3g Q9/O. Sje&}}};xjt:߿SzMMƜ3ao{bյ88+V' yڃf pAQJv^ǡTNE}R`v˘ -"@O @S @) >E"@:N pb7f[ ` @RTm~b(:ŧhtZBbךz51X= HRb!l(1OSv "30 #F @S }jG?Lj;Yl(JN.&d0:2)mLDpVsrrRc$*t֗: :2)\f2YIn_:->>}vB}NRl6`{6[8NI0 w֦zb5xq0 ^ud)>5ϕm**f>6|~}_ ;Ѭ|i5@*@ҢR@rSl6H$ ָd6jrF||| tRbX2-JBaSknnr:lN'dzP(d2mq\$iZG;[[[J%a(ҢrϘA&!b( Hj GՂ(*F@ uFX,0V--- 3J5 Rh4 B$2L gLbZ[ZZ<==e2Ypppy"H@|LP(X,V`` D"NAbDVU (*j Hv+d2 }]]\.{ƴ>[074;yj^@IrرW^p+W,YrJ naؼy|C]FPOP(6nxƍT/77Hұc[8ye˖-Z̙3L&.^:{#RRR~fŒ>n8\b 2P(OޣGO>$$$dΝW\)// H>|UV)~OOOR¼'Ndff:uj֭r4?r{)..a822rʔ)fyڵ:N 2dذa۶m ZN> 5i477ϟ?Μ9_}չs'Noϟ'-[`0rKKK׭[aXϟرl9c ?n߾͛7_~5ksF?S.YdŊ[lgTOw.;zޜY :}߁C;ݎlvdM[-X.;,~%#m/IUumֹ &ѡ#45|}Əxqf5r؅WJtn8yGE7\rm~4H(o=cƌ}۶m+Wܷoߐ!C dɒA̘1C ,Y>,,lƌiii={r۶msS8YqD"0 sL2 D*8N&[/zsrrtҥK/^믿ڵW^ƍۼyC,X0jԨ9sSNe2 s_~'zH6 $DrnafC w\&dɒ!CԴ~weee֭{7.\j*Qx"zXzxxv;`q1p'NO>$++_~駟ۯ_#FYԩS'O>vشi"##ӧ'$$={AsذaSN}Q*>>>((A"eZ-//4iRRRRsssgϞ},WW׆7xc̙%%%˗/ (&&_~O?gR IDATS'O swwZMMMwIJJ+VJ'Nhk֬1 9R^ZPPU*^y啤$DB-Z4pZŋh,$$lCYqqq|>b$&&X؊   ͮ p8JR* t[D=~W{Wy&FS('O1bĈ#RB/߿w^4iҤ>(<<.\g#F5k3ghC)JL޽T]]L"++8\X<` H?gΜܹ׷.33s…+V0111%%%۶m;wnxxYg㟶OuFRZ.00, ÂO\ty>_8 ))ISLܹsCGFʵ }<߫ LNJ CvhkSݻW)ULPuȈ+jEdE+.^,D+fDݻWRYldkhjnޱk M2y0(pv 8l6[VX1LEu:%fY#BPd2F3 ~/|y<vժUw]xi6oo>̙3 0 ہ dH%Hd2AVkX@G a:EQdZ,EiD---\.lxrrQ~ǃΞ=ϿwdjmmݺuL&4ijڵÏ*I@@FaF0`0L&`P( BRu:l,FH$0͓'O=f6›6m}_=p@Be8;w._<**j޼yj~>~ׯǏt RT(**2%%%f{xxP(;wL7ovj HW\ONJJrssKII5 W\r>>>R)""!ˎMR(X,bqCC\.D stoaabysߞr}QÇ޾g}]|e[oCPqqزuǀyy sb~͂[--'nOSL"vޤq}T/'AozjFd2!wN(x<^wn4 2yB/AǼA~~~>lkwPʅaf 8#G\hф X,0?~ʕǎtqqy76nh333BX,ްaåKJeccÇ8p|+VTWWo۶~rl⤤[n MN2o=~xhhh;#駟0RԾ}M0AE,X`^^^/MG>|YK@"je<ēӧO#p‡-֩W\:uP(Qg|ܸq@OKKc[z5a vww/,,>}:L&碢UVܾ};??ѢEM )Sp8;w1?I&l6{رK,qwwq?1^ &P(qpB|l'HyE%  ''dЮ0KLJ-=;%mmmIsۻug ܩ(Nwp `AG"ܹl6M23L igp,gavHdg:LIp׀eqOGߝ\8K),,ݺuxyy1<_-5:2 Bd2O< Pt:=**E' tO81xl$O HZd6?mgFE'eSj:{| c@E.OwO_yC3m;װNߏonADӇXTRuȱW{jn[QN {C٬m[D~z@Qv'Յ0FAZ{zuO p_xNuq.4gr aKϞ=Ba6MrrDb5.N='NMJ#wT"##>zR(~$A0Aalð<{f-;)I.Q{zzٜ8K!rɰ͖Qn)4 𼼂ʪÆ2 MQqb9}6x=?rrNsuݳݎuuǮE IHfKJ=k78u4467UT0 Lſ=Mo0JLZU]{ٲO`|{H3Llvtd0_|t<<4Ċ)I^x{y;mOXA^tex,I)Ow`SnyO4V{VA~' zωO0R~`80%w0( "\USՙ Ba`_|Y̽.ѡ!-RYʘH0nv;0|R Z"~>wʡP)3?aᘋ '4T{I"yQ0APrbW`e{]}C+F`AAMwˤA|'wy?vkai;#MOF C!B\ZZFRJeH0$Xpsǰ??X\YYE"D<8u" ,Zrz?,;W8th~A EN"8~X}Cs/\ h?ge7[,{VT\j6w_YYjS{P"1M{1[ sD1 h_}T.Wlں}L&󙬜܋5Zjc^v=ð;~%EmǮ}u -]{ʋe\1d2cPW0AD.oU(m:oVUTV565oٶMs?TҲ;as҉gf3~ٲ]7{+U!>d4ZAnY+WݪufQ=1 >,rv jU> ޯd47ZڝΞo|jV/Uk .^vŒ{ ;_xd6SgQ+9EmI]zy#9wrm; M[+*`DaPSѶ*wK pwwkn;ӁppTyc+Zf#ZQpUQᎻ [$n0<1![r`[qt$BQǡ0Gal⽽Qq!p\V^axSh?GS``瓅_:QzjN=69<4 pJVĩ3U+߮.lHڪ۲mR4 i} v]<`X} ) ɏRYm LHnv bcڛdu.'0ԩ  3͌BA(Wp8wʧO}F߽[VV1ksfx!,ګ^|l޽z27 Vs/\6L R7DE߾SfrڪX,5MM_ #F&|?y⸨𚺺vn 2<%%W p&c8+]}ysLVS  W] RyjJ8Sq1}ނENf?z<>6vuujRLܣ{MUS[ `8}ܼg˯an<^DD곘̞i F^0;?E.^b%'%jo͆CP%^,Oge9z\ڷP{xmvѣ;!;_xo|ʵ1DpE,iӖʪꏦMyO/T@ǫkzL{Xj.Y-͎|c` |Nä8NR_twjm_jOk;c:r5GDkoLf%( )O4uʵ VQiP`[Æ"d2aNFQ[dD8jCmY*^ul8{n)8CA[y-PxA(%t}t8ݳ_tH$`0b1VdRId// ìΙ0'>Cdi4`Gq*AQTsGӧDFg\/iZ W bF\q $Dp8 $R;ފz*F F @Æ>lGpJ 1-p`P;fZVd8d0/d9y⸇ɂ֒#AFɊL&q&? YLe;d@Dp7fWBQct q&h s@ɎV胞2`(D8"0K9_p|8 &sAqas]\Utո.џ-Aa #^cX?>8k}UO޼b8n䡎CaFRX`z`dfp8 WfWp~O ?-% >Djv#TZ9~f jqӨT2qx IDATD&Pf6]8f2WA0-5N;9sss8~C;45v ':*b믻$m0]W*.]8i2-˹ Zz_}y%qv Hr8Lk7d+p OO6~;^=e@7^hX$xüJ_,%;^]][QynB#vN=Pe.<êjj o? [Ws8l__3Y e۹ ΃OeUu"qpz^D*t \]/\P^61G܋Jd:sNl;w;^^ljSoG pƣ",n0A;e:Yb;TN= > xJRHԒ}MR  tKʶ6;cLfdXCW{vՊ0!C+9D*>AR7qBDQh45\=d DBC o765*44Dw{\M=IÞ5>Nll ,&AsfM[xwF#`0]b@ʌJ"܃cA ڻ7, ۓ:igmo[cCmu֛g;N̏‰?z"g|D"EQS?L"; %Nk7#[2;WP1KHؽy9fHVf?uy:t)y c?e4Ǐya_t(jcX?4@ Ǐ;Rk&}1Eǎ~P(ۨT*L~]bx}PKl6y1hq&qzƅW~1y>2yoWCA6[Tک4Yf(잒ȌO LP;ybXyeUxh qk/73i`'c2[yod8f;Ǟ2F9ni͞=5ǟbO%9+0<A7Jutzݶ{*`;Jo=rL"YL2Nۺ}Jxo'R+Y\RzQoH0Ͳlu?Vk\l^x[~ݥ鼽ǏԶgr n2\ڦj׬1= 0tStKqSgZyD"5[n8qn?6Nݒ;JT^AJr)婿v;v^uDxR%;_D'_&KxQ!cO |uijk0?VoS(QQ'H"z٘,V<2CgX-O1̘H xBĨp9|sy!<+ޗNg64qY/ fGO>0 f2Bt JHgϞ'T|H,Z:$m \]V7CTYc&Mt"@¤v?nR#1 >EBk5nh|ԉLv|/ I$۱cc&#GO}Q|/$%jiݶm뤉4cp;\8E)@3[=iԽ‚Op}/>C$b6]]np]tZ C ٫kj AVyEL W~RIeE)A %Az$Lz'p,jfIENDB`stopmotion-0.8.0/manual/screenshots/camera_running.png000066400000000000000000002177501234321124500232560ustar00rootroot00000000000000PNG  IHDRDT" pHYs   IDATxwG?^uO٨V%Y,9 &>l08pG3 > &l,Vqsݝ]~TwOtlb=3]]*}իWUg˱X|csG?%ٴZ>|(ȡCUд7~Զ}w@]%)xk᱙\!|r.yK2ZVBa{l%y/$>IJJҵy/$聾P^BnMHP!:&WS)M:ژkޭ$^e]NLޱ4|r6a˔dIt\Ke+>xW4U~߶G ɛQ) +iřkQ.)($["mc5dQ"TQY/ ɻF}T.LE""X!JoWQDcIDZ0#jDa^tg9;>yi4/%a GW\qPo?+|KG#[lyCGeEaaKfPG/hNH.ۼs_gHdsg5&~G>Iqb.>-xgP"s0['"g\.l˖V\)ᩅï9-XX{ҥwlKqakUۇ;ԟJ7$nSo8ٗ??3= ╗ኳ;6o? uMw->|L&mn}=,XPslex*b~u_`ჟ[SxGeo}ݚ`@}oGSC J iG_ٺ˯8֭a=o'}!o߹Ƿ/珙v ٟ^o??5p՛) `O|]eǞgD]uX$8QQ;^h/?5npǽ}d^҆D}>yNZ/~;gʼ*܇ }?_XFT@_~k?$k߲wF ?U"^dݯ;T0W!* D*rask:ƅށ.C(,:炀VX(]&PN@Ƒ 47DŇ5@˖-3gXb7d~_-۹ex*>u`x`jwkFWsEad_|P[k}( s\לyJj83~W_i|fss 6p٭ xf> 6eP(|iP:GD;{i8x}ƋϿz(_3iSvcB|G?ѲhyN-gpA/z?w?<Ҿ'^׭=op(pe~+= ^pEgnGl^W恀s5.?|{Dt6z;.`o;u'grZ6/~՗ :k<Hd5MuÇo?;> c۰a0w\0~u3rYS'u{{%< |Gni[|ϪusE. , S]厖QDcI窹us)Mszg4M۸q?_ro~gKn-^FʋO,FCnqѣG~L-@6M&wyg>N3wvt<_ 4 "3ex 4j"`So}L>7x91yv%G(J7[z2Xp^SaG`!6c4`%muoYLc}7|Us/s|q+`\?Kq|/$ҀX%WN"L%SVы)gtlvJE+=b)(Wɸ_̋Pɏe^`i[.L:RzN"̞Q.rI459R,)@DParO]x"E ÇSΩgLzwGm(Ç>Oczc?mN8##5Wvuwkt ݾcף TEkTE]}ŋRV.dH;;w=P kkifárp8uuq |)":rh.[p~KymDo]= uu}oO<6kb]][^?~וo1l BpWwys[uϽTj--͛7|L&{~džuk9/—6=W3{(׮y;~54_uۙ Z>mێCn#zt˯+~ qO$N&W㭱XGp]]\X{GxGm <7wuug}yU+`xx3O_d7\FRF}}࡯|[n3w]dҥo]bm0C_7a#=Ï͟?}\w߾-7^K=H 8睝] /^y[ghyGeL&Ϥ3[m. >|)Dsfn+}xdOׯtښ_R! jjj CUy#9gyg>{顡ޣO]D~X__Դ{Ͼt&}Eh% =sv|*D.& ttvwx/m6N)55 |y fY*LTkϽH: o|k͛;Ƙ"D]pDN?kfk};P8ȣ47Q< O_d|dL$gy={ܹ+μu{(5.ƨ1eik` Po+[s^~uo|Q-S6}@$nhlhjld$(L wtt2dmm3#[=đ:uƌcX L$|ccC{{H:}Ҝ١Pl$ڼt:Egn;mX4:gήT*6k ˵475Y3[sHz$H:t$莟~_?3<|bddy :窢R)ccWM]<^(>j[t:F-<<f,jt:D#@ĶI3ZZg@,anH8  >#}}VH&vm |> ZdŋhTUmhh~ġ>ÇR}1>; T__>>||P(O%uK(Çh$xrkSMQVwIF|q⠾s`\xj$^t~D*zZ >|L."MgߎÇ|1>;ۇ<^HgrZ~UFolj WzWÜ|jW`Cx`Wf ÇƆs>kBReLD24c>|(W}jΜ`0N0ׇ~s"д|qbjSL4=Ws %t뼏8Dy{ןڼeœ>S/n|wmί|[;׼޷*o׭T9;5k<*,ljO,D˜֖N_ʔÇi)է$>|T 0Ç|1>;|tǘxJoN/>|Ծޗ?GoZlɒSwq·>`,T Mo8vM7t/۱kk/Ο9G|81>}`-ч 7Ͻ޻|^~䳕>ƂqKxo'M{ɿz뭧/r7>|P}{O>cJ$5ÇGw}n }T|GtS>|yʇ>Oc)>|Lw<Ç|1QW]* jNŇ>j+XlEÇ}>|yʇ>Oc)>|Lw<Ç|1>;|tS>|yʇ}3|rdIX,6ic@P5! Uu^c,Z_ <522ן@D]3Z6y׌vҒ!i\x9.ZyfS]]=֯-էt;rU}Ӳ'r9y(I&h4c|.v>NXwu눊\.+@KKsWWA=D$ڱsדO=뮑?81iZ}cSzd8^$ty@_]AǴI/nڼ{Ͼ|[ tɏJݪmԫ[r/&)p8320k* H8 ̈z`=¦η[bu'?;^ <@;vg>MH % *0@oeXt}j2|Lg$ z8uBƆzcT|ȵ׼+-T֭]sGQ(Q.~YglG>| !Ddsɺxo@C}r0s9@FS-iۼ.˥t[2Lx1kt>A ljp(D\}2u>TBC!]ӦZFDLnAh4Z-@ȬE`8tH446=^vÇsypˡCGJ dG_ Z0nWO_cccٔ(>N0u G˻ԹqK[Zg4˯O͚5Ա݇>3CP:¼1>!lX, % UU{l6듉a@Ep8Ń@OOoCC="575i6<2АNuuuTJ H@4 }}D"==@?0Ԕ2l}}rxd`8C}X< '655q]O 756d2'uCCCLQcH@4 }}D v464P_@sSc>Og2 ###. Bp?VH.i/T1d"14<EH$ ƆDonj4mx$PNu.uT*#p@4u榦l6a@bǍoWmnjt}xx!躞K jTU2.d###4jE65{U@LE4b__ !T)rӧ>g9קZI(x< Da!D8 *D]"AB@"b"\WT5 P("hLZDzuX]s""l]]x7Y/x]EQc< B!"D S& )Lrb]]sPhDqDDHN`0 IH$ʒl 2Y2F1!x(Dò%%0[ED0+"iVDGEaVWEԍR "wTD40dɔV"%ΊQ,ϊWDi=qi/l#Ts QLsދ2H+[>ZE$/_Cڄm;-멷 != ~(w,u[o7T(&ZՓ7NZ# ,,VFGQbpg+z}}&Άpf xC)\)Q.!9xϞ7a1x Cgggwo_t+mf}25mꧥ0mV29ޚ4h-\Dr9G[kúT՝J' Cïl^2yX{댖Y3Z"H mݶcS-H>k ]UckD9 }$RC98W5;Kőx.HZظ(e#(UT8 m=oXw2P?"U` 84){+'hvz=GhQU%Yl~ظ` Ջ\.3M p!`]G;-Y{J-J54 Dnx%J_ o9S]wχ|W2P}<=ܦimٜkJ ~ݺ}.⌆DO=eJ9E9!P#O.9{xSk$zP~ꩧzʅe'/! UZBgq5KaVZ.^SL` p5* hɜ;Eࡘ:<ݼ"ݟ&"v%LWeHy%.Y|\nE^dVx(׭;ϟzꁁL&sݻwƍ|&ihhhݽMy}O x8x8gǠ>UTƄŶ<3k1<+8No_)@U^VH"x08VpJ̥,P IDAT;~ *JSpI~yuv.;|YW{9皦^!Y!VS_81GY>9{Ѡw+seYvDǎtc C`0 ÃΉDx>ycUSH`۬sϽ)yرxuU9{/@0j0&sZgZvw\~7T'ةӲVwo~ *VKioIM .=L呹P[vZW ]xU3֝=꾖@Hj)D,8lڃADDkͨ^]J/LiJs͓[|}UrcW\ȋ;yl矻3)kmX>G xf~At"ȶ"Ίp]dĎ^y&vphlSͳNjOr :aB%@~:S (`~y"Th4(?z*$ܻ՗xS ͅ8Sk\ *ܒoE*..Po"UyK3 WRy߅dڧ{Խڲi8Nu̬(}L:(+hңG2UCccbS,w&W(3J8so:ǎ@MA'xڴP, j8iSH!H& 0p)O?*^22Wҵf:IQ w (%fGT\F*,jJ`?uUx &h$X06709?PŎ ѷrI"0H >6888<<^>eȕwJ~iީjm#rGP6*8Y yH !/jh6Ev2ӑVQY"JjTyu[Bŭ"g}-䢕(u# r6ރUEE*MC'{z,?)7;dR&M0<6z73- ŢѢe챕bBΟvWjKnRn-yMU>;/)8V&Be~@φ;Z!;x*Ɏ3(;f4MD0<<(f8 y܇9y89^*qKNǑudE6tog466/[&ةE0\3ᣇj  z)埍{XF~p'I𬤕y0q|hE,2vmr4Ұ% RVQF$wM<^w݈<wulԁ`OڞHyPK@KʡOc˗>U{'͞j)jDbba-zk~,yܨ0Qȥa$%y3FNB/b˚lD*G^N99n6Oy0]:x{:ا͙VW?p(MD(lΜxuT~֊BF4h3`Fŕ' ezz0NjXn\p3zן&[ Rn۱z>50ڶ{Fnc9.4T޶aǿ8`tpb\:H$|~fͪ'ͩ0|0*ϟ8"UPp\==@N8XG y؆0H *U6޹s-OUPZ;r'^ޞ^ٶ{hx*I̸+MgL$dW{ 8Ad7$  WH 4o #(\eP*2၈ _yr)e/ QgZu<*t_R#?sg{YgA{_w#G}{_vVsX\Hy~vӃ崵kjt ~ݺ#Gx6npnض]W,] Wq L2tGmp&T/*ciϿ} ;{/[f,Zxů`VXd1TBT(fCٳwݍ/Ν;UUݳgO>xgW,[rgUjۄ $oE:CRuU'3 YY1wCF@ǼN_[S_jÏ?|R4`W]dsμʷ3~C="Qe}}}MMM˖-[v̙3w޽k׮m۶=GMRԾtg@9Te5fL\`'5e5?HjcN6ܦl7}f{~#,Z\x hi|溺x1S},7w\p###GIk_ӓJ ,Y$N AVOV+0&wL@B8ldti`ܢ-WN3G8QQ9VU5m%šEntbAQ9y)ΚE]{unSO?Y/Z`9`Rp|J@0Dz{;tE-[X{"дs=x:)PYmY;]uqgǽXEe͑ۉvƀP~8$:;|dv:FR‹LrsגbQa\,CG"R5.Cu:0_lj}0`˗-}u/oښ״oNJxOU'R^իWuw׾'GC'5UE;&7EIpR+5UYd{a*<mG {KRڢ'ojJx ԧ6oyeK[ܞvwW/ᆥ UB[߿y .liib6muV'8M>2Jz䘓sxM.)Z(Ura󝧾VSN*׎/~ȇwk<68ؗd)tgP>EyD *qa4i[<q[U+JA*5ƪZ:::^yUKt\.7;W}K,=ea<5ԸL&<y=2-+״<$, ;|xTc#6 ZO;/ӣI rEmG/krx8j|ӼZ'Ӊ[n-q, SkyP=Gm jTI$&@s7{ƻSsVdUF$Ge|S^S[:Ly =ު19M3c?MYSUDerpLcӡR;GdT(z{*}4BԽՔ~u|j^;n!lPF^]49Qф vp`P:S!iI^*2Fd/ZV'$?Q9^e <QoCV5N?j;(Oyn^(IQ^L'H8`HK(Gp\n^ԣ<28wY+gy6?Ɋ2JY+^LWK*ť60@ cmix %j˫)箆xjƍ?'cP:=̘Q(T"L:ʌCD}/[GK ,y psEy=̓ SUO]z6z#= .x.$d<^_>WUڭ7;Ju#TUE3pfܭ(qӣv2hSXLk{rSP%x>Ue-˧?q10˗- 8rbykrTtRs1*US{!OJW5qT=dY>Rd2L&*Ha v -/]ܽ7=r.Z(vfglj@rptut%GS BL<ҙԶqxTK@`)')ڀEWi9ߪz/7 E)iH}*LL.LF".?wlx%OlrT[j;fgHg {Nw{nT]Sǎ̛;'N x/r1u{ڸW❿ԲakMSDt37NC n߱s{Fkp-yo4Ø*9#cV%̮R$03=2\Ibe4n \;W`l)1|I;\JK3k}JO2B[^~^ 1G{.j'ZUy;-Ytb~vSh&ѿC T4=S9;K],6d+D5;6ZEm%)Na}WaSTzhͰ7I^ɨ h' ~)M̐,UeT'͢j=eIq(gtOM?LlYc*]aBW<ܹD]E#} b|㔅 .]TieP 羙c/oӕqiIT:U [:\5MhɜQDW^H[suQRKlmg3px:V܌UZwQ,c/lڼbtcHoyav&7j5xE2dmߋFR`'`Nw? gHKDJ"Tw4ttv}۷:p(̙3{d$\בE վn_PsAVMQ|͓VԶW9Đ~yk߼yx\fן&E VcǹcO1lTI@8lUs wUQ3go8b.. 䴊qgB(JΎcqk{wzͅ?{ϻzWWO:aXh>D]|S?VxϩȢҥl̿nX&=U䕆+}5,h~/aTziT}"Ffzd,#pipUWFbli]-MZ(G]fG?O✷Xa'?o@OS#5a+B'EwSE/bh)aNP,$O@ t)I]fEQM2"@׍ pdHX#$c " HiD@@qQ͉12 Dhiqd Xq @a! 0@0S'!+I2]B$8 BD!Tsnl%NH"\QB/&RЬŐ$¾k#1JO`!2PmJ bXFjuo;)VH|Za:Ϙu{C.{}.;#sO gafkk4޼7SS#!b[[U}疜he7'JAdG_$30V\Yb3+nc2)"_{h;"!8ӌ fVTRU!Y(#`B \. BC0UQeOk1EQ@S8bg!S@@aB2!Y82##lVUՀ`Ȑ1M##((LQApAI( Ue ! !2EQ!2Se10&ɝIb   HrZ'9BBkX%$B$3kK:FDA!mӒDP5xC2O2V2׎bD85$c Dgyg?Ξ5-JKmsСukWNfGg6Dv~眓sMEQ¡ ҹ.$ 2Թ""CT6g4-G뚦 2) ":uEQ e2p8*!CL&3<< La SUQEp.8Gd@1 c "xD.rr`0"1DD1F@H$ I Ȱt]u(8Ƙ"# TSyj` !2E@z>f˜1?!c dG F-60EATZ"pu0" `"إ闻oʥ C5A ZU 9s,g=&n)rABTlt*#2y+,tDbX[F,Eɳ,v un40Dc. [4؊ TD:e3΍ k9uMp0 1 F@###$Bk\pUDMt]B)H]91 : jRA3PF!BЍ#6 IDAT@B !c@|>/D!C]u]/:8PeL1"g7@ "X<<PUU%"st! "D)眙ADhLS22,!ԀS$E-"bL!LfdhIjLERKyŘz!jV4 ƂSU)IHpDá&Ml0L7ESv5"(ϙ3G~ ;9:`-ܥ@\Pe f¹ E;!"Ss&{F'EF !Vfu9u d$錡l}1ƀ@u!8:f19o1&/CGI#P&e&`8ڶ20Ǎ3o 3g,h2aZ,B;7%G"҉rI˜HQPL'E2\i 7`)kBcȘB%?C6ڳI* HjjFV "*18约ayYH˪ṟDjh(La 0( cȌ0*D Bs着LUUQC Ѧ0L\S#@< J<Je9tަ&8zh.۷oVM̚sid(f2\s.1E4|9aI%T*Ź EQ+]׹s!|>iq$l6 (\IJ-z炈,A^ ]1K5\Ds QA cݞ` `(0Df~qDaC @a@ hc{E@" Ȑ 2E@!PR04"X4Ii9&,n‘t1)Br@4!I2$v/  ǰX# 0,bvNʦ] :#6îU( Aǣ F6Ӽs9~+ #\f00t!0&H^-%h>iƩV%IPjMWu_oY0_hmq>h&9g}E'Ef`Gbl. !tsk$1׀91'DN|,1ve +\5ۦHȊBHVk Q( B*݊I@Ѕ92+M eٹ2dyp(PQ`@D! +qSi|ADtALE`"Cyd. ÖRP@ \o~Ff@B(| 0 d>i&9Gd(q /3kԤAr-a{VvӴ#0 WRFh2,EDs2 1sM[ SiO3CF".L$z!1`DlD # : @Qkƅ,SnKbcW3F:W._rCFub 4뚫Ln>A 2 0l7\55"R0" #DABa.ȘH( H9\/tB <q؈A`XA q"+!~sL"\%YfL(Y !GFZI BNJR(awИ1df F`$LVc 7$t)?!0f¨- f(PhQ@EQ€1@@ .8i& '@d4 01]ne$eD&M-\3*ɭ )cnAN Yhf.Qzc'5D$ Dfʲ4^" .5&d!&sMJ4{FkLacGɤO"aZ07\\kd1 9=ʅbAI4 0Ɛ#, !id;q@awh\$x^Edo&0$K@$d36%1[4feL|K9#[_aj 7ނs(T&a "\G@0PZmHB2@T) iit b q2,Rȉ"D@Q sQH,ȋZ(9T]k,Rafqh'X1&W? KҎ ŊH*8r **"\u`zj kRp,GY2k5@hFkQTM. + `hy6CI|m_O ;aDąn'aîa>+!0o!TXcS&t^ҮQA$' ڟim[mZE0$c]^v)c5rVppV d ye i)*R!ȘJȐ@0X&@MdNd}YR =QAYY2$m5Fu /9C 3 !ꌭf lZ1WY,+,6]jSZ9Cfͅ3dE=HadhD Ф¦rSv63PgΙ?|q&,oe+qNͩ^G#VYԌAF+Z4Wj,2B9]A$,#"#0b$"4+b0aA2>ZDֆ vb0'H &ًA4{@B@X*7Oͬd!WʄќZ|-CBa2? SɁoŴB!72os&m%/t+[8Y`k+Yr @Sؗd=\)9no?zMGd '4Hsێ3Ksf#cnco3 QA,Xa^1&Wc7Sh9H-+01!'M0$lIK^:STEčG%MŢ:4CEι5HXn[F,E\P en_~JVeշ2vt =ڀi1,mC0n<@__#8}PUusf kšYJr$p;"3XNdncZtt9_g4.@N]-07hKlEQL&`.Rv$t! @ Md  b$ jUU*±j/"ZB:֣\{rerӊ$4TotNd,#M¦jٹɮGefoLٳYP͑E#G [#,Bŋς Q5 LBN VOpV]ۇTĄ#voWdڌ(nfb"lb(NxuBF.aАJ ;ʬiWFEck- $ =0Ҋp9sEA@.aoV! B (*j$T&'`bF\Ȗ "ˇ1&D!UYL&1 gڥ"Kv*2v{p=kp6=gָwYJ`X΀h: r[$^IyYu^~@7 n )Q$Jl-gƚ 剑ơf{B1#ٴb$eKg$"E%QF w4zy뽧*s~dUs_a@ lwYꜪLf†qKLo}M;wPH'mVeh CVH{M{OD-h ZV{ LK6W+=`-˺- (Ye%WUU1>Cԓhl86 *7<׭ff-/FpV6G͍ͭ @8 d Dvp"ew)mb5dbth m%%`aL=eL}Ӟf\PfZ"[#h#R4z"xO ֋qg$˯ }}GHfRL`(gJ10֧1KY$*.Q]ZhjWKmv_gJ_Z,DTeb&=ŭxf4"+B1 Yo%"Z);S 瘉$ TQԓ:ֺSӃ鹥e{gg|UQU@8TUkgOxΜ;qޱh\8 ,YIGVC|ke,ʬ(>1uמmrX2,m#Ҥ5ph Jbמcʤd2)Efc3|ؼQ7w}LP*Yz$Z/+D#Ss%3<P=#.V< dHi>BT);;Jpp(3i@.q 5kTĚ:q$"Pt+_cHG=[uݩljquk z$@Is>_{hpuyޗNj.qqnީM&i dd]A %CQbrl";)g<aLlycBR$c"Plb&WX2QR䍌rϊ&Xh*LJ\bRMiRLwMt<$N,w)J) S|m-^֞[Bt6ꡉ=)h[y3`oJ9YihM|Mehd#'7LOm'd&) (#vN]=&C"qŁD!S ewy!Qg߭rVr.X"CREjEVgUiYA1y~YUa "^fJbD\L[VʩGylfff^vWl{7Y/{W=j|Pw,&PMQoQ,h ֋EbJ%u#YtR4sSwB_}& ̱QѸO). Gǎ;p͑LAЭ4EPHRw-؄=!@P"%C#pʾ͇{|PU!P NIx(T&, fccef9;șX0UKzm;c2$Īr u*߭Dxi+_wGӋbnJ5SFIjbU T 1通פD pٷp{6g; HJCr[$ sd buYq䠢5; y,m2$1=T`Zb AǷI/8gc@amYpnO0ٶe4O9~R!m%y:ɩl[׌qИ68*D9 9 ?F#U}oy%gqxǎ]u6(V=~|~|^yAWhOĉ "9m;Xe.1.#6֭RPVf3&rx=(Q'%6R|)8bPORnnUk_榫j5 nySt90CWxv08g441N8&\ʹ|=o?ӿ<񂈈p$z R  ̈Ҭv\,B| c+WڦJKRhL]~ y$&en`,=褔GIyKZ@GNg`RQ-4&]$iM'Q\i>qګu3~__u]!;{sK{]Uޥ o>5;3SŅ͋6b͠C-ApuvY=ktmfs %\*-@gP$4K!@xrB4RԭoT!z}c۩:c 8aiqYh^v{]xBp0Ae֊A쳩ߧ %/Fqvg]=sF vh$QY1FR{Cjв=aSJDUU5M2ڊxs$G22%7ӹ3\g! ],R[m-VdV!Q69 6ngB9f_; W)/?'z_lƞk;~ _믝ηtpʎфBTs~ڹ?Ť*ƣ#Kiq,);o8-mj(_'5( &G[2 \r7ZB`:%8xilWz]ڿg>?ՃgTT5A!R^$DjcH;Ke T2vxq5;7yG["*PEJS8f*[N]t4>tmS(GЄR?uvScl* @ l[haU]"B_IX,>F_9⋿9[ǿi? 9p8_g'ߟDvܹ__1?np8MW6&1 &ĵ/mzEe6RqXEj t'"|cloYD w9+L`.۬nL12yG U]-qlYݚ"f3,MbNJJC7 )6aJIhTER+sLdT9zuiw+y铧PQW#a< |QC{U?,"̨ڋ(ī2VTޓ2X3gZx:R C1| PpZO rKDJm]TфhÄ#n4W%" 'n V'ۏI9%*RoӧO+z_N895SEdsss}cSG|yy)F'NG~oxSLP\N{d٬0 IDATd惲S/ϴ\fmRfWR,0VZN JĩfDN EɲSZbqeQ$ Tն`j;O^(*BZ^X{ Je3~묘_Y販EN G`'T;)F"28& 8֒ T<ŐhJV*8GU)2'2sLn⾽sǟP;MF"sK@@T4 )2M$c?-(mL\W-'zklgWk^ɪw4J6lJW>!^ c UPB qJ{*c_b6J>Q<QVqSJ;.ԉ/>>|_җ~7nvZqB3o]~}yCǿ]ٻ,;i%x 7_]*oSsLfqfDzɏHeֿy IRTK-/̒1V=`&TjD86Ǵ+4\)gUGfɫ*btVBHyk0=Ё j7խkիtPW<|%,ƒH,Iq3( H#48Ib~X_ز+)zRTxeߵoǞxsƨJQU%-9/@OT EgހhJ*"rcZ& OX_s."FpFbLA &`\P1gHjupoaaˎ?wW7QѨ$NsJRA;m' L"MYij1jPr-E cTt%O_;&Ƞrbٯ%b-M̎(5A=C2{ x fff͡h}TVp}{NOO;N>4?~ᡇyy%{%ޔ8և?$v[nNDe3i m"Tf6Z` Pf djˇBHY5ܲLDUI!* 4@hzʤSugyzB28t<ե~ ،.!TCnaN_=.ڍS'EP vٔKvGz. 'P@;hdW 'ʋ [Tr޳h&!y˃zfjBsw}W ಭ<o~D:{1FE󚠆ͺ :TFKzf烴SW@`4Y5P|5,--㿅OEQ"+2+?wV9G|C8FMs(?n1!J{xSm*Զ:!DJpVL|%4*UgB&Db!!ePF/}Gu当ahbẃ斖߅g8D%cb+ םvmTޑr'CVw\KL`a1Pt#BЭ׳6?Z 2@k%,?2ݏ@#6Uc Ah'zikӌr]|5twnM=}=m{鶄m_[l;h2oLmV--*{4NDK>uSۻw//涶~wwmm[o5{WwewK#b B+O,$ ZɜVU,\4@LP|@ QmTgO"@,&S rH5DLBQP]1 d:\nz~nqeijqijYjN04r&Gx &4ei H*5HkJ`>|Uf(`A*/C G,"5ﺥ|UAyBW6SuQYJ[+ !tc޻dIDc9v29;&O1aF16q *F@rM;3WP[S|)g#mA[ljidaf=՗Of>tGk )\BN-t7ڲQڹ?u4d[uy_*i3tޔ!|""&JB$R T3EzBݭcIFDzڌX(+B%8ttSlfg$4.@<JDDZcTJ&sBVH8#QC88={|GZ((BVPu.q$namS^ IC?Z57mu͕'0O foy 0nc' =9활ʩhj,m>%S?\ڥk9v楳/kD@JQ+7kk؆ߎ6 ]R)v?39TE#<<'qz5q=tWUr"2jB S=+{:S88;w`;5=*+9(,49 )<@Y0An >1MIBKq{MQRUxGU,uSULMjm]ҳR(}f_-\}`>Ԗ3ù4IpˆJbf)Rb+bҒҖ&cz7ZJHӞ~EOŅwd9wRܥЪ^ոUNzݓNYZ…UpS^F2<ȳV=Ie"Ɋ-9rZM5E&b2D :OٗQ{v*AS3$ԠNSWp8 BtovLQ90hHرJosT9QLޭC,IP$.U=c:TI4gR]H`MH'**S4 bd׾ZL4?rɾ҅ Qp*9jp"l_hj3!=%G"Y Kʤ. E.L +0(rK(,J](gH ٔ}k|*fK e >Ineʩ=̳O=n&GS*JJTT(*S !ATi( efdžM>MADJgv&C*Nw*h\ݾ=s5Q3 f|[ zT*Su;Tw*KsĤ1iI8U+J"P* ˶*0 HK*t<H9& L CYzBr 03ǜ^f R #ŕ"T\E]8$a)w#o;s=s612(%Vz"ҭGRyDU!103;g2ZoZEILd*'ʚ.˫g̜b#MeMP T̻HGkHC"\*hl)_"Ç.;|hn%2=ܛc bCj<#N*{2;v숉Ɔ;j$$=@,zuffUt:33`AzZ 3.:t<U;؃|qOr&~81ƨl8]j0f)˱m(•ғ̲4֔s8+z8A&"TG#kJTB$"9bλAUATwKKLoQTB$bq<P1%\IU`TsZ 1ȝ-֫nZ6A)yulH%!QL$J/vB E.ؽ 9*ɋ5('"+gs(Ds9B6<:9@-F:(Bd9jZi4@ bрNQq4ĞJiPŹ^lh.4:jtggh][ǺROVu6riwԫiE%m66Fͨr^AmF׾;01n >*zpoy\UіC_k*M3ۯJt0TΠۛvhT`_aO"1!x#&j]1advM "c 0\22-' 033@4AXc(% 38B@NQf8! Gt133Oxǟyj4j65)'g 8je1i gVZ9unUUsng~vwyfaf(nn={/{܅ ka`rQh\>ƨPnťh0laf( E!}J):DVwԫi7^se? F4u]pu3o Ga]cdx xH̵FZbT;&"9b_y/yz驩pk+PםnM)t*uyf ݎ--8C9 ׄ0OҋI@vk&LZl g*4BbA k7_S4|0H2 (L@$)Jˎ S#FF)p$ KäD Sɜ!H\[;=5g{| ؐ0b3fĵPhPر};n@Aӫˋ` 6 te 7¹οxS'N>uյhP<|v~t¾h;>RzلUCM ̕/m.%67VWWٳv4LO f̙Ÿ677UugN`[kUT8r}ףx!q47*󼜑]ecZJ-gx4 $ ˦y?d/"ee?}S%A 69&q0"0,Ah),*-3 =\".Ď+0`;=y朜;?lL prNoRa3 GT9V~zδ0r^;k ~vw+ ]uםM^Kήo4#i i13}bsQ46NCj1ۦF] o]JN}__cmaa__^{ɕ2w~rw;^ 1^y_vs3뚉imKgFQ;q/]OWLEV秫)*R^bd陊E wUEU _ E0|'8wT9gBD,H_$ y"Q6D,M@aع"#40*.bA-Vc4ӷ)lŒ2VPpUh$U$!s2h"]&/=|SC] &,-Ti1)\}ڟw|^sw/mcs=r׾vDZcGkE O=eoz {4ku]կ>7877'`П{}+_p[o !mlnu=xh޽[nwycO_ٻ̳-.̿n5(0:CV:T5[^Bػ؍p~=( 1jqa~fS)5@cH!J@*7=MZ|^#ɖZ&Qi&2dMU&b frrBj 1Üde(;SoO{ ooK,/{n~G_`m}}kkuO=ӧğ~/֎]uO߳b\_)ZPm T."JQQ*i0ܘ;h4"f"vC&q2̔z6SWvJMå 902HH( IDAT 0Mg+`ʍ!2AUl3%싪 VX).R,i|!f];85!L挥\ʜ|8ZF [kL2^r\+)I+Tx1?pӞc>~σ>V 1qdUs IPN3o[p\ Ss,N,>}#21D߄fmB3DU5 榧=hm}iFFO LPR٭Y<dlk7BN՛MR~Y/|o?+ؓO?#"Ǯ::==ѩ[oi߾~ O<ԃ=?ٳgxRɵ 33Ǐ?uΝ;h_H G|xm}ܿرꡇm{~ngggc TXj4%0?ɏ/}7]w˖y g}w]Ws'N[Y١$Rsmf&FgC8b#qp1D~5YcP)̹='0-,"qjWtِ! <`2(0 *+DM3rbG$UFM%!4Ep`s"WSQ !j5(189 E5&ct  웿r~z~a}'6d5!HP&٫&e7) u;.(8!FsAVyu !6qDEngD!6Ѩ9PvE"[9NjbS0&4Ĺj_4'No !߷wޙ7\{W_=zcGC W=bݳgi8^~w.pϽGx߾V?c=qWUu~/eJ#?q_|]nfyy\ G\}УG !LOO--.ΘPp8|mx/>u~kw||xnv'nħLBUʳj4oSzJ*Y <,/-6VfeGUMy8#F#Q!YZZԑ=KGFTiQ1Y BSqI={ŗ hms8 q$2gwе@%y^ڷ׿_6M*(p*s$۬30Gq;rUtQK)ʑ1)5)*Ǔ6`{Wd餜ݥѶ&$/f6G*D dy3(\b[g)qE&ڋ=[L-2(z+`jY'"]D p"B)F%(Fǔ^l^+v+.u#qףV3uh aZx& reۉBdg%3wN gֶ16׷660 !# I E; ߭61!3sr@XkT1'1Xx"49sL$҉qۡ /YPb(FՈ\ H+b`D3UBB5=WyoumݩGoZ (BRÂM{ib^[ 1f5 ċ{ש*4 ZJ0X;|?A"sJR}I?"U(chU޶JȩWt< @Qj#Բ&Yp*&MpJl;q|53?Zp1th:)7ƗhIgN1A/`AdRtekb5؝lKLƑ$dDk&*$P'HCrG*`syd'?0 6/șG$"FQ$eοB0Xѫ{UˋԳ"k?5Y@ Dk04uI*$ !1 ;*q<n tÇ߷?0!ȹC1ޕA7jFjG(Qr$HrLKs5% X_%/wUmk`ck1\SN766KWN]F:^R~<)l=ґD,;Kjw 팔vTVŁ6 Dh &4e Q%%Քx7;5vbI̶A n|$9}p+y|>I8YO^櫤9 AyCy= (9D@_R\tPV^@ұ->S:=sBDJí*L Ogf8mF54:FNɱRW.;Ď  QG3g@11DPUaxoGUKhBA,d^h2ВR)S&nee};Ï<$C^}h۹Y_h!K53'N:Uћ&^IDI S%8Ny5 Km6}|^ |id6$ǀa9j4qU!4U!v.~[J֜sԼ2NOyYvrm`|ZX$h4>N-߸3g`o ɂm]Yeu&}+>ޚPUP@pH% 6CC?#zp%) 0BUw8gg凵2ws-TFxq={ȝ;s巾5 HEJ2 T35ZˎE 'P۩UVD 0*1|] 4߉nnHҀŔjZ<*G4͠I#iitlAJK]} 7>ڼz G'XWnbE1[_G?{W^6& Y .`JL:DX!DgY18T&Dw|OݿSoכc{㘧i;~AJSna Gz҆e5p, x\e2uS$fYzidм eUa Rt2u]<:/3j UOЄR(ÔgA@Z{naip^9@H"EACb@RlF*K/u*έ#1#cV[_Ջ+iGˉHXU1)L@B.$II[ʇѫ`9: ׋Q 0O7a/朔'of[K5sZÇ2J[WO^gmziIkXXKyќv=$ڛP;qֳ@-Fry[etKK30yLKZ}dކꕜ"S3/,|ʰXտ?ݸbx\KgTM*D IAI@B<r2D&3O=>};l>@D-t2˱λoַ.|q=V!5o7Dsh˩eݦr<=3Q5 E7P[hrѿ?yݟ[Lm0š@Bj f;cEBH%R\bt4z9eYJr.ڎjA j CZ? Li#~2V%`]]R Mtʼ`{ĶLHV/!Y`b&C5I(^I(K _ζDH! 1OSd\ez.2939xGWW^({.e$8H +TJ@좞O 1d6"Cye S`FKP 6d4 %Qip7[KJio7n|GW.hC&fzAq=:ՒyP=,`'GT!i;f<ʕ{{{f`)fh+V=+Ma(*$\gh؜}j&Hhj΢O6f#-{кpm"ѧZGB]0հb,y# 8AiђQ&jp -^??C<\aK5&,9!#@*` h!^`w #L(!`lRmc+d1bz r\4F'a@Jji#rl[/o|}W%MYLnfyC<+2i50?7ѹ} ,GtR=?CW`v2 k' .]B Te@S"dEx9JX+u&Udy@Q+Ƣ:˖U=7Aв0T]]ղj5֯=O$\7z"W.0(1D==SVfӦL#䈪Pl&% ERlVL ^ M!9繺d0[*؎J3RD 4ӮLV#اO٫lV=: LtԘ^.~7ok_Zly7KOݻu-I(b_xX˼rY3nv #S$ m`[859!jlmR"8m4 ŎܬZӼ°dHr Dt #\VE+Ҍ\C@ V-V^ ΫWZF,J*HQUbNJY˦Pdtl@-j 0 MK࿼0ؤeJ)i9 }q(BN[-`I!ĤL6"idPY {lH}GO)фT+bfZTEW$z4\~r?ϸȟ?w|?]'_@j 10R#lHZA`#`^~>-ekGl4S>!:N{ׯTd&s6}'|SիWzo|?nYY[7o# Hݵ#Z_o|]g1 7|*ěR8R'=Yw/N5sNYA$! 4.$;U\qX$Hf` -TfsRfoڔ\Y8/]i0VH%u}Q:oaZF|ۃALKQ>*(}ecBPlsӰN2tU蹸 Wo\O?yx8M:<碊񘿍5JRzV:R)0ta˩%Z!H9nYY.5:Dhhi ]T.]E|zmJ  v꩔+ԋЕ=ѠF^-hf%ݗq\;f2*QYQ[*A`Ae9cՠ+klB9'K$C2 +?5դB X7 DMAiHKҳy"PITsW(YN'k?5m[_گ/nky6G9.ӈYkdw?*sqf( FlVTO`YN) q~::qq?O [(Ds7{XnBh6%-bDRE XKv?28ccd1+-m3'$2-{kf}}tƤ1: b4$kj \za=|NceHAݶ8? Vlm儃 T'OTTZ7>AhR\ZRе}X.^['v3lE Z.Z(V[X8J#,ėw0s:^ɠS0;uҹpg[XP҈ ULtlbNš=+ (LHSL\ ]?$@2 a)vҜut+;.u#Hap- t屒0k #mC V᜛TjM?~QS61z)z7Y5ϒR?߅=Wډqo]P'(맖7&n>ߥRH HNΪͬ:+&N>*L\yLIg6* Wn"䢤#][]1 #Co$Pk #V+ۑVm7V&SY[N߆#6 ށT&W ] (1A& K<<`{baepwHC80}tsufZ9՗_n79Ϥ۩smGA3 Z궿%q:eB Nuo {bW*nr[{-4E?T!h댅!lSNŅQi5in խ 9A ?k@vBr1U )ِAG*-t{,VK.X@p`Օ&L2ra P4fA3%>Y "&vx%(grDKa~@?{vskCyO\7;3u!=S\E. · ! LgȩRoMnUj+NR6Bd:~N΅zu*@E͂Nv)PEġ$gpY;·"'Y'Ð`0Qy=H*L pNilyYM^1]!4Sh-qM$@r x)蝿y'Olp!8M[:%r%T݃$hܙLw$`cD>~fey , ]\msY^MJ6샎4bbVY._!u|~WwhD>0\EP!+Zya83> pw&k0P!JZ Y*UMgwuQYE F5J1 &(t`qLBVrPfUɓE8w!f9ᣊ~5C2fNF(OeC+BI(ƆH`EDѝGŋnJ_8̟ܹ#f"'uНA/SJ TNN ]XLAM*@1P94o-C.0\|p8Z\|tt+f&G(P0>> '޾{K٘<=IDhuR1W_?Evlu͖ۙrgRCvy 쉕]'8 T]NHc%9Dpߢbw Ǵլ^Q-5dQR>-H.v]R'=/RU2kQSKXe|׽t(h]J mahh *74;wċ/1VCL\ŷZPå/ DhXw~G|KEv;MS^`̓U_YK*wl;] ~%Z#SK[_]=͗WѼ%&bִ;)HTsRmsl&jKi'c\BQx5ccQ2= ت(d N:9'5N# wO3f%C:sgG2z!ARd/cY*L'iolf!n"sаrk Bi!-owYI.aǑH1Ax<35"ԁ}l)T5r-=>9Xs9K5;Stty10t`aQT}U;ٽqN/c" #U,^%Zi$vb`:A([3X"$DCsa--fr4Őb WjiTg o::,:t>^eӁd)K3UUQaT@DՀC!׎7߉֠MFl*69RO~?wq}ܓi:6`qΥ4L$;O|z'k:a6Hԃ{<'?D.]VU|.~~~b5="CGV+r{ym97ku!6_֐T+P~<@yUi>V+vexlrWIZRk%$=ڎu0q ]Z{i)B t?pQ)fZE/rmzxxxttu˯BrZ 0Mv}KZ!曱" NX^~V,XV4< 9uxxLyZ^9" mb5wDIلۜj@' p>`TUM~Ie*1Oܞ*Y&sIfb 8H±oS5̲ &Jjj)^waY+< ŖUhj" `o-45ːJ\j% gy]LdlZ:t*`0$Wq$ y>'y #r)C+{չcu w5+ 7sI4cQm^ΙP j4p>K54 '䔙}y=z7o[.:f"Z4dB*-TխiEf k.,؋/ނn)g=FU]B]2eZBހA>)5}\!O9jX KiL,& D my#tJW\]5Ji%-0k4iD)3+b-F i Ff(0(u,޴ȼAEL 4*$9i&I#h&ZoOrId$ʘl5a "U j/8oTD3E&M(IRB8MfIUQN?Z^i…etBcz QrsBYqr޼uNqpo*!J`[mlG WoeBhFHxJxiGЈiȰn1 ,@ζ=ƴC U2SX:9i[]*[pBb{# ĝOfX(NN9gHMjOӑ $#YFicɦ̩T ?/]$WQ <0YRI (-M1PxjZ|\jVO# aІ(&D)_{ݿ(fHbFL3m+DNl9I nQ}60׮xy/߬.DNĆ0K^'a_,Ӫ1v&z9-^鎘r3ht-,=q]eZJ˹l8J~DOXiH& Hq:{l*'!u:]rִTeX_* hsf1X$KD"ҙΐ~}Y9k슈MqW=ʾI$HqAr w& ,S:!Uke+Yd=SNM9/hj$?Y:̉AsοtZ)壏n#qqw|r;wݾ+$_Ʈ ЖB}JO[J?s"AgߺyWIgwJb VQشE`f.r IDATr.$LlM1!O$`,.>a 6`냅D8pC͑nI"TCrzq*`di1ǸCTHŖX%H(F;Jcś7k_wy)o'$zR {Ը.G .E fa"`yjQ[ Kl9UJ[Ï>~W:89Aoѣ'/]?}櫍3TmZ-ϲ?k7N8~n;ׯ]j]c_}女wX~]9v\ϧ Xς-bB5ݒP[H8+VC1DKcCDAж8o`MYB4EVEXjLwe&DG\X:8Ƒy둃KQLa90^Fh[VTxD1jnbJ!  hCJRYYo>ή趽>V7hw-7<ȊUn!m\xJ-e}7]@gެ:-(WWlgٝjGz?*H_v4tL߷((EJR'NUH3|rї??{_qX-O~K.|~Dz{voz=v:;jQ>z?oOr\T}[گowwqnNyE;ь1{К;xƞSr%2ޚws4oG

Mp_Tk͞OS}VI?wV%XU_GW_}ڥ?Ǵ /xx]A8rŋo|_}?:y (pUNfסcYu* sV*B,zq*BVGjd"32h1 -@-i]dH2& .r}GWl۔4q乕DJbJ,xR8:<{Ex灯?uB2e"=,A[ v_łC]oQ/Ngk&@t!b=a9wϪӮbKtT7Y;Uh\U$:| RYɆz.ɑ3X) LQk;=>: "[KPՊ(%$À$H c[DjX30Y*\ % cARcQn1`,U_~w07\ty3(8B|xAK4K_~'GGI̚t(O$6ͽK37™3|Ybj3޽{^9%,yV=$7#҃Gw;-ʹxqdo^\z˗Hn6v4~sV)%Lr{wv@COx_SuZȩObNzn{>UQИA[N2_#;F;"x]`ש֞UzAFWrP:u{v2[Y$ (5M*pr#!D\tK?fb1L*(6Ad9aHXRb"`2ɍUm-&`,p95a<>)ǕIp!A59*-ps .Hfhl!D R8“PUw3FizVr󭛷?sOYRn_|~vRU*u!5!% nj~*؍iL9?Sdxq㕽=ݻ w-ϟvޥW^yy߼{sގ7߼Eܹs_{Ν >-QaTy-NiMr0}pɀ-mqNU- r.o\S"@$}!.UiWEiK6jef}rNҥg,e F^vˇGۧO̠@9><'G]Me=0Ð0*d* (f'҈ @84f=iC)a![`4jjPZ1"!v4`HH CI FI!L8A&W_u<||%eu Uj B䢴ـ֣!.,b>yN-uK,iE)`( (8`&9L<\)5SR^8bj;z'F0n]< 1&QN5x$tx<jqܬh2EaN3E!Ht/n?cR,(7K0+.o圿&9ƬR.LJ/`#F*ؾb#*6l AQ13X"j9%ҔR.PU Sx/zYQ ,IPFaRhQe INPL­^T,O#LieI:~e<[Q'櫺JYm^kQ?y?/v8qYLb EL!qx^Bs/UvMgtWvA=U;7-;8dIWq>2z9Zj3kuQ{WE[ E[B;q}Z 8B]|7l>܀S9OS??uFL}FW=+aH㜳<5x2׶أ㭮R,AHm# ŝ Zqfݮ+P0Xev ^9 I~B`47;hf4&^q?]?yR !ZjK0 I5ôJ%V0z (*|hjh|>hZҋ~?xA<y6'o͕+Woݺyⅹc2)i25P%sHb9452b4L߶KkqԎz3 ;n`>CB^:]gUuά"<4eTg6uߟ%'lt׾2w-þo}Nu3wFD 4e ,@6@ #;T8EWalcb*ĩƎ DXyHTJ3{s^k叽OwCsEFN}^{o}[Ϝ={W˽<))I!r袵jv4Z_TfVq!2D;C)Ii9Q0CV^诐M JE0Ju((E ([?fYHB玆EqJç !HQ-Q0DD)Ť+B ET([:9 4jV,-|Tl/]|~}Zӥ}C7;}~yo|_oٮONyDposrQC&p]k'1' oo>S7?elDǠРOuj coz _4{vܽVr1yfV] Og6z33!n;@($ZfǴO4P]^c)HjWJR$K*Cj⠁)@ z+(|}7 ͗Vw8ndJ""z,8>n?H;MN_k_˗.ЬkGo;WUo} ^rʃeJG@ f6*n;8nrn}IΧLZv)M~`-nb Q֑#&yT#5a+} 6VyfXd/GR/>r>~1n9"ěyq "%Za j!SRD.6 $xﲧH E:iU4d"w8J鐛r8"M e DP+m*BY /'^?Ɯ`a%dPPJý^0!PJJR 7 Jl 59Wq> bƭN=?󿜿ŸwT;}˘] IDATYbIڑ@89C5h89ٜ8n>'w<k*FܷuNfOPS@pOo}\_ 2[pŤ. ac@:e1]Hv>(us03JLc & Y(PLWzwJCɇa(*0kC -+UJeX _/-Kp%e[ :R,y,y 37^JG+J)JɥX11Ożd3w+nnS$Ocgh_n . Uc_maqlK?Go~Oԣ'NoC+;R}avچe`ʻiZǝMC]vFq.0w{]e^^|-?6va4`jfVUK/xCu|\9 BI IꪐB(u^yUHl,R*C2[^O]c0_":HPQ)%* @w5H*!-hL3bɎn02ԋ/> Jj@H⩛?._g=Ka( L+!wYw@@x.㐇PJ)%ybŊ"wZKhnv:P򅳟l❟~_͠%4SpblxJT&CU&8Ŝxco|n媣wBKU灓`TӒxO~F(V] hCngSE誐HdWd("_;1hX f3i7=$}19 XTUSEΚaUoDYb9,l̻4fuU)R- Q(HT/iNuʽ{qvE&ZA@$U쮵:gU}-0:!qƆчy/"X,ki<U^t};ã'H-KcF)sK{f aH =Z'+4s"640=VV\D LuVOWv, jSkdUcavuirQD Nj#ALul8OLL7z:5hsS@Hyj .U_>(HmBEpJpXF p-$0Z)V.M!quYmrFq:C>@]t9(|&A4:k RegicRXdvjg,%J>>@_4`1⾞WD& /N3w RՇy wP/n)b̙{ka?Uxٻ$_懋^URr֊ĀY:"=uZ;n\gSN+t9w-C0i4#Vf6{mp "Ԫ"b4UDkcT {4<9&Fp(*PN#vDz8WIJ;h."* .$E2$(XX٢׺~@ ׁm|NG+?9$MŬ.jukFl:H(nN-2;E[ן6`kF3mUjiu 6ﴃ2LB|w:EY\@^zC/Go![ n.DYƵZ ؉S[+櫌]MEdӄxԍ 2h>q$a;{tEfYi3l 3Ue H6֍.#Jb ls=iv%"ܹb9:o= ڹ޶MԇU wqsZo Ta &O*-6ķ-vmh@ )g鞗ݙuPSe4U.;"7n͘:}[P4Lx nc\vًP;7Wp;U:McDHp8dZ8]n!`xWvvOq8ǭ^^+Ԣ,MsU ff:~0&(m%:\-ǟT=- ݿUoʯ^oyq\=ƍ~}8}#)}>Ǯ^+_q̽OPvAG9 L o k@XJ 23/b &6m*]NЛz|77rG?R|ُoO3o4;?Wӧs=?׮?s^K_?~̙{^vO8o xʕ7n/ ?o7||T2J)ðY]>dgwʽѶn/Pv)%zDSx&-pl -VZN)QVhiL,5]j`B#>yP1eu; 3w/c PlY(slf}I[u" ժ@Ȇbmղe5BL@Q;TEؐuv %Dfv''q$LD"2U(]]!FGϾpd @jEOڒ0rr;t kִ1Fs_?l]u̒bGJ9bw3)$z/b(O[` Л䁺;´Uhלc0&c-81;u|\{3o:P[|O}䉧[iooo|{Oҵknꪦ~ٟ??;~~;'q.{Ͻk_=9<{vwo+eT"/pxTc02b>$\0ͻ|~Zl>K,u.HWJpJ͟UДhfrWc1I5.D0Yapzu 8.FCّH&v"$#z).cbȾN&V7ZF& Z ;LKqJS)KЂ$K/n٠)1W $9S]~k/\_E_gc~Oz/"Ο¥K#?o?{܏O~ٿ'7}{1DFcږv4pĈq!щ\|='63Gt>CRHH-֫z fKku,$*^ ùD'iܺ=L`4J6]`Ĕ%$& aJ)8hPh̋.5h="# Q 3?:w^©]Isl>f`rm7 N.u ZN:aBCIÑLAF=LH#:"Խ޳kΜwz≧/Kw]`6_?w~׽5+'NxG_/os;?Ͽ?</w׿k?U_?~SίyULnwoA1cjrj{UUe^.G^ϔu6sƄ4~hKPAh[E5` pi0E!#dTB#>KXg ֥XPfx\^.U-ZJX,0&Sf9Xh@穣kXC׏/_rx0w&4B01g+fIE,8b)6Bd31aјКa8zh&hX5wS@id&^cQ%^E)hkPUjϟqXFo|Ӳ@/~9#RI<-,ިqa\XYKTl{6ͻl6d'IϺԫ(JVaJy@|Xk4|nP1by]Jq] r&C(ю y 0# l݂+j몈8ѧno'(UXc>:}{3w"uƠDdBZX$N!Uѥ(B^ՅZTde3"B)4%Ք\ue[bgؚ֟e뻔cJHN%t+׮?{ʕ+cnfV<7tW(0W'T)RڒVluv?uiwly kf# II%*_|\raCF)[]=lvOάlOao^$JaˠjEb~mS\"AV%:tI ƪt/~'~31 [z>UH6U[+ϪP,,qa0r8>b/u[۳O]LT=GIEU?¦_^i-3'j LwHx4l<8x?:2b.\4W5pss/-QE{z4-H]G@Jl:*)55JR{Iq]BCkpL`tpu((gpBRε,A-d#RňUp|kW.w[-.N 99y1iA(0},}1E1`̓mXnIͱNlT@$H2kWI7ݩ`WhHDG!al6 Jho1'y ѹʠYIG1GQ:FEWBO傮n*Y$L)Q$^ QD0xeD1jw,N"d"X<*ԾS"P($VhL Vї@#ҺԋR4qū/GrsO}u>۞2㩧?~l{8V1C˫h!ORtF\ nQtv<C!$pFq(e4XaH]$!^\(=Lw\ju*-#W’ ZJ[rHn*$B'Ws`eٸȕDUrRfs)CX-CsJlUSjndRW#ƒʚ ͛bL.W[۔_S<*>M֒l%NfdRBj2"5%!5gt$Ƶ9GyRPRD!tI⤈D_=rXDZZW!F2lЗ#@Az(%Wlԩ*C})iU) w{I5 pѕbD fD̒g;.my;6d;0ԚCUR#?0 1_916UG.n+Vv>qIiU/n~__={oٟw]?RK> ]J?Md]Rm)j_m EA;H[$J'&T$t 3ࢤ $C聱0xw(9=-͏N+&GCTF0aR︻] XV"(bp&9cZrknu" #GeQTY:ݚ}$蓦. %\4L=AP1tzalALKJ'\>iR%ҩJ8`L*5bߩԬD0BEE5UZTjA*UB$zRﺮt}n@lw%x WBBPiާYϾmWQt \, diPd=]@M=sbZ҉PV8Ւj œY ܍/~, .||{?0vjpw3GE.߈+UvOیzf-ͺ&8f$7OD8q,bSI`,38*w/9rqȹ E1fţciy3w8nh yԫ_&U;oDN|`/c,GrevL=;E'%=:AW2]Wegs G_ܹs׻*Z"K)%NBDE IT,[QsUﻮ!].DR4ɋEͳRw6ӒBVW?J41M7!@M h:h q=Ѣ&Ҏdc3il)LuQhtf*RXO𩃃|R>|J~&ߺӡ/?"'8| ,bvnBWWδBP.Q %5sŰ\, ѪX<d+2as);K.Xqfaf1&P&](@q ;5@&Öh(CyV^ىlgķi]]$ITT&)F2KW^8η{ Uk @T2 5i#&U&NKҩ I! j:]%nn\"B.9֖.)I$ OABgI]uQ&l- M½Zr5immVdXojo=%ڍHz`C4Q/uPBXi0 fv{O}2_~۞7g=w$s,K9&_iNԔ n:~vk)n2h1 ؎ZZSe+Ap@"\]PT=@.ё+GJ3-g+^Dܫ܋YR< k $4KT+aW 0w1FZ6rLK;Q R"%XRM21w6bghGճ"CHMڥ!T뒈(٥KIUv}2T{c[Apc !E$)CJL_gjסmu+%" Ej憓&ºU,n5 i-{-7[q[f}qZUy۩ׯtG>{ɓ˿xNjeHpի7eO98 iY7lBWMmLձ co)cҺl"@=j[eA(^ݨ1jvR`tMaZ3|@ )+HX!l%%i$TvK"TJ4v<22DHvKm 2@9>dPDw Aivu;IRToAWm)fHP%i3j`HZS^- \h> `" V;ڔ=n*Ɇ&yJL9d9oI;lL|Na*\ ;裏~7}x'UG1=7{};{\ VnhUaz|,y:C[qN`mqMl`fbB|iaF#Ѫ+J j:0 MMؽ2xM?^ʹ›H[VThNRJM{IS A-y[(Bq f$ $ADT$UhBSHn-Qq*SMN}ѫ f5WwmJ%~֯+U~c* m nqbaZqwvYfj&q|*O`3vw:^s ;qz9= YsyPdRdg61JU(YG*JڣQIa& e"0L'HKBYoKڈ!Of#ݥlf"mh{ V^%P˹ \(qP[ʀ2gNJo 8ݗlNxۖ3h/xl]ZSzDg#,z>xLg%JP -4so$)e&$uc€,׼d\#dt=rq]m&)C\V0E_wZ/H&"x@IB TrɞA"Q/GP "CF?K#Pf}A]1m ,Y-/y*3vwJKfׁl"Q@M~f0q[~uI$&KEU\cĔ́.qNư e|*M)_+rk5z⛏dyK.czkh X. ^I~(1ȕdϡ:ϐ2߬P(uX6LtfRhBsr7>Ayw=LG(&5~hN'UgӪ/?u+;ɾV#$BKEn}4B =̷\@t]^о S+9ZNyδ&tZ7$](ftM18-ͦ ڒR1X'Xuzac

0)eOO7X m|#n[,y3㦚pSU[ˡ+8Z#˝QA_#aܞ괤S>qn[a#0)U&lCfke=h]j2Ufx\6!mȽt{S3ah3\`~JTV)fL§~^hX}ҁeg]W.?ZEv8 n_+,H)s#]۲⾇kfIzlK !㐶_7ĥgN9rm,i$RgPgl5v].8zZS12. ۾AJh]$Dv[j ;X=saUħ+;O5rBj6b y$KD?6x !!~߂5W଍ T~yAVW˾-`X3 ɬb5+eQߑK=n kc-agQ* T*o{@-\s'jX``fYTklWPJP mP&9OYcpl݊.dT RȈPqᢦ&@S",0HYbɗ|%ݻFOE12:m:S׭fVSSGƏ._~Yرo6ohh0t) abǎW\k0>oOٹ?L_zHaa!ᶏv}y&Y{x$-^uOlvn ׿mm{w>_xϛffgoy7Rjkkp-oovG{jǟ]ccS]/2Rvn;oooO=y[ĉnZa櫯'v}{p`}HaabO^~ս9v=ڒL' ۭto>={isW\릗*;{ymd{02<:11^˪׮X>^03;=v;wVZqS&}-|e}nksuuDhjj=KOE0q^+bg_Xf]w_@{*lNz=uuK4eѱ'ON,YԜl 555T.*3;NcB .]NwONMntc##RmbaYCU3ss<19H$BT Ax={۷Q_ywtT 񲒸!?~;;VTӷyo移C|>=թr7MM55ݟsrni~|TtfE )l:ёj455u?qnnkkhkki;;;ˇ=ΝjM&8T*ն7έquo7Jvuu$::RW իgp.kK$[:fbQ,6t׭LtOLL&KP(|uN~!¹CXK|%ݻ2̓O."DXP \>766~P(#aA޴@2pþbR1Dv_>(eX駇/]"DXL tIENDB`stopmotion-0.8.0/manual/screenshots/config_menu_export.png000066400000000000000000002204031234321124500241450ustar00rootroot00000000000000PNG  IHDRtbKGD pHYs  tIME:S IDATxu|G4̌23Nٽdf :vlْeɒ,YjPCN۲%8d]OSCUu꭪SuS\@  ^!wd2ըE`P:ohDt>YMJ$H,1!$_v;ߎS29z=__oLC7q~W|}=H$x;Yh#W9ݥs C 6PB(2  Fw2uH$eR F& {,-4veA 9>;u5'Q__OgJ]YKt7Ùix`nPh xyp1%aԼ7udV_+#qsgT^>μvv[97~}t+ $&@p!_O?9Lkk+& N駟ϏՅV\FCjj*լ]w}ɓ'K{{;zkPѡ U5T䝣OU{nIڒN:ٰx .u8sLJbrrKꨮo'.OW4>\rUcíխZHVA M=X[Y0fX Ύ4vSXI1[4gq2G{4Z=r1:ީ"3kK 'SU߁#=5`2D-;HMM7 VBPlٲAfdd`mmmnxnjΝ;"## ?iU&E,wF"e$J +Z˾v֊I(l?Yk+ 6z+牥c|&Q!d^myWs{;+dR D{rBq^^7UFPUN oo9G\7rhj&.܇ rkY2c/@em~|3Y7x[z,e*XuD;Ν;bĉC4d2ِa-,,7^|Em^ _a籏Xn#""t]H@`2AGW/R dTs!z~XXX^rBr=y㳄z?B#|tb],_~NyU &ǰDmon>ͶYMm6,KJ6\d ~Cy9(j@ b4, Jٶm}N[zz'f:LFG/L&S^Bb2Ҳ+pVR!3CHnv?zTjm*l-RjH@ѥ""ȃI#Cv7[tz&144wߞ5imW„!ڃV׿ڡDwT"R |Ƈ~quu2ܩS4nkk2qww7 F7|\|a`0詩bH-H$ 51/gRőXYɳ3a8^8?~tԬjX0%1Âg穪k FG]S'F -J:3Xe칙TwT*j8{WcpzԴv*QjgP3QQiihBg0R܅NoR |od[ fݺu( lll̯gyfSN_+++~_0$u5&Zůzf>Uatz['b4 I@ <0c~ee$$&`oX]UUEqqIcG"Lih:Kʰ~l g''=2N4-!@ J`4aei^l g5L&Ӡ {$TڒڑD2ȩ)@uk&ӀKV#H?OӫVS_߈Bሷa50jpH`0ۋ#,F#z K$s)DEE L\]]8"V$t{x붝0.iC32Jhe8+*r1.iC@ uF*(,1 Fr]gރhjjn[ߣxŶ4zz?xWgLM:ujXU]CqI)#Z JFAQN gMgR_߀ZAQ]] @mm5uT*+)-FM ::oTs-PV~ÜA']o2Ji|EdD8v즹w77RILG٣Hv5_DXX0gY98}<a,?D/,b$ehmmh0pI@YY9gMƍTԲ"y1>>ڽD]}=˓O^A!'OٙkWALk먯ofe5˖3'Yjquu/{^}&?DtT3S񡶮5:JMM-VVd2^trQTXZZ>^0LJP?假;FSU]Vcذ8\]RUR3gjjj`ױ@WW7[[\\ k C.ӣDիd2!8sww%(0?d2]]t:ijj@GBЧcooGFKgg'VVHRlmwulz<Bggǎ׿9F us5& oo/xj`)'<<¢-kN̈́FcD&t@gn4ikoFjVKXXb|}#IO=i4!+*nV2m all+3a ^`ei%ӦT*ex0{R/gn 8sb]?Eq1zzz !6&_h4H^&(z{{y罏XjC1,C0kzlm y5rV.[i3p#$$,.^g\ι )ذh\}8v%eOqc'vttrE/ϱc'4q<;qɋini!':sf-1ёd|B ֬BfNFcfrsƮd"Z3gts^G*b RD^d2JD"A.c2 \n~RLr) Syyz4vi*\.7s ɐJF ÀtF~q@wA~A'-D QS[5viƾضʪj"Xa?l[KNnJBs=`w?bͪ\~4PJS6֬0Ξշ_.3bx+@ 4ϋn-]@ (6=2櫵&@ 0 xq`0JɮP(jVc{[[[BC;XƦfƏp#z><~![$<&QPXL°WV68:ڡQ?%~DOO!<63 kKnvߺ"\ JC Bi@( @ !4@ @ @( @ !4@ @ P@ !4@ @ P@ JC o44-u 7۫2^豓/D>/+qںA;~u {yjuo5 ɄFWSg14KJ/(FVod\[>L}ȭ>tιs܅Cv"R 񓤦?pZJn [;Aç]A}CRZVΡ#Pڳk׿4Z[ߧ\7䟎ot`&/G* )xzz0~G"7E7pRF??_2aH6?HdxkW/̹ ܸQ)((,3 F-GPPf~ ٰn5Ǝ& sSXj9<| Vض}֭&. Xo//ͺ5Q*9~֮4W޲>zFâsb# &Mϸ1lt+VVܼYĉ:yF_0M,^4А`N9ϵ<}Y`R/jgU444r)-Y3w>瞢vnTOo'''VL` .]rz6.CGacc~:U\X"7=R/~:QwO5?y'6'^ɋٳ ޼K\LMfe7oVaggNj/Kgg'EE%lݶ(^'O*:F3>:| ??_^~9:;ԟ^~hwO ]?DGER]Ss) Ȯ1x3~X'/&<"mwjE2ϿDӒsӧ0esx Oƫ/ŋwPVV֯ȱj>ߺ䥋x㵗prR'3{ ֭];vٰv50Lߨh0PU]%>s/T*ٶ}W.'ih._pK41qrQa}HR<<6~NGk[q1H =J"سӧOzL*e)\HId21.i ]=XYYョJ FC0cV*U z"#XXy/eX| Y&llI@*b4dd2֮^ɓgHʔouʥ5r8]r9.Τ_aYb._@ӱrR22ooOzfo/̳%gg!AXXZa4Joؘh Ghllގ( >BCC0H%Rj걵++K,-- /S/K9**pdD8777T^o㍭Mpll ð` r:۩YNƆM=ͱaY̟;ȑ̞9D On\ǁGQ5Xd,ӧ`gkK?HRb"qrRKcSN IDAT3 Jquu%00%ettv`..lݺͭA? DGE`kcKWwN GBCBc0ɤXZZOqi7g&&LDGagg'=J%-,//O;H$FFӀNh2ʸ1>zLx-S38uzoGM&BC5Ct `0hU燯 \J%>lll GP AB{{V#Ctd65 Qဝ=J [[{0 VqvvZPJFJ0881cQX[Ɖ񦷷7WW"#yooCVV_@K{ذ~566HR2fى7huZK(,,pBሳ3gϥ\&ɓ&`4hhhA}9h4R9c*yE2a8orR-N sijng?~˖rYllqOh~>444RPX ֟V#K 7+*Yr9Dnn\LBas:M[T j\'W23۪%w()+#2"9+ǍjV6(+-G*"ˉ܅9Z.^@xx`Db=k]Ȓ9{.4_Sdh:R)˓}^k"IIIE?NJ͝h$r:j7%kwiudRHHHhuZ[̦;[[9}=j q% Jpqq#} r "#8scillw2fA}nDJDx(irsr?~wq8;;ӭ$ih8{O?`-y@u7XYZqJpV$ޖ1Fچr+xcgoG?g^Id"4$ 22Q}ouG(^hniZ!oVCSNM-zc0 \Ȗ rllmX<{{b/(g'dRBCIGaQ1u \77WlmmcKXh4 Jnˆd2""ι``d$uB# DT*%6&JK'aXϜGdDF# LFHp>L&5u\JKd2tBqvr4Z $8875*0."[Y<< LNHHUܬRZ: #sfں\3:Yh~_P%"< ?p[(..e„$B̃;;[ιF||ENV,_7]Π#tDNDFs-7** aQߗJVvέNXXh;6HeRB$+:]̛3kqWMKkAΜ!0i*Խ]/dvr]g#&\]]YF<?+\Ρ¢bXh] &ҵsR% 0ef^1k1L;m0e{~͟|3w׭~vIeɋnO/OO-'M 6&j)ĄhY/O^1\ioo'1![#oyM"66Zܡ!4$[ɏ 1ՅƊnQ@ ֔FAT/\L^ RPz5j6wttt.;'r Wtwwyޚ9~/lr7r_.ǎb(zdP  F>fW;~5H}hl+>>;[D <b{|}u=nKDG X0 \/FR/μu 455*|Ox5˗PRVV#(0r_xuHvG{GX[;{jiWH`G2cJYhyX[3eDR.T?߾k~[a%88?ȻBVcՊd:;9{>9Ã+7qIrJZ o/O<xxLQI)1˖.&88P]SI$&jDFty_A[[;{??'/1?ZZV 6_CccfޜY\L'q%#'ONGG'gϧ~%…sdʊ V @}C#/\B&<~'Ndb%DF,|gƍe)6Ƭ0 ʊR8r8Om\Ok9HI&O@{Gz2fc2HAHH0Oٙ+hZ nnz[Zx'3{GDګ/R[WL.?1rԴt{zP5sb*=$˒c^_GlܰS&!886X6_yٵ{?'MGoµ7gkgKtd$A\#AɉSgh4ىZБc6N<ݰ%,$ӧa0ήnjjصw?RaKPwaooG}c#%%e 7n = erp.~ d21QXXqb*]]]fQwn/!8(Pacc*սgL89)(q6j%|Q#x1Lށ+:| ///quu!;'wfwyJ$EFfIcGR3RZZNlLy88s%* ͦk??_b#kIL*#::\|bf17wW c;pȈpZ]NTJggWƿ[ !ih0 |}9p(r[Zp'1!<=<@ү=Iʥ4 ;vrUAo/O3ry˝{Xt1K@]nD R ]텋366xyy XY[EǠpt$$8ʪ,F[kDEF+^^dr\]]Ɔ0jP5抇;.X[ADxj^"GGR/_a9r9>>ߏ(;PTF}C#6ք㍥%>^8*4KKK|}qpKKK̎ںw7O=nDpssc!/ggBRI?~RYU_|}|hni< &&MO_sga^vwsGIkkǏ#,4جxpttdܸ18:8 qww/0ZZZpqqfMkk]xChH0u1e҄///P(耗' #1Q45݃/NN z{7#FQ'՗_e}kyo3/<$&D  ?x7"I/7 kxTpdO{ #@ W(y,-,p=vvv *!X Bi@( @ !4@ @ @( @ F{Gٝu__]?X B6yRFpN/^ZZ̎j5 7P_߀VGI}C#-mN.ۦfu 4465Jx;F՚W0詂m9N9Jz8ϝO{%s6+mm y\ ==ʇN~ij{N{ghnw!%u>O@'t+3;w06Txyog[y.ןrܹ&7o?̞zϞKᗿ-7+1<|϶nϷng2B%Μutt|@__Z.HU-kYlr'Ff.YHWw7w里1cF2uD?Q(|6zbI_Z͑'()-#:*iS'q)nVU)QAnn--b#rE2OIٳ $%fd^|%29׭c8;;``>ѠNׇ3E8SV~ Iaa1ᔔ1.i )) ?ښ$R %e$& cE GtZ%1!_?himE.$j6F$KXh?=J%╗^ގhͳ Rt{y5kA}M--\ʊ5W pSŶd2Z-ӦL(*L@Ѽ'XYY9o+BCBprRpEd29֬ʊJ°8-N9KqR(njpefiYrvvv;nf钅h:=Am}=sgd\̹R)kV-b|YEfV6m `y74z{?n 'Ͼ{{{dROl\CcS3A1g ǚ:z$]]T΂y/(䩳2̞T"$/YFࡣ74p~]02r?x)3z$}}};q&Ob$;HIi^_.v܋N5r9W%!!c'NFV58!ؾs/m3iS&}y5v\]H^ή.S/3<1 _?fLJʥ4zEŌ5kkk.\Le='me붝Yc'y1ՅVz=ӧOz^=&;'m϶05|r;_nņk7n ?tť8:8^5BG|ALLY(4j 1ё\E%Ϙ\=j8|V4 }}}Op nެ"5-M?͊KHlSMULk{髦\FlL4O?3gɧ[ ՗_թ0M簰ԙs8;91rx"|c72H{IOu|Uǿ㒉$3љWҦF]hK*š8Ʋ, Sԋݓ4mԒqwNZl_v_Xy2s{9חs:e^6k(*ʙ3g28~}ӹoJt:--m̜1A+ /X/{]ٿM@T =juz&}T$MtpK1|;TʵR>SfNLBB<-m(t$Rpf̠?o$&Ƒѯ/ee}o=N-u'U;ǗO~a466g~ΟC" .\*JJ =Rv .CY0.@);_ 0lDsql F3md~INBP` 7lbz/' .ٽ"OEB@@6\F[[;QDDJYY﾿ݷZ- q˯ΘQ#(+/烍[ kDGhD\ŗRpLYY@6$#u$'RNW"(0ot좹DvatuuQ^Q;v"-Vrd|}UDGSU]̵ IDAT=IIN"5%Daq1d2lv;ȽD89eGkH,N'rx5AXVfΘ{oD$2Y P({wh7fQYYM{GYg X-=P*$ǒs,v6[ܑB}Q![,Bu:,V+-||`Dy ~DbF2rsϻ]^FdžM[8~L2uPF#2 ?qkm6Y̜1Rystwws,FHDxVIDžMCcvqtZ"#½.sHRfMc/YnK.ps6p2UUD(ϴQRIjJ2 qDJ--Pt8h &>>)wL@A>i$&1{40n attvT*FJrU5sDD}C* %RVQAff5u9 E]]WsΜd2J@?Bx^zV+>r@l6ARp q+`|}C !--___ Lcc#=󩮩%ۍV|A m]|EVg,iؘhCI^NCN6+L! cXz7ϳG$H$"!>Νgùs&SINJj豓Q]~?)1h! rQ ZMVb GɁCGaHHl.^LXGƾj?IQ5V,[DXh(b1:H zB%6&JTT$] @b|< (pcnjB,s.rr! }aޅFNXX(C]]QEbs$88`{2:bcɤ7MD9t Џp9,\8'} >\t3g q?qM2?:E\l4RN˄2rJ DB|1=vNdd8Hr9NX% WqǤql68C ř版W":ڀ@(@*908DmM}~~T>˅J)v .\^sckD_ TuM-WΕ+E蹧0qk͐!IOp  _#(0oO ~NzS;O G*cႹo|vC" f̨_XO0k֍Y9EHJJm1=)IvT>.F;1zK#ҋ^) ;SY_+oco޶jFqWTVqБnsK vF)8{G̗rq~?9Q_6aٹ{]]R8NZ;uHoظGWɓY]-񬻻~WOrq jjp\ttvRZZnƦ&kWQV^AGGn]-7FMmUX=x\.nFcS3v7ЮKV{߿⥫yyz—kiaVڰNn9"K_DHT6gy a\),"$83(**sB7|P(tZfϜkdx|B!MMlV_f͜ZAuu _l,{*}"Ø;giٵg?m2gt몧Ng@ )1J8.ݽ\mP[W>*;gOG9Pnmk,_UJUU5Nk[;̚1s^Ο/@,3gtbcٲc^-&*2.ΙŮ=rϝMCC#;vaw0qX+E|}'v ƠѨxNLFsǤֻHR*HNJyszΙ\rϝ'ߟ b6`f&I̞5p\T;k1c:B?wG@"=-?Q# 2&>.E qt6B MDˑ'9b-2:~Wرs7.^GȖmS]]Neٜ:VB~}ذi+3zkjX~f~ҙ1m mm:Y0N]-WbTR[[)8|xlɶ>j+q1NF$1 㾑eZxՍ,]={Yٰa =Ow!?";l6sr!EYyg옑l!f3tk[Bx7Yl1{+p;lܴ3kwN^Oz*cF 00 ={d֌i>zX̨ټNJL7)._?ORRǍhFb7z__J~ [_0l`LJ卯2DFQ(~OƩ(J|/Z[[;FIeesEJJ2+?w6o"?k<,]Q#$8XÞ}JfLº6a2 {L .m4a7_op5\ Ձ{U${b >L&٧ s˽,gSVVNEġC1jpYCFəs{}1&#/p465{INJd݋س ƍfI;~ʽ(őng뇟Ĺ< /QRRO!91{< q<䣞;of)i<ÔRq/( r9/]B$ '';,e9zqFT*niT*%TeؐADEFRp ;O~{6BEe)I`@F_jkhiq?x䗼Z"qgiY9?oo%Z7hi4@*s[QSUUCiY9o@@ZJ2MQ`4iO7RG'*juw`Z1 pIѿK"&m3sT g?yZbb ||͵Rܮ~ځdR) i>sH$HĒhJ%Z] Q[WOyE%~C&r9DFF`Xf^}m-GdD8w좭uP*q?xƦ&@}חJjj2gNC `60L HDZt:-cF# DD,[1 JGEQ__O]}{}p'm؄@(=.PHbB<H7#Qmw8K>\ =:poO1JQ*7h=]@2a6_NPP޳`MYp`4hni%,TB >>3$Dc=tuP*c9tho3{4 Ho `˶rK||,f^%"""Tα'+0-ج6^|h!\Ļ 8N\.v[hllbYʙsȤ,qq1kR_~S3iCo^ɓWP[Wǘ#ϟ~r uSYYEww7 kW-ZkZ~}xo/740.o (--,db2v&"#9MܱCdR]]ˠwtIP(hnnڵ۝9pg1j0 |V.^d&"<Nj5G3fvZmIR+\.i֏IJJWnC.JiYW4###9SQ_>D)IwrΜeItttH$K̙5 bמN=$usE$'%f&%k8c1-dATP;&Xe8pz=;w%;'38?!:rܳ>R0¢໕D" ' 2ʇ\˄cp8D"!B!#G ^b҄ `L=*ho4Ro;6EWy'< =sfm->r?_~çYp}O<DTC}eVۚZ~_#ɘ4a=R2b^4"ڐ`J%U :]P_/~D&)+ (( " iA aTVV)w  ,T@ @Б̙=JEDDLrR[xEb@!!HR5jRU(V@H աT*pPVQT"Š}}}7c@ !8XT*%DOz* k%"Q^߯H$rӢW&OxxbuP rJQQ퓆AEAOyy4442sH^bp1} >>J#9)V  O4._)l23fH zJ#2"ܫ29CUUd -5TVU1x(B-Lii9C=taaجV:;9bzCjuȤR$)1*7}T$h!wG)*H$ 7 MII2зOa=j8H/lj1&'"#AŵRbc5rw*5u %}c0PV^AbBzJIOM%_7R)}wNȤRR eIOV B$A\l S&O ot (HMI&!!1Gr݄# i$m'!>h=CezcYx D(Ѩџ` wNOwm~wN~oW~%o`æޘ7zQ_ʪjo ۵~pKj4f ΗK]]=u ~iV+96bd/F^?jeb[Ӊj:y*;kʉN?}TM(o';vεq8lv**Om g=N 'O⍂.+W^%`1$~Y+*wtxx\ ._)3ÆP(݆&`#FEe75m/=gNeQxcشC:Ql"u7£?K\l4bsJ'a:Fu' ?pB9z$m| 8q* TʴwG~P(,^0C,k.._vFӧs8{\˰!(+ŗNKK +-!D [hniGÒEvkQYU`݋p8?qիq:+jiimP#GORr:YnϠAIJ祿˜Q#||2b;rtV/'=K g " Kx wt֎Fa}=koQ#䥗AcS3˗.&<,oυq&EW0Ul 3Ofֹnݽ+W|~Y|I &00KpS*7~cc IDAT.|||j4a7n͒Ew!jXe2~^+ز#bbYdgj \^rE*rW_;g$E/p::y"}҂R;AIࡣJ+xNML&W6l;&tΝϧΤ cYde3xyP*wX͡CǨEzQƍP(p;j"W(x񇉏A wfiyGQTn99 ?^Ap\}W0kT8EVl6/%,TǩiҀ ; F,LMuOPHhiitBcF@ FL&EVc49 Hrr1$ qь9'Oq6bX,74p1RS(..!22L/VrP ATVaοH[[;u>r MpF__ 0:::q:8og||\ ]4( +;srٹ{/'Oe1p`[ @XX(25J%gA} f`:8RFJEK"$?QO#"9|8WܠHdttvrTme@AVMQM&>xoƏF ]qqJa9gr8}rqKJr"vc}^v.CQRZU58G G"RS?T*DBE J69qt"??jw@aCOIH&5 ־;wЈ6$}DYhjj;Ya3cƌB(ƌH,m(V=ٻۭr|fܮGdqMFBQ#HHMM-Yٹ{p%R)G@,&{ڦ 9)ںZ>ݹRfss gPc䈡|kii)Sr1nډ،30"۷2<LJb2mft:R)|]{l$$MDEEL.cxN, 1DThj|Urqr!~L&'M^Pދ/6H@@AAnyrR"lVÇ !.6+BM^X,"-5ӉD"&ڠjBjJqdf (00T*`"1L&lC dCy R $XChk?U(䄇p8'&ƀ:(BAdD8 =f"=D$v J"C?2t bP(??AbB޾->O>;9w>׾u&ܗF_toJKؾch4?F`XxʑʍMl_˝+~ܳ_{w-0L|hokgv&;;lllk/ӣBkb2yZm\R6+`テ_Y^_9veVVUG;p-TB67z_tuujҰltw1M{nL&w ZXV`Z1LfF7@%˅n}l`21t{r;>Hw[̦f/) X2͘fL&S6Y6OLO$0{c tm"..ՍoEEFЯOo}j pnWvF,3-mru1uq8ޠ̞oܮV/elOfoA.^cJ7PmPYUݣ.OwaLfcYr8rTш1u'TV,SV3tH& RWWmJyG7faX0oF|3\tZs>H$?&b Ǝfi$&Sr'8{<+?^g4&#',vW_ ~~/PUUC[[ƏW_=O^~~T>Mzj ?﨨"凾o."g~+*ɤ45qq1ſRQQ@ ]س 20(**B^jjXt1UU՘f8'㟯hATwAy>rrQXxKykinnWjl6-fNJXYP($$$ɓo??zܳyع6k%w3 0c~  00KyR]LƠAxMdR, V,ҿ FQѰbb/@($1!sgd^f֏PHeR~`5'Nfq1߯QQYEGGӦᵸ^{w%elp;#G Nmllpkv@bcc=soC{P81C4^~¥˅|.1˦PQQ5c eel!HzZv?CM2V+\ƞ=).)%Xf+8w>o6ٴyNWg{6ѧ$ؚ8u: 0kTd0ƏE"Uo;Nv;CdℱKP(9} OyKD}}#O=ӧNF(RxZƏM>i8xAll4>|?cG|cq7ĵB!ƍ5R_WO[[;Sk7w6>>J[Z9Ø#8a,{d6 {W2wLO F»zFk[.c9x(ڐIg=#xl̓Ʊxx=B!rqJq\$/}nX,:m 7ޱ'6d0M47y_BUU5O=(3OE,SRZNII9Ǝ&s`{,"#yGXh>*lfI <ģ&'q&7nG,1j0ƏEGg'{`(w9Yٹ^Y-1p@ƏwG'<ĨHOOei^q34 q,Y|W\f[قqcF1tp&--8Ř1#8~z:d䣏w0j0&ŋ)--L9{[Cv~]tW0Ųlb9,\I'%.63;Tګ4&w` AAH$DjcC(Fn{=uz=~* (29^" d6{ߋ#&ڀ*wH z7͆d5;˗ q:_T D,&G=os[oBɪKX,CPP"$ J@jԌL.c1BrBBj4553xY52 H [.!lvZfάȤRT* gaw ɤ68_H+ JKXm6\N' G 9.t:-ev2cdGV^#=-ݎD"A"rs{'rÎP$B"Vw?77# |sާaW&<<׋:$Hx}Ht;rJ00:r|:Ál vyD͆dkG#*H.s<~(O\uR^I_<-f 0Ds Ln.w~ ѧ+_U=պƪ@`J~%ԟ2ֻ",1׌|r-MhzT^ L8Mlٺ X-̖ ̙"6VOH*x%c;t;A&F,_ĉt$|>߬XX,/yaYYy=j5&Xݻrd9aaRYPKɆvZFFGkIMIw?pзo`oLjg{b2'+׬Ӄr{;ggh$'%#JxO72aubiljӹ_PZZFzi1NGDD8}qp>!C: TUV#ˉ_\>g-ѿba7Ȉp'tTJV ti(6nUkѽ_zceq*FnہD,F$CsD1v SNWP0yx֮HRB.aC3d^ :gw")) `:d9u’3dz̯vS\r]z%:Ճғe!%v$2`EÆɜ'&&~}\ƐiNâ%K5rѬ//rV6n*8?uG35H%dZ( b:R)%' +IJLncX00[hs8064"HjjPSRR͎^no#%%Ʀf|>zuF"1147hXhBiii%%9)>5#JU8k5NŝkjZ--͈D"4DGkijnF!WӸyN bt:HeR>?!!!Tv  #:Z4LݎF Lp8ڨ(hZbQ@IjDhׇ^jalh. ))=ɐQt1D߰X(r qMDD#J7p:GP#@NjVZ.Ǯ L*uƠl)@"hhh$""khl$<, LFш.&YP*M$$lӉ4 IDATp\rd2;`M&oC$LkK2)߰ZQA[lBDV1[UbhnjFQUUD,A$" R_W"L!**Z7aDkOۊ㡮GlbFsTU|r7r CM]]}j(e=|^/uhO\}ЈNᠦ0 1G%~֭DDD899uvkkk݆"hBi6t !..# Vx#qNNF6V ƆHd2ckim%""mTd@Q Gobv_1+;=缋 =_CCC#qiHbc@#pTp;! ;vK˺ ~ܾcv{%l_hMMM-/.Cu8uFDfcWP*dvH`vjb!22pL&3^6{C\p'R!76p8566WLf *:NZmaae].7FcNϜmiid]ZcniɄ:TMLcOj2Oxv"<<<[Y& FjRQYI&؀ɞգ;!55,NCC#bxCQQ( /&S6 N\k kjr$$1;wm׬qm ?yINN"--׿̑Ǚꃍ.cC# ETlٷstݬZ:tH}+@呇="iDFFȁEDFFƉ%_D+w|Jj>Q\¦yW0r0r:wd=v~ҭk>x.cjcu:xd6ݮ8457sbs%..6( Wol>`0PS[DŽqc(#G!nמĭLe_2ֻ2uX[WGEe#&&\j&\~6Gf)x?A ѣkp]{! ~ ܳ}'X!*ws+oV[2_.[H!@!-[)+WOeڔꡃ֛ȶ;Y~#3~{モ: ֛IKKa쵣:mK6 LǬL/`ԈaLrY3$'qS؛GkK+j/f@l۾BsX-YJǬLtҊjDqYꯥ'hB[w5ٛOÉ!.pvKל:d3j0^fs VGp);fѣ[WF<B"S;M5u8Drr";nݦQ›$ 8ȤT*(e@\]=1m P ɰuB!Dt^*T*cL^ZoHJH$9p]|>$eD" d2mv5Ӛ8a9EMT"Hex>n&2Sx$ JȈz6 L܂VUmX5P!OJr"ƳİrZ>;nR u:ztƦ-y(rwBǬL dlv|}{dpJ1#rt)(P(D9`_*rH$AMlw: BC$!p:H$R~ v )s @P*H(=n iEPH =nr9ry8.JEYdٌ!,LL&C*xp8Oˋi 9|>M}>4 rt]n7. iRhHR >BԌH$"44\X,noC$"xj 0i ԫXT* ֛ ܧP(|nusINM@@/#\ОIll(ɤ k\aDCB ):S(pO@ ]y 4kbq0ڨslR)ҳCb -ɐ/۩H$D/ƙexf}\w:ɓ!mwx!!<;`qBd$C/ E. 8 iNC@@@@@p4! 8 iNC@@@@@p4! 8 iNC@@@@@p4! 8 iNC@@@@@pi?Z/ ' _O:=T(¸q 233h~vMTU…Vxp:]E\BT*|~S( Xedw R%<, &g'~kyE n Q\~?[vA]٨HJ^V .i\n<+xx=~?. /Xů#o S)|gH$QC&'lN￸\Z-Yb}a].rr!Ʉz:25;عkU5LR٫=r N0~KO`r^;EyEO\.g3z$b.w|qWPּer4I?;-/s-8oL>!|0yB% F>_v8,f%-- 46 GyE%-DG'?G'$D6*eN6Vf ^/U$%%bZF"!#N7nS,Z--[Z7ȑǙ8: Ykd:~1z] +%et?h}?4ҿ_.6lW]ccǎpq>;RADx8%'jR)?444 !oNi8:"#7oȑcbtdev`ŷyʍ]RIXJI}=|>K:wDhD̬'kG!#k7ğ?%$$}㋿澻F]]=I_#uF#˖KY,j9s'_/V I >zxJ)T EpW|?Po޺:gwd47Xza*_! E& qdkC}PTulٺ LSpE6M[+FEeMM8tfHkGslaL8ZM&6lJVKFá#466w~}]a$)~K#i4.Bjl۱~0iXFRIFz*7LOǬoK$v47OpMfbc 4!..ٺu;F cqt@AA~=j870Lz^>=olX8`(brD1!!*<x<|>_`>ݻ5oFH$"L!=-RIld2Y١3'a3>͆a ۇT(d2S!K Ueu萎FzNF[v1=v^j#$DEYD,Žv͊UTJqx<^^op̎磩xVJe`O;/JEɌdnAoS $<^P6*orNc\ի};"-[c0/Yb]r݉cNjy)+8/@dD^zH$r"5%\48*jILLdY9I,]HL&ssaSb\TJB|: “SfJ9钓^c,r }=zͨHKy x_C}guTmciHJL9q g]T*r;qY 'ԩAT]Ywha8ko_n˲@9;qXx^vGbGZmHTJ!}YcA""鐞M:lnr= B%\а(vIͧM9ƐAd2F+KWNqV QGgyzB\y•H4j"Ϝklaڔ/pqm$weD|ndP,i9ߖlg; ۍbY D"tJ˪xC1eՂE\ԡJN /D&u%$&$N'ɩ=BtGΡE9Nr!=XdllGw!+HHLAq9_K~jyƦ}>(@"`Zdա|~lv; PVVѱSٳq8qĉ_\h4wQ\\|ag׮]ܹ_4\ZZ*Ν{oc6L+jٳ/b4[^^+WZߋ rXd)xE,hq8Oq&2 ŁvJKK/QH$3&X,|GSO>y/xݱcǘ1cyyy޽?gFT2x&J8zhj˗y+jv>7޸Nxx9ίVhz命zvHUM-;wJD裏عs'GaرHWFk鄇SUUEΝq:;vS2vX+֮]cر\s5L8˙1c999[Y`x^>rrrx嗩GV#Jihhwߥ0OΪU8p~+k?㡥hyf/^gРAr-l_C*ÇJ|DDDp8ٳ'Ge˖\.G,3k,ZZZ={6>4}QVZŒ%KHHH{SŮ].8z7>}: @$rZ<3ףR9s&g͚5r^/>(sa֬YDFFOSSSç~gϞw}L:$ZZZصk?Yv-uuu0c bbb`<3DEE@y?>۶mrM71p@^z%jkkt(Jf͚<_+k֬ L&#%%C̙3)**bܹ뮻Xz5-"!!r>-[ƦM|L<޽{O ׯfQYYy7hkk#663g>$%%),,n+PPPG}Vv3c r9sfȑ#Q\\ܹs=z4 t|Ix """uoC!yWp:l6 @yy9oYi8q~DB.]x衇+>R T*Yk/f`0{һwo~p89r$㮻$//V,XW_}b0}t_db̚5 C^^/=>X,^{5 LoذìYg8Nyjfc۷/*s뭷CfJKKٵk/2]w555~R)ǎ#??qxPռ `xD8qIBB ɬ_ٳg3vX{18v/箻χX,nSWWGvvvZ\N~~>9s搛ŋq:z^z%K.lذшj%44{iӦ1sLlBss3Nn9sЧOyvJYYw}7<gv{>ƌkFAAdɒ%s=|}=kiق!ݔ^y, ̞=Ǐc4SN_Exijjd2_r=pBjjjp8̜9?_v#Fpw0c ,YB߾}3gnݻw)xg5jG_)))۷ۍZ_dС,]yѩS'?ʞ={x?>d-Ts0&&ݎc$''kg޼ytؑYfaXسgof^`֭LF8NmmE<#ii477`INNf޽,_^={\!IMM%44Himmb0lݺDaD^VE.c0L $hDVBfQ*$''o>)//믿 ;;ݻwөS'T*999ZMLL 555444cR)nR'!!!xHii)o?JB.;?Il_`0;FDx^t:6Пp~ȩt=Jl6c0d$%%qHOOGTjq\?YfJ߾}444k.d2 @"ARRY'i4f͚͛裏x<}Nhh(555׳qF$ FjJ"99|z=IIIT*BBBhkkwa̘1 2n^nG`Z1lڴ Dȑ#IMM{aҥ3{2M&C&GKKY'&&^`0Vjv ( ؿ?6 Lkk+ h, IDATZV+ x<`DL0Yfa6۷/!g|B\\\ L&, hZZ[[IIIA"Vq90̔WT>"b2o%:Z9 N#pγۃF"\Dxa߿ &0n8̙òe17WzaÆ!HHNNF*76ݳgOV\ɂ P* 4B|@uu5Gw,] gd2C\. PTTDii)?8eee\.x}PTT` ??X,KtСCٲe JJ{̛7STTtɡJEuu5Fb"##֭!C$$$P(hnnɓ$&&rF9l߾FɢEb+ͱc;nO_}݇ ]Ӑ<茿{|8֭cDDD0ydիWP&C :v t |ޔ%%%PIJJBP{ 7@JJ ;wmii)SN媫N7bt:Z[[Q(L<N>>>b1 `0v4iiii-W#ĐM7Dhh(z FAnn.R^o0VIJJB"W^  }d2&L8rvJBBbOeGD"meTc>Q\Bm]=| ؟4 Wg3sƟ~ Hz }?+"[Du7M_@c3/FO˂/N < ׋Xczi6.w_ix}^䊟'yl.4]qx{ _@yfg]2|>`5pWt1/8غmkmDQz첤G6ٝ2ֆItxy25NZm.j~:rvCFz*]rp fLri)ï̼/$9)#G3qX koM>HC$v{_xdoɮ]{y_ 22⢜ WgEJB4 OBVyve ȸ]JD,^J[5koms1چޚ1;3W:>wJiE#NDd-MKVz3,ƈ蘦GRwWlE&QQLtd(/FCtT6`wy!h ZfC,PFn%D)%Piz~GLV Vo-bBn'zg [ɪ&6x-fj-||7Ͻ؋[5#y!||7Q+Jr;]8;>yw00w@D~/#KǦǃu0aUrb#9~҈K;d~9cN. >Z;2.%":L% b^dϿȰ&ƫ'6&{ E۹ZzwNSh bѿ#uE,x>s蕓O6RZ44 =ztѵtClèÈ'-5YK$5\qE4ė1;:xoJ=ikk ntT}x~]8*yuLՃ0wn :D7ϷʇeB.Z>^-IDv=gI#9׻x4!YǬ"`wDV^& eᯯC) Z>Z]÷]MTH}{{1r@' Byu^PtQn|>?}RR@p2iTwo8`ƬH6<3Haux̙ WNWZ%Fqejv/m_!V=Id泋(nfʵWB*k@$"%A DI6h9y趡||7ϾQG_YZvOՏ'iKI6DobŦ>a!(R~m9ى}c/wW!E:Dtj|l;[p5=l.Vm-bĀ;\ɁcՄȹmb.3H2D2륯i4YIOa(Rߋ_anicNБ5yye)>[p+o9R\60gfa*i]:3-g`/}:RȈӅSxAWe1MϝϷmR.ZLזsXҊ:1{uClL*{ l`޲]6'DqVNKjYz3T*EE' 2JEeUpb7E*"1bN_⩟78sncUl߱GT,E=y{\)pz8RRd\T"!\"-1oj$b1&[ٝH3^ چBՁ6">:vZ:જdn;BDX* [h4Yi:PȥRjuPYkWdr);ty8ZZ=9^RT\Nʉ2# * U7Q؊"=9)::eDR^LZt?ۜ``yоtZ % 8]2aDWZ9t[JVGfwI~?I(^w$1M&ˌN:-6^|-7!&>X{VOF5*bרh#B9Qfjsp{-6J+H-T՚H6D'TṷWQVء]FRYcpqx-tM 5v_ov5(CGV^݄D"F*V)hs8VMŁz$1o@trHنBF.N|~&&JJ0/dDʣ/F SQZрR!BFEjb4l"&JCCSGy֫I%x<# 23.'WiD"<[~8z>/(#)~yĕrK7J*ˤXlj8V͵Cs7 GщbFv')>J_TɄݸ_z; NŪ-E2J*4 S+):Qkv,q ŧ_!9>/-InT_uWd=]e.<يʵCrҧ]{ BF.I5 ζ k^>XeB.0flf2fHg)&^)[1[ڸmR_n}c̖6m?Ha!4mg+Vn:^Mtd(vU9 U]?T=a|wdޝ(JbvKC"sdhn& c qU7!YG*/)zDgLuzΝ'5}$U7aj_tTJwCr P9:^Cie#rǪy\3(NLBxb#*'V*jNc7saszs]zWՒdQ䡺Sݮy|Wm*a3ﴲ]4zcBP] [ij@0D]ՍB*Z_ՀwA*vVa{VS^@dܞ?XGM}+} Ґ$u }z0o.ÁF ktdxeZ7t{Nbts [uq.3u<}${]v|x&_Tb$##-8f| ŸbKٴ㿽3ʫP*K\=q v慷W|}y;+W`T1xQRZ|jP{GoD4˩ IlVG1#׽˲{Yh 'O}[?ZPJwYpɶخe <Ғc C,[E`i`KIpYp6ʫ^O9y0}ܸ;Iiyw/HD}O--;e#8{Z^@I 7w8w# =ێQ~/.vp>f}4Nhyt|RBwغ >MrE. )Bu,uj7%eǹؿ. JJJ),yftZbx˒|b wx< O0x~7JNJ~.!'N;8,8!fl6a:ŀIJp"\ k_$vrn!@}44Mš+,|2jϗee3 |RSR>ǟ}(L2Zڨc|~,[΄K.f=,+2xx qw) -߀Ա> M|xya&_>7ߚO]}/V(ox AZZo@ Ȝҿ__22xl_mmn>]9>}e{k>ӯg3#\ Z'fRt:6+&%%@ ȶZ̔&L&#Ccٰm \Lrl>f"8-a'?`/?K#3#H$r̘F{J @ &  7f(ׇ̌t)déo %%h MӐd6`Y /?l6bX2}Án#))FE\fr1t㵼Bt:̾0x k֮qc]ؓf1 FS.'v-!!1ƙ]17]-HDz9H ۻ`/2G`_M IDAT$Qr+ga4R&M[asΔ![nL pMohv^CUcBC Nٙlڼ t^PP'@ |ǹ(.ODUrȲ(@ |4m@ۦmnLyH!49pCןCaێ]Bh>rDNn]F @ Hs g˭i c^QPa S@'˸⑤çeI-tF"j,˱jNEmȐeI%}pZ3f0h$ lFUGpߒe BHH$$S<,u,|cnjb_~&M%dg7V 3)4j B}(BfFQi;HCA @Kk+))ddf3a2~qu-׮wnN*ͣ>4eK .΅l>jmڲ\6Q)_NGӡi\6;p3 jjHKM!>΅iWyGikWSS˔'^UU-fJD7TO[ZZp:x^t:zEr:imkd2E"CcXI;f:tR IN1ļJ$yu vMh>ij햎^GHIJn}~?MMߊyJBBPɌgچlB`Ǯl޼ѣFc|z.ӯBQ.4Ψy -W_7vMC 罟"aUEuh%55fF3 455bw >xuV]Occ_vilba㆙3H4D0 ¨J lܴ%˖E&^=]؋{ĄSN_iS*ᰊzRb0Xm47L[Ks<c6u'`IffvO}iF?)͊fdj::at8Nv#9vJJbE݉ |446r6ۿ'87 5 UԢ(Q'MԄu-mtw r9)^O^~>.IE"x}>ыotݎ,bU5tJ0\8ҕr봟hiL]H6MSCCmKRiʒ$1r$ip=Gh|ҁ |Z+yAr2VW_IZZ*  C TL(: I}ܵN~]FKJL``"$Y&9)>{Jf}6MMͼ]O@ޅBjrݵjjjhiit_qKsK+WLįOS:Ȕɗ1bP^yuSƎ7|aȐb&O(z@ 8U7n@crC$ "*LPo4 NT 67{KJc1rE!74uNt8^c3!ӮJ޽,X!( M <^Ozz j!5%@ @m]=_. EQճMAVfF{hY3d<7l@e%z~}q;@IZAJJ2,iniFɂ0r0dI_~ʝBJr)I' 3BsK+G zÎ5`AZ/ر E/tعkwLNАe[PYYe;{ą^f"v;Cdr[ngMa2yQv#c\@8WýiO~~.U:2֤ѷOo4-BZZ u:֬Y٬lٺ;vӱbvv&u|KF[U$I.ņlj iPZgAm0:]4ZZZ**N*-C?}?PWׇjH;"zeU5r7  `8YY`Yqҿ/&%%~}{r9ihlRGA~^hEƐEQ>BaZZ[ILH }:#= ]{\IbZt٥$%%RGCHLvvYYȒc"G=HOOt@zz$2˥Jss # PM-,Gc: 3? `jl iRUȐWu濡FFӺ˽^u d NBxB|zX,fR3ܜ38&!4@p x^|x5k΋Byw*+Nk^+lظwGx<~#<\"Y-[Q_~3%K-_2VO>=sM /Բ}γZֵ6l96OKKO3b*y5VϿXޒRna&@z$I"99 >IQUUINJCU#Ձh虈Fchjj&11Fz=Vf⩯ob4IMI& چG($'%j:</V%Pp{F$e䤨_vp" '^|>?u$$cXhks؄($''Hp8LCCc4$Q[SK(&!>Ղ燐nPl󜪪l޲ 5WOCaYA<,˄a8\.'mmnBJ\ =i܌j%!!׋f5zO3h (nr:illt騫oj1aY)ھcoI --{0|a444M @| wMhiiF\&\.ŌAP(h{AIID"1 1b¥c2iniA Gt4hmmJ$&֞q2444bw11G_ЈDo 111L4x8vTU%PQYA'))1گzĵחi%ܩ؄ד(sp8m;زuq$%%v{hninkࣾYHMM!&!!V,Ix>|>&)6շsvF>WN^=iljwa/-_ϗr+H H1na&&MM̈́BAzF gx'?D<9?E~dLbB"|#~O4=_#2~=$/>N~n^r1_OVC55L41ƍMI>1jٲu;$%8TSKCC#6nᰳ`"2Xêʇ>nS_3[**Q8fx]Y׋$Ixõ<;_8v, ^rp/Xz N`0ȏx6 X-QAA(d55-)eoI)-^Bbbmmm_ABB=x%LF[rWx>~ X%w"/7}ey'?jo`s̠gΠ5axo"Rc۶X-oIEeY?<Dd ꃼ뤦$sӯ1u$ xvt԰t p=?'rsIMMa<_Ӻ?孷ߣԔ***Ɏiu׬+sbx=mwdge|mܴޒRfx;H]HH}wst`Xpx<~DJR2 c[79pM[Rث'/:YTVVq 3йϿ,x>SԯO<wv3&̘{{>#t_7^w->h?y9  TUUiF#C X|qqqb?W4&St&V={yxYzmLm4L0>} X~?|NvI1TJB^^.+VFWhnie5gx< _,z٣[fe.aۛÆ2q ף Lr9F N~x,YO{ 22v3׮gK]؋>{~&!ֆ?`C!t:q KN0YGC.x~}гG>%%ڽ%{vƴ.=ĠAׯC;[TUd2rՕSb屁U4</^dcG_mDbBMt6oF^n:I/eKѾl6˥\!vEy˶#5;;Lz9] $Q<^={pe"}ͭq0wгgQQQyXj5fe͌}K ?@\Y@~}QϾbٸzڕp5 _Ě5Xz-C oޱ%O/mBl%~[4X}}[~,--.qcF4PHVf _]w܊|\wtnF&\r1z} 樗{K:y:4oȂ??áC5t:)M^^6M_Ko PM`ǎ]Sbܸ15~&z3?>[kCSثH0h`nu._࣏?gr7c6(--Cq˹)I18w#3= Ǎ$44-:aᰣSth@8" "I|m>|(9b:.jj 1%457jt(ͷ3t` ׬W7evf^31FlVY1aIKhԩF8 X".*A DUU¡zE`ccMcZ50o5K_Ȍn(Jtǟ,fds H(l&b֍rƞ n!I:`{UUEtm.eYv=FnI^^N̫jEeeN# i@Eѡ( ^t0,wi@ @$! t(zwy}h'#yl6p9̸*RUa2p 61/`TW 6t0f^b1r9uu8NjA$M[زmWXe шhDhlr1ƙ8:yEٳ`0Ŀ_| Ff(:m(t(Njﺆ(:jAo@ (:`MC(N  Fna&y|'lݶ#VNiWN!;+K:EG0@YW$ 68nu=PYYEfF:-by1#i7t2$ې$ IQ#j'dPyg羀bpMr1I0cG_vk4`݆ _g< *a'''9O%!>p{= ())yWChim >t驼>|~3NE]9= x9.g_ĐYLSs3^B!<s3_'}h42r0_G4U'3iWNgfr IJJdy}޽AYcWxshmkcMgšC5[!ٳ]@uAVZ]{hiia5Wyn dЮ$''2/2)]x7xgBJetrF_0}rJt:S\5,7Wl6qi|\NNw ܘMfac}D\sU|g8z=iW>ly/Tz6s <ܿ-ƛ,b=III:b2q/? IDAT%oF7 *nsjfchnir9~{W.AODӰZ,]vc@%:+ljjBu zfp8XzN3oO b1#/IYw_l{جUUq8DezGwi@ ǠP0`з݃Nk0޽{a402n7Nk@ l6a0b:`65G ACNYv_~$YGy.Qt 6ׇ`0_ӯJ^GP(ly|>F#$1L;ܺӹO]AnPUzj]Bh|^F^!V11PbhOH4D4tJ%nZuHD"جV @dciL&dYBUUL&SlU9xɓ'WN}K8GGwlx >0 ]7}n.;yvNMlS&+GOs!&]vIY~^?c,:qq.\]m#,ffa߄>V s2gz=YY]yX-tJn׵hvI.t:2Z: 3O۹>bڢewX kٺD|ert\Yc!Hbw;׫k4]b#Gk=w,_}M6=:ńW:vvu#]h-/y ]t$9ѲuG#އswmxcCGތFCqDP|&ucEQA뮯 0Kt٥G\7:rӷF]}1bsa@ BC gSZPU~|xM(5Wf`XD iD"nEKlq)_IEeuCOQ]}JB r, 7m%lxvK]7w:x? Z^ ΔЈD"lڼ3*Mf :#5#Hľ<; _Z4jng5cXn=u \9j뚎8V~+W_~*D IpR`( >!OHMI]`p֭Ļ-d]D"{])f2465EjeGBNN>۷uuuFn6ƏkVЯo.7v4| }>ey(ۿM_KJ< 4ihg]v_<ߋN㺙W󥌿h,vK,3nAnv?} 8;۩j4@+Wtp`uk%%8P/z Y~@bn9:~Hsi)$Dcd^e1˰H޽JmV+3@ @ !!4@ @ 蠹[afj;9)С># s"؍[MXb%?kמӒٰq3Q^~Oy VO~GPM ygBޘ-lذ%K'?B#G"/vp|dwu+Opko}}hƜO|< .[AEE%zYS[[uL>_ o'Wc<ܿzdG ܵW_Y7߄nӯ]{x>m*O=O2hllb#osC?*q.VZdq:ճn232XKnuVz\"6lBD0qx ̋/ʌW=T |7ha_!C x`oIsK I yͱz<^,]O|޽˸;D"1m~PX~#,3nh$YRf(_$ID݈#dQUCZj*ՊkwA ݺV͸\8t:~?*d4tOGSS37lBu= E@61x7&>>X~#st@Z8jXj `2sŗ^h2R_@Jr(:㱘;>u:Yz))$%%R?+V2b.yu2˾Çh2qEcyHOO#IOO }Djjkbaɲ/5ru,StLjJt2 ?X[Z-7rl62YIJJl2!2~Ub .SP@pNqR^n333tXV$I&11&\BrRAUU #9٤$'B$!9%EQ$^={ ٙ`)EBBQrrp9]defn'!>ȑ׷7i0fHz䑝IzzV4M#)1Ʉ`ZX,Lx)N =YY5$rD"$&$e6ƎEBB<Fa@~}$--ZΔh9!7##BFF)ǑnoȲN#'; Ӊd")) Ez*i~M[v0|`V^þW#?y0-3t77}n.;yvNmMzP,L q"6Q @ @ >*UU!6p+ 驘L3He())N WV Olv;Unwf2qd ༡{!';b{ rNGAHLL,@ h;5iUHDhwEhvLoؚik+gߺD@;OF$uRcc#. Y<%4^f*SLbg7ϚvdƩajjj&oov\ 5]8o("{_}uYnV})_ȁJnk֮`8PQeA,[f՚u@P>bhii=LjZx1V#vk֬aŊz>t:s1vXRRRشi>(wqvSYYIaa!e.Rj~c0bȐ!~|,XUUk3f seUUN'q㚧"ēR@~}1 |g'3v8v2xg1=z /3QRZb%_rWPga4x׹ێ9nEaSMK.aȑ׿`0[n'|M6_)..G ZRSSo~g}ƠA/~'|磲~裏l2v?<s^|EϲexGݻ7۶m;7th2Әytm6MM͸dYfEcb]Lj*#G CBFF_._IT<ĆM[(XD||f?Km]=7oeݺlܸ%7օ:vş'$Ib?UUy?Q>$99>}DPUU1OJJ {존gyYׯ$''r(**7o@ 8qSZ$Wp8l| %xhhEd$%%҂n_>oOʒe0Է̺H$wJ[[9Y\ Rhiin7Ol޼, _d2QSSCBB&L`…D"dYfӦMG1bĈXp!eee1n8K)(( п̙ç~Ν; NDse˟{^s^GQn^rلKZ,dgG=_Okk( Uռ{B!ƍi+o T/ٳg !1c}8wLz!RSSy$I >.Bz% @pJƹH$r-˲L%17"_^&4233cڋ@ |ݻvv ǬYI aCyyhU ?$''ѫW!w+ɉlٶ  p8Ј*(;,9r}GK;[55w`6y7ZA nxL)t>446qB7oCםҲ2kqss!!>LqI) \TGqqF^I,DGF؁&Juu gΞC*#1gvAQS^Qhܮ4o(/BݵDGQWWGDmmQf- 7!prrȱ**B*"H/{աlJJxi7`ڐHr&ngM˧V~f,&/Nv紴֚0[ii1)pZ,]NGTVU_+X,/:׹y]5aqV A׳}.77W|}鑘F鳔WTpHq1s0{a4D&?HgN9KɄ6cFq.]DQsȻ28 FyE%ƍf9y NETrp} H8y4唔fp4kl6)IaDD1iA7=eZinn!O WnDEE%i&!HbҕJ^^A'?<=M_RA?B{[k .o- 9'햶.?u>)I;;;immE^Ank]kjj?y}Zw.quuGGWBADAn랒H=IJO!fY Jj%409{C%64[[yh4 Bے};#hlvk}w F?/qAn2Ec ¯;hTWWjժZѣ̜9kw%.))ܹsDUUUSWW\ΧUYYIeeefrvUTTpΜ9ٳg\t3gPUUeb8>wU^^Nee%94,Í\tՓ̬V+˗/bǶW_} ` Yڸxc/:fQRRBkkU?tYYY?%nر>Jii)&ɱLuSO}?TVVRUUuUFRLccϚ}zŊWw}|SYRRg}w8tƍ)3,[y*k޼y,X6͛+BNN[l'x|E,lڴ:V\ɩS#5582221cTUUϲ|rJ%/{'O@hh(ݺu\JIJJ`gtq7oROر+W뉍`ڵ dff_\]])..#>>ޱ#HHIIbĉ|GՋӧjaРAw}̙3{,))a(yihhϏW_}ӧOs3|ƌ3O>$o?1ٳ'oRرcoM&Gaѿ ? /T*9<}SNCơCXf 34Nh3fIzz:x{{3}tƏ+YYY$&&ė_~I\\/fȐ!HRGZ+|}}iiigϢۜ"##imm-[ƤI>|8:4 2aÆ\.G.Ō3lfz9u餦ݥfYt)VK.O>>|nj1 DST2|6mĦMaΝ Ç`ttt\L___***ضmoz&O̅ #<<Bټy37nח;vgqQ.\HBBԩScÆ r{1ùpB;<#h45kR1vXV"55/Ë/Ȁ8<3f̠ɓ'/Fkk+ӦM# O>PPP\\ܥ5h?gԩ߿҂'ӦM7|'''~i|ӧ bɬX￟P-[FJJ >>>,Z|͋y^^+Vү_?-[ /@[[*gȑ#lذʔ)Skٺu+۷oGP0~x<==ٲec._YfqFKܘ9s&Ge˖-d2{19s&>>>O` EEE9QF?7x$֮]Krr2K.eٸ0w\(((`֬Y4443i$<믿^裏Xp!L>,^u6oLUU zj6mڄfb0o޼.5'O2k,JJJxwy7IOOg޽}ݤϣV B.cf͈#J899w^QÆ c͚50dZ[ &poθq())!55&/_Nqq1sjA~~>Z3fP]]ͼyhiiW^jvM dժUttŽ;8~x.*QTfhv;.\pt$$$Yf˙3gf?O nbىJJܹs6mSLaܹ :QF^^^|gL~~>ǏgС.ѣG֭EEE_9s駟2vXN@^D"ߟ -,Rܹs;w.NB&]UfZZlذ3qqq|TUU1c jjjsNT*̑#Gr9{9֬Yd^cٲel޼Ǐ3vXZձ{.]pF\]]$99۷ӳgO V0`=zp~SRRΝ; F"PPPLII o6 ͛ӧvٳgOFd2+o֭[ ::Gye ގRd԰pB/^̖-[t۷`2331b ,`|ڿh$99B.]JZZR)mmmv.]ʜ9s]X,ZQQQL&rssyyͥ;wҭ[7JJJرc?P(0|x뭷X`Xqp RI\\ٳgZs9.]L,1x{{Hyy9aaa H0Lb0d2Q\\L@@nnn$$$pa9|0ngȐ!һwoǏ+erz=~~~8P( 2ѷЀ`Zqrrbɒ%dddg1gFe=iii̘1 bccΦ{:.ǎcܸqPRRBtt4&Mb̙466P(2e =zpӓӧh⧧ӣGJJJسg.]"((cV6msk.+Ç'88FSNpp0gΜf5~b rss2e =z @LL ZJu8ʷԥ( FŮ]X,Fjjj].RRIPP=aaa}먠K>>899J[[ۯkLJ4_~$&&ESSZ壣Yv-( ɲuVHLL$!!t233ٷoRPP ?/~^x2ZyVqss;vI@@V/A:CHKKfQ[[KQQ&L7`ܸq( ,"G{{'L&%vq4i2 Lvv5ƕcsJ^^'NtX\7nHSSNbڴi>|u!(++R:ujFze˖1zhJ%F}^U$J۷/w裂///./ ""@֭[ǁضm ={Cu9ľ[hDK/ Dff&(s֭ 8*v(}ddd0tP2dYYYӷo_RRRtOyzz"JYz5۶m㷿-'N ..X, Օӻwo呐@~xg͍rss̤..]v ZMjjj@B={8.#GݝUVONNN}?bF7 /{ۛ ^|EV\Fa,Y8*^nl6I]]Ɩp*++ihh`ԩxzzի Ch^ Wn줳www1L׏yV%<<{{Lhh(j7b2͍SNqL&WUo%3|:;;FEe5Fk oNģC&$$gggZ-aaaHR<== q4ϝ;/ݺuCB@ҳgO"##9rmmmtޝ$qqqaҤIxyy_Mbb"111OVV---hRe*J<== BTtT*`6oL||>NGhh( GK#<<ZT*Fiiuu.:Ϲ{ٳg=z1cFBBH$.^Ȅ YTT:qHHNNNZP ruuh4x]ASVVFCCSLq,g4t鈊";;d Dgg'&0-^JE@@Fe* cz`0н{wPTL<(3))(S&9тJ%ݛPUUő#Gpsscxxx`0|///$ h4jjj 55???t$$$Gyy9z|}}9y$~~~sNƎKpp0:Ǖ: َߡNj]X߸q# ŋT*HNNf$&&R\\Luu51+k^G 0T? 6 DBϞ=̙3t: #hIttcleĈDGGVgϞ!JիϟkVe2^^^8p:P* 6 ???\\\!''fbccIJJɓ899#9x l6&O-G4"*-Z%[5D/k.p/Mz=7o?dF0c -Zye~v.{[F]SPsNsLFtt4C A.SO]uGKHHVD"##sݔ*7*!!#G:'<==9s ٳQT 4a___Z<#$`fWRs)\&%(eV;_o]=˴¾ln_S߼O\gο"_CDᗹPк:U[rhc)p ip6C=A_D/RHX( ! fAl6s\!N񛌚U?k̙sd+ /4l6 lPV6_dbim62qAnAeU5( D^,t5mmm40'4h[tte557]L|hOx6jnCٷ YG~ MMO#f:DŸI7صw?;rOB``ONB`?qq!s4Jc4 7Gк!(zVz?T*'t478775SQY/v_~OWW|}}85uuuP((rVܵZ\\4w\BN@?E/QSSKuM --fR)gBG_/t\2 Mu7MSSZ-XmV!"< \(HZ~(/`/=GxGR;_/=|BPFnxV ZB$<<&|a!KLL{ (}SSػ QMάofr,kF7B ㆲJH$RZZ̨jF= NGcS374-0wQWWG}}#FnIv䴑J$D܂Ҏoo/t:_|}Q99KxXJ`@1ё74ԍNDJroBˋZ4 t~899aQxB_r{- TJ\l q1]߽{4WF<<1$ j3i]skvŘ(\]]pu<$8 2Fsau}KdDa]]]tO VԍG'{]uKS#A_qАJ.\& J20:;,wFho 470AX8W@td4:;;#%5nAl/Rr+ ! ! ! ! ! ! "h "h "h !n9- :Vk)rOT*<9orPjm5Ѩa_~_ֆ ­uqI~chll ?:hs<D8A;1ё&h zz C=% ! ! ! ! ! g[n444bu$lF!Xpl6'Arz$X "$8HEAAi "h "h "h "h "h bpjooTG[K%kpssCY6.|g$Rz?<=DRQYEaa!!w5Q[k"**555drI#yss GAC;OCC#q50_aھZ˓;b2ACۚD*#|NIdٰcAC;n):;;j/9iI}}^^]#~lKG S]=2Ǭ#cr6"hp|?XnhiaGRUUBDL()-QVl6|goCIi!JDBpP RySc\J%t"hp4~ZN旇hkf"ٸy+o"(UUռBCC>tO*ufc$1l GQZZNTd8 GKU`4}IZHIMjJwfpY"#qpfb +];7:y4q( $ =8WXHgG';3v>\ʱlWSS3E/'%Owjá#=v*yrdΝ/|}Cb#?31]{3@}]so]ipg4~J:Luuj@ڀ~աlR{#~RpmP(8;Ẻ|;ÇpFv;1QxHiy9OH@!psSR]]Hw~K&4AܛрZM[\*.!87]ZJH6oA$l6awt0477%D5:cHgtvv!NAn+UU8;pV~BKÝ|Mqq ѳGvw!DGEryo.m(2x؄B:prHu'2Z\B?9.+D:(^Q6zxQ>5#555)"A#> #^`a 90! QF/UH2 5- MA- LA, )# ,%?5$QD. r IDAT$%/()"AAA ^^^aaa\\\,,,k[?}kI6.UH1zS<3$ \1*zS)#& 1*W[uG<(*#`P6|hGA6%oK mZL3WH1*$Xs~~~TTTDDD222}}}aC n*$OC.Vok[>\t^O7 i m=3#[M4 ayo-&M@,[u^P6b{;2!91!4, 000MMMQQQ%%%%%%$$$>>>###jjj 5Dc$GU`t3,tOxR        YYY---www-/1G=*0*UH1dT;3,H=)LA,D9(tbB -'NB,]O5jY=+$3,CCC!!!!!!AAA ### Ϊ OC. pD:(mfW;L@,A8&  F<(vNB,]N5>5#x?k IDATCCCCCC---(((7],D'" ݼ5#666 *KmI,A_~)%ƵOp$PȔ IDAT544   '&$! 5u IDATY}-,+ /., '&$ #"!  ca]IHE[YVYWT((&^\Y}_]ZYWTTSOTRN('&-,*^\Y310 0/.<;9A@=431553gfb""!fca&%$==:WVRdc`YXTec`-,+FEBcb]10.TSO20/!  "! 10. PNL%%" ('%;96'&%('%531.-+`]Yjgc&%#/.,874))'210*)(&%# m!h IDAT885 .-,PNL $#"EDAB@=! /., OOK TSP   CB?1/.'&$%$"><;"!!)(' <;8,*' cb^yvq  $#! ,**#! ! mkg][W+*)+*(  )(' .-+#"!653;97 q IDAT)(&866;:7.g| IDATi IDATY}mq IDATutr[YW553              ""      //,<:8 OMK        RPM "!   utr<;8#"!;:8*)' !!&%$&%$321JHE 430#"!=<:""!!  864#"!31020/<:8 ,,*//-y{ ##! 653 531 886~ *)'653 ,+*&&%0/.y|++)#"!('%=<9pnj330JIFVTQ $$#B@>GFCTRPYVT#"!HGD..,@?=MKI;;9 '&$532JIFHGD331CC@NMJ976TRP431663WURNLI\[WIGEA@>.-+DDA321FEB CA?[YV>=:*)(RPM653WVRCB@"#!%%#!!00.[ZV][W?><XVS764IHEJHE&%$XVSQPM<:8NLJ'&%DDA/.-&'%"!!EDA NLI'&%ZXUGFC&$#$#"JIFFDB320GFC,,*A?=@><YWS774TRO,+)HFDFEC#"!DCA))'((&EDBGEC%%#$$#<:8GEBJHFEDA!!00.DCA"! 21/DBAPMK)'&#"!! "! NLI&&$ ##" KJF HGD)'&00- EDBJIG $#",+* 0/- ))'POL ?=;WVRLJH220(&&)('"! !!$$"#"! +*)$"!?=; ++)20/ JIF('&763 JHF #"!JHF('&HGD652 &$#.-+utr:96))'((&LKH +*($#"@?<%$#LJG./,320)(&'&$ <;8,+*'&% **'%$#   JIF'&%B@>('%CC? <;9"!  20. MKH  %$#%$#21/)(')('MKH! 220BA> !IGDKJHKKG  32/ DC@ $$"32/''%   =<9  ''%32/'&% )('"! *)(&%#6@ IDAT **( 875+*) #"!A?= DC@ ('&'&% LJGJHE ! >=;    '&%DC@#"!<:821/ECA  ##!A@=   +)';:8,*'xuq :86VTQ+*)HFC20/''%WURnkgmjf><:,*'><:! %%#653ϻ IDAT.-," KIG<:8)('<:8SQN"" gfbUTP\ZW!IHEXWS@?<//,875-+*db^xvqec_.-,geaQOLIGE10.'%%@?<nkh763kie--+JIGZYUhfdPNKIGEnmhPNKUTPXWS &%$OLIa_[22/'&% fd`hfbmjgB@>gdalie %&$A?=^]Y ^]Z%$#  `^[ XWT POM==:"! ..+ 0/-&$# ((%ECAYWT utr&&#-,*%%#MKH,+* ""!"!!"! ((&((%'&%%$"<;9))'#! >>;RQN )('@?=320A@= JHF )(&B@>864SQN##!,*'_^YJHF%%#~{vB& IDAT><:\ZVPOL! 653Y}E), IDATS IDATi IDATn IDAT +*(Y}  #"   *('20."!LKG QOLFDADC@ A?=$$".e IDAT QOLyvr ge`@><  heayvr754qnj XUROMJ#" "" [YU fc_""!RPL rpkdb^)'&`_[310)'& .-,~zv]`gKJFSQM /.-  ECA:96{yt441nkf][W:97#"!LJH420**'EC@OMJXVS][W*)'_\X652QPM431 \YV#"!NLI 441eb`**(\ZV-,*olg.,+\ZV #""khd!![YV  " [YV MLI *('utrGFC@?<431MKH$#""!   -,+""  ,+) &%#"! "! ! ""  YWT DB@.-+  21.&%$'(&NMJ!  IDAT,*'+*( &$!}zv ('&><:tqm     320HJM "$)*.q2b IDAT  !...***&&&,,,######  %%%...(((...***""" :::"""      |||  DB?NNN___&&&---)))***UUUeeeeeeaaa ///444uuu:::&&&TTTRRR]]]555:::QQQ^^^PPPKKK!!!666lllaaa !!!NNN```wwweeeEEE---GGGMMMbbb444222CCC666fffwwwtttlll666===777RRR@@@777333GGG,,,TTTMMM"""BBBiii!!!UUU333@@@RRR,,,bbbMMM ;;;((( ___fffTTT:::'''dddPPPYYY fffVVV111&&& 555...bbb eee^^^###nnnBBB===nnn``` CCC=== ddd@@@&&&JJJ...^^^CCCNNN>>>KKK555^^^===fff444UUUKKKmmm:::999===rrr666HHHlll@@@KKK!!!999lll444@@@222>>>///@@@hhh555sss)))dddooo yyy 666lll???888000lll 666"""[[[AAA111IIIKKK555SSSeee<<<ddd///hhh...666bbbeeeCCC000OOOLLL111VVVwwwFFF111lll^^^/// 000xxxKKKMMM&&&TTTWWW ___  555&&&hhh WWWiiinnnVVV 999TTTVVVwww TTTIIIwwwnnn\\\HHH666hhhJJJ  ttt''' >>>qqquuuq IDATDDDCCC AAA """555AAAhhhOOO###TTT :::(((VVVRRR)))YYY FFF000***+++999$$$>>>:::<<< lll^^^DDD???###TTTFFF HHH<<< %%% OOO999''' MMM )))cccTTTUUUZZZ JJJccc444 ```,*'20-%$##" '(( "$>>>>>> zzz)*.GGGKKK777NNNhhh 555<<< ooo('&><:Y}EDAGGI===;;;aaa kkk888GGG444444\\\nnn ***333 YYY ,*' "'^_a ('&><:[>+QQQlB)#!S?000ppp IDAT ~^v dddkkkjjjxxx~~~___ttt {U}kJpNZM5QF0 rOveF)#+%"{U hY>X|UOD0NC. UI2xSgX=XL4~y763888$$$GGG,,,---<<<FFF'''uuu @@@222999999 MMMIII"""***??? 3,rbD LA- +%#RG1("6/!J?,>5%SG1,% 91"B9' 80!?6% PE0 PE/SF0KA- 91"6. PE0TH2 -'E<)$>4%rcD*$ LA-l]@3,eW< >5%?6%6. ,%=5$!LA-sbD ljeBA>AAA 444lllNNN<<<HHH...@@@GGG```000777TTTVVVg}kJ.(raC("=4$ 2*% 0*C:( TH1dW<*$B:(TH2I?+l]@p`B2+% qN% 90!4-k]?C:( +%H>*n^A Wo`BTH2[O6>6%+%ueFWK3m^AWK4rbC("<3#n^AC9(5. C9' [M6E<)k\@875764"""&&&000 ///vvv###"""(((%%%fff:::444:::%%%"""!!!###$$$+++ |U cV;cV;!sbDm^A eU;`R9 PE0]P7;3# nKrbDeW<YM5/(fW="@7&3,4, J@,& VI2veF`S9 MB.('%{~CB?FFFbbb ...aaarrr (((###AAA&&&fff+++888''' dU;RG1?6% ZL5 Q IDAT  bT: NC.)#ZN5 2+UI3NC.'  E<(dV;,&YL4$fW=.'n]A \O6 QE0OD//(-&  QF1J@+,*'*)&B@>21/"#&n[6###>>>  sss   /5?X  $    SG1|  aS9"&              ziH     lB)&%$$"!++) ,+))(&+*(><:~|w}BBB !!!:::    MB-  <3#UTQQOL'&$"! .* 6*##1%POLPNK "!RJ>oi"b pniLJG /.-(&% !""QJ IDATjgd985QOK=;9jgcca]=;9=;9ߗS IDAT)(&Y} #" Q IDAT! :96CB@ POLwz-,*XVS 642*(&^\X_]Y ca]GEBMKHCA>gd`fc`+*(-,*$#"    VTQ,+)"! 1 IDAT%$":96++)%$"'&$ BA>MLH87521/DB??QOLTROYVS.-+.-+B@=B@=gea 9\ IDAT)(&    + IDATifb<;8  #"!<=?'()omi?>;pmi A><&$"  " %#! YWS/.,XVSUSPY}ruz     spl}fc`+)(_]Ynkg)(&YWT lqv bfkPMKafl5A?<   J IDAT'&%31/gd`NLI+**10.<;8NMIRPN OLI@><75321/HFC;97;97GEC   ?=;BA?=<9=<9  )**,#"  { IDAT  *)& USP *)(,+*  <;9  GED+*' ''%  tsn'&%653-,+ " mpv][V,+*..,&%$FFCWURtw|UTP KKG@>=ec`WUQ542YWT431 QPL#"!vto::7VUQ  MKI$: IDAT  #&$)+  !!KJIEC@975GFC+*)HGD)('MKIBB?USP%$#--,fd`jid0/.?>;10/!!JIFvto%%#!94 0/-""!  ;;8%$#HFD  #"!21/&%$ONJ11/b`\)('XWS #"!/-,>=:*))'utr  LLH NNK  ++($"!432754..,"" .-+ B@>('%##!><: 21/:97##" 5>  ,*'0/-CB?a^Z!! =G>"/'-0/-><:BA?+*(+*( 9Q IDAT !" 3$,-+,  Y}+]@X IDAT('&A?=CB@*)' VURTSOBB? SRO))'PNLJHF430 QOL?=;a_[)(&GFC%$$YWT;:8'&%ed`][X996775a_[ZXU##!EDA][Wdb^ 764hfb JHF +*(QPL 985 ><:HGDJHFDC@=<9996 %%#./ IDAT,*'0/-mkg 0/-><:ONJ +*)=;KIFUTQ))'><:%$#?>;!!;:7('&210543IHE--*..,+*(YWTdb^--+\ZWTRPRPM885IGD]\YVTQMKI}876_]Y#$" $#"`^[**(     #"!542  ,*'0/-  0/-><:. IDAT ./1))* IDATutr%%&*** !!!  --->>>::: ))) FFF999555==='''000''' ###333^^^"""... +++$$$ *** 444::: !!!IIIooo^^^444JJJQQQ 222222jjjyyy uuuHHHDDDDDDaaa### 000///,,,)))@@@""" !!!777555 999... 666"""%%% 777mmmyyy777$$$hhh666\\\qqqHHH---FFF>>>aaa666NNN>>>]]]222/// XXX 555 QQQyyy///WWWSSS~~~333FFF Y}GGGLLLZZZIIICCC(((''' DDDLLLGGG^^^~~~)))gggDDDXXX XXX333 %%%~~~~~~\\\LLL222LLL???KKKPPP???!!!QQQDDD[[[ZZZ~~~ FFFTTT~~~ &&&***UUUEEE888~~~mmmuuu ///777000888EEEEEE uuuUUUCCC ;;;TTT (((UUU ---;;;GGGDDD~~~qqq IDAT<<< ...:::---333333444UUUUUU<<<vvvQQQ!!!###JJJJJJ bbbutr%%& >>>&&&YYYKKK(((,,, @@@MMM+++ $$$UUU))) ,,,<<<&&&---:::!!!DDD %%%???%%%222 (((,,,666333...777,,,<<< !!!???222:::000//////>>> 666 MMMHHHFFF<<< '''ccc888555[[[ 222MMM ,*'"! IIK[[[444 kkk 0/-><: ,,,,,,#"!yf IDATkifJJGGEB@><431)('/.,.-+><:;:8"! 320 qtx&%$"" GFD.-+875LJH#"!*)(B@>CA?,/ IDAT fea} //-,+*(&%$#" LJG&%$ ##!   >=:320"! /., ,*'0/- /.,0/-><:    11/& IDAT    =>? Y}vvv~~~'D IDAT///TTT...'''oooQQQ>>>gggVVVPPP---SSSYYYvvv"""!!!KKKyyy\\\!!!]]]WWWFFF ;;;LLL<<<XXX&&&vvvzzz^^^%%%RRR((( ///fff000JJJ```)))UUU777```"""222###888!!!IIIggg&&&&&&lll'''xxxWWWmmm~~~GGG!!!aaa222  lllYYYsssXXXaaa @@@OOOZZZ~~~FFF>>>FFFbbb888[[[TTTyyyIIIsssyyy```OOO???]]]ccc~~~qqqIII ^^^'''ccc###,,,fff@@@+++RRR'''BBBoooVVV000 ddd~~~999999666999111NNN555 FFFtttiii(((III!!! (((OOO"""ooo$$$""" +++^^^ ZZZBBByyyfff 000qqq^^^ttt ***utr%%&>>> 777555444333UUUMMM WWW 555222NNN111"""ggg"""...OOO """,,,+++"""ddd ```333NNN222LLL...&&& UUUMMM)))222"""---BBB,,, EEE'''???  \\\###ccc^^^ @@@---...... aaaTTT,1 IDAT lllBBBMMM;;;###```???333000)))***LLLWWW111gggMMMhhhXXX ...... ggg999999mmmooo ''''''::::::,*'"! IIK0/-><: ! #! $$"$$" ,+) IDAT IDAT '&$ Y}:: IDAT ((%#"! .-+^ IDAT442  )(&DCBeb` JIFOMJpnjtqm**) DCA"!!>>;*)'753;:7'&$"!  IHE0/,#"  F IDAT10. -+*$#"><9##!$#"TQOGECIHD0'&$?+*)((&,,*,*(    &$"   $$" ##!/.,##!  $#" ,*) &' IDAT &%#5GIDAT;-I@ r$IENDB`stopmotion-0.8.0/manual/screenshots/differentiation.png000066400000000000000000003246241234321124500234370ustar00rootroot00000000000000PNG  IHDR>] pHYs   IDATxiWu.|znRkly'tZߏ]tK C=}Tާ[kֻRD al!A |; Aς$HB r`t+'uZB]F㣣Ғ^SbC6[Gnff^׷Z Zm[t??=Я} ^Q#=K#LONOVWͥ̏y$HpqOuu߿Ze~5#Pe|x׼M=_f;W~_t\Ԩo\b^T ҙu׿ O{m#Z_wۧ>NGE6ޱd>~,ô=W쮔+]r##[رmǾ $8Nڟ{˵+;LP>ꞎ3 oeڧ'&ˍ_:ܻ+mMc-%OyTon=?sM^p Xnwz]~e?& {ۯ= m[|I@׊˗ͷQ3Om%&HS(2|dz:6td6\;{##_K#?4}JZ~jՑ[7o|\ЕqhGM G=6lr\QeR'l a16tÃjtim N{r?ٗ I%HMM >z\wݵ矿4O:22 Ͽo?[e2w!뿺-=n'Zmr7>JO}3zo~W$HpqO5H|cNh4D2j9]iՒgMUUcL*5o9wj "N $x"L  L A( Pճݓ $8D~ZʗwwTL"#"@ksJDP &ܷP P(T[w-{qVvg# ^B:::M+'/DPUQ%@Ua"bTCY55 (B<"̪U AHUZqo"L6 %g<Dtg# ^f\sӆJ&x:0"gykA"+5 q3M "bQ%"UqDۈ! )TULbAD |>SX+aM3 ׄgT$x$<@D<6Г՚ Y{*/23^@U `PR @(3Â@@1@RS1^[[I~P b2 *EJO\A QcV""RЊw U#OUT&"U@D=r%省˟ O=7_yǮ;Tڰ}땯 2 Pа?^1of7ȑ#G;Sh54SQR " HP":c'V+G,(dŐ33,l0ɬ)|7Zd%rC=sD`R(yw"V΢"RH6p~@b%T<-tsщ@ۏ+366{XUk~:67[~T _Ñc̩lWϒޞ_CNvӨHָucp(`xRUirW;O ٙCť}st[JƷ7uS5Es^F$D9HqR(UU#ӸW U%X\l¤ yiE##OsϽW|vC,r\~ַFGGOYd=7cGM|l(*eK#C8V̀(0^ٱ5"JJ0H /H5mTڻ8<vu\(.UBU)H C mz@fXួ{>ogmj{tw_`E;uu՛0K.m䤗NIZ[hl=|J UaD"0b|IP<hHD*|< "w<76=^CjvCy|Xёx(fs|@ '0 *c.0S '4AQ$PShooMLMncO>wMo~u{;,U]?/<ЃVG|lؠMe<9.V @>j}Gy޲M[M0rÜbwueP3IU)ޫ+ֺ0NCs}G6vr'AOK/miLC$ R-OG}K!fvS؇N͈T$ _ ;85AEL477,h8>Z9mЇ zdl#u緾_ $_goxc>?WD+ggˤfj#^Gg#NwCZ&&۾ͱa! B]LKafb8O*b6(ZR5 7rvJw Z͊/:RHdq S4hiіCن) IY1!Z.F"&+rQQU::w{"`q=U,_}tw_H"1,2Ύj>۶m8+?V\r҅[N},2wy=E(U˙-pեtt`\%y txsb9[z˶{5kWwt}_w_x鍛Lom *6g.Y sLVlt幐t_ o5p8k,޼_3/yk_bM=.o~{^~Q=|׼麯~Mo~k~{lRxʸN`p/.X/t紐VD%RW%xaazJ! J.%կ DLֿ  #1[ P rT+DA d-m]A=GШ!4: (B`^̨ TU7)_ؔMsb5J-?q_z_Ա#mz3ƀx[<~ˠp>c*VȮݸșK.ۚk#%vU"'Da"7+U-Q:@O *PBI]ȕBɹ 8(aҝ?v%frPJA *y ~EA #ݩyGOi? bz6 RR%Xt.O;J|.NVCD֟\")'YZQVm$aZ#TjoJh?(4ȿ{&(v,NW`]8Pzi4A4:txɊuAmn2KKsBD5V3x 0(HHpqPM7;'"6Kb(HSu(h@BPTZ7iRL:"Z# B[pի۴iM`4߉P81ȊXL.3pP\SPF IQVDb*D @PNO͉Ț^|UP З?M0=O5ZkJZIJw`8kV`g؞Zr=|_ov=\vKx`QQS3ӓ#m颜*ϧ"%)BFFQcQ XZ+!*YBM'"m6`U35YQ2U3=591v-UnveKV,嵬AAPMO A,AŊg|$6aGf+4OA 3,:N?Γ+_6Q,LUO$3j膾UtFߺ3 ^wyݟ͛y%|+WqN.}ސ+'(v!W)F)/r텖yt,TU.a%\qpI#UBEzQT?jȐ`j$֐䫆pmuϡl1bҦɶ-[4S(]R/]T%2TXʇJT:KK{4CvP@:dҗ`q~t6L<}pS±Z,626NezژH_;ao%ԶL̈EAPx_u啗~+_{'n޼{~7VTF +"VlBUdr[/;WU>LB$JVDC B0Ƌk_ɻy 9 "&+mo6httK$IgZT boǖK t=ZQXAKē?4TQgͨDa_J={tNk?:bu.~)񽴟k_vX"֜MUxDqFo~-eWa{*cs!ۑq156O 2b4`Ut8 M^)VC̢ 3VӥrGLZZ/RM$,*N۞"0;ލ}{,tyء kwTP),-wDvpl(,+S%{>z>w~ lgi-_CD4ygXLMOS9aVph`rug\q&j)@)@C]8a/~)i#RdL+;i%:ǿ=U疯rdL\{M4 >ٿq˚{p +޸q0 en>W?u%uQ׮ * @?8]rb ]rmgDzS3~eO>6WL[nYkF7fH` hV&"5 3m6g_K͖Tgt'T6k)tp_塻qLУC&mҹtFt8NLM-l:SnS3eyf"=r)<=/Sgof;;1'aÆs/ٹ7syMVt|*r7w!Ϝw=33L52L}3_,5Ƹ: K%X\6O"oȃ|c➱0aw:o ZWݿvբ ^:jU?zoϦ41Ҷ|Mi6hD}.y; IDATA[1m\<腗43,a?~h|]Xg57^|ᅽ~׽3*5ۏ>~T3[C5kosaXWbb"2=>߿Fdc7|#`m6Ǝ{>gcںV߱^x[ݰ6_Rʗѽ}z]V;)Vf{z'ƏuȆ- ,&N;.A]}_|G'?cjluvrev. w\"-QxC+^è=rսł˫xSP ֝.Ji=o]?gG{{:MM-_;xM>wGvkf<E#/- t1l9L3&|Ui@0\U+咲MbCφ>{R֮:'Ƿn[}`dcm6ex=GGlWmwZE} tg %4`qqBkd(:>} շmX[*W ٴ}qO`LFR/ O2WuaP'4>73WU>˅رa; =fҩ杻}J<{@ܔދAʍ}2$8:x%۷[#x>dt:Y?%KSF-og!FuK4l4N ^*%cbxGU'st<'&bҩ0dD3srraBƭGrQ1H~L`dxʞ2lSa&䲩|/Ogw#+kKWo]&Jg5 *ttOM#b07ZD ì8!gVpvfXh.vLo9 #Wb,Ev R[(]sl2ϻlaV?ord(Wgr\[VDQ휗NϖǃƜX6jl1a¤ Cfa]8zKg<19P@lըD lY 0ht;i˴dƁ}ڊ~Uj}g0L@D_?Nf$ɜI8]reP vn;E*! 8̈OPjݝÇuڴiCQeꑵaC/GZ|Q;dsAC TE$믙n"֨J|o>>ҩ0jTB4Ff].رãJugGWn^|!U&b "0Y JAmv._HUJƎELJ}5^x[ o?)&_T=/iCwƟm7yMWR$bV]%_J% &(ljDPeB"+B"bvU=F06r3]sWlG#+ߐ#i0U QNji|v|HEy6wu h%ۆoz^fV,`.;^JFJ ffyf|dhHP ac6lXx'm*Wxqz 8t =ZDAM)k#a$F(Z73aTƺ Ϩ*4 ( _q`  RH`|;9vɇlTΰ1A8Ec'~֫U+UQumD p&k{+OO {/62W֦S$VPHh%QҙfT:ODac|U:ı'F]$b(6hw3LC||t+Sr6JWgJi|z6CQSݗ`q<A# RdȺ\.!&T("v F*V"*ы{Wa}/$6f e3fl6Wl]Z[ "ޘ^uR''fszuf436$ s%k_9Y=әTQ"UgKnRDnCҔIqJAGڷlè/1>2t[쫲tKǖmF0>V*OUJRivf&Tb[G\-UxI{2"q;RbR'xVnL8]ڴFma&xܒy# ΋P(()E6#㽈g_w'j@ 6)@*꽐tAQS=XA~.t/]o Yl\&^XhP+_s%Xը+,JNk)-:k&bcX%ҖFZQ(!4 03Z]mo-=ד$"6m )B"28RGTeڻgs~FهE\1M`AXr\ ;kEy*!$jsh !aay{fg&S ̗կ| ЇO|]ڤ/M2ڿ__ZG"OJkZ: F#h;LS|ڷW:mw6mx{S LX*S~PHRDH3A0IOlݺO>;m^~7,)7xMO<INiSQT BZAj 3\{{lw0 [^ov*O]v%/5mm&I5)f͛O⩄<r\*[d2kZ. F[[I _Rg`U]lI[x*]I{ Qb:|xZ,9㎯v ^PUKSS.A/XŬ~Z066QTX(FG'hjjVkc֊ e$F# QUjSS%"FΖJglnܸkZ58榧FFƬ ǟ\9ln隫D67y:͕Je՜vd䙛r??]s33'57$jnn41`&_a (D%.DHD XE{GUV'|&AaU{Q3>+e6̬2Jv5dܵFDD̞{VXthk0IȊkxs#ox*Vl0 Fd#c(Ozނ۩ã?~k?o_z@p?/勯~[?S_#Wğso{;'~鳇G'o{˛|znXw5X;D&{0VZ[q9o=E@a(^7#0{O>wsx/'>\899999G?soo#bso~+<#c ~-٦ w7HK~8iX/{?Z3O[d-v"#YHn>ӨmXχ 0iXg{d2"⹾EJXzC-^x3ɐt`=xveâį:`Q r#Gl`DǤ?'#w[.'س('k׮וּ~SG?¹s>Ogwս6'N{G0U/t[N)EhA ω;̜ DHQ&h *Z=/G@= B7k%P@5Y51衢'8f]J2O9pJDh"H &):3A` YPVEFzim-61|mW涀"K0v-Svbe}q1vtKRchG3I N;s!ډ^דg-t ֮GFtwuG8)f0$-6VB˱I|!;;(XRPtCϛ޿oh'$ 䭓w]=o}pp~~[n8<ϛy"10s2c uG$ůJ,yU$r󎩕`9lF>[,xcHo%[qk{Iaʥz-(.(}^{/I@t]bqvف@.Lgz$ huN@9@UOaehG$YGg6@U=2Iw{Iư%RAmŌqpDÿ=GDio5]ySϿs7^'̯}+~xWUP]$ϟЇ>7N^hFۍ y c'S-q~p5r'%"J}^ D&8C?vegv"එƄf5 Ȩs`Ye׆=/מAϢ Yڬ_6>!=F7UV2#G{PZ$oK+2#naqL?_ q!IGɂD]MmD"ZΰtDkNht }lۣOoo+냽.OO|c{#%www[X%:niq;v"Zwl- RJ8;d=>lvpNjk+ N܎isy|Wiއ[ObCq3y 1^ݾn9=g}ݷpY "Y4L My-b-&aꐅ웻6y;w9-AL´GN߹wB fVEˠsԾ@/i.c63b+%BҰs쑿buHbQ[܈; gO>?K'7V|7ǧGGoy]lF3$sb~ ǿ\? TE9/>;0mނ1 ciBƟ`gc_E 56 (m ĝµ"x@7+:jCB &kpf\G&K6 =(p fԀ:'+ R`"(J ZMl HTőI pEp`\J-rk/ͳ)IUr6BY¥HriVFmЗ0f:,cxɪ |߉La0%?2zk0|?=4 gD{I@42ȷ[2Y3I Yԉ<)SW\~^o|◟8c~ϭ/K w& G?O?rus7# ٓ|1=Ph~DD ;Η0͗=ÓK3sYIݶٝ?޽ICWZͪELEuC"~;J:@naAV$-,nQyBI|7[C2ڹZZ*=4[!)~EdD;ioW'Đ lG9b*dW!6n5@n2b;%PA6l^$3tKgLڢ,uy@rV6YL, HdEĶIʓH ۙ[~q޼Iԓ}^yҫWU6'^gpmwAmݝ3DjɧxSYJh=\rYMPhK,NJ*`jR<"ᢚ /r{.8Ipd{dHwt!y{qq ;wG2-\)#jK t?"6m)[=Z긤C;BVR4=;f db oy{y@ [[2K=|]{#^y`om}G߆xKSn3꓾YkY}?_]ֱ^d4kXF:$fkL}kk4r@C5UJ#f[MKT5zRX8DTDKH̸"ѝ Dp(pT3oQD Ҹ M|cFe%خpcECTbbE!C=&J WssD یd,J ?v֍//e= ,!fzE̛ v]ެ4򪪖ƬerHE~_P㏾z ܟ>p||UjfgcUٽ;^/\aD rԋ81 ɯ f=Gqm/=&/Ν9Z@(g4.u+=p~gz}:ox5g/2%*Z 0֝bt_Sc[ꌴ#ؼPO 9Lx`9롶SL|OA)ϟ[x7Տ _ x!!1tiYfRP'pQ@OO]lq.ZVTqyazmw:de=%jj]d*RDGprR>$mYFVor߮ jfIL~gbлAZdtfbt@I[t[sѫ=Bd_>6 , R٦Ȼ'\ cĒCߒEz@yBiK' -^^JS{8mw#jlA⼒Ml*UK T83&BX9v[vI ourze9(X)qt-C-\ѽKlYw5S9O˴@ L"EKs&Rdq.hQҬ-63n,2`<Z9~j`BKϓ<6kV͜꫐z{-K Ϊ,M/UUU:v=l(K[B.ȞX\aĶһ*Nbd#+)E& =2YEִưDly/xWm;99|M)?+y@X|[*鴺 |#pA K~ymKpGxj,@:Z+Z[>p{;j*WP\,. jfΆV|ZJ $xF-i;@ꢹ'bcz"+ϩŒE(Eڕ0?z &7 "D5L^R "F3.w8Y֡ٵ].Cnb XJ17爐RqqwYh^݆VD;cX$XuDjJDl*V6b\4M6 JX1ApIQ-y/]t?O?2/Y2)<ޔA퇪ՍuJ0j \Ҍ$ʃi_:zAZؐnrf;wZOd+4[BWP;}}.Ys-lV"TqZYon,(VDxÆȨMF5*6E !\2IZ @۬p'Z̲_44CW'"!@ 4rάVn{o[JAw"͆ r69uy lຠ1ª[&)D')%=D[eJEn*ZZ3u8[#[&T5jEe Hd b4 [,#<:\$X$ ^:s_lu7%dȤ#a+(" 8FpF5BpiNAkLel[iu"gvKLNٮ;u) Md2A63 P7ph"+][{)色vc+Y٧@J%1^Ne wIU)xdIOo c xƫp=P#!m15*X$"Kf|}#49]LoÇjvқ (06~Z4\. 8bK.#rMy}{σ{_{۷|#l7~˻Νg4ۙr߳?{~o?x__G_7'>55~w1NձW7ʡJn flŏp`ޘA" Le5"%Al%#x-y^ܦ`hF4`%[)ڝ$pݣoYhBI)>=dOG8EDGćazx IDATƸRl{6b~˩&-:.3NS +rx:F>~gtq*{y(F m-[ب9J½i@=<'WZ>K07 s9jY/t@4aе1趒21[Yh{-? =iwuxgtg}-_? _ݿ/}o}3O>>xr~{x…K_LQ&@@V-NN$=<:B$(-xpZ-1Cdw'gQluXwX>_2Hw0:K{gtbw+pS]8K~1?oI#"e v2Pl3BNpX5$*fld/؝1ݐ3{pL֒Ј'8جaem. mF ëTrޟvZ1:zh :5QD`>@q_c#uc!C_˗Qrg{7>GON?KY؏|^U;ƍ _/%À]r{ҥ??t(7o?3?'''j}{ꩧgt_r/~?Kɿ~2dGd HH DB5XrSp+$ֵs&p pAP(0Nz+y`50cҘJ"X"#tіOFkhdbJ;mdh%6՜mSsHuO}ѧ|f}2$jZfOtfPi,L&>.K&2923}H)Egh"XjrEiɋtsѻ8F~iZb1If) h2<7&<xP,ER< u@[N!dęu]r;[~ӏ_ybZ_>}+hh~iخ^>m|w|g._s_?~ׯ]zg]^]:}gvt͢n&)Z}P%ymF$ OU`az0It`h55ӄsk,a{ZhTijrAK*$4D"`RC"H<>D@4Ϊ dqFKa9Ht$cgM@˶)q4mKBDlԀ6B}v NG'dRnI[k #Ȳ:CQ{ \Cy40g[xXxzӊje: MeOhχ_!Yծ(<zW=7<:9ۛ*e! 'h&fBr Ȝ@-*G@Bh`7TP̖-tWd>4ьY XT+aĤ{XDSzquS-k=F1)Ĩ aZz^Wlo;l..DǞʷ6Dj&[@&c$qYߊIdk` %1࡜TPQM^-"sAvߣeF Y!$x}ZQJdX.GWJ;/ j6EZ ?E-~ABZH2ge*Ee2<7e%(!!U7p3@kY F/_2KhFxVm6")EbWMΛRdGr`9TUU2 _ t3_O9Z3^$=Ġb-Nrʘ9qԨK4OnbPhì!PŘͬFhd6rK"y],=YE5$lQ;7/}۷͛G쏽V];]$ȏ|۷}>;7_vի'zyrꞛA0@"Za ,"sƝi)-X-R9*PEP%Jj+!e`EA)k0uFfB Fiu E)=TՅ7O6$$ĝz +9MDOjb02&^A=G`/ᷛAj #,머{sZvmɻE$co9Oe7'o} L %>)2\j|hVZ%&e$5:h=: G1NFG@e(s+8Pqg%ezֺX$" !Ci^.Q4D/YQ4JZdΝ#_)kx O{@…?ߛeD>mq3cC?CS'xX?T?. .]¥vg(tڰWP2)od ~A]9!!ᾭWlG\pJx~8QE\MTRAB,xtlZV(!GGQG U  ӊs&C&Fcdƣ0GG:H 7sthX; "alMHl-g\>ːMO1CC@i  ,^f1uP=nM*~iYŻ p-|S|7W'3F@>.ɡj^(f8= 8, {T)Pl0iYxKs!JӘdFԀ2|N)F`V PA&>y͘hypfV BV}|}XxH nw,;qPr%tL A d~M7HWsmBfysE4r^ǘ,m'mUqX *, =v;&R$cFh/8Uw߶%} x'gO"-Gl|jpOAQҠ'g>?wWW#yو`BR SM9o[/Nu0%k2@ܦ۞X@6Ǹ͓s&xrPE$]MµYK,!6oXLDg%X aE bkyH!̲VE8hRTC^%fRVNUf]]Փc;:|A.s=Yc*R3NcMaiR}vfݛ l(`=70c։@[9)SxU5½+Ŋe 6;7cE}Y3ΊOM=0 &˽3m 7x Dq+{N9ɱ{:y^a S6ۉcp-{VfqH9e QR8Z]'7nJp0nfņ"VZe!+jU߸%9וNڟ:W9Žn Ϻ/J*8QuQZelLSY QE-f#"fܦw1 АKdV`I19ɶJwZ vjl#sǡA1صJ`~7Ac+1MEr"c"-_GD%Θ ^PdDD)J{2's:M|v\)vjùC&KZ/G'w*U}8٠wy?x??pyPNNN?oݺurr|zz/~Kꋕ)zuaU&i>z4 ˜O\cRBh̵߳wLs=ӲZmjXoP#yhQD%KAp| $O'u\r#S+WV* /pxjpR/\, _x:`U^fTL:oT)oVFW<>zf#*Had@&sg4nXdG )-EUy |.S@vjRN l\$s64-y KפEvk3B ŝgv#y H8 0̖{訞gj" @W64k #cV PZ5omekc{ܮ1/!O|mXۙ|?z} @G_2ec};^?ŀXd*_gjʼIr|V7{lq}rNDm%\WOܬ\+n]I+F brN`,Zdܸ..Oufl.NnLJvP(4^xv>9}!tn{zEȫ׽=)޸z54\|~tn|zJ鱳ZǸaF7QI^*W.xomR'OZ|5Mu8VƑ({IC *ʘ(w˅KXEFKbdDG}ft1<{ oczlBeB'AD@whARs KNKA70@7ˬ{ѢfY`*>YG4*Zk53eQ-@a\ޝwuRPV5Hc0`۸,s˻e}N *&,|5E V{Tie>qlueZ0V`b{Cɭj5A"vnֆqwcA٪Q2C*fA8x]e4l'd^tAX B5hnS\Vv|yxpCƥq}3rvlts6W B3 ܸPγ&-0 gڧelvd91!`(-p&lKM]3.ݧiDL$@6šbjS'Tnjq,m-##H:{QC( uYaf<3 A$1,U(e\ i[SVsc/_`϶WzgS_ptttflYvs{sn˗}:\.Y%0pd $ !>@ 2 dFL`WUT;|M{#b9+bǹ^W6D2;v4+b5civss;i"IsbyaPv.*ajel-'J8 n^m>:~A*"4GٕBaiv"`dEdV7EhݮͱPH4Wi  tOI Flfwmzg}毼ˋr7WDzJ~yhYκF)b =Pnؤ{x:X&j4ElbOj⒬˃gPDǡ +J:as8|[˶NyI7+)YRokr4o/<3:y˔JٲmS:CLJQ*RiuƆMݴ֧)7 2d]f W_oꫯ|3ZK)̂*G< Dj Χ gha>_.8s( ۸~:=xJl`6T;b_I BmBZ^G'],nU45DB&QAAs5}*Ѧ6h)npS2$V$:H"{0G hhѫ84$UJB*ؔ=WVJYtcb Z/h5^gzqrM(g4n- #܌FBT_&eq,-10Y5Bh`%yy=VPk=i6O~-z IDATօRa, j-U J)Ƅ?X5cKAs$3_N7fgG/|s_[ƊpqvǯG[26Yⰳ)zPVtqBq Fh3D3Q` U;s-yLwU@bFP,^vq4 Cȧ0@;g7@ (XmK4Fݡ팓ಲ|w7q3La6A& *">Oa-WbpɌ.@n^:ݗ> #gJ:ZͲǓ:~ m(ήtBf3ttպB5pm4fktEנQb[K*S猷TBg{}Q";4!bIK} C4ZB[: N"P@߲b[ff.R5,!ky%cD/[Cg>~;1? ~ R 'y5K;SO1ų}XjX#,]>O08LcL*2\d 8MS Hfw}AI ;. :$Iٽ!z}Z B(B4SӳoJx Β Pzs*.>Ӯ8k%0KR~`d.zʨm|G$4JDpw9 Ӏ^ga ;ia~P䪲N@Mh Z*!ٚ (k 2dRĎ fn=RLH>XqY-d?\`|мUY)Se#'BڝUa':yӑt]̔ bٯlY3zv6rE}BSK3o,&Q1YLtqiᚫV&[G@@zSEuX c&]*sk fEXjLG=ùzS%Kh›Q׎uꦃF 2(NzQ)&*FH2 cW`&@TB0ΰQPrY`*<`˲SkwXGa Ė?;lbK@ț&obM-b ˒ >-mm0ϖb {n|:݃?W_MtUG6'F@@ {ya +dbMf6*Ødy#<#R-:ԮH3šp%Jʆ(PY{e "ZѠ: Ub{lgT:H"KWFԠ8`HDښ}#EOTnNT:IҔ؅$s%wTX73+U o2,bM-xED5QM"QS9m*Pv4٤ð_ gM7.LG)!{Ly-dS9 Q So»A-S :cKݚѭŐTץZ<ZlrE*Nh\()gęҸl9?x7vM6};mBەOmV* QsixxӇ/v8C}\PƼ(͑^8˧ӺJH jR@'pzYo(͋mv9CbYh!:EkRYq]lvSb˥77/Ta/ pWvmQUq_y g@w;bwxv Vi^߸3yvlEy]orI*0֬OL$lXzAR)Z\k/Vt |βnJV":k)ӹR-z^?{c_￟bO<q y) Bleqqv1]vtqӔ&loPeAwGL!/ "TZ,,P!2D!B5M#߬rL6Q0Q ӛ5>o(MGv/~?:Z-w0BEH5]A"4G@|rK1Zb;bm $H527@mET ˆrpMF1զ&P|TRBٕR5$3z,OAS !`*J1̠*yRuOL|%\ͳ./yi6̪Ymئ,ٷw3iDU_,pJ`y!;E؛K$БN&6j!砩Tri2SN"ejv*k܇ß_pAū//ſZ{+<> St:gv;utam ;TxT>/2DPg^H?[.~o|]c(N9=|GG[s lwqzӛ81Zҭ̧i1<|oM}?vċ|hq,d5+:\o/#S.$QqM7/.ͷ[yxYJCw}ok |f~=f;< xs+n`e:`k7’oqs>^J@_zOi#^}ꓯWO߿bs0 =;LY=|Y`K!:Tw4q5RJ)=J 02axC a`)DT0r Q|Ŧe넻6xpgc[.d*Tъʎ NL‡O>_:L  KÞD1J+5˫.(uQN@}%g*OG4 XX$!`5X"WڙP G_Y_z8_oCɓ[o骽jo~x|0Nћ8M/?kB'E'b2Կ Q4ye4eږ"*{5oN܏Ǜ7t׺&%fRFW`佛g&S FWHud!+Ra7:S9 AV,96G4sV "R\L ru6&T\gv/>QbGL*$yv~m|[kW7/<gN/{+_믿[oƺCnWP '&ѫ(;K;;0`@GkP|"@fQ)*8W)_o%e[xϾdOCHDKlweEKmY'ϞutGz++CS#_!]d@@m$ P s kXKϲ҃Y*) _O-4iÓ)0xd?VV3j@ KےMp+$a'_?yP - TX -?oٳO,Z,.ZY52[TK13o.5.含6Y~g9:`FfJ$=Š%jUsXYf=8䮎>vB\kkv6ϻl)9߆wd__/~. 8~ڪn> pKyOjnS9N vfI K%,r2Xz#͹_&H— wGҡHKὼ&,b@ #pQ7KRs.ɖ޿}."u-d6'H N@W>PJ5U"H!c}lG}pY>ܲ"$@ @eN.V\(x2fOG#0hn1{ABМܜ/4M43f[cҮ ! /#MCU+fV\aåߗ{KZk]Jj* f$%w.{C~_OgϮ_}_nkk//{X-NQ(5-C(V l$3AA0EW]_D’?% IFv`б`,e 8 )60:h@%E/W@x,]OXdO[o7YpP&NH3ἏRﺹC<{Vd^q~iba Y z$g].sd%T5e1[YH$JX>7H%< ¹z ! PtVֹͫ%T2J40{$UOKe^|ݛ˱X`!vZ=cK5j>Cu1HֺwltGOjVJksvJlRv`v*1T !y(fX4G)(ө\Y-eUH &5dEf6ϭݛaG:D#R%A aa-[-ipV! [UcN4G5n IDAT N%;0 o3H 5l&~7>%7~;cwaqK)k?{/}鷽ǂO "C,% pX'.ξ ,λ5l>%}~rv(V`xp98d6Uh8~>u^q0$,e=bA ׏KbaYBt%4|EFߞ#{_,wLmy]B^R+5£VJ젧߾K$M%c͏z?E% $$ 4\@KFw!1L$S/V+0"?*e@p'.gu3-ǟx_#r/H~q>>݈77&D^Q&'76gx~7"鍑!){3^/~R"kb\ܴS^م77Z]oryW٦˷׼ %0Vޭlz^~G_ $in$ҬůnG֚$==l [|p-]+,s+&Q zCRʣ+ŬL-L;WSm"[,,q}[s znگcx}#y.[di@{֙Nts}3BI͛U2I=B^e[#(#RP9{q)]&SZ黳(l>X,<{|9r=xϧxn?\9[ل:͎͑7mKtˏ*et Xl/|(~<$}p7iH3_+ 0 },{I$ң)MKhMeu1IC]BsFyݴEXut$R7!K5~peJ@!D)Q..3? odsYQ.27W8pom ک>3G&tPi[D/Ak͌-^ 7Oh J՟؝{Izpf澛cm6;ys7Š}{o@ ]DZv4kYNUR^Voc_y{gtTT2s8P:a&{GeЬ]6sO -ϋ`}ߥۣǟOgo.Ag-)ۻjDd5eeXYؼd}6OH\wPMUq*B0١߶dt0WfK;G-7LW2Ӷ$-{֔+fکkyYXeE{xݍԫM X] /V/,=X$e$%E3zXtW=hX1Ln{/\+XJ!w~JkDt&w+&)읱wEJ=zC% &uw:OM|D-Z'Jb5= iw3[y?Z`DOQfaV"· 2E`abo4.6> ] Ul bzB[NAesظy/ 7tů?27KBwaV"xh%C̺ЋH*b d[|~gē Ҩ5+<ײ`yv)@̐j u$7W+|KPzɡŒI~-F-v;x*qylHS):sy eeo[RT J S9T]^o=%Z*~Y l-ֽiOHwh)+ ghÃO3jȂU!4ܑTj!3'J," br Ĥ̺`|-@fSV/.S t3/9$DCuȗs bG5X eQPxW#>|TL-h.m'-\'qMC%;RZh Ƴ~ܶr6O~smp4H+Ry6m7}F9 صy%Ԃ)47IݐRٱ[T8'CBXh,M2If,JW1콸9za@ |7@pfjaVLmT1'0 pYoB'׮r<-OoݑKMI3>X{ܧLmxL+`fjz0s ZSrP_2${+s`fٺvy2 /dtN7# Qsk]ͧ㜾1 ;cf+HdϬ\xx@s~pwY1wZB=Je!wji3X ̪1`8+[q ]o>YL h!%Y6})aaaeo+C2yRvR!r^%)a-_Vb(,|Nf(~.//t}}248=]MrTY(REZ> ̲ȢG8D\Z-=f㦐w¨{os# ubZ>><>=l0ͪd0~ϮA6 ~|ޓo|HeZV:j17-sq6@&:XZdZ^\n2V{ GwuV_fn&tY'uEJ^ׅ Lp\/|PS=Sm?i!vZ> 48ӄH4[4<|vuspDpǯ=l_ޤnBx% *+ j焍WCls #?DCkrOlŠ!E-׷Lux`ϞF40s|pp# c Će͢yQ^1hf6|#xo|]5wF;ͳ.@e6A"l  :,V PKnd4-oj~2Q,w⾵syon徸/N.n׽uƪP -zur˂lm ;YcUyvʬ <#-h2Jya'R45o ~;Xvegf4|1NǀoSvƘm<3t:-3\ ^6λispQHP<8;lp7DgD“ń"Z,Al&IOsgIT0ijB٠9$ MaG mSNVœQ&[]ȑp0}[w_~rs{_ykrq''% +wDD, BM9[tg*zMh ,&i㲹g\,蒧Ao 5(I- e_%vmiT(X p9N*J~_ݾsXvO~l4사U.xǓbIdvu7t^I]ިb.uEvJoqL(C*k%1LA4Pꎕfjt3ZB5b BEU^p=VB0CvqBRAV䓉aV-|T̄k~P* P7L! m$1x|@zAַld Jj 0| |8FCaFȰlGD-KH(J&~w9{5F>j}}/ٔ rq~Y5jԨi `wS"bfݼWmiN'XKG޽#ru a?buCÙ*O8 ,eb; =%N3T$2M.._Y}U ZaΘ6Niiz0jZ% -{E$ahpF¬"\ #X 6v];f.F;BJ;2s}Y(at ˉX"%b)%jflSDdΛ ">DQp2E%B{s.OD hDj PT-W%GBoB3EX;BtgXbXo{;E)ZFw_̜i̳4YNЦMdn\=G` #9 懫[$6vI=/^i8䢐]hر:Vw^=K cg<=Yleƴ2 dUWdDГCȌfnDTk5_f,&e}G ^uV*}jJ'eM4KB3<‚\?V1ˤ_FRX3JJEeu?s::z-iEJ;G3:$a '1} Y,,[ۿmiEM%@moF2 Qʽ8iyN$0|yͶݮ}rd@ n J,4."xvj jHtBq|a wܹ])zV0k:~xЍ4M壳{莓-ݠ,c 3B `ZP)H"z","-籹`&%'@ Pv5's/3MAFp4MU1׉VJ'^JsX,Xg gjŠ%s1̡4e)d;@hv['-U{Kݧ|=heĒb$7B#3 Q $Q=DVrpD-!jV2wD! `kmh`O ռܨ\( 4ftH,rK,5tv ={~o0U8ͽ4y`E=2;T-2p5/fgpvWG #7#_,C CpNCx" ]4T\8Ef->!HUZA^\&VYdrfg.#"h򆞣({)MI KAcزJ*D+0:3қь BU]4iӦLCi 92AhTcnZ+Ce=v sj?#1)ӡv]{px5c[thhRUT~XR<WV"2[WfT;G%>UWoYMJ"=R% 2p$(z+em}50M0` )ksJ9FZbhz8f4ʼn'X\nۅm];OǗV._qw>w=իWO.{nswW^{s_yk~[7_XRJ.}.ؠiA;ٛ TnKS'^ IDAT,H99fnļ;mLk !2/l_K/!"6#oGh2jbiZ-B:t.|-Upea`,i_1 M9-3nd;1]vB >GZvXrDuCTu%Egd@27ª(92ݩwws.`au2DSFI'4dv2fI*FӮЌDiԕQ.J8>ۍA<< Gz==;>cWOk[B onW^x3~g?Vi7R% ^[_fca I`sWA+;;TT DJ Kh;>fmugқC]lSf/+ iY]:~ys6gی;w0ϧ$WTxop-A77 `[iP Nkx|y4 C"lÓ &z-:Ur"   s`V)~*M5$‌43Ò֫W AZ$m^꛼z[,)An.[j#ĐK4*F\'}W1or6eIJ;tKŕ4dDW_twCzw8LVGNb6T1KM&[='ܯҿxswgMt.=ӌkiT^NXfX;*4HIܗqp})T+7_{= s>|s<6cS< !v0&Fit"Fnp R &V<h&l'S+N^x n[8[= Z bL)˓[ dªrt B.Rrkz^F~$m/$!-nL#/;HU0)\h.\J%^PQ#SL ffI6=[H7od'^C<#?veZ㡇]:jvyo _G?߽SĮoo1/MUa KK MBbu"o?ܸq)A$,JSs쑵ӽD*3)Yk֓+itefZj\e_*``ٳʊҗ΀Jqw~7Po~)9)Qs'쮲OD"5]ՒJ )Қgy9o#7gn\ y{Q Vz>;)F<U AQTV:ϩTcĆ"0/W1 $,F2";NK_yesUiTdd0?.{r8 x Զu4YhZrj.y# :AK P6b 8Y!ަR\&y9eoAA߃0@NVh'Y%%.U+ g4*-ܣݭp+&ktEtTh^~j|-A2-Bq Wڮ;xGqT KD|g?/~/ݩK;B9 LK+"AnS^y3gzЀRi mTX}]>\ ssUgp,I iG2JGXX}7۩PK4)%bZw3iBJu׍2$z@Mm6nm@̑sQbmM9_ #ܥT*$Ȓ3q4xk4SB`Ҩ^"F/9LҪ@K*M.Z6JP݂VY"n&%!Ü|0YroܝL/u=@o:PͪA"\n4׫k7>c<ХxKv3#"nD8V̰mnO|_}-vhD75ٶ^[7Ú,ׁYz/>g7YjYlsG对`NؐQpҤ"`7äjyR2كh{t8}N$VZjj޼"cg:D"KŰKLGٯv,|7 ys|Iּ{X\ 4As#8B ;"H}6vS]8<";͘9ۨfw tLAn֮sJ`456;J,;tuؔ t6KddNEBKTuY-9'쐼436 {k#A9SMs9cGMUJfnxχx4f]ԨӁ,[.PA)=]}&d&AI;9:ytN:1rU!De7d3wbS;x({jd%HLZ*Y8"%Ue3J'ˍl1Q* ЉjJDDTX2 vd2JCL+3"9!w܊GG喣du8h'TOn6fW.7vyOsoj,,}na*|K6VH66 Q+Z/PEq>1 n)%|e))zȎ4T$(24f&~cb23ts [x%X%c=Fi $W)=v3I{S$S(y"Ͻzpc!dgHk%QKm&Hֈ}(|kL33S=U;8AeNf@0)Mst"հWvlOϯ/?~;4i# B*@BG"~GͦMnrs8ٲT shQAX<~ϓ jh];`Vp69RN-E~mb_Q;SmNϱݞjSU,AYlʟ)L {k ;[BB$‚#.mH}1?nc{n=LqMYZqS$h2K6 =! bsaŎ*Uš{F5H,N@FPosы̊@,ۿ_?ĕk ߺs畛 $TŠv cfkw6hQOX]h>?7`3]SE!Hҍykw_QmSV#zp4p-ɾ^ c2;ϝ/|;A;x '\1@Z[*A5ч}j{nvkY啄+^KRywR~|nPW9U涪Dq7X[WyGA1. O^H E …KG+e** Vnn5Ri Clw[J4JJ)!h fA</yLTnafu4xY 8ߚ3UkIU\厸:ŒYxU w#=,\ ŬTFCp;+>s?C?GiХ۷Bx[7G=9Ddd52Bl>|}nv 9 Mm%֭<*8wNŁZqx B82vJ/=3ڭ6|_}i9 'hUlA1x:{/bBZQn$kV$$g gяe85o4Vog>ޱ`{Gd ֭KGW.]r˗/}7zǷzo}Kk/LVڵGp} 74^SͣJH:;ln41FG.wO/IdQGJx>* B0a dG^`|R,qqKM6&(60z`ՑmOgfC%WLыUß;R3Rn(:_m E0> 3 iW*;iعO!gM/;J- O.>CX?#@k+.FۘtKDFk2M.#,݌b*=*Oߘ'hG͑i89hGaF t^ܗp<Љ7."zv#2t̯̺1U ^bn%t!Pek)aE%7_k*+IX=U{O%2ĥPdW߸yᇮ=nlN&]40 He9fmEi DSR>+|FlVS@D,*JEB AE Cy=|u֓zwy"Ij l/?ݵBd(G6M$Yg I %GVDTFAfՀ%ܦӽMdfnH*=+}xã&0ķg/̫'7[ iHJ6?t"aUdIdlBT%6t񸵉7v&\mp2\cj%ϕϼKRL2w5sҀժsm|Xxn'{dFk1R}b(},9{XF };=u\)f#$sn>VLvNͼ;J}ؚs65y2; YBK@&r%dJGR`s/)B a7^xY}Y>lmUqLmcK_fƦ =$f kiP 4Cs M,KX s*'}xk^,AɠJ="S|xb{+Us/%φ_\ Z BL6&0"666W+|7u_A8x8fi'5wK]yc=as̽N(YU,VB]9%~_ov JhT}|bwQ}h!J&aa4:lk!yܔy|?g=Z͍ȤACnJ6s㋯+i4\>'ׯ?|ƭ[w@Α3;^GtCGS[swY(9;Ǹ.rY=KyN긽XQW3lFvvl zH̝35$=z K2K7,ie`4+RXE$̗0zѼe$0WhS(oozLT2@&…QYNA` uj8ћݚ&d3b$rlg ܼ\'cNZ7F\+zҥ `S^y \[12ӋYj$g?ᕗ^/W3 !RJq@OCf@{爤Pe1p'GN%f;w>{So^ӣGL`Wj]]N-ഴop, IDATfwL>os |>Yp3 IG#7D(Qs 7Fi`eZ}`V<3P W(:?{߸Mopw/5t_;k:LLu߭d_j% :m#i!Ón fo^oL]9^?M63sgS=8 ٳAGW^'I HT\h1F&thWl.>a`Z>GGK{Fwo}o߻{zџ ? ?v;i-v^r##xOK[m痶󫫵b˩fw)ZF;g` 5O?eMfSdh}4, =+(#,j:ujO9vXX#m1"7,GJeWf6wWŋ:BڔQt(2sAס,jk@Vmjkf &7a^^mٹU;LFˇ?/O}Sggg?tu~/?g|oxn>{{n{j5_{swsՕ`S6D`tlؕ2uvmoa٦k&3?s|I3H<(bBw zb"*? [: 7E 5QIs }t! &hVo2Q!}1Qk 5#qOEHJ5PEF-U'`"ts|TZ hUf޽<]'kz}2xFw3)LLMh}j؇~xͳ·ۙ:2or'ul5rjj#IY(\iHu{mWS=>c3ֿ;C􀇟VxpoŘ:yleZڔVO-??onw?gf[p='/_>Aw;2VUuxGﳔoJg|3!R f.l.p+*YR6ێR vjgIt̥4Eg:G-!`BEԠ=>[Fڳg0̎ d왍pcLѭRVcf/Y3zIV9R'\vAmͬOɓ<RX}w9;{O:w~׿:HIoS19 LB@J1(2!N )DG  1bR ]"fM]xon{5Cm9կv,^0h$ ACi4UfVeyDc0W{\抝CK[NT!ZQNV2+tʌ%.9Wx~ WM>HQc>/?|/koR$lBhÏ2h\㍙Ӂ9sA~Ъ(Cupđ pνc:JF-q&,r1IfnhOJV?xU2 n:}ZS'|wG?ϗi?^G*#}_?[_};ߧ/~{O;(cD7߸YoOۡ9aK,Dh_\сCnt KүN#\Ps~h[" J C:yqכF<SG_/:N?ڝco">?+S7߿w!ƅX[/ǍzaWO)dK5j,s9m=E?8ER+߇b\wp%_LH?{O ! cg;9{,c.ڦZZu=ہ(q]IUSYYI%Tf"%sz>9E&{shު7zU[ PC efPI% GMbT~ ܕ| 'f.a@ҙУϑ9ʿ.gaC2ݥ<}n=^~+<T8"=r}jȋw]>OOW~''mg#6#+wgg|OxW^y]~?V ;?/+ک=_v yr.>r MwMACrݫ`H_FKY~䂥Iby_a=c|yß܋dd,GtɂVjTU_y PE&ed7jeT$3vPr`.U bwAP˪H%3"QJRR33iZM^(o+)̴јP*kt>kGk Wk9,D;&Fh2C '@SuK_xȷʪ%"1}pZO>Yjef<v[Y_J #$w?L7p/_~vk׮]rel$P*4soӿ/<Ï};>>GЇr߸'rgW5)@ʹDc6 jBTග?8dvEPs;' ,@j}ek#[< 1.ehjy0/U:ZѽB֚c$wX9M{k3$ej59d*^BLAJh@fT50 {:4eFfR9P4+Q."!vIEӨv-ɠ޻OoEvεk_?o߾}||*3#c?nnY5`FGϸ%'=ht0O_\a̧l2o؁dgvyͬ،nnrT"Rl5bs4dU|. f zyJp]*J-hP'sq8j>`Т%0.ݲ͋qDcw8u.FJ!f)%Ҥ4NH s_zsYG-3zsWfhXܒ'@%{M{w+<3VE+bKJs6Jf{Ә,YkoSݚoP@f0D(A$%! %!A#?PPD!@B`1"6ĉcDݴ[uoz왗^zO?X,]6_q\~& $ &"^jT3 ȖZL{{y;  OJ/' CJ jV.K'T$ܚ&%i*Hb 05ո͖B6Q9qSTzu~=?)å}@27|n a51Uk817dk\jjOHum,z)@lۛ <,PeJoT6pZAi imMssNRR4A$Tm.1<5h|*"j9rPiZ0b=0+"_j0Wi5=Ys֍])}qqm7.'Y^Oe8="RD]LojLj Y m E)QET$jdvaDLQRS&1e v::+@[7Ruf&Ik 97@DR-qj% \rSO[s!j5]GwCSS~5_T̹"i9RVl(ZO25]y/"@hi GOc *uI3t1kxBP0iu)^yeWmDY1shHG*1I?!P<4>Tp63_G? '~_~|gn~^ͬǞWo?V|^^V?c,j%wuJ&"0w4iMg*$b޴ &RTX^fd H: ԮH$2#Y ˍN0(d@J@S_q#+\+~ãRLIYP{'Kj1(x;7?6{t/j3DPB]Czm6L̘mTޚфwj}K$Go֐L3LXc4$I)Sm`3(̬5v>FnoaUͣ<.]>R Ъ{? _ l^CܰvPkTo)7Kt_kƄRݫDrb@(,juW*pӦ.qmB4Zҡ`&Ԡ4Y,FLBHEk]F($B'1RxCb-XGl [I $;Po6}i^:ò1'@9W-g9_^c#qH>RkH$XZspgBmډ+0gY ~[2ߎ+YRKhRKO9|VQ@]*f23d*|Xf8~M nӲǹ/4yWd g*ѣi ,ov阏¥IM"E#pBIg f}("fMTN,:3dI?:`4I0U.""AøgPi̦*zJ0gr" kljªϸS`X\ NoXGco)Xdu)6~q:^巎"I2@"éI[@ zjVlxHS&{EIg8(]瞫I-0 zf&ܛW2F 8YZvLWj;oy2Rj"4.6FMe*UjO H&[_Tm*͂5Rj+6`1o䣯VϽpi*OK[l-;!@zP!aDKB-'J&ڒ#̕DTwgPi ]`:Lb4B՝^k"ӶFXm_U 'eAɖ ꁉRSHU "YE|)2@ Zv]ycmرwHVmW65tƮ9gnATJݩ<̇hu<قSsv{?Ss+cX\Mt2ET֧{&-zq ZFwHfyөiEC#/W7n3_-'mѾd_[kJR2DS^A%]Wk-u23KI lJQkm3D^7}rxttxt+Y[f&N-AdR*k (fKM}'bZkĔaJ먊J*jD*kZR1Ub%gf1]5hG$R8 \ 8`͍(A!$"@JHf4ЋpGh aVqBX1دtɥc\>Vlӳvɖ\ЛCP98r ! Hl39 !4{+{7?8/7fj $T#ƑpHRn7/}xQ^?n[ܼ~SJj]U^U ^!xesџڇ.![P;+MiL9QJbi7مTFl4퉴 y$gMd0}+?~g9")BJvLH fVɝؐmEڐ.EM5%%eo%Wo[@j;͠<{FRAM5w,7rvqq1lj2M4:ls[t&&/Lz-HrL*UZtES3 wjZMښjmf>;F/o6ΥmDEx!D-& n'0[ U D.j%| R!YHU|5\4ou %6'?V>ue2R 9DקR^l׿xk[_~a<T-SaJg}7-\~ʫjkݻ_׾3ɝkPYiJ 5eqQ-[d>68!M'E(0((h"tas[w|P|BUVk/}ŷ޼lL׏P^{/vze矾-8*%Z(hvN7{{vmyp&__}p"B',qح!rM,A6`wfVg0ӹwB}ĬmoI}*!=Nܴ=.YKAVp'Sݿt77T`s;Ij`TŬՔ3pzg+O=?OA kɀc%Z#a޾K},޻sFMӯ;iQe{m4fyA͹`ĊܨHk2R:tׯ=xߍX볇d "etYjx{W#iΊ XU{BCyD Ч.&Uw ",p#M*Ari^a1K\ShsoYR˸ j3n;tڍn>Z-eYG43U><:$ii{NT?8Su0C#Nd(٥uQ8<ԽT=`LVCL YVwG2YNrMmO]ŝ'f>K{XdR.U S%ԣE@oZ: J~3BB#T OLEB!*MѡY wr݊2 g61頛:c!b\tzv |ͷ~wE\Ĝ5be1H ^iu=N ӽcXq܌^F f:A$wq:c z:+iՇٗwJ\p|!,5RJJVSY4DUniҌ3Mrdh>K4@$r"H)9ql]?FXLRꀄpTF*Tg @94]OUI;li Nyh[J).ˣ 2Ns'*iG#$!ŚhqVMZO>r__\z_ʗvoo7__{~GOu8K?zw|WwO?ypQZw?ʭ^{oo[yyܻѿ{՟῰q3/>wϟS"6D0X]N2iyUxDXjmp-;[o4ߠSi(F Rr V@XewOkFҔr̉[sE,MXT*BF؈KSmE8$'B4Ϳɶc^@"l$`ޛ0U!ήcibn=w7cy`EN"s'gr'LB+EGgS >(DxA0K K %DD@ :Ô]0 JT ?\;:|NJ}':t(pgujqTh*"Bt9.j"*՞b*jjsG1V/ZYфRJTJiծOY`0͑eoV@J)"D"6:x֧~w<ŷ}楧n/?I/), B$RVU(`fRߔ\@46 AYnHrroEJ `;w~(P Him+fCG4QydWH{] h5)5|&5naIqV[5ʹ|:O k'W4H1Mrx2!U`MqɸҺs#(Ҕ0Gzbtqjsk$p 5KH1$E />l8Y-..|QMmP1EQb 'eYWuiSoU|Wn|UM4Jd?#U"Ht5l@ RN9%/`f>^}ƶXbJ|;Ǘ!n祛tA~( w[? Caw;~x~{ן;?bOz{N &ҷ~k3?|t﹧oཻ޻oXNN=|ѿC~?s_M?5 U SiJIR"E謵[Rm]L πu_+{hD8TT"Z +R}Be/ʼ F{G9fR 0b2wb7qq9 XQt(^Dg~'Dbv``̳׼LOFH,@I/ +@֐-g'`ds1ؤC#B$m>IhVH OQsTR7"P2TL) ݇f)I($XV ExOwo[J?aEIjIw>xf70ѧ?Nan}ޛ|CWD34AҬBtT-ez0|l&R8E3(@ӫM5@uMcjûR3D USK63.ᱎZc2&X^V>_W_z/&gzOw|_q$@5nr*e*vd533!4f-W}i̖5HOBa/~7߸s~V >RT=WN {t|r^uqm/5o{ǂ+Sa F!}{6''Q B`t|uB]=̪BE-XLf0g>pXT T~+' j]M*|tm[&v0  X9 ?N;jJ2Tc9u"t%`UKSS}Jo <)WDEVjv~" 2}tOeVF9csl'Z$PTS(0Z΋)F.VgŎ4!zͺ_E_ah ˧1 D%dfmX3;] Wovz,* SؤQbs ?Wi/r/r?׾4!m6bPJrXu줱LQ"̨S"Ҡ)d]}PJiA];IlhB3H3Iju<+0WQ5ӨSDWM=STRʭ&&Қή0sP%&T8be˽_2\1[_ZJJR͠$!&1Ӫ"9Rf&/TD$pHg٦ˠͧ(Yg` 5&_%UD"),;(p8D0 /asi]:BI5) t+` "'cPř薋ba" 3e M-·p"! ᔀ(ɝRQ%'D0 t3׿7ןgg?ÓHj{{K86F=cRlꚦRg>x÷_'{o:B bWQ½ b\V a84 h ]O: 5m!i{*fYsKO6y)>^.wN G};WC[^p15ʂ*sm*u]o)8,cpeAiSh=cѭ\]Zv:IBQκ'K'D ܭw1r6M"Sxifm+ PNXvko<8`*@UPUTs@VhT2lM߃MDZ 3U`mk6|\TۯG \YӳS  IFݿ^OKTo0oRUQ0j>HM Z5-$a*J(.blw +A-Bf֕R*RFdJك-?S_go2߿tSMdLŋV_]L}t܍׆x=`bO1M㽻'7ZTnRdǢi QRd)."'> /ND՘B`iF5pZ|[>aB[oz-U"FDKE$  C6u"]|Fbۮ-oq!YB4nqb @4{RLƉu貮 4' isR%8\zuqsT7|wk-- V=a,5@|>뺛o~S̾E=_{!!YyP(^kȪˇ ;DTBX6G {W=1 JLmMMPv1H@ts3>$f)iZ]|Qa֧#CNj)1ܔ2˵Üq3|Y9N`I9V^ƌl&A#5)C S=W?&JoyE@WoSPg.j^h$uL~pSn9V"f{~Y{{i, ՛A*fN&a3XI9YAhnlD6-K]TgWnK&g,Q=H[@L6Yp =M\g.߿uE'f5ͳbum0F2qGHU ꐆZ͎W,fjЮʀHJ2`8z3\PXE$Z{ͧ;K'g'Nu@j+Wd35ӊLdx(O!ft@pf 7 ] T^o&UUDA\>PN' Hzt(׎]qI(>SŶtr-Z~j01jn]~a.r8NQ*Ϝ mR~&+]5RlI}0%)2z ԨMw[~ۿ ,YVPKEꅡ*f:( /up1;9UJ/.v54SF]//K 4=k3,hf!L"eQ&pRZ,7NݞĖ0]k8mg |+{OZ-l^{cr-_rN3ۑ0FE$)S"2"ZUUSRV,-*-N#$u:\#N>dZpفN5/"RSVqbhQ2 #^L̋9184 09ԩ`Z׃8k;K 5%Uχٞw0C4 b P9:z~Z kۊVǖ4(_myϞyl3@""U7^BSo]&dq.:s[ N4&cJ3@fOJ)TJQi =wd+šW5_,C&bUE%ƓZLUYkbK)N f1;mdeEUNKF8饎"RqBڄ"1Cnxu) j.V;Zeqq]t̝DTk7>W>ri56ŗ~c 9__c9 tOK-)eUnm_,%E}jFQҨ~ !4H*B3 QS黮qwRi6>Zq&6`JZq((<'V%ܨۢ2a(޾sN#[]^ @VXg7]e-. =T&šeZݹ7g 2BJPZ쑵c٣Jfחj{:KB5 /ecZsE-ŧjeAZ־ q22rbjE5ޮpg5 1rBdp7OGB(SCռKxBLmHX'J}≬50+Sjyp4,Qա@mfAz2!-WIuۻw26 y4MM"jIUiz IDATZW\v݇5oDfVr(6Uwj0[>ɖL%ۘiizo. 3&NȖ/s JfJ,:TĂa (jS It:ZdɨV3",穌Ǝi4 tQD/]JS3}@|/6TEUhv~T4:ih:BD%'5h2x4%\]ّ`&"7s ̲NuySz!UDк}:SwvgZR|G6 DJI_, w߹wtƋ74ZtgTQS^5[pGQEx%Pbwد/|*DQ@CTHD0N@,1AOsRTʕ+QAP)F0oNXE0ԫd C\۱vV0/"DQsG霚Tfル9M?-NUr@SmmmBw re#FbDkFhDQ&o b):$\2u# ]iVjJS9Nԛwg3 IRPPlVIR< lm֠9y80LU.b* D#Q֛0@:j7ƃ*f88WVC KTjI]L:@jZ{ FprxEIMji )%fPBRQF F-~8}4<>ތC2(E=,9%%0zDu5jo,m֥FJ*6Č7+;VBZfziwѕcRfeZPf+yvs٬Rn|lݱ?%YS@̬eo2˓o5^N$Tu?ܯn(xpv=??ub~ʯl DĚ-3SISg)t7NJZ}̂F0ظl\Fmb' T L]RԚTDC٨9öhdsr*&MKvqv":Z=0Pn D>N'44i}Jg`z\M6mV`hQ0h.ZE2e)i٬IqoRBi~_(z3`L*Aj8+cjQZ"wOS ct}ΝQkZݧAުLL)jrV&h0 ?aw$þs΍z{1xPHKD4M[ yi/*X%$$( ApP<{23s>/΍`$hꪬۏJyk+y1Q{jiMDógygM<p:_ԗ TG("WђiȀ-sKޟkgy뭷) ϒ΅Di~-^̃&--.5nEТRD 7[bM`zh%*9 P0%J%$S{R4G+ `HLa0f M`\RFA1J70]w8!} -* $Nq(u`bDk") *y:4aRڢ٭`yi@JݥDPTE\#bc 䄧b݌ztM~/Q Vͳ{ fgU60Qh 7~{be0bQƂو-$\HЋX1~,`:tSRU-8DE.Ηg0ԂB5_n}$53-պ<'O>КIeyY)k)p(ê'BwʣMVefa+}[ou?GZ+d͈i (0:.:XQҟ!i@RZmaTmݟW(:7nͻ Cp A aBB(b%8z*MњE;tGx)PWtCCKR1 E #;ӳ TbrRUjH-(^_z` I.t8z,mާX;E]T %eՀt-*QhЀ'N, 3™ > e8:)αhŤ(yڽO^r(˘8l %GЪ%˾{$2 rd>J%AZ$sQx ZYei: =#6 szHbstGuY<8He/.q Q$FTSp>/y2H$ƝΛm VAH?70 7[&Qw%1<D S͔C#԰PHDdPt6Vv( w㉵=4] i*6Ar:"e AeYBJFA%ي{B"#,< WJ!Hڊ$3LM(Z(v h= v3b>@Go"h$GXl+4MTʠGJ1B~|)C3QxU޽%DNd ͙V$ ȜT[JQ+Cٚ C)MGO:zZmL̈́RAZ% ң:r/HSL*Ê~mT 3,QZs~a<}vq]#kDkD̚A :0 p/NRvdԶ.s(MV5) `*$bF3SXA*HRSa5oeqQDDUgV`\jURqXB_ݼ# {Y,ey#Y4&3+2Xg$X!tHʆD6=@ŠXѢ29*FʆlC ,;dhK5r5y-Vқ6'CLV_" oպ#j$'Z:" "ʪ⢣#RR+Uɣ!KQ!@HTP T)To~g1*"ݸH@0(ظ[fv8T&]r9UDUJSe9ծ-RӒ[ 2tXvI@P'+@g !2Id'z Y2DA@& :l_HxAnhqfq̐b!JDFb/)RYY;P&[;$c(aO:5(K8mW{P $m;S l" +ֽ4 /).V(Zo@#3LKAW `;^202 JH@%(!$\z˅Y5-9*-&ŒzWt8$ h(0z~ xH"l*RF';w~oʫ'Pbzbroh8ݖXveLV&E *+I/QUBM1t3 UH8[T݋ vVUU"0oo43p$ECT<ꠀ 32` (e_f\k/E%|Y-;XS3Qɱ2+尿~zfHΞ.9**"mv@REZ"Bi$5֔MD@,"Ԓ/" *UoIKG5 EEA]8@|IN(C=PFZIiOE z@5-hxZhsGg{LFCE4a/ep:xM]DLAH>PmPÇzr$ġ-~mmϱ,t/6AČޮaT2m| mޮ./E$:V6G+XFӢt0Bwoej*}/jfV/DD,Ͱ=::Is A*kmk^/d!bv&K4dmbD槫 o=(jqY43z:EM't%S6U#C]W4 ҽ QH fz/Օv}#e\< %(j's7P1]+ Bt99 e6 dЊe:TG4.#3:ŃnػDJ#g5""BiC"Vyw-) &&a(2fޡ"6vӖP020lQ2Bt@Y nVEĬl^)Pe_TMfFQ .H|`ł43\7`Hk2Y`TKOd PD!xU~z<ތihJuY6pYFgZlsDՈa:F$Dݿ谟x~(ޖ˥T`fS8UiNeSlP\T"bbp ӑ⮃naNO-Ǜǟ~\]ZwG@mŬsFh(쑷h\۴9/Xm6X PQSkLE [,j-zB%ѭt)j%" z~|_k_j).Wyqu,ȃ7-5D᭙h6+ X,źfLRP(Zr ]c@s(Ls:&3*c$U,:3B+`9 S ^ 9ԇN {?&,\ S%˸ŌIIèAC"i FH&j bb,2孯<=4L02+q|GG~2N@3%jb&b0ѩ`;a41ja>셣9+ش0Z~bqi,SѡXR^4ADlx^N5<}CDԣq ~M5g Et*E>$Lw8)RS+3ܻe'-/:ҵJ.ɗR} Ќ䣟dVQ!@H2sgPW0Ë\o@pSv0XZKi FwaSUv*O 1—h5r?=|Aq;4 ·OhA+ǵ\iaJS1 &V@j}/U`q+;Cv4`bEҡ6Q[үs/.f o߾|>_w\UUH%djCѶw}1xϕ NJgZfȵS_q?;THN ]|F4m6'VhV$jsQݲԈRiۑ(pdj @5—*٣{sW{緂k`/`w~Z~oz~o[D[ gt-QMx<=u[y_k擏?޿WwwR`hDhTiluJJ1S\> '`kj`2 NO? :hELfrsqQp7)I7ޔ}ћoݿۣEp5iտ:Z䓋/91!q/R.$e%a}ew0ltWݸ|4m@e!}Oi4B"#)z:)`}GD36a9(}3|cefNI:4YĪw_Ԟ7)Yˉk =LE~./_52,/J`)RDDwdtZ4VL?mQ=Т<.RDPQ[l]uܔm6Gw5pyݓR+tg֝{?ֻ~o紃xvvr7~O>z<χ2d ^/Ew'}M[gmcZd_gګo޹Ë{p` `:Lņq:0MLj%TV{rQ%W BR..WO_[b XDz۷w>|ɳڮF T v|G\Jd= C_q߻]2.H?@uuxT0 Mo/iB,sf 9j@n4]S V$x`@E"BL=1}kt|:4|5h0KK<2P@Z%/6.&+kP7:ǽ$V:&#fB7|SQS$+E{[@u X)+o?ARH#lU  SQ1"j5ʧʃ?W{v@Fbˆ08ko??{$8H!Skg9qrxVxP8?߾e2/ũ22Nø#+lPS}Ґ<{m1 VD舻w.|<,4Dǫ o\~Ćt:#0~x|}S]OOOb<ڎ+?wv}v"ع_46"7m/J#>[۫ڸĭcv.&Q#@{N#KIG2)JQ(\QBӐ&:l0փ ʰ]bӬT ϪaJ Aђ#hcT1յUtPfk#Ӻ4ơ:542ux:Z@(*dgP K0E-Z暐W2 F"@RJ==sصpM46NǢ2_ðeh0DTr.Ҹ~|~|>򑽽95á wTϖu٫ 5p==╇'_}sbD+kGWo}qxhV :P'F ub!(GL̿W7ϗqգ@DLA4'obyʨa' cr8H8+}W0O_\+T48U_"`Ҽ/ DF_b:G%h S.eZ (0A)^",ڤ7kRv:lѦA&( `oidA'MuPP[cC'kZ6E<]EC!zb6`zs>dPW=5i@G0q}SԜ*RŘ\ev4,׵)+ Qad_Zk*"FaݦFCtN6<?oڜ|տg =[wb, 9I㲸%n͎Z<|N綍Ft[n EiZ[ذ9, İڄ`%(j@e⿊K:ӠVA0.jEhB!7_jyI@V T,ômM)*dSiN?9^<{x3IS]=`նDPCm3DMUՠ"`eNGO??~z,;Uоۯ|"3i=wVxPN;UuBVL@C{'w:8uNFͽe?ǽ1pxJKv+G"/Qg_ZMxxk^c0,0{$Bm")a/8lbgI4_%߽y" ML"͡jR6-%6u KŢCQ%"*g^R'&2سAUӠMgA &MSgFDTMչ_ ]Yjgd,y!*, RUDZV6)PtJFp*B p Q"rhv3ǏABq;eFJo+Ȉ2msT0h!¥>~|BJyzѹasO_]Ytsr.WL傾Sx C,A@gw޼/}?8|~. ս&zZ L0+[Ǜd3-G[99i T:E){nq7n}|G{bg8h\< ،&%Y.muy v3d(M{QQ/<.Qlpnn )is.HbDss4!P]ԔZ[a0hPau mL[ ɶE]Lmw *ME!C{B\•LūY,Tؚ4V6$]$ %}'e=M[|_OEL%wDzdksNhXmAi/f+Dʪ1XetPKuDeǐq*80A/Q|]*4z@XiDc Р"iK 5_Zϯv߹|_ung'?s89C*:[ ZJ8.DwXSdPlV`s'F%Iݨ2yڭevh(lUA)~}oeܞXU7I&P!jR{i h1H+QH)eS[m9NĸcCf'R0ophPE!k'%Vh.3t5lHT 9nu|s{j¬Z^oXYADK.^*M e4WN*T)*^ EjJ0 A#B02my*|g'zW??{yϯULm6'GLJt25)*֖2L32v7_Qq}107*.2#*uD{\L'GTB$dc?kvRZJ?2Ӿ^/v=W_!YifjLx{zs?N]_:TTLu4/p1!* n tMzm1lGv;LqZkKCÒ;Sb"/{b!1epx2 cuw}|W p>,m;n8NZGK".&QQ8nqt~g}ߖa6jc.Т`ee3VN.c)ann*ǂ-AjDO6O/ 8Z8/rؙ`όru2"liK"`&HA_}o< q=zTvͽeK%]`Ұbl=_7WU+z/.!OC<[V#웅@/0ش^w`@)?ᏞJߚg b/6*A+?]< }A//*(r_ N˛%menR.^`%NM:J ]y做rR6Jl)Ѫrv|^.nv*oKMQZBCpwaE&2 9؞_<w+QmHg<ak;pT9W>)(-(j) C{CL!P=#Zk>(9,hA7 9тN.j1oVi ҢA 5lPp?\].sn%bG~y.ۏ Da_ZL'S_O_?=?n^1R3(k T#Vےmē(TBEͽMo7}qq9B/ (+n ܫ U:qMJ+/ x H%J@Ʒ7~ %ˤ>N_^JͪӭAr/Kr*i `.~6m71' @Ynv9f/CksJ5R7 þs&<H !85:"r⒢*Jq.Kvb'\qUDH*RRllZD$xwsNwV~}{ Cvzt^{ V"Che3;%A%`d bc^gR=U}W_7fw F[mnͪ}.A Iat&7ڝ3&goٿȐUtRQYpQPa Mk{MSճN";ך#*`5hdWzfzu&5[ MU 5\l~{w}nfv~"M 23S YroK) ;e$,BM"2b6ɅWFԺAF .8'>'=s]N,Y0:V+`Dc.gK١]:]}c;v}ꔬ\YV1u=;"&6%P@MllnRԖiJmR 3gӭQ[[9<Q.ULNެRZTvzCѨAx5FFu2EY_0Ƿ/0T3^Ȑv93Fd*a_44F54M4C bClKnBXȐN,W΄_|H( aaK:('%U; -m5D-nG~Wf~D]PܶVk bߥ#x=۷6+ *aB^ HS,*VՙPUUN7ߝuAd6b8Hv,\=V Jo>k|>;88~gYgvwADxww'L]޶'Smg{k26;N\msEbbf*TԜTȘ=C$0& K]&1pkT S,mi1+Z ^A"3&c/җ%EWAk!$ﵑtl'lr/+H^zz'Z XZHU>HM[BHx"q *McfFFb'-\qJаyAhrp_7uD@`Vmm^͋zb/h&xo9sӍm8 IDAToنB6$P(eDPRSγϿ ճO=^\o21 THbqiNFirl0p˖$b ڦmRkEL&,R*ɢE(jYjk"w7!+]n#$EE;8RjJU&H vc) s\NuSOx㍧votK=~…NS~'{>xzo-t_q{{{ܹs]z /<ǟx;no H$0:ŗg̅떌30:&wR2i3S Q['9b&դ(`&!jHR̂ ?5g"6m 1&J0ћ9*)w&j^c$͹H ŖQzKxK=~t{OP}Y ]!._Ôws f>NUL7ۿB<7`J&05DX DԶm&YG #HJI=gT@M]$ "l--%-;!\NKD Q)hL#ky bP01UiiFBʪ[1lT  i'aR mlnnO$i(nַ}F*5h-Ď&E4ד4d0V[A>Sq8)ڶ8i3TU `2<Οgspp`6WU)"{{yzj]D\ű mmmml3>((xsα,GclxP{?{B`2\RΐԹ37 35Y&^6oI&Eھ`"ejT[ES5J̐'&acyk#@{pf/r\ uZϓHQ 4Y9St*Ԉ)%%0# DCEfR6PA[LZE!$m`g!J= ދMA,^/C ٿ~60 04_ʯFty'lfO=?;wZm|}|꣏>kFro. 3re䰗dJ"h,6 MDHLIsH8LB#Pd"G."$XHd6؅IEX$*lʰ`*%/Q ~"2- S0 bV "PeYVe5 EQUYV,IA@AMqB1-ϔV `b "ɥ+9G]8kXMQ-E0A&]|1|1_4u,k^24v8^i@$A* "ea$=ssOŸ QRHH`RP`* չ5ݪ6u&QѴ)4p6[,u4M3ob~TfhjnRx/?(%OCֶUHX$TVY M5) %FhMڪń/uH H řWp]uǛA}p88fA>kN~^r7J__?z{"p__)g?˗ }\l(czf"|/~_S12x_Ͽ-o~kE$2&J)+^Jӱ ysAg'B SPhL4){vwoȒBs^KSEq# 4)R4P@"N!5'U1@ ],FH^NZhz;8"K 4k48l|,Ld̂کCM,M >mlRSv9~'E1TUYPx3kgJhGxB $B4K̙4# G3 -)B+25)#)4h-%6FR6d?y׿² ؔk(ҐfF)ѬM A]dbΓ#5@$KL0$G"xMj:<F(A_0]+%%ק:tVNO<1'g?kO/^ܱ'{{oc`ξP~/pQWS|3ja#@9Ff-: 4Er_M@ֹg f^ɔ,[.)er+$kۣ}k"$Bh2ABbR#^Ҫ&`PRj\eftڈD"И9%c_`Ť"/ 2qpL)P9y5Zgskdq21dU?LSN "]vj0h"ڋml#3jiURj[" nS!žn҂HQLS(BYSK[} (B A51 r6I@QUAHyjsU1cCӶd2pEb5!ֺ@BWH(E 66QkLyoC[4,7`)˫xUMnϘQw1ىc֑۵N9NGRfU:mlL?|~?gOF5Uox}O}Cz[Bj{kמtioĊba-'%b T&Pirg3v}Af#4Œ+ ;;"65 xsRR &1 {^1J8VdUέ,!F4 %sȜYؼH@J D2 1'6Q3Aȳ < (gdA h̨ 6s@uUaUv!,0?ZLB,}A\"L˦#GИ:o/?C$(WE"B.o,G$@r`" d(S?'6q+ӂŬHȂ&jjVL0ԄhJ(uMF0$ltSBA,,!C?,իYTMƺm#,Fݘl!d`y3M^) ׶byߛሁo}'m;k[0{ڈ `:|uя}&iʃo鮻fk'ζ7_;v|^53"[,vH) @Q(ܶm;k`,”2.PCĒ҆f [5fA5Ȝ &6VBdXhNdFed;v`ͮ:4rYt LVx|ӽ [4kP%}c x.hA!yvfbrF#ieF ZA)'51R9Y2٭ vRb":W#6XJ[$ uQd  L_G:XƄYK!&,5+"b"$źܪN3#,ig 4hNsbD6$ RDHY*]% $ )R-svd BTJ d 5T1L+Do۶;awa磣nX;8)ɤ*m$XjJ1F%XBa4u*%Ȓ1K ))"TP2ys Aeh)$903#y>E$,ļV2 @XsRDR/%5&%pO)3t+'%嘀2{ʈXLFD()G"kѵwsH$7j.8TU3nzuu5 3S)21sL96o{WѹkRgPFT6MEVGѓ&DP2#vSV"n1IL1(LD#QmJ)ؚ$xƶvSHB-X[@l-FmԢŦiml{EcR$-fmf̾>6-}Ⱦ徎h耝mG`vmGو㧿sΕU<EQmݺXԧw~I#a8_nJ15MӶU7+_4EٿN]qR\1*w,< X8d2LTBYRM%{fC~Cf:Ϩ={>VlRR"ϼ#).P Մ\u*En.2,)h#d֪Y`Jl00Rc,bj""^ :i%Bw3ɔ?hrdb"D8dYrrCO&uB`?CV nӡNÞ XCe$ 2Ť(Y6 P!HLFbVlGҗeYMGD4UlJY1Ӕþĺ]S&:s1I 0Pvq۲ ,ATXgnHpm[?h)sWC s]kUUv1uOv8yW떭9k"LbLL˄4ٷ+y:F6#U>N2E0ScVHfkX0vmDj#뾩j[$c'Xi&%@0%BDQfKD cEaM" J7z̒dP@hmUDv_0]Q!0&DN"&#`b3%3#aO]2tٺ)ۘE4z̲#̐!_fa6ΚA[XT.^bPm%+ CD+Yb-"mͩl^=7.͟!6b:/~P%kG`RJfm4 SFP,i\G¤VU)i1k|6L#I#>%`U~ qC>c˼,{l2U4t˭]ۻvm3`NiO?mۇzo:.r_xC(3Y,匷,dKx)XXCDUF&==Y g9H”ōq͝ܦ|tK;߾)0H6\,:wDR[YDӸS Ej$*(()f+r$Fb%2TUM'i'32O IИss, ɋG:܇mƈrc fmg)2xO̠Q$M~[̅IlJ7;.u,`YlmKs0ׯ2'ILԬ5 '&WD 1K~)HSlj&0a (;amQiYPMZP>lj/ufC`J4i ?de)n/#ۻ>km=<<[ozŹc{0q⅝>ˑS06@P!CϤc]>Y6~ NcXxrl9;ux"4 ߃qcY 5].>uMc+9 =EfВe&7Y CFalڷ%21Pr^{"Rz& iU5l#LAlF!#IqpiT"y,ԅ9'7լ:&YY7ݱ{~h TDB@"m+ eR^u]}Q["PVLc8٢Q}3dzPE};-/0R[[[7&bPh<T l*pN,Ch=4 /O@1?w_,IY+?+W2#G?{yu?G._4~? ~?aEY[k^!2ғ3ȳ :qxf@,?ק>1?H<)Y%jrSw2p2[2Aj˳,9n j^4F f꘎p!ŔK7|35:\GMh~`.m{N񣿴AuͧhYj ݡ\ejW{?s؏7i/@˾l , /2-EPA7y{P=EBi\c^#Z{I/ux>ct4;L/f"eSEL(H dr ‡#c\dx&!,D9ıx{4+7,/ե^,w \,f)b#~{s[?_|-oz-/ԭ: v^$+3w tKD'z N{ZRkekڪkr.N4]V M5,Ǯ_ch%x`6)q쎦No!trzP>{ C1ߺ&$6p>ħ$2.d96 Ʃ9߸=S1!kFDR(*)i牅)wl?{IWSj5Hʰ) ڣE[[S[lȔWwT~u yS5SuUhx[Wt]qoAN^uZէ^XN Ĝ߿W(ILܝ|}VQ_$׃|kc;/_7tHp5q8.YF"&=zP6 fC: ;n;u=X%N+GsWaћlrÀ:+Yt7!fuMk_sSq^ʲlSdB N$TEҴX̉ۨdD)&4G~[MFBQg1%DjLhk$ZT$f>91 YhSmĠq`3RX}Gwur,LRlmmſ/\׽1t;)|!GvwwSЗj*/o'nfդiq=1wP!?'KCh)h_έ]E"VG 6΀q<Ǯ5R0^Y}g}=JЏyo3v7gv@d3_7uB4 H0SE4WHS6M3KkKm, de4,6fILlff K1RJbcF3fѤ֩ƄSFYAF 7[:yn߶xn8sxӲ@-eHѠG]owgov좾K~HL)O-)㧆ǺPvrޝki-?.N]lTs, pX[= Wf؊ϭ QO^e 麁ݕ%_8v,-o:S#b2?s{gm%R""%k64Tbf QAjEmQ`l5jPrSJ$Y2[{g[?3OF`4ˏL mǡYXZo]%]c?d%[ׅFdXjx飇;Ǝn ywBei64m)%@0f1oۚIA)bPI E%&^Yt1-%X˔H0"Xaj$EY9IrNU狹vIQm?zh1w~9=nstKn' y<0'm|]<7iLY S?vq/ĩ<թn:$ŵL%%CVJB?q'vȼV4 B׿iěՈ nIDfjƆby;eU"dRpyd*&t@FHA´fѶ ͭmDFMIܘXRYSw酪.|Z^xr~^]ᆗy?ftl>GtK3!KCW 1 Iؤ5 b2F(VXXgvHzz]ՔL̄$p( xsxX[}HO1Z9M4p!$ԓ{8@([)R,'մ,'ĒR̄\*j:G$y߰U4j,DV-v\kwur'_o~GoOw{Gm?՟?WU~w|O>rt̕# M药w~{;g3{q.?ֽc #lpH;:7MGsl$'.ߝmͮ9,a)jKjB4x;R/CYnuDUTlLIdBDSYCQN6rBrӭMvnhu[HכY=&5M7)#Wf)E )B"xnڨ]긙<;<\sV,垵{~_r:}?=|/?x5oD}?|K~W~C/'.=~Z_g}>sA9s~"!EzJtcW9^QNgFh%_vePV^'?dϷcSto)4~ Z{.oxU%l8b1  U9ݘnnnlWӍ3[ˍPm(YݦlnM;_L&6Y6 1i^b(#] 1y3 ,CJs)|lݝfѧOG|vppk^_՟(Wzr+{W|_:w.j7/J|l'o~;?z™ԟ݈z5?%t+93:G Fٳ?гx"Ke*Éj峟V{OȩIK5-+1vɜ>Rpc,r*+`^80bDeU$a(9YiS|1PNnEMնǘ^VsJ"B 'v=f4<اN :{t̡8}\#~Hlۿwu}n19UUa"U^.oGsjJ:2ȅ"ԘQVTMC18sQ5R43bJMj؄:BY|vtt8xX՛Lヘ$la|F rɛoubկ:}`+{;Уec;%^xdL%ث.q4<3xb+qbup Y:b) s JY] ^x{0ԡhŒxTT`0qQLxRZ|/?w9h[2}+n3I>ɴRkYNt:ݚnnr & b$%mSbKF<_4N$ iE]ّ$('h 6 \QlҀ-~>!bqءW,kEbBo`6lBZ]Xxg`$6֖8Rİ_;ı {38kڔ њaeM>|r=6; ͥJWq|[PV}niL,OMju *!R.FE(r%ҽnJu JH( )牂R`8q:1\9uZBSs۩կ?󺛦G᱿{M}G,ss紎GG̒HeeD)Ru+[戬=k@Hڪ ĀLɜ<\rGV[ yFoNx 5UgxeH1;c e3 MpM/ ~GNv_{P"%!8,c ϫFn(mZ>S;EBJJ +gia#|ElZ ®tY3*rekXz:Z e0y\pY4CuMY$d t`D6)ReG9]:n|F pM{޳Zj)u|᳜tMLyI9r,gIdB~ јn]bz rArmѢbO \ $QT:U9D,.yqG 8p'C1A%(CP@ M"XàGz¦hAݐ%4G:(V:_C$4E &h!&pفVbJicgO>}_/z>o|߽CZΏ_~c_|>Z7`[ vxeywPt4 ^(dR: u 2AE(>\J'nN(0i IN$XYvOv&wݵǯ}_j0)hRƝ@̀b?yy[x<jC݅I7%R9{wظd('Q.IY`I Srlcl"8J+! #6HsOMՑR\*%TR^QԐ!XiΞًnD$!5m5Ϝ>ڛ'%t{MA3X`r]IB r!dT=ұb+N]1s$3%'m1e|ߡy Zak? C< ޗuK3 諤?~8p lm2"yYlb'bD1hTD3H)X&"(ŭ4)RӣW_hqIDAT5xid+kru\Wår\\tDXuDa~{% zA2?tzvD8{JE1@ Gî1G<îrrE]JX:L pmt^5QMLn8cHgFy)ece;o< wn0T$ˤ#(#Y'1oE0)NRCHG,1J!%:is})CRC#pCm:TTT\j7{vwey//ݶyaImXVXFe@\-&k!$`ZKv `KUfz7kWndEcfK\._AH^їe1ǣʻoc>䱖)R ɦL-30yEʤ2HR-. 1tCf}Xk$mlvz{Ɗ=T3I/rLL"iZE mX^ फ 9."MV:LbjD;Htځ+@I>Ij !,HXY1DZ;i5ƸfDF1Bei/o7 YY 'ULIջ Qқo*<J8ܗd38ؗdМ`3y6ls47w"ɀ(IKVzL-ۭ @,"@DǬf0 Msw)6iRL*?I͛nG67Kjh !S(A@HQ&vwgg.0]'dԵ^j~d3L'>vNӢ1K1kQV9F9Z^n) -p֤oo2?03n^ S ]NaI˪&ٲX)K dҁ ;O?I`+TrKlo&e*ItRVpdaQL!bΓϗilLv>X{󃅅7r~@6 @07w\ԣRjzzGR)T`aa᪫]Q=;732i)P"ηDy  (o|Sqޝ;|*JoW[?fIa (`1=?_>Ng>s/?[8c/`tWubvs{cdo>?yMޣ'O𷟻С}~-(Wkory]ݎeO3l=t-hЪ?gk @)QX<3?tsq}{~룿Кۦ+4|~_{ൗ]Qs}s?NNygnhư}/˿xɨT,Ԯ_~VsQI$ɽhyρ#koٶmNJ/?Z^n6W ap ڝ.7<+j֛no<2=Q=$`OwJaO~m>jwO%<. $VFFw[C]+pcĖz2ܘ+oMg[mۤaS5j?p'])vGG#[n~ru'O;ԨF;v-Bm>9€kwϴ۝Fc,Pʫ{ԣC/,,* ɓ.(m>UW,IENDB`stopmotion-0.8.0/manual/screenshots/gimp.png000066400000000000000000012671041234321124500212210ustar00rootroot00000000000000PNG  IHDR*fܛbKGD pHYs  tIME5)d IDATx`}:3*g  nI0) D:'1)pLK>)7.0( wbAWH/  E9%7.C7# u_<3):- D6!A3 0&"-#$) F" +44$;R! *($:2"zTaS9{iHWNC-ygFo_A`R8udCC9'& tbC~kI0({SkHhX;MA+dT8_P5^O5oJ vb@kFG:&SD-hEoI -% 6,8. -% aN2bO2 ^K/M>'7,B5! jT4P@'J;$Q@(C5 ) SA' I9"L<$I8"[G*cM- \G*aK,eeeqqquuu٪ƺVJ2rNzhGLA+qLMA+ZL3s`AD:&H<(WI1[L3*#*"uaA $%\K2  SC+;1 3*)!N?(I;%  3)   ]J-;/  z`:H9#>0  QQQAAA,,,yyy ݁  eU:bS8\M4    dS7 ?5# %F9%":0#*"   I<& .% ;.*!   ?20&,# 0%wwwۼԇJNS  M4  2**##*$UH1`Q6  6,-&& TF.+$ @4" ! ) $  m)_ IDAT(EEE000555"""111"-((( :] 2+MA-tO솙K?+80 Yd}qL  0( _M0/?Q,9Fγ)$ʾ L<ȼJNS         &%#     ##"SQN! ! WUQQOLGFCECA BA?"!  EDA((&><:.-*0/.*)' /-,"     876g IDAT   431 ''% .,*('&$$"5/%21/$#"  10.763 !!+*)'&%$#"0* '('!""``a  ('% :97 )(&875*)'! 653*)'"!431 21/-,/    ##" +*)0/,.-+--+ f IDAT"" /.-.-+.-+ ?>;..,/-,-,+ ?>;JHE/.,-,+.-+  =<:..,,+)0/- /.,           ǻ            ba];:8        ,--  %%                #"aan ('% -..&00-4,213345 66 443300//,,"#+*'''(++#$,+//1133 54 66 3332/0-- -,##**((&'**##--..002255 56 5422//-, ++$#)(-.ˊurn  /.-  1>E 0/-YG5 IDAT?>; ''& `}875 320  IDAT875 320 875.-,%""% ) !+ !+ "* "*  "+tf~ IDAT $  '3<  3-#320DCC *& +;!" CCC1*'.,,,  875(((1J;C<==<==ӱ  5/$ 3@M012---***(  } IDATGGG LVh123[\]MTb$$".-,  W_m333jq}EEE =ES000JQ^$$" %+++QQQ 69>TUWIHI"""888|||꿿 GHH -T IDAT.-+  藗\\\ 999ooo---畕zzz`}++)653 :::NNN$$$$$$40$!!!%%%qqq)))222CCC    310 " %ooqwww# *% #0; ,*)875.-,  GGE$#"('%)G<(о.! Yu IDATvus;.('&320BA>.-, #onk-  )((+*(NNN $zyw{s@//., rsu "&555 񹹹) F8FDD875   ƿ!*+.)))& B3       !/  1-!8,     320BA>.-,} IDAT!.#:G'@IFM$;A6=4;"7ACM"9H1?@B"/ ". !-!*  %)5  "/  "-+ & #  ! %5%  $.8 !(   875 %'Ǹ  &$  ʢ,'M?!60) :3* 0)%G<4%%%320UW5WC9;8K* VWX{{{&&&hhh|||DDD$$$ v8 IDAT# #"$= ' M 02   󿿿ttt<<=555ccc 444]]]纺666999+ 30'.= = .%'! Э2.3= GGG   & 糺 +%_[W .," 󩱸e1+ $BJ(%"7$  JF@  * -  )ԅ IDAT  )      &%$  _W@ 4.   `} ֽ񜞢з"" &$2(Ӹ׻\ZW#"! %$# %%#<;8%$# ) '6 -,+&%$&&$ '&%&%#('&A@= -,+      '  JIF((&('&0/. A@=)('++)431@?<EDA0/.?>; ")  /4  BA> BA> IGEBA>EDA*4 $   "# C x IDAT 64'$ !&6    **)0/.875 D=1 6       )  +*) :A>ƿ .89 ;AB  "'" "#!11/ *("  ?9*    #2,$ QH9144 RJ=-)"'#NF9   !   !  C;13-$234MC4 mmmnnnSJ=CJS'#444OF9)('320 (/ #+ ! $# 0)"A7#&$ vx~ """%%%;;; )(&+*(    #&#%ޫʶ)" )('::7 HGE NNN'0@)2@ͺ!!!TTT33310.          B>/  \C 7,PJ8,  ,*  nquHGE %# +(#TG/ IDAT962"-09I*0< 20, ,,,875).! =5- '' 6C7/ 85$%   L1//;5+=7TB*udK(˻!%zdIA50 xcP7 OI8 RC W 5=7(&  # 1."&$  hfbxws998  .* L&   0/&   ! RPI캭%320+(M@+ )#    DLB6 3/'=.' =5-槲&#H@9 򌚭#!ME<.! #3/)   *! ! 㫶˼ ±鲰ٹ笷隥# DӼƲȳ# %mVF%i]QC &1FA9, [#)3   )    875   !  D3     -DC@#"! IDAT  ! %&%" -# =+  !(  ' & $3# 72,-)#0.-  073   A?<᭰ ZXS*9 !& /3F  Ͷ  #)$ <0%,H Ӽ1F  HTA0   KA> --&&9X (-8KNJ?Ȩ*B  &91'!   )   !:95440蘜*(%21.  6M+!  %< .'  )=MXM #  %1#;8 ((*@ /L #+(",(!2.*)*!' 1V :2,320ൾ4-$4.$   *&    "& 3: ##"861 E  &鱽    7   4      ȧ      <8)4,  * 09:Cvvl尹YO>97 "' 妴RI?>5):G$.)򏝹_TL)  ܮe[O$ 2 !80 #򉙻 xgW,%:3')ǝ  cT<!+$& 4.& ,&":6+  A8(F2% ! 5'/ >4*:.6;%^*0 2)#NC쯻Ϧ*"$91"?6&  :1&5 XM9B;0 9 6H/@6/ $%">5&'J I?+ JG$% &#/(B/.,KF='#3,,42*      '" !   $ A7)RG7 &0:1%4+!F9&KC7-% $(!/$= _R?   QG6 ,%EF=$!   *7.%   #0#'   6- 2-#3/*6/)  0+62*.#3)"7+8 IDATaS@   NB6A7+ XI;   I=1 I>2   bS?  =5.91*   QG: *%%   1,%,'"  ZMA >4/?60       9-% !3ZL/ 542     /+#ꬷ  *$!  )$ <E   , `}^]Y^]Y$!#KA0  <I    XI 0)+    '%3," 9 G>2"  31'  ?7*7. =3   蝧 *)(@:-        ;3+&Z IDAT  *)(5,! &     21/BA>        )%#     CNb  /$ ,"    %!!  &  #%'.3>      ('% %%%&((&0/.875!! 210)(&4 IDAT RPM*)'320  '&%/.,&%#320875   #  KIG  320Wb< IDAT阚"! ('&鈉&%$FFF20*$" {xs&%$ ,-/   1WVS 0,'875#=  4*-- / <$ &  櫪?68+`ᾲ.=!%320><% !Ӷ Q %ECp. IDATd9f5 ' E   \ ľ @B `}URN   %$"󟢥hfc%$ --,t IDATYUR985 󙛞"""31.>;6 wtn42.UTP+*TKN&$ 10/&%#&%#߶7662a NIA   x{ <73++*:95''& #$-,.2  #4  hd!?L?  +/3)03#  BA>ܿ4440**'320 50+  &')&&$/.-ۻFFFYYY؋222  KKK{{{ 542 8 w; IDATYYY###ﵵ444555:::???񯯯 BBB WWW 875Ǻ  ^^^/// ???Ŏ530<:8 fff$$$KKK!!!((("""3330%$ QU[>>=C@=!!  ;=@kkk@@@BBB$$$;;;555+++320864ca]ǀ򹻿HFB-,-?7* & +$  . (  3+ԝA9-875.-,Ak IDAT^bhQNK:97ú  lou G@0$#",+)  į ekr:2% $    '   74*>/&&&))M\\],,-#!0.+21/`} %(( /2:--1޾@;&CCD7 333 #!爊vto21/ ˹  2*430mid斘Ŵ0/+       998JIG nlg,+)SQN!     :"tN IDAT445CB? " >=<! +++  '*!    YWU !   ! ''&('& GEB   !8,$$",'$ ˻))XT DB@PNK%%###",+)&%#('&)('QOL0/-&%$0/.&%#&%%=A0(83;7B #-WURTRO  빻10.<;8CB?   %  7)    ""  #"!db^XVS   IDAT,,*.-,)('""!MKI.-+      (% '*(')'&+*) SRN"! ++) WUR,+) 542DB@.-,321^\Y:97 -#   #!+#)& @0  764 )f] ,*+ J#- A$446놆$%%# -% %0 .A=4  >>@%%'%%../  0.-*3".2E )"     &   ")(9=C@@2D>5&$ '  C IDAT    %%%))))'A?5    YYY$$$lll̉mmm***QQQ+++ HB<"":    %'-/16&&&JJJ***999혘\\\ #(  ݸ ,0;###111JJJBBB)))(((   "    +++ )-7^^^hhhDDDUUU111'''+++         !! !!]]]]]]CCC&&&  ,3$"  $( !   886))' ' -+% &  !  |% IDAT .   '%!  ;9+)(    ,)!,*#   &/! 0+ "&$1 !$     .'   552 &&$]\X A@>`} %+ 쮴  ' (#    10.,,)543    $'' +'#/*!/)$    70$ !! 21/ .-,.., $####!;:7 $#"        /*"5(KB" KF3 5- !  CA? 320#    NJ>   e IDAT  A>5/ ! ''&    >=66# 5223QVN 0.+ 677=;9 5" . 0  ",+- '&$  9@?^\Y?>; #! ! .*$   #!20+$#"񾾾++)'%$%%#-H9e !@?=<9B@=76422(      RQM י %&%$ Z'   )DGV!%184/",;="#$  # D0  !)#0 &%" 642540  &1; ϓnkf  EDB=9a IDAT 32- #>4,"!     !*&&& 42/ )(%B@=0/.Џtql5420.+B@>0*%54, ! 1   ))' SQM 0/../- +*(21/)(&!-* #!        %0 320320>>;>=:@?<1-%:61        !.  !%&/GFD31-0,'  JC9 4,G2+ Ĵ +2,)&麿:64*'$     0$ B5  E + //,#!!!  dcc  '&$ MD:d[FZS=/)묵  @5+' E;4   :.'  GFC"! '8ȹQ,6 IDAT   # A<4   %#  7+4$ _SB<421321OJ8JKQADK\ZV9;> '0ӻ,)&$# !! **(igb2*'  52, .," 67   $ / )!    a_[ 4>H xup`^Z %   E@8L 0   (% 31/51)B@>១68420,/-)heb@>;&%#/.,@>< ,(!   73)&$ ?$#PE9 1*"DA<YWSJGB     4+-"]SE .(    2.(    %$"%$#VSN PNJ kheUSO   ;7,    POL_\W:60*)'  =8/     TJ IDAT 83' %!       (  21*         >6-  \VN =4*     50$-+!6'"! 8㨬 *)'x).3UTPB<23  1*ϲ*(%}|  "spl! ϼ(#!*)'#(,    *  %),'ff(i"#'JJL`};@F24VSQ!!!    21/ $"ʿ8:: QLF )1ȿ  !3,# 49@$$"Tdt!#%C3 IDATHGENJC   qfY //0()) ! /.,2+D<3*$2.BA>sgWAKGAƸ''%rrt&%$$$"%$#%$#"" JHE823X~~   $*;8 D.+ӷ׏~L IDAT#&+ ա')48% 89$1  766 *** $01-CFS (*+! ljh!!!$&  ca\61,!!"igb983 ?>;ݩ"#EEE쭯sqkBgf`! 1<:5! #bOO(:97220%$!!'&$(30'%( NLH('&/BCCB@DB@  IDAT,,,B>*%".,+뽿=:8ABDyu@@$.H CA?..-ﶹ #%..  ($͹$9$#",.'QE8ɒ     ͤ/#"!-*#)&#:6+ |Ჴ KJG}zux{/.,  !  2ED;&&%448"-%B@> ==9 10-k# IDAT.-+ VVW30+.+'32/ ec^974VSP21/heb0/,MLK #"!  `^[VTQdb_653**)BAB   <;:  񔑋X`m*)%#" ̣u0Q ^`} 60" "!JJJNNNVRMEIPMKHͲ,--[XT,+(1.)"-,*pppYYY }yu)'%m * IDAT973-,*YYY0.- kid$#"RPL][W  :97$$$$$$ \YWvsn  aaaHHHttt   111     +*)653""  Ycs  Nr #"! &%$ "! WUR  ywq      542<;921/UTP542320 )('*)('&$gg6 IDAT 886886 @>;BA>VUQFEB876$#"%&(653653 320:97 EC=妥   A?;  25:  %%%333rtz $#  [[[~O IDAT%&',,,]]]000 eb^$'-666666bbb,,*    #!φZ+ IDAT7=I%765('%.-+331 &%$/.,!! 421 '&$ ! &%$پ.,+!! '&$%%#S/##!  !!##" MLI#"!)(' 79>Z IDAT  )('BBB 767prt\\\;;;---""" //0 ''' RPM[YV ɔᮮppo(%**(1/-TQM/-+  '&#1.)764 853   '%# #   $ &   --.(*, (&")(&752 U&%#  ڣ}}}333>>>qqq ggg222JJJ """ 7 (.8 󽽽RRQ  v}11lll寰trngeaWVRu=MKHTQN^[X$#!  MJG$#"KJG,,*)&$"?=;  GGF# !%$"   K" %6۲HFC[YU J" ) ')('%  9>71*)'%#"%$")('/SQN430! ''%(((rrr//////KKK&&&*EP?=<""" "-! tC6# ****##"""! %&%&vT 66 #"!00.$ +HFC!    IC>=:    . 裣uuuddd  +++YYY...)47  ~FGC̽"E " ɾ %32"),6:⻑11JJNN"!%$#-,+=<:YWT 5986+)(!  'FNLI10.'&% 73,,'XVRRPM,+)3/*  =<9"!  MF%&%)('  rpl$#" NG&  %$ ('&  0.,21/*)'/,' '&%'&%;';USP?=;"!  |xw 2& [[]WWVSSS $...<../FFF### ƺ0!4C-;/#:)B!¼! =)6;' !&& XXXgik DB? nps''({{{!!!83)$=ֻ$,RRR ;64]be  ,MH"+&( $/& c8c % >>33,,||KKFFb`\?:97  %$#  ""! ! (' ! $"!$--+;96   '&#oqu ~~űՉEFJ BBB,-9L [QJ?=MCC 2#A@0 i3!KJ443    nvb" ,g ** AAwS;:8543:96 QOL'&%)(& $.&# HFCHEA21/"! JF@^[W #"!BA>('&//,EDA"$SPL?=;FEB+*( $" &%#&'*CA=;:8`^[ 310 (K"O( VTQ HGD'&% {C4 ' <: ++) HC;+)' ;97 $  L%+  $#"  '#;:8OMJ .-+!  81.60-=! /"|||ÿ]]]ddd{{{ec^:::dddfffSSS쟟33%d:9 h` v - ;*jD !  HHH10'+ L-tKNFLPPBB } 3!aE/ ]\X CA? I)6 ?=;?>;-,*   )(',+) #"!"" **'  -,* >=:  ǯ  542YWS(4IHVo#" \ZW65332/  O%P+.$$"<:8,+)  ";>A.-+  ע٬ĺ.-+ *('   {O;:&S;  (F}R[cOepKOP"""XZ]ÿ"#']_a¾567VVV%%% ^^^-./ 992)   x .IIHъ17H@AA 993  22-$$&DoIKJGa`\ ==:=<9 ? ; )874/-,<\! $#")(& /.,)(&  >=:('& yj6 IDAT #"   KIF   NLI,+*CB?$#!&%$31/ DA&DIENDB`stopmotion-0.8.0/manual/screenshots/gimp_3.png000066400000000000000000022052311234321124500214350ustar00rootroot00000000000000PNG  IHDRC. IDATxw|ǟ@itb*H* ^ދ {WT,bAA@A{o!ζ$<ߏ=svf3yffɛ &]-nARg#A$hܼ]q  .[6 RD^AA}@AAA= R48 r4Q1@">bDQ5 ./9.wG8=2t.&R#o.{!ĖY$M:@!FT?oaobv(Axrl~̓0 AAJ7(AAA;vr=z,\ GN\[ -0 e2VHgpf 㢢|QpRJcs>3)(y~U*&mٛ:aLA.MB9s%zFAb#!>.G5RRJ5 EPs |G[8ؗ*$>~OOq 8psϖkѰz*墣}'O_Xa3:pMsb;Ҷ^dJI [v/+2w?ق?8Vwi{o~+K彻9Ŭ}G,XEu|7]9L_c'N_ض7u}K45VM0#3V&Ƃ/٫y+RRlrM$\h_cܠ֍\3JrR܀ 4R!r|i[Bzgﻡnr]Ӿ?n@tnU[:5R2?= >JCjr>ü]Us5юL}ӑR/y-/RPj5HAP# H Lb\,@#xt4kvfugҀa~/KInڠ[!=[ cYF~e‘hQ--zwl<o; tMVa`խ2cdH*ի$O2~|܍#z[5ުQ7?[@ºkH;YB 1>IMUMȯR*$> Ȑ(U\jz^wG>=|kI 1WMne˾2npF)T-u.+NIq2$|bJĹ.ur[=ו֪ذVً[+;ԗFkUFz5W8{v>U][3W(_Fy5AJ(ARNa؂3BĮ@) >ް#cZ?  ԣ |i⠅˷~t3j|SFoQg[HpR[qOc3sAqY$Ǽ.f|횵[jU.Ӽa@7%S$&]]˕ouKݹ}yr4[8zεw<5':׷SߝJbc^ؿ̹{۾TP#%5kQ5{#tiSM_oZG5?eOgﹹ]"9vkӸz֮)3b{}rR\V][kR+kVg֮B@VFr4͗z`#>`(]m{?p7 3Fצ>6336*wx׏xۻQV=WԪ6}b LyGf̵Mqաo& q1+}o>go{E쐯8rWo8s _!]n}뮛١Q|\ 'p32b+>9{2r,Uo>>H|5ͫWIS۔~x\exՙ~c'T*u tvM}q^)o~I81>&)16=#D3>1 1R'z)emLƝ`T!cc/\P-NN *$DwlU/R|xgdJMJi _-y2iBGGјh_f}s\$'ڀҡEYlw& % !U `A^܂壔JRBGIkYtE׶mVzuJPM~}{ !~-\u|,>kT) PZW_Q6)1s?'K֫oͮi.kGSω67uW]o\ZqSV*3ձ >6zMm4٨n`+\#*K<}.c{lDlXrRA߶`˞ =sr])_ӳNHr}܅pѲAL~,W&mmט?i%P1]96&_H[3]]vMɳ[7#ڗK=w!{Ͷ_2^p jWK}8;]pڕ΃ kUmOrOU4sً0=ĥЩ~*e=ʽ'[5W7mVi3 u }~ BU {%R^z~0 #QQ>pBBpNȲR'mZ?7T>jRJ viQQY ֌o|t|^wOޘds޸CmB]Ȱ\mC3RtnqO~}_oj 1w<_cSS U*y.]j`xV`yl3ׯ'wj I0`˜NB?r-z|| ver* բc䤇ԏ9t\=}m'H 9s[%*|~5u f].RB^YM;\9ywjΡXΜ8gіNȊҦN6u [z7xtB=>c(]Zv>ѷFwY5*KSR!9{+Z56_3n4k9KNR6˃`WR3olS=2׮~7o0mUkڦQa74vCC~1gtc|eb m~޸+%ǻ& %FAb#RWЦ]N^ONIȍϸH(#ge_74_md6~3>p;|Z}{/]9^_ò-k7|}m]W+cYk[7h^ ;6Ηng]|ݟh?.Xrr>3z\@"׾_q?!6q-Ve]rrٹk9<4㕵+WT1{Wc̽r8@f׹ʂO.z׍ b}1쉍zo 5z[JxC7@R|LJIZkPz(_u'_{ 5zgj.(MN}zb;|dϦ&W*0g m䋟rB bcU~M_u箝zwGLLz1B GldGN{rن5+H rO>Mc"ij*tF usA`GOv |_b[T)7KZ~lCS[nuԐCnذ07zgJ)n֗Ůݢ;WIQ~?o ٷ#'Ά98V9GIbBl2kƁlb/QCnccgsrx,\0gd}(x^d*#1Q9D*(}esDh IұjBMMz=S@1Z5WFٹoZd0RbC\jgӳc$o~}Y}{է3 ׯbonw 2rV֬oz.XUv^̗1zu)e?`ENWX;݊zu/KO2 1?7G5& %) )$W΅D 6GN:o~Z1\4dsTܜ-\c F,]i5#++TPq>eu0b<$so0c6(- aX7 Uo6rgC %zNoxS斷=4s㆘N06k3rۍz}zw۸؊Tt7*bSv+R1YF۳g 'N $w͞6xsC>7D}>o'jrq2Ɓ^4zSUGO~S4߁iXL[pum5&?-o٨`,}P?fUϗj=/b^-*+ԶrD7hR/<>R3<2vNFf\zeM}t:\f̃oݧ5Vb88h3#0LZ5z&կiZ,-/oՠj@BDcvCXl{t AlsP,629@# H9Q#\E|>B|rgG:m e@^,1p78q1vGklEȏ˷k;w5_ 22sŠ N?W M}Q}?3'w~=~wwJ] aZ }^k\Lcn _)!'1bcMЋbO]{%L1;G50+6E-hRջșwl]'6&jxӿ\~үsFuR*WHt9?uVD4$Wk8pLH}}8p{iT7%GihZ !p!3gߑ"Js1LVz:쁼r㡞 Ѿ;o%X*?tkW2n@Y?o=Mx]'?u|gq̕gk~^Ol(=G\JQ_+w{fp1+VOsML 9ܲ[._۵ *$'ԫYO{SS*$tI>i ߼ ⪍f~DU+ye۳~iLTvʝE [!ݚ~4mfvn_w/>ܻٕʗWgG lKӟ9̘&pNmN +?Bv-G5] ;,Ǎ4wyIwu}GӤ\UC@|IpȞMk_VѱfZ{}d;:{ً϶݇Φg/6I]jou+&?<Ҭ9n?x\,0~`K1ӟ6o?pzm{5IN_72\̣=GΞȑ ><{p)5.}?ڃ][׬P6-9.sXr !7hAĂB^ӛq`jF49041ƀs! 4M4CI~}{z?`fde.Z{.\hNv>#;_D߯+Gk*9)Y} r?}ޓ\?;z~/[$+pw^HZvq7#Hiɥv<mv]3ϷCؼԔ|L4O\ԏVngεy9Zv6||AJ+?/nAHRa/oֵ7oejh2#->:&}>J)P/!@59q뇬?>;11ц`=x"H a'Ϥ8'9@٤m?\8iz˧ E;iD{6ybjyQd{|HdW>^\"s =bV}=/~ڤFT槼I#F_2;{ߋ3p~-.]X y%TD᎘YM;bդClEҤbDCkٳϜ9s,Yp‚D9ru ة_f1;yw xR:toAJ8n`oy0dffG%>81qLx5siNj۴VW'fdb0|?}mݰ_c-Vw>%okز77wm[Kz^IE@}'srֿ,_pǁSԮ4ҵŁέkgdoޛnb3AH0 $u][2UϺf,!o&6^*0- ?*Єb_&OEuW8u6KT5FR\-7<͒mXc~P^9sc0&"A pgo"1~乙z@O7vm_N Y;~9 k" /.˜Ɉ`mԸrh_FViKyx =zc0&kA.QJ-Y:Z2Ÿ83bu-g-4O IDATQ5 ar\ |gDC$,,&R#o.{!Ėk.oqwD{\ r)R5d`]e( RlF)DLs  q &(AHiܼ]q  ]Q#B"ӿj A)TVXb A %{A)^P#"{ AA" %ZO^J_]! HI   RAĀ(z iF)+2$ڌ  HуSA" FQ[y!iҢ}ߛ0aqòDŋ!$ջߐIMr#GAk֮:?:W*~Moګ?,/nXJS4I9;~FhǸ&_TTd(Zv7OqO&VF7 4i_8!!^uǭOjo+K~ !fĀ|1~ЛYG)iݪEqeƲ kݳ4;qVK4gxjɊ+|$.HOO?q"JΝ:u * ^Upc}[عswTT""p#`ZX #FA&,.ڜ={22|jpHuGviЈx9 رsW λo&%z7cȰ1jRyҥsݷ_|f7#x,qe5{nKjm'syq]/A9_8dT~C )Qj!^SOMCGw^s /ǟNx]{ݳ?..?tȰ1]n+"z[Éت+ϝ?_v-+D3iأϠ7 }嵷]v7zA#k^_٤E{#H~A Rl$b70fO"z} ۱sWSo;w^:m9"HA) b{5qffe}"1e;vg;th~)ZM6m7wꕔ)#a~CZhVJJ\l+`n'&wԡE͚6\^>l-9qy?4;6i3;tHvvNT/՘r9zpgʚmظ7^z=b5M+[LNǛ{+ߵ\6JJſ.NI,ݷwhݪEZ٬,W3 ր k׬Y?g7-^d"˕3^=@>==i$1}&,(Seaߋ EJы╝*z H+Dtǟ^0ovttIIIMxWR M5b Wfwo1PVL%M|ࡿ_ͷ8$$yPϾ]pB^^p=>:^^EӴ(N5Bڶi|C uM5(!mnƍ6j˗[vZ5C3o&O{dp/cbb@Nr/3{k䗰~E:Wԭӽ{׎]z~QcB D) NO9.IΑ9 m kX@Q$%v7%[׬i~X?(; |>_ƍ~ZH+2h@߁vL.0SMvSq\Z+H\+KPiڙ3i ԏ[7F5-wN .\yǭ}SͅwE݊+<«Ç `ܱcGwUΝfҭY]a=77wĻͷmQb(J]GgL租ռY6 ..|ro}_ FAKBȃ3ņS~\Ӵ~0lQ IO=9Ys~m;'G3?iЈc'R@TAӧǮ]{z.yj[3h3/;MCO=BĂ̙;xz RrEQGEE6xQzNQ2~ܝcv8ϟOѣ}GÎ?QB7 2p@_u!JbccmY:wQF`du=/|ݻ^[O,N~b= ?p3?3'O4hħ9;mq'UddCJ1n Hh/܌`<*5Zjܼݖ@8bcc ! ~X-2d"NEEEK7#5M;VIUfVp"ČEӴ歯[ؘXbɸݼa|=ߖkAJ<1]*2 d/]xˎ&==-+;;>..4/hAWBδ YSOFl5|>'oc|В 7#H ɀ F 3*kMog/"-k0 , R(+zW\2,  % AAA$@0 H,m D!  P#Eb0Yֱ!'EatrŒ6AA.EP#MpeNoXDB+N)A)AFqTLY8T/ "pRwq/AA"@&X   %zA0=%"ȡ 7oW !7*`" RRᇏ[Q# &o$[6-Vȉ  HI!>&Q#8lۚۀ  HI#!4j UDP3rfJ؀Ph_&*x*xW^\ظy;"AA?|hLL}%B?S4M+SNNJL 8w#z<777++{uBF{'DEEegg?p^2OOyVntuEv6i }zy3T[N{-S^ F)mB 9SwkSW^ OYۊ9]NXB[UxUһ+o}m۵r|?xI+VHK;;z.\I)ȣBc]yq!#c%5jT!XW^Tj֕ޕqmFw2E(uֵn֮]۪U+I hAJ?RH9)s G(#尖  y`Zۊjժ><>ժU]ۊ.lIjUmUmێ@n]sMKx1D ֕+RJ)\hԨĺ?;fzb]֕lެ3\:lڴiӦM:tXnq˔ F#ą'JQxnpkڷum]=H$-{|z0<򝷏b]HM=9z;=йuT>rA֜`]`{=}*WXW6.\ȸkn *u֫WnҤI&MV^-\B{AK+k“^EKCF -[/\P܆Χ-LKQec]HIG͞ѳ/j J卷{}㼾źo>`^˶ldd\|'>r-{@ăuʶ;_~My_@+WNyR77u&֕+l{7!YYĺo 'N ۪U˗7mj.&>j2 rK.#y{.kD$/=?rY}V/)jתi@+W5mwmXW!+5m<hʏgr][jnw 3>{*)* ogS.$# ok. 2`pĪݺ&JJ&-ڇoI[Jby&nA(ź*$PJARB!)\ZW 2t_#Vʆ+n)IH77Fο| Ԯut}ҲVԮuyћ H`U6THd%Aĝpv.x"M(JZxS%,&/txVίj׺SÒKCc\q#6SΌ@1. !nQ#/ 9(T7"+ ؿ@4_߶tF) F,eEA~`TH)fs?q8Q#RˆyYR* Z铸DtP")ϼi hvKFAATl\e7<  e-I<=F.izYظy~.LdHAd6oX59Sy)!1fD8̼b+̎|,ӆ*s}+rrlTZ۠)& 3%_{vRJkh gq^^9PQ3=SBT&Ũ_ WkFZ/eAl%雵9W4Bk͔,V^5veN1bo/BƜGmK @a>=Fvԟe{|Op]֋yԼԟrc7[JvƥHxĽL✋>57A#)F國mk\x{uk9Gj^WV l d`juQ&zџ>"RGYlҸ*۝HM}-,N6QB"sK%B_UcíDZK՟Q 1NFK`@Zn ctHm|׈e mҟW83` 8/F H>N /qO`KQ^RKy]o9_'|~S9=CZ(ȈN8 *;vD5“Pñjf$#t[|ާ^:Nhܢ)Qijtfj̞Qz]t2a -:(;z_0. sNĈhQ*N=,ENm֘s 7?0g7f0X<\3_Q,^Uι>S?vfPƌspĒr)lPa0Q)4u?gMgNk@qÚmsj88YQ%"b8k «n]K'6("<]nU/ӭ8Ue/Tb"RqԴ`\{@ZB%q e] Siϊ6@ Hi 귀IE%!$UBDpmێ@n]G,/g(YahT(VRR-wc?b=L,%~s }-ȿoGᗖz@8BX37"Brc~]z2P}iG>A>"`2;#%e(S 1,*(Hc K,VF?^9E\m(R$z@?q¥ƙRO@ hʪWV W}*52K@ 8y 90@㚴ǘ A#L2u52]dyR,\,pV25^[);$r\@ E6/nB3q|Ƅι/L'%bL|E?#SĪqEd]@ j,ɟBM>e'()6  %x IDAT;1B, cތ"+oh԰nre^|DhBj(F.pJɮYF-py7^J1%ly_>ٝWٳȨeBpy>~@\!˭".r²t0Թ (nLA;A`1eFZKe 0j1F@Umڐ˳ |@ĎJ1 9zc}"bw<׏r9F0wXҋIf)~/51ebATϹqqoUr(ڒiK `YֽD!B KjTKmW@jU1 F۲ppTa6-6sļ 5w-+řrͶ:*976D# }5B'@gsNYb0 @i`X&Ux#?9牉/<;9=Ftʞ3!`% u vEG\n[H!iE|JfcP#7)[K) cD_d5x2՛9e1蛷!0.d b'0Rqf4 E%:6..q49GBWx[O8` (Cr'NsFq?5b!pȹT0fR5CwrǬ1($"3 #eQ#B?!f)kF+1F؟Lܧs^"0*(vz_2hn rxBTk, (): (¥@p^ xaҨ]qP 6D"P*ι b-0;72tW T{KWgHgLMDNZ:J ^. nEHT&W߶ s|.. Tѕcȁ>Cl(Gu"j0(DfUO…&y<޹Mxi`Lw<ɳIP{kCbEi&N+̳@# .rj rqJ@N=Pn/%Sylj-~OLaDoC3Q X0_4N @)  4 qs41q)Jav%ۏCLUi2dծsQ#q:Nc[H %.wGʹc2ס<34?f(T8SUV&f#qXKP[Jbrt8I5B_{6'*ۆAߙ3qB%TIk~`ߣ/y'() \'t,.CQTm'яZd.-UnCtǢ_ߙ>9O!NzK 1gnRAЅSwAnƐJpNU. bk䘻N ٭Hw)E}ئl" Rq9/E2TGG9hsJ H?2E/3r,VzAeL*ښ`#U^X^&w}n*,4&"䙄|~Q8{&1ayQqV3N:yY#Nn᪐e^GJԼN `kwȪտ0{rOus`xwe9+i[ԯmw`1 b{ `+s[Rw?X TJ7]e]⸳+ı?jKB <#|kЀZ^i&7ds;Cvۈ]+Zʱ"KΖ˪\9KxrǮ?~ _8Τ,fb6MTD7<з3(k5OaxWoMxm"OpSrMxbiF$߄~ÞQrES%bk(d {|߯aӽy@|I e$?X(%tFiJq͞㍘zw+ 3aH\_;鎖]6HМUpg}PwW0;e?sY@PRmR+7elILMHB(8b:4u{êzo!x*gVccsނQ}> "!&Kl@x|;Lٵ(Fas ,{oeO[/Ί@ݓ1n99I@_#>m.v&'1uxxͦQ8"E;~Q4T0P#fJ|iⶰFxajF47$AWSj`ENTEwJس;DS_Sۦ|:! HB=bŒ^b`)nuwh7*Uk]3,7 Ԍ-H* p9"p ۆsN1{b}s8k)T96qyߩZW\jEn(-HK,#,u6 c&x6TiQ_+-]NcTtQDtP5(ؓQL ~ekHqY/6Jy2c VIO=_)wzՒrnrX!ց$WC0 TcMD3& DȘH)4M$@B8Olˀ p5@DRgF:r$[a鈙 g,.]˱y{uKyņǒQpZ6dufbV2hD`$+ݺML3 M6u'4"ޣ*cLg.*-rc}(Մ, K֭b1aq+5-gd+ҭ"k"=D5pk 譓L` ]ЍxP pAeWxőxlʎ"BebWA fBr?~Mp\B}4\ +`\:un4gqdj\H!q*+X !>Ba\p֟4'WB?;JBF~u[Fbz2FKn32cU<@K[R$PT#q| Jn i(<^MbƮA@c3=kH1Yr*ͫG,ᮻɆXNMԜ<]WfM*EhHGg\=?۔ ;͹>ե;O./&8ZjkMŵ)2xXsʜoxT2ƪ6/j 3H}cj1g@*ӰHNwfm*q=f:x5c g2\=;MD99۞mD;(EgזEi^WEqA l%\nC 7;|bV %݁>1{ɲ׭լ[o\uV V(]G\ver9zHG6IJ󥭹ˬ(V'VuZUY0hP#DuO;\L±0ةHme)Ӆ!2bfgCY6kLdQ%iyEKYR6C-ӹ-Jǐ=P}+G/dWpeOagSd{J d[ ؂K#`NV5Pf #@9oLj}|$|F$ ,h@Xay-"Z9wD#bc1O8ߔڽRG=(pEEҹf`ƫ^ O( H , C $<}I_h@ uQnu0 #mb%kǕ,e\EGx^Gmt]rRT"On;r`Ly67pz2ڪSXuRX$\`0W6%.0*h.T$[(^JnO< rq!2ZVn~MqcKd@P^G4lH)~%e*7B 4`bN/8b1h5sOK6ұ)mB7Zk#Ըr.:c9hf0%q]3J^esF-S@P#R mƈ~{A4i> V[WSC`JX6[2'!G-p4E1)rP/Llq{୽PYNqmy2VpLm'v{R8۰r ˭[H/)G@ j5p ſrxsKvIAhh}g sUO6hJ"69va,B-6Ĭ"_97_ӫ UӌŪQ)]0nh"nqzѰ6{%Q$OG”D-SR>F`H(Fqm9^#5g7lLysN/1`++ m(A$BټakƲF1f/*@ 3)KN%YtwZ{3DXMXHM'w"{6oj.ke+]S~ˁ̵.cޖE9%#(PIJce1CZW2Dj'5%KōRy20$W?@t= kֈ/*!.eKR[= 3Ux:#YO{Ǡ_,{ѝ`*Qo2"؄UHTN|:Q1\VSNITYN5-%j|qLW1K.>]rUnoD>ۨJZP DT;x9*ݹBqR\.zSUǡAbE >VFE,Jk"[P KW@ r!g7EPJ|r΁qFAŴ[aJ:nJj{4 [+pVn^YE޻\r]#v86y8 Q7q+#9Hpш }%" B(w@dAR8ɠDCHLz[q ;'i^ڏU:;_wTvڿޛV6>=PK "U[pKϱffKU}x~o28MU ÆMﶴ8jՈ2sHDFeQ{CQ4 0%x; yљ6-Ru)3,]pɅ|9fgfQXYC It1+X99dq4;1-{-بv`wVw>Of v .3f8HlFw;0>eȞ18Rfr8b0 {ӛ5d2zւH.7c10Tl=LxL, tv?,w]521)\jᚂvE QAU@P1rp6а { *Fڮ\s#_WRxN͒OMUishz*ԣsvV6}umw]FWHV%~jm?\ ¤h@/@hж֘pL20l^Ꞅz3k\]>;>ROoGT:υ0lۖLoꄗoC%0{eWLg̘qN`,AZ=vB6]zEvq Kbf 8RyƲD|5KeTpZP7(2!?VW$7тtrwI!!""#?flBl KC 킘Y`0>d I>6qU&"" Ȑccֹ:5yNÀ2NJtDiuɖȾLH;d&݆͆v>N}gp|a"&@3<[#MhZ#80RK }bfn߱ܲ0%Ch!fEia&3fCjNwu&%1S*( qUƖġc2#qʭl qцiFy?FV~{JWaG v{p>S{SW%Q0J)'%ᔼo\*VFʺ}wAOt,}qڒaUL@kMȩ%+ Qz7ئLlXe)~:ZRkJ$T*Fi_'eaMSW11확F%"l[u5f4 IDAT1 GpU3St*MEr0:W]o  fpx<31Lhfx՜$ߐPJTm6KCdUͰn,DP9Q n 3f[n;Z+-AU!MA$jJ/!~VHEj+c lY2fVz_ijTq G;&`\wH>VLR KTrd%Ϩ/1hoϣT͑cu,бd M'8SNؓCEsiݷu^#-"TZaϩh|i䤞>pFajg%Ք7 REQ4ML-$gyi ex96=9?*;X Lݧe{RXnã<{8D>ֺ6/L&xA>ZW:Ϙ1c w'IK<\Ez lS bͼ쪥U+Lcrn~2\!7ze(*mjս\eoBş9B7 O@AL*2KE[ bRtרE3LaS@|)$ĪVMuI#5E:'bMaJ-̪6P׳T_-TI:|3R֚xꫢ$V)_Qņi+0#Ž|CTu9BkԽb„EkoE,l{نȾC*'k>@ Zϓ<6]==`&3f̨pޥNeuUJL-jf7zz^|&&* 9+Y\`&odԘyfjiZй V{ Gmh ц[`6ɯݹwV˰\0TJ~z.) qG{ p TR9tH"z+/͑p;pLJ!f&ryX_D+9ق[D\dd_fi`"l,qfu0,!ֵx;;`3'oUd!5̺ 6<+`n#(ע8ehL6;gV"*5zxƌ3ֈ3zfn 5NZlMTdFN@¢ FEՆ##$uQ^^1@-1X i@)B;yn*vγfxgORdOȁkkJZ'JP-V+ ruXY~K1ZDLt֝BhfUzK ZU筬!J̲NA5P ++4y/ot/q›vYWY2b*Nx6Cʆҩ/=]5Mc[:Qo"@~u>qRsyԙ&31c9ҝx?Y/mԫhTJ[ƒ0hX3BCd"m82@tS512;rp hnJ2U PQì]|r@>tKRggf'K5eAtur,lsr!R@2/|(cKz\涓wB03g]Ll9;ZI'Q"T`Xlr*$,h;JKS\#%ґPvZ6 ,:šʂ->6l+;R\r+y,`s$v3[" 뜷!"1|nDEPSK^{Lh ۆAT+Ő~^@۶1>5prymdV퇘2gX'g3S'՚e`YSO\HiN M.髚 Ucu0-C}Ǣ, CX&kJϨڞҦ.I5p1LȞWרj^NN 3d g#Dtc }((F_. ِTQKL5N9IĻ ;﮲[ Cd*VLjp=K m%ҤWՊj\u\esZeDZjSZ/Ϙ10Mހ2aN[ۓc l 9 sƈHۄSce^"Lj*e_|` 86#zha]Sv(RaX! Ihoo/6- HpDs6oPogdCSn;^vfDÚ栞BR9$s!wZOc@ao;JGj+6ç\dI̴EaҌl2d Z~d}RzE&OglmHNƪR[.ianVeX-"y xƌsGIv?=ͦ׹昨,uId`ˌk@b@'ͫK|16H=e1L8"2,Uzl(k5J'*-IVA\RkPШ>בoBR׈GYy@SHhփe:Uȶ\ ݩ2?sD oaҰ4&@N!5ztL˞jjQ+EȂ R29m ZbʛT؝~53f'̓$T33y  YFJtuB897iPQT08s`#h8v82;*WW4XWƬxEb}}X~^M9qm^&J}Ev-ɭYշU^o:oڮ(.o/ag =K]HX990QIxMOJ+gҥz3aq9^RtTw9`%+΄afc08kA$B57Qǒ 2т4Ȝ^fkrieZOfNԈ]G'cxƌsţuTZKd'fA G'veVQ 5r"b#&vS`٘sOhų3lV5BS Y#.&}Yy XWX~d<-6ϟyft4OMҩ86,A5 :9\]𐐩h$̺̘\ma}^n-0, Tu-12c6 6=FbDk1$y1mp^M@-mM;O30spfsr*fJ8m8Y{u: #_kz*xƌs+˧.ߑ*BMt4+ 'qǦۃ<8Uʱrp[KJl=T@$-M`i/`jz%W̿mEʠۇ0>9[J€h"8X_-/.]0fIۑsF̉GA]ZQ vbU݉LGꈽA 'aG,5:n9[82 W:t-p"3KF'Ǯ>QpH>P:[뙒gVumfeNUZJ'[OEg;z## tM6‘2[wh>\3n\ϩ堖b_DJ 5!L:4D//ÎzJyb{Q 1P #gTsxBzLx zm(>);=ǪnI-N[Z-ùDksF S-X0y0k]Ѻl+sv>GPu>zjavP!O 3f̘q[VglcU; {cwAOB1-*lr{5HhY9BQ>ՀgZ wvwF2Qng8 V̬D[~0@ʅO@^~ޜR!2 v̗]ݖGa\}Q:aO`h3t'"NDA^>?"ȇD"0q#7EYP&]~~ It#=6P7UI.R&l4I3p'9RfN<tVMӤpP3xCwJcBwnL ϱWݰYo Lػi뷆$m>UOXBEUٖɕ'}&3f66U2IBL.\'IoZV+qؚ2xRme@ܡZj"[|6E lA}ıga[zrHPb&On)B9iٖn̥{ϙ*9ᵆI|vaV}i= KK4̤ k-eTful#90±St})qe FݏmH v$f̘q YkB7Cn-~x19,TEtn}7r,o=K@?x{CxΆ1wH֮h3,nZfa"Qn{|qDcx`XCP!DeX7ُl+j/ԖuFB/p'sӗ m ŏ¿SHwH^k5<}>ڢ,P6J|w.DFDs k6ɪ\>v3&Ɖ IDATj YkN#̲6ƇKcX6sc|Ib[  0?]_%Kig 3fRl]w{a'Sa4#r !ʭ%qk(ܢմI 2qa"Iw]M .Cm?YERq'0 &v4-%V(_{(ZK'ˍvA!i)GI.n~1,ĠrֱI"boqeo5JJ2O=1m­X"o3Jl wܥ3iVlyƽd޴[Qca~=(L&hƌFt\HZKD%J1P*N,fP,+ )1anJm4 n-,Ê^bBߵ(3|3Fe0{ꏍU]ᆋ'QկJq$g'ٰmm"6z 3B|Ϙqt/TGV)4`K[vx1EL/Tvv7M mdq;dz I_؎ GQ񝢞_nK2־Ɣ˜&(8 o]D;z30@wftݠE/PeߤdY rI[k,̜UrҥjTiUzWq,w`&Lg8WyEKDNaP ~8PXgj|Btg8˜8,UTwh[F9k{jjJ3D}]1řr1詡ED_}uÈ5I2Nt]zè9!YN'H4 zYBR"uWj4ex A8~,t2Q)ۘ1c$^Cg7D{YjZVw ] xiƌsIG\9\/WMZIBNLu_t6 -_] ] Zw_ef7 ;W1w"n] J$ȕ >9,z,m55G KuV%4Q(n)Kf:QuUIqDŘ>o&{ %Ub n)ڗFߙ,/ ^ [n((u0d :N5& 3f̘ ={U?9 gYPiZYB]]%ܮeԆ!KkV-I}W^ho3eS2@ h V(~c1]Of Cí(M*6"?̌[ .8},S 0VrN5=%td^?MEcJ6|όjgOD!Qdљ䪘1c4蟅8+Z.jNoCBH Okt{ 6f')LT%``[-sXlC5dd$&1kق-ز;XnpA:&/VjfI/miHkl%$Є]<.U'1Ϧ->PZmyRuR44;PS68+l SPhK&wjWEGﮟnvf8v5咽{P[XܫZVlTV: 3&l]%|['Ҙ ێ m\]=:aE%We,sU["y6AXg^~NZ?SNX`FsMc"u4=sw~R ͧ8`x_wda,-ݱ6ʊ}A@²O9>RwMWHS`www9[:y>)) z\_* UtZgL|3sBWGkrHM-5Z8 1ZڪG^6>̒zyvr֦~)iKx`&3f̘gl~@mX#;3wr0*n\΂a@ w=R;kjlk [baA݌-//?v@-_U$x\a-HuP$jiKe|{B wwwᄅ$ѣGv8cv J42T'h{Cl0j^N"*N%V`1>]b5D_MVsڔ:})[<ut;\Ճp<3~>9IBJX_-"Je5W;3 MND ci}eG+e/&mpuY_R~e~ymT#e8 h X1™5OU#p%UI$5;[ްac(dc̈́wyG p`o-$:$7NygI=m3( [ ) ͝VcXk{\3Mj-%edo|xƌ k"3Jh5)(Qg>5VX[Yu(c$~ ?'YP#Fo>YVadv־Qsڰvis44;u&=uC3a|(!tTm1[ }C1ɬڸIJ[ cgiSz{D(4԰Z!"I:% {+Y&V߾G'31-(MEB[j <@ϘqbcMyMz}}ItJHIĢ  Ɏ`UVb֖[f6 0e;df7!#}ͼ'pmγ 3f8G32Wff&e ҽDƍ(|*lG[GbTQ%0k6EO=wm~w4/|vAhSd'OZ):L zZ7V{Br5dvqiks fv"[X/RegIm[w[IٺG2, F77R/<f [Zun`q9X:AYDiG )* 8X.KBzߥO:!Ȭnh5u`ӟ1b=`,퉛CϪ>3k2ܹ}w}ɓ[+رcFUo~afID5/qQ/ TOYGwÜIe/ d#jKD,Pnk-elL;kт[Ӱh_,ߤ,."Gߢ>3` Lܫ #jP޻j[, "#׭C`޼?P`VX]Vf68>p2ЬJ;LMS/oв|tlDuZ5VLO wkSV}ʼn0siPϣ,h&z g3[ gik*bQu 9R{.C NVGd4ϲQT"zpܦa.BA5Ȼu ~3hsD п8U>#G>"פ@n~9 eäYVt|lˎ~s~E…vc[+[pIz6@ebXQ_8QAXuU13D6C ' M*q3&V?Ur^lo~Q< gU29|6Q60zރd_ W{L o_g *Z Fs Ӊ' _ 1 0@ >Yx0%RWOv)MU u/ g0)DC*:]UtQ˱L8۷VՊXY9dxƌro>3a"կAi&2U7z? b qX9T}KD;1`)FmhcZÀN%`<&ݳ]]7m^u 1 fۏX=xa j!3|>=mCD}n}lW4*ٹ0ke6d2 SKˀ1&#>5y ߶1FcqW4me0 CLa^]"ȷm"WKRS1xƌ3ROkx{8wf3.62EKDd K:S؛~etƁ'{fn%VEgY9؇%G8 vrb@Wn3aB,UTlƷ$T~5&Qy3E\s6[Ha (ҹ-:8ճuu鸣@zN,![~g),"2@$KrJX \BVVYOI5s HCN!2Av>oG@8{{{3CxE.:xn[ [?Lh mzYI!wIӽwbKԕUZwl_H/ n_Xjd.FXee2-3fl]#`]gԸ9 #?&O˾xx6?QI9ix/oJ0$}x48+m^nX$03JX"W\oK!ֆdMhUCGBZ + M6z\uE3j@MnbPtT́»N+;pf"CN.“;7:uj^j8vwwN:gG-Gvm_PUɷTg%dmP2n'LamŦzGl]e=hm Ynw_%"Ư 6%|Bٜ< &K;x+-3f07ߤi`&eO)e!JX70$ ÔʐDFO6ј'y vYi*3N0V\JC~{bmw/iRL̤KO:#!ã`,}yl`?aۢ]xO81O]N:u}=ُdڪoz*΅.@P'K+Dhx&Pa--uHWġ/a~&N*Z%(g0)kns}Dx,IH !'}P'̨,-Ofwlȱ$&R|K~,%1& +6R}Ə"NP2au2Xv1ږXX- .‹A㥋<)rR3^v <]|Jc719;|g+?O1:uop0L0WZ.tyfI})5ATLU9c@곇 2 2mە=mJϘ1c$4"\ |3Y٬c -OoRLCUWXWVbu!bF+[nC>6`Cȧf̑fE %uS_DCO+=O BlYnۛ>M%g uȹ"|8,>^/3!.,}e I%ןN%3*dFc&3fbll]Mh`zNҽdDS36ãҝ;xB,#Ϙ[0󣷰#:PJNaX~ C6o㪵PjU[q<@Z, .BZYX""2&~CƟd^˯Q4aUg~ZXKsmZa\d .StDx&7>ΰ)t_q+S2?y晶m%k3g<~=h{gϜ9s̙g}v?nc>=\Wkӧ{dWvg5Kh-Xِlc d 'gmxe)'nek,hpR|:AOLq__o :o|w<xƌCiH۞30A.;i c^fr(KZ%8$vuTgds1Ù/8d%VDV&%pNuP72[#C;)ҡ[RBXIh$h a=!S:Pjnakm(+CnO"GvkU6v @n dƽ;OB~z'ꪫn뮻.$z/ˏ>7oꫯ"_>3ψ3g\/O<#c<ȗo5yMe}Ǐ;v"Y]Zc{;ڼcYd!;F▌%Mi\|UCzp^䗧 #+pd(vbM2anf 3f,n/w\tcE3yd/@v!!6Ć,n-֝l-0PĖ;:;nM\-oyX aN=Mb9?;w A Qd'9n+ykgio:3؁8nmRp6cooou'7C%\rm˿KF۶_~|#<2<q??O}g W}ٿ8y>|+'w~eÿ~@R{{{իaC4r֐mDC;Ξ4骙* :vG%*mciF>%X"6  `Z-NMMҙ}5d og[bH`7t~4m۶m23[bKbfc,[ր93fl6&Yi&K稸KĐ0%$pr$*x1PW%ę#+ 9E/™8 ! !_Ui]]ro#w^PKܪspR d h\F$iZLSylmLG=s 7~+cǎ]7k}|̙3_~_W~K|5׼ o;^җ ^m{u]wמ>}'!io7PO$}7t77+Agc- U qWR B>UI6efyLcqO7,sdJ7/iއ0e:#"YϘq8$! DIJO\@ nVVmjs[TJ$rba}؂DՐ#yU^*'X̭ f8= 8P22nVIw>{WVQF>EǁF*ä>~rc.Fa[>pr"±P*z{5mg?ٻַկ./ ox[x? ફE]tW}{ses=wnۻꪫ7Uk^z5<VyK^r/F [ K[> UԓskHéJ\9gդ'DD'e=Ɓ)T( m) 8j5h:G`5X; Jk"6 Ů`{ R,QI$,*ISlt"wYFwV:;Hza:_ʦ:t񕞌QÇm^Nef^eE(pPԻD RmdH:l NH*!͊+.,zW+C/O|{.z뭯|+?Oy7xVV"|+O<ę3g9ruU7M;G>r-u{g?яk^ooe/}K>}k_ӧ^D"αƘzwvv^]r%꫉+8rjXG`Cn]脋ڸǁc,~ak)4IKc漘W_isLj06~,)Q>RL<13VŖ'T55bP]Y"ǘ5 =c?OOoS.*]x{챯;;;}c7~'̙3n;~}_\ǟz_kk7x?__W~ԩSw}C?C_wtMAWWox~;7 /qcW_-xKAy$9k|K#Mh\TLL:V+ K]n:_ Ϲ $׾y{'z!kё#G9r/}1=O}s%<3a6W^3ã1W]u鲮gc3fCUvlrU co0?Ls6&۴[@Tɧk7qAlRDdY2D)g5y pϘqX8+$vYb8|/Z-Vh[qcA~軖\L4oo@XԄ93VƐdQf@5uY2Y񌆫Uƌ!)6gJTQ彵.GՕIFe{+ǏKM<_e Pb {mWҗ.^9cWdw~͗Yh=<=Fh8j՜t %֚H,jM^د !kg9n !068y+ 6d(0_У(nJ SIC;I`w !LZ&_Mj_b?֟+D@q^nʞXb{/S%-$FؒªxDQk6R0U8g~/뮻5ֲ*{3zUecLS5e̿V#!!ԙaj%U6H( 4Cc$H06cllj<Ʈw9+_qΎ5?VDͬt*k߽#V__}ӛ^z饫Wxgk׮} __{~mmmUU}w~w\~˓ʕ+/d'']駟[Ԯ}O~NKqعJV_64WDiZ]s/#oa IDAT2ME-qĖ?P9Tak=<^@ 4jX4t6xb(1MH0y6ebA]o|z׻|{ _—g>oxsO>9__~^w}C7nx'=yOoxG;~^~g~go%ȏwO|xᇿ{|;l|'???O|C?Cʕ+7666n'OWlIu gϞ}/ޓ^j!u; uOqP2e*-A|q /cvhX$@lZa7dasVٖ]m^Ц5^Ӛfdcb5;AެPK͔i T_?/qk^؏ػ766?}眦.{N6775h#իW=GyN:uonnj$w=sNR???!"N"39c#ډ˸Xca|!cDF?:>ϰ9K$!;DZrmVeɔ,ծs t q"eK}hU5(?0[-}%YVgYwU} b''~]h)$bkBZoPY\ c85Pd i AwZXZ2~Z; Q|a6!;Sȯ\@KGwqwd2i;n"JV 05Ûwo<[y$cӤ9LFQxIЈc")dQ"{ B"#J#ەoMBVn}e3M *؂ɾcX}۔m5Y 08ge? hR+nYJ?S]=NoOnXDڰ+M˱2᯺ߢ6$i"3/*x@d3uRXu<P {-)I;맾2Ŧ<>3^6f^)͟4G6Ea>sQ;έbHE>3-%C̺cY(#503eE1C5^Ӛִ5&SO?|]קNG޻:|ӟZ<I@2K^TH`;Ah,&˰}hD5;O(ÀzJAÒIxOƠ(Ѣf2*pzj, 42xM !">?<\}m2eIپmw9b~S SX? 6AH{_q^& .08,@ FpN4ܾNB -IYr\ 3]WwVmc*_;gOk4z _}f%"zRn,/I(kZM[uluX̤YH0ٕ44W:kؙkםkujNyu>"+.?tEi||M_;S~0LdP9A5$*Ǒؤ'jȴvp WyZ* $*p5hHNEjCW9>~dsL뵚I-[dь% @J 2 yb&Q5LCTDE? ?NCVjWX/񘊫j)WY8q:عʥrJ0.E=~$`VHǭf(JOZc$[t;zkSzS jPQZo>h\Ӓx9]FX%6 2J oMcZZ0aQT\"i*RտY{"Up#**_d98괂c-C_OF '©G]TC^kG+Ib"*+)1 6rсF_;4L H̳9 UYjؗ,=*E" WJzIbj8JC5Ug? ;܎-5zt5p19{bt!̸}% =Vx/=#I5atz=STEAE&Sv+;_hyWb_{9\_r"*T`\sLmW&g\[F `UfweJsN킉Ic``1}:5{k ќk:&$~‡%"9::/^;K!+UzSgG>R1ibF=&6ڒ Ir 7.Y97rnԎmsjιQMeYQ5^Ӛ^-ta@Qt&ǀR@zY`_YRfZ9}+Wg/"(k  P%|r3h+H}[rC#-ĀH*^(ߴ/Q:*qٳgϪK.iZS5>hd)4]?sm E Q1Nfy@.<#4KPh`;m'cg."!'JCi ״^W]̝ <̧t^+e^1KJ&2PV f3W{ŘV s[Yh\zµU/fǪH؂*Pڄ\Pwgw#/)V9zEƹ"#XI&p\g:uW2:.fJq'^)a+@'4aE$m̿l\I(rkQŶi!c>|pkZb_%R:AZ6sH]`%hѲ (5\ĬG\h9ՍY<@`ww6s;Xn ‹z ״515iyo/} sf/HBjlxmDѼupP 1v;(d2bͼґ`I€_͞N lf+L>ӈ넝gME.; H?Cx:&r4,3/?~~ ԡU-E2 !+M;gr\qvJMֲ=_(|*:Cn5ي@֩Q]Q״['/yK"fdy-t Z;B+/k& 9O{looG;WeD6-I6ja+89w:H*r5]$O88YyAQS;u0V51RneusέsQ?-Gg!jzɴJ`^ {2"d&apfa8YLgd_F@1z~Z5od bXJp}ݬ IWs1ը~+:ث Z\_K,3W*uU'w=ჿ@FJG"ܒe /Z@)H% rN;?8Z-H+Ι]jfYXJ@I.zuAAFvnV 24H2M^p yj (BF)bS)*ۢi.\aFPAzqG';.^xܹs=a^tҥsx7,id 9q EJS& /εR5UZ2ĆVĕW7Ԋb¶!4EKwиEÙ>J qad:a_Ϫh5V lVmOӤ ?1AA gie p^.ϒVŧvjkr"Y hda#MYAŶ0iiLH77\)Sduh7^is^yb9tt\)CA]#^ oS;F,0p0{zcMЬXULD44mMy;R4Yz_xqxvJ[L8cRkI[]:ök${YbĢoN AEА)G29)ɩu}*]!4X}fxMkh@D[2 -P8+^b80u^: >Yq6zԩS{woyh8z0CS.~$(1f#"++KhZ@j"бZK_ F6 {Gyd &`iW%M }r UJx>*9{)F%Fqs'e(E6JUh;o!GM2"^i\{5@QVDN R2@-( +"}Q,tfŋ/UNΝtg(ĈMB]=D;H9RA(>nDD7>@ӳ2Ihv^GxQ,bu1SxQދ@0@D0긠p~J+aU p#ċG*L;zY"JQN՞kxMkZӚִL\~7DӟL? k;@R02D4{P 1M)2/HVAWz>dx.!K~8Gf ":DNag%*FNcl]-ZOzR@.tNZ[= *q@>j_ IS'F#Jv^Ӛ‹(߂--NVע\Y KLGAz_λO0t6ܶTDE迌w: Tp+D}N脮S}#9"G΍s wCS"CE zQ<,3+~@qYbb:Sk-Z3?i<8 j) ?sN[8H(ÕlL%=1t&;i0Otsu9!UӷHkG]BI?~=|ޣi]/4}UhN aYTM3u3uQ͎т +I8eӉ.䊛OZL:4 Lk h.9x;ӴXXC '(d[,_o'@Z `Yɤ:E ~57ҠgU8c+Dķ#=O<q>~:sKWΑ>mQCq7F)j8xڙNHd7`,Í`k^3,27hѷHb)*cEϢ2ZO]ppB ; Ӈ t ^>.z tӷF$Dy7w|J*Z528gMV\ia;j֧j{ӧv*Eapvd]O'8m-x }jUP+`k-%[qƬ㟠Ťl7g\`Յ_FtHI1I˷e)Xi#B徏4TZFG=q)e'#yS`Jx#۴7љqvBH&/?ut lrG!_]:z$M3Tc4\Udgb\#ե&6,Y4z3 ƛP 2:6tRyN!Sb tiQb?ҡ3vdwGw@a>ţx.Ph:|7>~ǹ*z͍H ,y)˪p.5ĉs*`hlR3P1FXOԔjk[Pγd% UЗKVeK.\H.~nڕ-1wL0q,[1ؒn~={ܹ/?~I/;J߳g6y}Թ3dzS1Ҹ ZjMX8aJÂTI ;@:h;ŶqFSӂO4tx53C,RҚ DC#c c:{~#N ̥jp@]%iE,ej;WvQ:7x+}>k dlg'M n)ԃ+:kq3E;Mg\c_9 IDAT$&I!+3ֶh_\;M&,,dSx] /M% rlePH=&Hci,! f#WZS^4iJ;ML.P#:*'<^:xD@@) dV4F?NU%o/^pҥK-.\xG۳( ʉ̬HfN2ڄӒMU>QH4@YHFgnڄ0N5L-"=@/]$]"G0ľҩ!^D{SKE66}DR`uKiMsGoM\qlI hJ/a,}D6጖ U,.Э9WBG|0uupE)D)S1g%Q6/dL$0(|S='*oZTѣ`cIND'IP| gS`E$@=fkdVgŐM=QY_z VJ܊RFNB*Pl.ka*^lRq֕#@M{hL]gֳ :ic =؇o 2 Mı'>/҈%DӠABF:dI"+O[xӃ??L{/imS4NNk <ҹuCvP6>jDgq "AY7SHkPU8y4SF%ڃ%+#DJ1JD\d@)Yb{ 'TaN9u^PH!= J*69瀴yixMj],Wt<wgi8\th)){LR+p5fpMf[$`\pyZu/:$$$A9ZuWӑ-cɫZ:&>zF"9"=ɰVJ cuO@t0&@:bۮg'H1nD!K䣍m=Z9-趍m)lA H.6'ltp[T63;VV4ܹsϟg.֧G}d7ZzߝC+MDivH 3_uk3@4ڕGiYo4 T]6p*e(WP/Ɍ,ƊDiy˚ִhb R%hz^2O]y]+0o)[{nFHUU Sj/l<$ (DX˛*5}L +Q*;+i=ԑu0m kBG@suZڔCBI.XRt[w]^U/eUTo߲# | .rэShlԦuMC sk`HZDΈ̿e| K.]tI/]t~ڇu{F}WMa 6Vp:i!θsed.tC.٫)~4qGR#^[#7 ZZ?KGgؙQ~<%B2˂JiƼÉ90;Є H @"ߚ a",H'ö,/.ڥާ4SbATL' QUjVcB%i"6 Ymj IVs[5@K5u{rHAZJGm-iZfdN,me U%ߙUbZ58{ŋ:7M/>ΝS 0609t-JmxlǘQߔO lf1h[NtM{˼WLQA~jc}b^v!5()tӵ]:Ź3١LV^.f@ KYx[Zαڥ ?Ѝ:6=ϳyi.1oC9TNB~Ս3ڧKPgC+"8FGqq;kU{OjiΫDASמ\Yј$tזb8%=#Bs ]SR63ٮ|G7 \k i_{Yԝեf= 7Z7g{J>69>hKLW[}B6 j"^k[+l8T\ZQΞIDd=*Nf -~`|߿ӳg&Hj~ۊmO<᷿OhUޚVsi=~J<Sؙ3^I )F勬U*"V!%m>}cWd^f-7[1nfg?(H81 ´iM>ЌY^M&iKZ]'-eh uUH̛ᜥL}3e^@U@G1zI4~ {^3l6ל$.=̰79JaX9V'XwN0rR+<;Fj,VpbYO>l'i0SFڕuȕ'f@lMnQN_QLY^eTFA(`+S'3^*] iHU䲪wiIX6ZlÄB~nzit Y]/\vݏO08/\g#U &W;خf.DW*1/B1E$ {њMmg.p/ a$"*ReӚF .*)n.V7kzuI,BOC蓫P/Xf_Ǽ/n34V*D;KR5yVZ@jzUwSG4X%q*L.8kBڥOBAӔVm靓BVqoYZ g䯻>gΊ{ HW~JyRf$X` ΊzyӸPgX(@]{dk2Yv $6_~ 젶4j0pZTDjbِ ~Ψ]UiMkhV֬՚:GxOq+(^$U4k:qjR֎16:)ISK>y%HA0ӫ Vz} j 1IYp5X1V"RC>h.f*Q.h " Ы4L|1]Ϳhs%N#(JN|; &r/M&jDh487B'2z:c){jP#F]5'4ܹptӁU s܌Sz>4In=ߙ Q{mYc97AC~/^D\M؆pDx8T{Ϟ=,7cX""p{:F/ +wlo'\Wt= V醼ցCk$DЗfrЀP 7;Y(H"yAON*a>:#lqkO p/BADVT̟eaZ5Ho+6y,Ӿd`u2l3t,L3_~^,SC$ār&a3QZ犌B_@6v9D[(#fW֠'ќ8l^H+DoW)(6 Kc561I4mn9(Zrz*)` qB[2{ik_ǣAsJܠD#X!ѧ4&V$:HpƋ2>G<@ߘ3k-T.$\} cyc>(ƻ g6gϞM"7Oc7 &AQ+ &_>m2I>/(VX(:r }C̒2GMADtM ֠ 0@TWVKPwAWua3ڤ#´kZS7lXq6b,ۣT9]Krt~:L>GY+@emZ݃IgF.jٽ@[9V="]ΪmRG y@H@o&u x:YRi7"cF@0k0֔Em8YM9zq hS$Yޑrv`SJ }CUfp?j/H@[WgPQj8b:I\ӌΟ?c>h#":-w_Dcv7סּx ҈ jOA™mյI`?s0jJ )CF/#qm̘"{8w HrQn?Kq\-mWƴ]Ju:5^Ӛ:h. J\.g%"cOW}`76ur($:Ym$(5HoG$E*Q,ӅSTSs+}S҂CDxf֩3*QG[^_ѼnmȪh6Q$QQgH)g#:waS}2LFFi6P.%OVynZ7myRМ:/޴(PHEPһ֝M/oYFQۛĦ<'"ԄI$Bak"':,V)YcҲ^ʹl:ܞ$ "F0PeUuYv}"wI ej&>UPJOn8Cv7sm®iJ\)?FA%0FidiAv9fdF뤇i"'O|Az=Uc] Q%5<ؠř:{k1r.y!C\;Ӱ)seff @{ t- mUX-%{4I\%1ߊk5-HNTĶr?=cR[ "6(Ah+0{#r]Zs{:e U#%!UG92,eQq4fṄY\x^Ig$v2M9h3ۇ)b JY<3 wTudVxbiMjQC0?iˮ'}7\xw~r GV :7;cAGM}e{`ry]0'>9ft50ڸ5h; |xpmnru彯Zao{BȄ$}Mr ܨ*8Fqj/#[~y`|vD=tj It48UIVY4 dF2*L%Ii9hZ42vPˁs?i5ִ[f_W(%w`".RF4[sa2y @;L< ๪tS8>Ko{<>O? u?>JZ mad! g-\5=$)u^aگׄZMDޕК%ss3usک&cs]e8 }qUN=駑4IάLѰPgx<{lǨ'L%XY˱ Ö c"6e;ʫcٮ]z#( A-Q;bIͶΒ|uw I=M&kէTU]tppFT/87f~c|b2}ͭ͝]~oް?Mv[˨ۇРۗKQ8aQ2$3ɠOQYGl1١ GxsMS+TT@?_u]OIF#`9j|L´ ټ=ӍƌǃyldCD8*2:{"j}1ùfٗҙP&Ab#=g; PY73qF_q0u$ÍxZnpW"z{S{2,V8B)glMOq IDATa b31(4ow= 㖀+dݼ)ݯHĦJ%GP@}[40 ,`v1tu^V 惲[ڵk=XU v [[[`www2t4ƈc_UcmU媪2}'ld/  d*1p~5[͋o0X5k TI*ʋ^Suu] @'"2hHP>hjHPF誂]& `^D|c!a: RœˆH j.f4 Q`߬^;YՉkEk@Ĝ!.֬gm_xMkZӱt״Q4dFGh83#)4JS2= U-񨐜Ħ, da0*#c&lQt2 k2J7mo',&)yvHFmuNa]X.ZnG>+.Imބhþ>"5P,6T{h3jx٣ڔ=5)idc>m}8W9'Ʉ+'3}2*J9 7b|Zb11H"mxtyCòN׃tիW\qIOOU9'd@rUUP=ll퍍'Nlmmmlrn*V_esWa^zÐ@RO.Wk١P 1r^D,+ӟ:V7ąCC `:SVj2g~g}vwvDD!>Si9B8;9簿?'N8qbksv66N<9FjT9|'"{X%sdn;feC4ӎ\鎈{(lGh kD{}Ŧx`Y# h%KIf$ŗt %)W ɵGT4ÿA/y ']8ț[ˣ.b.ҰmrzyZk5BGJÁd,RD'z0Gsu=hǤٟHST%$vb $h۪ED ! " ӮI5m3Bb՛>bȢp3U*ǂ5J%{} jA}`YR):+NvAhcccoo_u]:u np?/h2xĉ;;;vx<0b]7s_j(/g)'c@<Ϙ uP0ىPԟ GQbz&ɪ<էx}˻SOtBsa}CUUqյݪկnmmmoo9s֖h4DRl+_'+XvݺҼvgDACwr\DRͤӗUasY%fU2/ԮP Bm;D4Ttړ`ށi`:!9r%=90{Q}ۙ_sxccӍ\4p4;[+q@}Q_)*.,QwIUr>=ޏKǛQ!faj H s2hAzv%Q*B_xMkPVa9\sX2{Or?~g,yJ\{G7)'J OU4F?U\/Sp +669[U՜\_7d8 ER1d8lStjMV"'.n'S"W4?i/'"B>6M} Þ71^ax.h!^<AOdenp' S<>*&&p^OBԕ:_цux<>88ǻ7nܘN׮]L&~sۧv666XU'vvv4t:uFsg~+D{?j,z4z^XHVZW*>@whT"H=8]l#Lz YaZ /Գ5V N`Z5'EEJ^6\T4S03Dʮp*:܈v|/wy]w9qbs\U 9h'K5g'^T'a|7̋ Ow x:1 ͎7W*Aky|CQ5g2<&_G""/Tl"6[pǡHz""΍H ݧKkW-,iY4O jmn%z@jb.vzlug1e\爺}@UUP4ẋLtAoA'2ۯ -#RB-kRN@r )\9 ݡ$XyZ^7d.Wa[juٱ4u7+d%=}MFu rc452';K\^ѾMv_<N8q{p*h77?ГfwoW#*U%'N_ͅ~9s˝\%Jёx;ay%5ϛNBϨ:rQ?$zG(҅䘚8R*.(E4tI0I~bK>q1 "-$ = \^5tr#FsgX;89.).pm֥"Yt⼣eU`Jp (l`իs=SG7M{gΜڟN&xKE Dr4r{kz:^ DQ-.!a>_cxHt?yjOB/*1׈wS0&t48j9!5L&^2Kw"{uL8k+18\EԜ`; ]cDq]Y]1y3gμ5wOoo ::tS!FC,-}j™uCĎ/G9zDvp)rMk6Z`(\j0pdӡ3kzʥT ]s:@/{ߘ:4߫stpܤF~o`9ɍ۶vݿUDUuR;퐈1f5!WFj8KzF$Ԍbԩ ugUztZk/ zZWtq~u/Eķp^lCxz*&.9@/N /]ʵ_Ή G=v=IZjT+dp *ߘXlJξ e45V\Hbq>D2 4xMkZӪiiH*]͊5+L;Qhm(sSH@d N´̑?ܻxcO C0-%j` Iۘ>/T$H%[s+Hbs]#p,1v2}2:>B|wylU kepVTr<;TiT43ج[x yOxe͛׮~ 'v궝'6w`:p{$ck뤈Ե\]wu޷{U%TT P;Mq@|Nw:4I䑇q~ S (8`ԅ f5#c~B$$+;t}﷪{8uNU}oB|w^V}t$Zk+bfVk4r@UDd Fp]U_W 5:" "`b2(U/3,]ZY^\߱m˶.)J #H,ƒriRZ( 8aP~zis*Ž5&ydauA.)k!) zR~/׼hD#шFoF(ȀIcf^ [_C!PG]82 t1IX`IO,Dka)U%Mx?ZA;,~uE& I y}B4u5_|`BQ(`S8/lO%9&*PhJ鐛Axf)WmyU"xbuɰc/֔֝.Vmwګ'6=r}fwllW&~d>~7^k%} ZitN9b "- RM?j ׫xUBQ்|~ú{.ݘ mmH ~wK8s |$B@^f0Cj1& p.(B"Y6A# AkB4̙Ud[X/%;wl8R95"$ Yc49Y VF 04NIa0_]&BT\4RKUc놟i슫_F4hD#@z{5%`]2'6xsJ GS] "<+J*+ALSx ե2\rt NFH "%ƙ <)8K5r`HO7MghWmgb!3*FVkg=,?ztV8^.GϞMzFą3V 83q_t gSGN'+c[7v0DnIw9_˿gfQQbZ֤IXk-R"dN]q%'NؤBS N>U>sUTJ50SO’+=rofR~*iH;s "c ce5̐k1ls (P1 bra*rmmKIQJgVjr+eㆶ lR) R<6gY:wG5:`VrtH @ Xj޿ v֚R2;$g9߿s;:z(7W<hD#шȹze&&lS(!nC>_gc$"t/zmΰf[JMk>4)\E׀va9kpz[+-p 7 yNA@2A;w/[!_M[ŝfǝ;UEr3iLҐgx_եSqgI:;=cNfZٹg>{_k-[f#uϷ]vuwKv5oɦ'JQRciڭSN,ΟV<cB<ֿn %ʈ>1TV`@|i IDATU7@ꁈ~:P6 J&˵՗{ĉ$I!I~jŔ [u"ދ8/)IV$/Num̤J)Db#Ʀn:n^o%z[7mhkEPJltbŠ#ޘ&td N(dn,2"3N3h8vUĊxߪ滀 !$+XIeD_UQ "B>U]V ) 5s]KUW~'2"b/W@`uˈT Dwٞ;/{͛6,;>5O8xcǎ:ql ̞_{篾;z\$L_Bmٴ'h.@ "E)`6mkZ$=g=>]]^,=]U[֭Ir[b&0XZr ي)BG`yp7Eo8ʕc/+w` nr #4%2ƀfubz؊;~>xd/KrLLfDD2̲;ZkL1 XaBK6݈ z岀 JLڕ)ɨ/D Es,QMdHY)eS12}qK\]>Ǫ҉ &6;?>x;_/B(S8!/Z/Mp/Up{| RF4hD# |yz |H*ADoj5t rr7̮9<rslhXjLԜ u`|<60`c S1/[ 6!["*aNJ0 tDmrr`cqQQf%#yaRP(001s!eʁ" L_ueDDN8YJvl(cYEWkw:cq23?xgߺユ#'fuLKzyI=:Ov]+&h0ZQr<)8bTgxť^?=|䙕^ou?>cvM6 C u3GQ6I(j-̯Xӹ0.~QAipjRYy[7QSmXl/4#шF4%rwe$A& .}uTAF%|3ws}T ( QINY18Ox8+@Z]\,o@w%Pcίs,׶ r=dҜe=ٵ (U4,S0V-W.X@P. KBk1p#e7,ۥ:|?9mŚ|D-j1QZijOtvF۶_p+3?:56jf:܉SW\%苎Uxw=#$"¨NoeYGvǎ^[ {s=cWV/{ڼz9j7_y OX7 (tZV7Hߞ`KoZ!ųRhmYm:tO/-,XdY9ef XCo]wSy  Q"$&XAgW +-F(БhOT*X+@+|͡HX5ZT X1-Л]kNG1tϚ:orYPډae iw^;v<}/;^|޽{w=;;ۘhD#w yA~iV $Tk E@UT }qlR,t 5B :tdT0b2X09A{AkA8ᇞ37c9|X368yDiO`d d׼rbaa:z|c{rlhW(֊1n[ke Im;cݱSg>C,)1qK-w;RM#W˟ͫ~hE~E G8T-UsMJ"PVfwR H9q?qF@6ˌngP+*ahLh#A?>L֞eS՝ln,*(^cH>PuaK~^-)0o߭SfB*l+fCm`*F5A[Y ކyl.6oT]Yo7~o'.,,mܸI^~_}wYƍseo??t7οnF4?58Q^;=v `h;qN~e"|qEĠ% ײ(q=yG:!!x5Vmdɼ |Ú]VU1)AuSGU&PPgL}2 uH RdSSb_0U/"O}G^r4ek&@ZTd2ۊ(MzZ#Rf7]áw7U=XcD) ƍ++(D*[%`$'4[鯬*;vw6/t-?|uwżBwcR>r#eSQu&!"Ztn|-o~s&sssO;;gM659yv//&Ccǎ;v+_ʛ&WWW?O00==oݬhD#w9y֘8.vXxYC`7%-m.%J.vÈzpo[IHs](`=D*eIoaID:Z9=gR{˖}?W^vC=$"nٲDQtYV;N5jeevJL)d̜)b ]d^ueoOۯłכ[ ÖeAaĠ: MXE\]B+1g!@?y}w뭷 L/0hD#N&$llVYTIc;\Hn9wY^AЅ`]! B#{5!5ML.Ɠ:%D%haنZ#R4fI+n(RI84]YY9;=;{x??vRVD@q@R/G p1E[X4 ^rd3C9zX7ƦlV2$R93QYDv`9)\/(nNRVțkFA@ c66ˬ.$zI1:KcJ[N{ gҕ%ucg& 6#`Eׄ]P7W &טڧ߬Q8"{(M\?L %mҹRjӦM׿5_,;r?299Wzk䝟?|{]vn~,?]d){N?>O|_Moz{"9Z?/~o6Zs׈F4軇"az "(H G0xi2D\$fa+)a)m"Rca!"<kf)EBnIHC C T`Ϫf/"R sFWU/"LD*Jv}$AA(CR\Ϡz@wW8eBT܄1HM4CdA%kXZWǨQ<~stQPIDx^p#"ޅXfn>W@ҤH~˅J ̛tLoMTc"0RZ'bKZP#d~u:̚ X&Tj8N-[f_W浯$Z9}̱c>S9B[6oްaÆx'oLu%4EƘZ9aW\qjGSd=SaBpBn@ /jU\(>`Oe֥%MAF^.AEZ\jG cLbf˖9"%U9pln9g*$ɬV"R #2!+ )4AR[wL03) ZDNj=ۊbjE$KMvvabL}4m"T!& ,Th!gT,fjuS[8x{YU$ Ҍhi/`nh ]\naf $@ew"Ƃ\XTXpD\ 8G Of-) 3|o0BC7/0,V.$: Ag;vlqqqaaO=cַΜ9V,#۷ϡ8T3ʛG}xO<_җo톉?oGn喍7i?~VWWo#Gs=KKK|So}[9?MLL}5hD#ш)D!(*@8 _$;6HUʷj#C~_qO8v`:K"u`H@\ sV Z`\J s搬c=Z \ܫ,"0!*\<$~ŠJl(VB&cu p EH`z-h$JfiZ=H?h4߻[:p;ll, o̙PXW!jEֆ鉱ɳgzݱNض8ҪŖ @d #yޱ㼗I<УzȁzIf9M`1Ǖ;Y@a)4;wR-"1!XV#`-<ۭ٩ֶm̄8JHf6^L%~M,}QU,SXD YNz9gV8aƠhDP84a{ł |(P!1Xg/" u rW&ˮ|xE̲^o 0<`-O#8ћBs2 ~btig>7>57}豧zj/}K^[oV^z׿-oqgg_WRܛ}c.ٳW~W#}я}c5@Q)>9rɓ'/LE?|+ԧv~__>ߤ?~]w_hD#w'5 (@Tyӡ\+J#z/Y{i WDdbdh \xM\c/,{t,ʖM\;f6nڼ#Mc}oa}K/EdlF)4lƊ+=HBDTTaKKO|L&Eb-elЖ\j9r @'T-݊A:7w]S)mgZY -IA m`K'67w::wly*^+!+0 Jx](ZՌϮmD1Q rF "%IbE$g#n3gX4Afg/HKg/}u߉qPҵV[u$,I pg/r bu9ѹ5\?߸w~zu~S,[ܴik_1>>O}o޷oynA IDAT{r{?xUWOOO5@ oxqַn_׽u_~}k/r=i}79u5e/{sssKKKkW1hD#Σ 0l˒ 4'U,"Vn!LW V;+pF }zά_TV5N![C@)\ $vf1>(C3OZ8vs`[Tn 쐛XbpHAf~~TkPYf*)  ` #4D9n6oUWl8׺3.{NNrO{v{fT;ǧأaLlQy 9ਸdKD d8u 3duEX(w4nIuaٞ|m "fIR*op3>6R gJ0AiESvNtZc r|t`Xw]fHn32E{4K-ĭ)Y9g1)MZ!p*0©6n&Arc%Q S6/U=܈/7"(F8Ry?\XkO.-//ߏ?v+/& 7qvݻw _|w{o?g>FޥӧO+=\yԩSEfǏ[kC[} 7/yK ,'I8kםv$#<hD#"*\*"澐Yfً9]-׾uP&4giR7jf (Be#Pi֠Bќ4hk` u-JsdC>X%gǃqOO<Vqm@at xna'>}|,j_vg֊6/i`YN{lffZ#VZIѣsss KIlsPt7C}*<֖QA6hD#E!誱54^eIDcqW6eR0n@]=Sk =zvjpC2`s50^r^LyTjIJ Yy#VM_RP5"M  9$+TH jn-! **Ni#f|nMhlaqG<~ FhPb[sZ=TJ)d@$ZEvv+F8urCGNz @fXNJy}^iff̣LWppYeXҼH"̅"=C85iZltO;w l߾}=:k]F4hDa0I霩H/E M\șSTjM`sN4aFw4X0r5EzT4C]L UؾT2^̽Nq̢@Iwx -7ŔܝZTBCDe|!Vg識7LFZkg ~jPiKD YmXW~ӳӝHX`33;ί=Wh[H;k{UCв *-H[Bi#P :E[Z@)$ɡǎ?O8LX+€kE@16?8 ETP5X+۽iu҆e{*PAʔڬi-hĀM:J,>oxyN,6%n (@M+,붧6LMGEL2қ6ic5#T7"8e^r3xfH*8{)䚗\0up˸ũ(mz׀U]+?]:7~ T>ΡK~,,{(r9gPd9Ƃ-p-\]j3*Xabvs ePZN0o=D~YFdzł7pJ]FDR8;ݍ`2l--N}׾dj2fZ1`0@ W]{o9/Ҍ$J)D"Ԋ6EB=qq5"#T{צƫN(_F@kEK N䴎MEջȲw߼i޽{7OW^933|#zիu>Ͼ[Vպ袋~~鳟l3-onۯ~?lڴi=F}Xw#шF48"W 0HWŠ"Tn>[%RּBI}#@YjTZuPӇ',A {ENa ?찧48 9p`ZA 6ȵeSJY#QzO?}$MM:EcEZkMhzX 85)Z;kmb2DtW;w:thO56ecR ZNtݺ!4p qXP.1,!T>;h..:u&lhÐƘk5\CswBl& I%fNb4Ѳ2H0, 0[F]=E%,lE{Ͽ]qe{޳gt=FEC8yfv%D,hVI@:kNPmׄEQlO , ?ҽw;V|3f8i]̿7.n3\y뮻v;t:z׻B0v>4?+jo}X_\k[шF4}7SH ia ρ^g6WL|#5 D h]5XK`؝\,ݬE 2x/za\}OA](/U’&[c\K4Ņ^n ^m`t't jbYD|ĉOXX\NMSO1V,z-fqF6 XH|"Z{ )=[n6&DQRc$Q*jDy?/>#/|$d()"c-fV]\-kSeHTT͌`˙ETJ YAuO [f6F5dl ^,&dR%$2iTjצDvM# h1c (Ą*SLɱm@] .[6u`Vaf@ZT[w[˲#QnYK߂Tke}xeĸS.oTk9qX [wW 'n6O>}/H#F4hD#$z|aH9gCDDU0fCJg7R$ei2@"zS: Jn yK(hTo{fYU;5i`aa06MWAl<6v*4%4Nmr~s@+nږwh}.}H(?p2%y8`hD#шFoL $-K s^7:vNRMƜ, A^jZac`Άi;+ vs 7KnДBXP6٤*q0ttsYHg* XgdqZߢU"f? \/wVc(6<41Ԧv6x@"BkX+$aD8F˽^I&VH#5‚lRD`2$ Eql DZNګ 4)kXtbkm-vX.cewEIiqQf b\ࣇ%If07qXQFWvnMkɲHIG :n%@FBmI88%4qs !(M[.x]FDJJD rMFPK7Lgea纊X JmvN_%rqs枃s5/RͳNO:rJ,/.v;ȎhD#ш;Zjք Iyr9V' >A 1xAۊ6kH`$sET!$N3,5\Qc]ǡAU`]ByfF4hDߝԄd!we=XFc]H8%(Zȳk쵔\U^nCE ٳM6L3# m).q."FVoMζ IDATE@ο!<,mr(dQ c\V9 X440RsNpj1˲c8b9 yΛ2"!)CD` &E63[jѬ&i?MY)>|䘊_N }IxueYk13C. _Kۑ@*v4u`>%h)BOџ%Vԉ^cX"Э++\z \zU{JfS:-mz-eaKJ"q.Y<ܶ\kܮZC, bPM!Ƨ({5*6πmD ~(j"*b‹Ď{&*!#gc?kݜ[w>k59NtL,h 48fE1Uw1H!F8oI0tJa0x:`^ q=ru`z8ޗ,Zb^}3C:n%[d6RI. Q_xT-miK[Җ HrZWq싎! w >uB28 9n>gd~IJ$ ]k}9E]=+V:Y"^dCiٔ=OzX %H /S[)KC Ւ+6 |9dRR0[$aSPģ$ =%h)tnB҄$=LTZÒ40 |k*":TH9aިFA29MxPxz&PϩU,͵n pjEZIEdJ wsGfN>s¢w 7*={* QZ»F-q2ah{gי I#-6mѕShei|3-NLs(F DNm3[>bc?kM8nY4:fNCY!0vyɸ]9XgPMIjuKdB\PSڲ4ޮmcF`i-T!277w0¯""{zm :s޶-467h`'`"C#BnD Mrݻث7cbog8-j M}iQ̛^wllI׉4N6T޹L>u ):G?\XhL]6p'CV,0wҖܤ9 psbd1dE0TX{<})'<`0Q5h pH[Җ-m{NCQ*BsSg(<.hl=llI[]K\JI|_b46vHF7*_WO>:2+Ģs2R+oHE +Ʒ"T˱XuMWc+%yIOB[ RsSz^viKnr(@&U['OʣtVj·i9F9N0,f]`vww7s|}u;}̜-џ-miK[Җ KzRCE3֌/'AS W#20=! T+v//s^Tbnd(kkK%F|=_5ٲe|^[b1G3׼U ۵ܫ*7U8x`W g zI[yR} ]mtIO9@\F#wE{.m47 H; zK*i V, e}(M?#om&^注Yw=[|tog"=I>i&}eBex!)YΒ+hp)WPaF ]qb}<N޳gQ.Bzr|e x܇ja/-K?ztںh!Fp&ob4&cT \ud@YZ wѢyo i9 ܜ6:rX;r3,^@1 )ny! I_|!8W[k+K ?oiK[Җ7.%H ڙ2SФɬekUj~)1p/ pJ4hjy\U TGR4+kjU@~}孇%_+R3uF:eģ>+wsw$8gk+].SdM;!uV^`4_Qj$[E܇]J[*Jx1?PpUf0p٫Y@3s`7 N:'C:ۙ:{~.NGSfzNgz8N{ӧ/{˻yw\9m>}eX`rlGofFT1XSiīYvyFwv$(t%[KYt+x_å!/EL6G+H࿎_GڣCŒF+r!=b-miK[ҖS8 u`v9bRRɪSY/هU z2y&3DMHV%.UipX3y` f,zX9@%HHcHM.sكw}?Ka9Tet`L>kv=nȖۄ  ,KBB{@D)`VAL*e SWw$tSw.({s-yW+t^$oPrt1ykqfWE[1 cVC6ǵqRuPoiK[Җ7F),Z81kq8%}&'a!СeY9: xh,ST49Y-KC3"%D~vb&4l.y;ИC(P LJ4Ξ $d &I#- <{S4 ӽ]g06Fb{OapxD Vk~3㵼c 8U̪r/[:0(%N=#VDrxK[Җ98{߉kUu2%f &gVd_aU)ZMjeoY#ˑ^c@,(-c|g޺ n9XG7ѕV%m&;KL‚ИBS%ZhPp]PU.mhv~h|jjfj%ʹ Bm;씔c^tSzqWB2{$ 9a|M<,눺iQ=IX<ʕS,󒏷a숬Skze aI??:-miK[Җuv'2H۳3W*TK#dʅN!,ɔcș6e#YKћ4!3cxb ̒klbJ]1>軮=a!J K"mSޚJ@={=;iJWSƴf&z9``?)Wm{),V*3 }ușE֌}TBC>9R+DNmMog=@E&ξB;Nshg'>w΅]?GųzgO\cl VVwX%mŝy'']T៓ @ss)qٳgIJhzR*S\901gԸj#bvӝ&@Xy hl(4`? bftegrh> 0-!XՃ/U<|=vBMIaY-pX^/,L>^YXjo4P^y̭ +IEKI;=/*'췾rEtXy˜?Iwg?w^Ɠ?aq~\bHCZ!Ҝ`~4war)\6.p)^>,`GPu(H+1na=t\su1*!!R:A,w;zt;O}[&C s.< '5{w秎]z7hcm"z !fAɹ(CP8@:&gxbrQ/V]ZA)aM1$1 kc{{(I7"Ҙ2GVv3a L96S0#Rj8 2Ic NXŸyթڪ<0 R m !*pq cƥda$a*28 = Ow<)ǿr^<u  +ok7_Js+LԖ-md>0Fm|85 Br)Q%d5'ߪ} %{LqgqHfm0!2d` J22%L:V5h㓊{=?T:Gy4Ѽ6: ҷ33U?U/NBF(j|PgeP)Rv!*F弙U0=,&F.85ȱ͒ s@2`g~3'uPYvbzb?pZ?vb&5Yr `eO^b{דa%V\5L}u_w p-MW{損k `& 5xW La\R`O6@Iq/@Fe7X[usZYFZqL9L\F;A]#o2`M*׀չt,ILɝrԗ*| p8}ʮ>nȍ> 9J$gv匡&v[?ܝҖ-mi*0UP0O͋HLUNF AZpʓz+dcWd`! :m0n{k[+L`I.kL5▍ɋЋjDgD^%R=@W;&)+a?Xۦ2'i2D%(.S7`3vdܟen$Leo}wcnY,jfFCC!$}Bg:79p3t; wݙb{$=~U;;G:j؆f@Զi(w(+7K4S13C?ŋճ>|u 6dB@?O&;{|iLPxtfZΩ-׺m tЅN!CȤ92mZ \٘YPuU7uw fnffڏ?wE1gnHk 6NEuw=BF|_ Xr8l+= $Ct]Ps) ܐI-n6mUg[qemGL@e/N]$Ϣ/g{/74 O?^qر_S՗˷_'~#2ioo%+??q1䰡7w}zW_mϿ㕯?z/o暫?ZTowŽ]}?#?y0ٟQ 'Q=+t_W>v跼WO̖-m)tGr zxd!@_B*Z* 9k:YK€p`!6(}?CM fp^ڐ޽c(D`nDx%Pq#dwиH1j!'ET,V1¹Q]f ht37XR9hȻ@H:4;,$q9s*Tyu<+ߥs%cÊct(FIǜj+G}~A>Q>B]M$P>Ͽo暫9{wE=u=Go7±cG|K~-_)??Wyׯ{͕ڋK+9_>y'_8z(7.tҶͽw0ӞGTON/PKo~ݧ}-} p%vW4LqB5Q'X|i;E&Qݹ`g$cS3sNz6+{a8a=X6B$;fxgK6p|>ﺨnN"H’FxwYKg!)F38x;EM0i1w[PٙiǦ`3x36{G{U6E9Wh$mBh DTn#_nyeMGv1b`l89S^C5de36 Pu,QsiNAJ0٤ P@|cQRmˬᶃ׾]{mJso|5o?c%_o{تo{#(/I'!(,#l!&s`)PJK$wF+^P"ٌEG=H 3kHg?v4ΟngM TZ S5#P@zăh(hMbq6#F#GhuxGk kQpr>ƺoPw\,5c]&Uآn?zD!t J;Fg!g{2v8Ǧf D\ (U0]L Ɇ[DӴts`rՏ[79qu/ ٘eūB7G4&-C+mӘdi} ]*e LްN'0e.AL&),Kߓ+lR6$u .EHSӌڻcs> " &gl47j s; ;&qztQ0yR8#畼H.pZxs̿YGtHȣ$Md}lh $G5ٔ9\43;q Pz0w񑉯Q: HT՝vrpp{y !IN'AI)|QzX%*3꧋(l2`fzkNhC Epn;sx6TNT&bh;.:\DBhk&lZi&A}ݚia3 '"TX0_ܖڹ/A:ơo+GanA[;拃I`!,)صa _Ԯ<}l6kwC1NH2䆐bԁL t ΅3ULwNk]ltm3CƾQε9 F-Yg8Jx)DD~ݧ3=ܕSĭԼ^%Q8c{~Wn"ȉ8;rC%5+6Lak` `07+73'ij4HɁ0:4@ByfT8fbOD "!q gDiܽie28ȟ3[\ IDAT-. ͤi1Pӊ$bX+K|~BF\8`C7KkzVLQs$ HŖʗF]UĈ m𖶴-miKN{O}ʗk_{FA "q$HȘ#Cʊ&wH @DwHKУd2wҸ{twB 3ӯh$wDus?8I3a=;ݘ2RUfvqNbsO.p֛5̭W3PnYW͵־O6;nqc"%Xq(R"( @!d.B\LDx A("^yGJihO>֜aTYk%khm^_5V8[JlLoǿOۿtuq6Nӎ&hUO,`|s~qw5m}svo.Э@Zl)<w{<귣s3ϟ?Ϲj0k\Q Mu=O~+}^;YEU ~ZV>'S1+@U%+GfLULX)(VnVnVn">b(Ǒ7 __+w i2EJ[@z"vqϞ{ӡ_Y M>vw=<.k+KIS2PJff&rvT9 i΄2w$18v3M:l=|xrt(7V(?̨u1Cרuݎ K&@a˹3SG{zZ$!d'34_N|:Z 3&af8oozッ mNӘsȰIF2rv8XjT_Pl0w.ZsָHDFDgP:~˛ o|㟰wﺝ -f%|G%r}>谗`̴ѣG9{>p M'znPFھw&" _1J"0LF]ecJA ,xݳ;6fU~xoۆ3DZcyafymO/F_Ga֖f`EG[]$%*`-K'n;~r oVnVnV?/~KGPDܻw{GL{<<⺷db#=2XTXR tL$D6L Mq4?ѳq{x|q,"$īN]?eL6m5]_2&"]J.. "5u;"#BItɅ0.vsIq'? ڟ{ 7T \g`=Ⱥc(03ۢ/4H'('%+T0XG~yOZ_?hgg DU\Y?ܪf0cI0ӆ}6ZCr&#I nnYlI.<'~gGa{_N`̙̌i=3Ma29kZ~K`33+4JھND/ڹNE`hwj3;6N( i QVH!8m>/y+d=UW<88YD4T/|j`za6iK7q|rӤwןW[[[[˧^?C{?W_K+6ZֺZ1=?QJ{,uK̆:y|BI&:GlK|hz4,3&bk-h +M=V&cjlE9Xe8jafQ3t-h␖R &t '[,d ^~TGqó}˸>Cf<|]Y)Խ@UqWigRA{OQ|Kuߣ#s|p_4mEh'j$P$ v)g?s9c!W ,".bz@o616# fWւQIƜƸvO\_3$gv;{D̂-lG@{v'Rק52Mr6OݓF"EJf23)Moo\֜#sG"lfZkd y\ֽh;'qV{M3!g٩衣kyK<UU"VS}7s?8ٿ?4}+r+r+r+%ahNvb)'WWW[$Lտ ھnZo v6.LS<|ȇ!Ɵчo4pwh"l1d]\ܹ{N3Waiaڄ)if$E-2rѺV⒬H沾oNuHFS*"8R3iE>U>ǟ.O7OڜO}mS[[wSc ],\ٝ77O.:& Ee[3j۽%r ^k/=CվrΙd`0AOtL4,^j 8 ުWkfbg#@Q+v8c@ Ihe$5EMALcIZ v d  "P7dcHlQW\!al]dIY/BB@nzn{?4϶Q͇oqln[}Iji$0뒼(;1 $P7Cf/mka(z$a.Kf:T)PA ]0Y@Lۜ,!$9)Ŭ/#1E(C=]}ʫ{]O[>??k 譙 #8zpK-AF73&h4SI2<2Idn35,LL% N264 :4:j+L]]SٕFd9e@ sI){v]=ԧvO~U_3؆6nFfFVXma_q0>6ZYqF i ,hBӃeU7RhL%aTPD0!Jp2ymB#df*nj+EĄTvۓ4͝uMsw8ЇflUDzAU˓ m|dnRa9iBy0"P­%4o* |ESw}'~꧿~GXE7Ws[JKգ|Bv|R^`!W=g#>}ϟՕ27R͘SZsIc3= !uєTFSΡt):P"ɤ4 iP'`Cb</bˠdUͅԲ꼹JLc2`!d}9DDe0Z$5 oR1 MT;Sk-03b+0{-. EJ. AVΨ 9ƕU9Z B@t)@cEŬOnA33jR RF WHX*/܆ӆ]]&]nuZkbgEw;? #q={rC@='ͦZ&w5ݽ{qv>{l@ssG-HL[(7!iUDj`I+ϞsIc*KkXhc c9dGl}yj"2d$ܔ(KʑE^XjK>v?"Zkww6Lo߿?~=ql]?{ϟ`ylqP۴Vָ9;w7^ܽ;?KvF]oEMWw5{fH2[jP"WϹ68xEGU?:S,:R߬5"9/BdWpm`\X&3aS"ZiZz4AnY?x;k64Fsf 7HH)PJ"blD' 4 p̐9DotIr4r8 Ap(VLj,*Sm*&ɖ(rCfo o>u\jgaeRt364:lIftC3PBlXn 9W*G4H4%zT)j3!MĔLa)}cfWa1?[WX%K! )MLhJ|pϊ6&E`0 }v#I4H M;_׼0#-8ɥ\߄mQsK{@6J뤩ճx~ϟ']!ihDfLYӑ4&aoH+ߕPϵȲb,Y0a3f ,%e z${0^Sn*7!Gu9D"39-3#bggg#2]6r0v;cSFkdM",ӭ_TNٸ|x tοV+Gr`.KuA{~5Vzޗ{r)󆩂F~Lav~~q#r6ތY7KnnY⼌F6Oo~ Ƥa&It6f3l"w<<H).}5TXv }݀ͧ=@B! 3W{_r9`0Ɨʌ3=yRF=頳C1aLH9}i)8*衳[,j/_Lf;SђHEY)P㐚Q<VoLB9Vܛؗ]&3+4(K͚4U(˶[8 [} 7jT~`@3X58*BP[fTmEjmhC$ih2A sPd7I>jl̘ T-<fk$[f[JAy2ii!d_8-۴06r%`3'(Rr $#J(&$ òsJ 0HIx9 ir0$; :WMctєbT6", WNt}l2lhne_ i[i2A" ͘DDTZɤ2M d{&-\ar]v7/>u/0͊][8Gkip}"m^얐,'>|HOniJz0-]D4xCe#W >H2U5PBY9Bc\lmmw5aVkCob^91YŲNa'O.)iٳ˫غּfh荦EMg`xɥ`^,N*<=-7j֟#9 bPzs5~MН|L9"b2O$__yJ!iڰ*9asV6}B47qO~}[kPD4`D&Lf28C*x=$K.$L k \D*x6`FYjUG (oڏ}vX,H$64A*X3Ӽ V@|"޳ֈotJc?_Gݶ:iמ_e~ޑqdi_R 1GNՑ%#ʾpWEnGZ4"M㡳LHS&5&zP%yd휊$ܥ>ϤH';oKiFdqHއfF(oH54t"+M]>`@sw8Rfzk6H+}eLlr) "ruUp̍ VJ#h9;jREA(KAJ˘mYtMLOsf-$VNHXwF:&iQ!sA3!I9 `B:$MQD%0ٝGhN w zʴeGqJdd2`̤,QAYB2f < %glgN2kU7.RٛW\VH*0Nܖ̔U寐Fjv3M -mNdMewP39fм3iМ)I QCg* /HZb"i|I,+U' >'P3a:j/GL9C | 6;WygK_?"޽{;wO}jF5nj+WO\^QN+?AdLI<~~ȫs3i'P7Zԧ2O䔓:FX*sL9&I+,hb[fK*+st3k?6ܻN-a9G1G p.m#b>}{|v$P&B=b0_w@w'd|Er= KgS}hAHڪMҀԒj{NiUrid]$"Iv>r*C Rƙ2w #Bs89Dv l6$a8?4blK$]2sEq{;?x*}N̉2v#{dD `2EbꦍR\<\6O|ِބnN'}4),sզ^ysrm7ބmbbuU'B> {Q/h33ڀ+jr}Ca yдo \Br9*លm˟-hB ww?r_?ज़'+{ ,MR:+9hfDdHu`"JE,F!+t7r+yw 4GbhDw!d&3Ce&5eIFpO0#Vp6Y&3}U:s IEnE|dX`SlRg4\iYc  2 bEPLega-!%VuRlZ [|U:/E?9 NTL,"QaXYKB5A9TNzdfJz$tيw8 gf1/J/?M"f YJ(k*$0V dZ!'"X t*@* Ff0" kK RTLC=#LT;17&?j{9 3Q4~"]hF0hRZX3N"LE&'d%')E1*A}(*UBd2`&Lfsّ\|U:O9_W];*ErV@zeMX4ij@vJ &ċտ'\sad@)2x(}t9عr9WOB=oDأ*lR M&a!$Q-|\]% χa uð>ᇏWsZm =_{v^{6z)wұ!\54ܿ`J#<^~^%Brh~}O]Yǟ2w#!Ѭ:\Wr:}5V3.`t.)o[Wdj˿-uɾE nl>nwwod8pd2XdRzvB΂)5ƔIn%U\~Wæ՚#¼[cJ)XETN,_FFD 7?PF̆as% s~ri_2c+dnV֠hXohu#v71g}u.owz %Gr ? XN !COi}b Ef<*̼Z51#)vI*Ԕn RyqZL#Z ȔPEm׌Oe s*zS1IWWDŋ i)Rv=s̃f&YSvѐʥ8w W(-0=Xt{1T,Y&Ɗj`ϲ/c.4p*=X!#SdҢ%{ì8g1fKTMç7A3/n'eګQ) sz3{zB $-1AEYfGEɐ"2,)tcL0B̧%F`5} WtPR9bEK|$3ZhdfX2r 3sF"Lݼ2$,.SnȪ!X%!3T6)2BYƚMT$h+K͝Aw2lВ̥W5RoeOЙns#Q0E\<]4u/? _,bNY_/'u8vɲ|jD'~y={A.;pfw{|hw>'?{v6fmmxru_<{gÝqۈ}WvϓQ{F/ 3SqJ {oo}aOkH`룏!"+g>ٿqsg"3 8S_ f Чp4 xB%I+SMxvw=9Ƹ𢧾fY ~Ox@fQJ_드kp]f.W4sH;杷6#O)kàvʚ:Q 4+%(NTky,"h歵aHfƞU=9{h\O^߻--0$q!.Uٻ+3.RjZaܭ@ON;L;~ɓ'/zadIgr L*U\"4QIe2,zDv0ahr"H!R[TkbaZB”*- zKEHOVuL>kE }s+_ʟ0TiP1%hf$`6qG`&"SSOhn9/ٿٟ_={~sJ̝W42%RQ^˗yG=9g:=([>bl0q=>};ED{QȜz7vb{& 5;ջq``7ayΪ}E{gaH<1(뻅k2,X k\Xnvaz\+Yϯ2N>Kda7߸p^8w0Zֳ76nltԔMֺF#&zbDЧ6톾kІI͋zGeff֔#xP';mBzrݾ {v{^c;xmZ7{$XҲ}56 [ԭT0(˘ru/y^]n=Mlqq+7{ nپwߵ[c>C9ieS\HS dϩmo{#όC4 IDAT;.QA1̑If49Knpno?oҥyilHFmv_L@SA6Mf{MRTsjFX a cyY$j?rϠ9o!i(`0ƌrL0"LlIʼYn%G\h9A 2Sm.en}3f MoH)k0#c *#'h'"6kZ۠D 'ANUsv<G;[yI*/Z.Z_%*Y/ 9cR NmmsXF2, /!:T`ǬЯd,F9Uw7|7\'a*H+<4ܽ #hi*ip5l K#0HibѠEeLTyIe> FhTL06~V|ni*If-*ћE $TQgq ҝ6e0 ԽpҪۈiXV%b2s)5@ &i,P1-oyK}{_|x_z Z v.)iC§1 ڷ[XX7 J_N%fl$Edb]Us<8RLB?5o/^~o//qcDIA2՗-|Dɬ_툲eUKDcfH/ )V.$IeǢjDK$F]rlsW^y KtZBLfA$e ɬ|EfZUOde6a^;S 䲂tH-KfYleTt9A@NNJRNNf<rf {{g~|= XY޿+ͺ,GDB4XDw@}=2k$:zg:7Ek+_Wy x)e(q0Z8sUm<`Uύ8c)96)9OoI |CV`ZڄLlI$- s+/5e) YJʤÛq޿W7m )6;w'-E 8Z"P$dYk{GGGyO}}{q9hCGV yUIBtyW?'>SL]zQ ZMڵ+/>O?pםwܶv]rٝiڌ eA<~QK6pr$U;>'J{e)Q֊ռ汱:/ܖxyreU jYv Ԧg76 ɲ?3֐3 K2k׮ݿG>\7_}ߏ|7n{b@ t) $*T'cƐ,1rrUtK.54EIR1$4MBywA="To CjIA^&, UGe/{˗O|Y*ⰮQڕy GJzJҙf%^k FKɩQ 䀂 y"c/j<?0[=V@s (֞C6ێ N,PKg*raML;2lWfM0J[B[PICf$@jTxfQ0$C(iYEA2ujSq*R-Ei*r!<9B`1ٖF0-\u8MmR,IΥBE+_*5B'rV5 ’d`\4kȰ^&+"34"BLzi)N=:a4bĸcsu &OooqM)3+UNzGMZB%SPL aF M|A#sνGƋ|KO`fЉ$m^8g0[*;?1!HTW/_9bF.Ч6$s1pS@5\G0T@Ws*S =?sfN x -@<'iiA[JZy;-m nmCgiEOS-5~_җ'/]U}kzj5OSndL\kG1 [V[51fpnI,K%=ꓟ~8m fo¹ R;cysb~=0؊{WKK@ݜO]!Z)B lM Mo|#lDXyIt|zQ2Zr0rn} \as9+c}ixb>n|dKt3U i>E^Чq;H\ٯh2;_{" ?ٯ?grZkz,ݶ3jɶbjS]\}AOMFatoR`96sOƖy&eIVChBZ:'46Z6q얕&@M&s9P:88?ˤW T\0cN !0Ts-V֮òU(E=N/k>L*O)²r{46T sd=< C/4 D o}[ַ>Sx;/cv~W-=tSg;ɣ f>hc`}ٱ]VS/%YzFS 7[*9[?>z>Y8a@вX3}KNYj4c8AF$JG+-AںIr`%]018BMb7Rr.}cJ%@@ӔU$أ#(/bkr'ͣ?ϼ%/cfEQ@jjpU Qr}CBMLI22+dܠnSOaQ!xcN} B=pkc+83"})y~뷾MoxOC=4cz{1ؤ< f#)wy]ʒžt1F+R+Ȥ/ c cǓ~1'cW!+'sS +[M7a*[.cxŰP6ЬBe=*g\zYeK$ Z@! ɌhJ4V=n°'Kx8i f2o)!۞Ɍ 6s֦1n?'?5=W8ZWW5Ӱ:6zw}/^ɛ?o__viun :S)\J@iZ6쭧\/? ݫ|=4Eٴ+c]ѩO.R:ѥ[WmN Nkl<6CO_wʼnW` o쓛QG0Vp&{U|Yج}˘cMYb:<?"WT:_{#IGK^͛~0wbT]*;fx%,j,̼ZWlE(oo{:' ëfhdUZFi2=xa::8d2w5~?CYz6ifʆa=v\7<²ҾϪ8kJ=:]#;5r}ǧ$\Ǯ<™8g.C.wN ]28˿|/^~ٯljVz$/ HEdԿQĚD 8+ڜuÒ)J[PѡA! yjDDL[LJd%hh1  Z`2nQKߙ~Ο?"'gF%a&e$P:pHTUFvҤFȼԤj5s,PE<!  BŌ M=ο ,)5:0STwJ1F!\͵7|+_گYIS}wUK׮n6sL" *MnB8̥4^q~Y9Uo~կ~ :9*J@0 !eRScKerh(.-W!Dr8f J:Dկ@sN\RuM0Z$ު$\9Qf/E}w? ,@RrɃUdUfuR8),k(+a R*I+b$b.ώd jW,f:#YӥRA D Mf+ _ U/~GG?x;~W?lur$,;4W*Ls*D r2d-BKCB-u!\ *CH.P]e\S|o|n-҆!nESe"aqL&%]D7O0'AiZ,s[jm56Ќ|HkI'waJ޾4 -^qgkfl&o{SteלIV+ƣ#L-q3>|كw$FO3>qﶻ[w2cq=yΗr.'+r#e]g#umI@7wvxwˇы_ QL`f.ʀmf<{Ȱf K$9S׎^n QRqovthN6:Vʄ;nKtmb Ihqö$ KE9[ojs,yIUm3#X̛0+_`jjMldY6"Ud4,P!S'Z|Ncg?y^ٝwm}x:y7VU=JpV@oM3y$f8q6tg,g|} 9OiᬭUBfW \gJ0dգ슐@ *ne6h`OXWġE+PO>Z0RD2H`0OSI ~~կ~?3",DbڤTQ *7sfD$$ɬE6j{Y9-s]s2b40c{t{Q"-S׋F*Cu x8H7<뱫OCt|1ζfŽtߛKr?S"ϼ\܁[awNL$a?vO?|GG_k~n+Avܻlu+(3 0ecAgT}ƙY9k.WJ@_U[aN50#R.U[SFY#i/dlpI"+FezWYv&Vy/r6 2 14)+s^nu¼b"h45pS31N0I2|[er˙ -ֿ|G^l/IHQjQ*?NЮ m:oB 1cɍq]o2WRrK7smlssڰS=î`ߠcΉ[(ቖK9׬96\ :Lv֘fZa._EWӸ el߾u&[6Oi!E&Ppӳ"򹋗.\xn}-C$_rڮ{33'%K 3567g ;t[2]XrrkqKExlً':q*UQXGZqt}wzUNNe Atҕv cBu]0Hħ=|×(Nc^ vwU?'?70D7^]o<8Z{$X{IsI 7seS|"<{ 9UNM$Ġ^I+n0 )g_+!MaVTe ((XλhFe*!TiyP%ܴᩧ:o" )#a!B-VC9g$ wwR h)-so$}gʊ(p;B@uVSnzks{O<9!{8uZ\9L N|ٯ%nќ>wuM;ps Sw痴,H "ZS77Z_Ο?…799$d42qqUOŕLJ r4ĘA3ft&i@U gvyqRY`2 xf.`JEHebHJ8a %>گfy#?#?s?wC݀ B«. ɋ9@0)*!4Z6:ltdhɬmfY2tśP]93&JDn>0LI M-s''ŋ~SG>ͨDٷNa0R)3J=g% Sb/f.u`_fcPN[̋ݟ:lqJ"7:?˺|nmb_6%5&RLkפV{&6ÌDfۓI.1 _`+s0C!ܬ9s4y5ZUIP9ft3̛: ;c%!R O?ا̣_xǞ|y֥?Wݺmu!cS\ƶέV6U/ŝ܄K+^H/?Oc6ʦ9 Ega`_s 6;_" <lmzKZ;<<$9 zE̜r99{z;9 :!ۅ(1=7^qf|(6eQJ1K$i𣣣j9fs8c@<#s׮ʇh##[ffÊͱ s]ZͺKO13[%%?k<"7`i@2ϭ2-7:M}XNFfJ%;oNtCKGV8ώI΀߂zLsۆ5\oK4D}5FMo`CrBQ)҈$G17UҼuVva$,5*jK!RnrW{]xCYF:b08*jTK5c:>fFF {G*9[P1[ڍCALh2.JfҸ>ŨE)ҿs0tq_ P S XV`t6IdcÔ!щؑZaHA45Ԝ)36AŠR@ \v$mUf{ڢmߟ۸LYhphA&!)Ye椦U~'4M el Z ojf-2T\9șg̐ٶVE>9%rѣ׳gg} x`w_^q 6$\`b>4k,S I=usuJ^96IER^H/iTbQ@++MYd8omcƘ6  ΔhTV\L5g/&6h 0ˉH6@;>yv k׿p3d)D'g@Xº `'78QHPf$D9XmT K0IrcW|:ƂveYIB.=y{tϲlca  0ΎY"\Rr.?1n#spbo?[A=c)i:(D5<9olIz`tIИ4[j71iDD2" R.24w/̖6$XSQ.F޺"8kz|WnȩQʆA w;llKo_x"wqw?GI0oӴҥ:1ܺoGV;ίxֻ:M8g{} O})nѵj%4]0`kIԘfpV;zw?p|?O||7Lq*zq%i'U%>s%6l[*)wvé_\4*62ϝ;zޕ+l?&^;:T,|^dW?ڞFz5Wr* q F{&aSTp%rG#f!cY&ˢ:5Xzx;mwqC-`ѨEO\knIfPs.y* cڞxgn#!bsok0# %Nx!zK tq>JvXX̽5:qZpg%Qds7a[Y]̯GNofaZ^Nm}'-b9^T0/j'36`˭^=vL;:;@sjE# Sh ;( /\ڻ5G$$E3\*=OO UutĹ8-$/`8Ř([v_%Th_T)∱,\TsLP&fZo4l&ʮzH$"Q l}YDC1%SLNIf݅,IOA1&f2ޕ&S5A=zxl[B}^Az=X#X!2lu^Xvr.%s[_\?~Vv;43MR?(7ߠU)fa%2gRQXUѬA?1%M"A:PB%8adq,"_P,Z ӋLHandj2Y%p`FEGgD+)!&LP~ GdY_Pa%{ sx|$<3g]Y40Ѥk/&4$' O .TUp3,hX9`N,!/hrc"dh)ڐRYѢ!QC LUBykA;P1Ld23/=!FHhM}>ZT{Ϳxi̕ڐiYs^z=ox赯|ٽwq.0{{S8'?K۵#hyTx=y;qExFe#;NӌiR L2cl$׫˗/W}C{kūHNLe7ڛN`bLꖧg.<{nŔk7UA޸ 5W?_mƩ| :hgn\7vl2Kڢ>ƶcꘔٚs]O~YzWUs8v'0ߢUph|I9hV8Ja}Y:m.6*7#I)94ZDpf)k0{NX|( ahqz>r{W_)ccDR; ^BRT Y3E1;ߞ q|x||Pw6+o@𻿛hĤKE VMu(0{+Xd+##5fNf:t + G?WU%swwoփ>Xw}waa/ÛO$ ..UOYL':eYFL|  N^VNr9OaK r!mb2&' "id0m;yIAya۷ BLv`LrTQFl66٬@J# 6q2?_V,L5]bpYR^:$MA0Ӆ`1LpeRF!hR$/ ʄ >CZUprMC[ܬ2ɻܤ2 FJhtrdr@z~ZK8 vPYF3M)ޛږ]ac̹{թX(R !$$ Gȇ !O#c@c#XHvq p"pi"NbS_S{9{91^D g^lΣ,H T>MLS+(&[bc~x1{+sn絽1W끃,]jπ ztp`29,r=}1Wli Y^ $cp^/m[QҬ넽{>w>3Og{t::e1yͳ j ފ[goN8|{xӧϽ-vhg/kO8rmO7:v7,n^;/Ko|v9~>xqwtz=?4͏n~ӟnZ0s8Jqtzh]L XOՋ +3.mrZ>2GiQVMHv϶m>/zklsRh84Q9%#J;Þyx[<(А :Ο,8MKIk8k8ʃ/{#yZj;&Y>_կxu`୩geB]h*Lǂ#H e;`(vc~r dقܲc0,dGZ٬d1%|D"PiVR<| cVxrZS`%uurJloiU ؏+s5l)2/>aBNߢ$\[ \pr#%ԝ,i8Nl 4ZU".5E0Tʆ:Ѐ[Yʬ+~HqJ "s1,6 |!9S%)TA0A/36C4Jp$lă6ZA_9'iuA XD3V1&bS-) шkn;=9T&e3L7B u4kHZ"s.1^KKNZZFG-QP˷&8Vڿq7o_|~7>~_?ꫯ^\\lY`Y~E+!dyP7ۄ58,eA<^A BdٚwʗF<)d?nQɒ^^G=Wx>SAuiYF6D\ѫ2y]֕#[Ky2 Lrj)y(yk4 AS2] qm'mFU}pBZ0ʎtzPJpgJC;kQ gHJ!Y`&ݘKEN2 }6IUJ$!sj> +PT9ze @ 2[Z"i˦g$,S֊-2 XgC(֯Feè <~aDݪm1uٯ+mQ4,CɅ\,>eGb 47H 9* f`²ta$1SIysᒵ(<,#3'o߼_͛?><'7;iZ,5Y_u{[m=yklݾn{vafIs?N9:١g IDAT8+Nx׳w>~hƓ'Gǿw'?^}駞쒔xYqp-vM-!#})1uAfiN- EwyNN2k_'>wγlBwB;L3D\CgwGg 1z_yGejL)z+_koOܖx^VW t`W8N=ʪL|}q;mER2aX]@vNǯ=#4OGfVyQLbXڿ2KSxKK~4MMg!H~ғC.K=d.@Yw<ӦKsky9.}2%;ؖ&"]'3hߝ??w|~O{r5o]`E9$y K 4 ߳(hI4P)$VODW[bXhSJVa#ѨoYGBr-16"D er&7#h˽6,#FB$[Vc;I[cgka$hl(>D1xD* 8+٨ ,m! :LJҌ) H;ڤ^H`8Rx@%V{`G#YdU I˕Ƈ(و0 şdn 0H Jb맧wyNOO|gC??G_?GԹsQ>ɒyUvĔԐH mU)r)FHnȅE+tLY*c7"&)Qdh93FҬEIz+C8d,KV&. ҙ5DRÁ^g9Nbi7OV bE)+DYFMf]TQ_AŀҜV}tTmPeHs+W'@d$2\ak3YySYت|^a]IcfX-x0O*PuXFb *-$U92eQ_o Wi _ClU%]:7x0im+/A*M5qR].8pڻZbG!̮%Py`e$M$FɛQvi9'rEhSEP;h,ȖǍeWiXtժ[Pɥ/[n޼_ջސlfP l2'b};l}8o}Mt1Bo5f#vTn6v筵ytF7GNuv׏4|9/yǛG}?}Ͻ]V{o.ᘩ=%[oc=a)1'-zd#[{wӟuَay ya l|eG><ŷ+0<4yͫ 7o޼~v|tg4s3]n_3O>–·a<#+mr*[3d/=c] I=vyn|n&^"AXeg+If.":0E8{w#mwGZE5.E%-`_J dYh[3<ArПZW2tkퟗ#$*M,zRQ!j?*S\}>+PZ%0IaҾ;^?O~S_t1|`|W`4r 8[%$١F)#Τ0|*,#l]CdKT+ui 3vfUi&).捊4!'Dh]zEh$Z^.WMb/R/` 7)3#@S]`)g=fKl}|9qVlnQ%Oȴ}4Ji. ; 6%5Lat].2mz%5H.WӑlmgsZ# s-3ӽ| 2d[]!) EVjfB\aߙEY p&s8 ,:!K|D* YHtZ[7Z Go@vFV^s%T_X;e6`HGϞT B(ƌ IB p-,aL0q9Zo~_{!vOgh>BGÌ֎gBܢyʳEn;?}{{+ɋ -wŽ}7{A7G'} Sgw_'^?׍v}[w7M=eݜ7_}' S`8nե83؃7_G^VҊcH.澄Bsf&nݹO|杳gwePMl6>MXB֋!4[>~pJu)nQ +}ÔTye]ٔ#5u1p虯ǰj\Ńb^%!}w/o{jU*X"uM:sYߙ! (; 9`E$@4i'4`+%HъOWU ^y. P9j n"^!+݈^Ӕ^Kf`mӍ)[lХr$[r5 yV]AU_C3 9Y>L2)( 9#A\ }H.exDDRbhrBt .fAd M63ShD -4pnZiWbK$i˲U#Ё"s5\(ڮ0g_?jUBO5yt/ i HH05z@!%PQ zu% ,re$`]0eF 8H6F2HDM0jŨ\M蒨lf=d&K IҊLӊ47%Jo"!T; :Mafz,s H-גq83'@*0U>ʺDh2àM bJ,i`P J|F>fT"iN#%*@iE/ՠcDfk #eV` ċۅ,QO[GNi_b\((JpkqWBJ8T$R%3 Ms(> dʪ\Õ f7O͛-qh'+-T<%ram7mt Q4F/g!dz|)d_~ޏ؇{O$¼1)aD~\}t&m=zx|,n|x;Ŭo g&$|~IPв68z#Ȣ5O.6z_~kfZw]<*4j':̤%}x=r1 o Ѭُ _«ߺ{~Қ"f1Gb7M%+BhqUk_5׫:$vܻ{}dӴ黹+ o›nz"ba*>܈[ic2aJu_7ZJ 5Yχ!F߸$. ÿY Yÿ?~ /7 <'wZ)˲ W*C̽*q-8QQO!;;ES[wMbz sJ%48xĤd nBZR k u/R xPAHE9&,pxJrBDyaWAdR!4Y@F˨ 8H/@RUZ’Dmt6Ufg1~).fJ)`r'򀺖y@fȃ1I1jb5T+\d^rҪapсHF%8Ҍ)Б1X굖c}W) ~|!9(>;֪,;4! VkR`XΥ)RHsĜ+GKtݦښ#rU~t"pᮩ̳0MS۸9M]VIk*qYE?btLC]N &Tzk>mB'rbcgx[s?L\dk혠"f8dv<kz{/h'N6b!p۳Ǚ]:G|׎uL^TXE(jz{6^㳸7ѼwwZQ0 aLO c (jw;jG}MS3}w/}/?>#gwvSNra ٲKĨacu +2Dm򅯾uƳ bd loywڋ>'mW4yAJEe2dV)Q+"W+֤t.a)`q-0biĐjqM`SS?G=%iie:GF 4+k0݌l68>nu7{0{ƣӣ(4Bg)!eVfGd/\RМإsd~h/ڍGv) 8jơZu$}h5wZJ\L<׬I[/tE/k  . VGCUZEZg Zt3\ >y)⋣[G?G'{,Dt0iaC (`7%a/XIkءh;HUl0TÀqFTmي +g6{ 03&y`hL@!r@)%)f.Vh{ΌBLk((+Ah\!ilu mlCMع\4 eEl=MJ-g^w \8Գu4Dc.G-M9=h >kU,Ǚ, . ~#9+ٺ7=t?'ϵ~~te$,0TZnJIA:j3jȮA3Kl徵­D ӳ5xϪ7 ɌFSlye0]mMn((jhR pZ iOccPYfPT7Uoãl~uC]1sfڡPy-Y%!*t+f?Hy@1df]7.qְ(VEFgGD`=ž? oP.yQ!79nGgoovŭ[ww?k׮ֆdF:G`lk9Ko٫[oڽwWz4'ä,=F8<#4Tl(1vwO`/zܹ7߾wqɵGho)k]m'Z4R!=6uy@ /_r$=FM2znw|tmJ٦ڗůٶw^\tEl#Ytʭݳq/h]ޑjl]y擏_;qDTܢw6Eėw=O-Zy8zw@66>4Gf"˽INNN>.GydGazFBw.Ty cn:[w; lqS&(36@$Ӣ"BȈ=끤؏46|ӓGqf'2Ue3uIh?.X]C:&~zEah=cxF܇ˬ},Q+$GoX4/J(\( Xz~=`@=h)نX H&}pP%m^ڥ,i`(+k_,ˋ( N3r$Ѫ>@VK+J,Z1 ǩ41 l0C,:V9r((B1XrD tDnmfįڵӪzP&]=TzGJ. vBd ΃b^'!jKB"BL0lJ eWYA3w͢Wgd"zFNt3ɒkIe!fH ^zg~烀G?3GyhWpP(.%:flqB2Y(31 ʋQ%TbP: I PDn0z&M@If S"aY [N'4\+`U\sT#Sg'YebXEj] $ªdZ v*SD4_AYid %`zry2FoѣGSf^Msfd2e=}6ļ]6go櫯̷/'`UHЎ]*G_yn:TWfd[ Ng} A^B~~5\Õȃv ׿I( p-9Diu!N0AUqiZ&dVrKZ *oЎjB!#ri2P1J0%r:lS in='؄$zm LcX%{eK'@6GG(ޚdPePD+4aHIu#AR`: TGkasD(`0 ("VFoaӋE^>\1[Zv$ẢXvpSjE%p:nx"+k#"#{IV. ȍOmdXl6v|ocʟ>}?>Tĵi7[HVF9n e-~0xEt 5r۪ "Qpf`f7 2*rihF{92۠{˔w8HFY妁 VTU(ސQCu7xҹRQ,3Rh MYZBNgl -[L0 ALѧ,vF `Jۺ-<1v?6.Pn3{LՒhYIyt t6Rdvh㖴);E/ TxrQ$Ar2%=MԿRLT$VgiU+47|h\& x9_t_/H2#T/1X8|#tfV~X*k#c0]-=HP]SaU 1E|\.=,#-tN$)d۴ݸA=fQkICzx4O"{W_}1TP۟8z`v:Nhgg^9r0!ahZ\w݆)@4h$h"E1r8:C~qTk@jMW[* \ @(2I" :! EQ"SajUTltY(!8K=RZ%Z7"0T*{Q0ځm H:d@僡IWHgGe5Z3 "% i!}@MuL iHX"d*VC0|X^3QSk5 s@[ah,G̅Ee%}m=C;Lc Lqw/c?|\?y7nZC7o?Zwލ_c[ؖ2P,9/D`i"rT(bsZ&mW E je5撒r2)Kr9eg;}u8/kA3& <0c^PZ¯Id}5fV=hҖQ2k9WZCPnZpQ)#0ګǏ>Ӎow ^y /؏=1~Ԏ^kB̢7y~4^2̚K0WyF2]q!$rů|ۏ>v?͈P o#;er`@vW42fJ]5~2٢Ͷ͍NP1a$lbY?,FdQ0Z,bIMjb.4M(3"|ʯ~e|{ǹD)ʌl6Lrю؞Arj;%f CmꪬȁT@!^ בn ΰL|N)@lܿ3ꗿN>۪@Oׯޭ!׿n=;,+Io j1'Y4ac)F+Gڼ6ZzZ $ ~@WfђR<䥞c@8֨2V֋ۤaȊNxBIk793Oȇ'̆L+VΆA/=[w#%HBy1L~註l=_=;u'< Tj]qy= 対Mgsp˞LH 밵E::>oD鵫 尅{/vg5H;Ox#S4f.JvOtGpZΤ ԖAxTG~sϼ}7Vm^̴}šΔ5w."h0vCX<$`QV`/a2aDb 9Tȍ73/Kc?wZf wJT:UM-fE4Ts?B EUjFX\pJ ;֨-h$jRQS,BM,ox5Oh*iBK$Dc"/O=ߥ|S~~?&:Z(rQibbaW91\>ي\ ]|KP>2 ܝ~~ٖvlzӱY%+KL'G?u*߸vơ^+[vQ]2̎C66i2Y6l;OGdF#VB 4+Tu&4)J!f=@t7+z1 fKtX4]?7^{뤝|㥛3#~CG6X,Ǒނhi !@1ɂ(l;(LC0b8&X_fC*]nS^̽ *i™ڊ,XU0X9Lbjko%\tY> r8:ɟ 7_'_ysSO<|Ͽ{?N`Yl* W&MaE(v60Upq L؝A <+%7EL,'`0/ژ#EQ_R2p)vAL2Vno_o$voH^a-/@BDs b0=h$)3|`X59.yY*b-. f_F2c_-綤8I vo]uX~=ѶmWY{s=Inr%! yC| 4Px((|$B`1  1&7uny]j~1^{sAGƏsZ{s 1xt].>pq-Cu]P"s_C$ux=DxH澺I 3HA 2iF&w74(RDT:Z ^JY^+1 up]w_*zmf6Pq $6b.fM~/nHq@%50H<ɔ1 CDEL|CD7S5 ZW[4R`&[h%y3wۍ3\ŕl(Z-HZQAxO\-A\KdE$`A ]vmul?-GzGAnHTNP=m*ld$C J^O=_Z[hM<5PuVDDT^{˺vvwwkOr{OrO̵J{ f5(9>/]$u7.M,m9jokz.RKZqk"h,L#ݲ: `TB`c 踡2hB!t*B3H"Q0&QABTP&&1" IY>~uvj[G^?z?bԕ. dpRS|b; :D&I`0HQ25:!hzq) UD953EIҪm$)hH 'jj%?.}_:`U B,ɮe@ ~D߄c%[8AAd$0 <F{CgE!x~EիR ܝ}(M7R^Y{-2чO~?Yے'bf Ze5JQ aAC-c(*$D{'>E$ *PZlԖuTB0Ą`@-(p 4f]7fL۟/jKW}~_sbLA՚S% %)Z|T i&Պsu/ h`OZLk&1NSlE|jd̺dJ*RDPQJh xUh0t `?z=IqPG"VAVxD#y+]iS>-$yaPW*L 49-k@[-(8&/Գti|8wm<">NV(4[d*:r Ti*A}7 aoת )RRU1,ϟ1}mt#O)N7i?%6Fu$QqtoWpAjԢ%!… W\Vi7+$DFDxkjΦ+2e0cZ:'"UL$\#S Pgp8U^k`튞:sm7:#aܽt-hs?&FK\Hn‘Kg 7q0fhoD%r$x|8]g|j{|mdo*$WúV;Be1l8"\[%\uԤ݌zp {k8Co3Cn:h3J+$3||^{:Sm Lz92K1Oh i~-O=zZu4oc'*pj,e.^OZ-Ჯ[˗mu-:,8d$iT(DJ7!Jq2|n])1frxǩS}zMz1f`K}op={l1-urv\ɵ/j\۳_f<\޿qeqBD6騭chuwCJ#/I2~;mk8&BODmDYI½[4SĎ L$TWxt#JЊZc^J P$E bPMo}序VU!]}~?ar 5 5|A)bPh:)S~ayLhRkQoh^ $@B ,Đqi>J&>עuMER>^T{0l7ǯ}cÓzy8;T3rP)ɨC $2`.<&-9=P#) CdۺrP"<T@ްRE ~mW|S;}ێ_?U.쪹5rG?\K{+Bl9\9_|٧> ;0^,)*)ftP# y.iGD6=kPi H&4՟T@SuSAA:(4^CЛ+kC*:R6tISo<( IDATZhV*4c{|pcnsm$V7=&{U'"SXK˒٪TA6D2xzZB ńù;.K&{^AIK2MJx8r%ÈǰY *T8a d+a 予0(Iy&(\#EV1"ƵP2,N+4Z~޲ 4Xe#퐄)ۗi`4QA8*ՍbXa֡K+hjRZ5"EbX4<3C=Oh5Z)GR=r912pI L>h27ERJ C9Ql "&9O-+Vnϸs bղREK5! `3tY4?ɂ!A43KDdi~}ayۍN}20V] ^ 0(aX,;]"bאj,M,#6z\ml= ;g¤m57% 8M8FGkp|&FD!rqڛi/*L$QP?<~n>_'00YZ1kJbG,V]9w~^1bN%k EU>R*Hzv$Ru|[[* ,ӎBmP`ki#LYts:ܻn_?uS{>_\}4VDÞ #?3a]b=_?s~J_o!ٷZcqL!=Q[!bfCamT0TtcLI+ /~eoCo~jVw??A2K"#:7L$ce r~ʗ 0Ba*YN.qWzM(3A1d\D$w-Z8J)U~G';)zwio~D"!hOV]#ٯɮvOO~|eeHh0^$= YԂkb[C9¤Ga\$U[_2\RE ` HJѫ$')A,F Iz/CS髿n:CVGYcc'B5|J{ cC ;+ԞΦS&R'##<YkVކmQU{w`+KP5L"=]zvY> NViWF{q@HP!rX]:W #b\ǬfW&─l̙7]T=Hp#2Ӓn\jk&Az) /y7v'gdRWg.+T0ܣ1Zi%-z'F{Z p9-˝$*hl39xq-gWuC5)0+5Vԡ(Y{L26j}_NŤjP)h+|VK8#NFMW"p*F" PpQ 1.:w\0n*;g7ݺs&vz H!Ghn2A: 5'}6ۓ9~l9[Ys['Ƞjw?,RP)` Q7T5wf0XF 6WS!Ɍ,/65~k>?6A31U|LˠXw,|^^, _#S|trB8U, `"uDuN![$L7IAD5H )U0FdJ9&>3U8= /~b=O|/s!(%)7z||Ζߚ=P =۫_BŋoOPVVĎ?WL}>}c@ gCņR[uS"t@H2j5cYxwEBeR{w{|㹳??G~hzB0JI}W}gWEoGGOM @O2q+hyC\;T @hN@tT'7J"bBk`9PԘ@-9Q@ 8V追x_y;~mWϾ4jUH%l, @3o~]Wf;e\=={yrG/#,(Bw@=*$($bR8:ew"heϚ)4U7倀vSyb $JLN5mep `^gwU'/+Lvg;n95g\x7ѻ˳>ECɠ0,ShYĆ6#c˺& HE% R & xOpd-Q#`)2HEP}7:1xuS?/ӲwU__O~h&5XO2}䗼캟t 4l 4ݧ1s1;5QtHdT)FhX'RЯ|9yDPwGHDZMlWs#%QFxxf`midP\,y=rM]k  2$I|q0_Cu35 F 밌i9D mQi=}^?+2j9@@C %-0kAeT-!J CWocx'= I93xӧdZO,t QIP<[N=?aAJi(`d珏.t $oGÏآe~\'ź_WI"0pGje훑,m\'>O8ޯ\x7ҕ})f]uzebMBv漣<*5j +tI)3"ĤZԬ|C=4 F,O/H[$D+ d[- [b6Km &0ϼ]J -IQSBe j]uVx5YƝF0+)}85PDC 5LjrϜx{/6@H̓ؼ<#^{(,[;ţHGʼnnpߴmǘ EG*rt@PcTAV`Pҩ JD1YR2֒A=%(# G>|A/ӷ/>o2T /Ek$iRN%Ϳ9}yG`r|/-/{v>=S=3 2`xLT"QcPNJTd0:Iw]U CK{@q@D PI pD0o~辧~Ʒ/Yyo~W2R]DP4]`ʓ^uQyreM_xϫpOD 7~gUB ݡBW-t?ؤUX34PS+dWD|p+ _ۍ%sJdLlRYEcgH'}z׊UwpP&ea h"јܞ $Zō( Y5p\52Jq`IQ5KDʞe.' YzYub ͨo I(iyɤ\5PԦR/kLmvnҲ^ڌq "Ȇ{|:DDPEڃ7xFo3A lv W<jA+oxxmS^;VsG׺d(!M"L cNL[HBRH[o&u{oհsw9(P1K}ԛo{gX=>k_?)CI)"Rdsr]{W"XWΟ>D)^_j q]C!F%t<\ӴRJ̰Q"9HdbC7խZc"1jB/^_wN~åo[C?b*ڴjm&z= V;KYW}杫e}>]\8 ef]}nE*ZAMZTEdfj0JK;U(DuáV. r+ժ?r(t-;a )*>eZS7P/_w3>itD{yԲ|s؈Q%m0ONV}Tk``T8:,Ub;{{gG\~rg~W-V2[5hwkMuc᥯| PU)kZX""tӦR0E - %A F#a$`:# {:CGM1+x}oKݯ'>[D6?4ˆ=+!d,cc-`21Z@{0ƐrE`ױL޷aNwIWLgl6&ulVvvvn<t:ݙt5IUA:@m"(71 CV^n-ѧj+zGLfTEwf!xM"Y"PCdvFb{Ema55%^d] 2%Ҩ%D$sX.e8s}U߽gLMPuAZIF4rq<<]Gm~s',ccsGpSrtcyTe=êںXWDlϽq)Ȯh16OھӦg:Q}{kHL{""EA!Is6KnpTT!Iݻ7髍 דRJcO|j׈=N86KW!Zͭ)!U_&0QXe^IQRCQHQ%VJb(awD D @ ;(*i)ÃEXBj[/kd:"ά=qf]u=ۍ ǵکn ?[3w\-ErDN~2{⚷rf8Sdl3nWql͡@Ly."*>2eAP-FE!&sDž tm} _^W& l쮩+B"dv1 Qd O[a b>_xޔV#w(*m)-'LN3u !2 Hfb4I& @PTd RD9(֋/{=yO ̠`HXfBg߱Oѳvݬ^~{bcOzI}&f3hR(RRmAGX*G}Ν={δNНKP"Xk(ee9;lɤYU^5QJΜxWYFz8A*PmyD#늨tUo>^=1T:J0"xLm6{u IDATٸ i#u:U7߰O{ǟ 4TԾrեp=O;uԇG~vs TuP "Dmd1\D \T"KFC$}XPZV8}?z{awntP! DBjbd uQG[# bQ "X0M}܇!Rl)TT i2r"eox>>zKWM~wk?r1I?*ؒNraʓ(8Xn?pd / t!>EU}W'.]8_z=,WZc`#"Eֶ00imS]<-ݤt>~tv[tmo>ә;Ii ط\V¬Z`+F}:Sl„iCΝ=gܹxά0A( 1+mtf-Ɏ/v,Ħ7nO߿ƒ=55QVKb2iY&\sE!8!D wJwz~8;әv쏼>|szi]/{:&&[ OOi*Hq4G(6oE64L<bgnWy(ضvr2Hz S|CFy jm&o~7_;ƶnTq2Lz`Kn.*4Wf meޚxɱk汓{O.5 lxt?Ȳ_"EᢂM*q+ā~DR_ @zT̐EܛeЫNK7nbFE8!bYTk+SU:tZVZ;͸^}3[J-0 >wSC?\tH,H(mzq\<^O2Tbka+=aζ-:J ۗ1o~/L'm I>?5kU7( $'m*rq-CҴ"iI&{7?qÄn8=w?2UEQ EDP%EL0i7Y/CqT5%T f5ۊ\*Y7W4Z @)V#!-="TyK eoW|]O|ރ?I8_ RQtj;ݎ**HG);&KKe{]B>}7C*; jM ݩC)}d=V#ElSM-"fun"һsՓ'??_+ִDww] '˾ׁ̰K,%`1˚&."Q50֙ het3 i q,I$kKH& gw)6w͇UO.7/R$ 'g3y9on:Y,lDaRȡCDYܑ<^.N1(~>LBtR}Q  _ H{Ӻwm\hҒU1@Q,{zul?z1ҙp𘛟I]Yֲ( &"8C -{mb%HdMT G&>Ĉ!dY3forunUPŽ΃OMΝ9t_Yӹ[ǻ>Jij$GX?4Pj^Iv۪|/Jl`T\.e?_ź_ze wH=3i[N&q6f* J)&հ2}CΝ~;ogE dhU"12\H#LRh4]ws̩ɪߛM'XLT8ҍ1kʠרjVfW:v]p+="%BNazU݁An3~uE*LГtw)&8q5$$@)-grǵ6{7n3j'9᲍K_Nf6?\>C0],NbGyn`㖊ov蓜 6[wqd^F-!0fP]UK)]Q6  Mq8Gcmm8%'1p|^O,8uMϽ~t/y?,,Qd= |Sj\#Y&4n] $OxZLR /`_#ފz33 zWU *Cf$<uS̆ YFT_i ??|2 JJ EP@I}%q, ILD\}?d/SQ=!)2 TP B\:5vwS}? {Z{P"I3UʺG Z~eSwpSP[)_gewh 8YWEg\2K4׉*"l°[B{tu鹟8߽X%%24p~[G%=nӮ9+a;{sz}!FYc"*_>y(:/}%9 i@GrW@{:;mV&FtD# %8P G\KRHC%Ya2-A9,q$P{h۲l~S.X,f|(0Zstv5]~󎱤 ܓUbH"!Fi-5RL|w0m ! nwAM Q !otΖv ϭûM9g71‘Ndr N (PnF %jD 2 {&þZ)VȘnu>G/^{뾖VUXQeX0*ss7?j)D@om;j,>p ^""U!Ȭ4{l-Z mOln^saccI}r{,2ZiRJW ۟H/e*˕9_+9I>kDŚkd1a,Rjjn[hdk_ڴ:eZ4i1[_?y鋾$E"?yd/ZJ^M]hM t5J &Hf3_qfruՇ͢I$Dv[fk4~Ot%7z,dq £DD .J݃;}{p؛-f,M^%(%k%W[4dm.)$jfb~֭'| wܹ3Q hENHi*=jauwغyBdUQmDDQMMH2%Yuzojk;nNnQ^䝝l:pHgY;[$3MILrZHۖC$Ty&mIj%Rpv0qq |ՙ;Y*=zjH]ܼ=_dg}~x.}9%VUF'O$ ZJꞕ9p~T(-oVlmmU!c2#X>o+eUOteNINjZb6+CUࡪR QY=3vQSRN&8J2gZ@V 2hD:^N8řBU0l%wu,cs7 /Xƫ_N4s\U{:VNT؛>(SwU-&Vp2<1z/tIfgx%ʪ[+jIJ Dj5(>ܵ)y(ة_xkwܹ 3hHʭ$?5y}BD"*_rUkTB ȕ ET :hHUb*AOyWs4_p3P3!ځ5ۖ,nEDjYP!U)}?ĵ 1n?sϦ;M)јPVP ?p؍`nQܻY<#GPBC\:4&PMO7و!RYMFhi7&-6N϶A3QNcB .ԧB a<_e{rku]4t˿k磍:6diF֜EE{N9IIV*TU3eW!s!ؒ5@UY9ez'|W|1oSَ#56~9 u`['hxEhwh'^yX7zk ڵqjSCҖD14)q'wH˫ Zy_ڃw|^Ndt!Rz$DOwX#Hw$HQIGHPjPA֫;3vwROwaqc_ب0.yF%DM!qai~߾+Kh^8""ڍ#v\6S܃@)Gh$Cf\.j( p*J4 D:`qQ:@n0ice2O7ާdyэ'{/d/+*DҪt 41^}WX<+WojTdWo՞%X#euzF_z,,9Y~rel@H@A5gC:d0jzfpJr^lg=|ϝH*X,fT̠Q 4}"\ n!<{:L֫Z$ uQj$5qЀ6&"..Aj)%j;$+HAN#9k;?(u:gaEt cY5HՋ[gt (P%n޼җ{NZ=!Zma#כy tońW۶6:n`c|M7wDHȡM=g{pbų!|g;gUg\vd )BT^S'vQ#Y[Rc Դq/HqVGjVpͽ}x7Zc[9HyH^_j IDAT_eJJ]Ϯ Vc'!Kς!t! Ѷ -QP(0D#VJ $fTY$KdPPnBvyX=q4:\Vc #:_3U}80 ``k^Y Lf `zJtބy/>ȜOۼk?3U\RAZDLa?&k/؝}'O4jÌgZH\C}7c4&h''*2k0vt@b0k_Q,&XA5(;ًNK>ȣ$aA ;Q&bIXBQYDk,ҹkQ^!7b\EON1 z?66GҺXӤC#!à\UjƑC` iiojl&1vcg~5+nݫEyG%u%5'6RTCxD>v| 7,<{~۷7hb$ +tJY{uws`}l㱨 s$"D/u[wV2Y*(rnO杛?dذu.!,,@C2i$m`EY$0`d5)[x7~W36U|E(tgH|1Ɖ/OPzƋ詀"UHB֪aމ$]2SHzPR' i_Sd޶m̷5 + .VU9@è!T8=y~w?{8wPonm} _hpVDHuj2`f_U_0Z??&;Ԟ8h *4jChB[)/BWb*qikdx N/k)҉-`3ޟOG"bPC$ k֜ϊnw{osl+@QCd^z+EPW6(M@[[;Wvn<غ9?ȋ0c39N`Lԡ3aeVhd,[rSwݼΞ\_kk#H$kS:N;0uTd$YPVAG))oii""\𾜁`J1jun{9ߟټDO'A5a5޹ Gll:vN]E yi\ " 3̷*1>Ue9qH{y@[~{DUphTg^4z)kAs%sso_mRzd3o;aQ= '# H: @m Y_mO_=+רU =\ (UTHJwD,Ç`@?"݃pτ @!Ei` 4T.#%&M&y'4/%(DR"UAD(a+!m-/޽q׹Hc BрU?CYuYaVyHֻeι "6muȚiD>e.)k GYObԓ`apq!щDT-wkde28s^# BS;8'O]?gO Q@UILJJ~Kwqko/827sȔ* )t Xf"Ȩ|ZA+ޗ3cmZ1Q-%Z2=ofb%|2ykU\ ӭW.]o}[4x7}aH0!)a`ElN&un[ۜԢG)r'(jj;T."k'co&#9yrcuMQE%XmBhix-xJ[H`#[n=wwW$9 9.&k/ַx_ʿ/ܶmQ hEׯ( in,ycrrƾK6];&UjOcYX]O+Ax/ksx}G'+@UIja!IP$LU;oW6&,yNPFR_u[ݏ>ܗ5FUfQ,L*Br1|᧴iO%IvlO?)˅XDL jND4{Fl'2+<2$p,eBY^TB'7||jقGMqkQxWW~-Q;+_)!`+|rP?}>^_{Kȿ?k_z0սuz܅fޛ$ȵ.|yFO#KpafԢJȲTTer hs}ccg/֛ƒO}h{}>ۙ獗}`p^&75*YMim/gh$Ҁee3^xCI.Y JRh?_\S7nܚ^sk{:/;W&p/EMìDNMՔpIred)"RC! #<;5J)ӝSmXmX5F'бhM.xiHU`ps[@I+ jzWRCե$)|މDSRݍZ $kӸ4I[d}v-I%UD`Ilf<9>uZ=\zʊwdCN}kE=ʁiro}_{n*3^򍑨8Uoh>X}@OD{‰\P\̚\\5CZmQ!o )G+{ўp ˏUUJ".HIپTP%GcuBS}A2wWーГ%J!\/>ٹvgvTpc!JDc*Qai O7wԧ 8$ EWB.·B  %87^bw,g_'F&M׼ى_>֚qeԈ{@[Dqb9ZDy}«:)AcZј}ݛ^bmBD@,iH@Mj&]D@Z-nԗՃ6C<.!`oBsi-YkW Ⅷ|/xeѳ_У$R +AB;9PJ9.炌a5Pk?x[ ՝NQVr pP~;#SB,뷶{#_y7w` (9:"4!^\!uS\J/V/^U_t{[{;{{7?S]xo?oͣ(>6LcűG>P Vy!hi L`M6YMG5RJc2^_l'4bUAED*PuaCI8u]?3:{i6{p_- z[ݭ/==k=}_:}G'~O"rbmo q]X?K`}Dh`|}`QԹP'~s'.{Ϲ;M&cťI#W>ݽ7Skkoϖ ́%׌JltbȊY>X[IX>cnKEE$ns-Yit 9nw^|P!j')5i`uV02B-'6wƙƸܪ <'/>koe2_ƝZyG6.<-$, ۝F;qۙX\ĊH6(0kN\KoF m1Ŵ1wʲ JXUjb2Qr. s͛kg/>=)td,ۍiZ4kۑ|~%)ټ7O;oOT:CG{ٝ]EYs7nZd5pvޡf'Aٓ,$Mx!Jo0VHYDqOUs%snȀ0useޭڞ3_ܫWnLSܚ|艇:s={ZݿK_leX*aETR+wCvnޚO:n7ݡZT5GilRO ОX Qk ՚ݵ.T.7 CUOðRPK N`""4H@7/| 7 jU ї];YFoS_m _8Al[%2PDx"a#hxttx볽ܬhТ?g4 G%haEI4 &7Q:}pQa!1gá( 5 ʕH*E Dp"j4NQOk'Y7G>go`.^¯0q DQ:Ut[{a2n%w ݢ\SZgrkFUSJIje˫A žY՝!dom?ē_v R%g`!IƒYMDj*E@%M *UH(35͋|Ҍx7_y{.¹sOX˞mH!1>|ZLx.M 5ļVD""Sj딒`qh(%ȞR/`%(j/}iޕ7foz|n`ށ& Ol+GI5`WU="#+]^UaDɡz޹°JHԲ.?+DR!U3r%yQ2PEDMt3EFZ6XPEG:y^%yC[5DAë DzPP  ht}s셍 Fg/dQRPccEwc3ɣGy:jotGنG r<*#8vi `/}"4.j*²/h}mFY)ylIe2+z}~ڷ}Ӥ](6.YI4DvkyN鮢z;!*ݽk;rT#Y;݅#/جS"U#,|X+*ETSuZ" e|gR쉳p uxγOuy?!k{fV$5d`! ErP!9~M՞uyM*=?gݙml(즋+6}W3o$ l`Zj*APx*/Qn{޽n't< V|49ooj}ٻ폎wM_wE59)URFOܸqm֤C9W.l_<2UzdY,(F!!.wEq(`Z!=V <^ i HN`J ׌x'θ4](~*}Hw?2f6u>g7FatTuiuw<~co)3фZ":JۆtJs/"X*Gr"YF gQQFi! ѧx]gHDg2o֣{/N>hJjJ»F% y.l0\QnQEE{|zW2jX[wvgN9 X7dQ Cګ/oW>19k^E$%cW꾐K@ͥV%'$X3.QS|_)K+TuAUM%!h=w490JϻFaԇah IDAT.Z.&>Z]'o۷pu_a&qu\P.cCE:r aڈ>mF*ЋG[Ejpє^j"bQy:FQ`ZeJY;#w 6O{lx޳nN?+={FQ$ż*E4">;t@~O6o{o̦͸uo!،G$J]#!yXCcuxx!)@4FvIۛM3uy;f~6dk/]/̽_HS=ş"@;r^>P$>tg V?R\|,^8KӝE_x/N Z &c8ʿM%9A^H$jeNFNI/dԎ\4[[{|zXv?k7x{󗟓:A~-6yH15g?sk97E2Eیp _Jqtv]8%@DJ{1ro!2ra8Swõ9nl%ZKJdkkkm;NM(Ngi{ZͩOFBdBDPw/ |y oLl;J(QpmߐRѝڜ:wml,ƪ5+a$Ezy*g>RѷsXD\il_:VZ"FњM&Qf֤$ɬݠI)c0"QWV}>_Ln!`E# a"&0Eڈ(@$ (mdXCMh m<`~΍l,UN!5V3BE 9j4" 4,;\,Z`G!N̯%VTpzGjQ 0X!Yi.^xוխ~_\]Hqu"@ ًqq;.lD,D/E} C 4P8KY遐(HWl6ϹL쉳'NmJJRcleʒ+[F4-,(*nd",I>j]0L5usJ% 0otHhXDRZ-L=$.H8@P%+RBFO҈  \)҈YSJvdxb׮_Yk\E̜Ae} FЃ kOu(.di6. Cj!HAcX䐐V]*jND*ʽCir T]oFIJ/( 2Y!3gsIRZd7m 4p )K1) E˿Ϻ .FbZM) 4^3 BtD 8 @K C'Wx`3DDE5.W=LTCEVIUKx6aX:#buٶ8"w>~_sDHXj` &@4nh#4FK:4Yz9y~/xwt-m$H̍p &;!LPVҀa/_ >-2Z5 _-d9V=^NlIrG#KȌBwJmB?A%DBIBdĂ X-xC~G0)ШXډ02I򓓻vkcm0{.?A'ė1E`x4T).Jn{goZ nmw؟yC5q/_y/~% ݃""DPВ8m3zo._4l=.n?yi{>٬meϏẸHCޛvUu1\kt.ͽInH!04NiKP" %X  @C>$!O֜c\{}ι*>s~;>{usvL. I.B2VGG.&FR{c?SG,!Vb^Q`c&z e#WQ!xUï-7B|TkxNϓ{?&V_Cbf ]|ŗ[,]wB/țA<&CI>3@'Kg[M wss^$XY nAEnuبt+enDZ%y2G>qJ!pN;*«nD*., =N,u=_w]'2eXܷUTds~GjOpb``G98 ,8AMFqvP8{\CF1k K"R,gfʤEUP%[]èh})#FJ\(0R$Q޺[ڨ [,N: p댘Pבcpkú7/p :I9CeΥ)),hɸi@KjeV!VvhV^|8֢AȈ٤vnqO | H bCQP;K˫$Չ}y3i+'Ɋ~*_Vi'Ck2?u”ZN ,-- Gua`!ڤdYиBucUgx""e9pee{7n'e"u59DžmnSY۔ŶZxpm~]ZE1]mg`1eY׵u݅~_KZFnf)ǻm$R!]4=)YZu^6ݰmA6n(\"P6~K.̑tX|F"|c4 ?&1%K$&p|vY~vĹg?{8jȢsbZI"MBL&QLPaetpa<]?Ae"qU(w{^2fuUe8+ZAbAjћW{?2̚X'/yoM]J̃fH&Xv΀eYnuo]q}?3US1RDA,D1+`欁v4xALƆz4ZvfOu.8|p-RX5*q2 9#F_lUG?Kǥķ!3٩3_ qYǻqa&mDjPR&bUǎxm0̊Ź~FniZ>uR' 46mT&6KV!^|)Ԉ#A]$2RAY}?O ԛ^UPvu|Ǹ27sFRA5-@[ɟ}|T91C #E ` S(1u0W9R x]>wGs[C8o'_ 5 R0!3T\툊1t*؄GDR`1 #gew@䉕|7˻GkDGQ3םsݮZ 522\sW"XpFrޙǿ2. NF ȑ&UݬonwL %ul:RB, dn[ygD26c?GQUUymoI)% e3&M~J,8pUȌBU ʹ&AtX݇=^UaB5qıЛ]{ɥ{??'ksvw^d3bq`Bf FpvJ#iJjpzlכ0Mjz#/׽4n9~ۑSfe>*gh5IX][.2G\c]oQ֪~|$HcޓdL}2;@;g';z~d\0 b|#BYڿ'xd)L7aB쒩]4KǫD?ԕ ow?Q̝Q^F£{7|E`s&LWo bD [-5F2\̎@3lrԫEhDFl++ i1 2S /c׾Ͽ;I5;8v؋5VRjR(:j|F O 3zkqL@ O @Nfˏ~Q4k_`Oo=°ԯ|^㫞?>{QLTi.fԤN4Z k,F]є*$;E)˲ c8b"r `Ҕ JD=٩*GBU#m@Ooڙæ=2>m 5m-[ͅ:S)1o0l\Fk]j-l9gtmvfd6T)x,x~w!;Wu]ZG-GaP!sH5J "dLz;vN<$FF_&wMg7ږA s>uX͐[k얾۬V16X@h4ucD)MU1ƤLDf%J`ij'nѪ9 8CK}"tx]+#}%..tD&s;}ͯ gV 7n{z} )p#Db[LGs;mg7HRڶfaUZx棫XLu60`xWJNrwm@A`Z"Q`I?o]XXX^wg;'5|DT)&`d0ИYD,dYO}k?>L*M=?sN8=`i*l7uFjҢ9PjLs)DEu%N eӿl9m=-6 _u{{y9w{:#63A$2bSm T(O@4ebؠ"9 nDy$m0hc3ZkKJ pUU"b܄ĔU QS*Pt :'*0;x\U74:-(`0$GFduSSMv6Rm`$Sfԑ4yb@;Vk҂)be1;<'o{/urSE^CJ|uĞ3v. ; IDAT^SEe@%e|-hRltvԥ͐#JxdfěL )dɏ/M-DMΉMS0sTIT<'sBwnovitm'LoXtgΛ~`;?͊ cvޝ!![7Ivͻbc704ԎӬۣ TFr,Ͳ/z;v۹(_<TP%E0 K"Dj3?xͲ%<'1*O\HNwdFõ[z}V8P轫,njhP5Ŕ 7u /cjL5`GC*I*i#d__Yku䨎0 k޹+.KNV&ʖ6:>/&lb< [9b(b"M*FLCh^g<^UsO̜}J.`B <틗)s0))z_*0%d$?7(Vo6N. TjvP0& EAN(4.)0ed?GS.>_a* 32AD52gO|VF~ /\4آ)e+6<")*=$לhb&b F D^<)}ŬGVpy0ɫ{IԱ dL !1gOf6$]ElqZdE#|7rb& *nCKGo9x ߸q]DhBiGDD%z6?usMbQx_Kxh'W+єu.|=UZfjaICg9lSk/,v:s2݌:`;bFۦNW"KSM:۶R~`mOSMm2W;~w}K_ᖻ9Zu³!24˖5ɸ)7hO&1[_HIQff&(ub0Nѝv;=e2sZ& DQl3gSs3 ,S`;5ƹI"kn5؆i(FUvlNѨMJDR5!!6wH2a׀iOQ6>F D"9M7ٵwןwMb {< .sP*kL`Q H;,r[[5,a5Lbz$hSujsmۊ$giқ Dd<Gӆqm;Y&)yJ` b`'vС ;眒#|'q-k cD],Hvr=zcǗ*0g<pi%]fb|N[TyyO S2_3O1qvwc<Иӟcyg\X hFR Q7N戩vp$?dUT„9֤Qc(/ Fl<>{&sk\]8*s2(tzj<T= ;8fc, \EQ .#i/.J nf",$f|oW}Cv\{8 Ÿ b"`Ɩ<`iKh1*'؛q8N~=Q8g^n¶W/y;S7Ycwyd_;!"P*CUr{ QU/HAj1 +e;g_? zȹ.MlU@=_UFKNusvd%Rc#[Oڭ` ưɠl N̜EAp)?!' FIVg,iHtX~M}~T\#3wמٞe,V%#>KzJƬ3"DA^=wc%0G "bwaF.9,u|Xugr=+)AZۭHp[bk$J q&tν ]$ֆ'"oT׼wFK*p8wgC1%lL(F1Ɣ#'-0BɋsUpACTXTIlJ1{~z P$ f E/&ј<RVhOK6 ’"?)0,l7x854s0RIȷ%} ˓yeΆ2xrIMBw>(53#p=@*j4 O&PY0ckL8 g& jN2ڂEĤ&3&dM`EU\}V6#-Hy7ujUaL""L~vjK}}:3b0&㉡ڊs򭗖`BR>63\E=i ;"gsL/<ψZ1ص@jD-ضmjm[6ž9S)u)x&ڏZlfI%qGtmO}s_ۏ[!"6 k1q%1MMfv RcKkV2f4NA6j9<E׻ܻ].cI6m,FN&F ja54iW-(ک tm/[tT_y;)qC%FS0Q&0aJz84vTfU δafSNEYR*$H)ZwY/...e숍:߁+s实fZجq&yo߾j{I4 i~CŽNxm۶DMx9;6lIɲXZuMXjG) LTE&0+Sovhbbqs_Y޹{o:~O,9=/dg#OV̹1"fւ}H7-|ڗ-ߴTz2hSID Bljܬi0SaݢvY;sxOAkk?~& ƹ&y.AMR6}on; HDl0gGt:؋-B>]l?W[̞%Z/o6D/oChG25AXX3BD5.XKg:׾?$:$к*ug_ <ӣk]3rEL g*.p0P'_/r~fV*v%_\x?LdE0D$Z7gWƦiQ7ĤU?=xGg>WwpPxbu>cW3=39E#($B+A9琻y sGO{?x/#zRqdA6carLvfve=ozw5؀1 CFR$rfHF# 69 ! Mh;_{UB9%a0V3k*O DƉD*`}k =/yY\n~C0#2Aι4z; ^f[#aa' Ie5XLt%THVkXfڬf_ h~H !$V*7mQ"qI%VUU_Re/{g.Wc9G1yI9C!B~vaZ:\|z0ݽ9pރ.8kﮅE'ϲi̙pj۔2˖6%M4NgIJV[nS>ovzUR7b8UeӯvGPӗaz}:s,("8ee̞/VL͋O4Fn4t%SI<-go7=mM\a&0~δt8DoCn 'yKx ?(J/k@9bgvzVUc;w;9:fQ =]v~pőey?D󞋢ؽ{gZ$nojfPٜ7;;h7x%mRЎ-m9#6=̢%9DL 9wUņ㜇jtλ+ @UqLQyc^*8Z36b]ud+>:\e->#Tb T)L Ldhm*e2 -o,gh-+)'׶a*-Puʊ'ҷԨMĞbsb=RJhx[3o9jEdž ͸A#Pb yӟ* (v7O<G85@@&i9R8 1Z o!`2&T36( RK윈NSiJ*~lK&FK^s?cO{[?\f)46)EW]^bmy厃G}^>\_g<ɟ_,X89%a%8s#~>k.N~W\}| .*gf NfB* ")yo-JǏ1$}&' hn%R5"GddB FK~7O`KLؠg8׼c'`=݇BDQV@-2^ 1G_}^E[,eDtBI1W-70SY'e4 NwOk"F=O}q(M 2.rE-_rD0*Ef.u3W:Kj)͂s=lfYg9NkR9@9c *LMO&_K6KE T#9dK'm^reJs'7g6TZ|&J <bUQщޣk睻|yݻ߇#%VGID3!F;84n[JZuЄvXA Уs.F54FDgg1:MlCs&3S°"s 1D,.3XKrpEY1t "!mmByffLd{'bP7%4(eӦ@2Zv pILD$!' sEG8SD5+X(3gQU!DO1SivCh f7xfJr`)<AKga~KyҘ_00t9r#d>Hm\.s޹g>[:xIs}Vב3pU2 #R6Nĩ]{;~mߨcZȶN#M,I' 4-i_f7]dP(df! cb#( : Ni 1(@ ^8x{]B!2렝~Qf<C|1@]2agX;#/#%Dr\\dAz"+ P3 KN-`INj~mw"R#M`҄vY )j lvZ̭fKl_UuRTT,d#Zil9穾h*(̬1`%`H)G%̅iUʿ+Zaq`13 RK -_燖-. 9}Wo>y}UK_U*@͓̖簺:|cF箲iu}ϫj=(̟*0»K:#7|(:׾_h: &@}+;Xp cj +tzB".,^0ǜsHL!nanN6??.i3؅%0D&jUE U:<8ۆFs#QFrVpigѸC9\'y0VwnbrbUؑ qrI&ydwAg`+SEB \2cG]zϬ: \r2X.כ~c(zIe+O;=[Eë(TBuE>sgBA퀆o;Sqk,.zgrL9SzϬUgfIe˙$Q,I|('b)@@9Bd#DA'b~DTeTd`5LjSWGc,uwthn囇iyJ{LP?)y۲Uex寿09s0㈐iGjeS-.f,KTXҸrdD};ˎyk#L$rPB}-w;6vï ? 2r*ExpRByn]9I`%9LsAMUeN]_^Y_>rE-GH-r$ÈDdlfʞUjMdMW!U bEHFVA# v&c)ٓ4wͣ'.<+ܯ^Ėp"=Ȫfaحػ5zzU=:]O^Ms!Xou xm%xL>5*P&.CY0sݻeUKaU%á-v ev13G 3n+Nx۶!gOڞ(4gXS qiUdlvh{6Ur7l1)9Gp j&?6 IDATDu@扚[* ,'sBϤ,#gL*Ȣ䈼~~`pby睪,#B7~^\wZ̠Y=]p g-S45R6 <6WU59syIlzj{tRm(u)e|7>qW'A2$b,hD~~\;)K]cx壯2[ur6Ôyga{6&l^~gP)y:iÖMÞj6Jn?\73`lr&;0Q݉ZT5&~w[+1:2FM!' > \QtK ͲnoYcտ3Cb a61:D19>:qټ߭.)jEޛ_8wN%0qG9[7R]'95z࿼_+׾]xSX%@lII*CȌUI( dj^W߭Y^WPU↵87s=x}X[)HYŹZ>[jM,`"^vEϕ@;3+f?-ֶ4 ε\UU]}uw6`.m[Q%<"DA(Oy<$/ A< "%D I2wW_^^kF^{s(y詪ךk9w3퓕]a%*:{4+,\%IoHdQwq<7޺c0 )V4HF%' h]"}c/=/7r."_/pV9s5?ZDZbأ^ӓ?S?pӆ52x=a30DnErx8Mc-ZL5mƣ[19qUݬT^+hڴRv5R*;?7|c3Vǹx,NUS'nm_{j8> 4$`/??>nMJ>;|q(5=#2Rdr͔m*Gj3͑Yk=*l<;ͭUKj10/ޣ![;$ K/h3s<<;<=_yk6Z5jҬO}旳p ô zRii}LJկc,@y0H5в# giY22 3L4 J_zY{LTPyn)yTpi d2 h6l*vImՔlιi1m#U#vNL%ise4}rej ͅO6@ҊsU*֫<=ig}r{oo{ŦGIRA@`m1N8G:4oXo폞V$X)mhf9??wx/_wn +&3mמ] :rC<~FJ~Ne[563*Vu\RNH\ K;%>|Hݷۭ?=9y@fպIakRʶc_q:# oQ ažY@A|ʜe=XvxW7l;‹' sD ($$T3ym k9y[9D)#< h*%Rl#{O~cu<#镗[ǭM⽳='qy]Q1#Hz^(YG;dr&F]drgD6իw'?xG[BF+y7 ^E{OVyW>й0sw/ˌv hCFWוùfc =d ʣᲹ͏ݷwΧvIބ EW_csۣ-:6Odrθ|حhL1)ܟϹD>p{fG~HYSJ%m [GI60xB֕BiVZٶZ#Dp-hskcs4{_ڿo3ePoinE2nPw[D"2KŃ;ǭ-H:^w3!E*[RZ~᯿{^,U }up[6XxTVGՎT,MP{?__.vY1;_SJ9ܜP@$\ɞbvP$'`@jM"3f'TC?7߼'cjefo7zwXLRX;88߾ 0zqɜFKN9ڞ ۆi`**PSO,+N֫v~z׿W#ŷG;Gw`@0pŌ(64?G?Vet3bw./u{槞y2۷inV@̑po89C͊8my H԰"c{_ݧ޾nb/؏FU\ٲE Mv Zу^w@cIxtj!@bJh_'o=nV~Kr2)$%P,k.b3Isц+iIF|>SG_|nGմi,AĎϴP"iK RtS=): {59!Jo{MFX"64JRj?i6cn/HwUY*y:a_5iX+t9fy`~=pjǹXD;tqFR"V@'>X==uy7o<rbʡGǣui_RI/_]gyN* Asknśr|W?'>瞺3T/T†l3a=/( A(E$ n,]{T!l6MDHٸ K7QHm3u@ X'GG=;{|/Im\O(@s9a k0A+mOk2odC@%Qp*ʖ=(f/QӡkkWQ*0E%;'b>Z <=\bP*,q 3e6G_$_h_ CYv}=F*^ݘ/qyc^sڸz+`fsd7g;l;2eO/͊-6-:Z+_XSr۴sw~;_Ep4NzPm^xaG).lbiavǭKׇx}v.~2x!jyt>>\Zxݸ뗺*[q|cd֤z63"hv0?O?؇wa؇!7ZU+mѸrk$WsNYjPJZE3`Ehfs_颉futK)]'FU0 hNBD{ٺ2 X̊H" Xd9:W>t_y{Wa0ʑ*&,TDLF#D hKz\,)c0Y1j3gϽop6gg4C/O>SZ>WifDѮ>zs6˜e :ZpB*L#|Ԏqkm{x5CqN1EΈm`&LFDpv-bTVH"u`4ؖ4j=ϗ^}ixw=spӳ}7޽S߸w4IZ-&o\e CVBVXK3RM^V'vm2q`,/IO6/;(dٍGqRoࡎkqeشNQ$OI>$/zo+o8?_:F -k6zoG_z=w:5ups4Gv k-O]28,^" 蚨 ;C\UyB*szz7~ 3Cr'5~Z^Lq_VBr|Z~R`R%`z!L R{jvqJ]2$~G O3H` 2S1i,4(uy) B.怹EڼQx[+{'>랾p1Wz:7҄HpY|tx/ Or}ǻWxk4c7\@c~4|c;;:|FlX"_>:[+/?޽^{[/<^g?-rVB)"d<%mèAם?=}cW=R$y=(?b4qupN?|Lk#*%F8SOsNH:~U?s'PVǵ}.'{vxZ>9>;땛r4.(K+ dd@[cYUJ+_f]( ؇~%ZVܧ2[`u֢zM-hlp30Z23w & e(z$\׺*ek HS[7 D9;Gc]u(Qjhb!0%,96W^goVU"$iR^y.20#WCu@LMBdAׄ()d`@!z~2|g( :,8YP80pj :hM)B7Zʔ5B2-Gg~?6C!c(TK)fNc|a {Tx'ǖ/])eh V 3fBLZDR giw=?}^PܝMlNre@-ҽHi`*S3G3aG3(ȃ)͆JO?xÈhaS4{5hC6nj]" jFPh¹YK-ٔ&w. v g-8|奏c9Cz[56RBH-!3`%&2D8DjtMdD0{9 W_~cGԶԜ-r29R6Rz]^X8J*EDb{kj{3L+^Az' }lݜ\?ɇGIKvAWky1_>< YٗF\}I}#pz1 kX[ ]ۢOt_w^~W>+~PhS vDh氃HYKQS>] }qiynm6SZǷ7b3M9@Q`guQB ][$冇>)1K2ބղp;]{y`(w 3]𛏃EBIҫ_ dP#a !1;wj妏gN b1d )gJ}vߌЩtm;Yƹxz\Z1=/wwz2<<8s6f^__[l/21Pڅ.\23waf}5XQI-νvޝ۹ \s՟vo Em{5+O:ܘȣf7k&)y!*K )AKSKf+nΞz?OGbT3Y'uB!tRV;VƤU 5z L=`,BVM鵬9[(S-Ք\r(ŐLHXx純OHľz4֚1jJlS')U3R͊!20 7̽Z._{Wt%KAR8eJ)c-=i]ѺZXpU V BLrQ[2a,潪n9#×MW,BBܷT, 7M-"d,uψ43X%גz4-v4g6.U  l ,}[tgvK̅L40U^C)PuN>8 '`šڷNJ3 VKF+*J u9X 02{°* ?6lF)o`DU)lLš6ͳ(I-{sNr0VƢ㣣"ib&I!s1d)x@r08XppctbN<ƙ3WI㝉A^%2AP٭ͳϵM; "[<͉¼0}ϼzodloè]"kiRf&Zk1n9O9 G,Wλo6q-ߩ5i= @G/lfJ&R>q1]ܿ{ݿ~rw..ѪwqY /$f[ZW??e^{z#Hq_g?pY.D;'2&!ktfXBz6G/}I!,Bܱ~P+paь T+6Ozt: a+kBbSZ-5O3udU<ڊ_;^~sWTGlnJ-L6jGuʭL_ꐻv8Z*FK1ovFkY_yzjssg@ 0z絕s a\C^O0kuH>Ղ\ݷ@of;uI1n]^odd2+&ʺZ&T%:&d a:pO\¤~%-j7E }"`,yJ1jg%W`KX%.&)º7g&QsQ[6*+BH|<3U+,,ˠ[_*:v2" ̤.))VJKr/y[8ړɹmcj5%68% e*!O6!Ѓ'4>`K&i(?WpSWѓ+aA/Y.pebWKQPDB)7~`^$1b:5HЇqf3|=a0FNi냧83S9a@4X5Z.R ͝@l]6$u ŦbƷWo?Aj:ʘN[l3?W̉ [h*\>V#6&7+Hs G8=щ[jVme5Btރv~pdռ{n݉X3ddm~aoc1`'at?V;ףs:pwS~ew [O@)@5eu9qUn_^Ѹ{k2_4Ǹݪ6O`f8ϗEL28lh'98&LP]] F38Xo1E+c[9ᥫ cVA'$ut/&w d{zWs|`1!u:IO訮 2*IsّYXdt#oL] NHh1i!J6R`0ضdNcL!:=Kxa-ZѲLw$]wevP@y8e>J1VMJbR "K8h^$iʢ JwRd;R& #m `@֊!Uuޜܛ Jzenޕ'āDvX-zr ^TkWXwKu`w2#IL`Y\o,B\`HĒ  K.n3ˎV˜yHX0TRKQNcBx~DOH *̉R5 EwbŊZC'>5)wn-v%8ӘXOo6TEГ⪯L¤P3ЬY L-zD " )$3HIkAZ[7 x$R8g;hCٚ=%L0Z1B n ;YJ3QgψZ/>dd}յcXQڒw&eP *sX+ٽ^{@7@4%fK.M_V$%z<,eCmL{~~lעv+5v.X'Z@C yEY)yXc/W_7Z9$m3Ұ|tz\h #kvI6c<8igEYJ= a9Y_:==svvӳ8>9ZqŌ6mF_xӟО+6hro~կwn.%W/d.Xjِz#ӟ<Z]쵌;sMaefM{Ŀ=st=xa]ڧdwc*a yqZdH2{1JG,ܢzZ$ݓG<2ᵚNy6 [(`Xdgxbض!\T|*{G7o:Ee5i!"*qY<R@J)nNT5m ^*KkSgMnf͐$>(VlܩymieMJ)扎f׹׾y#ʋXhѫjsٓ:b#~'ye]ms?쀽=ӓqn/e@v0=%q6_fn$~߇Œ:SoO]y=GI2W{ 3ܥ%aYzg-S1cmH\NY %P0Xmu[+NuM9疪=Ni6gDgLJHAZۊd^0x> -b)qCJEBf%rN :Fػ&2! ,#TMR`&7p 2MKmk6КiP7ōHp74wsi biiϐD 9I%Wtx`e"|X{":0CVŐ,l.DhXڤ{K6Z~7$ @lfb!E4b$Bnٕ.j=C*3;ܝfDDºʙbD%N2/:e$ GXR9|1 V D.La1⬕^̂@kQǭǩtyzR a9I3buykͬFzaLZm,tKdzZ:{MZ"ӺoTR\hy3]%XD43 k^[c^ +"!Ň(`]WS}1Ļp4F$Yu`ő [7kKˠhf,b4pR\No K nN`qɰt33Z wPZǰ4 R""a$ TlTZuE3 9`5sP0031XMSh05w[iM̓׋0=cݩN}bzv|ը^8Hg/n{盕|Ruމ}3+؈OKrsO:{Q8<;vS)ڜ1MӃo0 j~;NGGGCe wZRfﷴ޿w'_7.(^JRQwg)zf6o~ٝ[ZZ0ش[%}nu浯u?g}Fz%qhYpp~,~ C dx]v}`w;뵤c'>/qTk- -{z0Z|I=-YȎRtDNrsqkK'çzηG p<ڀ6ϗ;;inAJm{y!YG+6 @dr.EkRU͈hVK9Oò2iF-I.!Fue㱓F^J}3L a7,xj2q5Z_6"bXb텗̏#kDdLM1I*>q8}Zv'!7˝tsƴzʇYKrW:7|C&Ń퓃J^HyWdArow[=;zʷsZI#+IC5[V fAt{[uь iVB8Y:}ˇar5 Fh"`ň:]L5I84aRi-QJРDqU0i(.3tl쮹{4IĶ ; ;qŝg7JjҀud272*1W>,2ͩLp-!Z:;ϦJs0Y(irYKtR܁̧?}x i)HCn #$Jv_1Ώ}o~]m|jFwV&v-X  4on<^i9:Cjsq95朞]^,#9z歋*/*k73Ebb󰝿?lN`tFB~,3ٛ}jcOF=؝@O =u jOO w'=w _P7|{hldulzO~񩱛oFF̛텗"M5 e-$(mXsg S?.xo#>hkͧ'`Z#~+㥵=zEH\m;F??tᡄ:@ϡ 2!](Æ%} KA 0-Ez@j_̌  YrbJ8-:pУוwhq`՘><,гF-QN&hO$=-$%cY4cRw?q8/J dT,Xm0,ؙ, "i6w] ZGm:bjr$ [fuYSËHNAZ, Vd*tIRV] ie)[04GОlj8x%$) M20:a^̆R u6,%[dsW` ͘ @.'iZ^cqI. `?Q(Dڵщyz g`P:; 9]<8{wldQwqE` 1 RR0;ݬ8;Gd\%3FJ%PkodI }eznɎ+"v{oݪ[AD QCK0,ãfӀ~1 À݃nMʤ(dMp2wC̓p]V xs3w+VP6RNv)\Ew'S+%MRJ mRD̮"-`Q +"jU$3i]̀lI twy$Ro&B@eC֔L-'?)6U4qd2)с\ E,+1(Y ]ͩdڊOeci 0IRX3EzNDI'^xͳ=\v/p7< }}z˻vt_ύCݸ:v/ӣrmM7hUת xzOnd;pǟ?ݸQ 3*I[P.49{?]5:h2fM<ϚG?|:^^Zk/Nn/~ՋO׿ܗ_Zn=mVx =/^Q-Ն_]]i]ӷj(75 GTʢژ'[d* jRUDe?TaQx+)eM46Zu2Vi8#df(@J4NYzR'rAH /F$tb\`՚s.>KP lN-J&AO- 2 ]"(W\9Anxd7yXg ESxf_-gz]V)kKQ kSl5ߊQZUf(!aXܔ6!M|>wwϐ||[@D)-̃˻ف:(Vn[#Wmq#zerŮt8 BYke5$H!DyAdC;E3QPഊAReYJeYֈyn-yv2zz/|yj>B_HbcopB; Y_|v\;J_3ՕNll/׎ka\tзN:G'a ?znP߾OIBJ^hGøUj=ov;e)5JVYT-3 owdX|k !|{L;-J.o^`=n|</g"Gt{:C߶qCǖ?^r#V@ $Oz.v}l_o˪&rCO!jWUe"Z Tި5Yےc-xLb#Ht:TC1l`QDҷfn 6HY`*S}!TMlbʩu {^-\)"10g䀤I5/ !L.2faHPnEڈIBVBtaֈѹT kc:R !Yu`o@:g"m6>rKl>jY!2;IRLV# X!+3J_"%)&סV%ǻ0cû)5v`4II6b,Th !W3)zZ"f&go"U`fKE[{06v<%%JFȪ#A9ѫ\p@n~+!9Ƈv.a%:B z6G(3s%Rq)!^^ك\pNО.z945;i:6uW/^+dNY|_oMi ML52|X{Y5y@B#G"Ayٜ:z5yIk_~O>M4N`Ix S<:co;miť|8_gdϧs  4 ׂtJ1 @&MF ~%Pb83Waś$c@ÈލވnuK)NCw_. #"c2sh8QC|ϫ$F1VVsQ ilha,Q `e~Ek-[6萧:K0xfneFe* fJ^A4nVd *))tڼR8`m4GR]d2s䰋lM3U+@86̙(FEL_!F_4iIQd,0UW&&!҈Q=5Du i5HIjAj6ɈQκG3Ppem/>n?Z|hTVZAccOɄêqSAj,؋,Ќ%&!T^Nc ١+ZXz2T F)G-wU e ɒ4T~ ɌK9[6k].vQMVOscԹ9Fr0c۬s lFxy ksHU8KNc$@lzI'd7ۿuɵc,!3J`Hm'Ϥ߶W4R?u"Xg4N6m(3K-"52_lɉ%!qYk=[KwUl4ӌ)~/x0Svna曻t~tp![(I.Kj>_T㗤rV[ݻAFD%Or}|uΛֈW tM-͂ܯ٥Lut~sijk4-7} ̐^^34{,@wlzюU fbGoڥ{ac;b~/0kc_8d ͿqLHgf?W-svw?'C- f6Mq!`{2Mͩ=0>>;lP.mXj>:cd> G$RϜۍ[vxZlss(klx0)~ J+m_sEn3)e2k4VnvCM :X}A(5Ի׿KI(>VRޥT6pi 7J̗t ?+_a>?rfǁ-Q9NQV]eSۿo}@'v8qMc w%&_Te3nW]Ltٺ1&+zF]$˧7gdٽ٨/()K4x Utp9/Գr#KmcXdWn6Dղ,ΰ3;pݵ[];G5/wC/Ϸz(5K@F(4W!@B#I@"VL̀ IGt3+& I|/1%VQthK$S\Hm9r0M5FƖC1I>ZF-m-,e U*6H(¬p%3F79Ps2t$Dn.0M۬YZiAXl)ǔ!$9 J g- kOZ@pU@lWThb TB9hx!C٧V>r*o0$GRUua@苻gP\Rr(> $*ƛN5Y0TB6Oi2j\fJ*EhDj҄r )Y^" YjJҐm"^6"8$TN`ՔȂ"!g $+PU݀5d4.}h'&1͆r؂ ٚ0h2LmIh>^x20n. uŊ2defH!2IcqI&:!:MQIE]4JalzC|%{!CeaQHxN&d5Hf9H)VǑa~(FP6 d>F6~mGDD%6ʼ6Vzxx-F`i#L^xHpx1nqBf lúo~k~zθ;GdYRW) ̬CL!a{ `uꃬ=x7$!1p/ؙC t*x]__W*"HNT tO/z'Q"ajc|D#}y.3+MgƀD@JIfEzyλ?O?֗yѮʜݑp7EhNɥ` ƽ:RKVgHmo`FL_9=e<IнENz4{]=̦Ӽ ѿGgw*.&MkYot,EX,|'D6gkZ$gXwdoD cN%FWCB8/‹*>gW|EE9suE}7z]KUd C͡- L ^X,Ct7nsYZ:#ak CȬ+uLs Gk DE 24{&:24s)K=+*s$嵤y [L}?7;z˛uJMoG?{77^zyɁfiPk9λ f-?"¡}䱴EXnuBA2##h(WlRHRі~n0F0></i c SЦ k'KrdJ+~Dlp:Jmd@vy3>䯶}-D"JBƓFDb)XrRKBp0#sE &'Saji!CHAe]fK͔4o::d70^- 7 \-F"VcB.6jv( G@ѤpeuV3PdfM[h5RI*LiDE7yh9(f+@# L#wΕ '.bL&N \谦p-@dBis2V' $A̍sf6'ݳj1ꨶFEXehRu ʏS%+*pOpڐ+].c"M+fl]$  ֧+D7!!f+52z.&2e2WZhJgMI;0x4RbJr7@ffWtZ#f.w|0 XPE װx] %kAL]&4\fZG( SUn"3e2+=!QPz^T0SCȒ-R!V[ԍe ei֪ ۨ(>3*6V`l{{#t$C`7tņ4ؚ,gLҢZd1GKJ6)5*LoZWM*5@=2E)6^//X*Uݿmsq.' Gģ2CÇ z߸$gʙ+զ7oެw?w曳M/m_~uuݗr4Ce=޶qώˌb/OTƖV՞w_6Mt:q>`)"nnou˪RGi?ic/<lxсɔ47߼~+_}&AFC^,1 .o|@_="ڶ'=X\5ZCn-b:ɖ+1zSu$KG!Dv 00u2|}|w?lSf%B:\ʳIĐ*ve/mꉈ1jؘ e-V mjө]_Ow^^Y,]fHvҞO`?hM}vw???{O~Q;uiUDiv2;H%46[Yj==!#a9ǧu[?=֥vzlk)6Fp %cJy ]~šr'|g"|[ ѭSfVbŴ9|G0CsW]YO&Legs19> џ>z|3v\ra:Ǎ6&cn?/^"Mo٬ö(2y.C&}|kj̴w_~ۛ!{\{4fb'Kk;([/%܍4ZAުRRʭB̧_W}zn=QɂJ4`gwt+yUvy6&Ofalgi;/i.t?O;/^~u9~'7oons_2 >K z&yu>-K62) SbcBIG$&ؚmr_k@my=M0]&h Z_F3gw W/;2ᆎc'nԘXNVek]C,UN[zMi@|V]{ǁ)4}i]ǿǷC6O~r~TMW hbw^O a8G#MlH1y;h7}̎z]Wià IDATwj+ mc *}HiJ_[={ĔàfT m@P`vNxGbVQ׫XجJn69FfVA{|j~S0`10!A!aՃdUju#k[37RQe ,Khs$f <ܚAX+ܠ\U `bZQjH4A uPHlW)&:z+}cdZB+,*Gܣq*{ 3kV}(;GK[D~GYVC`ʍWtPOak92$T"g [ч<tfnUG!JAqJjnQuU&#Әee$TÃY&VM o!TC3+we;{b6<}?vKd[e#o)ڠ=om?pz'W^|_{7<7ZD4(K"l^}y4ε<znooZCu c;Nn&^vHHHH.%DF)q#FсMWz .+2T[.% {_-w`'"bC6jeuD^'q16#<(?(Mso=4rSKo^UD[S˚}=cTPdf33ӝz7g?Ym}wfW;@,jVh!9YӨΊU+r>]ͫ/jni\RafC̕nfͭ\"jjM1 ش088Kv XOjYuY<ʕ57{Vt"߱*K#jFRyK6[k>wrw?}'7Wko~~]p3IRt\lvW(7h>C t+.0x=l~K:|7ayl /$elFk[_O:Ĩ[ B<V(?XC i'no߯a"|[5D rL;r*Y(gLR47I'9ZŠY3Q R@Cͳwbq$Yi`vs20+殤0X`0h }U7YIs,XAE Ɣn@`HUa(~pdx ƖTB- aA+;W5@w"n_ORH.*FxfXlV0yªe% YXH|3^EEġ،VF@=ݦd6ڪأ<3mf N}TZf ( L HF##X۳D]RHͤO5DV#eX-n궊w k{5 }JnKgu?f44D6)o@0 V&뙴HM Y>y~HA)F\3T]#eifءsE!Zj}ZmuyZ#+mPbLʂnrM@C5+t}j*$:|'׍Pi@0E6ƂdIc`@d[m.@U"j{oXO Wɷ 1IB CD/DWFT-B%aPsodeMCD*0IXy'GG:&KU*WÉA%Bew IPĊf YiVdUag*IJğ!K+I9N{CV0LLe5̨4nv o@%KʆMXՌ`$Ω|04nqn'E |K%#JYC$={ 2]lD2m{d(a-pP$X!"~BU`<E4b{QJl%†>X$!@ҕ^:CD r䒚 łlŐL&"-Ԋ~!Z:43/I]/# Z0lmh0Jż{9Vy,v6Snք~Lf%y-ig'`E r3r`Z@}t/2'̀̔=ֳH5]KPY" UhLd/o /a2T(1&SX"X"X](fUQ3_&ik{/s w~<]41LՑ9B{WWW4}k_s'?UH=(W1oS:8pts;^Cۅ>t-|^s&u %i2Lw}}OWzj==] d 'ދl ͍q57{ݾeɾte&>t4NJ]6 I=6E ёi $h,[>InbZB%\(zU~eYJ+[b r^ @Ds# *ɜҫtZ鄁9rypsss:J}odlE={snv=dcDF5:ds+db$ey]v=M͠ͻ걈ͩ@YCZiݽ͂=Gr,~4V+V~Ac ?ϸm8/"|D3HEZ]T8K sCFfq@Jf"*$l"zQ2cHW[LU@E[bf Z."$BbFl^9U `qbTR*aR2S*q.V\Kʋp jIÔկ4Hm^RzIz\F@*6ASF ϲ%Eh;  B;JbEZ3ͬ"Rs6!7:B iBojىMMӤ'K!R4U(; jt@%]AcrQ ',1Q)NG?%"*O-z`*,Z>Ä>ŢDEIXUhKJ9Kj!ӄ4PҺxϒ@"i%&TnqKiFȥD޻eWBc̹{s_r(1%xiCCRI%!h ~t@ghҠNg̛Xssb?ε{bc1`gWQ%Ԭ=}Ao_w PfGV;ŜYv=wG]fKO@eqzaZё(#ӓ 9g/Z6 ʕH׿\.X Fd>"dH{"Q7jwSjvJW°*̷>t($AU =o:OϊqwRO1s 26CfŠb (`>>.a+x)w͚O bont$-CɱaUSe^g}h7a\"D³1u {$]!O npM}ߕmBC e*jZ }Qu=57sz=L!:?I2CEq)hC 4wW@QF!Rc?>{4qZx uُE__{mX0el91gǞ+#T^Ӣ}~5~*28FȻ:~w;2j;8Ia0E!ijr_-%NTהW%ԭyd  U  /IL.*.$RʃmۊE,JE*{ZvtTبb18nȉj*!,ԁTK sS ̦ X*$ŭEi|n6h` )_hue*$ʮ8b +؜*XrAEk$RpZZ2#*4"*F͓Ȱ;Vڼ Ptl)zam}~ *,"[Nfk9ԕFVE|Rծ<ȥU1|jg6M]ahaޭ<24cPz.>۞JJ*̊?N!N/LҀI x=Ѳ:Y=UM=Qh:EUʀ c2DlڞW$ F0-[݄?@fiZNL$'% &R99𔬂ǵ]E,qsyo[5[[eWk"^>'bK|#]қKиE$vYf/ $YdȳǀUY4(3I2MBr^Tj{̤E5hef&R68B/zΓS(f{9vv5Z2fEUi78;>0$,_>ʈs*"|=511=ncCp0_x||tk鹏YCz-g=""s֭D17cG!_$Ѫ=AA#A/?~>pɧzFKpOÝXx stMlKU=#'?W_}pQ)YM>_.=5}^łNKI>Z9>qYEaP؅äTڶIrӇiEt"h6m)5Ǹ?ц=YGk 4GL!h69gcH1C_]Kw1f[RI(g ga:X{:k:0~?= W @g(ZxTf6wJ蝥|;l!-nCf *Z'E6C}ߨ=5nY",̽+k]>'%Uk"`&@&i>)x@j(Y!ožf&UTlci ɫQ!H.PD2e Eqa^C i(({pz iͭjNY^Vu$B?~/'!i݇g s;6ߙ:?|Adrw'Ç$eQ XÞ2 2U`4/Z$.2=q/rJ٦) n{;όuT=[@.u3I¤֚WٔVpI@Fpdn]nM+u45$gP~ Ji,=KӒUhО*CMPtpE-Z8#EeG~OM ]_,bQWPK`LFlVHU8!'Kpp%²7ԐE<` pk5P<2<]H*dv-Hebwd$ǐUUXXViVELq/sV. IDATJL!3[\բ(9PWNpb@q>tm[n.)TB$GT>VТ HzI8xhR 3+J7LKn[ qcт lUBfUG(:j!) a鳜kռa87ι;Ӻ.lEHn{hy! u~3tI4g`StSUHFB.WL]U{7G85Fg<+"ԠƩ^GMuM[.7FF n{?~qݧ}_}AKT<77:;rL/*/( KIsΈs,kF2 Xs7ǟz#?߅V" wY>n}?OWT3srZc[DBMmIVׯ|ېhKW#:>yz@ \ ^na+liTV*TgW흤|TbG \YF.2d>]?ÇK2"wޏac\"Ç}3#m+|cDEh>> hpfrܴcUvd*lǁI$r۶O߽φk3PCTce[ˬ_=ƿDt:?G4kna${ug55Xh2G T X)?}nGwyu 83Q^׋닻Ȕ{oZ42HOVL2!F*=(fj5[ө:ºGrk̜-2孇Q^²4Yu] jq" VJ¢lu <>hk4ǢpQ~ܣ_#G~$rEңf0l \H.n]s1 YʱxfJHLI; ]9&Rn%]ca"2-"y᫝tЏ[͎vΡ;e'4݋;Q5e$EFV8İl쳎k,C&if2P!`*bqRWrT"܍ݧT)[q Lϡb.j Zq)-"#c{(B#*=sur / cQZ!8;^J$|gizzXS!i٫sYQgt@K3֫vl2ʫ V5\HTF*e0y,Z!%=BJ;Jl>]c)r`u̺ GO[ͱp@u'iOĨ:52w;3GW0Vr;!o{jʼn8rWK;C8 p-̇w?c{/׏wOXO#YqgP6Qz~3]${.P=j:z\G\yf{Y'delF^~m k׌ʇy7NfNtoZ8q:R?Z~{gg>9x񖙹9ԢיT#v~3p=EPYHHjtS.ٺҥd"1-͜.Da1p9Pyxn+n$/ǹ\&fEeоH23#S1cO/~_+0=>=nKc{wonӇO5Ť?=m[Ul=x撜ل ?ۑ11%-1U"ݻOpy ~fI.0ݬAUiF} u:fOz-8mu֠޾FGc›ow[}K~ Ww;f1` FC HI2TTSŽigFdDΐ&9h)[P$=\co%f%RORHתP'j61Zx`SYDTH!Tb(7)w;ln"K6 )VBTlrmE3䉤NFiҪᖲSo~{@ dc8_`H(%ZJ2q!?v>Q:#&Xdw5< Q˖̬'Y@KE2LV(MAYѽ:%ᡛJ׽9 E\ 1 %d,5 WU0tng%+'2-)JMdSk#*{ZYĒ .W *п7[9Mtm=9صtuEP dU1w./~WOt{B'e2+,[eao HGu啅Y^7Zσ[#ӱHß}\{qcTg|~|z΁T첕138Fg3swyӲzϯwʭZ;%|boȧwOcx;+ 1dqO1<8թle&HPčXluzR6kYIQFdFB*6#f tѸ+X.^tznu㳕r~=9h h$<.HO?~ǧ0=p/C{b6}?\}WטM]D|xk kc ӧ&^Kswoq 549 nFw26݅~ s3`QZtVьNԯBz.bq;?yg*&Gd^e7evIs":_7o8zXwL{OnwbOe ҍ2T<̓ԝښ0Fg"i9o)䫛~u0 ,UP@,SInĞv9KZPVF!'#Ӧ"pq*d[@C +]wV{[r좺Wi9D:+v&®%[99B2E掐hD_5֦1w̩dzleBH&jG7:Ӓ"v6cTRfʜe݌LؘV.&h-j'P8F5ٍṲp))! uUs#D@ϑL&u//z2̌a^m&ODX dY4p߄*j¨) ⬪ZK 0i|BXV,&U, kn N 5~(.W=˜4ɶFV6+$w&t""Ғ~5Ф26ޝK9,Y,ҜɪJ5ш-hESItylmca4spDD D" U=02WbgX#crAH)"J/.)+@޲ Yd!4!"J395a??w&TTB㪁myr}^,-GlΝ/QA!Qu7~'~?dfvJ-]phgg>OP<5-mO?v^o!٧<|~16#B9gɧHr'ifnCq4]slFд<~h}VOGЅ?͉~rq y4OTzzty6cV=ޮ^9, mԗnG_KL$WKTŲ}dY#[L̜j b:ݒilu7HbޒV8 H9N}}+yypŢY 鏏"||+v}Aj۶w=>>>>^gľcU~zz*>tYG zG*{dyt>ݏ|,nw&@[5rF;Ԛh8pt3=N-fW,U+?bq7:ey^?cy-fY_:DWV+vKN&w; ],'7p5-%`NTeD 81ƚܭ">ƈ4QW^iFeSI)w@4PlF=Jf,)]u.sR0fYpZf̝dAu&FXx)L#˄y$Bpāu[Ra.A)ڙT)h ~ !eq Al"Y8<72$ܑi DwtT_tgGj}k3=bf1ZU}fϤ#Hlˎ11F ەYI|IӁ1G`9$ 'Sf IhDD]`Ias 1 I)T ֱ$uV$iiė+Tlރ r $#C]gCݭQ0PA4yCZHEb`՟`ɬ5PÆrqLZ'n]9+ÍuUi:5@@6Ư(]RPZp,ҟ!VX2P`\\Iv@ͥ":me`eQs%uJ2sJE45AT77:f^P Y+rYR8HVؼt,u:iH5C/6I Ϩ]L|rǟ}ٟo3#J,T=|Ӝ-}SylJϟVl\=`Lĩ:z&*#l2uzL>p4~^/nS]2A}Ovm >n=rTGWty<oI`Vל||ϵT5rʵ3Q5S&C%Jhvukd/C 1Tx( xV D:ZJIQn#Ӭ(7Fb}C~yf^̛ j]9S.ܖmaOO>p'ۜ}ׇOtml|zLҷm[jgzQLO֊> >rT|+*E̜M ()txGŷ޿O>{wpclf y8ueT:#%N&>q}>~pO=0fpac$VF,(D-jn!O}^VZapAM3Y 3&7i?-e?_v !@%3Lҗ|~7sfR|o/ge3b;|7K[+5+3_ #,ڌ/mOpmy7r8:yp4M>ξNp!/rTGV3FsdSTIz:4\3|nGFaho}(] L".'lh4hpή;M5塗̩pH4b-/tؔR2Xov)ҥlƻb@$mQ@f ANMDYhZf- Y5F("`91N[ķ"z+dYs(c\1ƾWAQ:SeW \`b.|V>hPW&ER̴ԪR3[:QKi"UAHM?#SA̩I9%(2U iS.hfάM+/R'6'hIm lP-HC@ Mш]\p 6(nY7+rnNs)kE\a*Vx["AEz:DA17|Ƙ0ќmYMJsyŬNOR0T OP(kOAX&*O[4ZaYHD x4_U\2<5{NiN>Yf939+ô`,f;(RqIe(H6 .sm;da_ˊbO72fMQy2"S||H~@ OC] ` ,}%΢VBԗ" .o{!+[$V,]om3P3R I_/pfT~iaX@Ov#qjt*jMF]<}oa~?O/~HۇO;\W^L)߶rٶm+2zR~f_۔x Ӑlȶn}ЇV`/R@Yj2iy~pug{%9o)eϝ-+Va1q-[/ t˔[skBjLqY|7<@U%MGxmlk >w9 9(M(3Ky@`Mq7IR:p(iGz&s78!Әb IDAT6:\I *.c iLfP=TN ']$qDwDbb Ʀd®+Ys` -\QӢDTR.D4H!ӝ+F('ޢ#KYJJsvJQS;QaA"bjN;c4ߨn"@zj_ߺX2sҎ$\BtjrQVzX2 Yݒ*b&S$yLn鎏z\{8 VfPDs`#\`#R |qIqU1d!獰 FEb+unwZ{U]ΆOcpݞ6G(n&T`欅Efj?TwOo]OG߿ow}xsP>'rww7.nc;۶fwncZl -U㣟KRL 9hU-gg 7a: m[0Y=J*ImM-<@*%D\P3 SBu0Q]+FY~爺&mmǚ-S+^˪l#Xj읓ʼnJG̾0yԙِӵ 鹝(MT7/FE<9W'CTJ2AI2@.6"9R)aZ1FPHݐ%#92()s $,4PM1Lb &΄1c )ȴѹǰrjZd\B)qRXX6qyL6i=R .ؤ :J Ir= l% QIZdNG JEA @u ,0 rJ9ᡀsvQ3zčQ,If6Q5HR. BGu zDձYg[-L&ivf&dDmBռݕ(\4[/^Pf8!W"%*kSdp0)dw1 -b =y_BBf֞Q`.z2Bjh=^p'd̠<خYJȈ\A&2N%T%O iޒi0qT!AH^u ,`l3 )ǭԓE,RQSHE9Ț$et i-Qsו<;ITo 0#r3aF#,LpTXmFɈ3C`@ZRP2ɇoA(BȜG @@8 Ӂh!~O8G 9^xo4+}I2qe5\eu}t^g\aeD^gf%jT31p MUY5hꍹ׌ZdIn+J6EZ}ԪԵ\ΣIcfxmcػmrp߿. 96b69`KςX;F9*hyI 1z I;]/ zo6%ЪEZ8zJ4X%86JL:TBs$2n+<uH,] H3)Q]E\"7Z`KdT&,D]Ѝ!& 3b5cr8~~/Og?$Ъlbh:\I6%qcܗ\8$f[NIcduƶ=׸'u7p{Ɯsϐ4)#4j=V& >GgV۳ggc6Ԗkf?mߣ5+/1ĭKy;qif1e86sa43wjԃy U(nsX[hZ_q=\@\y⢘՘\ /++q?u,?5f*{Ƙ}̱ɏjREU v0vSUUZ**UӪI/4HN P#5HGhSJWUD.dbBN4xc1Xs{s7[\>ϸCj1(ʫ H<%xENJ%$~T2`k F\dKЉ7@*ɔ;I900N@lXvH&6=$lup FY{4GW`U=9&afٵ}kh=L9#)6lw@@zeI^q ) M4tnr!LpGWMRݱ G )ٝ|t a6@(lv΍m=iY=:DcMak D5Qh3A.қ|uW,P] n'F[cI۠rĽVhGwdĹ)B45ҺGFs[7+N,k"= @` @:aw l5"[ǂR+$jJt<@a8g05^]^j.O1xpmA@7*!= m:KP ݽǻ0PƠr3hcwܮL;, JS 9bia,t۶!pz۶1-5nU[\F-ϵ6gn?!2*D#NR?@z_̳wޛ*`{X}텺k-1dvcKh`qݡp6(+V~NhwU#߾u;}3l/lӆ{](fB$/PlB7HG=dSȩYx8F(pR)ڬ5F(;7v5GֽC f& FO UU*L18 lhaz/fEkn֚D= 5@3AˤAeNcG"/EM~^cٻ%-Bu֣GOD̺T^~ϩR&p:(: rn"SuOQflD3$nJU\?m} #NT8hC@+5D4H`紇RmfF퀉npXo6sHM;yd  kqM褏 U!P7n{dCـM<97pB- G-{cP3tޚK!6hnjY3"bm w s`٬o.R1ҷr'ތqpQ}5 l&Q5kI^ F@.^6(e+(Jkb!P(hIrWA(>6 ܳ?,/_U?oi]_ձ`+J(HA ebȕqS$N<#ɾ{/)E&ސpo . lN.gˈN KJB"tH)v&ns $)֭]Q5wD[GE[kbuIa8.;w6ߢK']^eA-;9PzB V>/dkuF4 r*s+ BJΞPH肪$ǻ<$?1y6q5^< kIPrp1zCn1)$9yQze4jM9U CC<Ol:WN]H-5lNDz=.}P)݅TC@-ws 3 & UD * P0uݠ HedNՓjUKy|]E}ml"Z Ѥ ׅ\slƯ{X%D5-KX]}xǗ( f)YSep(c:=,2ЛЩQzu=L&NVLCGH;eX%4Fa*ݨh(C_ *ޤSb1If .*Ha="kfw~ H'M_D:AliRݎr=|&ڝČ8x .R D`71?uCL#l3PH^%tF%#E l3=>-_K_5Y;-__T{ ن$$E]@4hd@"hM{qP6<6*$׹\\X!PǤeӟz-,-o%ЈC}B+"I5> }E6NU3iB6S{wb !d{MQmlJ1׽AjPp3i.kD6z?b7KDAXχ3Į#$(R<.) ])ICM$$|E Ą JottdDBI#TvӸj{LؚQHXRk8-PTU=sy,TIGrk Uu_~zxݪpwnWm ~Jģbz(2wCzGp:(ÐTBP n!_393bF?I RJ%8襻BࣱGcdjG`?Ct_ΌY|%t:5IM,jˡAQD1p\ L-NO(gqD"qYHgfU~@5Gn,2F?$| P|~ SgZϦ?X';"1'W&圬k ONȿNG#3R:J̚0ITwxEzginiݐly I7liXnrǦ(TC#z6xPň0TDP4,,:cGފ2.QeK͍{w\y"ꎑР i a?5`Sdt3&m>I3;s|bf.J7cԂs.m@M{0iN6Qhs1*J"sۇ[f4zP:A7x4Z4Z< < VFNsۊ)痽K|w|qu~|᛾m_ń#FqǼ 7TELBuC0,kQc&/v aE@pIt҉UŅB67s2w^ڹ ʨ\^-Y77}:]oN"lfPQ4QМ_MmPdS& p1(7'MwCe]"&P{ow˘@07JWhg'$XtօSf붺5JcxxD`҅ 5J3 *FL1ZdP#ta-%_@ևԵ.45KpE#uX&Q7=Я.\Ǣ%g$'X4Mp%ҩ), Jswi8޹h ZoH]]r7 CM`=[P;e{U7vo 4nZWILxz^;ݤߑ7|ޟ}K~7_-_׽gyx}o_m_\2|<,"UUe$ܔ&(=ID$EyT"kz+p1"" jf"pSD]v2c ݨlb{n+ti'I9ÚDagNTs;Ia d׾y92cJ:I^U,1p "MUi0/ MT!tUH ]>KR ۭT;g1e4Le7ęWD@2<:c%Rq9lN%"Bu}ʅթ#R]gA4Hs8y("u^Zb#Vi&Bodׂ*M`45< Cf2|}Sr#TU]˪!t׌ihydN+wW݃),`9e/GsF3E< CDb{/SN=(H毪OI[#-@S {"t*?e2ɇ>|;~m_>_yOw}_onLOv]x뗾~||7'|ۿ=?w7}}J9HutȦҟe(QF35-}*%]}3wxFS .֦:{7R# ^eQؤbZ£9HZNJM% |ޭAlaZ}NMR~~/gHEUd1bQPZUEJ L^WsJzJ2P4m۶~3t2c|zSF'&b9]C:J/Rz^~{: LelpZ{ѣGbf ͣprteXfȋ%#ҟ%*@bɌ s5svP,Nb˚uy˓<{э-Z¡O)tw}[w?#_o_wOH?_G ? ٶ'濥[/9jj>>_|;]wyk;ðiMI^N'jĦfv ˅YIC*)%D7=M&!(攕 , `uM^qH۰jm+%yGǧTa0=H5G)y`Lc~8 Sq R(7,!A1}Ֆr9c$*1Ӫex!B$kJ&05_-ggFX W%.Y+I"PtH^Wx-td {uSao&W%E%Ufh,ݰӰ(7E~Xw7<I59z!#Sm9 2 ҃LvA?TcOz@6"'O-i,\@tH!&Bld(K 4 JՎIMpP!PP>=X2W еhsrl:~F"?][Ap"^eBD?z&i\_y2-}}7[z8]oWi6gd(+bAtPϒ:kN{f='B&Bm[M9W$IC*$E`'tIH!xN2L\露! bt7"AE -PNATƝQcT+v t}}򰐪eZ6My:}ם}u8{8|9'O!WwkuZA[D\Np8^ ӳ#2\2ʰeuX;NqQ{ Eٱ"+>:DR?xTS+퀑4AaUk=[g8M@_"sx[;̜{I:}gԭБ v޹|1vN\FpVv9ӵB{H2IBxnN8!2Ws96gs}JW8=o_@[zWk>K89j@j>O|s_ $[I)ldb.hFw: BdB(! E0,. ,=&h iUTR銯N[ŦLЀK+Y֊J%ZUc\$ m^x6FA "zi֫-$2dy6w!&zӻ r·U8(x^9dڅr6 Aa-idLwW3OH²Y`yɀ|%˿0l+gzNJjK9j*qT,Q/ gZ0^foxɍ_!oM=}?9so~#/g]ܮ>z?_o{{_O &Q'e*{:;@9m0D51 HRSWp`A$Q=ɘdmBնKxn̓*Ɣ@Vb*c~*@TӮ69WQT:8';X=]6 fw`,H$|PjznrEjx `*^Ry{hgF$ .cކw7 VQEr-Ǝ;)'_&}C 5ݭtQ)s%υ.˘,GĀ4uEQ#E&+TR_gg6O{cUwinJgf]eozb u,?e >qN+DdȔZ{Yg[~JGZ`*̏^ۺ_N"f}n.[U7|K19j@j>/oo!/~}3$ q!b4w$7Ii!G*GH!-.N@ӑDD@<~\( rΝ YD&N1Bv-\1 2DH؀D2p22 {7]hMC$(c(mx-"d̀T`md]nB)cGEy,tājZ*i*2k$V-%,PahjEƘ83|/ OkrK\Y[]B:}Έ{rRiMNpKws3.n}`dž=ZzS*L'^Hϩk$ )S”`RI,ɵ#'C{A =f〈"VhQ0 A:.!䐈]|߶3i'D{$x68Kள=-]z$,Or@R0)+}[{ʷ}^|џ{R7usRmAm4 v Y/ =ݣ $@컣۽K>.Ɉ@Āxq_ГxxWPH;iwJˇEA%ȝAzD;^|Fg] j'I\?:"hsETiD" K?[@ZِΡr.![YAt9H x"m `#uQ*#D:i.ZCڐeu8T=,Kݍ:˟?z\oh*B~i*r!1{EUиhAb:X#1o<] si^yxs`M]XF*́tbOXUIek-mT? 3[yd"uD*>:~-rz#6L'eD;;i➏K#ۃi{X/mnz$!RzPq \/܍palGѭP窇 K挈rthsցacy ܼ=ܹ+kC&~k>Fq>!fD1T K&.,g+7~Gf|K39j@j>?{~{ۿg>/Bwur*ggm5Ef2j\Nz#]Je:rԧ7"NLրRj8!!|Kdw5FeEaȔĦFd! K_%L4U `6- 8&őqSAhn:uv)YB"%]~)^ωk9eE,Ay^Z;&X'gۍy2\E}4uWc\^"HXHagt=T/xrzgF)aV2-naư $2ܶJMˠ,+Y?W~/8`9&վo܉Í]3fI#Y|#Yޒ6gEKz2PϷɬ0 biM<^ۯ߼@?c~?^-=f|ޮOy}`}ÿwUs`қ/+``)KR"IzDq7djG0Mh#tPi.s&autO9u)NBpXδ.0C/ೆ!PP=bpy8/Z3i&bRAetpFF$&\6 PȰ&(ÚF f9za{"!KĦq="au*ܶz,3@"ɊQGeV$ <3g`ȧ y9jrbr|tmE p`HϠ:;~uNxŦL^ -}/"˘캆b>8@)91vҨAr3r28dw9~ym5=Clϔ>Wk>[zv]|o|7)*==:fd`Z6ӾI\[L#Em Ӂ ,&)nuP%>„IĨ]X{~ 6X¢ؙ<Sa-KLP p")^a&LJڑ6\= 7%VI,Lr l(PDTn|Nv炎@8 ,T̶GN3(RԲs\rJx.Pp W#j]yE+\4S ,)dF_%3BHl]1Oʬn\vt"L\/'8uBǹLP3]4)77FC":̏ï"OԐ63žHz+~qoN7v}l'>{=8sg4UW"Q yZK.u'TAa) ”?HD' mL L%j6jC2 w$"EDpڵ0qƥVIykBJJсB J'rkqN\0'ec /$kbpd`8NS]@5v]E@(x+ԜeJa"xXC,АR~*[Ft1kk{#q8\x:mZ Wu1/OW|}W~܏GsBݱW"qSS"8k: U'1~UM4 X&XAtmX=Lvz }fY f&Ko'):/ S%0:ЅVBT:C+jW;ӽ?TXc2oZH"U\ H33kYgHrɱY4&] :7 gɢFxk@ F(ҵoΫA1^5~a{>k#YGzG6""ǚӗ L(Hi+313vfm=/af>8z Ճny>v ̻b4^8"7pm!J;+&nC /H2Mq'/W/'෾S?4 onLo|}zl [H=; IDATmrcV鑒Á@bd(C(Fl84q_Jad1!e7D)2 27HbPH:& `mMII)v?G4L,ik pݹ# {-1;"!@[Y@,#VR(;"2l{O $qna)ObCYT*)姮>clSQ&=L]S&Lo8|Ugd-lhźM___"(ñG.X G(劣Y|"| V(1#d_Mhgi.P8qKc|:'iHl! nC0zH %'oUƱgw/G;uA \b_Kg:E~#c9a(gml"D*ޭUjM.C|07"E---ݒ__۷~;%$#5E PEO㦒?⵸R0Z!Ja{sq$2@GvJMP2HNĉM縯Cd mLzTET:2!w 2ZlbƈiAuqT&zjFI r-`2&h[3"MOp'"̃䞿QpD _*P)5lwFުtai^z9]^9SL-vZU;ZWs{r1j?Zn׫Wj8(HDݹwz&UY}v}x3"b\~ᢚMd0tC+Pw#'u4fQ(Ak-&=gjrʼ\vs1I)f@l.3kwRP^)$ȕ #14+SL4PK7HUg!ZetPU"{{?[w>?#_o_wGUc?۾w|Ƿ?\----=Swtk-ĩ(,^ꪼ,"08G<ܰsq";F `6YACFvw w4s# 7@ЉTq+%{)"PUNuc1dʢ'%'-^k֝éU KZBr E'R.4SxmJmm33*UT՜ Y<금zfTYA"zx&"!" %޶|8(DTR"3 ½∊I?h+t%'a~ZZ"y2h*T_ш!_0AcciEP'MR@\/JNI$=66gtfpm[# xCۼ.E,@XKvHS@Wу1E^A޹ S& 4ntҴ[K^48òm PbC !nH)IB4I|^qC6k,S +vT88/b01¬iBf_:KKtU 1 a( 8-8O,K] Pd48 qfJ +Cd7dwt3xc=Y5#_aCI>⇋Ȗ&,]RE/B텊ӅtBaׯcSU ----z<%B)݁=rdXߝTІimDdSt5WZt$=5aiބT)] 2IEh=>\I ľT;]f&kTRhs`UfODa{|c1d0`t-EIWHkpk,wOz-MI5w33!HmEa0JEJ5c@9>r4'x^!؀9ZwkH?)83-w]Q@#vJHշC/Seb0z HZ(a*pqKv[=.qt.rDiϲOMIzJX^mleCwj"[✒``X {`w nd{L!7ܦ/x۟?otNn4 L +T]@*ӜNeE  K!+X@S%uP{^W!J.ժ):xtShd ǯaX 1zJFQ҂WӉ_ 8}Yp-a*ec, CQIA9+HЙaoRwPƋ+ḏr> Xk@_@zQ|҇m$~e728eW;kxO w%CKkSg%DT ݮS T5g]w}۟?o3R!k"MD]w,6 dy8KOzQF3!VT՝ձk9VT}^PP ֵ3yO5|P̸U)e}Ԟ֖L%DYo!T DR{~=0$;H1tai9CwfTh$ӵ]"t+fV׮Wv7! pIouTwC1ט*˹AWG.hqF/;T -C@H%zREZ ٗxɶw[ت,)Ks9\IBuo5VM j,f^aׯ)wLGtKtKtK4~of\{0bM"On+R`.3izS3wt bjz=bptңA9]JaԆtO)kZ09WTZ@rkc|Fg9ILFD$ŴANvyAwcR:v³S5޹JsdS(eoIu lYuj_MpV Rx, ڎu;pYrwJO@kMDܳw+l] zykA'^^{!gϵN sX\ Zn2u*M2,ZSqV]bL_KE kD-'nvϞ~:\Qfj:`/H p\ Z`` L,h>IqhxF@̝5nZ5|bvg{X8Umg_'|9} ǯՆ(r4J3ɾ2hi-+2:rl큃H|Ky3{KɣOdcrX?98zhxE"!;(":˵wX30VFQ@ٞYޓ@lL: 0FЪsYYxc֣v}ʧ3}(n^l"Zx< ʙZpOxʃnTH (Yಽ7exE^tm{27Ct3S#,gϗo+Zؐ3:l!K[ځ38&DM|,0NUWN?8t%O|ӝ'|eDg'G *b"i\{$tSʄi"b0*{/Ġ( 7na@9c\H ; V˯n_I&spZ4\7WS&@)4d'DUݣ1Uٱ`T>](I0ɪ֌55 &lcHs﫪]u%]*e:D&_bu^іtmT'6 &|!pY%H q&2!ɩ.薏&~tZ6L|3# `oX jb(h뉻Z$Ͷp Z1;) Pjl/!Ig̻mg?dD9rٛ;pZݶ1+hh$*|8XċrU88N'N?cz!+ZIJV0㵭gwF ]/.tm嘾݋. 'uR;,:YӼ%%dGo<kl|)d_Hf= <6U Oj\qvΠ0J$UnvBFtlxt;N 066K՛"D`3TfZMGokl\TKZ1":ݕC;EQ/*`3Jb.RIBΞF8\dK"X?Ȱb4,:x]hý;>q쓘wWUQG~X6Tٱ(XSecO] +GRc%uF ER%(>"ȨZc(1;/pb_ CV9@(5Qɀ:/## %}+~ k@fa58'S?nwDIa LNcjFi{B r+B;*ue1Yʚg{chLSLsFC"C>$+y2UG>+Z?#oscO% Nx5*p^r:k*XT:KVG6?\##/~䬟[x,mi" f\>O >sel/iik/cucG=rANJ)Dz)k8מuYc8~`N6Eez]ue8Uirf 2bvڋO^Ni4ET]Z.9&nS4ңzs<1=%<l:W;AKdwM26渎06Y~XN`8F˜dkc/|UY,GnlH7Z{0ٗ6ƈi-b.$1c P=)rGW8+9@,E](>Q ]sc(ՙ21H{e>ìims p(PkX9yvFCjRB%"v0>¥^f@,ѩ/6'̦7eFr9ĞHMfsƧ?!;T=}飼~HfW{=82 I#X"~颐4k SqdW=': q/H(2yC fp 끱sPŘ[ ?]T^Xd9/#@]ݚ|B92{+'~IkNfncdxlh's9^%u͔z]SjG%CWq-'XN_rR)MMǹX2,gyxB^X IDATWgg8y|%*-pS]4ͳ^DU݇U`Ĵt+/2 d1m+,%>Cy Q &0/}^Zͧϖtsǥ+uU2V%duC[l t|koyfx`m\W_hk*_< <.'ʬ߭*IY!96R%dӞyty۪˥ALY$d/$9Y:xr\.?~<)Ms$8tk^NbUA6fBR҅1N 6 S@E\wS\[c/RkvY^*8.J7i;Y5a: 8RJwa1Ȗ%xc:c395eCjpJwRBn"|WrL$O|_랟u"@шԎZ"WIha߯cO1n4]7O?& #I.:W?2#K12 7;Avy&q3#_ L]̹<h-g9~n3~h\MD1>dqOM㧳ϥ猳 Z2nkZ؞)W((LKN)r~F(|jq<ºw ;#.i}q/pÒH22B]'tJOOD!byH%vv JvIB‭rE #'}k a2pC zHu'Xd~etѫPzBwtؑ+Td;=ȳߓS߳IZ[rڞzE4SHC|5mP\Mؠ#[-өӍSLn~pG_teH%g*) |b 4lוJgkeuc CIz@^V3JIl9p2 %@ !"2ScIE+N %R2)+2HÇ8LgzZ9s{f]h>gUVUZߪqҨ&ms$FSSdJ*3moY PjZ*%)OSd;%S&J@D4- Xm> VQ}W^y #,XOaЦP1%fRbENm{]w"neM6IRiΣjV{XguJX14+{q4asNOy9 >WL q$lvOOL_xpßk=p9> Dm4U3t :WY}]ZAUPKFKbUhpZڮW)ZVg=4PJ; a eXb^ZLђZ]'joCڱ+cs T4jڊ"[K41) YLIߨlYhʜnSLiz' URQ -O"X-VR4t#ܺvikQ}=Z0H+*=#ΜBtAFߞun#40 ؖBҳoyK 3ۨ]!,eWW5;dvbl\U?v"4~{Ⱥ0ƃZN;/H7ۓ7=!*y2CP]`H4s]%?/.x6&z)ςVp> 7>n}ȱn0Ȱɥ :UWZA:쥜3W;ͨmSz&Bl4:J9B8ʒjeT^L*6&E2r$e#Ӣ~ׯ_U/=yOO#<"X~= <֏ׯaˏCVfhr Elm^taye(yD6lHݏu%+5+=*žf3z<>/obTCĀ3;OYޢגUtn4W 9qZrE Y*wy@#;KUXe)g12(&Ǎ#33dsCDY3O26ƐqzIAepK!J &f;&n1gJV8YhIpP\l&'R_j|J7TWrbSy ,!n'`b,@nS B~$qMBOy$YBI?œgtҜ*ffo%4]/G$s7p<;Nyů\{?> Bu%d0x%CpQZ򱴇ANHg!pcE ٩.OcMi,r[3Teo18=eKNk ]2 mm3~c2Xg F I4QXuKil{_N_`_B7 +x4> •YKNK,"B~%L)SUg~MY堾o`[.*ulXBY;zyx"m `&JĪ|j1`d e}/$O@(¼cn`Xc  zxiww8~[QqM,G@ wy)D]Y-Y (q,$}׆XvKך6տu96@ q7V=^E^Q{tSIjudq9[z^O3g }َ {2  0RO\wH54择E dk |!ntc61`((iB4, Cܾ$qg.ϕ0'fAç !cY{͂􇽼KZ>S߳I=>Ow}ayڵk<{>=_QH:~wLmdiW:Etv {V!9=Tk/.QHaYRwUQo[˔Ĕ2(XI$ @,W%:RE1DŽmav`40v33ϲ9g3,[iI IuƾmUvH>L 8ѐڧǤ 3ٿЮE`Y\[҉,?¤d$iAXcA gkg:dRuKTy $%Ѽ]B@⏄RffyۭcdPlۋcJ9 35oHS'xR}QZbԿNm9)gBzA mR-l}gWz|oTG'>Q\s؏l~֧>GyG>ɟ|;%15M'/oת8;iʂqW]u%-46ZRk6n2\Z8s(.>˛XyN4Ɇ}V^]; lr<4Wjl"ʙ!.6.(BOIgśrI*3N6ٌ̛LShD95qP..ѵC!)Nv.gvE֤ |T߰r-فgF>a ?{1w䧝^cO||;_?ԧbQW\x?_NLAT%Vn1k.?m6{,$+.3%-jB-'e$ABĦ]iȍ~]oƴ,b$L P.QT1>cWULNms‹tx1ۅm9صE|bnYZ;G!*w2SJeۊY.T;%ܫ`NJ^̓?p ^ək0#DsԇkNU$jn|sVG<|4a3 }nDʁIi{&"جk/jbE`B0l,${" 4rȉQ^wg@Ñ*&8&2ʫV]+UNw$ иf,w]v[FH&X+[YJ?3{wm"BnwAm[u!<4 ܥِoiVZ}YGNvF1%\h5%YA(rقgPm/rREdAK0G[M `^P_;ߕ?fuCqjP*I"7:~,=/&S浯OonAg?rg??\ŋ|idbKߍރdO4'<ΝK)m6 <\t]3LCD uSRmo9wsLY\AP jL΅-SEΞ/ ejb4\I]yXnPݙݛ5(8$ q׏9~7Sԯ}Rf\*`mۣZ$bI_Wi}^[+֫1@Dx\Ko_-Rwl;~Z';j{XL%gwҔv}-(Ƅ.f/&+9-iőՃ4lò5Mmr %fb/?Oie; H"";IzBvA" hZGvZD7uqngQ"@ 9i/(!"$OJѾs.X5<+ Ҕ0OHpjw|RW4ߟru܋`'RMp&J lvf)0h`x}KT]"~W]Qȱe 7cxl_M$n'--Ui_'KgoVi[GyяO|C9ldx>g.^k&;?VyՅS3\n{jCKR.+8c&^LB4J Ӟ>[Cj{mjB}~sg:o_t7WL] .Ԋ--2U;Ӳ'v,c/OW P49\9:: BVt@ OgM<"xH>PT\-3q <1=F)MݱY|%%WCqT%m6`d!y:X\"y57'oC>zW,7!9 d`Mbrv[w#*ʨ8yJSS# Lh/r&>$܂f h31[y $e0`rF0,kLЏߍaNb_kYџ~wO!h:837nηn棛oi]M=>C~8xee|;qO<50*iYor/^'(E)-TDwiΊq'Rùn9}MsT~iX±mV,U#v{ #UBs_-ӝh4T]-R ִw_}x@HU+RJYCTgJV0("R3#‰ق8`&%pe&$xg#F,T33Q:H3 MT 8r/0R8:NkWgę1X1 ')4#1 ٍk(eikM:-$I) yfEDMm<(Rqf`4mЦ 5`P 7C5(峵f \ IDAT0iOB\Ȟ:?ɟE) /c@F{.\|䗟G׮/?H{K=e^w}>2耨>Q !UW %Ԛ$:ow=TMjpHNRFRA}EOKMfH0LNi6հ?q[aO?+坯y|$7,nc;-bmKϗ]!'O,ᶍ sQ}S{y'oo5ttTTޢ,Q6f{,J0ɾ<\RQdmԒ'k7^MKk[V Ph@< G|~{m093oJ}[vg"3zňm'ӊTՈbHSGpwÏ1Lz?xI㭤X^<(&m &DW`HL? a? P)%;OqT}{%]zvҁ&R2e7U^?Af \XV7Ŀ!1t}'.Hcs @r ]~NLbR[DA&'.KVr]QȴVhhkÊ<:~:[ G|u_uD)M&"ϥ^u77UWl >t]w+pv]=En9RRǁc~:#f8^Lb[E2bVܲ*ҭv/ JQ 4E^ygdAI/0Ab5 [s6zzptݾ{衇z{=쫃bcI/M ?M$]_9jQik'|:m--Sp/ͧH'w8y`J؍2+[V:ɋQE J6 a-3+v̝vZi*=#I!l[<s0OjW۾E2ewnANɑx {f13(:ll[)Ty!**YL6JPheՠxs (:_Уc(@wN);{΁H)eBCJ,yJ h)xWvEI5 Cla\5b: xC6f%Rт*_ `K]i?* dgKQL~4%R8xme(>[ͤv5%,`*!';!)A<'oɵ-%0P͉9qpȉFST0ѠjadjTY/_)r&Qv|tV;ҽ;pg?|f>҅s_~ƹ'Ӄ8On]1_? ;>+=ޛi~ϝp%) {o~Gs"Qpп 0HGwvrsG׸eѶ2)iIG jyj#Qܴtw ]i[z{Rl1K  5rwv&shN[?o)ǻ':4+Xu < }UbhqZhG\`jYo4q|5؜z!toꐔ}f{1*Uぃ]=v⯑6ϸ!(]/&%ՠ%F\uƪ#DZZsFUJbK4K ,,[TI)nzy6e8n"p9r˭lʌ4[L6V/"W6;UZ8W=VPF2ݻ Y<,*G3/HNM9 `Mv$畖әܤϼG^[/̇<&>@~goWO;zƭyOJp_ifMN^+KPJ4W=p ox+~_9ejRJ!& цEDrK**; K~Z//d. cg--E+vͫO-;I!S:KAqK; }ij }]aHCTL,0.*jկD T"&lio:AnVE=&fNP(ĢTWe`hz3K5H&4{a! )Ͳ"+X,?@1oƘуDTD q]T6\Ϋ  '2KٿtvYS)`Cq Y<|];SH`JUk3p}2>F29*5X )X@Dl %oU6!a+H(hݕHdhJ)麳pyDAk@bZfSruQh橒`1i*G`^mp^r ǀM,Y>H~Ng/Τr<2x8ݗTC {kf(MuEq|3nztV;ן⓿ =on]~ڍ[ӥ4Wg矟om9x:+7-_usG~9߹u|oʃHNjfC)aF x>&I= UYzTTnwy7[_9n汎յb6d<ﱷ).oNyU/rVN+~ZէY5r.U.J,OjTTzX4/OdT1%)U!^l~08c$$\;%qnfa'')gT2Á+t5#%se?A2x7';T\[YF  Gs)p >^r|PhM#wMM15Ȃ1 \\HM[g9m@K@ tdXndP˖.U3TN9'ap#cU5To%^&MrCf oI<3@stT|[Z#VYO|3_g?GΟO.\>s<{Wktь͍pt9ʷ.^ 9ec9o}.O^6ʵ/} 74s( ] % 9{wqP+)hj1VִآeV _%u?|9{hwuLO/m%F[K6IT6pinJ=a@숓#|^hyLĺF |'ZY_;Ue/g㎴ጤya#KlNL9o"Zqrft5.t0nE܉MC Xտ  /_Ud]1X!O}EHx&XQcن` 9#+=FMyé4\Emhh ģy# >ު%VB'᎔[|swYLxϓSl䀄[qr =8*w#po\dIq&`\HԁO鄐l&EQ\+EL =J"OQ1#gvf/A@, dv_q7y<~3W~ _t·;?m_|ͧ/5֚ۛ7i=C{n@qyk~_+aW'`/ӗ_6;Μlht 7o Y}9GΎd4k;j}L,Dx"V K*9B)`"+Н(rxQ9iRAl7C^ ;CCF4\<ج!2<*QG)UQd咄,m}4X֘G~<@""WïeD9&X`ҙrs5PbԳUL":]5Xn1g:&d0/؇42(3 &*] XZU"̰`'X*3)>R % -Lr*38cN(fDD2` 0Ep5mrٱ 0겟`PX~1m@Jp,i&~u8I\jeEɖژǍ:R>9gf<4%&˜QqgUA'. v׃ F+[g"UCA-߭C[ADz:eT׺ vڽT4/_i$g7r5guF]popxfxPЬ,aPqɠ9Mwt? yA1bT48>"`22G箭A#a# ^=<.Xb{Dxs.;+R-!zU+Jgӫ F؄a V98珎9.!HA#nc4jt8@һ/[YĜOz7<׽^ܵ78sttt/S./W֔S_y鵯~%/Wv +^7MOǿe7.ٞ:F&7Dd.Ozچ)z8PA[N@~eFn[ȫrVwWѥ'l^d?њU좮Bwm8s_֤9Hz[LZ\8\#>"WYxOeT/_Il7q5ZT3Zt9Σ s&㰜ל@a(U! xvЬ2Gow׷϶΁!Mt \cqPCE?ryqO$)HL sꮭGU]J^9L0f`\Luj)1B2nG.8.NZ"^(Z|8E1^o_Ǥe50Ryg0V ţSK61s ݭk_ YT %;~7S5""W\ɍcϛeN"ڻtV;WO>  =sOͫ5Y U6[H" . 4I PYmrHjע * 8֠ښyW|i.* qU"{aАB+XR{íP>wdh{`XfȊ^ߵwgܗ EDF@0S>Dr5b(Hb.gs*D6M϶+xTaܓ7XM*~ }ZQe&lZ9sm3jf'Og|cz/\~ͫ/wtf_}ygzW/?{sLAkl{4WھΔo#x0>?|4xꩧoSUuHaGa ݈%g(/dJw<+->d1Lq/!B~yk(ү'ZytEMqk4wgٳ~,ǃ]J Rj= Nh[X{ۿ-ўmp%ueuTx2F RuDdޣ%f@úa% 䆀0yl,=+6UFSd+$/*dxhqqKi`!h\Q0@:/];D w^kd*p'Lݞ32ӳWz^ m&@z7GjKp{15C|J=[-tlD4յ]b*2la'tƉmtf6HB^([^#y[tb.| EauO7*Kg Ia.+'_Iwl(q7Όy3)bDP:M-d^{682rی8& Л%Dd@D`&޷MOLA œ5oyhpz:cE  9f?aئNYm6R/ |V;;ޓ/c>/*p%<{qx;.?do >,^ _cӿ{w!.rN_ xv7J[JME+yKu MCBCrw?_bU27(_t"uFUn `-)ZNHKL[e( x@5o"TB W"5 H%KY>s|]toy'dEe;v\ĕY3# a_d#^BTWoy}] Flűxvl$'lͣtcTN*K: l5)g*YJ5EFph=avC.INa$5N&c]UKlRx9s8qN( g]fNb'j0s:/c8&;R:sh&"U&Cevp2uIDR"hR5^l dNHn$krq'M v(3g;᧒Fe+50[y,ngm)yO Y74WEF_m}=6)BٕNşS-=É 6˘mҥ ޽kqIijD#%޺n$>{~j' ?V9ާCC׳Hm7sҽR0sʹh!4ٯ$XeClR%\O3fW-y{krÕcV%e +Hv|b+vHUaO"m ${z ыP2B:ZhwD CH@w$  JD_KSq*)**JcvRRBe $b9llgg;6& Mf6-V9v2*Ԫ }Q o;&":<@2ڮcRef\gV*&#ðE@p(σeDtJbeMov7W[wm[;k[7"JGطΥ< hv:s'|0ޣP^T]*H!Vy1qk_T}E%Qu׺#b9h8QIE~gF!9&; ]dtAwՔi3d;9ԵAF9pi}c6R?>;CMȇUA}Y{eq1I5Gǟ^OO"L6͙-Y _IžXI\PJS&3,jlŚ32DdflB@Sˆ3k@WViMtm,$=d"P*(%J$x|7RZИPj֚4hi] DݩS쑡4ZJʷLAkcE'l@lk)xt N9Tb.L$-PZ?֤۶:)\E|V,L G_} #=G/ }_?οpro7`jYB% .ua^NieH^7,6JxdKE[,Q+Zy;Ӓ)d|^3륝ixvU QXoZ~<0zT?ݹjҨqwL^okۋq!Ҕ N$.s;f<#^ :O8kΙ4f`5nys!EYRuJPfD.5oc0@[A{@*89ɬ)i>\$vlYMToFf҅C?<KbeKts)Ug" r-DFAD(t6kV#&(.Ǝaw;rhV2jubY[MRǒ:c 5x@`\%„+c; >m~)5joƿ<{d^,+]sF?My=y3Wa]65rv,tI3Pԑ*ZӸ2\n֏FroPHq0жpp}:69IKdκ$gGT^qzXmF gj{g%4$_)ڑfy@BTfaƕ "BECnL55QR| .5 0W^ijDPXSRwlmOl!q,D8,hS %j!*`,?-ARp>f"^^(,r"do:yFB?R$,hPAY/NGX<>d)71okʟgfnׄCd]G%tdjLd 6rUÇro;FZL"$w·|/+1"u2aI!de1_٭eUQF `` xoʤ ÙUd+{OwnFѬX\wvPڊepqvXڲ4+.ʩ=uPq\{神'/;>qbП=Qߥw20HWl#&N {Y%$Qy5ClƉXu \p  \!.FՌ -[7pXv&D9ۊDjkXm1 '7bzfbЈ~QU܅0@Ym\2sFJN51ULXX.P ADJ)&#E+9}yd)<W(:?) y^,p DdG٢h4A=츶xIrRr/9Bv;C M i֛udOg{9昳"%"3;mr):#3j٦S(|l䲱VpØLD!׬,Cekr$i,@#2XKEK]OilumclNc/fJ$,ӄR" `eeY8֓>*`QdflbJ-5>ݚr 76B}"c{^e`p|iDMNhx䬱/e4(j*n眳^"@2jI>D]uaCTŵrEסPRJe3졵4g$8*3u R2}}9yȹsqܺc+I)kTяa ` : BH!"Ȃu-! ; >HO\j¤Җ4*_“A] 8DUmrT~tָh#D%|}<8RJ:N|EbUj\ b@XfFi(까GAz3vcLHlB.GYcEvҪ>N[t\ k))Pž|`-~#KXfilCcN'}4r|&PoWk3=]T M[vY !7*QG3*X;S-_(DV7o )Abf huseGgҹR2^O/Uk.]tZ~9F"ذ[JSUP =n_SeC!Cyã`М|J݆G†:ّ1e~+[ѪՍ\$f$*Y-{:=0Pʼn Z.!Xn4yx"eN'?c{EL;Mt)I^ī;rmevԐ.Mw%2hJ^בa8ܞz/ᮐ~J)l;)Mea[ղv(r57P7C)kJҿSÎy+/q͇Q(1e6&oA@mszǶ_UtU79c"vɁpHidG7"Ds4,'qe^ڧgZ4й5c|D4`~@gW~hT xKG%=:t^&u:#M|}IčffH=mCw@io!x4_m0tdsyA0GiKxn3)8H)eMoDW\Ym6ш ,v︇:{g? 2[:^"g|_Nlc@tP`'rJ3T4 K_yv%'wtTC}3Pp@(|b䌴_+)FZ~v]8%ς`p~TCru5{, "ʳƻR貹sIcQitM \jj\!-1n[I@[,9 `MvuT#H6` \q_7z*6'&J(YaoKLŴ)pvڈ0 T66 p2BY1T 6Չ-G^{~:SL,X@KߦOz:mKB2kR"y.ήr9 L%xzy ;ȪݨYXX0P◻;QQ((>8,wqjf`Ib$P@Yg%%g7I??>kcBDfO6Ϊ[6ݟ׻d:]{7݆,nÅ3d ċPuUͺæ( BZZT $4ýn;gfhg-emM*zqA/wMA.i<vs}e{Nm"蔦YWVks턚 4.%:x %(d鸐9y'3q2KT)݂4߰HvZ%uG\PV5"LoWʂz-Q\ Wyro\x*R6??K7j_̈́\ Ql?SفQvs,XPH{;DNiCd(6EK97 ιdP0 Ṕsh>@q2ZH}1>K[ҟMP|]_@Qs2s'f^`! (SN#<`Lڌ:VOQSS+@ׇ 1 nIo`aڳ bS\U'dU*rF*kj,}ȔZi^Yއ?Ld&?pUVUYbJ]$*j ?IM}HOX{9W Z|5T #1Y yqֽ-_!̦r(\V|6> j8>ફpYP Mv7tnzGNm'7N˯_WZ֜ŋEf.m$Ktto/хLŚcm75Yz<_S[T?o>/9#NW-“<4ư!&ω/n%uӜYpY8G3ԁ ?ð#!Kf?Nw~[Zƨ'K>,02?psyF60=>C-HOͷ!~ug#vۜjN3&)9VwBlJ>BSOF/gfjADE&9Z T~,> ;Q5qբ&`#ˑC'/*fEzHс +ɴRI\N83k ^UovTw6L-G%__#yխ96VܲqnW_}+_o_y啒&MO;vL|7~%/y`}ohJs\Pq0ݛ^">M.R{N|! Qe ӈ;?^4Ix=ܡ~h s}ߋXu3/#08:ژnԏ7ghzzt:5t][,V,A[H`-<^ T92edw,M*OpNNz@|xGD\C'b4rO XNDD])^3YbwHW %SVѬ18gwuw_ Q̒^E~"*\pI~˺%+6mMM%ɛ0CMɷegV<['͢qEYu?6~ u;#rŜMzC|\*$û,,Z2Q&|a@]祪WϦz""..7r?hYlՍR%I~f>Z5Hj.y~tgj^v8,Fg~Z0W\!Xo:c2y}e0p9{ڤډܼ+W큚@j`'s-x,f뜳 ƐғP/`܏YGȡx<2|fF#gJW= %G6qmY>~1 IIH*o!b)EQUްrBs nSeJYSF$Ly-v W|.DEWyrզeUy"'H9$>fqygP9ӂuM QEN5;"fV/@Z4ON`DLa:ͨX5s*o`OI2<}RTui2]5%_S&eZ͔h#*|cWd.+O&fnssZ;:綶f"u EiC% ^C3]Ck/`m%"(;K!4JD]n^aE+lm((1^M_ݡѐِWti4L6fCQQUdž0i>sJ %:gf!8@qAYjUXIN^ZƴKaP)GReAodԔ3SN ]\&XPO/&֝Q%rϚԟ;~_{hUzMS`n|Rc Ng.Q'$x=L3I/ kvEzDR Cf΢]n-+#-esGBفG:4Q p{T#ཷQ0u.+wyǏ;vlccO}mݦ:z?{-ž^̄hho"%D'gz]ډrBj 9~{޵z2f 1 Dkя d:d3u=9d%$wwrxҋĎI༓Lǰ^' 8CRT lm(CBbgD#1ޢ(v!5%K뺀}{;s: L;Ʊ#29DƩ)bDwp_" hk 9vR/79GAj"R5l=eWF>;ǀC]kٓ`vf! "cKFuW9֚dd6d - -%7zBIg%% y@c6uȾ"8Hfy5M &9* tbD'2j 'w 4@ EȹସSgb|c%.1fD 0`z*sO8k#",De 8Z  LwAxZL5 4dP/י31;wam!#׎Kz:D`! "[6)sP=ۏNjw^)FyKhUC}7BYᑍ_'"Y)t!a2c[?YRo^wg<7]Xi=̜rfslӒB ddo`"13[YA+j+Ѓ*s>~赨%=Iξ2h:W> xM7_F?/++= `ee_Z+{O)Cp͔׳!XVq.d!P+ksCg1e{wEbxﻮb9ef66697Nǣ]׍B%Ǭz2]{r(<@&zB))Hw/3\'J~t ]$f mDώmHdQeg/ ,`$*: "13K`PJ%~Z.RFdbftP]>d; 01pDnoF3jvH3*gm ',(M-61xx+؟}>[dzv۟{w߼;/җ 7[[7pp6?h᠙@^|9?ۮh o~ִd=G}߅Chp=/MZknnsӡ泙ahDDgַ٭s[]3n>Ps/4ST$C dePFiIz1z`=ib"jT ŷɻ4 #LbL\n"r/Z^?͚}˒תbz r݋L0{ݿɅ>^?Ǻzdߖܹ/-4eU0*`BefB/,;ukkIPJ&:=YxcspO眘gɯ(pUH_L䜓 nh`¸ȡM\EO|\+b >[ C)9y 6{9_tuptaס*B|[~ih-5}<1;O8Q$}/ʏ؏X{˧gYl*ҧSPKҼƮ Sβ=du|MޭSbW+pRiy虺3壴/oġ'wt0b9xZkxUA)ZJ   -bմ7*\@Sf>R42b-9 JSM3#f*'&rNu-Ј[ @>X-wQԚ|tH\"&xoT}ɕ@.h~!T`O1U"k*wh/vN-6.f~_b8v;|(yhW ɻ(J܍R?v@YտPW IDAT%ɾnEI?ghr7G`GDa:Fi}9&} no1?ح[?W]w/_ơC6],9rɮ?/>A;L==ګ]5o73ɚs MHg*s&>n]!D'w=>fTrb3.Ba3 E }Y+21>GݦǐZi ]TZ09FϫS3""mr/ a M=e8@t79't@ lYy+yxƒF3p5>iKjPʍY/04m\\ eokGZ!t}w~n5ܺhYJ!,7De%NV[{+o,:* X/wC$\ Q/;{ ;G0ܙ̈́^##F)qBE=yk'op=MLsT xo`ǎ;ɯK5 B#&DXfւ!k-ufYE/˟ 7bzDX$M;XvﶴuMAg Q f?\[8{Nv)[?rGm=p29OxskMn ]`1}ӧ3gxn;ێ{Տx8{St'?#G뮕qŨlٍz;5q4l<oo>4!UĊ(#H@ܢnH =7Bkc[ys60Y05#0R#og޲BM?ksu{7PVؐάU<0srbb;(WWJ]La,Htms )y3\h,*MF'pfgP%1PT5 MD^@DY~#%'c5af-ܰJ@Ÿ{b¾!cW5JdrQܡI?BB+W&LPfB<}]+zXO8 g:}t,V3 A>aC+'=7,_ѣ~ѣGw/q)Ok՟BLaۿE ;{ao:Ù5A頩tAqEc/ǟZ]w}}_לC7^?2]MV7Sx2<q+O|_7v]g?{rOzs^Flڮ붶Ȃy}_6Zi8⻿o?z=skGnxo{իn<?{xذnΌӛ&+fl$ furalcZf) & "]9w15 Ԍ5E6pm5d?w8 A:%$h-ǰT)dxi/D\ ODCdj|$ZF`0ދ5L]TհYjLߛ3e| 'ڨs̐ՐY雭ZU«0\B)ͩ{c8?s.+^07Cל;Zmi-*Q[d|5ɠ&^IB{&cIrŜŦ,R_Ԏ>Y@=ٷx3K?G*d_jRm}_g1_7 ,X ޯ: !i&FU+Τ_?z_MQ+aM=>Ґv9{G;e*#"5sNdeaÇdNM2[duӟGOx?ux僿/{cy.?~ƣΜG#GV+g.;r_8Xˡ Pj/kApZD f&DDr+*ABt}d";YY5l+ {d1EӳW< Goba p$9iXFQʆ)֮؇tx3wf,RwV-{^} 䰄yVKMPLl g3D$u &C - ZwulnP5i ^T!!/BЇ1hB%1*Fkbeݾfm;@.v!vbw@jլm75]O\gU,ɢ,&lBįmq ' Xt=0Dp+ɇC*,~rO6CE2ڣD 52+]")4r6F"Bܥ3f֌:*漟t`eF0~Qc]ٿ̋K8/~lll !i-7غGҢY}{X藗"s{ҋ rpw]D I_R/at} ֻ~wn:=Пޘ]k}Mop"%l>Gٿ&}p+O 3Ft ͵)b6Ozf>W-?;O'^}͏|-][__]YmmybIc( ;/T fc0L;ẫv Hʅ$#AG%bXK˖/lf^xT uM;,IbNw]CjjX_j.x~ȆL"BuH_io'Eho! "9g!is"Bz7k?YLZd1 r9rsRiDmvDƋl}1^ey(`m(w݈]6ŪwAd[Cx[W4 ܿ*2 hN, Y%/GM9ƘӉ;1a{>WYsVy)Q4Jx٣hpnyڀȱX`XQ'l;+sAHRKPċI\AWs+~|^9[ùxSn /, Q e%"`J|`6p@V$5̻Ra@\_+q^vQ vr0o0ק ;دxL=5=ѹз#`A.qzvqq`~X)2wiU"*/QDAKM΁*8q}~<XkLkIM*՟sh/D(@8HxMx]}).}_%`:j= UxB 9 9r.o|'?y/S>/,6duVcx>u"E[r@t= Վyi'T* nnlL+XXsOKӵ7f},uʆHX]="!.^=ݖ4|6tA>WT#sƛo9S?S]NPۘ uzA֪]|P7-hh ίK]LfBRB[I~W;qâ5 `{h[?yfO7;g?GCs3L? ux\9KJUbD5&3D$HwUF@;b?xTf6sXۻcI{|kWH(z9@(BI!isAkNsS[G>V!V1 fw u*:Έn]T>bIS*|be: u;Kp-u6粍7w:cXX5]+Y/q%ɶ:h{)շ3-6Ŀ 82=s`=@ C33l.{|0c7[:,hzM:lnΦӾ9 ]I,e޾:s; a<1fx6sٚ-:c2,O~ӟw-ox;#pCl# ddq+QSh;}?_v[P,Zd9 Rdz$NaRgV'DF ,H"MHc Y=Sfe2['a{bGc8jz6řHU*ɓ ; s&=F>Hb-D*H]6_f&tHn _'uhI)p/^sRi @B,N=CdXnq"rs[)"_l 8Vk~cf4Q7lEU.2۠*=yloT@Qs ׿EjCZ5;2t[,mG^~Rwa2'HF']'];Kx@oPd!!a t%HH#Cya`Nv))@e7}1d=h7xaa&+`9#ZY뜃uuNsn2H?)Y5ѡ1/tt!.|uر19t9N LS&0!_:ƛ?'?q>)O/s|k#8uOǤoAOzÛo|oWثrgH1+҉P*Q~ jؔvRZVҪΤ E"֊$.k\\w]l [l0QƁ }C#2 96{19'Qs6tJQG\d.?*oQߒ7 y^5`' pC=SƇ5ϛ /&P20:)+oOT+\lg x.dž P=[SmYkh BrrU^)59Hh AWCbnHs-Z Tz8HƖv]Mk0pHsNqt|(֋R[oZټruMhm&"!t{/2*v,!w[®F^-V~87G}oll9rȺ=[ y C}_> $b Aݡ>|4Jcr5^PғC1Ӆ>L3>ڿg=^ڗcezb~狾7uchVE[v1߿^ZlHE@v▼?gQ(13HohEpr4sut.V |bi-#H(&/bت:ִ +r[.&6Q1H9b(jMԷ}O-HD~,mvBjW7N 8:_WEBYh "]<<,"] vū[D5jxs-aЦY,1 :uh3D5KYDLBu<0 {Ձ 1JnA80|`DY!3HpKc{4|V2 uC=DDk{]*VTO:ׇۤe{||p/7K5>DEz J9ԐKF t Ժb*;{ԇnI.]G-oZ{n-[[[dNV66ڡ˷6[~G?v>&VV݂v1$*{l\~"Em0&6a^y{ѣGu[>wNXLF?Wu{Xk}WM~S_ Cd" |1%xa$zj@D,In[nZ!4pP/eHMh/Q: 6p,З2Eqq*Gr1Ce\qGL5CGV]BAwLw^Y^@K޵\f}g%zh+C43QW\YZHECWkT1ahi>%`!boNN7J%||l"4^%RĿH&pzs.0}צVT prp]͉х""O. 2 7"GD_mEQW:Vԥ؞=d>om ?'_s5}ďrEM!]7:`MvN[Qs!8/56B?ǽ;ƽNζfw]7brgon@lllMɊ1XEehSQ'9tJ9 flņcnpG}޳swܺfQc.弬Ko?[f }J4VxT0FPd49-` %pvfu!lIo t2ssᏂ%c9؈twfW@C_C QH-!DH"3t TT$s >,,%NB??QGr  ADE\Xl HrIUSCz4qH<e C-Y碢{whY^ [GWx 9w!<%qKS6l*p MY5D ʋIJ. 0t݅01N;Q.vo &͸8W U9P>l2vº2FXɣcr 9 X(*%"k"I 31WJpj9Zdԭr~ې|K/G@&cmc"k-caLS >`gk]y X;,daQ!%3{8vG5^OZ`Lqeo-»mXd.k#oD"6dH+d$ҵ:T gng]%5:6621=zX ZxX(2s=߹ݪ'Fvyp6kBM;7?wte<77f3W={~+_&`d-|n+/9` H&\!M?{+GD%3cee11عg>'ntCx4^;ȌG w-eO3+UYiHK9 k?stVX-p<v]ԖC];*dBT!ڭ#bgL{JaDHvĮ4kG2 rYx@( ^N§ |5i$VpQ$O/h2_t#OOo~s_\Y߽wa d"|0d9^2Ϙ`=ꯦ%Ӝ1X- uv!=#M7֟>7߸0#gx0 \xjZyӞwM?G7u>׬Ij)HRt.3ߵlxIJJ~-hTJ&6]2Fܟ r_2jEV:~/fYKof]팚 HߎޖHp2e=M4Ɔo)uPpKC ĶvqbM$[j.E8_ Ŵ`#lrgnmz闳Y=CIn, Eb,e]bGtx ?P_b6X+ 㠇hUĀ,yc*/Yqj_9wR"-]6 ޓWLF 7.(=lLz,8N+~\At.a C5RPf+_  l "mŹο0Uz PU+#WH ސP(v %؅ݚLFƘt|uKO lFxaF@/ @G=f27Vƚ{@ ATԡ:?&bbuu=cy)t'O|kuc,{P<}k ~>|4'GL'N!q9θ;ZSSnܻ[üHU+sk~E 73#"b,c-m/0{e9BhF5`$:`v0 1̶OEtϮ@cfIZ+f HWy_Z?RDhI3'c޶):7]߇QV:z )ƖB] ^$,T ^|ҷQ/Xqǵ;|ADuhQ +*󻣼7|@#!{X]oc ]*$ː| hKZ+CɭtgAhb4THB: vtK诳g5]:t7|'aq;K_2/}olll[8)MMwrAzM)ՊsEN}'d)EbٗXD\wtzБS7V.ڑ+>>o`W(-s|)Ж7ƭt :N3ưj'lmȑ'O012UEH0ϧ`-yugRp0Eѿ+k2@'gu?3 D6g+h}{h31;Q7jNЖř)Dsբ} j⢜h{tfi} O^Jhg4LD.*0 I~,N.ˍp#jǫ  P=U*zXm8a)?9LR-5{P@+@Kf ,Ɲ2&䥿[x˗1} :6IF 35֍;R&CRKz!i30^ %O )=In ˁ#aGPdއo{^u\ rԒ|P /Ƶq8{!0og oiƐ{NYEqCٞċ9_ve['N\]3;=[3p; f^1o'@h_aFЉ{~}_{ќzlVPʕvj0>#w_ڹtrQOOm[صX]5+dmrX%F :9sъ18O>׽&`:Ϳe(.R Fb2?9_}o|p~S'{CqDZVmA|Ǐc?kz7YN/z 願!qb) 7hPAMr#t?991s0q8|舍19`aKQ9U0\wD8St% 3KDz&᳿]p41SD-dq#zD#F/ u;Gm(=wt@}[XٞN6B4A <|#/29gsG5S+vogշ뚦,PM $-P/>`NloXY9t:Mx/~bGښO&2{ƣ13-o{=~ks45Q cdK/x΋~%̼/{_LC?\igԻWyYn]5!o]V*>DR yv<IYz -M_ DczPucõօ:67&/Y-\u.=|^@\mT12#s3>2! 8FDDeQ/_ _O? X\z gh.4ʬdr868}b[ξ5u L *&Y{^Hl~ێŐC}^N?ЩOT,Ԩ)>q6˟TbjE~8Pa]ezLuA7JX.V*dJm_R֮pd5B'K ZGС#Fgg^ƿrڡsNoEߎ|nGlmͧQ?ݟ{^i?OX,sn+%t'7 {hHJ,DG%jْ{jvQe͐L1Ev(=usH[s.6Fza l@к O D|!5 WѩZ襉< 6f7;׶0΍9wR(94(tԾ3,9\v- ̙Y̍޳ås"mƫ`L;zƖʲX.9A$SU5’4..=bT`jKhbd} <'h|Mcbvq,(gŪYʻϓ\.='8KdxX49@NKMI9.<Ǵ7D}l_(!lCNnNf;e˅u`P%_A\oBSkSg>29;}o]yC϶fk. ;64nF}7pvKz}{:u3Ao98`6jaX2W5YƘr|@Tj AWpm,'.HF6a<_0)ΩʡQoD ۟i\ɰHV݃wI:AuF<[,El+i|Q>=zbAAO`(1ہ1S%Hݸ6 jg?295Lh|KCfwYʗrij8X4f5CS?|YRHGfN%ܡ@q1 wPp,b&tr-f Dû鶫%~(bA|Vp8jSTftA.ECJ8hC!j-FlgK`]]ѷ9[rXAC"{aG,E̝JzyWon1uWo}9OVZ689tF/fb`46f‚ƀLgOWxoy>#k+ܚw~ERkÇ_Z[W=^59ɢǕ 5)gPӵX81ۃLr/] m!Ĩmyqj`R>daғVC&͖tc7I;E㢠E~ QΪW?eτ%C1rhOI9l1+'Rn܃~ABۼ>ז.e>@Or.Z=2< vƦP0W"-F=Vu2۔*zXbz̧S ={J0?#\ޖ$EKu&ڂh _n[ 3GoyI;Ov߽;>kcHq7\yx]< \iXXʠۢ݃Mע!vuA%5|'-dD[x8b4:ci #y?p "uL΂Q?ZS~^G^0R^vFL˚p9 kmmmM&l<(o1sN>K], +{7z{H2_,:ۙn2CJu9}7#~xݍo{晻م,ü IDAT}?9, F"%kAKY^+~5O{?|oz޳.?{뇛50f&"$A(.))AW%*SmjSLT![Rm&ɍ0.9|Ѹ-V[C#V W.}^]Kp6X6rӛV$~t@@8 z,6DEo n m!l\]Rn VsͪY6 84M U4o#7ebӯ&޻[VTQsHG[<c jb>/\5#䘜sNH^&(3QITD1C{֜5横9^{w7@}^kUFUj7 a/+ |o+_\@KD>9lu"Ⲣ~^u^qh!3*K? }B%Gp p_{ayK|]J8 X_J{<{Ko1QPi>+*O}lP%%t7Уpqvh<W <+ N}!~x;)L`^/WkР䤨'}{B9uEn h݋"i'ThĆ) *T_9`63z S!0⾎`s-`f'9xrɍ5*4|2<u!]MYʩMXH mFAb=ײu19IF2# AWi EUJ8qLhԟ$jD">z  ٺK#ج+A2 uIjM=p &A5CkB]dcG+|:SaD@W{pAwn?;7lĆx! I}f$ynFATp%Du_߱&<ƈ?V}v­QEJ_Kp1.dW}N[IyK ˒ $ü3k|E?Y AޢlfwY-dԙ۳TqWòl@D9<"<2p8)˒M|%dr"@+p2sUUhZXXXvm5kf)%/>W"c cLQt&:ZquvO_?yfNZ ~BN^Yx4D9!3BLkG`-x*˄ Mi]7Pc}!j xd ^t@XS7~A0)B/?}yvD&C#YQ6ed^'G5-[o,M=U4-E[af& &F!j՞50njZ׆)PGy#5pƪ 5ixdumӑ\Q_ mR%rcf>'xi.B\Љ*u\_X{$-M![rp ~hy5"*`c$"kH9_+O?a˲Ksrmjӊ/[_s0~dOS&t8,CKyiM rp>xNFrMYpڵkʑ]=z[/L3@QDUtD` m&u0iZKt5*e ݮB߶2Wk֬O;;N>+vh1֊I9e4EMSvϯ[f,+`WyQs .?e`y-51R;fe+_$-a&֐6, M^ ɁZ蒡"c Жd=֋BDQ a)pņB!PP*c=mh~:E 8Ȃ .ᐛGf++K.Zc =Y苘Y`+QT理'8WQZ 0B T '2~`Ֆ]%J:S7 Olj)8#*d A((W dhҢ“2od!T#X;tà J1̅7L) eEh+" N,GDXff8[u0,cƨ׭ UJ,>`(CNECi\P40 2_U0leQD$ uB*EN\REmls2߭SMT \GB(@}9Pru;L WrN E!CƲ2?o8)VS\?> .VWX]ۀUٗ6פ$kD*~i@`52b%q> [F IȒ8+'Ǧbjw L}陧3VvYIBÓѨ,K]Şi6mZ(<axdݲ,eYM{e4-,,hP` -ER X)FQ _y˅ |۵kh4vqdF]h/cy/z V1F|#AD'WrHj`b9 +iՔ,nQn "DZQkE%X=&˩eRu"1 F0u$@l2pɞOw׍%k$nVHղ;%ɯN4m'N2s+ W< ̆]ƹf3ɘ#!@b>% tL*úlؒbkdLz<5ܢj'uc'(56ݯ}b3GH&0'N#RoE%_m{-YB^gBɇe|wnn*A3h!jJaBeO_ssbPbc҆ƾ Mk[q|龦eTU5 , ͺ\& #Xzİu$2+1xSa^lIe`m)^/$q^eYv< )3=䓟w?݇.v-..c)Ș"dK`0/Kynn%ӏR+귭(ËDܼZ!§5ކ+BX4í$C& M fQ_?m8Lbv a 9_4" Ca10㼝-%բw-MaKуPct MDIbeVfn.HYukgĸIZ9„,u~/Kc&afD\Q3;o$cMEEDLa'mqU'@U!"ً̅ 3 m ାPs3n9R0DHYFۢh#:=D: 5h)XѴDɞ KpryiE}/a>U-|r/] -se[3 S,KXL*ZItI lSs26ó~]U_J-wݻ~ӺG>nͥ`**& 2_o aKKKf͚,ZZZvrk]gYHi*kTXZZt:ᐙ yGp8,bvv6<~qќ*GN#6n\τSN=OƛmYGQp֬`+-O;UZ @3uI(!(¯I}O >֊#pLTN^Iݐ+='*?FF!F' \n!EWr҅/E8q8'bl >%E(%x/ 2a5D/V銭[6du |a:B#VZ6Wn:l$Dڤ 2YS,h.#0l `ԮT6+ә=izju^MӒD(&C2 B}!5O\(빩5?֝6MTPX*yX")llػw4Tyk~U֋7IɕnY-ʕ%+/$]I±w\`Kr?DŽ6Yn~֬MIStZ& Ez6ٙ~Wc;V(Zl\{}qGy>=#?eyimݺ5؄'z?]mٲ~s=w.rwN_ʲn]vm۶NzKKK@wI?⊓N:3hlg<*ƍ2eUر{t=v;]1䗟<;3ƗkN/*g4PBEkOAǟ_^ve~Nկ~_?z[o[Kz g?׽uyk `aaꫯK⊻;&-.,,'$/--}|ӛ^,KquD4??_r%]v7y3x$;Eegt8WrܦtB(+;'dUX-8chbJ"˧iH.z!@ۼiK9Q["Wx'!p~Xp8O~$$@BLɨ:n_ <٢Ke5$^?I9 DaO:mb``( HefSOfRYm= }i3%H֎b폞;ľ"Od f$mn 6Nɜ-8xY OAdݖ G[.xodj^&c\Ө=nۼs}eY15εUg7 s ^|qa7 2 OmЌLF ě?\HJeXKN5 Xwq78l$uYEeXV$Y{zY"Y9^,3|.zi 32 <*s 4d9)0a̬% >}uJcja0ʹ'j6D{arM/'6+!Jd_J+*6]z~bB[V/Ls7HkA ޺ukY_uh4?nд@nkk.3K甘SvXsIY_ӳ/_)ۡ"2YFCDlV"e"9rY{; *QB &/J!ԇ j1,m ˖5hn-[aʹjZkCplJE֏`IsqG:vI=fIC -C"B$᭬G/pм[r(T 41NIH=cA9' j*~t#Q7 Q'=Q¢rI .>]  1{/Oɕ {tM[t|Àq7oMI4f,Awx]?o&+EEތW,U:SEz5kڵkl"-y督hUUuQ[n%%xVTj!Y/Z ܇@S A;J\ c`cȲ^$W$/2LitJlƉ$D~zTCClAޫ-d)0,;r/ÒfC\PmOefNbBnjc4 VADK8S)ybd1r ,`LB =2'B.f)3I IDAT̈QXA(kueCN uB V@ȣ ^{+ 3^feIw3;n+fUGysn~~^..~333o~o"Jo1z׻vy5<ݼ# 'nzeViD{ӹe'td*-o/ ƕ!֭G`8)Q~1_Zl 1\*Y]NIWŮX%dhOPx ʩp/]z8I1 CΐNU :d@5]?#\m&2θ2*-? B\wJ!5@Ru JqHѺUׯBJ)cB>h!q#x[iT&q'5yN,\MpsQ"jc/-_.>fe)X8xbSi؊8u0@Naaanv _xlnvڥLcDqƢ(.,,cfffWw5y'> /p׮]^zippv:O>λ;??[wxRկ>S/c9soovao}[?я^{o{w|{;x{ֳZq`pM7U:֬Yg>~Ӟoݺu<o޼9\GّΉgϞB\Òn`<.@Ķ"J"_?(dNCl,2AGo;"I pZDC>T-'5P cڒ7dD$Ns9Jkqn▕sdt} U0'W4;u#h>PSk#I* 3Bk`N"!f<Ɔ "|-gG[<ZՒ 1ۤrEY~> M4,0qAC+L_gjF,3SA2p>'Dh 5 ^;g4feRfcXER҈ V_W(HȤO2S#UFEB&zř|+Q P(HSާP˲Ȅe*wiײ3R1ˑ8-I25ksfB^.jT&&R( C绝NwZ1WBO"VUw^ ۱cǖ-[֭[F,\~WϿ;ᬳ:˲=5\sy[nG}֭[.u{`0رc]wݵsN1ݻwm۶z֭u{wΝ2^w衇0z8 WU.j XeUUƘ(-PY7ž+UB` pF|}ېu w7.`g8K&08`6!!H:k?d;ihÈ&՝e&f^AeƙCyK^2Yɓ c[Q Dc8hBN$A~ ɱMte"n b9t9le8*|QMXe)/vy)2.w ".LQC/=J"Ü69q$Dq\J*f4t5(bsВ qȮʲ1]lhXjotJM޶ d 8Тy{]*;oF";I^Tw)`ZXS8XH%ؐ'o ;1'5@L9H3È/pY_om'ą$$r4b [!*oBIa?t2 nGT89~mĒ|yEƏ j84>Ќ[DϓNeQ˕R$@2d7U!keB˜ @Hu.Uª`(4UFu#xT[ݦ2){z)o[Xm4 :P8 { +,9hGfFia׆|Do-޳@,pne PX"{Vj,97 K_>[ 6dذ-(.Ś5 fq?Y īEպI 5vr]{At/M)Oj _ʳ:+|>sÓ ʁ2Z.pT>0ME܋ [!~&EJ^&6fVf3e(smUU۝1җoXU(~~7O|⢋.TKKKW_}>॥SN9wie1]}՗]v3.褓Nb慅]vEh8v:I =xwŏz<S~ܹsC=t,..zgymnnOG|K/F/{֯_{{g/^XXxᇗz衽{nذa׮]Ƙ,w,O~_|k_=~?)\V@i\^?㹹-> a8h>Cf5Nr;O<" pFS1f:7T0fej6N#H#U0h])jp&h-f{{$\2&{lz:&-Q?*-f6$X8b/:{9<,6[rLYܒZv&1+Q]S UeiJqb"a"(tbf;EP#rMC^`)R:[ ajտi'LҤI1%Gk?)'Pcփq)_ !N8$\KI*aЍ?5yP4G]BeO#f^ <Tsl= XZ` YQa:gJ55JX31'SU.QvM- 3WDI+P|6|ʓH&߃Jz?0Uа664@8Y57?R^$J&-_y~,G)J>ӡ=aK#'P{|~Z\XX~kq?ohtytI}{Bg<wqǽg=#s\wuוW^Gyp8e۷obI!xl){ԧ>O|{Y~{o~7o\Wo;vܹ /ܲe˝wy5_򥥥3<_bQ2W^yg?p//>.޵k>c9x͛;Ά @"~5$`0j4>#{wUre˪*x<*$/o+i+X;æbjjM?UE'f@ #^HgmGkv!GnK $8j9""T-Z|_$cqJDJcP\yg& cd#6G%M`;9j[¤6w0Nj x3 Qu'b8FzScmDPBL0Bae5Na?jP"8ŪWfE̲ x]eg*!Pj=4UP8 mYFZb5F!BX]lEv`$qvEMʶFJJdeWp"8Zz?F)Ȅ"u1-֩}1[k-U">)#1#t[`~0N6WeL:`w3̯ pc3 ;=$5=*r: "+""*E01 L$r!BXd~ $ O%Ɛ1AE@h!)+&X׍[NuPs] /N\w1"z^B%4@^`Dԡst7\hFG"T$$/x3s7UjQ22DXʁ$O._2m7O?X)O68+maxk_?h_U˯,h9Jy:A?\x): kޙGˊBk֟MET;*1)oNrư> 1|/~Wؤ^tGΝ;7lt:-[a&57lpEjvvvƍ/_ZZ֭'ڐFKb87 sNQ r仒0]f>ꨣGEQݻ|uvgr_z;-W({/~o~CK.M6F#<~ַ6o,N}ch40[kO<۹)A-.2KVع ok- jT^{=U-:ƾɃ#NEa&WsC AgM΁mN=#$ ~Ѕ316]-a lj4-c.ږ,‹2ZDhF,[ )=<¹n*iTxxQʲ4ƧuG,@M9sk+IGYY3^t58 Jc@V]3'I0֔5`t#R\~Y•< ^!._BtgQ/Fh-_|asmR`lE$!3:tM_VĊdsŊgmmR|ʨ55+b%kzt;F5fgv^Zz^²;Kr:A Z9sRO>]>vW_ʷ ہ,QrꅮӐb%?D},@r)GB`e#mj\3:M(R.p嶘[NY]WlA{Gf6ر/?xׯXrs9DFݰaÆ ~dl.Bn0zTyݺuD$o-,,+ҚȖv~?H›6m3l`FQp۴icx<a,۷uM~aa#XG}> HSE"{ngϞoƘO?uGzLAh.Y.U[0W^W6z޹0pKdNhǹm5s Z1ajweIT]:9c̐\bJVhng[s1mx<)KN \bJ7U~A[oJ}5B,$yBEo#9(H0[%۬fXdO蹖fDdp4biyv&PuE s=""3DT;5emTq F%Y"(t@j;[c fħZ"6S DYuu ǹh҉xGfY9z P'KFr| 5[XMBCI&@o'ZA-U7_j0& Sa sd31EmzQ^G"aE! n!uYǟ|o^"3K øJ'LF܈jEY/ Ⱦ`^r#˾>%v*ʓASz'WZ4}L`@c&_AeDv>Y}ҏ,[tRtE:znO _x§>Oz 3Kە님Y\˲Y{yaaAr)K^` RAk IDAT,I9Y571^'2vϞ=֭Ѵڵk" K&ΆYx,І{Jٳf,p(ү6Ztx?5k> /\TU2ې$$$=u6Vfŷu2-42YV*%TF\|C AF"& }6fP@ `[K &zS`4 l$2:nmҠ̣W9uO@-Ng[fimzVrlpkPF4h&) 9&|"7{OE[0xr[TN|~fո($C0 U^崊Oe{H[~\P K r! d* px^ [:֞P$zQ+tH%R3A il{W`}[|R HLQxK xUW]up {ѹ;ցmMђ&Dz%üD-.iJIxjTG Uɫ$gF>&k6Iߢ ;xL.pYKϾhUEG%r}[QF~ o8g̾H!YpԯmPUX}E"18XJEQw:"iHEQt:J.QO9׍1֭h,ү%q(`e)H&y.Wlr02ELQ v[,_AQ˥n CuGQ#k9;rwqޒhbɰ鶤KH@\RClE 0+\, (+S hL0 YĔL &H j]ou&1QdQi>!"hI E}wM0.Zamk5kj-uZ\!O`nZF!ORAL!{W)A=:U-Բz N䜧{,Ea{_8st%W",xHtl:jVRU&worw<[24;^r6øs*uZ̘!Ӕ蟋}_~+bbc XO<Hb݁"LH&RYSO))J `Yt|ꃼ SzT+DԨ`.i *k+!I!n3u:/>'.4\tqYt $oBB!| @ Bgۼ-݅1CuR|zPQ_e7 *Bv. |/~0,aY*٘]XK!+J빺T$,]l$miB`ȩz$>\䕳0.-6mX60ܩ'-,=F'"!CCu3C $ iuP䳩7a؂Pk \yY2atex PzЭ5.݈mhyND-ؾ>ܤ5H>ۘQNQ2"jT(t BdKB2= R*O[YL彐/z)4I*yX"IhQ ߰hߒowN^W "BG*E$囥R}tth:N{$"HX{:5mQ+@k3 Š`Xtsoҳ^ūOn+gZ>?ydMߺ ?XiSG-Z>Ēw"I'(;:9џ\j˒Khue:n>(Q\jI8>mۼ%?f}!Zad1Go_m;Gs5ei s a_1-#̱9!~v)ƵWlC&:0l9qª%qIGEcK`̨g[Q0QHy:-Bů#a$?Pxl53RL'2:/ H]"C8ڔTv9ff`q霆L8'FUT@pK:DIՎ4QBM }MEL\VVXmMvu>Ig#ȒL(-As"#!otٴHݤD@!B3Wi/G+9V*1X`+ ]$m"˨.ߦM5gRhE!j߫AN5ı.N]ڄrk䒴K_?{3W__v/ޣDp<֡*.'7JY1H9&1^DI\lZ4$SU #X=Kd SD;^t"+5AޑQJN.X 2FfI$Å>)Ҽ@xh/Lq<]3WbVSJa[u˸8<+(kW^" #m^1O!a@Ccp:po9J:Ȩ|{i`p_ ﵟ̎qמs9ԧ9YL̼8?Wֶr6?F%2LnL6__VHnlꩢsచ37U{{eH'C oA`YXXf엿wozoW?֯`T{\-A7`*.(rAկ^CsoAwf~\6)ہ"hXy[ PYk[nxWW^V.AIKD^Yzu<&I O-2G )Hd{S-( @Uf<%%ԫ)2e%sJfJn:Ź҆'ȘCy+ dEQcl-kB. ߝ,B_Å|'k YX %]dW'فl ðwKިҰP4-TxLֲu!kp#`e>dN)! 5&X~Ks'Cb|@PD3k׻MA$d!lɩfB,dw4Xt'S'?<GwK>}}o xo O<$`3W䴷 H:MwI@,L4=qziK~:}vȾ:} 4T ,p,EL{Ro=__o}ůF:>ք}`*,rT/[75]vMtp ǍGK6lt{Wԁ^" Zc5Of=h<+ Plj%jT*F9&{AD"&$*WzkHXymѿFCRgej,=7R 2fTaj\,P%Ezv*4*C:xymuz9}ZA.k UU[X?M?3?QxEk:Al"@U&*aIC(~*[8tq_.\>~ OV3|2eiگOj2}>>d UDfvүp3Ώm;L&~!/F1g1fN@9MdN +9}vT##VP:E㦒R+O `E2 s)"*Oh/q\,$AŶ55OŜDME.q'AX&UʄŰB⼗u90Ӿxt{z_O\dB Is!z*xݮVp7a?O߿V[.C3+V'-)j}hc6n̬`!$VM3iv[m;V0DБQL^@d-!ݵj;ze-iA(U$د¹eY3/۸IvMAF&Ǹʢ-8wHS6ITV;yb%e{a$@I#CYS.Qz`В~)H-_x$_` '9'^oACM`KWJ4 ZA󞢐2,%V@|޲,볱_ ^L2J>E7=̄suM\_X>DFή E]v6j3/O .Zpnn, SIL %?i{iЄ' OTq[V^LvDNO9)|zw?:5N3;ޞ=׭[wj8;}_GJ|ٓM(,2@yf6ٳH֕BZ|Y'!rzX M쒥5 fQW`-ۼ;.y3s9ɢa !Μ9J` w\m?$n=uySX3xZU9I4qvxYOx ?,xHH#A|O|A؀lYVEѺh=5KΩS$ʇvsAR( S$bjrWeH$`I,NӢp̖Iz TDИaZ٧#Mwa",,!\ 'd&"(]z`9M#oõݝT0~߈v!tD;GoQSRCm-ًvDTy;?Ȱ"*KZ\'_ 5zF[O~/8 "eqm#&I* yhm1!߰ ѕ~  \`xqG pN) P_#W ;7{t}N/Gei_<,y9묳`JiƅlפޛYvTw眈{ߚU*I ɀTmyތ{/=f6mӸ?/ci6d -@HE J|۽q˗U%KJ޻/nqo9qkJdq,2l4/EºMEھ%<)Hޑ[@TZkq kq>x{EjI_zm?Xb"5H$ iڞ}gソu[]vox M7Љ:6Sg6v$ 0ʍh<{_v~g3N! @~ IB6 8ax"Be'WZ&~c#f]P-캢a+q|>z8׉쾢 NCo.rʢΣ'g]sIզvrf>.>!Ij)%/%$ 1c*1w r-˧"+s4EFEƩ%V0G8<>i+'CWKϓ5Uk˻7Ys9_C](R )EM`eVװ#BXΐ=3£L -[q#Kb9@e7g$@sꛞ&8 IDATqi7E\o~P7( @0 Ed2t:"r|{wq[_?/216٘U}(̈́D[d OPO`>̈́;FONJЊ(U buɗ$*'*R^N+IqJdC, sd",f j I?ʷ8FjmK1qF_j\RRͩtbԫ'{Ҹ{3M|{BE65hɟL-abB6kW"S?du Ҿ"R"©1aBLԋPUjfڌ&z6/}pNSG8VU//@DrS"SN~HڦAf;kq&z[IGʕ^Lb9KDD)%`A4&r.baf khx' Ki$1M3eD%bE +9YS u#qڍJ01z/,ѩ+]/9)WN`Rv8Mo)N3ڤdt) x}|`f[S*ShiWNI=w5Ru_ݼNmgk:6"yniD!kBRtCa7Āy> u?(v'AI"0.^G`ɗ}z!~_`l<X)RTs`  IgI=sK%Q! †Ձs_Zg)~-"$e S* b-(%6< 5>"$=vZ ( \T8 €H9=AWKÐ ) e.B3UDOfU66ޛ" lm2stpDD bY$EnUno< q&ȍ?m'q.zIN*鯀+ 6ΫEG @&RZD(.˗uCLSwҞTGfaEEJ]Yv}̔K"䤓ɕqJ%͂ (Gh^^I^`H( 5;$"i^lDp`q6J{<8ͅ'""&n e%zL<'tC/yy"^LHKl.hN}bSYTZ܁(qJ(jx !GZVV5b0 仡$d@`#* m;X3'7+1HJM13?Pd;Bc:.!$VYyE `]zXd' BDE{f O|Ϸ'>4tw̟&(Ur(y oG@UUi-2 *T(yŭHzq VS1pPyf"8HmKZG!33y<tLnлϜ?67ևK+JA9 'O1AqlzD4N;D~?Za?=JNTF: +)MhI`+.&_WRf]hFѧ3Eĸ`,:zZ@AU&+TtS+PM!"'bx&B%.:$N1yzgQX!b+y> #Bkz'WHaNgCSڒ?@ros{dT{c9aM(hA0K%Z Ip"*G\̼1aQŬ~/YmVE a~r[\bs]ݩ㌡$'|]k&!R/-vUNqDvO>ޜn3MFTDVdE]u6Ȏ'Lo lpiB'S]QP:DP .[|V{oW]ΥkO:F&X(*4I\ Ϭ=kdBhd|**y܊[=:%id=SN5BgV{q7J&E *8AD5LуYԖrB@E1KT"iX+}ET!Xou \sTaA'1Hz4=)sM>υY+6@:L(Y/I RZ2~fN i $^M0\tK+yW4Q؋ы3r'2;A¡:\".>쪄析L)7'rV\R: Qn~;ˤ&McQ\IX閪tT=+od *!'+n[iU%׋`(gSdw$iN&{O;>s?._suo-k'~/ܙN_0t:u:pɥo~f ;ݫl A-.ϲp-o,]F8ݛ{HT ,NAڦYѥEWLu]3{ I i]KrέK}8.}H̙:=wel*U)9~̀P()䨶۰<1k6Sj4BsZydԈȩSwK*oǛLݯ$A5.%DWڵvC,eL6R}5H*z@Y&IQg^b=BEHĊ?g W/Zx+goۚz:WpNx;_Ǟ (^ ) _V=#R5> *y)22N" .(Kz:⼐ި27j8^$[  @~(DV|!QJpH]s,1l}7Ɉ$b3$bd' Ԉsﮜ<.ռfyNAJ?SzmO~< ?Y*kdR|R-jceGP)ema>wyc%](LQL:n9q^/0`v6I#H3F$N%̓奥#Gb7\7]ֻxu7\n_d,ʡߚ^_ ~ R 05//]s +]߭n?ժAIv1hRxQ(0DQZoψTi soj/I\C1bjV5ْ wVkrWzWH@-|_H;BLK@S__ zÿlzu{O,]c@vodP\-G"`D>qo@- f" gszM@6k:{f¯x΋c_,劍iIUEތEtmYR SvbyLdSdĊW8f*{lz"[pHSuޅ^Rk~ J-E"czW>Ys='6>nyԴA%# _S[(5gH&}R~7gMn[m_p( ,Vئ+%j5 鲲 ?o;LZhѢEg 6֎dx',VI4R$S:}vʠbyMFE΍`ZnZEl=#s䵵2U-m~Rs*VʭVi܈mF^(Y6u̜^Ϥ 洺J_etzh4 bNHǴ^8 "i]Ob҂;""ݢN3'tD8aT78ʲ)#-ڳ9#/}k~gC#k4@'~Y7Gf&XcEDމ"XVʮk=L,[J;;L4)w/DWS;n%=8e'F/ُ{ӢE-ZaHHg-Kt_p尰iu{"۸cJ "9Ti xiqZrȩ*ڄZrKWUi.2mʱI+|h3l ڙS⺐ΓL k/$[+5߄uJ qG'JJv2 ! 320 ASS.FV:BDVaflD'8YϛL{e7 vJ!|Sz|ϻu?/|~?7W2hG&QdXeaa%$Rμ6XZFJ)k7Oy_ z1~~Ec],i-i⾵d-Zh'oyA{ͱ_:j`z=':a\q^^}_~O~9 hP0\=__d+oGl4ڵ]Ygi@v?֙]9e(iyhѢEOsl ?gS-qH6ʒD"4\` 9(* Ԃ 1˖E҈qF>oQ;' 1z>ULZKZD&F}LJof&еR3ED%L.kЍBR\C}"$)0= KteebPd@$ᣈRJĺdX\2UIjy F_pӭw=7+_zM{8o4z9`>̽v.4}͡%;.?XuR._"{TyfE4ҥlOc3*좟ۖQ(v{3Lhf\cymMJVJf(#YPR.̹6}s+80p7ƣ^رk^dq#b3.[A+(); >3ϢIJM(1+vonǣiۻ?῞Z_{ǿPso'@ [LLL!2pPPem?hseйs_v᳞uC=t?z wU`s\r$ IDAT7፷re\w`0(ڵkx<37ͳ:馛0@ktg?k8^ͻ.͍?cO{&QGK7xXgA>EHE? S==2qw]m9p-Zؑx|[x$ LҖN]ŏR4N@JKw{yTDbֶhOVsr^0+cJ&~_9=3VV̯ޖMkzSx޸T_J2__";I0Tml#tbu 1fH "0,"b,EA`3"b VGݵkC@z6EMCpkYAݫ{>}ۏ\w|S:mw0lL&˝8 1߬QDh&gp5(BD*P!;?2A?6ƛ8\ ԹO*&W\+++~}8yhƂ"f, /~^xӟi3@[k2R' fBŀyF0xC,ڊgaNLNB [=DE-Z4fQ}lO22kݾ?Dp\"%ҎjWך.,-kcC^'HHԥ% ߚit_!`'\4FFT$ Ng2<#~&h4NPiel1̬Qΰ;tz{=}{oZ6avMBC2M$Sq ec hG>EfٵlLG0FnJjSg?H!ZV&"b8rPot F k;1~tmll@n0MGx~Ӣ(nZ3Z_ox< =N7v4:5HB:4y^Z/Z.TL/nWALa矕-U/9+eU;s" , ?^ijSVV5Hi\9NJt "EK{Y?}gK/{bǣ("fv;QǛwcZSE1GbX0Tt}ٯ"kߞ}k7tӟ韾'|OH@@EDH Pj{x2X<5a43lNwi8X^[[" ,;,5iR$"B$٨C!Z8& Q=z!"aL7DQdͤ G߷JDQ4P0F4^ 766ց Zl6Nu&R(D$,DH]$U ;p%&\퟽sVt%Edڹz-7r[SU-Zhqb8QzrKw8ܶY@P`1luX7xUno  ; Ees햵dJTF.7߸nI9wҼXݦR$$gj9\l4EV:v.7: (,_.(eM]~Ʌ;әE0q0A6Pabef4 JA *kĉH]Ǐm,]{vgA\8b0Rh 8g"Nƽ^O"Ԉr]^^L&D$,kx8e7\,P(8 kήh:zpq|\=F#u{Ʈ+Žx<l'XNѸq3"Q: DC:ZCi@;?|ju>M s/yAs O"IʪE-Z81˨k>ZcsBJ+ݭ1KLm5Q!'IEB Y~HJscr/7ۑ3 3us .1}Dke_mAϛ1kAuS\P潮-p+!BfvxkrW|q8חN*k4|2a0.ח7(n, 0&nQHP0$ڌRh(&lb*U2":aLΌSZml g1X © ( ݰ#A4FT!*MYNOk+Ik4fV)?`t|s8+͍]_@A)BEa8Eh{n4ZYkaa@"HE}&ݤ4 RJ)+(` a0a$ 46*RV"hQiН.N? #I< ;=EX :ڑ԰ec y20*# HD@R2IPA~Md!0$0iIOl3fnoWʃWo&#B9N *Iy\:+f( H,H"HO,E(cb"0baJnŲhA`F Z#4`QDA4an<Ѯ^^.q$qRI@,`$ΜK;͍!"X88H: /L]MtX ]YYޕ.@8!:;t7WI;1&ED6!f]QJ!c:H#NJiA@! M ˈ4""ShVJV@r'^]窍۽E-Zh%;5@f5e5A&d0nbb{鶶Ɏ|ibَ%"glN )% 6ŇۯGVߘ7;[͡g j?E* ^K3?% # eDWlGMD"ʱ0g%d @L8\ZbH$Pd#THiDM ckRJ)clđ#ǏtjL,a C tAk׮U!A_sdXcð{|DAR"':rFE3[N$h\>86@81pecHHG҇ $(Uak"T"IT 1f:c;N'l6K-DЩh1G:Ԛ`Ř؂Hy6)"ӘӤD @YظE-ZxZ%;U.Z WӴy4L])mh`EHWPˁM< 55lڥET+S[|UvS4`-YgQH*:?\\舗^%KF)-(5ŢbÎSX `yt63f#MYX?~TD]C2tBjccDQXtJGJh9rUj~˜# tMke/"QajƘD3*t1:~h4O&$vJ`wȟP#yJR ݻV(NŽ  4Rʉl< H")$T%\F╯~ϝъ-Zx[/v˞Խm[cQee iqq aZ%$Voa.vBZ)'zns|n췩_v̉ /ϗ qݒCΟMkέ*ndz'&E@rVёX# I5((a+]9mתƑADfcIJ$Lc"00|}{>w]_tAMKDJ`@J0#澬om͓e_0{XEֱt&"AtÇ͍t?HM *"@ ԤPѡC0A8X K~A RD"b_D$`|c(MF*PN!FE Q# n B{n^&$!Ev]t*wC$wMȵ?xK@R7|jQmE-Zx D$@ )}i@XV3嫏7['nC%P!ZMR9]:Jq}X*9+s4ki?GVҵ&"k˪E?53/pi(w{ZB5G@SIDS:*v3Uj(UfY}|VF+c;omy?L-}ne Y*\O.x""ҵഷ!UΖ Y>Su+ n".O5Y-uF> >h3tVrETyg@ 8OV,t@J3POIVDDQVfѬ7Of3c( fIMza?XZ[[Ħ GZ1FpyE)tp8*TD,qO'3c g_Kza0F"pvYxj@[RQL\аbYy?n5zlJpcrc*K8c3G1 Ixc e ."q!E!TؙF"kJRJh49Z[=|[ :ANc$u"ƗX-Zh$>OncQ9'󌠖 W*`K'J:?ʖ+쳔9 /1چ$d@)$i[qm5e""T|pA P D$ aGZ8L9Ad"i 8Om~˃հK-)! [1?xEd3D@XXR[klݍl]IJ@HD"D{Y"L ) d"Xۜl&kVH$Ps6ޢI0㩮IagE-.[ Ԧ:re&)8B,ׯՅ.N;,R=,*ޛZ0RmYۛt‹dS{yj>9$εR&(DUtvVj:G3#L4"B8>w2ZfӘ{X#Y_{cG/eGyG}9G[9ml{uuL؂$-v4OZ<_P̩IHY c̏TÖcc6ƣi4a"h0/X '6GHɝpLDa6Ctc$ IDATo:c?_)`:-ZhѢE-ޱX3\H|| 9RXɎSA[: SFj${,lR>T[JA!ܤ-}j1)2&m h3ZB[V( a`q$Ra`pY?ȡp=m,Q?? W,YbLEYY 9r/;,Ү*FfF?Ӧ%\7ɨr@ p@?_$H)]:#ıu~ 0J)#`X,5>.ZB;=ZDe@idPi ÐLͱ?>3-hٴ E-ZxZ%;Vl@۔Iv(8g3gXk16V͂<~HښRo^3Y#F+QXĆqdiC?}9=k?cO=wر_yo>cgqVwj/AķU?C?Kx+j_p}`پ??ؔZ{mt'J[տ|ܛݕdrر[oYݎU ?>ٳ{wS.ҋ?t/ү}S71}7\hbAXCK{O;mNop5ݑ$疠Ks˾q Aݒd7)r} i0鐪j&SUVCWr,1 65rINBI,n#6<|-p=a'Aj 0c1<.֞8o?o>{/zKo{4*z&=66y ;zd#GGo-/zq,̝EeRDD"`cAk"}s} $>~x? ҁ 2ic%7@_E@J]~3hi 0@Q-weWU7[>L2B&B TA@DJO^QP@QAQ@T@HH^vk{=>L~g]n^k ֣Z@EqZ׬I 2(ֶv9k;\Mk{h(,@(D4f1fFVZyYkS6) TqՈA_Fҁ-u8<}գg]ħ}Ck;Ϳ}mԪʯ_';OgV-P,{s'_A׏On ;w?.}3޷']RJ27w|Ӧ啕޶:gوtwn75aNJT,EQ2eļ+~IzѨpwI8"-K*V)T\ ϨHp 6E&"%y;6Eɲ?rqj D c4ώ0 _Bf"Dvm-c)ݩz$p"Vf95MQ ۉ,#nM9܋;kǦΜ,r[cT*c:tß])7m?kӏ|n7o7kHO̓ Gor-?Oˇ?DZoxeјjq]o#'[_B\׽׿>鉮'>.""ϼooRW?*~Mk~E/|>_O|߻m'>cԈ0wslXEdݰa,~w| i{jzT$457nk큃vlvb~n&I-`}5}' Iw)yOWEBNу.=FQ4HgYh%X| zA27 \0sc3"hnyR,N)$$Mx`֦i< z#N S]睹xH{Ax^pRqjr*qy;H)?㤺R]=o_*zƚH@MYkff>t;&XYZ:<335qz?HTizNE(R899YA\g-3zU1vt ]7iz.[j"6ւ:bcߨ=qJ@FRcXR+̀@’6AfNj44iqP[[;XȄ>1 1De@@Mlz1'ca3ӟ؇?o񖷾C|Ν_󊗿^) 4M6o͛f1"~o2Dx_U?ٍ,Z<9/` +ycg> oͿ糟~ww;z-o}/=9?̧ۿn 0Gvqnw~ qݾuÍ|!ַ}H"}Ó:t'>Wƛ^_oxҋ]TFᇌ8NXYϮV+޽}ǎ4M=zTjo r×W94~D5`˙;Ӌo۳?vheeub|.W߼Zװ5[ #{A/5In.X^;# lّܿB,X% Zgބ-tqYCuS{ʞ"N( >y3P G7-8ZK^ʟ/z{Nx𖷾=i?5vh/KKzo`Y|k][ħ }[}:1>iv=ϛݸf[?~5<#XTfHiyy^=/NRDTVp+KNumKsQ}eey!W<|m;v=(J ZT.ҕL [ׇIF&'yvAW5RW~RDZU zV^!i)c[J |ȁּ0$Bym[zJe8n#?0kpL}IͽX 7|MˆTXX^ɉ@J\.Gq؈x|=i,WVWWS3g7_t΅O<|"9uۿ(1C }q|<11^*VT+uf. DibEQ BZR-_:~|jtPÈ Ѷ]W>Oz5Og^Gzn<9SFj8_\ UVu6s!1lZ85;W*d4-0H'63[5 D)Jb XE1hwE`BdFTJToJa+ZN BU)4M?Ht߾cc$#yԱpl̴ֺo`>՟Ż^??4[b_o@D^7IUh{=!C>B&*H.e__f$ $uFDiBo4w߻Rk'&6񃻏ͳ־=O)  ˘痵ըZ؛*=z~= {ӡ#$:|СCE0 '&&0dz#f aP*OzA!eף JФ#G޽~|7߻n~<: νxG_nPƧg+SnnT+bIsl cןazjмaz$܉Y\Xư0Z+ijlQ[FrXQ\ĩb XA*"d&OYM2fAA> R#I*IaӖ%_lw޹wo;~O2OuOs|W=jH7yCT ܟGJ-϶-..{9G?ʗC.W_ZJ._yK8VXuk3'z]tݵy$f+>rx߁N̓VVTy>JcUJqKz˞; #Xi^,ɥj!&BaTYQ1"(6bPV'N?wKߺAW_7֧ο<9/Dz;l޼G.f@How՟_Zfkmos_ry%/ ॿ/~w~ oGث"׾M711?JG>o:;ݟħ_ޮVtobەտz{f7nnH+_myD`n=>;A~޵]~jk_Z޻oz#ԩ",J9OFLUAJNlz vJHd1Q^Jv#٦vRV3/22( 1`Ğ-?FxK_WZՏ*g@Ў]F ?3,_b,DJ2$ ͡%O J4M1BqE&Kt}o~VW01>kIX IDATQ2%^B bl 0IHDj N'D0BGz7}۾EDZ+/α{^PCY 5Ipl$(&eEEa{~qi~^7R+uJHiDP664`߆mn( ?TdL̬=ZY^>rt|jN QJ B$9i)8"2D$ !rlQD08Ch&* iQI AAb;aS k;8.k~.d}*.c|^i&[f.\ Z]kʜ!@yb'L" 5Fɿ6 4hiku7|V9 9qI&;[>C6agWIm&voM!?q. } ؙg {vhmky9{l&k]Wl5>" N4%@ԅ_*xϻ̟}>pCg<Z)"eDX ־OӔq*PHQ@~R,1Hp9gn#pz@i];voҴWLjX,#K~;4*͇]e!d++eg:O j[<-i}fWzXnQ6 AxuϰW]+0pJ#Z^@ eՏ H: UްaZS0>95VH-T1,? +C?Pgl٢5Ay:(kVAyZkƍ/8nǏ|_ c0(L*$JVVlbϻ>NLLWrh߁ /8Eե4NUxWz۠qheoXD pd֍8;>%RVE@8M9g@zd 5*$p HޘҔF%٩ӓSE=H,d/.]ZE ȋLFT 2 ]#0#0zI@>)i oLӳ {en"W =5uPB1v2"@A 5_tƫ*f.hvY_  x)T.Ny?dum^5YY>NS]D  (~ӟ۽{7RDIAX4)=%0V_XfZfN (@aN$7 (0 Dy a IV[l.oٸōc%=ȑsGOLb)caP\\\ڸy-gnT(ǍctE8kUOS܈4 8@Bq>vCR**Db ,Ν8rǗF-0723nQ߾>k3*(,VrZtQKX+o0a`<A*M4 NjXqCxc& VAjbBt`AzLfӣ#0? G'W#yb9K<Ξu15dJ^kWe_1QXh+%뻹ؽUsG ݪX?c#/FoOrh}eGbX `'V*b󬭞X{"%߾{SKi4F#MSw!m ФP!OiC5Y&k E_W'ٍ3ot9{eתqyMzVVVoֹ#6rEחWcGQCck y;d#"tmyN,XC:|4aƒ"  3ɒ~0DyNWVFLTDo0u4Q _ҲXc EPAٛ,!+A,&)]:8#0<S.N)$Dht=V}5xЏ}k0=d2P#| '\֙+65 jtۼ !yK}3XWkj7#HUV>?wid Œ(J#"@ !t̘&B(&6U coGP(ꕥJH2 ,h% ,b Тdy_4UD] " əͥQP1}GW/C T c$J<_l-ELޚlmJ=rbyy"YpbXb0 `!3}u}s.|{#""k<"be'NK`tZ5)Ė2H ֪Kvn…="OaR"`H0#0?,i<].}cݗW w=j}/IR}|X3sS9hnhdʁADT{ ! 2sSr^T|[|V ]9#-_Z;t@! J!,["ZЍ(Z_Y:cF< pߡ#,۫I{ SSc\xP <٤P.D+ufyA豧eDτ4͚֩}Z97L Dt(Iӽ{WjuЈ i 69UlEgHk @+R1+N4e%;g'N=T<8$"L" RMm3cdzl^]&2jE /EX~\aFG>m~2ӫiLC$ʽ+jW*E *nDgl+JӰm[nUDsj0VV$N뫫ZmB*F#׫Ƙb!#+<o[>^pϐIAYCDFc'Yi*+D%"gR!w˺_EEiMD)%`Xx9Q5;3J#T *5ARmIDd%J)d+$ #;lXMێE2[wԽ}^DGqsFaFŐ%i1Kq~UfKi)z澹ە;3^a"?ji:nBwHőe]*HR&'("}G4rM`da3C~#q&eP2^zކ D},"A!@B$NJЯUTIy w޻ZmP(B*(ϫ6V"c1FĊ"""$]ETIye0%aOãB9Mq>==Y Teuwoݷ? OغuF1qTҨLL[N"6ZR*ZjC{CADEܭXE !o~%?ָK?50 ]F@+;ֈVjX$&ai_ELn=%ͩĈM 3i2FH[7]%[ 3H!QgA8ը 51c ڋ/o=fL)5"BHOwk촔}E華} Yco\Z0#?FgܚJ#upemDDRN4ߊ23` ~m0$neG Q+DD=7JZ*(@\ ] %$ iIgA@Q"$RJ1Dv)t{&ynul7nyo͎,KyVj拸yDJT`jt'@ -so\0:֒HPD"ÄHlЫVM4ɖe }{X G #@Z)RkI$ڦ_k" ~ũMm cꞧG2(yojXuq5( c~"y_;7g6M4e5zQAV~ ,+fflf7eDBB$@ɦ7|  ICk$7ZF 0  (7,0T ˵Z03 *0)00;'};_M0pjlԄV`̮$SX2E0(X@R*l9=-3 s~&&Ivj?XӘbF矹ffS M*b̙fyQrg닮T9ַTbj(ny;jdUQkWy+[dtt4E>n+:S;Hu@rփAgDng_qKޖxwBlS_$jk'A<\\XP qE GÖ!eSWkv@-J(_xџ#xe5F0DiwmBU"ϓ8nxaybl6&&WjλsK/DARh, ``} b[3q_nwiS{XW=Ycf;y1\WVWccVAܙ_fAy3\^e$ww_KFSԆ↢^(C"l= ڰhf!K n DaTT#\n@}K/h["z77?ݥ4#?ҍmtjl󜏟Vޢɻ Dzuɘ#`9ܴFDsziyo9vu^&{F~m8(Ϯ|K}ۻGoo%_V~`-ݾé5OiŦ^?WQlI%&l,#B@$`AHy]"К+Mg,WkTU8;v옙QJ iT)-F,7֦mկ~uw]rE8%56-о:|-w7kPlܱ Ki#Bߕ3[+Z\kLmU]z36ll/oő,`,(}3e D}æٙv睵 uoFaFo0"9:WÖ`'"-<}Nw-ĭ6x+ؚŁm@u;2h.rN!_#"U>IZ}=d7;܋A7G]]4nAMڶ_. ٿuJyIKR#{-.c8NkRkD5w(VAP4($tu761f 0z`q˖-""牰3#0#ܧ^S[2pF9yՒXVֻ)IDe*)lYTuZwa2Ck =q)#"w28]6*pVv=Bf D3Cy[6i/@t=V*+aXL3wbiqy%Z# cao"BF"B`DP 03BZVX':MӰPY9M4 k+1M {Ǐɱݝ@9"^jl`șw͖HofĂ,G)'Mͯ8:5|* 6Il(9UFيƄ(`QFå-B"JΓZHcc /ؼs׎3FORk^#0#pbDR0 ףSt[H5Nouyu>/GW9,a7k[J-ޑ#mEYBrFDEBpẃ 9HzR0_b9˳5i"m.-.EyW@Ii$%wyj0ƦF۴n&'(Z cZMHBJ&R RHILJiDzE @LbLpqiijrC5%r_""dFA\7QlMқo 'sV|D%"Jj.,#nB0S"mp^`gX-yC)pdB*SD2Ƹ3k%$h[n]vLY$F%[Tu94= W܆愥lc1g39أa }zF [۳cGAӜܱqO|_߇^8gP,ӓSccenmT 0 PpMLtPH333cceiql֦iɹ3S!mN ʯH@)e+ZZFSDbpĶdH5iKRLٟ VF+%`Z( AHD,"FB`% h3ijx*]kD$Դ{`[_""|heQF+e5a{'_u[1Bot}]gdxkJ'Ew~rY+zST>Vnv}{ Lj~lzG? G6[n ̽N:=zk.k6gk0LBsY+IΧ)(P+|]]{QM"r,|Yn_yi~+UL :-"w3[Rs*~ E.l='"Zcr&""mE$WS-ɽ4;Ywg*}@eM'fee'(R6I)b#  =5Z1q*"lI}4P.t'*T(y5ZX,'1Z "- ˕j<^FMoNjI-E0qK 'ۀ2:CPz@kdgѹsă=PQʀibX@jɭ%8gy;CP"B,ܼR E%cNjgLMJUZMRF-XV(Z֡LYYA b4EX!hk*) Ji@QGqlOmGdye̤'~B6C+87DZ ڰg ]iZi,k}ֽ8gDH?PoQ#Ie$IY tTliOD@ "AӱIƊ%`P*QYkA=gg @Jx{wwq6zRrƶniqi\*X XLa~DvhYD&l>*jZDZe ٶhQvL록N'g*IJ< lĢ3 EXX"̞#9H3bj \y9s4G/*(=њs`D71?]F;H)P;?'31'ZV3"b=ٸEiy}'aDos q Z HbgP.֞Qk{GZa(=eRkf{bTY|gf@?8dd~"c:=k> Zd6]1,z{#VO[ t$nyxAfݽ86nE6rw$H4o3~y] ' "bÇ' $e "6<!d .":6aB <<TVW53XOuΜ-X p9x(f8s3:+_ѹ瞳+MS-3h|j@ ƶ IAnW_ sʛ4qM\-kDdH?:l&9ٷIrjo'{"ɦ?5CkFbDO[d+,da{̃~NJ?0h7>17щ5Ehe<{H{,0'BCk۹/~}*7MګOv@hX&:8j*MZkQ$̂}Q'6fjrIR-ƒ`VDJR z-![Z\^]LL>r@bqKtA{lKV Ƙ3s8:uE@QHsŶQ!x;!FwS`Da Aoqm-EH"UJtqr9];۷lccԪ2o(>y4_ؾ~$ιQ8ĀrcN`avGOic'uHJg2K3ZZZ]e UUJQ#c Fs,j4`M9>fJ\.K8ߙe>cbu4ߙ]v5ATg*|wowgWU`Ų4 Ү婯} 1NX<*v :)&b~StWֱ.{YQ&r+[2h4JMFLr,Ҋj; B`E+w+~Uթd'"4'QEF9P&BN@dLr Eޥ*ˣ&*4\b12៝y;g"I;%nC!ih(CֻL#O*&% H7d-/1clGE+3ci]Cj6MҚGVgLroy҉blC/mgwqR6d~1 zPc)~+i߳Z̬MUr|wN@p uwfi5&8q[}kKQhûA&ͬvGہ)hVln-1+kfm3bQUU-P4@}jz-FeQ+EA+f&U֭[;+W.eGoxk{+Ã^{#?]B(۷,DePȫ_O_:}3ϳ<b(PINbQ\wvvs"Jlh;FWv]fm gk< >Cwoooܸe#<7o$<[֔ _B&_巽mϏ?3?* ˲zo}>Ww)/hEDkr۸S[OKK9hmNR[\-N5::l__ 0V $  [Vu!+N-NL5 6۩%be#"r t||#T<h5@HZ"4"!*$(ȼ&/bfeYfݵXAah}ePe%ᣤ%;nDw\`ҍvF'hJ0џ͛THi~iG:-6Qc΍6CِQs *N8O8$UoQy&dRsŽQ>D(l{ۻ>FmqKk=$'|Fݘ+>W>S9 z){>M|Cֳa8a~q6%/~_oo+_-[_.~',XUWՏ}c'u{ݖ/ltYj]Iuxݮ{:)3`FECq.׼ouUWeC5lf(xiv+ qgQ(|X9>Zbj/TB4RԾLyB hf&Hv@bQ#>39ȯگx>}#9U@Oj5/]{$VqN34qh)S7R^VRihC5GL@{!Mԅ)(E1snL]OuVU%yɚGQB@iDwl ) BQ [sT@A)ԥVqY{H}5 jc$ = /kذ^$y]IVKh\TfZ6lU4m]U+:@ִ N8 ِز#Кﭜ亹;80Nh!,/)3%XK͌ u":!KbiYB)ea}W.q<;*, ̻rY&-8s.ꯞzxp};/UsUS!,@(ƠqU4S*1ƨXJe;peoQV2c,,f] |R TJ ,l rfBN2 OQ@\&W'EkU7=+9`6OVv:4u@~ sRY?m@iS]uZԕoy:x~ Rn5n7.0 :9?{n~?kG??[[>`{}WիWnٙ~W~Wn(G}׻Ϸlba,A+ꦝpfRk{)ˍ(۟ r[4V$n+ @ 0 #W TJ҄&,TQvdUt-@P6>4L1NDlʽd)i EOJz <]=[O(A2Γ%vdc)n~zELHtvϛt>F1VD$ZxԮuw2i/闺("L)n:Ry+zZ( TLk$h$/]޽}9"_( Zp2gwŁH[ꢸ= Ε!ZULe EYy|  J!r^S k͑D"bY2iBc4q,I5WX/V8³ m8l wV΅LށUYVy&,#) j &A(╢"$"`)fb͡Sg]F0T 4&j"jGsT]+PI{{㻳!e3s`mzro!;Oog]z؎p3UnJׇy eO|-ۀzRdKͭԙTꅡ_?-ݛo._ K_̟}>H7_{?OEaFin OU?㩶S_\{IQc\ch*[͘<(֕uxҤL6vu[ULԑWK @KMpIk`z=pfVL`ma$H e۱^z;yȍzÆ e1 !bj̜_)bpw N*E٨JEQ裏ycYUkYA2@f._*.rjqptY)4Y%A`Q݃|gllj-ckXPuUDg~s^}z<%MpFFsWoE8B뻈 X׫%}L)jcv2uo £69qifXD:;XCmQ]EH{dmkttMLDiCNx(h[IڶޝJVy]'TLķc2HSݾ4|^@rF7:94nͲ cNU_7~3'//EYV1wwX|taf=VI=>>g}vXdYw{O|8%} |ROR@o]j(F]C6ZC7qJW(4F4 r.&@&)jJ xiմ6kf뉔.m8ٞFa6 !F8 iZyhCSMS:4֒"hŭŞLcX Q[=粝KWWy##8|bД`Ij IDATyyz㪪jC;mfzyM(U*TS)1wi**3u2Sa(#("Y/kI FKLVK]:+<)noêmpv[QYw6` b@dަ &{J&̭}\IYeY+WrmKdw~?'x??E~꧶i``g(X\l}㐦Ǖ&& !L;&2SMfHT_$gWlsI*d$$-0àk$--4KB떫 ңgˀ6xoRuc{wuo(R00xȦų6OeMEStzLP$ +`ӕeϕt"bf1ҥha$͌1fu%B,=8ZۙΖ=88X1މzcut+Wj(GǷˣ[]^E7ۏ`Z0xSMf7dYsX.&`MM @wHƚJҁJ aNPLD 1kT a7.8L@@m(3 0LJꓱ1I(<"R -w}ug]>j nu1 p/ۉ5KǤ 6tcؐ4ZZB}Na^C"E[oZZm;"-ƳNY ,˲r8,esQb!PP!Kga'CVFoѣrzqL2C<88^ٽrh .hPӂ*q52e{eU1Rf\&:a<%" +iq 1y6sr4\0ĪZ*'f&N\aԜFV -*а!t p֢o@}&|mDD48%S [om􀤟~gY f4z5ˣyhSvf)߶4"w_x@>~}?ﻲʰ?\eUo6g? OOwww _0T6>O?j~[3l.@gY?Cm񛙺ym߳.cl2B/Y'm/ut'|$h)k| b46,11% HUqn5zꌵD1F-]SNje`G|~ՔЏf>6lN#-/vsMHe^4ѱW) IúSzOV<Ń !EShBVbˠ8>\<2bV"4T`UE>}& }Qz=}{{SҗO ~kʮ>|doooлUKz׻Ї>焠ι=~Ƕ) V}h:.L]FJ6zQ>p3l=%ۉIh'=l߲㦎I;rg9hIj 0%%%paΧ޵Lġkxz5W+{Oy~ۦwf׍Oɽs,sf|,fXNdr^O1ƪD #X"m6nWUgNYTp/+KOժBYP StjihaY{/=l[YĢC5P4!iH,ˣ:z& j6Jjdh] h: S2uda*!3,9WI:K4R *!D1Ա*=^w[B3t0~o%Nxm~ q]j׃H:s~U sfa)($PtG-oOX.w3ι|G͕}s_l::-M?#?ry:Q  :=uځԧEG 1I|E;?=v631V_{|``Eӹe1FړQ锬XyQ"(*N%l@Ư|wg(!N,輇JdX:QTQ5ff3+&*$צ=H/7Uwy6/f/ŢMҖ˥b޾Y]L?0uE&"}fڵkEQ.*C-37,?<>fbX|^-<[Kx' b^<Qa~i4 Nj{֑xBUK}I\; 8;ӝ v 50hμYI{ 7d5>өiX90|U:нjr3nf1)=bW =mCoKZ%`g_chFt38OHeuJHȷK\'\W^ݲ+fjWvzbw?3 Q7 @eNqPe] L-۠S?/'jiooGtׯ_G?O~>{C?Cw |kqq<7E۳ HTb[=mW PP'$*mʠ0UUwls}o 2I`4{拺bSFbQk;?qXىشy<f7g椛x"AI<?V"{wwU`9yr" BË$],sUAU5dX*e8kZZ4S.q\#YIۋjvսt6ca""jÕ&'^oD,Qy) fLGhdAH3 "0f4fp*.U%A<ϋsB&%!WA`&H` LT9@RP&Ոm>XI (;4 hwҁU7"R{0ԳtCj-d]"QI\[_:4"I^_/;tds|; yxr4.n<)ҥF͵,hTy Wڧ  J1yqKRZQq|TbQa"4zg|RwI>ё>`$\¶CVe|zɏДzvWy͒-Ȯ힮[דRQW_~6QEHTf,t4}ۣF眈ݾ}hG eQ qX8@+(\y "1 $ T檌|.>+F'z×|nVڱ0D5HR5ǤEUVU 0VR&%`eD$"Fk[peaFu[TTFP E$AdhCL~MIei$U,wy"v+TI\EUwɶejFw=cG`FHHp54xÜ9,8\3~):gm#WϮp~Wk4*}hJ;RhfN-tYjQvUll,i1dt)LĨlqnC.\rBB ,Š",|G""t>m?aqʳI9qUM uKo+&@k#M?LKݜKΔLH X=ث>+_EәpS5nّkj,3/,bp y' "!V(FC0el[D;,ڹvիb@#xQJPIQU󷎏ft'kI—lW8ifb"i\ɨ"MJ (QQ!fB(D@0e{YbfI)1͝zquN%fQEήwiTWyߪ8)6vQeF*)'2L|eN_PENƧ=wޞXP$b GD{*nV@m3zm{ 1c؋XViK0JS@߰R8D_5f@$V#c1ddpUj8B,(!0!D'\UBX~j&i*68"eV(z kh S[:hhz54BDt~BZ(vߥK{PιYӱ5o۷ BeyY14JYE5k4D/1wEŊ$&& Bfs.ngG^qe/߻~yoFSjF5{@dM:V|'c=R*5TD2IF?E؁]"E:(92ƢxSSU 1rj.2ČB^d\ iތql>3J lmW]MdȴמhbrTO^a-62euYĻ?A F{wL5 tX磩%w$g>j(H%gyz;"ttgqN58Tĩu?3V,Zc 5W*G2C@(\,\UPjcAg&thpq,sTD!ո}(v%oPc6 {)"/#tG,2v@ q?hqf.1x V (X'3&QpYeQ*N !P\U8 gZVt|YEs^3e,,@DSha\1 KGK3+*v$6‘Mx,D!I/|hF+lq%HXtҖ&w:*WdJohqCU};8qwu gI6U?bw߳cF72$cc(Cޡ*\&HjJBB "0_)+ws@BɀYaf6\VRbt12+Qb!1:  dR&jB9}y_㾣y䭶m"82I\O)S,b"BV T`֚I1RE)At `&Ff0gxHRj[Vū_/??w*{a- NuGfZ<,nܪl{_^@cT(@^p"1ì$ IS1D҉3WՏ]yzI]\Rʝރ Vi#Sb) bT4S/A@o.2D@IV$$BGᵊI΁U6E-zusB0fbPevw|Q.bUn *"1QROM 33Q`Z,ŁQ"BTxHJə9H3D3&<4345m҇Q[c\@Db0S6F|u^ 6li;=퀬RwWs(-/.*reUCм7Iq΋L~4s2^{ls|tת*IfYtF: B \_{hf,w=2{<||gg)*34'lgyVҧB*\:Iրs.Uo%4W潀β( ޥ'z!\Hu4*u!qUHnL\!b4Dd"-qBg\[ 3^~X%^ͼѬdt4.KѬ@@dSY("EgeD3U?/Ceę" ⼇J!@lU\u&Rd=E$;n0E"K^S`V)M NKc`tJJڮ(dKo IDATci@1"M4H\YO$EۮC%/ƒ%^θEiiet>S+N'Kpl՞A-yNxq|}`S<4vLws'Dwݻ7hÚޥ.蛍.=KCiE5$J 0DamGP9)Ò#P,HǮX*R>U4Y6#"Beq,YZf:Rca4F \V\w%ͳv/v.DsڟާL hrgnBR ,i`951w;sLJIaWCYa<>HC(T&8sQ,+1<2XAcPJ  !O&<*,0hQJ'nYr&7c6^ZJaj7<ҚP*Ԇdu:Or$S=ifE,#O0a {8\lt&CT,oyo޸-NEM`IUdmeGmb!hvby7X.zqb1$IQމF;۳+ U;W\v5w0t$QD,KЫQp҅s= F>ўD+U!>Ic RVyv; ={ۛE]wm;ۑjypkQ$ت"4(A"4"\e9FI%"ITko"yeȸfrfDŽS{/w76om} vi2sEqci_ml1b]]" *q Ao-NK;W/1Me2@BV29}gy֭V 0GyUhǹ}|c '&]l?ґ=7mzm:t[St5q-c02[S W>s ??\{~kΧb`&|u>AeR:R8 `A8ţW.dq2AiTԓEUaYeR, 1 2lBB ]28AM*RmC4zQ=УIT<:h:&#ABTkhCӹKNG6txTrϷWgmKSЭJL\r䈪paYֺyΤտkjFQܩD % #͠gG>ݟ2ДnCLDn=RXJWo_ǭÈ,he A';KJZ~&pN"Txy=r;g.UN̡NS$Yf)),&+  {{7{9UW="Z8QXra$I҉h"Ϋg׮?ne"!HjU҉ӪF9Nq4J*\.%Nı;WzW'=|.EJN~\b[6_Hc5#1zԨb9Q43Up%{YfYdzRpZvMAʸwtlU?0;tm7unɨlp{L=^ޒYF0{b nOaܮcJ酠m&lov#"|ay_ЋN!;؃'n@|$Dxfԉ(<u d(% I c E,XְtFLM`zGX!ToB15`s 4! SVc=+a!¢Xp{s9QDv/1LK/_~ޛkeag73zjꪮi`b6#-ar$[r 6<0  KaC^²aCY ӳ0=ݵz2s̗_~{Ux_ͻߛwι<ĉT eyL,*UTwrjc_joԘZCYW7{H&u.Q;:G.ZBwA_*챦5o {RIc֡dd;W%y $93)]AK#m[݆ċo(n.0f=X,NgKBڍ:*V kKq2ei߽Oώ,fΠ{/5f>,no$9cz];w?6iaPg0s-)V?M 5x^ S[[o7o^6eyH p PB2˃j{Uè(E"R,P-D H!r ĊN ¨.y|,\6[y>3e9"OE$M4ME,ˈLFQ>+RBPP$v ]"HȄQq2g826TnZxqxjE*U!&m&YQ!qK=#ys{k_N4?eX|"otvFwFY>J*ft`2tOGoxl{4+]))S5 .)F c&jZ+ %*)j MhoIf`X8V1D2ˋK:lZo锈اv)&B̒$q%> R"9E$"RUcA,,%q,q)H4kܾ}̢`üVEi$ChE0r {jQ2X ȳ4퍦c3Dfˆ Tj`" "DA32cY`JTy{2CK/omm#0`fFBƒx$WY]o˕Qh4e ,c)EWkEyI[7nAFepغM-iZҗYvšɼ44pDȨݢm[8KV}S_wʽҪn;vӷLߋ{‘ۿ{Er }'1@:?8|y1PTě(|2-?‹1bi Y͂YiFXl(r]h@jƆ* `Y]`934#1S eP[m0 &' KƩ3.) !(&Y+Fl&A ۷oOS&45O`HYY4i(rV3G)ԡ$B:xl o9d: ۨeYBps=+/:+ gfeYzj۲%"&O !HOElEQD |&}%裏noozT{YZ0ɒaIUM49aQÜ#@u1i[YֺnS;m1ѯ P1Z3qrZ!Eu> RrKgt(1>`fo5ujœ{z8PZ+'[fms _Ϳ\)vU@]<-zzi& єXx}>iTg.}7w5xI -"_;o;'B~?ɣ57fɕ:uLZK~"фxeZ2;${$z,-ROID ( fS,_j=Ρ'@b.nځFׁM*ġa!Up]u2$XeӃ,V"8%G9D!)[@n`ĸB uUs:h -(z^{NkqgChN'az} ֝<ׯ/:ܻ*lQִ`e}έqiuk8d;"XV5wirݴTVU?u'lHڻ5Aa[s IDATۇɹ :wZɈEq2{":OOcVcQT2~w1?oOw}ן_Ż+iRď7~a':iNmo//~'~j{O Q]"S\4iwڑb\4 vؽYܾYv0} ĴDSN,?PT䶕D@UKX4+$6TEDU@JfGbtPdfd 3 '{[۽-H@L'Z1c{i͇l;E 0_~xlf"qԩݼͽ\vgSֹv,z鰗l{>8"G}W_~03ZPS}qo !h^ҘSSR!D(_}?zyss:05(!r@H fhT0a38UJ%s[ڏ!vED湪ohx`_;.0ywѥ5*:72K"9IҞ!TQ3UP&B3Ċ*sgvqQz;#x՝X~E,/Z#ks%2b=^W;н3MAGثo-uTt]YtN.-b di9#4sַ~˟?~*"7m?.ncH?O>+.}ۿ+է ̻}Im؋EnXn)Ό @@dEFul1d&b%; `HfmAd`͂X鴼v$q[W^K]̪.9#tt*ZZk]\8 {{{[',W%xfO|E )`b"" 4/f`B`DPP2P"LDH tY b^xak?tԀTYN,> H13#!.(Oڿݥ@\D&^0j4YCDÚUi\3U5I3ge}tI6## "NDH yMLLVk@si&>u3M*i\sax-e:"4MGQn3iI.k?|{iM3o4lies"PJ0NG7f{7x kJVh^Y%"ns3=uҟ>C,s%P pX(((P&b* A,+Uý2 "1  ) b@.]&鐆Sg_8)@1U3`Wb^ZEfj۝LC<' H ⫯ŧ|gʯxGÏ}sg{)iP?KNl.]~>G=0+xrk43) f7nkoݸ{sw}g^v}g#F11@ ܘ?NfRss$ZI[tHŮJMm _/ }G4O&i0>/ܸkwǓR4MӲ,ELVk!Ծ(ٴ()E ِ 'p{ow4,P ;3#"Xh3Y>K#Fj:P>lPb3\2 .z[yv t&5[VվٝVWn7kYGAw 5E/]7hiUݎ$kenһRѨ8?hgaگ:ĿGKD/}7,/q<=%*U@T dmF "xڇ jf4[D#CcvK -5w✭f5_+ !/AZ04Ј*ϣBu."11Ĺ'{ /~sXSɬ(j_YuiXr8-J wj$&O>^$B,pF0,I4M(@Պ}D( bXƖ5UC@}%FFV1B4-MMA?5-bJjT@5;3Lc=1k Kd4f9[yO%$&cR$ J :f 9̃ ( TZ(03P1'D-u:y!^ ?mpѿc翧666[W~ii???/,7O_1ffoI[̿fG[/w:5EE_Zn%sZD6SgtUO4ϵYYUR%0crg{*R #\Y,R A,z6,U#Њn'HȬ:f Oѐ@8)sBMMszrTVjZ)vl2M4.< !)D`&1u+/K/}=uzk)a1᭛'6xG3Cv!峭g_zWOC* @VqR8/F͝[]xHfHEQJfei0l QZFxQ(",hBe4!aFԽJUIa@%a,}mι=6w>=EBZX>2D юӄOZE550M&7o* bB^9 =h"PsVо`'GΏ9BPPB2 Լ#&B3Z*rbrj׶k!YLy#1$CS $AE* &LR7p@ Wb`VS$pLY½ԈlG L!()!EѿP.PK8EQ@5T fQ^P\yFZTUΖk9gf& ja9ǓVfs>?|zd0H3/(Ky<;FA4_r0w`Or;vn=x앋I%=0BȀ@:7h[h k, 7b6jsUyΦXާιޭ/>"R !UU0C3 oW*u $TD0 0h ˲ux<~GqFVڨAlgv:| ;mf12TU ʙYT0}?]R1JD՚*As/驭{Ň.^ V2BSX:ʑ7`PM4iV|j>V)"EhT|uatR.m"Ep^ZMsTZUF,e۴F uӴ3gM[ģ_6%lȗwSwT‚K gϞk|]1~QuoC][_9IgEg"E$/fE8R z?t~8$ b$Q?& IDM"1!*q@jh@fZxL *ĈPƘ(O c+9@4E4DiƓTT!e i{g+ի_UE1ɧ2ǽYB'Sq}"a€gNoi %zOgNBf3 P@s6TJ5n:kߺ3}>pڱHL"gJK |iuUWCE:t6[z.]VnMkcT| O<b:4EFQ)3W,q['}+g-rpܪե֨R~![PmT/nT=9>."1ٚ^l8X{νX5jI1m9eՑo]ra3~-bۮ]Ew$R9i:cQwMu`wC+޵t [ZKk_ +KJi}Z0% J(OmA 73(3U f@%h!2!VP PQ l h =S drf $`4H\n04' 0wPLBRTbuNL4%#V\*T dC2`ա>EB"DFvL&ĀH;猝t S' & Z<׷VhD;&f6L>M38=S<$]zAZLF\ڗo>7f=Ђ U|}ʵ͇64MgR Y7*җ 4 Fi}aetLGN=GmvzPAS<4Ƅ.M7zi]!)ˠSJQ 9T]@A@C jRc#3D5RO09 bvH9f@b0!*9E'D+-S+Jo+K "E.YvoO^y/~I-^y"h(Ol Y뷦O<<^qt fK:A##""ƀhPM9/Rrly^2pgW<7R+|\E(]tj5E?Zq@*Pe^+`e*Y#XmdV Wמ;Ω K֨ eĊFꘄZ^`SP_} O>u{wT3DT!vthu_ bp5ݸ(ƈӪ` O0b FH-VvƱif:0T-!Zb6Uz21Z*v2KZ+;:1oi疖8^-ZKNcjĐH.'76^ ļf#R#SP4Ddp@D@-Os/ X7ER04gf1 '#z=*#ވA9c"B6dD @6h(TYq[~E=1,;Nvvvzv<<|⥇.nm0( t4 8{sO䳯$l{Z: #88 z{`8݁r[7^w!M |r3 3ŐHsa*i)ffqu^+>˔ o@ I0^+̋5:*"Fi04IQg!ح{Ϟ!S 3d^YAWV2{,dy5, J{'Yϧ&0p湚 IDAT8 ("D.!61Uձgzl@ãW/\͘k؝HA{b\: .p)w6tΉQݖ,"tM]/N9B :K\Tѩdk!XFViU=˅&:}x:fC"ZvsM2ӻCޱ[?RW: %jJU " LL @ | H 93INXf7+ ("zt>؞ ORs`A9)D3T"x"Bd#$ s(8"% x"5frl;f52iab_ȯ!hxc{Q$o^_z7߸>>tfgqEY5CUɤRkIʲ4r+bNnoxd/&Irrl/M||tb1Ox6z4MUCYsWzo:-9kg1BzWEt:=y$JR%(jա1x- cfe(1⾗bb1`"* T5}đ"p1xԯVnMԐUwTA$cDT dtcw!mU;d sVG[*K{|?$UxLk3kI s,1~6"aeo=т;YeջhqV iV;hazFDT۟mIM㕽}1 Op0~st-8]˻SKcc|@k|}nu,$舨 lŕ BbȍAYƚōGr]T"9r{zd2`! A"d&VD&l1!;"̂ZS%Tc0 1jjC`t[LI/"w9oi:+$Id2zg~۷o#3>=-s3DbDy'MB'W/ɍfO(uk(0O&#(aks;I~ > !8@)&.=zʕNn{頗ܸ_|k;oƽ^Rkf&^'^:^2]enJ#}f02fӟUpÍoL1T, :ZmL+s4P̕ Bgr2ҡ"Vq}UY>a:yUE!SDmq5lw峼\87v*JOW8Tҵ4fUGјy !dì xGZ`>!8  D(!(!U LMb+0ܕ7}rȢ>-gbYe5vct""nνyz=yo^s`'X;(;{lu^ުof0/=\vY;vTY-}׿L:3-KiQLp<ԢnJdɁh" 0AC=zZAqBqhj.BTUr>Z k!OLJsI_UC3l.AȚ@TNJegl6񡈈hUxk_xɧz^?ͶL4qޤ ̎8a,s''t_:ٝjTI!XF餟$Itak00bW79*T跓~a-mw5}̖' pKm?:_("EbM#{ط/]t"1SGaC/)cz1o6fKڛ ,*)hZwڋ3 Z>ڴ"E~S0ĸlGgхh"EEz#CFJA6D/)bd%* PCH͊($Vuylv83;=-a [nmfٚ"qW)"f 6o?;-!͆dw43`$_1îfZcu⼗4aQ1t+VT2Ooݺ}SiA[.'%x?IB`03@&"Y!L8$o՚ܖ&hHW?&#|~oV`PDWI j`/"v(ABh@ [W\3 :t &r 33kdP Qo0E ClK,KDͳs(?: 7ugMKe6/ԺGcI "T]ݪXhR myחWj'M!wnGpwP}it-=XU=V5|w#_şRWᘾ߷ȌbKVQ0nx6DѩaTV`*"*d 3>DDx89"jBE0q:"!b  <#69D5}X\ *vm_[ r4̌DO?sW.\r̙3ѹgnʐ{f#T5"5'7ӯ{чϏoܼn [٩Azf41}=kY1=Sa3NЊ@p`e8=k/xz96Lɮ^|COaMcb4MGu['ާ" !5]6Fݙ8W>\Yǖ^g+oNjMqZx.+L4?x|2 v'TEv>K kE y2Si",Bt'v,yQ޸3 "ޛ[rUukwзt 2 A_QEpQDP&Oy?D8#dALNSzӹk}쪺u{@[j׮]{[ckgQ$IǗvD{OD8}*qn pQ U T,/³pϞݳ{y]+d bMAyP {-Y sa ȎR433j4Q@j7.$qCTQ x,(- hR"Y@Y 9qd"ul"^j1FfIs [%UR%Wǂi> 􈭂 LNc/4dC0%nǚkh?uĔ+#g6(|zst*̴^ o ?}H?Du %w$aD Pj; Z"E vBDJ Z @ TJB=s֋FA:2!uxx`Mj b%jqqq_[^Y]v%vCDV޲6h %I`(ffȾYD䒌5"[ëG%H9aw9L&Bt:ggN/yIlbۍV^9a5;3n_ks]W4??cՆ$҄aiA37m۶Z*v}*cP8WՂ ]Eр(Ji.{Ymۦbfo\zx|H(R$XMw93"D iEw.DNμ1pePR"TZI@z)0򥀰JyĎúӚe z=:z贵azQ8+&ͮO:C Ґ^B\*)ٔ3K{֫I9SQFόCGYA*RUDbH4*"P0AFAd dпCxLz`7w977wzpDD C#Da0^H* 21wB DQr=!oL[`1Ƹ`@D"^"""MR"cV@ ?~ I4Z~auyHS%|k  Pq.LDRq!@$E{4ZٍOU}И-[:2iļSN[<<&f ҂eo&;&x/'~9ix yͯQd]gR PT^Չ5Su`\X!DX<+"cV (BE43 M Ran"$Q)6hqpA bRf1KMFE !B"L =2y@R`mX I6ouז|v8qF9(qt  iNQDkqtp_zMPG&"qMAl< 6b9xd- P :<4QSw%jڦZQTb)̬umV޽[g]ڊ<ρH{=G"(!ON La 5-\aXhZ%<oh qB$ok6Yjcc(T)+_k#}뻩Jqn:ˈhUD+T0$@%b`@9ZkpΉ6/Q85Gq67HPrػ<e`$iIĭ5Nzǝ/}:Tokkk&j0   ! Je` ]B(Y."+F`q\giq3Jy/Aa+#Hk0"Պө2kݤj4!"yCi6Lv暍l;ū 3 2޳(!v"ފ <;Ч.2&MVkƥM Lъ(fJ@" B )8LOњ*VnɅ1ٗ@a\1KX)N}_f./3"KaP%..?j& ($YP#e""!T6CUgo2rPҳ!zp!E T<8cwUGC Bz}b1 @Ni.fY/TD9jW`S^vTUUUfMWW0yfN˩59i\rGSɓT31 к*_C^#"Vkza13f ÔGñm=ĭ_ gޫ__L$k ~~ZԿ}K._uoqC3FgqJIASphQ n$l* ;'`.Yր(1a`(9@TEgQ&AY`og ;s>$2;("-fb"I`C gDP300 ! }`¶цËSB% PJcoD҄ioZ9-U5.F !ۣNT2y1Bމ@9.[Y ) ǎɓl4ffE1( &̆UX%s5L`ejK`M%pa"s]=a0yŘ˜sN|lzÇ[\![=c޳"4oCaPj^@( A4U . BS tsu,ȸÇw$Bl-ˆ]:,ZXZ@a/ H"L+.?nRn{n~s9k.o]O",I|6Ic  0]1#wQ ,؇c|fVEq'{۶>4'IfIcfn x&/A=W IDAT2FՖ~2oTD"}PZ F&nӇ)}Q}M NT2 1ܪeٔ6eS|:ھtzQmw$fm7;Mߧ>Y0BIs{v>+_\< {iy//|{|;o{u^;od(ZPЁHQ|X>af(KMD$$INܞ={L#8?D'RAXsCo|eKKKx}= d)Eı/ -a1@վ * ln7uqabݑcK_Pwnv/ε:k@vxJYu*`#a*vJJLuo O[( 8ޗW_Ͳ!/:H4r + ~&I27kXAX ڸ>|' %OB0Cb1hd"V)$/.n˯۾ОiZF+,ǚ@\(\D9Z똔Q:zyiqNyf˳fP$@bQ  !H0Yf,(Nimщ^~%)0{qQP4{ x $_Œ^BO ئ)pr Tɬ/dҮ;%w$MT7֗jGi : qNN+ T MpX=n ${i賵^9k71}?o _l)[_;wG>:(iHǞ|kQ_,Ms-[]'>{ggg6_"8%R{nk,b"L|>۾{~dY' }y>YVKk}Y1q]ݵ7_\<8ss:G(S]%R4`D g{o}P!"EjB# ,@@\_|^@ κjgc@[B^"  @*S6J,Ɉ~cKE*d;ByNСC]v90;# Ichy (eh$I(@B＀leYDD n]DD\0C(1B‚$DU836skkGmj.k.'IJDL|]aIkz֎Uw N!pUftUj7:lxtߨ?qM cS1R){zt؄7)KӼi#B(g@|O˝Dަoȍx]w1e$D᯦j犫?+zyNKF+?ɏ]vp׾oy[|=_W7q޻>xm3{g뮽U|yh eLdw{^UqKyZ<=ϜR;p ý}a{܈̿D)BD誫7^tƘxCtuN*z zOPV޲`9J Pp i< !@DZV?@Z\I(e=玭gXP p Fb@bq i{dpey""^l8D{UJٳGDXYP(@_,:8zuZk<ϲ9G 0u޹[/ 0c`A'R08AD$ T\flg]MV8&X]gYwQSDV;PD!uDA<8kTiC  [P F SK$xpPGT ݝH醉ZZYͿs+IX\NH;/A[RSF\L₈>4zfv#+xl03Ug};ȴ4]^^^4#i;m Mb衣Z[z)Ip>zF H2NhE֍Fhk ZGi6v;$B`m-"~YV4̜2c" T ȃ4N 匞IH= MݕE%3-%|+}K_޶gs4H P1)FbK7L fxN z{X䱡TD t_պ=s^`@Ӵm% iePi%M4 )>k+Fn?$fVrzEW> Њ܎y=9?{>~Xө_JtqD;|/Worf^\\z|}}_n >oxO=Oz>s}׻~OxcnOvBxMIukkw}55?%Ozlq[\?~uIJsjrқrctdLZť={ ^r#K.|9u58h4iPbaX0{o=;-"DP&qJP (0MAP0XʁƨAGJ2 " R[WKP>)LJKIBN @DmC8qb+v' H@XŰUγA(-}9g#ZҋA 8- ViB Tp/EĠ.V,I+"jF1t;:pmVVV$bfV*/"cGe~4w,p@ .Zf^?=GO29tr'g60c+#0wG3WjIי{ !܀¤:E@AUVHQ9zHN;e67w6ژ: J+k-"ŪIv\.tWVVvij=(D$AN=vnn.j'Q԰_^ X3YёsD""QP[@4 3y?XZޥyb+Iv쮽+o_`fiFM B …\<Ѡ!ݸލSR<$F,6KMR_Cw-袮(2?ioBm*W;M>,qP~ߴ 4Z/l/3pR W5m26}{cZnJ_&m7ZU~:nn6"\\^T&ݽ^ie$k_xGC}v݊X+]@+>Oܭ++vID:Ig|?>}W!D{w }sk.:EY>c̫t'ڷtq_kyUhO| z]nf18sc S l^bpa^_ .Ǣ@ *B!DB9JlP̌y"2-@`l7"DXV15qoYBR <bTD>|8Mӳ:)QifR $H((L "!Jcr $,P VQ[RUEAHbɚq*Fc={KNo|i)9M{M{S)}WJ6[^/\]~cknu+^淼vO޳=??׈cu%7~c7-7_uroR5(ṑg?w x_Ϸo(f{^>?ޛ^Efzc@?i?!Ik67}^pZُ~mxIt~KC@b \I'PF-hiJCexATM j8fv./L <:=7[\8wFP*g@PU&C/;݃pSJPN]>bmZI(E8"2wE0\V\:2qGmSQk/+`V^g+h`-@EFIsI;z!D2*I|׬G`fM{R۷oO١ܱwjȘY$YПiVmD˼)eAcpWިLB^uS22Vrދ@d˫d奵߱7^PQjs 7Me(hz& Su=ye$\yضn>̻v^&! hMYeWW׺n?Kgff̰YMT鈴Fn ͹ *8B 6~/_YjKy9>+wzwmgf։Nî5]ICXSaOXX@3I^L&S!N>s,T?N U]i?z/~wΪl錭N:i4OB't˗r{ݞsp3?)7?hǎ;wm4"7ɿ}?w7Ӟ lZ iF{{g?9s3 O[^lZɖg}6\z{{ӱ} II F 9$M{ͷ|ꫯPZ)0&Nzo8/|F|w}jҒK EŞ+σըRJ2;B""^")@HJ2&+L"kH9[{ )kz(RR1 z5c/.B!,k9qaPa1Vp(e+Ӹپ;{D+ηNԈYy|k끔ha#PM QA *RBZ=DЈյN=LTi:ŻRv8VaW  ?CI)u`29UTАV YGF,wz{GcǗ$vf-(VeR MF;º֮~PjCS(dҮe0uKҴ q6˲L)eknZ,KE}(DOT#BDj6Zh)^8N Qֺ_YYm9) )M X xv>˒E˗jkQ.m`n;D혔"[9@DJ2V@G,;`ؚi4l"0LYFJ,Z(̈b-4!(*Njzcǽ.[@2*S }) q므凜 JC\zm"<JJwI^dCTƔ`O.a.X{c:&&tƴQKpvI=p {TN_ {+=9Ç9qbDQI8dlq=QZWa=w`׾~iaVD罃x΅olyl٘kO⋐|O~};,z#NIFuM)# P| ψ- 0"((!R PcJ6Dc"{.myArH| IDAT1j "z iΉHH\uEimPPXDaoݯ!"\A8b$ [;n'IQ"DBA"P!I"֍hIK IE@A8pcY`jqn$U@λ>~b3箰ғˎyFB5t z/DEg*uhg}#jC Hl"x@rg 7ZԚi8Ĝ|΢D)%>٘pq|u0F6 8'PaudMR3ơeX=76!R$"1-D:(A@PN|Z 4@&{D 0KɦJr ' )$"&" 4(H 8ub{ysgcڳBqYV Dq!U:q=?+[ObjX]u`[V8?J^?!oqF50147)AX1I|0TmC؟uPWV2 I)1/ 4 v˜ިHB%襭b1"BUJ0{}ޏ[q`R7qm1j>y{*xԫ=]=1Կ=[^^[kI7<|iZr/Ws׿uO_77+_oZ/i7vnZV Y EQ6=We?v77O\;OG~k_~ʓ?[ ˲2l4 t~6Z+<4{Zg?>ٟjO9g2lqP~" R:X2V(e,,h2FicU?nfֹYle&֦Dn4a((MEQZ+ .w #"22 eP{b1 "!0 2Juzz>%"H\<wttS qcy*}Vފ,^P!iy p^R()~8xoCD,/;Z#hQbЙހAg ntx @I)e=[ZZZq9z T1XZb ٚj7w FZIrƲTX*g^< Rd۶ݮm g*лQ*s9 EV=00Z~K*#_΅6@ Hۻkj/I]7u&LA02 䎓2^$BF"E^&(\ց@%DF'nffWf[FH  y (A@PX#Js"dj fcF 8D*-*WEi \6\x W[eSǂ bۇI[WQCȫNbPčKn٭Vl̴f3DZ X3 !QXo68X$uW\|c<׮wcv>zԅ5hZA|15EX^x#5Ln؀q(Z6'R$$ǀSwKәEd̤C4WesF9,r P YBP+@B$,2*  cPdzb!VP1M l5U׈LDY'q=`PX!xa/H[.>]ch,0Y0*5_\FY96W&MMk~t򅩫Tĩ54 d>=uAY殮6fjAYOvFe5c7)_m}e8vIO},ˢ(^]]J$I+)O}#[?_xK{Ͼ^/۱}a|ˆVxa|/a}w/vC."YVs7/VZ&6h05W/^{uwG}ףv5??l4g$2!* 3#Z) :βb^?]^^]^vVik^[+;gNkD,i&nFhM bcQ{^{07?77׈# B.)E08Ő̶ i$&}E$ Affo~A  E<UG b hMs,e[/sфD ĊcHE*u0/o D9k|.sIG{fH`9w(~A$3E"\A,,Tmؔ{m\Ңr!5hms؉4YĹwY摑 ѬMo5]$S̱0MNK "ŕG4,wJaԈ{ {[b7G ti1GG/mn1DaEx&!EY[Y@f z„A(f50$֣B_Ҋ3  )"aBD& "ԠPDTDLuPJ A@Y 24(nO|nMط6Y]A:t(DBfP׃Z Ȟ6m4l%7ٸj '!&٠ GuoДrx˷'62Pb6n W54N>w^L\ 0"1I骆 ǟcG^++9"|S7ǎAM_-iWUvm__~];/s9{fޡ'1_ӈ7/xw />q_|٫5{boP|L,d(|@9us_kN eO4cBaBT",(jei}Xk󸯺a 3  c^6 H&d$2 ā(6qIKHb( C0]4ɯ։oig+vC3ߕrGj&sZ"'ۃߵDQ-'{'~_o?+wvv_z˲{NUG?á8:Merwvԯ?|)mnnlool lP=/]jF?o}lȝ;A~/g/3g~?o[[_/o^|̟?66)J৴^ɍwlGELZf(jdcf ղԢ0++=M&A MX(b "8"i(pUq{}+W ;w7 QɊ]UAۛi2[I"aMڼ9b+\vd 76QC"LJal-ūswTRa#rGUBjl;)5/( K81h& pT1Vŕ/>s/87xwh5Y;sޙ5 l72m4U{fDDG8˭.s (&-.8Ŵ˯(Uc>8|@ Ȧ |$L@D*8+R]R5{_#:g~UM9,ŢnT[Íi1( @,9׊۵YR>Uu&1)Ah:ux:6hEQ* xaU$WžEJXׂ$dCB un&Fe3{όgDI&1#29;~b2a22 @U͂ 33Uh1{r(! T@TUb2;W W4H2 kYu ip:6]P".C,9uW6v| EJ 4?@pDXهU:Ap jX$#9CĽ'jx8tɧF_я{7oS{?i?eYWG~ݏw|C_1潓g#bgp9@ nl=`{kXU> O~ݏW?/$2(˳,{ ?On5[ʍj$n,"y/-d2TIqwރòA 4F bV*@-J1 4*$-B@~),*D|pO 14ˀ es1n%)'(H` MP"!D=sͮ1sk}@% Z|nw=dccJl[9k}[w??=Lzs>=3ܺ%_x a{g{0eӢOwY~)Ld%N2-KĨ("EQUQ<<<:8ܽ`h4 !ԮTIQB EkQ EkcĐ!N@:Ƙt1xS fDTS4YZ+}ڮխUq(@jA5Q4o 8u3vQhݽLg͜첩y(a~FԦzaP IDATE)BsS-q~'J$8ӯO'x[Im̖mey/B =~;ՔnWpwC~]buc>99 1L G?٧~ S޼qHdb~G|هM̲,K ;>M Ŵ4< )~/']nN]h\ۻ7EQED$ʍ y'E"%AcɦauXj gYffUUH5 Aeo`ww˗.]1J% zF5tS{k^aӛ_ZVD4 UED"@(L9c&R3;WͲ̬ lVU@]73A@BTF{l. DʢMX`lL& "PjX*UHn;عmpY YEQ\zD$wUufچjzpQ]6Ppfޭ "`>*6!\mY>:#,25@kfA*f /]ο)="{5۝:D7 Psn,M¤dEF"~D? fMX-f1SE9 HIUҥX[a1SBHJ% 2O -$|Mdɴ "!ˀ9/]۽kUqIX\N2?OTCla {K;0[Ad'u NNxrM{v˫K_ BD }[a`<vvv;s8z Tݠ?xLs< ,\JzSK yIMe9"JP;(Lxoͻw??8+ D.sc H%D+oPCM1]n 2Nd+ffc {/DѤ?`g{kF0R5{`0*T{z"&/GHʞ6U+&Z* m 7ZHF#Bu3nDS1ED%TQ@#FCpJcô**H)NVǀͣ^ޥ@#0L83 U Sr^![,2\LǛiT@xɤAUPU wճ. sp@q/JZoUB-.JMlO!{eHE(N/t}e5|v ^5 c.hGF ނԷJ E33UQ̜6ReI "DDtZE yolx.QTԀ6FE j(FHpseyN ]7Ud۱m,"ԁ318<v]oO:뫸s;_vZNF'y(m+9yYҭ(<'ݪVDuIʺ'6{\mF+`Ӡvh6:z>F'}N;  Yq #",BI<YZ ӟKv8$vIqoyx:-R2r\cf)y )t4 -_Fݖ58{C n<O{{,n.^{ngU]RZVY}zlR34P46`RFdDŽΥO&1*QCC L 1THDLn$Dg}}/ڱCUh)PV)KK'(3 6 !gz2bJd\x$%3"P3s髹(66lކ=A#ͬc*UEQ% "YLg}2RkzeSE讦C21V΍!xlm ?~ΰ1CH.]h1w= y.m;EQٛ0Z'U-vL* jۊ=-kO)k)~Ҳd+^yX hf!}7;M,:.4HɀSVc쪘Εh|͋@21 `K.J RI":2|+_r֠gȎ01ۈe bR-5#&X)*P 4"k R:G2OsfT(r'hDD2f&ghP(UT2N( 2b#VyL$J$ׯV@P#"DuƊ54g>ɓ:zfI(i(p|< bH^%Šj@ I"pW3C&ՙ])јNLm Pk8ф_5i\0JL j` dcch#WNy꾙E@j  E6qE]`vh0wZ"eDQ]@` e6ԂꘙIB Y4HUU!qqP3e8Eȹ͡ CPPrP8ESM(񆙩< ܹ!蜫*U3 E)O%b@ (Q(UD!YΛa0dD}!seY\m`yբ26LnwB$"GcL&!D:QlflծG&jyq' T kUXfhf<%{g0Rkx}B~R]N(j7FU˲r(Xm?,YtfN!cNbZGHBEtH̵op)d`R/?,8o^~ )QL Ű~Pfy._ٹ|'!VˣN;[£F sZ,ܾU)!= vgqj[Yqq½.xs-: zSj˟5wEDșTRfz ˴ήD6i'gWU9bՁy`<޾wh4LJ!9g&(1gPMD9-amZ'wO*M}J̪"R;f} e jby@{ܹ}/=TsɵN;Kfgj摐S3@0{%NȌʓOs,z^QI;(輅bQ5 LF0M-jKۈ]\mt&H YBU PN^27ɤ d IԄЫg_LK}7 !2G^Ml:CU!"U .]8::9\u4ڱyNܕ!ALi9MºL2ooP%qtQjp{᱙ ̋mnէYcrvUUͪ278cec%L.*rU0mD;wnpf޹XѴ@"RtΈzÍW̳fa jhjI2N'4(˽}6:B(~XE38.FSRfo#]S¹啯|ίHT$+ oMːf   <].o\W]f=[X.K:dzF~_yZ>)~ɷNx7Wf&GQJZ*S$0>(FhudR2-MZB@`h,R R(h&h 2$@Y! 8P5aհ(fFTKX p{2~V?@˔7nC1Ci\?|45FSLqRtN;=knٛ7^߻ "Lig4y 4/o{`&jM\f`ea)y}h=JԿ0N54!$0 E a5O1F}ڥͨ7H(yC" ҤS3e9嬷u:[,D0S=B󜙣D"ܹr޷ ýu}[V~mg]qZZy<c^.i.#>[۲bQEzlgdW89Xr,~}%is;5(]O§yKO{NÞuMqZც24V" Zm44C$L9k6=2Z8c0&F."%^,EDhFȬ&IG!贜L&mc3Sêb̑#ܒ[`k#Թ+HK7h +Q;v;vSj"!DFU3KbDLVhD"@$FlĄ*mTcJ"QjоX6XR&J>ul$Ai]/p:_7_U.WU.* њƭ֫j m0X,KBHc+d2 so߼1)Ӄ8CD3p0)"D;ha"ˆ̈0X-w jY(Jg:fud]lgHiuBQ0;OSRj[ovDT"׷733^|ZI:>hA *Lp杻xgyڕ+/Wm .J% 9b@!jϹHon\yR bHNdtSœ(Z|@2^CləKZn3Gpl;ʯ F>Go,|ߞSzSHsHmBbbJ J5|H+I (%9MnV"uw/u@g"0.rbS*RE ޸qgp|^rpgFh ;G(s!ꦒԸi&g!_0_uWW-hf1F5$#y^G㑈 PFuh\J$xjF5j JB ͂IUB^ڜCs`~j;mല,EU`*ɛWu@$Y勈HD$r98ؿwc-bU A5Y'Jh_"$xc3C `2Dmt2_Tv2)fM@,TeEsbDȔG7~ӟ+Ecp9޸engpΖE܋q:{wm_}.n<>K%yzȎL#`9dE (w NMHu].[:,BO[(߉RI=Gsw倈D|>}Η<9>sOw3tԙV/{k&sy}3p/4: #Q,=NaRD,|Eڴg}gph44p>R17pj=m)u$$1a*i?'E<&F5`֩1#hrxxx[ng>s…^UYp`(E5J fLfwK!J4{kϳ*4X"H>3'Ʉ u `l7CPsL@ $EL,FM =ؠeL9tּ= %}!VB%"TK~*X5IbFPG^kn4i1{>Iy2Cp~]I19V~*B03pT_r%%t1f/DQ~T:3jTՀR:`]-@4"N.J8)ʴ*"c7޸1ȓs*y޿?qUUOĐMɛ=˃|?]ÑC0⛇^{?{n~T -Dt@Z-J/qT  grW,2S,jqI6Ar%yPԵܰ.o'U-}~:)tM۫Svvc4^'<\C=)~D"̒M"Yׯ_?QhGUY3UX+j Z(H\`O%ì変Ct- ## HJbbgj)2 ܹ^{}_x9BBXM-jb%[IC51IW 4ܞ)A4䳋SLU9gыU&d6sm]K IDAT c5`TkRe&WFIkFl1k*t`|[up_}N=PW1 C5\ K )铔 r%Ƭ mofDzFA,>wxRTqzyeէ_y&vމ28ff&$#~uU6HL]GYkFN3 d2]5< = CVL WI0bY{,3%w g sw?-q͌rh2>sE5eƶC7)Gph#30 CU`UY@ 0(: P^usNG%g ps~ndY)ڨ)H!^n[vM,׬u4_+iy,l\KKY' 3X|njOhɲfʉ1"uDoVou4p᧮H djCޣoh̋. GGG >z /*AYNOF"!`> ={g&!VhR,BC=Y4<-ޞbɠd0$GfN+ϵuTDtaOF><84Oy@̴ruݽ'?.ZfD>yz|XSvCɂIo?{vwϵSvEF}RO|;K{??#={}ss1<cǿ^{fvk׮ݽ{ '| ߳e`ۏi mN~VԾvd5a/K]y8n q(*a&Q*"yFa<#mtw$sapҵ)91(&g*Dlb 我^E&0{o?8x_~iF"Α3RUQ#BfNN@=ŷ 1k*8CQ(D@33SiU1c 0t:0 *""#A*@dL>d4gb4M9=JL@`0h@Vk-iTY3:S$uuHW4s.d6~bDybJwB@90l٠v-p5h'v61VZ UJLD8)1v4R,=$$@ OTi)MU"B'_hyۀ6Ѭi;T4-@X!g' lFO-r5*<`1G|w\q2FZj ? zuP@[nW`/ܳ׽)m-7n;Ͽ7o:~wccxoܸ˿{ ѯk67kOǣ7_ +k/sO޸qgEBdf{W_{u:?Oi5aWHp FF>5mLp|oj vp4f',a;;5y/Vui>r|ĮQYMcV> (&*DϾ~kW^zҥ] e,be,GPVŴbVU5  5Q*QL |N5(9罷+:L?<<,B="L&ef&-kbW%M"LJODIq|tpa7gڦ 6hN^wGd}G&"mNbe~jn:(5#1P2% A tb 3)tӨPAB_\ ;ǘ#" iz*t:}3L(Do4J9>z}/DАPLf)$lw\MS%uf}lM=ѵg5$Q""NڃnoL%їZꄵT5J|W=ݝa6L'^acc V@Dt{znk&ýï#G@HLDM,E@*7l$?@::>a+Hˎzd[o*E0n55_Gֱ\X͎1Y`|kkGȺS.o[/ujG~ru.xL |Bo[1q{qDDǿ>>NOtLJs;M9w|?`kk3'2fO}؋? /L"%8[Ϳ/#_|W/[;yLo_?7pE߿|bOudf'?[y7_x?t5if=ZFDDhD0M/^<.ʣ;o߾?i2Djf"6zŤ3Q}7k͈ҢG"AP @BP@<QZ@JЈdUoqXgZ sidb߱"BB7O&QFlnY;ww~.A"F睵s[rI{10 \@>E2;4l唍 }( x֟AT0;N{Yl *ÞA!x\ J)/&ϲ,00G]\\\; jTl/8on+l'8˘Ҵ VxY6oj>@C 5"1R&̘gY1oQȷSzyhq+/5XP(':Q@>ы[N2ػ"[^{:4x0e*Ϊ۶{mZ\̰,ϒDkqǑ}Z( F}m?sZm>o~n!?ן}ڪ1]wWIz}/nZdy˞s^xW] =a?w) :z31Tܳw~x+Oyߵڱ}[GȻڗ^?};vl\{#w2'Л@iYD]Q hִ4D-gi[P\2DOR yt\ĉX Z6M 8vε[ݵ>sֳvl_nMqIj s,V!AN;9;P)t(T'Ho:β *Jnآ0ZC_͓N,@*'&&mZ8;;0K`>~̸Rq9F,\ 㯌jF"?"rA*@CPBIKcO^ GGx(^+Uz 9'i ,2dK.fMCZr P)r.SJuBV@ #g(&3!8a.^ @DsD)E>rxiZf+$XVtѹ;>tlk[œr96^rV @#syR4 eYPY]T蟪R+>z-uZ]-ח!RYJ<K;Js% rӫb|w\yh XUXANzߩWBAח3NJe~R}~hl{Nl1F>wvrr" 0D}׾׿׮_}zmȇb'? _yUWn޴qڙ[77}#/^zέi?+?O_On5낈yZ7[n{Hi4A<޻?/yK>OW=v4a`ַm_;wl?cF]{iI*5uWKRT;S aԢP# ^G@aAٟ y<ʎbP!h M0 0Pk-i8;){~s7ot֍eEɵ&Ul7*"GN P"(^7lo UH#N B  ܦŅ# >.3 XPdȰ{}h2ƲCA\kEj%" hsG(D( L 7_auٴ#T HĂ(@E.@@0d>v"QT86O2vv79z\=FD۷m[nmtSE.ɕF|hevαRPJ Dk&CGgܦkšɒ*{ ,3Fs!E2>*bG?#-de%XbR,ZkkoV˻Tk+|۠x =d'@EAzQ%N*qJrE.(6C83a㺓niu(ҁ EJXPH$ŧ2vh\>rlh!1NOO $DE J,BI1,0V6:Kge>$d3uPihwU]6LJ0咽;VQu:C&in7pڶ$gkC׶Cf r.#s$Fc>2be4+˷ y(*$zqP"8 xJpWr}y+CRSՇ`T]hKa Ձ`DKCjj{RMܬzZѫaEvUN?zzz+uk{|r:=w`?>>}3<FZ$t\|gϡ]?>3s3͉tv?}Sy>ܴqR'\ .. IDATBctz6j5 pſ|}6n8U1Dc̿~/~2#%Qz} ۑU_w%JsGBT:@0O;wlkoWܡ9JЁ%V uUQRL/GCGsYUFCk͡ ˬs[k{255Q( $͔"&(DDd0>!ʊ%E,ZJro߽箽 m+L_ Cg)c |lǢzQ\/4`eie:BSL3ܶyz*?zp7&-K\sJau21"LZv!Hl1 mbv84S\o6AI3cEdH%nՋ} kNFTտGWƈ."$"ImŸb_pι0 ֚foM[6N:<7[Ӑ,)j*ɒqNjj6q9D5" #[yn;i*MD^7K#KKZw`!ERxb wtaBplxRPj$^A<k`FVUY9,?,uf`l˼LڶL~Xx0'ejQǪVV_N#3K|E< r3? )"K M^e~J`{/?[T3jC<;$qw}-[`-?_[>ku>|䗟xK_҃j6_+};>k?W\}7|5kG>a"{=g Wr]g=苍2}K#+2AO3jŖ9 5ݜ~߱ݙvcC2!323CĒl/%PrϞD-{]c~zϕ=ENR.w N+"$w?8hNM&''[fV-0 I!$sb:0F 0阙U`٪-v8ҁ6:LSZ룇;w;n.#01zutau"S?ФlC%Dr9>GaĠSxgZӻ+wݭ[yDGlR*$Zhw@_12H uցh![fY0Nؾ9:{tvL@y6ъDji;,iLN29$#aҞd,Tu`ۉ'1yfM*)}WL^Yl^R5FA`VU^zJctuAzmĈțE"9afY^1J3;.urv.[:p!$Y(IqH;VH6\GQ9"".,.6Mkww)c`ZZk `iC=$ᷟ{ww{W^_D:#s/~Q銧<~WwyW=]g~2z`k| ^|uo+syQk+{,UϚ*2xd,ԯ{WWqD791nmb,M@e9c-|XwcqizWe}V0jV׭բF֬7ZVV3& ;'ZU+yÇw5О_\,6ʄm zLH(B,K4tq,쬵alQ&u $"b'D#C=>[)IӤ<=2K21j^;tx}]×eι$IY)h4֬Y{ fi'R 4}go7q8fv[vȢE |]+4܇_[wYzƦQ\[31٨Gwu;ߺWqՀ[o^x]p^?lfz??EQj(~_u7vzz^Oyqj1[^s_ٹ۷8V+{,UyZG%+ e`s$  539lsA> a&i>՚zyꙺͫ] *΅a5*0K7ɼS!*T9E-i2FEAPEV^FONNQYf9 JI<ކ"n/9r$1QhtJ 21sc wffjzbJR뜛kUJGg<;z聽{=\Ͷg^p9;o01+g#&[-CD ER+?A'^ZѻuB&}), 9u'pqycmhS̲uOfTLU,:p Z)`v.Iim %k'vn\sDK:>ROӀV=vb8L'ZY%bI'$6^bR@n'=݅\*cK2Eu5(M"8GH{DoߎX$ Ze x.Eeߚ*wM,w:΁R{)Qox_r**P2#4̩|3ذq]SiB1%߲YBD(Ίft@cN7u XFEίtL^]94jWZ!:|%/Qz4,U;ȝ/) "VީʌVxOL|$iyjRաēWV[Nǽ-VB\D'??9bcdY>b_'~{N7=MWD~ z}~}Кc~;_'iWMZ*"W9~_驵kg.<ٷo#uk=VDlM?Wڵk1%MF<6m޴>( N{, &܀7_'SuJ%j l5:n7M J#19a N2s +f B"BsdvP -"$ bRAШIZqZ[+R "r\Q@Ҩ&Dlme! "uٳjfVι@Fcǎ:PTcㆵgn]n/hCFR4 HPh d'2R2, Fa/2)AN7^b>lsjy2vdm+~( "~7@ǭV39;G}WO'صc J>|g>A'uns9?Oeguݺ{|?fƇ=Z-h5[cn~ϵ| %0"A}۶8,}klNNN"¿|}"E亯~/|@W97;{YmhtY/нʥXk(EDH\-ZeIb V ӊ@iI%ZxuT?rg(l5)'n6ZuRV(ba&bȅf) MҼf͑2vX"1 {r$ HF~>.+_Geu^EѾ$R]s(JqDOFX_cnH*}</pkџB8kT8ti{D,S|NhNV]ӇD+|R2<:}kcqZ8zQD-|C~ꃷggo8ru3s虩nڙ[8ͻF2Ϫ:|H-ςT)ekKp4b%`+{J3P[R!؜"40[A 0@JQu ,ODDP1zE 4ıssD kIJE$u"bAMV c4& 5"`HkM;k3Yf ƚ䕃&}`BȈY" N- 8ܧe$Iqu;s"ah,,˨aEFfI2}"(NBΡ54ܸ jYMڐz-PvYJRL.;H1gsugٹ"8&CcB YPDXXcSP-)dt*@v,}¸+RŮ%S<,\b qj4"[x {AqA"28hC} 㸾8tZFvnƍ33iuB}84ޟv,:rd7uco" 9)@aFaxjq{JG(o*C?ी(Ë#K^GF@mÏ /TF_OC1!A2;'`sKT{5Kg:J C;…v2FD`G@!,i.։ 8ܹ 3hr $l1OmgN1(NH1s;5k32(-*A=H_ ؾ,b )_D=Xz5oKe,˘YZ ܸ ;X"BDC9'"333*yn^yrL BpSXSH9P@;gQH^0 w,QXP$ Q }'*E =_IF16 D:_77+#?fKjBC,2" :|,E+;;)ǝ$_j9-SoWEeQم'<驟ԧ>Oy{3h&'ar "i xa (A:%cnգFL]t vnߊd9OY+)$q,RXbHo zM$ExU㞘/H11Z93 &SSQ;w9kQ7 xcSa Ȍ3Q6r%dg8̏95, "zav^6'`M&NqrɘX,K&* ց͑c+y$Yqghc130f UQLAL:1[V`_,K-p<דhÈ8GwrFfs'"`%E^H yfa 00"BPZ)h¨%Ϫ ,e|?};,<p֨w;Z4V𱹹6ٻ/j5[rtLJ>/}K^>졗nXj)"яYg˗=&ɖO%=߽o9󌭫S{B3K֯_6y߻Z]-w|6ukg82Ƭ{=H2w#Dv No\!瑊(( H$ 4hGĹ36(9n[њY+5͙qYQAJ)%"Z` OPZ2̥E` sXLjLRҮ;!2VkM=E 9a"Uk&P̜1*n73ye#F)@νӿXN\,O- :I!%sG@llXc`.`avtFIĮ[o;(&NGBVBC&Omr…`'QU&,oQ)ճ>ܜʉա#oޗz:)8<-;,@)+ˊ`i# 'WTFDW ЋKz+Db;'wO8!`|2xce9x(KnXx:yB'>;}¯>Ekg?Co1&f+/|˿ۿ'K+OzKO5k9zC.}Ж͛ff 80nЇz]L]{;nbjN k /z;\*^'}ӛBMq-0ٗO{=Wn@@nuU)UO pfXCgqB2JY9"`%k:"Ԡ</ꕪ~PQE4s h5p~DKzlV%7V)c˭4^j* Q¸~Z||# ^ti*>^US^?+Igi]|PP'D>|oaZ1~|oF}z)K_gggg(գ֭f 4VSj(Bf$c0 =Rs֪T}XZܗ;D(u\hdU1("ܽJ>Tn6MQSyۜEB8Y EDz-G>p/Qf0lNLLa4M;F :a aT3"ޫHp GB%Ƚ҈HƄY`5}F79k`㐈+ QU~do*3O}>Za[m೽zڛtTpWg͏''i DE.@Ѻ 3g<{oU asMo 0#A!8J;T5%v! @ar@rYAOItH0BIK~sZ{}{{/ >7w>{\{k Hk@U@H" ֳG0k}~zn=N@@ߞPT!1ekG䦡5@#?nsӏG!H=#"#;f6# 6$RU u !RPѤd`-4{n6Dh\h%>AQUJ+fL&uHQϜJAF"$;͑N B*11(jlPIIImD6y]yd@? ӏyիr䫦i}~2hX7U XUUM]Ϙ\51 ay k0MGZ_VX&=,]'~eY{@|C\ځ"C,6 aV\Ԟ.u(X+<(r\ZrJZ;pʽ DDo7zm.nnn:?k7zϟ'vv\+KӮ{t:޺蔈FS_%!d2q96MpI!L=u@_Ktj&1Dx ٌ:ɒ DQVw{T©))@EBU NFmBu]@ܷ` ٖU1P\ (Ju.ٺl1fKl_x20s]906o!bU:Y}P#cA D4>0;,*4Yy2O"JQ]V4%z9<: AШꅠԪ(Ykap4Q[ =qh.RJfqo~7 !8666LA`wwks{{{RUj2 "3sHJR qs! 9 Ә8DLj vN<LKs ;C !s#"\tX#1-qGb@ͦPXpaEI9t:᛼Fu*p}{!$ D6FiFD3r!`dǼ>q]#{:TAtOolY3 U/HaLE6(&AbđJ""Pf[Pf:O<Bj@#!aFD#&X&grN5);+~恹AZ'; +v~Y3|KD\LF3XU-LkY &8)ޞ2A $G{y GuKVw tlVY׻jqgV?2t?`%(hR_Y'BH9@.9$ K D"2qrxQv6*&pgΟB(sVDTI&Cص. V~ٽ.옴W l6ti=u@L3,TP9Í=b}om@‘w޻l_0iH%sty\+\eLNE5E(u^hP42OǚTӟ*Rݣ1y8E Rͭ| "HMJP <5(` T%44)Ԡ".41mB"@DN$H-B LuS75+t:^J`sxa{3SB؎-pS)a# J 6`ξ 1)e::{n@SهAbڠb |S3KuӨmBf"Rs 6RzQ8;ojDSU6DU:ԍ hs +B , (̈-ٶO:)nt e+؁+[gܗ>Vg[Yei-+}LM'k}e9$zn_g1D+ViM$JVt{_#l9r>gġo#~B/i[t/ |KMpetqg@P+)z[DxNUUD\B0=iL*%{mq2}ﰲn|}OsUUh䷶lf>F5+0ƞ$k.|4|Be$FPU&dFqTѱ[[g4ϦD4¼ӯ* h#PĬ"dZksbBRR(*e[;\vR H6UE.2ǥҳenLE " "~WXAD'GfL+"%U|< z< Գ̳:3ݯQ'T!]g ;@2;/gzVWǁ&\-"CVU9rLBKN[$XάA{qHZ4McNlMHQ"/ rw= 37vWԢi0ιxlNA t:0v?"("X$4!iFaUiКJ] ׂ>mǘwFc2W\:~ֹt5Nϱmm]J@lZN[d5<,ˎu!q]/wuA`ܐx /:a4S;ԙtk8,M+ڋҖdEEx9B-[o~őNu2}U5Ҙegh ;W_sU 2N #a#*34"B*fh L R@!_6CDhg3 PUEr]er|鰓V`IFDbD UtEF&0XR@lTPI@F J`iodo3!l6 IDATTdiw6f~˨8agQvUI[glj^Y1Y4o}-qj>*97D'".L&#F6F~1Ǐx#Ξ={lsgBvltCBDd@88\%J,ߵaV+7_()ޢ} >GnCNk (.-ySG]n h;7¨qWzzLVn.k:|X[}6I|:컗nLi])4 Zdl[nL<ӕ@Ҧ:4̎mUE"ri]siLU/knI6{R.[MA]?cayiUiL^3ޠtj0 @ 6(s< '̬М96.IQGl,yuf(Xjdӧb֙:"B;zڒu{TE߶P=TKr Id5Zz0  *R@ MkHYHiO[M4"(JW AHEѐ"B܊ d&@"6o RBTTUB 9΋Wc|p]5$*[[[ћniQo|g9lnn2yf{k9Ǖ7fh47M4 DN 2"0" rtšgm tQ`ߟ%wo10r||{K3?w~6`|H>홟s@|Y%NNU1lKYNƎ8(ELH0ŨEZk ׷3vj"0:fS uDI7܆B !h,b "(RmgW{X@H  *43"  H1@DDs"HuVzx*"jΟsggΜMj1=(ft7뚈su *u=͛&ySQZZ-`0-Cb--n!4MP1H0#3`]H~boKBu}<^Ao~D|.!]X*Ō.ڦtF~cl%-<4(P(>us;>sTUHD鵹cc$_qM=CƩ 6~snPcn!^5}b#v#+h4BکNF'ʍQ#(gGH-EUUY=9:"d!Iy$W - v-s[ʛYFhs[Io=s# `ȑ)Zl& Eeʧw!A hv,cJk8A'v 2"1*FshSMB 26@;>#v}`D"Rl6߯kQ91zj"`>{7J NhTnYĜC: [[ |z@P*(mN&ij !9sxX @_o:`olu { J\ > GŶ/3^VN vZO=> o2iRVGAR-JoHy'US!VYE `L=5\1)Қ\Z:pLC'kYK(W3m*JiuELؒRrs TiP!`5|crgtwM %$UT]Vl Rٜ /@2"dy7JYda?$R nl.",j{s1XŁ2Qʙ.DuL{F3M؈0H#.$XaU"TmƳsVn)@BCuy`~4ƌQ#*69DD%o ey%!M ҨA`J0$@&RAh]X+[UhP@LrOmyzsۓS|$A;,f: 4t潯iƓjcsΝG뺞7s y="@U% 5y&4;L J DD!i`2wYDl6&cDl  HPB~iQ?ۯ^*n4`SJŁԃRWX$ӼAevx1zA`֯pYP}\ 1~S:@vjeQRԇ\ҠHM{Z|_:{)uV+|esQ?4gdɼPpax>1 jOgrۅ,:&4 "@qB5>$ ~ (JJ@DJ @bҹXh1I:  Ƭb[D j2Ewe3x}S4͏J!MLĢMr(7wyUU\s?:{΍7O1S "HDUUs|]wA\f`d=eKCI#5"23W\UUŎi&C!Ԩ XH=Uomm>yd2lH/a]qM"sX:9igbKWkґ_Ёݲb.#@{}5hu˾ȗ2ss'o21UTcpP7 6]@ek2q6,%U AATkYڞHT {ij 4X/߈DT5H^v(B>-dAʞQUc֝hX4QNy<h\CSon+癐,0*xb52ѽa`׊IWBzXdbC]`*M$iRvo#2G_hsXhAz!FV "PD6 4 r"Jvd6@F "QWUTPTc0ht*,sxQ8'sDB Ccﯺjtr{|OwMSASq#"3!2#Of7)[ۺ:U%$Qmȼ4~fo1m0":F&Fr8Wq5"?r x)1Ԧ;DPg@Xl_ibAQ9$A!m'UvNrJuKە|b)v}:U]ֈ~Vk:0op?gQgf^Ыn^r `.R5 M|_T*ە(^_Ӎ77|׏eWOw2~.tETR\@*yWTe:]"0/V g}{2 4DR") "O #\q~}awV^h(4M޻6D"&$1@[& jrgf@E@rk !&U2 }b= %+NҮBCD΁=;͍h\x{oo6'#T3z3ܨO]uEԑlôKsqAWCWCh TgI*qES My5)>BecU !lބ|{at$+7oq H, v?V'my %aZSg!s7A@E"E 7T֔9: 6T HJbHP#AU4PtW[3s`g{*vȍѨFq'1fbBxV^w~`>_N/=_͍!&Uwwwg@mX_\dB/diL6 Xܞ*`00(2)O:LT"R&f&qP@}U7|07u]K6*۴1hRFD̄4 (M$#d+M8'zZnI벁U8 ʀ( ]m LeH5*@`979h<6Ɠ:犝cj9GD9r1h:.$2Q*^ZL}T0 9`8u,vD:\F5^ċ& e "f[*PeC@jfˤe.Qw6 h靚ӓP / !l#V>R>+yPP A[@U0 ~4i$,h62a6%j!K*z l3P m41%A2B6=@##d()k ݩm V ⡄A!Ù0|#yGK1Ƭݥ~  Pl/A~6 Q󈃝IfJAQ|zgmNA15!nBWGC,W;]!]'\XU-{ u}V\K,lDtZkV:ɎRe\q7oL6憐󆛽c;஻gv~˔}x|/{i=~PyC][9!#N޺koȑkT0͗Ř蓪||ǝffcR!0odsrĄ=?X_ QEou߄7D1o7pNrC콈̛z>Ph4o4; 5)FTպn 4B !"*b@%0HR2=R8\׈-sAE.(@dM _LJB:t{>p5 ;Fݍ_${ Zrh뿥 0/\hd8_[YUUUFUg|?#CN \3;w|3Fo}A)ao~_%_t"g^_T~[G*?p;d5!~͗< l HU['7+t&x籝=fNluY@[,:S+ =,uQ%÷߼d2LĚGܹs3>^f_ IDAT7/':jȏ⵿~~]3E=Ο[oE*| ^^Aý;lתۿ?Py}ImɤPދdf{§~gO7{{sOW=^=V7"RnK] Y/hyh nBDw0s䘈C0o6ƳSjE U>)PO, Rdp|%1\I*!뺩y]uݨT\g Et쉝s#3u T50!yf> 0#2h'(Jc!FwKey? i\~^FQ "1`_٬T!wogKMy P^mQ:EWl75ʶ/C-6 6P,JXpQgK{;e}?RYlK+VC7t+v9r/_x/Jkr_^w#ʽͿowU~T;޽fL_-|p{ر#v33yf /zɑϞ}“fmu/:sx:&frk^염}v Z/?~˧<:^bv =~s676,r=eѨ?7W:/O Z%dg/ "GdguM tqW c9Odg;oy6mJ1ʙ۲췌..G8+ MlN䧏}s^O1[g S!ڠ"6I(ء#J:1\/Bui6B| r;m@O[]t+0PbύM+*s/2_f캼# İOIY UՅfjɪ#,SvHYlkJO*E/iO .H !@3)Ơ# )*0<[ |@s%8 E,z,&rZTQrecӡGm M[qt [Ov)-* {ҡCp`e9/4S}pĸ1}q{'H^-kR@(<֚t2=c t\L$Y'XwSEGgr+B/|i^pl^i`9i]YrW[~ bҚAF^U7DݏJ͚ι{~᳞v.loo4oї$<:OSuw_EO~Ͻ/>﹪w{gwS+WWy."> ~=q/{Ƹ 9vLƣk^%_Ex?ogdzϖo|͋}6ysaﺮg{_?K~ G<"nlLv9gU+ Κ.O ZKdm=Ig d2c;5oC`n15$P- b Q4UvjB}$""Fv.L[[{m"ֵ "@⪅+YFEתs@UU}azvFR|I=m ϔ?9JEWfHiC$g.84-K6tl&TU*wAU#l[X`-o:M^!<}Yu]7"M*#Bf*X㐃hNVբ9}# dí 3gs@ʛQL@`b1:bq9sKe݆l)yu;/jw? @nZKOqs:/ E, xM+&˲V}rW?ZA}v]ρ >xvL*/9sw>tݽ |ʙ;|~Dɳ];r#+gK|վrMwʍ*o?}IlT:D8o=>7$yIi10A>k~PXAn_gɟ;,^O}?gBD\ˎ`k.{Vy.,uЅ"uv؝; nhbPH}{CQȫ-4DyQb )P@Ebl/")#*h%B%$lph)~C lIElETKiC`*:V4[ERTT(9l_ diYC2\WM\[=TP$ d]s.W3?^F_l y@nB/]^X㨈t8< e`w|%d !dsDda1YQ]de\Dִ}٘j:ff{#(ᵿx˙y v0p]݄YLoؕW>h͜%4?Ny 7\{_/~oޡ*oԑC`{cNetȗ㜰G~POjI;ަ~`D"|ʷD/";Db DdCw)Or`&Ǝ)]+Y Y5_k(LTTPADYZt&dmݱMYsαgJNsz?򉪪_rK\׿obM h^ @3z˔+tY%.@IQв0$3 NLvܮ~Eq:0+?u^fڿ{X 2zi1p]GyMsLnIpY-,cCճ?':9_b9j{+o$,uE"~ WW>?C?3y7vLͼz^7?,!|nxk%4a?H[[)bgv}~R)+ "kI19Ա/ sl%G5Hf6֩*#^Kn,k1{m' QPIQ@ 3B%D_UD ŢQhvA=)1* $c_ǚ+NĀQm==RDH]a:\YTPDS4!myμ KBXIԍOmFboԆFL_`VZ5rXh Rcw)i[:^IO !R]|jr 3D@:ga#kC$ @/!ƃXS^^}逫u.džP+-ٳ5%¼x˻Ou+}9Wl#v;QT<}O|mQØ@[/|̫^wlkk6;L]>u}:syCW<[Rn4*i&)ڻڹf }ru f*!RSΟ;>Jn\~xUeۯ 3`1}VSjjE"d8H)PVNG0r]^!fje91U٢CWfMZ᝛8g]]#<:l)sr{Jz;;ۿ_;}dR_ ~ooz {@?LlWoycU{o7T޽y+_0U;?#r ]K0E/Y3sx/|smxLQkIO?fxĩG{~ꚫkk<1=яW~gɓW~<0ee,W6V`0 )0 # #sL@/:? oҿ#WLޑ[Ԏ'?{Z9_99Y0;73drY)kGʳgr#{f&GY&wR0,1YgG2+ǺLV;ȱpW|w e U_`:i>cvJ;C{+zCfEcD秂h4r!"aH bwE;Ӝ%@D)(V&m<s(6B2Σl8:DK{@r4Uf߁H*;|WGtXf2 N;W`);v:hIYugLPVkNu]M2`5I@ _ wC}2s\+ݽWUg|ٳwu&??y=q\8yS'N}7S'Ysg~|g~k~7 )#﫵aޭ]wvΞaxԫ_ ={g3[L|/^3֧~ӟrM|K`¹y߿w y^{Gnɟ/~̫oll?ucW?uW8c'N;q:uA'O__=}MZ䐴4F>]6D!D,ް%@FeqKL†!!;mCʨir \x9h,8}Ҽb\Wcהzai@R Q<84in))H6GK98Bl^[Gn[]"&g#$R|s߽UN:UuQ]!y#Z$HjzKb-8 t"QX{3LNkhl [Ő ŋf"ހnX@Y<׎$NYy>H行72Æt&Wx/bdmo~k>)`d)~9-G]|_Y~$_]y 'uve9bhey۝V۝v{5k>{Ǜ_CC=޼oe]nTw[u;NlyGx;C;ÝQo`ծnW+!Hݱp, @$Q./s%IS9,NCDdW+Hs%!UxAA`]@UIj7sʲ3. !{ZjUם{9xf*IPW)[G"D@ b^FVӡ$ @UqDŽ.VgRu ue cȐH\D6 7$ }_tԿ#7QUJ?9|-#sJ]fua~e+TJz|k['S *l3zVQB^~GH-K~wU'p)'`͚/Zn~]v1pk6xiw_`CP3?_~2> :ԏ|<|s_y̏QH-iB/=^$t9{ReǞ$UQ(FS獡5fJ}3hB EԛTK&#gF$yA79/8sЇc0y'j7z#B؇|S_\0?ys5z׻>~ʇoN+w:uhi-pog0cn+_ڃ:N\r:xi/~ӿ}Uw/b:2VyL3|պxZn=F >"z_Y6o޲~'''%MX c\$֒a!@@&ApD(͙UPT`qҠNZK z$j ԩuγ O@BB-H]NOUYn |c 6I\ UHPB-ݐ]"BR#x R"$PW  -s aI`  ERKd F4s08Z T#w!DVe͉i`Ci "CID(~WTXd 枛K˒*\G%,"TɜedPA) a.¢@R3WufFڠ)7H,K(@^~X{,u(]J-n*ldP=ǩ0VT@D(T"H"E@II33n5H(@ !*m6"kDTCyRD @jMhU0GJ 9@j[DIB\KfըooREADjHfK#Kxgm-)S]0WB"/X%p`;jP@Tce0L99 U+21 GDuŷ9"Zo&Y8UZ+USu"bntH#:͞rlڴaZ*zD̴HFrg ?C\=T}YMW0ZuJ]aynW( V5 j UQE/|^|SaWs{v۱~[|peƛnIW6`3ܪnս2#!/XlEtC7%-* L:RHP P$T0›rv?(iF4l ͕R"%F%ctyуܗ`+`?_)lrd`Uř#N-#X!L<2TB8d61&hĹl1j^ ~8# E5N5T OI1:32lo${^??tpE}_x_kE9h&7O|^͓I~rMW#0w}?ϯ{?['ܐqh==55::B&QDDNs RC2G?^+x]+>k&V*$ړV*< `{nBgzJHxܛIBjeЇ3yVQ3ܯ~Zu\> z-lD //;UAcvaX)uy2F, ˰MO1>U4W+BneSOEz5bK9@3γu=^'DD$C5/ÃF[(JDžDC^ѨNL% O[l'<Qr"9:҆ücǰ5}ٷ`VxqE[EΟ,~F*[FGFwy岥K!mWѝ+[{Mz}?79<)z?[ĸiw @ޤ|_ݑ vS+08=y|LQ c9g > YBTpv=&}E8Xvct֘O)!dn(ׄG%B!e6ާJoLVǻHB8aD=&ZJz Qbt2 pRՊ|E+r$ag[I-z9Or@%0j-6,QG\?# z1?Xō'{‡`[|F]{-!EDҗrœZ&[fI^ C6uGڢLwGmMvj_p<[sRx@u#Rw[jGZhhnOLT.]Cf6o׿-F'ޱLHkq!=,x3mcϥ!څ5Z̽D~nWx>$P'[c$S_=n*)W{xX-ʇ5r[D(zZpj+נtZ)@:Im*lX{1*g3)s]瑽#Ї2 D̒l̓$S13샧TلX{M @dD1j GB.{d jl˦6ÓnѼ̪IId0lcuG* YKX=ōJ.xapfNDn`el" 0-Y_BN`/Vg&#!ffrIu)4/)XɄT&PX@1ۼ Tی7(,+m= !FFY=/4Ƣt:CccMo@r{mz<jxBWHb4SU,\CۑBTu]+ g- E"LyALwg4o"^RDfQyFd3x6Z 蒽:H,z_));dVrXXj ==* gՔP 07TI90b9a*b`\fo0&-*ULrKP520^UO88IgPfF|\ |ٞxͫkY6ꋷeжhafXʤ&_d]-s^m w6tEcu̹D`PD+ /ߝ$ 9\SV%qŪ0Eޠ '_l9BrS]N~aozmSFtf2r\ ]|4:1DM0DRzBQdYk:<_PA:`"^mM+otM, QTTaUC06 o2d9J"[4-0B ^BuؠX6x'H1PjEIno+xn>106/k){Mqaܤ]%*/QygŶuZQF]ѬbdrQuCn)QBȘ",zYȋ>wگONPmkŨm{=9=jhw Jul,$m9T3Q@ms2)) fV/hMQfVp9bVƫ#毺:l[mf3Ea  '{)uʢZj )?HK N  B>nEoөaDyr=t5=iw\YeJϳ>Y\yogj=!n>*?Z-,`ۭ~_,BZk~ 0v0-ݦ(D[XavvVBrRID(P-VƸ}xQo!"ק'EͼpETYRWU&, K*3? UmrV۰USձ|t4 kfLQΓqfWX d>F#cA`/[)$x>2OBDUIlʉI!L9=)0^V` Id̩bZWa#}o \ptԋN9,T 99T5]jkipx[*%q~r::dwDGSnT` i=%1_SFucQ)S>y fh:Q `Tж&.#0M1l'$(B+٘T5G%;]i\HH!@@%QׁNpרX%&dɓ~T̐R&N?/ὲU=LKmHDޫ":[=k2sxaUmW_PSaT60¨DH*$BGmZX$9Ԡ3 FãHah톀}ˍFT궥jX1w@"Iضސ}MunŸ>A0Ii”»s^#"'{q=-u)%= %}4aZXy}'{OʃbEGxyUUz.Z)e5GdQ{2U2~. h ZPO"j k ~Yc}z4#?IDul< 5AZiJߊ^n>@Vq7Gd0Qի <5?͞S?+bf6,u!,-ۆx睳 Om= ˱*a#c{4=pw^9ykASaЍayx7Syjx#1!27YړSH7-sPHǬPjgww:Y\cOvR쫿"` €drgz+m ,23)KQg(!ΜB @x;PDgËʢb?.ՠv,Ȥ݀sL Wmi*BI-wx3mlO dT~2i5͙OqٞS# )՛{mBQX q5B\ 葢ށ(WF Y6`û0qMjX_GJ`RnqmD9Wobp`QCRO0TB|1qQax CM~Ы6z&"z ZD]V{RJJ@ }gBǜx Tqڭ QlWx 3] 0نWi }ONbu ^H<UEIK^r>|s턫 iÇ!ڠLoBd+ԹB<6#5 w+9TntޗXqzmTNjPʑ 䯧Z_6dE77qff߱מ{<̗۟ojGP DΥ{,@]`Dt2'¼$@jopLA8>#>ry-$P@"^B> lD U PG@ΊgFC(LvfSH9m;g`e4(]E,7o8+-] (IINa!wJ DA)<9QI@+@"12az6kPݍ* $A/OzF>7~DA,Rp||yX+~|D@tRK86^FGdXd\?f$ʇ?`0a9fD\V[Մ}vfxN!#|5$":_xN|K_155944K%)oyv5pՆ;'wyȂgjͷqѱrnIJU vE&#}%-wƕ>EU BR_֪n1=fy3!J)Q SL%b IDATD% Y ID+ O3FwZoR T"B ,TP͜:M"I(" Ց%| ^:HPEQi8*~KBYͤYo[9D*](NOY""m.TwHEML;D4p\@Ai}e:iwf2P(_EDQ=7 H" +)eY*|`֘' {='#i=%j2瓣5s=[ʲ-Bx"(PBְ@!PB@!Pn-?EQ'˯av.M_*tK,^ygzܒw^}W֮n]v{j'1ʭ,j-&|dЋP k]a7^:Gx { 5@VQn܈%&^^ԉ@L݇Rl΄p'{܁CzOD&!W΍!\О[gKy%,־ X@~>`,h6jg| y>AViXK| .F `9*òV-khh# U~dOO7e'ua[\3 &] M7/&aR-Pz&@C2L<"z"/n^Th3^+7k#ioDDݷ~yf ϓe:UwgLJF':#c#щxgtlxl3:1261<61<69[̎-Ǽo9'XU+>pޏ7ov8n?> ۆ&[yde?u/]wjwss])mIiṇ?륯|hZvڛ^׾gu3|ЁÝ < ?bڋ7 ~ݕ(5 t0~Uuҍy pUy8ұpFH{#h9[qt͜p<{-< }*Oh+F%U)#'#GOn~1޷flںoڽОx ZW:xyLTs*%@.Ӷ*pl+'df9W@gъګ:E9yB␲d$OCDsAfBG5ivXZr8?_<4^|gx%{dݸ񨗼]Ε?TM7 D&&|ٟ _:t]{O:_|κ쇗5kY ?Y [Խ hG(tݼH`)ż [aV"CI%@ig#K< ! :Чr^I. W'K9Ĩ j6a?Sa+BgQy^uQ?|< QhRZf3EˏpddooƬB`r>:[O8qGv}seU,eؚ|p+K[EDԞʓnҨF*Gn-.S'5$Wam*X^SLG͛ڐa Ts$o/}mcʴa0p0s;sE8(W5&T{tO8lXƈb;3{P}jN,ܸ=?򑏴!!ĦM-[vWccVaܪΟWt44<sW,}\t'LNNwBLM7zr^򴙙]rצ':"n޴usnY΂hq:5Hb6mڴi_~yW){; wbx@2ցh2ZH g9rc+`& cz ܤc> 2 !D-ϔ˘{Q|(3,elp &6[!yoqltsE+W.]pжhG;n:%0 e^o.0HGnOm6Jb+c^?c.)iCam0[: `W]zS՘= (Z1X#yr|>r*#JE}y4ӐxlB)mTy3^nm}'Q4g]y6Ov8Z׌_)OZ0"߀ݷSO=urrrrrrddj]xW]uպus͛7_|6߉;;noff6?O9%; ?>#Ʀ yy8࠻{}ғ4>{trra#e˖ܰve˩,inN|&=T5LC\yuuhhգ'Tw~͑G~-[222R DeW3R]+"@;u=o#RJwVui !Vn9󙣎:W`tg>pO._xll΄Cjw,o`}&pn6o|-|_o|bzj-,?9DA5Ϡe@"Rߵk猎۽Ћ.cO?xy߻ƛU跉x">``0‰wZ>ecyq(OIy]fu/ ב\0sd>>쟼i<\ਖ !P3Qt_sq?Մ_~[WV3֙O$'<}ڦU7`{n`IJg'=0 8g^vS%M͕2$߫,s' FBJxfUxꨭ!EmkCef' "#6?ϓ7QK=B 9$N- @ (e}Y%4vXZͩy3Qg JSm@:svZQV?38{뮻6o޼x>뮻_t{?7mܴ+LTDDo9]\O_Wӿ{qܱ[hтL&_;VuWWS-vJMXw_xױ>-@_*]MCCͳ?{G:OXtllth*kK|SxU~}_s CHKԜ<<΂}9!P$R *dIgzW6kDD`@FP[IM‡32JϘSOM7eF!}U+A4/DD @DPd3$EZEWe6(A#L5""60Lye_h"7YӽjiRɵVSE@ vq&z'MW>J $oo0%"Ӱ`0 d*qAs\JQy'aK/ o8j=Bt:ʲ|sԧ>u6l@5k|{߻袋Nk{v΁C?ɝ]g]wТE&'A}ӭ~ŗ\s ࢋ.믹o}[;jh뮻g|ff@  H`/]r##jzOEqw'kY~7}w}VSOx"eZh,LD'OmXf@B|Z"qy35W~y>fjyNq|QkRR0'Tx/ tn*C=om4Y`iXYt|Gʕ kOJg޹U&Vz>d2 )͋jgUݺа 9S=#'\x-[\=*%aJc'"B)6Q/` )b 'ZxXgzҿ~Wq矿ΪZ?;;;33ss=Vws}3FG/ln/_Ybh}ĢE ~+g>|_pw݆:CNn5Lu9CPvŖ-H_L@H sow w:ߍ7{͑G+{Ƨ?}9ǯ^e_;bށ(=X<ŨjNC&EҵNdH0;1vQ'W4f}s.)nو`3a ӲHۚRz&"^?|E))0(0#]RB;mN}*e:DEA,Fm߳~Z_\NLJ=uUk8BN;s=^hŋ]{M?%299N1RMFy9#'^ % LBH:<߫v':u xIbg4.DMfyL wjgEaER1jYÁnhba#n^#Ɗ.Uv,+® hDKPId͂S GCh1zLj0Ciu93fpX]֔B=G3-}kkmuH ly3Vkۤ"Śo&6{e-ȯXaUQIb\pj2*|<*97hϚ^98pz{;O=5kynwÆ w<7UyNK,n"<3vuu?tGO:frrrӿ=ig{޵k׮[sU {GuteK,^4c*7%uAmXܲnZ=y/{kg\߳~{NƛN>=EPҗ*|˚W Q \j۾soQQ tnp"ERq161>(g cPPCSǵ2a[ TDjk9ك>9u{KHBzSc=-'eD0fo4 (6#W@BRU Z<[09r|_~*I]ثިe~O "IfѠBRsSz$ӢR""NU 8Z}"b5s-!" (kM,ZTJ"tO&53BT"IT( cxJDSRI"@5BDDDDk+&iX K&ퟪ瀻D${ q (&i)eSUlœLR{)=INz@)fE`F0bHuC|G] qbl{ԗfQ{ @>5@;Q DDA@DI~Zvm`\Ss(H@FoQ  ;"j)tV 5kB(| p"Tڊ@HXTY^ Z5樴KBuIR AdiX}]EE!JHlYQT>Уq3aO" .ܩ 1M 9?) ~k^xSO=Ǽy]V%+݅!v6 l(bsٚ!QtQؚ#%1G0'Dn o<ǿ}tn+V,_|XwÆ}wիWy衇ԧ^r%z:b5,yW?3qmܘtO|s=11>6:g@v[%Mw|NK,y_GGFFy$x" 6Iͽ0VVޟ3ZdɄ-<)݆ A"q{+b`Ӻn74C,m:O_j;,D,˒gf$h7#^S>nzEasE Ћ+syn40P6bFĒ,!0@ jFZHS_b¤(3l >XyhrQ"Z3Y IYP_;@R &<@Ssm ڷ?wƧwvylj|ǹmoEB! E!P`!BۮnǼ{N;-_liXѣ?˛oWe׊˧Σzʇ6lCu7SjB,YxllWH.㎻l2991991>6t##/y͛`xxX-nw,zBS1) c&O&j~u'-Ad0HQaiAo4(b_ F|nN<ƇғO3柱IqcݩY$'`B?0SC6?7#e!~.V HOidV_6\ If6KMxBV[QE "U|uu lhͥV8]!MP5 NNHEǬT48>#cEpqX d2 [sOT z6%w}GT(h-K|=,l0^{=ghE!rj;75Kl<;;ܞpO |jHٚCJ%%XFɖoUBďTA^5$ڞWH^T)!L5Gv<`J*̈́aZ?'lݦz{f5mUJ5S?󡡡&l[M>Ґ.soh-^e,oRJEQt;v{>CCC\w }CCvFGV5*XB`Q֡Z&yPڻCZf TT`alX " +Oyn _f 4![dMz: Q"XqO^Ag^)(Γ}\ BIi4S[<`{@g94*D,J#uU9s]yêbb0JM${lVl¨q`MR'%+JfsKUx Z36NJ|A9jM2ȗM ?# Q fr|`ބs25%_qzJ%$%ehh %i(҂A 9dyG66ҶB 'B<}BV²]l2@W@בءhG'd3 ݲ(9qF(.?vPIřD{lWm{j_%4<2oHu= }=vM! g6O(|R6AD^PA|St¯`"Q KP0htrVވXCbR~Uqڥ3ȧc#2Gc;ȕ xLn,BnUIəIxR! KQGM+]Y2xhM % e:|^c- ٨/Djޓ%T˰h@ EMPMCO(Ðܸ0Ekd0/@]?T=oc&fM?joxѨgf]Nft*i lDÐdw Vɯ]L?6p{#~2?u@g_'rͨxbMmuU4r`L%DL|S x -O֘IO3VF8!!yt,7_a-)U4rЃFA23{؞^sR"V%gL/%fWj)ӱ%{gN۝[5-B0n[>]9,qۂj h@< NM/0Ws)x\ yzO!bAZ~~?RU4^MusssN$ONs;Rœ.ps2>ݘ)f兘9C}#4M6}R{9`Sz"ɄjvnMBe6h;8 kÄB9f?-RC2O5GUHƊk ҏ.k&# !&~"x煮4CO=ul=Dzn_9s7fz0b9{<Æ"5/(dW=e6}>h>6/QRx=Z*ϤCaOP 6)89BQ!94蒷쀓nQ<3 lԜG5d^^ZRdUZvyͮyJZPglfZIٍFdoD+*t"כlkz1V-'6˻O#LeӦfZR7{ު*SkohfYT!!qW-U"vQ gYLm=jP͗T>VQ87!PĎV:(EV$ua Ͱh>i<@Tz3{Ǥ  ETٹd*q2#"u)RyufZ!D^Qe*˒TqK)]mMv@xSNSp+]3= |uDrkBN?p}[YX;x'L ɮU*wrwg` n'lRJUb$< Ѷ }_٦J~ -'bFH5<^Ԋڐ;,("8?/cjs/x*N3?4:8zqNƴ֝|pt64zō˓{21A`5Nnt0D& nA7=hy0aSК)^|\هyN~/7D\i? I7ja ,{v` DZ. 0< 눓(T5.$&+C hEj^ ,Y㬄bk42HRu g @2La9iYg}yʓFv(FeD`L[eb)9›H!扽 #Ѐ1N%@Gu!bөUf9ȌPZE]Z,|sq68׎΄G6ώ'qAM!wUaA`eX}c:UemʿV:٤RLEȼϧ)eFf4t_a -hNv5(W¯dƬS?߸n߫v-GkXhU5݋53L"O~U4pZi\@CاM+7,mlS}.]KE5͐:]xE(70#@*&q{YBO%4&}IqF5\4˵6&Y E7Tq,aP(4i0@y& f04Q,MҖ΅m[G8ϝ:nڇlQ%3~b$86^(Bn{u!e+SFQyE1>X%(*nV:+ٚ9WGHk0h݁ Ery,Ԁ ǦG2'rjC6砬7 RϤvWDAN'W)HC&0/Y$JB{X#/ϐ[hu E9E7pPAGaQne{b-7H.%DM!rKDK^q_`˼8^]|ػ \Ss̈́ GUJG0 )$Uá>/J9糟Ml>\EIWO!߅h054}b_)I5ޡ)NH9:WFX%waNt3af$hj&g&Tsd9:;Lް+v;ھO$ bH'!DP/!7œHoaj9b В;cFD:FMՕd$CPJj&c`'I- `YpưYҪ3bfSG 牗Q(y<5B.ϟ$JxO, 9/L=J;!"N0m\Dt=Z}=AǢznN ZϿ֊9jJceid A_9Ѭq+:9^ } z:V^" $`{*E$+ b ׃2S-(8hjTzyXkRTy2醠l &8'ޫS߽AC=@xSk#^4 &QImt c}&Sau.4/T(QILh@4qrZDKl=IS](bLʃ2w{ r%KRyQ \_a`J^@ĥxqx,>|fX񜦀Y c߆jb1h E,4\@_:{G5V)[MU(,x IC \D@_p#o?xtBKkq:0}9y eDS팪Z6̼4%7T9pvWlZO\Eu|-ߐjXH JRūC5y$FiΊ&T3,_HX-D?yR -F#Vj{Zw!Gw>9td=;},,h͛7M &I`!IMj}+A( ~^wöe@ b4 [-ƮJsw nZ ޛyVTwuOw  0 ; DM D_}71QH_GQadMfXg߭QZouO@խ:uvVUȢfee ]-9cnH TK(_ 1啽ef[=faDo$Z2@Hޖ9<Ȳ,"}}A"%)Ѫ ˝LQK `(- T*wQ 9[ L~CuZs},XB#d{03ʭP%q&"Rk\JL`Ǫ8յ@}0Q}EC( IDATEARA,cI֩~#}GLJsB!P !S{Iq҇FK>{A5Nc+R>c{M^y `~ƳfX9#6ך8$NOX?G}a? l(!2"Cx|N") npB/[HGP؆8-fi?ʑ!9vug 4b nd%,V>!Z_ Z_Ya1~S^׻Z [uޚևي.h=MFV|KKxp#S";7p-v0VPa:3l6o܏@61B9 e T9ϱ-VRa'bi3IYYi4}(.XD釧+!gi쪍VUXF]$IOu6}q(˾ONn{8oX׶m={ދ_tpܙ7aUbnz_򢓵cѵr77::6+e9o< V)o?}̙ u^1ʁ|Ə1@oV6?ݵx(cN~A>h&(nF& HX{.^PAR""oal6mN|9޷gcccÏX ' O<1aZB]đ5 !-3e94"LI@bgMQސiEJ1D7,OZσDv(O:v+kFõ%Mg"sNYעu7mFܼ}[/[?#^1! iyz[pyU/|]z ;bb[?y{oJDXTJ)eYn޼eѢ0"?UϿ;SۋVx }pOejkmdGo8-v4G?& Y֙NI" b4wh )t+{⨸k9&PAe8o\Kk&#E1׾ۂG֋3΂  Sp"R/#S`搼b :XgMFS-#[Flvq֯^[ 23 A/yѾTm7I+%sp+B=!Qz?tX>J>.wEx^ 8 ڌ3 CcΏ98Aqanz У>FTo~ֻݿy9#+^}wy .iӦG;ۂ\l޲o߮N)nG|9cu>~]gByFoGʽھrǎS;֬}dUf-ʎ055~w^yƕW^yۭ\tɑXp8M+ۙ4Xv2 blGpn )KN L_# iDstHƨU?b蘖7c@hX}XȽb ÿᩩm{E ?W'&7o;_S&&&QKo?yes[Zxlw{= -6>|۷oٲuÓ[}KO{HؙOR~}tءE\o~{{_yc|ґG(b=GO j })<QS VH"#w<1'c?=+F 9SpWo'JBuHXt ^vp8p{W**xv3[&ݜ?JA5bwQz~g.] +i5ogSA8ʞѝ\"#CgDGpaےߏpkX71.0g|h;$ 45;F޲ S)93Gr;!e 9Ҙ?e>kiǿx8e'|Tu9?g^?܇/ޣ7111>>>6os=^>!''^+q+^.[tlll(qgէwݻ>;'&ackh8\ǚ"#_111122/tX׮ys~+Z~[o{8Cv-CaGA݈SbpzH)˲=We$Dpb$⯨dƱ_nީOewI,Ib`ImtA+ѻF=-BEpp@u;($qbP2gffd{_|i1X/U";.W[(b)#F<%u[D@.Hd0ff&IPV!d"*EY=̂+V9֪ N$TҴU͢V[N}/k0Y(YQ}ο*{L=lɫt,?x&4CXW3LFkդtYU\*l U{P(u^g_X2UA'<=ΧXޚgg09u)3:ic䷷[i][bo#ߙ;'>#bqQLHh3U8hGX u[w y=wb|}~Fz'lܴ7 |ӟ=v_ցK^z͛>{E_g<`{HI˭[\"rFwq[?'9g\*ع'T9s$1 /& 2S!k{VhDDg5߈OSzK7ؤbIL;ET9x֝R6l% 1brN+0򠽛7FAP.8C}cڣLbcD3|`h2!8<_Vt b iEq;YLԛb[?}sbrtsSSpIG;أw_lcc]}=ݰ}#;O7>_>#: |͵qwwwٰi[6m[nm|s[k;w8췼?Gg_7pk/OPw($\`AYf ~EΩ졇ڰa֭[,X055裏u]SSS}^ottd_JH5 @̵^o{[099ٙxť]ng8t)42l8VZTQZP,9o`>?3>8Pk^`w,%qLG5(9?BF@ ~B>FP |gU }hm+<؉\*_*-+DD#{C>&k,91 ܝ}K[sA}ű9)jΆA }_`? S )4p!bZ.D;3.E!U8“4TpENTԨLM ^f9Q7өvQUfr +. ?LM=m6˖Ο?D;ݰ~u&^xq]o,_Ns%/럯8pOn %$џgһF{{ Mw~ιO<3mWwa=x˖j񱱱yĒ~y7WڰaCߟܾ}͛7o<::֭_?՟*n`9R`lH)QKm@ '8o" "}+{B? GWL V_ɇ=fRǢws007:&b40~ P$&',iCRY13ie+c:V rXa9bNws|Ur]b:7~noϱJ"e|1rj0]+sYNy8C})V?#R` İ(.dş"%Cp`i4!F /6Ob0 腙֦HD7x ^{p7nxH12::oHCAhX|EJY" QI[… fڑB>5ݲm{ߗcc ~3Yn۾MJj} ǼOzU?;9/Zx׼uonqf,aƲ#:#S~"Zt֭[׬YvZ!Ď;ʲ*RJ{촿z lߺ{˽;_^g R#FBHAu3əze%17{'y\!~ Y+7 -U4NQ䛆c!VV(ħLkK1Di>t"rNA`ڴEcלaPZfy HTmwFC_%\}]w9BcPA|XUcr*VI#`/u!*(!2$uhuQDq/7W~I㳒jA@=2&G`vt6 "% ݟIpNۊp1u\&|tO [7VǴ3i(Sb[{q3_wI(P`[VX̟[acI$?>Em/A'pܧ? ]]q9yU455#۷ƈZ85k֌l۶mÆ (TxVzj Iҷ.vqÏ!x;_n'9[u~YZ| >'ߖU*2kcM&kn61;VjDT[c(.N;+Q aX'l(\рSCG~3xX&l>nL1^'Z]wv+-{VKN2|x3v>06 }hnvhi>tu$@b &G[5iƩ0?.މb#FakO*VAJ))sB 'LS42!va١29kdkj?_ LKkn[1J76e*!'L񧃊bM7ݺjQnַ>+q@A@=:[E'֖|}g|\dĖm;`7oddblͺ{Q݆]}w'Ľ/~g|=6nܴ~;2)zwxqN= 6Fwر}I}{ttHo;6^RLH(u.^}9IV r|>0qu|5:8_ءPyf YMmB3ƴ+swbA@( Φjur!r9>$gKs" "yqlPn(y6X F9L3-cD$M9 FNY3WQ(V4ch/yj-mqe6t"K )9׉kVX3C߸v6/F0& $" @@D JOr»ӌmWibSs&~K@#C#Ԝ&ʴ=>! ]#c[-6dɒ[sro׭ 6欷ٟgժMLLLJWWq7}~^WMNN>C'&{A}ؑ'k.ޏr";:2 IDATfdGXg rP˷.k_e!^h8yfUl&}3g_A4؟Bv9@Kʒm3NR}翍 ʦFmHTL" lGUdl|Ju8YQ*^_<ϻ-@MA~Pd 0rH x^U:CXqa/_}_uB?>g||^d{sG?wGقE .]B Y-Dz_vϟw_ןhѢ!ovoX_}Q':V }:~yW|C'B|G}K" /vo\@Ju&mDXT8ȔPA߲oB,Hu $ dX$DTw3|KgDPJ@Hj񍯘9@\| 0TP p%$?/b٪ݏޒjF!dj*pif):^[=!qDZɾ:W25L]TDD䷶T]ѦF+ sWf3隗7y,$jF.UœP:B ’`>ښW溺WA;)WBDQC}{Y v4E!Ft8 ڗ& vc0qQXCŝ$1VL`K.5D8SSSjJ,U`o7R[ ehua@^'޲j|5 c dL @kTO}8D@H Мu/I%7<(WK%$Ԫ ԸU՗U!bjozE =<ܑIHg5ޡP˟mt5Xo] y (bzIS 'z.3{ݗ.]tɂ u"/֭ߺu[bs5#3<[o۶gc-]{ŋ緾jZi?tHŧ|8'9 /n*(O+xn%86e:k"smZBaJa2;_|4rLQ D™b&N~f3K%*@, l*˷'PauO n'fʥg*@8ߚp̓&j jWCIjzmb1bƴy!bJ3HOzy wͻdb?P%A} Ȏ4Xщ?_5\(;ٷrEybu9RJ@\Ð̻# ^j^Py7We:갨Yō>'6ʏU fGˤXE.3Y/FM:Z ;1DzγwcE.]? !gz휯J8bb|llES;,hO놫q[nP3j4N$7o^כ?1ٲeD^7::B0-ЇB|9GC0F7_Eo0(pO蓻rtߓD̳wn.,l6[ @r:NlKaY*h/)xRy鴄u䇜qBTgkzՇ,ߦu}.WO@!E2(BZF`I-v3cf#!~HCCP*~(gn&b\>33=k5\ַuLeDBTx^'|ar6eyvNVə'pVyQ :G$Zcp#<זWkˮzO0?AA n8[q[Ρ{%ׂӱ)BslӐoV2KL fH7&"M;]9}Z%&;]E=(6~fΆD sל~Zmlء1ÐGڟ04rN*%~o!}r%O`6bOՂYK[x΅(Č0mh¹Td#mՑgjo9X@ ^FiSbeIM1ODP"ei%ZՈ klTU|}T>L.&IKDi>j̩X|.!A0ӛ9T5ώB1#@,F]tͯx9#y63[Z7>ΊYNֱՉS 1q̲M4`.1ܙf29[=kN?_`ޫ|?yK`DnGb`=Иn1+'90R]AʉܩJm&}#M(O_·RVGpZ(@ǏDNގBfO l fZV3" T!~i $~6ƴ y^.m?FHO7B ]&w|0SPޙDDKk9*}xoҩE= nsCl8k!p}ԟ3 ȌXo?cuf < Fy9Bx r "aKvAL0Y_wb9: f_C<ͨ3@R#sSFAMk9(m o:fOhf3 g _+O`N_cN| dU'd'<363M7цP ;蘩 HMF{<w2bHRJEPt(j{NJ4 S @=ZH!M]*͕=8Uo CL|m2!O r.ͮ.'rqHL€)ȩ4 ̧p }o^r3T\P*Gdׁ4e=xh60Arw_yj 40G*?NH^ R#FI+x=9` 켲,r\@a7a"Wl=`gND@Frue5^eJ"VlP3&SR,K~#%(W"n %Vi-@R og÷( ,6ӍTTIpSb$"TL607ϼvxITUðR~1G}^z "DTp_f8D$P\ fW1P^bG8&e ވ4TVAu]eBE%IUZڪEQ^"@ș՝y:NBeKP#s?eX B_P ]fx)>GtPi {.oӶVNyYmFFk4匏Nv D-Ɇ81fJh9ma7GsԍCsAg9el ue-"c9IIaT-Cb޲z |)2Ȱ2P"C&6j S&X5zřbI J`|!sHUc$wȚ۵Pף@] "c0Gu{SRC&rɉ~6}H.}'G""Y7]ۦlu PLB-s/Ƈ*lVuF8u`XTs|lV̘h&#"^_ oZ^׊kY}ԑGt߲rAK䓎=v!CaXy3.1ϟ]@]ð2Ő:~Yzc. #tm+dEw1ʵ˃A:bȵ#V{,tFzc*K޲1یՃ2 TegiRJ, M|$i%Y;{AՉ1MP5q1 'm2nR@\J:S .#R&Y>`"Twu<^I=XE FsvlJldVl#|b{h\탗AVoGČE2m4e`?B[DTQEyB5#s*,9&4!+KD?!(66z ] VOQc}5o@v+pH>PlK~Zk^; QP?J ˙!&p`v ֘O:>x۫Kf9iy[UvP::Gs[oLIzLJOCaEmx6EB%x6Vl0 JlԻ $>b HmBV 䭖҄@}h* VR!7~ OU&&lgFw||Oo}Ʋ6uuTgԨ؄# 8P8JhĽ e'ǣ"u0=h?e)68𒈊=S)~6uJ07KSF FDT+ik7RofѩL;m)ു ^k "` Mo5]zu]ԇ-s- [3Y+ȶCj'G苏 ]~$'x*ӌF .Ӂ|T=4B̉og9o/^.~:!tӉ/xxت?Oΰ043?+`ߕ7<t ϯ<] |/TL1x|ۇ%?5wN{m}Ͻ:NÙ$>EaO,I4-R`@j!U@mqbsaDO,m[tꎍC#h$5-ږ(M`PpXblsFnvZD$X^DIuتU3'Q T6d)'ؙ_q5蓥@wM~_}t0AR2rȃRV1 " 0-%)&,A @P^k( g$ 0@u tA(Q}[u̔,բt6V $zdH!<jJJ 2gU \(@Xx%"⎲yTks}ʲBю;( *,^n TRK)Ғ \ehPwV[A`'u o}=.&Q@N)/PWV$ IXE~f|%2"D,O,K{QTݲ,UPG `-ʭs&f2pr>ɛ_K9eA>MD$Յۈ2 Hv H88bƓj(EʾsBQCMJQ$I@Bߩ[sN8@@ }Mj6SUP|VMJoIPj.زjCi*TV ^aRߌnQz#[sn%n0)pǕRFnXkUE(! kIT}l1Rv!`;oLs?N+o[aEI`&"U0# nsy31婴iΝnl< lryq5~s}Nk<| N91^{wsoydJ3 IDATg>^vCg޽,p=L#"RTvx;U A%/P/lcm8"4 *; %X"$z )nEQD U[#Hq0k200B:HɏO< 9zTu~}XZ1-!]e7RwCصmЈqp 1mw <-Ѡb8tS:*WT mV_`CF 5tko"`3L΃֬VU"s[;/g8N)Q"1[6@Τ!q:CC.b!敃g2 tڙ)L|?¬^vDxhVAz ?;~y}&Ù!peh4Trau,;3: "n{Zض![ՖrSەWZ{Pӆ9:aCnOH$8C~oh׀S\zHZ·cG`0FHȶn?c<kNRvvQߓU}Th>br#1)ӢoQ駡$L96G3F+{تcwxE]|_-[v1ǜyg}Ζ;|Lϰ8>c c gj rȒEleIJuplkP=F xֈQDd9ݫg#tZmthD$Q&/-^ǝV +NFt$"+!QL(!k- Qc]"b| `^BP&jE֊i_6'FZ[$`YXкĺ?"\KQ ;Lx(=QG#yhƅgM֦ċ΋Ky 37-:oI3+{]f)"B˧9c!e <[7) `;Dj?34`bnI̳:[A "!ءJ$ܠYi~؉ծ 8e5s;<@6(+.gPKDD"c䁝/)Fn|pnF8p1QYjД*1V6L@S T+ٱr1^;S"k2٨Y:A,4dUF9Z 7r'f>y7i!}aT.n8o6aZ`x'(a?ǀ<e6L1b03I$.rҍ gbsύ_Eׯ?s]M0?( &6O. \r{ yQN{?%\7 ; [8d lpB*dt.pF bZkT@uNT2Y=QhZg?Yh9"q_cD ֍%"i qQg,_Iu Wq Lyx6ﴯ&_v1^*$Ԟ< -a9l0`!tڄ$di]9Dn[hp[yLyF9^)!$UC nb  }Ć ȉ/9(s0Z!Uw^8=:2 boh>%t~33ۛVgls/MTu?c-ȓ[jɟ -ER8)Z:l8f3MZB|1tp}ڒׇo$졝IGODur1|8d&#"Z3b5 A[]oI^|d&hj-3PPuZ&n[h$tP4!Jȇ=-9/T|T|RJg&qF}WY[9u׸[U4RkYMV|v TK+Ub չLL@KkB&=Ą,P;8ɫf4ȶQ"$5K"a6{w7?jL j,!;3 zrB%#sņӪ;U|sDV0+Y@2ܼ mkh9k`.f 1]+uى~ oڝ4MDMD>ufCCwy7n_ %RϞ7wy ;PFIJ,F>DTGtqAS֛))/!21VSz}AT`v>M|mJ$Q3[P[&|uVC43{?.8KcC*"1CV'~? eu2K1q LlJEz;s Z͗|syshΉTY> .&c=v;f :x@; [e)$JbᄂFs6%ևo+ йq5q*8v+H(@nˆSA\|XWm5`H;f q Ԓr&}݋$gSS42ĉ$ $@N8`T(ʬ۪PNM]j2A՚*ҝ:T,-%}oD+DQ,Ql.H; q)DTvZ_)%b (DHbh#YvC|t]RZ/:d~9{,D-{YU"UZܔ@Dѫ pj\_WAd]<*K=Ă"] %)ʂZ MT _J\צYT9fQ݊U j.`+B5HB$,GB U1[ԙ֠˩)S.VP&M]GGDpa찿BmG(HҔ{тX,J(4A]T\j ( u@H[TM EQš e mPAmj &Sn#"o47뜒͟KDWOW䬋\#AɒH-UQ=4FUД!Va.Hrj6\Jg׭%Z?\>c/UVͼ`N+Zq5:n-+Za~t߹O> ڃ<`+OmGXظN@o#T ns8EOEk,]]nz?-"sb.c> *f.E,_[ 6=fͥ)b"eu4 w'')Xf0`8;3u8[I_EdEpw$W<>ur儛tP8gnp]8Dj Ha*\p#"宖XȚVĹ6r?rBֳ 8CCS;+gxuA@υw.-{E?z;3 9"F"nmCEͩ˲tcqoFD Ysrt#-薯od?}SѨJ+a3b/[)z tS@ 3|  #1J`l77M.U4-yZL~w!tIəs"&pg瘹Lzb#0˛ȽuUUWpMASd/S'ӈ?GO:wi~r;8v!Cg83Tt |7뛀=*b~YN̠Aހk"b3'3Ovs+N~.i>l ppr1x?nmͣ8ADdcYp93}aA0fr#cBmQAǪ"8@I4FTH9z9[LQ2c+*#Bƙ`ALlI;#/|cXYwVåDI Fv"q)'LCG\s1xp- oCs4}D}۔ol u$*O-h V̙m89+p#3,oBZӃo+ٝ B Ds4w*.(U92dTEŰP2ġk7^?$aVzhik'BS5؟@d m=bk%4 gI!>"+=w'GC o4O*򩭄dhoKq#M9~D9]ӂ*SFld.OBީΐ,Jl48}6c"E(—{"2i3ɢUZě,ŌJPN  L. 6 jad`ʁ0a!RL<5}qD F!v>[T38F7;Qdm?uG;|tja!lr/ ݲǫ́Hx+?Yi\'XR"Q82=%8Dd[|Uj5^_p^"rW6CU[0]6t45CZ\xO SsFr"cXUC(eUp)6`X|Bb c2)-z i)CN -0?f<ʙ^Et- 绿t-Vz{98pCηXW)X|تI~^*'_~˖-Gy3^wömۖ/裎*3\t Wϑ"n$%3S2Iphh:[)B>Vu^.m1i9z%v<̗"Òz:qr O>4U?ğ}g^z}eOvŠ"QW w|:s^Mŀ#C-c(8x[~r í [>.1xs~[ᜧ) M150c08&p0uf1p +_ VE ub1>(vhT]-[Rĝh2w5(dskǠA|8CGxk1h d'.Q_4 T!@)3ͫ2Kvfq;l79SRfW@A&nعzI_Vqm\w5G}JН]"DB@[ X$V c~X?1gkts?>D~wy'?=u3u3r Rc#p B$ a9^ p Ӗ|ƩȽ-EfȵV0 Ʃ2#qbΚ t1тha 4&390kr ^U}/C2>1|۟S&{/~_onK/.V^sϯxɧ !3gs֎7te{=s+.xUχgoܴiIwc'LY}o-7]?vdvxJ/fDl}6Q}h,TR?7IUm Kj/:97 D⳱>tsNEahn>u)!|vW9B]tיb4VZGpVϧkЭ1g?5 pTIO8[qrg3W^o{TBH޽onn<`|K:9]ѭ7nxu}W\z6 8Kοo8}w#믱_lE?_rZ6n\M.s~ZS>~/snww˫~>|aEMEJhζu, O5 W`#BP}bx<`Gi"pݩ;L,enk$wmPRKƋ&MaE[ISw@.aDDH͈ Q*8RB)GP%wCRkꈘl#gaXŒ1WJUYoӧyhxhlJvi] H{VOV) jrI*e ~Ϣ4#U I@^ePHJWêjhgZFY5- }G:DE=>oBz^Sr͓O<|{O>﮿F|s}ǟnщ'7bp8#`=N?,]={lj*/[eƾ}L<X|ԙfѢD)&6λFA7rC+ܖxA+u[ /h] %{BpΤiϿ;ꦦ&%e??ʱ'MwwU2bBɧ9g+/qE7On}W#G.`A|gu}!hjObU_cE%˜.ZV5sTuղb;!)Q 䟎PH AJE- {' FIt݌:+b}.:q/BZɭF_e Gu}h(T2ĝtOQLT\ $G T+pSD='dIߠ1,#dĵCTGd igUÝA>‘7v[Eij=4F#hrNr)Q N+GZ*BuB@ZP U5JҨgc.a[߅ك;PE k\g}q㺒fsh6G")eW*~e%'_i idcT^1&=W#}S8N0D7lz)RsјBD7-+Ox>[FN̟ ZEieC|>э e{&4J`'2VTۋ˜"DzBc ζR9ɞXS]^X?k 鮨nc̯-wg6GY e7 Lj$,PqӸ0AHkm):gzbvGkPmA42ɴ*4Imk~ީ @vE/;}*$fglӨ*Q8vDp`SLvsf ?-'ߢICD-Ʌ!@#d6;R\7ݳ#lIAns({ؾ7ʖ/l(Dm)^܌ I(mVE{ӈ)Ԯ9ۢx>c pSPY1 /@wJl ]^0_:zHѮJyaСCA`\*uFK.wJ69#BO It XF&xO 7|؂TvN%3CM䣡`F%A*`+ʒ[7-Dmvrv盺Ct (xwJ'vi=v DRa)_0l$r9e[+ˌD(}t~P0aDzgmPl !٪\V ʨҲto&FFP.E ɣ>YJeh F¬T.6JC3yK>T&n*vlJ4R+S^]m-X|2"p'md"s(:0֞MOVucF&P1&HC-BfvسUKrJiP^TeG᙭%О(F9=4H-y |M'O$-$qtD)tP2]u#~38ѧAl@mhLO !T}ƫ(-zJmVgG4;4T- z׸BB4wW2P2"rD䇈Ib" O%$* }X=ӟh8$ViD#?HevI9 hKZeB6,hOIK/jIv Hr#0g3fh6[,f?`RٸqO>wG.v8̯Q.iE'9th| LUW(Zd\3@ ڤuϫsQw~)B%Uki8b}ec!(G IDATALb|&SfHQ6z\TU]z+_)hOrFRre9iAOD$TVLjL,xiy?.VphCZ ['}C;XფPϓaڂ u_nieOS%9vFG Iծ).`o; ^ !Ŋa{M }MgSKN Aus{m[d!qI O@a$ #lC&NoMԔ99-J[ꆭ6{T`rkh,tM)BvB4^cpZ!Gō?T*̍ߗ2r] 갑ͪnrB,ee;=k 1 Cb~6JZE 4q׈q SOz?O}) zDN%/k[A(54 9غ)*ؔOSI̛%W&TPl:|$Zoy"D7.,Pw;qW_zZ)75㷬h8>#< n1 ZWJa dBHH!K"T4.Nv+Sb 0VIvREly7XQoAvA󞵇lpcjjrw-EUZLV*2.עu ȜC8r].B}8u|䩝'LsR Z!WcIIWK/PC75DQ,)љW)³B:(Urnq3w;ѿwr3B@׃2<0n ;qW^x2qH⃈dEZ2#YgNJE@J(B,89 .ӽF20`H#~;ţ"'7{Wd|ǘnnIJ"JJ@ UQ(މ Dg[8N@vJ8ldW[Qs>1h iAm:YNf)MMMrR \@|e͋êbK4F>M.%'! S(ݣ"\.))iۣnI2D~ G *cE+JJA(]R¶Vwhf1Ϟ KnqDr䋪EzFq4vJHԦ3L6FzS 6:/ߐgn{=gē}Ɛ*Trv3! I%[`Q5=vGny5!Ο*ter[[sڴi˖-~՝r LzzE!SH5hE"2ӿ4GνtmcbyP3)2h+Y(C=>^$O)Yl|C HR]5GDiL8֒bwuV&PtՆ rG[_QoD~JyGV=m(jh)cLyYQ[֤ gSw8_E`Z&ԙIoV !( UR<hlvKH _}i:w1 {x͚5JeA`1:k%PYtnl'@ c9tF$׊%"#ۈ=QWh/M.&$p3IXm.<3 n!#ރ*^ +bvfLgol(dӓv!fj%ٔ<+V T m-L[Xi򔵃I +qW16.=![?#ɭ؝y*I @*E RtQ3wuoGkЭdElBF`]A*Xv7FcHJM T|#%iyf/I{:4%݉:_wCfAExi`# F8ʩ OѸQ3xFC{ǜN艀UxJk*XEs q8#A^DF@Ą :y  يۘgD>[:Doehy6K &KK!|×^BQ2r~ Zo D,1-w5yP]M oC緕*mץ#˱ tTg7Hr+WoW\ C {B 'pn57Lwd(3w#w[( ^n;qXs+`V:{B$ܼMdWX<`0 ŻչQUrhǍ9n1hX[6]3f۾֧1iJYxO  e֤-o"+/~+\mAcDge`//9ZNƁȭr)(AE2%"Srǟ21˩Hɓ!W6EЙ1Ec01eZ@ 1+P2Lqi$[3FNȿSǤbh9.x a7vKr&(dR{J*ܶJ WݼE cdo³M@m$i rn&CJ`rƩty<|x$ʈ1Ԅt{*vҏ)?59\%EYQADYͬT$KڠX9$U (x_.P"4>~7NP{*8%`^F'v>'oG$9Xե͐kό%u4ZQQ5d )rE}s۷\p)t84bh">4ٷ]kg*E8 ~;rX)ݚDg>^ٸ>oS kXظ,1RK#))rC,V xdgt Xd`[LR3]"HE,_\+Dkd4iܐ)JgqM_UZ ř#-J=αPjQ1frwBޝ}[rV(DJzBrwm,a1gWw-.k]A;7!m,Zk"_~9 *!??iӦ{?kIe cL"@ŷ8~ KO9HK3F\m4|lR~ʜJ IO!\a}2N" Tr̸PV`Fd>jLJ*w$.crDR^:Y0 ËZ!qA![`ƶ,7(jOXm%.-'٨ȏo&hGO=kFکGUbU;d L9 4˯a-VWP>9R"IN#AY=;_ڊ]EԂ-35@ q6D:묳: .YEW^xrW^xR<Ai^㈦Ƅ%1?MنumQڕ]Z%EbAch (=5MkܗH߬*ש35_iQƜz.@e`L)7!ilzъd -08PXw-eY),VJ(β\/w#rj*PM^f{\,n%;u7޶qerZ d(FTn]:qWRc";Lxr|MWjP*^IR-kSK0(BZ,@s0o^7G_ #qgNj'"ϩ{W_h;=Y} pB9b0Js8Jl*ceЖM'(;2kaG^pkW`{ fX@ٺ 4y]Q3ͽy1iCz>f?m 1Ew)Ix'!3=3W9-d3hww6ɖ (7klYѾSUɴv K^57Xo:,T,Yw7zGp/ә,vr J|"<;{=0IduiE=?N!{3O\ƌ"  5$+w#ՙR#QeEyZ= GamI1 s&YJ3CSb; x*i^q!عddz궟FHE*qP ˅*cm-2*jiV<.rk I17@x [r˱HY{mLeʬYl8b{A*Ԫ^[Ck),q3!s9,.Љ'_Dh+҅%ׄR` D9=]#/YZf-n<)6QpI8RV(1LrDA6vHveƻLE(^_6ČK̩ccҀZmͱ4i-eȂuh)q%drFIe )++% 6U I/%(;\D:,*tp!;3i[0u@FYmCbaȒHN0o; {Ÿ;ȃ3fP+W 9y;4:7ODD |*#;!o*WDJB!@GH"wbV-'#,٨8:ʚxt_G]m5aE)EfҦY~$ᨔ"k#g/3R8MW//,ؤDwHD!HJR 'a K'ktN O !c5DL+'{-1XzTAry\Ze/jZ>T/}Q3cUхtT];-0YHA1Mʑ : %@#hϻ(lK$R 7Qޗh vƷfg%K`ݼ'qGJXט 32^pF}PD V+ `_/Yq$L@H/jVئJK!DyJMlט#EIgnePrl՝k'w\cƞ)2;(EQRBbF)7&G10Z"/BoAoMLyscJ$ p!bX.;-QJP(:솔Eʒ%g\O` Vջ1{Q8wC IDAT)r6T$n ;H /n+hEXn KI "6, {bbD_>cΉũ \4b*z$ ;nd)d}h) ˔t)SEaP #^"˷xوi~jgK0<y4!F!~+mŒrd/mH)rY !y'?(}Mjzxw*'Eމ6u㠻Utիo}T-o a*vԋ:bֱF(zX^ >gթmNX:r@IZ2ߒp qū~_ϔ %egQvdjٯ䠰 X*7Iʏ}f>'|/>zZXm}NtOa"=+2HB2?ē$1oA@1x2^}W0MSYPȉAngT"1'*TBbRɘnBA%ݢU3Lq(M\'>m? xC :BC ɚ} n]5lUj@ry T|(6BPZ-?3R4ԒH'h:880Fxzo/ cpE~NR'fUǝdv߭zN'E@pF0˧ Rc1WV$6(4#ǧ8֥AoFSj[H(Jh\2+cs`[2g-E[ 6y8w@b5T)'Ʌܸ6piy婸#ՠeU(ٽ.B|DקiLQ%TeL LɲA^QJ4y5!]I`rrw>nsVXQzQ*RnSE4%!;Y*fvȒc@F:F2kg1B)EXI(V%Ֆpe.N c2c2SMM@+cN!9\M~Re%8vhӢڤ$gLd>K7Yn=IV-y,Yv`VqӣTs%;to%(CGdL/Ϭ%L|a@LQΦ!=p$azv0TNyː\,.ƴ`HQ?2|Mu@!C& P£ DҗRNklzxatdsU<وX>?L?.M1Ӿ\V>U:ٖ*8kXh jٸk A:ZkS5r,r-YJZKZ"́o9I?RqQ1apQzI2#6'SJ&I8"o1߃hzqgό?I)IVXCBӏHFV*ht>M!׭ZIP[M5聍A[!yEYQF(Jڵ܊cN2tm!rgba2"k*VM3=HK;CowUɅ0)A)95ictiE;J~.}z@v>zs뭱gM. =Ա'nԞO fr۟ڗkT"=qmc]|$(-s)4"N&ܑNzBT*R!"81 qaQr)$ <_&+J`("G 2Oݡyc@QDĒW3э0{jz옙p7HŸK=2. "p#\GmS1RdRAJ7'%bhB@I9m Z/?MDrR=SG3Z6UN `e 7#凑&'jEGjE#RpkhBʊ(»% Ƙ\F HGeRk(+ZS7m#H9Cb^sG$ N'WQxel)X-o(R|l*1-^3Kߥ~@[@T/1HQKRH>OOEܟ  sE@jRI<-JLEhq^x 6 nA#3[^pw\ExQDs_pwE#j'@:j+a]zFhRXY34q<r۟1:}W^p&8R?e20`1;K%`1C d`^ْ^%(ϲ)D}6XH 29K  g"'GNzzP3D"T±Vt1H@NNF3d9Hڂn (dH Nr[}S&R]$̖ #Rdh4͓ϨTtB6N-CcJ(|,Y:ù;K*PH-3d1$ŵ .=W+"1.,JH!S2 WoFdz1 )/ECS-|С>qcv>ѵ Ru L!o?L *o>B2"ݷ8TzʾmNQ6?N7F!H ؜-?ӛBIS~cAƈ!"VmצZ*` U2^ dn,tC96Mt Y$E\WLLo6 >In:W@fOЬQhĤ`赪%FL66dQ_KK4xؕY$dbFL&# ܍ms2ꨲ?;FZ};#אyv'/= xKAvdts|I>@O\8!y܈gTdʪ'@YG"\Z?ȜC?zҴ}O9?׭[ǃl>K,xsMثWO9rqġoV[O‹`y1p6:s,ZxĈJ'pyԑG)媝47mC;rr١Iǿ:Mtg:p_yOϿWW_s kىZjd%Nɫ5剎]Qc}!5:~ ;*p  Æ 7n<ӿ~W~yϷ^fhC٣GV૎9K" tU:NE57GQEQTrh4ǶÇ+W6D=1ds~x~<~/7LL_wvZ9 :Z7Vâ}ղZ-KP/蚴"wifSQ:5=;[_?_<{[o]EMMM--kx</^  ԢEe3B]\scU]";(ٖL݌SHJQ 0\=1h6{E/[PaÆK`ժ>wowܵq%K#h-Zd -W vJMnX.]vϯ;X_P^kB4ԢI't;n 5[C޸j׭.:GEU!ɁtOl;lI8‹/?y~O8.`A|gu}??>A;?I?|Ǘ_zA!`= G}3{yo~Yԥ* YjAΡ_Ο^{vS( j̞3YKjumHwa>B©YuOG\0]לJ ޝ 8(b7 _A8pgr@{¶Ĵٕ+iN9Qh=y .f6nXhAP A +"vD7v׃D +Beϛ`EٕiJr>T׶kQbld^1!@ S:@++ n@ EݚF'{n5jF$_XЕݨh-!5U貳mTY! t%4zNGw["dԑ?%sty;Ĭ D(nV$֞1@ );36笨/0 좄VStf6kF7/;uwW̺˨Zꨆ Er.:zf= (tjZ^q׽O@@@@@@@@ׂo-d-k_h9Ԩ,cs)g](က-=2 {C9\ѹVk/?K/G=vuR, nu^_pg9]q 6Zfc{ģ?*t>CkoON\t8B.:B.:B.:B.:x.?*<pt'{i+a耀΅ɓ&G~!w_x嵪%U_\t±MpM򋐋GEA&w2Uc3/nS!whE׏_L28},8ZܫU'suf\X[/~_^3yf[[[[[['Y3yvs?@GTõiq={^aC^GSS=]_3luϩtЯT+=={ǹ{*mtGmeqo7f̘CdǩVZ*:@64]\LkrS(|rG<ݥ,D.|_Ɛ酈rO^@V[Qڧ"=˖41xRRJ;C*b]uiԥwR(t2e tgt.hDT\Oثgnջ'*/<3/5km6ͭ+|4u}m7{|M};[`ŌY?3F׿K,m7ts7ߞԳƐ19zQ;~AMMM Ʋ[O>u]nݺ=۰C|zΆfLgSOG{챻 z衃:hw_d;,깸.{ RDQTT*J\6hfY>Dq׽k֬Ԣҥ#AiiiڳgO%І=>gd=Ǎ8p gΘ1cz7Xm㦶^m>=vM7z+Wjmkݻ!CvGиWOETz٣D1*QD) ҈b "AО:(ea$]r]}iJ@K IDATq=ǿJT /b=WLԹulr۟tKMMzONCr{piV>s#RJm6_NZm%|jë [Դag8mڵ ,(ˏ}>=W^B_ߝ8a\T^{}Cb_cxYgVKm7lj͆ݥҦ8`ճg^dM*mmٌ,c./_Yo_م^655?vm_Ra,>/9rd\椷eƍ'Ǝ|g{?ry?kڔ~{VܣGֶ6%֯?O-[{sO3߸=<`֬~QJgUW]āmZz7p~\#mZFug_DGf&g=7l ,EY?^w/>=׬^;ͺP*<΃.|F)J/e0֭c,7;q뮍7>c~>xB N1pѣG3.ҎbQ+׶.\iM+iCS&zۧn#V\ޢE~ӫnQY֮]˯+wV\٫W={|え~_>[oݻ'|;:㭷ikk;#uu=p]=})%cY,d=z ֿf 57lL2oyʹo9*yGC;?r 5$\*!@RB4`Į1ƶq3  xm3z}oُo#>‹{45I_s6GY\k͛ZYc=ʄ(öl׉SuۧO>}ڇWӺzv2j+26+*T.m޼ Z[[s_աuhG .RC|HcRz7_+V8#8{oӧ~w_>vѣGGQҲ|1c 3.Y_/^wU/6!=[)h͆/i;[ώU~'Zz\{Le˖^SϼuLSڱqƶ6`Ӧu<ϙ30=ȑ[3.0>/0k̚sÜ}_xa_?eʆS1}׋1w\d_vgӟJ=w~UW͛[ssr4a =_P@EmY>xwSȡۼە(X$^`(V\;.J}^=z:es֭_?h63~ij*/O~+G{湖sQ5WXl;^#Ji^=iمy(Zv Ҷyу{E;`& 6p@=suo|(bÆ_ ̽pa< <#;>0`=wa{Ē%K/Yۮ\ Uװr.XBVCXuM}Kv6}p Oۼ#^o^|U冋~~[oȑ?v_zox;pbD:d̙=38k_~z޳7l߿ ߖG|;l?j`x7nTjxMMM6mDuMMM笷<9iM[o3u\7<|Kh~}M6㿶yZ?K_=w=eEGQ4boiܳY26~ mkMez1zsO3_Tb<ܪիþ}cGo_YjuT2d{o3`oOw|UE?~n/574RH$" ZYֺb[Ϫk]]EV(*N={8_w[ܙsfg朙gV驩 E)헎D"H!DbJ|8\D(Isej3]7IaB Ş}Gde8 Y:X}9NQTX@*I22=qLF"a õZ^8Nשo`>SF` Lq8㉁#2`EQ<}D+ƍl}ᑇ̀,ftϗ'}荷mox/O_~][WaqcGhy ˲.g?'=1XV]]MӅtSfF:u/aϝsfaA~kɲlSS=Y܍ B 0uǀkJnmJ- A{ DEDxՇlzw?n=댫Tuv~z}]]]3fꚝv3 U,lP(!5, N0|{)--]v [&IrrrTwŊ;w|JB{[ol999:nԊϜJEEE,sҒ0a“O>j_u&N㏟.ݸ-]yG?3]izN$$#`ωA &]7?zI&pjE$͗/Yf?Չ!==K~;])/Ip H$I"I/I?X,z G0rժGj՗_~r'E9s}G' qkJW kvlmق]}4VqK;i$uZ- l6 b{+V}u`'27.HYj1P$Mgz646M[Z2@eٳ;;/>7hX!λ\uEYiqSs~ ~}B@5k_9h4644n߱(= jْH^.'LbX#!_4%eNnٳu|4b6PϭLIW&(&xg̘{i4@ J`eo{\Jyoy0UoL4d47lڼi B-.$H$5M,uS4Ls }Է"ؓoZo[3goZg8H0č >s93߯P1nNz,f]Rkk+Bh4 ,˲L{ԧ<)r:Շkah!+?M7dTQ(z=S>p/A_}7͟7'#=u;ԋGj3S%z5@J ;E$F=*IWxGGV$(J_\>e? =|nCYIIqVd%V]{ Gt:'B-mG23F,mGGdeb lf! Bԯ_4GRS$҈ u aQ& Q@PAx B=Lٙ=b];v7q}p7nh8|h]}nNjF M(ee@GG?t,ˈc p\E$ (4|.'|̈́q2=|reϘ>ƛ|ҒbA̘gμ i{ע[x#GjioȈ̳ϚԲk^Q<w1,}#(Cӹ9#>@Ѱz>]2""I"MQHDAVDV2 Ǘ}d7/k_h#jrx<|wdT=E"޺o^{d2~b嫯VZRX0olZ}1c}UƎ)Ov;C#$f@w7ے D9?1Pu>au@(EQE~j^y!3#= v GkeϿ{jΞ}hܰq+v]z.##MGj'Oa:)lYq\Qp$ }$7>`NN <Ǐ_z.\sqϞ=7onmm}뭷\.W,KzKNWTTtվe.f]5a&KIIQA V.//g?~+j4n[fQ$BR(GcF #Fl hKq0iWY ./)bQODQy8ՋuD,K(|+WƧ=M;f3\zٟΘ7_w֢P F0'$ۓOߩSKT;i(?H?4q#NMM͢$UW|>)+MG|y[4ʊV?jIbR6F#~P _⋯x(޻M6Yժz,9sΜ;g6$'{ܳg[ubj5 BڣT%Yٞ#AHTG͖;J;GNz;jp 6l9 <)#R7mۻ!l49c<HOSwps6xEy=$*QLX``ua t:TNl{qa0-bk01 Mh5՜c)L0?ݬ-QEw.WG?n*bVf-) L&cM[̯7Fj@ (*i%Ȩ=0tpXy>٤ x$Uۼ_@W7H<đC+4%fRr$Y+wvsFc\bkw㦞93NAڳ `dFh]Zh}Z'œ Zo]4Eu|IV^$Exq$I0$ °?tX㊳oi>ҏq GֻoAȼή‚˼gWnOL;MSf[jZEQj/_I =Bޱw_j~T1 khlbY EQ8c5>}K:Rc  NP$I -KIyDYa8!IJ$w޿ח7hmm{eqsJW^~j;ggOM񔗕@8 Mzwde;˲$SiEyf]p-7*Fdeh/Ŭ1a{@X.:kDohL&NZ-v!8X]S\4v(+u%]vɅ&)3.v:yszi/.{97'"IB@!!^q\5/ >8Af,h4N4M[ou9$ܜz]wy{z[ .h6<+֒5]ݡ4zNGt:CN۷o_QQњ5kNb7G>3n 1$HAA 0 L1^xERMW?k+ 9|<^H(h۳ q#pdE61.%srrIH0,wqs='IRhTZ ۀY+/<?8lվ%]ϴt7g83d O? Wȓȿdd1ރoR<|ʇ 5V\cAHI;%EYt_B(J_k‚D!DAH]m+|={~@1P#RbjC˙`?F )R͚F^|ss_xOw=nE4뽹5Rrf٤( v9cIVK: EQ(Ed|E%9Ah$ E%%mTfǶZdDžn?o΢;x|X[Q@d ޓڒ>˂\EQpD$p9]寭7u]]V]TaX25j5@nnv=@ <|?VW M,0,sT@IVS1 D)H_ %T a":(z_>>ҽ*1_'3ϽH3404M,aKrr޽XijkTzȅ^vrv$U߾h;Y`}CTh5ڼU߮q]n#Qqidek55GI yy(Q@ 'P[4 @H<dQ ,+-R{ I'L JXb~^Nzz$|Z~ tĿc#EEd2Ų흑pDaY @=c\8.a:xzkW/# IDAT E$h &`zbܘϾ9۵:v˟޶}'{ΛNY騥/,D9_ p3rs? A;:nlVED""EwKǓ! q%"I@ƋohDeb)%c?6 驽ߣ!p1aYb* X.0p86$pq*#`x+SS<=*w:챧LFP8FɒD`\BAB$b|XkZLyҁ5<B)$=c7ܼ|Gb>eM͡PhX-%ŅP{ݖ .5W @豎@}ɋFή.0 M#W?LJ|D68-I8BøPf4BH`zFU]oo~gkmCm;5 -mx!9?!9$&сzϾ!++ꫯOKTpfr1ф6 iӄ|/B w\kEE! Z[[-bQCn@UUѣU'hcCQ]H 0"DY|; K 'H><Uޱ_ i($ <.5뚼Uwo>h7"FK̨3}oԋO.532<}ꩧt:{xG$IcǂB4M+F} ,3hc^r^wliTҹpw򦿝 :<L+;WOi#s3WN/dY󞿮Yg.r.8={SzkeYBe봚{lpXM-W]z.nOl1 3GJ}MI32ٕgϞ.OJ^-)A;Q=h2Xp9:f=1wA+@Cc |1ŬzR(E_06碊PmX߹3H,;k~. {VMq\X$I$I&)6=[?=l%%%$)t(c۬sՁ@Q0uu#Fd)-6A (()Y1/p[ z#;:p1 (Fјr:mXY1FӲ,si"^25//Fe7A  > B5@,W#6ll Uu:[<2]`г,KDkZԬ@01 QSS@xa!hSG__62f)ц ES0 #zga n}A wkD\!X]p_}ҖdV|v$ 4^PvdKl߹;`]%%0cgtےϖ,` }ټYiSxNVTDǍ=7tŠ#uP_2F‡Y߯_̓`0&OҗVSﮕ4?'8uT0r&D$r_zނyJfSKK/dR~rUqq!˲v[үNÏ?+UlcM[!1nLyp3$v[W[$H"iL9En޼ywaW'';n}tWwm$V0{\Ngɨ?jmƖֶ+P3E(x< * \Nd?h?E~[ $*!ze?[e²6='Ӡzt:Aw^啗- Im&IR̬_W_0]o3~),˴wܵ 'T[b1?p /5/[(HRRY޿7TKԤx"I'$IGI)ǕlT]2q;~/fY}kWAK悌oh_ֆ38S&@G7(Ѩa5m$Purڳ5c οt+cYр8~hU>}^G+9~i ]vرczI& (Lm."hiٳٙi1z *Ft+**ڳiT^7dڑ ѹ ժN~z޴Ñ(B6& 4 !8 @HQ0u(FQf0"tË [-79us~SAԳ&E@ǒ(Gxnty^x{gWwqPIq\sUB/(Riuvv>hɝ!>/./>3Tܷ65C2A { =ԑss.zM48&xxo%KzW\EKX,nCƈYCq\l7oh$访f_YvN@X #r33q?xгK_,U۪zBIl0,m⌒[wGj!d,9)aX v ~!<ޜ6;pl6)//wqcϛؓK8//+yn@|>$j_9vٳŬI+7mr&qTqanŎ+|t΍p:dr2]VƙpI2Ntww{5MIqO?~t1>_i4+Wr[R ΛsӦLp8b1J\.g\n"x~cc'L3fLyy… FcF:F8Vce$,)E^w5/>0e3Oz2dwKk[KKFH416iYIkkkwԪӁSSՍFê8BHDy'H0v[l=6v (ȢNk9/I>xh*Q4鴟={frr$Ƀ5j)#ԬT [Yْ{ł1j5Z&wS\̥s'HpHANNW nfMW_kK\tyg:#1s옛tO\S; $4a$9 \Huv(WJGfb8$>*X%(16i&u,b RгK_DƖt|b~#XO<SBhĈ̺EQtZhc ;=#ޯt{|hF̿a;~).*iՇ:]J'3#M2$AD"APg^Twoۮδ  WC9ߟмcG㱇n[tч_}i_zqP19-5s@5NIVkQHmk`Z8ST)}3,`C/]~^߮ [pL8ﻪmEYiC<<;^!.E ɜ(' B( ¶$ō'ǕC| 8!9j֢q'QWNÊGJx$^4@ Ҥ$Kbp]ebͫ&&0Äq*jUL9cScY/j )OBiհ}k~^k.t4ݳj(J6>wJh3^dfef%d1P_0l? !&%|Z-uo]e3 R;HQ>+6HeT`Dfƈ̌#sM$x̲XEbDC* 8ih1q1(,E  e(HT\qōM{hGG`t{N&$d(paj%"(QIӸnE%< xx}O,| Xℏ}s̎4>|<ٿZ0O.?=>vYfϜ>{,51{=ܜܜ ^(ui?%q;-hcC\ :>aEZY1f_~^K^ПiS&N21nC,ðQŅ񏘌F^/I/ OTrk|𝲳xRBA^޼y:tQYm\`b QcGh`JX:6!LNNBՋoػkp9u7DZ?` ?íެX6No7#|'oƛo9LJƐ.:FzJ%A|;ҳ>NE,Ul.p]~3]Q ҧ(uoxWҋ;tmQH" N Q9ȤI\1mhO2 &EYaRoBa IDAT"Ƌ$mz\a"[f=:B+|Vkk admXulT0\?~(A,CS401t_W]ngeeQEy3a\h̹Lko<\[0N;"@P~Q#Fb&R$?&a\R/dYp)pXjj\LVdEAdi`#KHg0{֌aL>_B_ĸ8%Iq qVbO$Ew6ƳJ޾sW^?Y,;?| `N9GӅdvĝR .۷{jQQ1* aTo|ԻLJIqхw/QDY=kdlY"l|m6_LdvF?Ǫ#RuR0IEj9؎naBT{B='A-> l2㺺zOyX">eї_~ δ|EQvyjp($#E0sKI:"\sTb<57YCY;u4e`ƅ{[9/C$:M"QFZV):FnH$!HTd+aĉ8/kzx⑝ #SހN@1xpSd}v5R^I.w`V=(a/q3gVV^^I"?jO^$ I= Q@M]Q$mV_cײuk V]P]]cz8ct8NFCn\n4kqډs\YRhpE?&RY8IЏW-ǮMԿhEWYoVoVSNUDv^Izg8пMO8?7'4A7v`qh]4{"\%{K2K] ,xuzEQp={ 3:{hJRS<+wWxKBi{t(iᬦ\b`TiO{/*?}` <+,---.KD"E7xO?SnI\pom6VuV$KKKׯ_?pW^ykVu3[7(s JW09ld1c*R{aZ4A *$‘Zqx-i2Vi'q 7BdA$Y N6 8AP3lWOSQ'B -SIE Q 2p"IXoJ dΫ~Yŝ$cYF=W=HQ|E#3m H. %n%\@ڜ@l)њ3?[rDz> M'Oj{^Ψi"HVO-s%I` / ( L5({*@ ވ5kbdSU7{̭-&O?mzi5eJXȲ7+[MDLO1Bpc>?ǔ)/)~OeT AΉo<(?p h Lj 1 !G B P"ˊ ?9//b\5$Zñ@)Xxjma$!$=5X]5)*1 `h:M!7 RD8Mru M2Rz Y_3kyWk0lر| I&-0a~c2 ڠ–c++&'XU6 5L {fFaz0V AQpVz*oc^xٳg[V߻v4ih&Oue.]tÐ@$^tYyf޷*#$7$I<1%8#.@:y @AAZtH$a8)HF(˂(FEI}~I*9 ᇎzK 7A mMڳowT;$Dy[r5%=XrdkQA#_5M@4$IQz>-mO h8C3=}?@\#==qV9( ⠵88p˳'N.^{}ᇭV+ᄡA~;;;`)Maw;5! wEAa21;tBkJ2ua@ R@Qǣ("Qe(O)H1p0EYQYd)ڻ`P`H9\&0W \THzNfL$*քߎ( A rq 驧++5񦧞2>z _8ړ|lm{'[ڶ;Ooj6ӹ%rby?.sbWĜ4~y}?.~^ somRS,#`PQհaME4(/_'2NM"kE#RD7kw-8Phij8۷;niCDeB~jp<x_uvظwiӦv()t%lz&<=\nayY楗^eWDArK.mkk{ᇵZm8.,,,))hΌ+՝n΃Q)(& d dh DTeh8.в,0D@@ @@bW"ވ*8##HKZi>)#a)F(c㣨ϔ-[ z/R(6l`]QGDa :%BIodlo~Ll<'ٙ;sn{9jI҃3UU?skЈ Z"ƝnWKv|QJq#6gun# UBj9hh7\W郔))X[Lr2]4'I6Zs"*L\`㋴BxHjr(cUf0vtw\QQk֬(L R*RcCDa*ZjPwn(inLNNqvI&!vD!rTus^=g`+ U8srjv^]$<'?asR|ܮ⼲ <v .(I ,Y4`lRnEZMgfY4M) wS0}\NQSSCd؛|Osс52J~~~~FF7o0999G j1M a\Tq_׊+A%kpÇ~ITse˖8qԩ/FFFϚ0x!i:|N04ÍpCk+^`68EwHh KьƜͧ  e 0zM=Lč:KsR#R=_TwNϜ>%еw{[v^lxH qIDUǯk,+OKMcUK<8.ꜭ2) (`2^_L+Gyx}"&D$M1&ORS JӘX0,@1LMc.'rnPn AE^V"iL u9޿jwU ~8紑"è^,L$e2hRvgK{g*]^h/Xeٓ!+W/$X_[aIEYpAͷLIE 6r$L&1(4A#F@ssŒ~m *&dOYoh4r($I&%g j݅,n1>71u}HɓgKq8 N\4(+iz)tZU/wFlOz eQɔ7Ea@Ntke=fy$f?K [q [_*._)uy@!F2. DfBCm`w"z_IOI eK*N9oxMCobBR!7LW)zAWT_iZ O[jv#M2z`14܌ۿT^x8(a mF87Y,rVi!=#chbYMoQ;l]Yq[Ց `0b@}Dh*tSYt BhBQQ"@0n;`+=NΜA#;ɥ7u^; B**^xaӦMSN=u-7w,s90Xoy`Ν;9f̘E{zw^ٳk֬J…_|u}}='gff={! 18Iҥ8YfYa+'XO1"9(6xm2pY)8L4Ł(" v;{$r7K&h&22T^m/e줙S҇ıCisg\Og,L+Ȑ˕xr@dw=KT0h^ĘGj~ٛ9ͽoLyJHc58~!$oDz\X]9P֖,.e`T3yeQ*JR,^%hN<=`N`t7^SOOMMB霜lXvyQlCã)w_-;x <)neljǑg8?MWBxIQ+l9~'$`aBT} UPH9|ڑs)c#b"uZ͝Gkw"7>bEfURrMgǖxeDms EPDtR)=HTPtO>>1ӾeeegΜx< l6fUTTڹd6O6a4uߣ6YN:H0Jt aQ?n E1AE5& eYaX((-MW)pQa<64VK)r \{w8EJL&ۿmۦM֖-d 4hK:)V^wz_}M6qO[ZZ4͒%Kʟ^A9իWرc^W׻n^/2o+gee>}sIminj޽wrW/_RaMri+ik9DFbu+7,qh[+ (( (^a,a[ @P(3`H`Gt񀥻\.kkx6ݩkO>n?`XQ5u֭5I<\~@>#ޔI0y)ge U\8t4(X'PIl:|!QbAB-qRL X0^\v B&9% bWtԙ 憆w}[n4 ERR,kzg=IwOUݲ~[njxt*]bwsHW 5r;F?;q`d{npawdlۃuk_@<*V@l%|3r>r;45ͼ;og޿GEx/:n}gϞ'''Z?YޠBщ3=pO).hBG3X}O~۲4{wz`h}Y3nUJp8@ [RxH#zu΍^Rrp)RN:iQ<^i.13H=2s߁܍~/T/@vib DXi815R6}N hf6*S^zz\EIoXHOWx<ǣR)Ϸ$9Bq.SZVeI3if=fb\WN0L,)rAQÞW{&q4Zܦ׸nM;!88e^x!88xɒ%}?*--`0p`l,Uikb`[~~~rrr^^޽{/_z~[gffJ$nʚ?K/t!N{_f|>gΜT|1Hill ׻7~={i}{D2sBw?+,h70 h hҋ2 CT @.'0{y<7Mu]!>.6"Xj!/G)BE4Bo9ɮ/g*&%>/|ݺyF %RQUUtҰ09q8t:SRR4J!9ht5/ /Jf?˶k·!ɿ+0$M<~]g2d`e_x߷`S?*J=ogf*ho}>?tبørYooVg}{M nE U&W%$ۻjYSZ\\ҋ/6ὝX]=ci4E_,ٳ uhtCi?j"LCSk>$xXxrUtW|dN|h/ OL{l5kִd%N#!F' 60 1xTY?o]Бԙs>YO,斷cOvЩ7(no"*:m[oh`h&ǣR vSlo 2>N eNewi3td2UiIg#CY CahnG/+bڴi,˶.Zkii;wٳ/Xu4Z*:GˋKJJvuN0ewyGNoxÆ ny˒M'N]+$駟޽{YIeΝ=+S*It:bq~B1`u* @0}Zw?oqI!AEPh(p Y"@1`4'ر#;eW;|Ѵs`VΜKpےY3JR21VNfpTSX:w_*OJF33'6y˂+)A 7EGJl5`r} qqԩs11aeqo>:xUke_) E5СCp444ƴ>}9r(Δ؛[uM-L2Qjld@p?c*AsbYHpH+[w޷nWim{1ёd߻`X"n_t&۲NymǤ~W o0w6z'N] 0LV5jǎ).(G1}'NtJ0v,mswfΘ-ܑ>r)rY &Ifwn IF% p˗.P4 U/˟EEEcN%Vh*ʯl }._(&4E{񷗾7n̨Io\"?"Nu13tHVf:|w,$$]*K&X344KʬbQUB:>֧HAʔ2W`s &c8\pbg CGM8~"oʤ[gP  Կ(!F$ bY.sn^Vym\fލh*+NDz8X߈QҸ8.ƃ1Z4BR&gRF`'[( 9#NSLS .i+ktğ;(7Oݴiӎ=j49/lٲ .̞=;qmoi$ImZ/_\UU5~9s+e˖-&nsAt:]TH$裏 /_hr9A6lz_bVP*|>̙3MJ%8eټcB¶%9/@vN ?˯`< x g1N 6Έ hh1 <`ZJev XCi~Qܓfͧi;=v:E` 罙`~΍8 Et/p:pQƒ =ՂL#%sȠ$SETAfHr!*Xcm=كLT]^pjkD"ud 𔔘 eѼ1 4qV1Ah%!|>̀jhXV` o,ZHJJJܹ~cp`/=遻&}= z ơ`XǟzO{u7lNSɨQ]w6A&HؽŇ?ehԁԘ`Ov?>!H2c7tsCBw_~]zٻ+^+je|UUՋ})XݵgߡvJ?v4u)Pwxoll74p- F=Zv4icfcY-۸ch踋Epܕ" eJ~׼M'NW^iFq_oK}@Nvo^Ͳ-v=`2[fLw{c'm6RHO7 drwa<rAťln'?{ ߬zt+aͻ+>,|幧p_~T[W/Hds<2a} m**ge4 z߆ R}Ȕ,D UUeEJa8?b 325G4> XuĻ}bHRrȱuk_u< I]6RnniX,ff]zeʔ)E^/4m46;4Xݺ}}VM 2xqlyɼC.h_p765544ƘLfEBaڥ|^ ǃ@s/kw Uu EŇmGbx>}}7vX,I r0 O( J0Fc3'6$IbY@f 8Gqvٿ^-%oė_x&&:j]kݥoƦfMDʒ+g[m6P?Pfolnnj22 #2R0rP[Kw͙& ~u?w*!4u۬%=~LI3D"ə/~ 85  0<@3@@1݀W_yC67I,ѤPw!>u4EMx0*X12ux 2N"T#^MiPxwSէ?rȁϔ(.ݘ;4ʅdB"Cj[JroR`0T)vfRhl9JfY\TGrځ0$!‘VP>E4VR=tȑû/ oL/pQzw0B.-^&MݿˬV,O:e>ѣq2if Hww)@7 k؝`xf&G*{$ өG}>z_/z(44dݯD,3z+>|B[n9SS ͚>:.ںʸ>raVQ!B$ PQ]gIIˈT|w/}2&/_%٫w=M/cO>?f^~N(VWX,Ve'Mo46r͎gY~ 헙^[[MV{}ÆdUy @,[o0uZf# l6tinRaêWOM''j\-wǮ>Eln~wŇ*a?v"oIQuG՝reQ|CQW*8DIq]Vm[tI̠#0J.O:)orRXh]n=}a}[&}aX~,9lZܻC͙ÙeL֪+FQtqvԔdihpJٸaӖ+3#~o[i< #ɪk'x̙3O>b1֭4hЖ-[ou:޽{/WVVΞ={Wr*pJ|QGx|VEUU3,}SR÷lҷo߼6?f 88xѢMMƝ;p @00bp:aOPt%,nL343yyFwMHh35VB]?xz"D@.p:p"TNp E;.Tznn]+doxfL̘"&&Vj ԱA\`jNܸK4[PB|(64nJ:w֭{.'|@J{w}G4Ǎ7f$u:en1vB~/_j7$t&uJs(x|JCMYhR6D[D$>ft=")18:e9/~>uS&@Xh0~p딉*Ul:d RXWrivcyZnbNrQՕT5 igZ?+~#7u=/^t9)1>#s-R9 ;FFd2ӕ7+R)Dn߱sgTlڕ+WZNWcyڌf3 #9V~WH,{딉[mִ߷:yB{o YHi[Vhh@0jԹsˣb6kصaOIKZ3j;CzGjԯܨ m2ɓ@HH0ò7l,øHO]ZI\5BhcP$.]ZTdG~cϚ1{sO¢⌴t9=2OF\Uۂ& }TaZ 2&EEP߃>yDKo[O0n1gf歷T*\h{hkIӲ,k46X {=/,6' òqQHHW'5}w#UMXs@$F+vgMw y?ò/V_{7p8wb"Y74dR8(t:˗WT | |>'(D1 հwXU*=shHZ*--kcð,'5g:Q,Mnl6fb8͋&ö¶֗)4 MM?Ͼ"DW&*rsz]aaeXH["oI, .K?ng{vvn5YYHNJBEQ}4cڔ#\\ͿS4qǟ}y艢K-_MֶͿ " 9>3^8vU:MK9GA|>r]++δ|>h  ÈmwMRt\,0J8_?fe.~֫nԸ~ө\+}Ǹy}}埯mnn8?7}βe>%. wW <$u}ld]N$x ˲\[5\Ʀwʏ9ssTCC#0 D7#BCB9r-(ʃ `|>&+8͐\k59B~~L!; orNh^.q1Eò0('|r3fdێU)OI}}NoeBgvi46 `NP86~8jH%<3)w|%')8!!!|ٳgm6D" 07Xd`hnnt+P(JP( x[7Wky{B=X,@p՜~T:͛SSS~7~̠; O?=;==O P @HH*(N$F6;{ȢEwfe%|?{xѴi&Q$ws*(Z/1}: '(ٖd2ɓV+A;0߿ӍO)~ @&e*~{]D"r^dAZvkb͛گ_?nHѿ0}xx0#׏{7,,lٻqq9hЭ[7,\w%r { ͵]i}1pP~յvǞi8uoeO0}V }İ,d3pXXhXBቯZ{GgTSޕϔW7b"C>cmu0)[םҳj`c 9g…ah61;1o\U.eh\XTWɥ"7YYYK[tyg/ƍ}O-z^݄!B'}S,(r:Vbp@$MӬ߶O3x'3SdR֞_ia;TDG]WZZ6okWLN$)Cc낻$&ιm&wG"K$b٩#]h2_}~zscYQv?^83O%''=Œ~@,H >? ;+:*bN~Cghbr05MSܕ&8\l(rNm̶p" l άccNFG=$vaiD'fڀsT{]̜-waXv-c#C}'\eޙA C]U55=:L,k/fe2Y.w-0i¸&訜,NJe[PE1Qu\VUVbRXPA1T ApXK߇;PN Xo&:U v00"u꟞7)B&DB)< OB$4RqS{whee sBCC Q,sbL&[~e< U'8 3[7C?( t]!Ts墢" a$Rѣ9%s^rnHP/J33yb=W^`YGy`Sde 1cA*Fu8 p+jΛ044Enl26xR) H<@ 45& DD"qݜ,4wn<{nٲoX"LOA`5vjZL&2L$x=KB=Ba~ OTbh$HknNm:a-YYx<ٳ_|)c1 $G`G[a̰a̰:E f1/m*c%8вqlA;gzWf-Z% .^*ᕖ,h5h[z>OxEvg7ϳKRbË8z\DXHWlcR` I 5ҖO?&ɸ>}b0+B^]Tz665y/|WB(Zk;.M )b:fe+05 bI;{x|> cYEߝA%bɡC**kQfNI ŧNa~M$:Pq۬iK]Y|RrRoAw"S?Xx+tſ-8ج  RW Jsù,44tZX$,,*k,^Vhl\&׼C"6.4ð!:>4A1D"zD!,CБnƗMMF]*Y%0굟;, ZZ, bqc9}33-:R8z!m}{G*EzpfLX;-ò/ז .*laYܰZovX|'=rgcG̦|fq~#6^Ş?_;Q@* _ v#Z|+[WK: 8,Ըi7ϱGFGy_h4jU⴩m%wܭP*J ҂Ei)|>`X)AS <SXv9JxH8(~WjB7kjFCQtzݠ04 壮V)CTl_ar_[z04{322~С8KRjmii!pIQFiL=Fj2L*d2?I ,XnСCl1Sڕ7”Jepnԡ55ӧ/׶$AAꄄ>1ZmNS|~wڼq5wy.[KsPlY@1#%^4j1g<1s%p'~@_ih9 $irl}'l&cE]'?pN h4qnb/+oL!!ƾ}pX, cI1oaaIJempv̰a_&GaPl|>Vtώ@J͞}eGGG4}>9QkޜYwܵ \SStyw<~Dm6ŋCCCY|q3E svoڼDždqlϾ(*$$xמG\A]a@d w֨I M;v雜(˼`o>J֨0 yXGǫ9zN!APbdul$٬ռO|snv75ɣjL'z0"( sLG8 ۟?gUj5-BF4P[ LٲhH2T֛o&&X_J,+ ٟOn`4Ts^$wUufdٽu8F=wo6YfHpU7.p:;:9g^t?w &VY^q=H{qF^Ό s CC{^44mjrGY0OLN nfD,tk ')l_zOl_RBH$/\ѻw[TjͤC]Ϲ0 h/&=9AXRi[m@+ܷzorZ[mm UaX(ʳ-<A " ad00̊tK멍 W^\7oZ6A{Ɉ ]!A9YG`#Hd ]7cLfXw X,afaµ^m}NjIy.T"`1lkunmz_tcV5=;'[6maرj22{-G-sBz9 46Di4r ߲Ze@4p @`NIt8Z|k}CXh_x3rlUur墅(LJQb4iBV6 AΉ&pf٠#lt3 )q J$Cgh0 N 鴘) Uk'*6~^\!8t;$)isz]̳.PHNeg{ĸ;wWUU9i4ڭ@@4㔔f PsGt8800)1š>-F8QAPxXSgR#=*H6)dyEgW7C#Ƈ7,r{o<|l۶&H&*Js!}@\ᤂ䧲ϗ rSN :sl B E;EvlV$'~擢sl#v#'Κ9ñH𿗍F@OJTwf1l=lV qlRFK_rv*ބZᰣ&I$Y\FaMR3LP X,]|\03F<='-mp\h۝(IDAT bgXs%9~;~3k#VIӬ5],3#]&lxc]{}GG'aG._Q>T&%.)^_T&_[=^ARƴgX0 X,oVu}^:w'yVSy 7d>y IEյ65-7S׭Ski3Ξx&3s/~Qw/(8L߭~J<۹x3K Ɋn yv Gnﶊ#b,]E䜃_6ⅳ4Zf|j_nzů2nUZ9X"61j6}WvK۩30j찗H.)\U.ZTqQh& l $DޮOļ1K^c%4"ՅF}Ϫ ܘQ?x>Uŏ{tb"NCBń֖ݝ:vEh짂mڛScRҷۿspF/c:VQ]tYkK57*U rssm6 <W/FI)Sx ðh@ @QLKAA >< Q0LәL@ 0E\W ?0%1[lC){nw;Ք%1L w4laΏOp-cDN̏H̋>}:!_~%'ƻZmCP8dHSɈ"wqN\(;-$BF9  xyߵQ5JKx蟯8B?5=22R$Y T^W$ݶe2ivVP `w%L>]w%mbh;ĸ`r!5Ky^8% >(eQV  Lcb]?jaXn)fU{Ǖ7*o4=l #QliG *N>F~"6&26&mу Iė麻aqUy-P>.3)F*Մ8 КUr1+(Pãe#hyꥌ {rLg~8LAA1,Z+tW;Nlz`U0h; <")E4dC<8FO<*xu&{m^70PCnU~PҎ*ᶜ r׻{(~fqRbFWx.BG1`HS)((i6!]eBDxOl1V8s~BD8R1P*Fb@=UP<~t(((F >OӋy9J[h@zL'%JHC=P*Fb@죱Ω=L>J:=-zmWʪؘ(:Q卂—(*/abcɉ*R uIENDB`stopmotion-0.8.0/manual/screenshots/gimp_4.png000066400000000000000000021705331234321124500214440ustar00rootroot00000000000000PNG  IHDRC. IDATxwǟl߅. H UETAl^l(\ ^bA J{[3Gf2vٳg~t3Id2s˓dț %]-iARg#JA$hܼ]I  .[6 RL^AA}@AAA= R48 r4Q1@"?bD Q5 //9.wG8=2t.&]R#l.{!ĖY,M:@!FT?laobv(Adrl~̗0 AA.nP#   v^3=zXpaa ra; [ `A dJEE(>J)%>xF4?ZZĹa4rxdqj'd1Eǫߥ.d켒6Xm`ؿg9Ɣ}x*M0 &{ !֜9s=HP# H\F)pB)"(9匂>B m-@vKec8~EZ`gmhXzrѾ/ܰv8YҦS\Cwi[zJ2$-OygpB` Mlq;lڟW WFջT%]!3;wߑ3 mj&n5=kpc kWN.؉M]n5{5@oU=xU`KFjꦔ//BAA 7u)6|߇򍒜7s6TH 9p֟n[x״Ϧ'[ֶNr-GC(PZ+0ovWUܪfͪecrr#'tFk^s/9?h́u;RA xK)03Ј1M]E=u4@R6pV5pHϖ?BfNB|̃c:HLmv?ܽE?mGD􀮩0 LUfL^\ ^%zWqDcF[5g+ޛUXw i77{C$4WI)UJ٧a壵U\ȧOwM0)!檺)WMrW?]BW nS(Eֿetֽqe)9)NOL)8w6ԥTNnۢGcZ֪8{ѶyvxERuM76c(_Fg/.Gvkksj(?  `A"Ela|!bKPJhToؑ1VN?JQA[4q[_Z5)#ڷ3-X ۏ]~j)ɏխZJ'1b8Pw,Rcyrpr Yfùye4oX=#+k {T,=zWreq5{wwu_^5k='s-O͉ԨoF0Gwgؘ'wyE8s.sOoۗj$_Ӽu-jfzy.mܽ)Y+c&GӶI=x=7+P""#+wÎcmW[|ڕv8uf\lԣcON/Xk뾓~U*pe͊9~Ւtmע|t^"sYwtolfebnpݎc;xQJٛ:(44-Go<ܺAk@ֵ.١1jWًGnwbOo zy}{b30 |G@H^Rl%˒>]mgƓC`Ƴ_ӨWtdž=zyfWA<|{5㺧Z}f/d|`͔~d\۴^mo~Qvnb^vG?_#'}#:iַEڰ; 9##ֽ㻷k^++;o-]WQo޼zd?eM=́Ul!^?v@w[gJɐnMknlG`T!cc3r` MM=sasN#¡oRly K86&*!.BfNjq2vWP!90c=y|4=#gS_ui5R=Mz)ٹ׭A|ȫv;wkӸ:\ߢfܭmݔ 0*KE,>h[q-:ޮ8|[bGjJ)zuݨv'oro/بR191>yƊ=һQ:mWOjΓi Ec}Y9~J]s;kJHgݙ,.V53$(AR@${q CRB(J !>2*/m۬N.!_ B[|릝X|kרRbѡf lREcL̜?'K֫oͮi.kGSω\67uW]o\ZqSV*3ձ >6zMm4٨n`+\#*K<}.c{l鳙"ny9{v orqeω՞yZf:uW})'>\ߪ8>w!7\lP.˕kۤF5csr /=CLWױA+RV/Lm!}y@׺]plfFcDrI.v􋟷U nQjɻ}|nX8q@yP7amVs]jun8{7^U19/ߵp4:կYޣg\UdUUuMê"<5-3pY׿\݇p+)N\5jϰW"իWH@P# H '!,[!|Rۦ~sC3&PN|oN囵`~m>GkuM䍙K1;ęƾ)Ѕ ӆ?4K+O7}50Ns56>.PRo+n%QH?s{b|˫Kt &$#gw 2+kW*}جR̰^-:;ONzH(#H!z*MSv:窺UhW?ט_S`m"%ıAڸ-3njwJd9lw|Fv\Lt6uKһ{7EG5c5%pWͪP\M _Ѫaouԥ_couh_rR8YOmm^J2}uco-v~kynZ6oҍM.y~,:AAJ(Ji^l^Av9~:z <9)&=#/&w>#P&9G8yϜ˘Io,hR~m^g/|~'Nw*J_*r&e[n>$K?ۺn!!/V>6&*'ײ*׾of2zwl\ <Μ|ݟh?.Xr>3z\@"׾_q?!6q-Ve]r󴲉ٹk9<4㕵+WT1{Wc̽8@f׹ʂO.z׍ b}1쉍zo 5z[JμBxC7@R|LJIZkPz(_u'_{ 5zgj2ux&Ggok}p3ٳiɕ%9EC(筇ܶsU_)Aq]kc4!ӿ^i[(dǑ^39۰f) 3;JsQ4&V"HiGh`(a H1qNc. sҮĕOXl*e~_8f qUԏͻccpQ+]nrXڭ[ S9ص[t]*>Jޣo] =#yِ2g*'(IL-WFwyzX?8M1jȍwL?xln0kO˘,e!&:*'WhCx`n(R!I:6slzNb|L]m߯/ݾ}}p5_LڭN@Fv]ujн}ݚU=Rϥ |>1| 3=pvUr#ƖT]U#́ԕc[^WeɷiZ&!?DQ!}1%0 EtʹA⹚AAsWg|O7fjecyݼ;|ڣ=s. 3oBBH\upYAYf#;>P\Hf+;ncsi8+;ݨ{Wjq籍;XKEHwc/b;:l`W.ecped{=[NM?qF~~ Br׹i>7dsCd?{@n&'+kUJMǮQ<<c|`Ӻ'< ~N60ȃSbRH߯ 8HP# axPvE"y99M^Ov85)>h“o۳;!;i<;pl˶ddY^NhXZrcɖ^$%~Ҙ}Zs}vbj9WˡZaE⠹qp4_c/d˗7koұ Uz=M5bUW-gk㸘74n|FmgI5zl67O;p4w~kDGjQ\.v砶+$zA<}-Ͻ9Ys2rZ+k֩`5Cg<~.x>} Ũ*ɴ@ِa̭7~M fItlyyU<'o&w҇(g;ucb8AAJ )Ą( 哓8>ձm`E(8'0/dk(]qǑܿw5g}!?.ߚoդ~5; +&'Tl;4^5T61Gū_>45E+u5ۇj &yqƯq1я1~{6L,t4JOMJ6A/7u_?mv0atǜ\-&wאv&|IW `ؾ#gV߱uؘZLruK΍I\!iֽ'rrYZQj\&nt_}1]#UHNmHQݔ(Ki*}G(as0Y|ʍz^[o7F ԟb ӭ]]BȸgF7y}!X׾w rz3W9y>Zto@+E~]_SL@fvK8暘hߝ3r?eIeykkJKוՒ`l& V}'Klݠ |_cQ>8_! 7>fg A)[PI1єp4P8a4@_n_&M;^36=kƴQcW>tíP3W:<%.d3f o}\6sYkTHNW TH &- ;62}`y#@Ua-V*gӘ;u=!pmZ{;C5hڬ<6^|w+/Ύؖp ?as1oMଝ<`ۜ7m?W~ &\[kR vwYiV#9)*ɓIJz3m96k=־ܣcʹNzv8u6Lgigӳ.\Gi_ukV(wo9l,9F)SFp 4 b}!8I05igc9iix`Y=wߟ|0g3swO%aB~˙:s.3;ǿC蔱h_{si>[拯\wf~ԯt0#+77Os[egY{Y yoѓoe으ێ<] ʑs+kW}Y>k]lR܀Es|ě wl_c9#痮‡>WjN\nlϘ0LE?^lfvҵ2rl?_]f<|F+v_WTrRlU`S{墭'ry~v8_<1}IvK ~n<-;׿Wg!JolSGxӞK8x^Ufoy)3~_sY~i>jѩܺϜk[?acs\mm*\7m@A"KM܆Znܼݖɐdc(@EטisLDe`ql~p C_/<|De}og2ВEH!/Rk+|Trڄ>s^wm٪*G׫s#k_xyp1Z~?iQZ:N'~{px{8p}/rUctcEw/HP;bZfQ4irWeK{alvg(8sYd… }OȭU.L"c~@}q 4 š{ Sq{˃!++'G(p p('is`CKsVۦtJ>q6#+Wv~mGkѰ#.~[ ǖ'Ykz]{wL*Z5 ;Ϟ떋g;4֠vaǖ/|tn];=#guۏD*(AĘ8'8m}rҡ~Oz54cq }6|FV1llW&$2y/S©X*◬1JoqolB0̙31 `A;{|WD)'͜{_}ʕkuWNޱ/_Y^$]LxqXLFmkפeF2M[vϫ0#TѣG Fc"*At)e5!Sks<#o^"9~HB.Ks˽Uvod IDATL*%LzFT?D‚ɒj(5jy6"Bl81GT P5 "]C^|kڸ?`AAJ  9{#Ӫaܱ%m E 8F R4nޮM@AKB 殇(A.B"ӿj A)RVXb A %{A)YP#\$D/ D,(AJ1ů.>uWt% AAJ; @AAA= (FI.oFAH0 H)8%\i٥fAA Y73b L4a} {-33BHw!m+圯Gy>֬]u~uRLUv4W ~X(_ܰ.IyQkiZsrrmw304iqˏLbPյfop7k)Me! nA$"()i7))qBB8[ ԲV<>?˗B .bM>7ZRҺU4eb=#Gٻg7Jix/qڭZiԓ+V|I\~Dj*)gϝ;ut,R?0&<k ԖۂO !@^|s7pȨ d׳*T(Lgnj1+Uxx ..n3xScbͼe782S_}.弹թ];%CGڻߐ|d%ȷ!pCN_>|z=| əĄgy:::zY/7L2&Oп΍:s&-)1q4##M^= Z=zϋݫ  5 o1Co8h-9_O<5u~ZՂ_6vTYTPa׳Fy6_X) 8A'BeaD^a7tĭYiiia-uَf|p>m{_}zJ@ӴM7 ݫz%%p`8=??iᢖ-U8/ vzɝ;uhѼiC(Yf2jKoCc&?sCFE^j!w_G wiچ~ј#&<T8x%PQ++V|o7S kmTܴ̘IyCABB;U ٩~]4MATc-mW1tX\V`hF?Y|uj׮U349iG&o 2;&&*n$2#FA {WԭsE:ݻwإ5JY^_QJ1F)-MѐK R㒝Spv0\5LR~Ji._{cXu|͚6ᇅS5i觅o*${8pkj[!3U4m=j^ޯo5e!Xʕ\rEQɚ9֠AhusQTc޻n{'{a[[}>kΝw?j\zWԭX/:| ;>vtn]eHAiFVJ|۶+V^5~O;{6t~Yo]͛5_isʗ/nF) `A }zڵw_o.2S_N j$66FۜsEqkFVWzzzsr׽o˯"p'v۳Ϡ<|9yMF|'M|rQJ6"~A tE1lpUŲCZ۲q5ȃRGvvvll,!d ?1󛹟E&l[rԩ(ufVig*Wr?1?j, OhּukWSҶ +W,w7}q 0 H@"C^FW" ~.sٱsפeŅW  c[ș&_ rwɈF65wTcZafIQ?= aH%bI-L D[ءe͋  # E-_|)  H7BAAA.  R(x,Kjۢ+Q"  A<+:LցulɆjQl8XbII  "(AZ2rM7 ,K#"A)EFqTLY8T/ "pRwI/AAb@&X   %zA0="ȡ07oW !7*d" RZᇏ[Q# &o$[6-Vȉ  Hi!>&Q#:lۚۀ  Hi#!4j)UDH3rfJ1؀Rh_&*x*xW^\ظy;"AA[oјJ;~'hVL矝xIqGx^^^vvp5uNyྻ`]dʋ:6mqug&>>[<=D rA)LܭL@y]>}fo+8v;ub oU)gVJCdKy]o9_'W%ELL&WX!-豺ƺr%!>~>|d# uŅEԨQ]`]yR!XW^{WSqx׭[׺ukXvmVO'X'SE!O  ?B_>)DIxwnvײVTV 9VVuaK;Ujmvouk^RNj('\RJBFFF D ֕1Ի*x8p`fMRvaӦM6mСúu[H0 ?O\trT9)AKVp }[ׯi3IrٲΧxIs/y[ ֕ԓǎs;^g J#j ֕ w3xW}ue…?8ypr[nz&M4id,($ F*:U4d(pkoo޲… %me tx7jT_^p+))?ٳ>zWm_a]o׷XW6GL+Ӟ{֕_y~#\# H)_QF Y/^֮/5yYs r%//O$%&ʼnc+WbywܓzXW0#eg +/5kLˈPk׮m׮͛7oܮs`0n I:9#0bK9)u?Ə=!!H38翟8utj<ġJ8\ nj/&6mɂ3Lמ!fԶR8jAs@4TԌnnB9I1)՚KEp ~Y[DfqΕ4q/q8m?e 9uq]ԋniJ*F2*0q9pιxpBn[,ԯDj`\ H#,R'B lu.7 2Y~I𩅋ɴ8vcOL4L2?;9)11r+9#Dщn=Qw)L"@pn˿N !X;RvDr(vpл}q] k%j/@(},Sk Npn*Xι(X1&oF2qcT,Q SDm1,)hEJ)5:,T!;6+VF!ZJmfQD# ;r0 kE#Z8RJ#11 8*#p%Bcn9Eڡ8!^FZQ%וB[Z]^)E6yQ4.vg(R~_ eMPtPWup+,Rs#5u#Hb/}VR<5Fȡ"&~N9  Q#Ay8BodK\tT+o}m۵r|?_fND3> !2-8CN#*50{z:p,fZwHj݇#* he{Jb%0cx$p.G^LXéA"􎧡&51"ES@jSj5fF\spp; 86"j,O3 Wj=Essapԏ*1ckr)Ep+[)s5 eC's4@~Y(nܰfZ74N|V51~ETI؀&Zr>e[ y[tk2NUo3T;5-Ş:diƃPhi#@DW”h2E"0P#r1v[Ȥ"ǒ*f!Zuo߶mGvm[?#RJu3 , x0O4T?X+HNY )L疻11 `\ H?9f`VYg7ΣKKSt= j!S]pSpN1?\Ԯm=u(M > 4Уo @t02)`BVm$1_%o|`mt}Ĝ"6])iML`ČJJz{ L'Es^e+Jݫ>ecVeS<qMcLJEFqp.2R<)aSl.l8f Q/-ju|9. "^7H !8>cB  `AJa1&B>ԟu cUก"$-{|zA =H7psj@AP'BHѣ dp [8!F5i͙=BDuf#׆?rC` t:gY_gm6o=i@Nu8 :׏-ÓjbʱrzVnu-bY_4 DƩ\c7K, JZ6@TUzБ#r~:B)p.V S0KkȚ`>qZ/̚+N}>!ԙ8@Yo:l!vwfE•s_OP]LI a8O@jB\Aܞ@3N[22)u <vMXl}D;Li1ܕ31\ZNB8 2bAA"e$4\xtΤI"+6i8I8끍~ A])pp#PC\F%eQq)dj3uaqXIi$'@.g,}xb9̀fq>&8鿵w:ltL%+>~KA@$2]ѿ8+ҎYmY-G"@xͤOx,n.TUB8e}%f!H`jnUS㜋X=s oඡJ)|~hz3sZ,3r¦]/2Ÿ_q%f^mO0d B ̶lX^5WqNWٱؚz؇3eW9ƀeuhI. Ƅ5WT!bGƲgukѝAR4u!H5G ^C8TvdWJYe,<S/^Xgo6R/ Yd2!\M? .V`DLVH9aY:Hp\RM7\`v ŲdK-v2 \Bof# emنM> bG%^uqf>1c;eG9ldԜce#;Tw~$ˉgi?^BH]T T2r1ҠZh]ܸSb Pr·?9yzqmIݴb0ԬOrj%j5W ژބ]mY8cy]8^WGSdW޹myэ@b`;疕Lf[Ju~q@ž! 39WϬ\YQAAb`X&%Ux #?9牉/<;9=Ftʞ3!`% u vEG\n[H!iE|JfcP#7)[K) cD_d5x2՛9e1蛷!0.d b'0Rqf4 E%:6..q49GBWx[O8` (Cr'NsFq?5b!pȹT0fR5CwrǬ1($"3 #eQ#B?%f)kF+1F؟Lܧs^"0*(vz_2hn rxBTk, ()> )¥Ap] xQޢҨ]qP 6D"P*ι b-0;72tW T{K WgHgLMDNZ:J ^. nEHT&W߶ s|.. Tѕcȁ>Cl(Gu"j0(DfUO…&y<޹Mxi`Lw<ɳIP{kCbEi&N+̳@# .rj rqJ@N=Pn/%Sylj-~OLaDoC3Q X0_4N @)  4 qs41q)Jav%ۏCLUi2dծsQ#NM SrkE(}YCPgq&DG 'RjG0}4`{+M-P}ү&zjOK5WV.KQ DA,* 3K7sgEkrEԲ׷p}j‰Mo7 >q:Nc[H %.wGʹc2ס<34?f(T8SUV&f#qXKP[Jbrt8I5B_{6'*ۆAߙ3qB%TIk~`ߣ/y* ()\'t,)CQTm'яZl.ً[%]݆E8e%83}rB8$"$/%Vcܤ ܞ!/UW Tj\g3#zl%JP\ZeVYi\)z^ѫA9:ϲBJ S-|E!8e[ȷPvV l;G楚| ~Glb9U!a9+?˼t*3RȑU``V-9@@)s @WB8_cAbWAV2涤lC~6Щn>˔RqqgWDqcQxG֌]D:Ln@w]ՏtV cE-!MU͹sdM8 $].Mp"IeY(pfmb:5e ox"oqg QI-jlêT[-y ND`6LV'?@ H Y=pEw=3܋% K%Pz@_/¦{'"bo$e7'H~pQJ8,i詛=14W$f =,.v&&9-mqc9U P  (9ܯ8`v~%#VڨVn.4Ny[6% ř P qthU'X[C(U̕\tl"|D6oCLـ%)9Xwv3lk3QYQ'r&XH#Dx_'1crr,F|ʛ\MlOhc3Mq6fQEwE0hW[;w7pF$̔:!58mQǍ (>"%f'Iho=DgIt?=h 9gw:;sj&Mt4mC{%jӳpG)RPo(UֺgXn/;[6isU:DWsD.a5E'8#4 bq&O#TR s6lSԊP[XFXX۱3mL3>'7m7TF;T دVZڹ@ƨTJ72@o j Pʱ'{JZ^mW+e4Rz37>Akǁόu> Q0I3_WTY]R!cC2U9s] %#4 DlmZ5Q7D1b>Geш/1`IVj-u?<g@ěmNݗiDGU|ǘ\ T[ԯ4Q Yk['szcHVj[4>ZW[EDz$k>[''@[ .9%1RQ5h>!] 0e8#ԕ!DxŮ̈́jTiι LWthL5ToO C TW,\)=}B|¸?%8h?O䯄xJ'0Q"VQP#J[ a닀RW cXb ƫ+ }WtEtm /U:̄ˌUd+[H.IlI@Q('0+NJ(Dzz5=Uu" d?=bw6&b;5Qs^tK\5mu! p@zlS6@87ZdvT^>hzg[5Rn6 `f`{b+sʾQDjrۼv3(v#1>N 9ǜ%ʛjN"9i߹p Eu֌-6[s=_xsF 4 8Pl{ޯalF$R([x oq#\[y^%1jg ҇pqQ{0 :U[E.tX%^wW&oqsX)L>OXS"vsrqە!$V+Η.|pG[X]hUeÐIB=sq3 `2")ƶeqLr ʀ:Yac.e$3FH%yN,fIR Ld*C@JJv)_)v>!9:LKPדY(ȓmQ,\b .,95ZF \C E6DY#A0P"■bQ桛j .p;ssP<5{|SR8:dj"J]XCySIEz5<]V*8"5cv$% %% EֺT*P_WHǗq 9A {mUv bSHQ]?y"3QhNac]Jac?p}2_¨TIrKRMXoz}+=HˍDžjYyG B6ǍA/Un@u"xEӰE ѧL` -Ѐ98 h(ι>-HǦ 1k@.Sʹ|vLk?z8˜ul*yѮL!A H@m#F- Tms]ФE'[!n_bOYS)}JbdzLoɜ8~UŤA]l(3qb ǥCe9-UCX525E"%Jl%P.ov eT!^u$$A.Yo%!6U?\NacyU17g+Pؔ [7*F؅ARZ~|kbN6BTݫN3F(v}¸m.@vj'G>yls; S>\NI~Gp5#>XǵmxFԜ"0:d9pt\p.FAeURUƄxw%sΘt.-;*"GgkzZyc6a#5#X^C0VtM-ln2׺x[fthC%ˎFu i]JL,N`.,7VJUJg\reg87Z#ԫĖ-Im4TF}g)>lafr~Ewz=Db`~W#R9O?D,r"rZ}L9%Se9 2,]IauCA(9]JӆwTDn)qtm*+,&\CTroկ1սZ՟m18`_# 8"BHH$RxL4 #M"HDdD!DB07:g ]sd R^ `'\A 1>_ך?VUݻ{9׻jգ֪QUIŠf8%# EY6Tm-%(|-3[*œʠ?U(Mw[ je;FeQ jhn2lGaFtwљ6MIT}ں.4/ LDe-9إ{MjUk8s{!lնZ%0#q6w$$!>(4ۄ tCCQb4r܂I)C ǹ>CGaUG #1qP.AԤHGrDyGG=a>l#Lx,,  ?,w[501G5.]BTPj`{G@?z+ܣ蝶rJOn<:8D"OD=1CVL=:1hktPX X;m=40 ?\*mMKQ*Pu\2UƖa=3 1Q2+3PNЌyJfm%[1rD9pҴ'SLh8H{vO­yE-45HBD Ղ4D q uj  ɳa(^OXK/Y֘,A1Pf\j'W #L z6*?fV@~ %L|+p4f;OTv ZA);eZq8,a @䝄Us-Ul: u1;XR)$%IѪ z'2B}rɃ?NB @m$^tJNi`\'0)uiGvJ>-p(_9ťۆ-ha5wk'mrj>=mPv9dih& <d)dؕ*YzjE3'9.=!|)Ɠ<xB;U ɱZ]r|6<)DflSQ~!gid.ocm U y""tm'Sfh["nhhXcd0ER3O_fQ` <w #3/jZErp͏+(>yC,TIZ&*+IUr0ˊ0}/0bW{WHUi#NM]cm g`%-}*U B$@ Z'1l <> .֞|/hEz׎`)V)a7%ڶsZygdm̐UfE9cpjQcA -Q[AK 3,XJSۏ67#Dml3FmɯùVK]I Jdn璢Q j!(("2JV{;JNL/ɇBsHBF0# ,U 133"&Z x_"A,eDծWpa""z7вR+wtw@`#lUd!5̆ 6L;Nzl]TeSGN .|6el Uy"x⪱z)U2QcRC,1Ά4 LdO<Űc eFIZM6!2j8]Q]+pFay-kIXMLtO`4YNzDZIzbe(=;D_pB.,$^( /qfc›vYWYrl*Nx86̚ 1KOоb]^T'M\H%q4sy̙&744(݉Cc.ffje,)9 ]˸Cp@tцİ1%z@9~M84}(=G`QlC|rB>tKRkggf'Kȟ5 :r, ~SJ >1E%4VIk .s;H 2 &JX7[u{NB9{ 5B &4H_y``&9fG%2P ZЁx)*SK%yC |""R\x ] a$"O"{8msZj^;rQԣho 1#tATϷ!~^GD":#90n݀⹍|dOf~ [B}# Gveitdz4=ϳVeTHHۉC6~:d$at֖:B3]f9v́Ն6Ԋ5AƊT7L婵cY szwʁ!IT\TS yC@yQ0 ǣLXkʀY3O\HiN MM.髙 r0*۩qcV $|0ˤb3Q[(mKmQR Ť9͞(Aj4cG}5p$: cl>vLƂE~&2jt164qsSpFHtX ΂6m&[(}22h8aC9y^$'PEh~Z's I6V"N n]Ȉ?gEɅ Þ"pĘ=Mr,az0a3L]WhNS"ٵwUNVbv<}MvthҁK)!D0~\a=1 rcDŽ֖jqo|&lOa,8`Dn+HaUc> JqH,0^uF5ϒp::A/b^0T g"7ܟKUL6ښd*Ǻ b,tg6J@qQkV0m9Hkk!b ``zhB-dL^BDgO ƩGwc4^N:_FUd6CmhqU)Oc6Amʕs4;u;Ӫs UB%˲#9֕&tl5TŴLlHTT`"Ee-csY+IZbq {$qw>\%oqN['U-XV{6 @LTKE^mxeՐ:U=+U"JU#@(TV4xˈlONv=P! ǡeyze=Y]>J&Ჯc>'0 ؚr4k_3 +@=U! hbH}Q&UʪnvF[@v?,UeWhF,?i),S2q5bJLJ'k#BfٯD~i>"ԅe.2&L^F'0zI3O=Dtj'$ddl*ŰbN+Q[;9i!kǎnGmI~?;f;׹木 <ʺ$a2'kYBOK|16H=1d܎9L8"RI*ʹAڃi )=VĠ@9КDhd(Js!OFH*ܚ޹X^4f$42 *idJ6T'9(:0W.%XIAHM₎NƼ٥{ٙ  QBz zzD6 -oVSskpfqT# [ "v6g,wqCB~1['NXHDd&͗&qz4o5Ә L,뫊1+ k koѫ,'K9zȮ@W6-6օM+[)\.u!)ncN|0f%1a37MVΤK0aqIi/:HgsjKP_ћxz0=?D@%NO+J~2su b1F# #G무HG~x7p RD$Dd3<@pZaX{؄@ax"r`| 'xfL4U i6U0rJi0Iِ(.Dӕ!$XJ%]î`6?N癱 8R@Є6Hұ87A-VAK6OtDY=x8,@ *^v&"?bkRlʐ"5TPꙒgm:O PrHKj'#k%k5-Br-"Í744sk26bq3qxqCsREHyEO$)+ӱȨjZ6N962c]8svz2oh~(kTKYCa/q(%|_\¢)TJd[WTqj&l5"e\?Ԗ,6lU)ELE(iKf7(o厨F?zh$sEe],,{OFJ!.w# 8v?_22ux>*Rmfmе= ]0/CI<`3 zD؄n#)[{UX=:Z9CjY+EPaҡy'F~vTDWۋJm a9{L& zsC0={v{Mmt>#i[Z D#5Q#mZCdo sG]6 =)W@IaU!/o# %\fFȫvz)$#nB,*lr{3Hh9AZ0[jB3WN{TEK{8I503Nq+f~b"-?}`SBF `+oN ?hD%.a#c_oX1 "D$ )hvWǬϏPz*O8 H-S)744g݂*sӼJaCw x3P8{/9DraGY 4gnl|yǗm-D"l(5oy[d1 [& 3lzY}OULeM溛'e`%u`׹~U+{jT6>j!qk${(Ďx&YyGWy`aiҹjE34N'!D~b`LUes&)Œ50 8H )Zd 5GFey^ejFY |,]p1i-%mF9G<0G"ȚX8G DDOE?|9l8:6)2!t:%!yB <mJW%V`[,x LxB/b G;o|X<<'3x2NYzEe`aQL3q]RZ+x0:PY;,O^jm&+MqZ&2qG{wUDvV`zfMInL*2WD rU)`0:ʜjOoXK2?(:$TNXLu&g89ۄV@l5&w$}=yl3sS,bށ%|KUw%hܹ·Jږ\(ܞ΋]vgt-` 1X_h{"G$:H |DB: #7C)XPCqᲉ cOaB$|y)v6\6K_*ԩ' 4- ^]N}pHӠ~(wchxBq&LLػi۷'퉒>NCʢze eAIoFU]eDQKߕK?][9j;[Sf/ dz ;HǮCDul^4og\z= >ı_[zrL`b&O)Jhn̥h2EKg@՘ M$S>pPnbГja:$޽ Ry.yH3.=g \x G΃]rYn?ӘIet]ba{tk#:uÈ84Z ɑfX򭉘l>ȘńQǰ8MDŹ؞&wǴh} be&!>ZD Is<<2a Rufsw,0PKUUDNP hl |544=y8 oBÖMh79x.A9nH_˯{_gEt֟kAO? w< KF(GZ5t\9 clɭ`"? HNLwH& .3 UO__zL vq '3rq3xfEpa0*P#A+0>͑7O1f)vg;EzTm= [9@x΅z J>7H% pA.o%6ӡsxZMKz)_{+_-yʗ|;x7b䆆=i%~nm!4X0W;CkܸLLrrXV/&:Jj5Pcg-FזN kY[ v23ղ7%b'*d-UBpaҫfK /5cP )u .DFշ'5 $@pFǝlOX3/pPrcYIنǸ@744,0CmzVs2nrDXUǡ53]"Y|Y&KY*U> B=ޣ;t_:'@ȳ\풅:m&xc×)s RS)?PHu>(lj$0qٲXQ 3Dt֖]]\A`~=P^ӨmI,֣';LFar#y9^%}=A6YeYo^vpr.c^O{pxUZH<Y]m5VəL~sAF %F=QZչ.fl*OE"fLX?=rr<@TRm`Z 1ˮn]Sl4%,̿[L7Μ9s>̙3'N惻?$~h<>T7} 47{'cxlT L32d1h7?` /`oA=c~ [[J6y"Ha},D$DhKF1vh˵Uݑ~.vl2<:iQڹskϝcr%6o @) NJ"Gm_Ĝog{o<#֓'OPٹ`QOVJO! _>r/X.D|VY8!ԑp=8%8>JR xHvHwɥDGi5=o#"5= ud @uDDdvF#yr*!q DwY\(cT?^74;v3X߶quۨ [\JUk_oyYD09]f > 3_:Jÿ{9t܏fxZǰ ,K#"ԣ'[cklʊS2Edz:eO>=4wKԗIӧpn,ԩS$8!W%TJUatkEm&wDmY/z"ԮX'g59hr\\͜ZL @RVe5y"0slM}CSA# {qkܖfh"; t(Oj5z}øPTxYSZKs }d q;YI\a-"7 $!D\¯gk-^>xpm~;'O[<'N`J|) 3fm-cʍ8cv r4 :Df zR{T(J,lE"bsn9VZNѠ/%ϖgvuF[@;**)W@nh8=" F*a{=&9l;~\};]t4j= <w:" M:GA@> r)⊩"wًG d_0]7F9'ƾԇlo8o"ZoxZ`/2k[e })g3AߗZn{>$̴qVx XqBtcrGm44*7{Zmdh{DtW}sqʙeU]G *>,h B !WOlFzQTx74#v97ᗒ=OET_U8Z 9!S< BپO!ۋ'"Ğed22!`NHh cػ~5_1{=T`D3WbZEtCeMo|#s˓'ݱwxeLG[KĠJw}<*!&{lq%aQxONDD=:JYh\4 i=yId9||4pNaKpg&Y mֽ%];+L3 6 c?2Fr$k1;,5һj&̲ҏ#>sw*%O_pȴ5[Z$Na^ӰwvQp1% &gٙۆe4#+&ؾG 36-KMEB[i \Yȱ5i] i AU)DQp>dOk3s%9w8fUI0fIL{3cVq7+L 0B*m@[aˇ&R_.¬7|VGzG龔.ysiӧySNZ)N ^Kh澲 V싑KO:؀Ieh/h>l ;fE{m¬iϜ >cQʒH axO= μ:u6[x)4 pC^\Vkl\,]jZUGJu|4lxꆰ7xf>a?K{.P왉ؒm6 r`nh +t`a<:ujOv6N<nX#:,'bG(ϝE3#E B8&$QR&΃@U8FJղKD]zBG6 KE"FSd"R9|0Y;` ۶oLܛ #3֋u,ҝD ;1Rne aCvyw %7`h.kL3; _v䉊]h"]\CiS-j s[1c! ?޷z a@qfIa V́"UI"UiCZ\L) Ǯ0X!{&@@ jb 9CVW ~ѝᘀ=2410dñMBf(g5 ȷw=tl ?u |Ђ86Eat'O< %x}, V$6}Yf֩"2t3 2^sϗ^.Qsb ϓ;:}FdD=u#p`.fٶ!FmqʈB8zs4pu231eNV];ۓ|κV\#z7۰A9DVCw!GRfߝ@iBzVƚhJ/k7|S[ >y7߼NS#U!t 4/2ތZeOV$kcceCDlb |Hݭ]Z##t^r`G^-@6膆rY$ m _,?~)޳峑|v{{9sqܡd[-P3T{,zzu&"C@~ZHC5ޛؾss059dA/ 뺮x=:,2#,'C/4 pCÑ`,2 a{̢qWƆ84Ml ӱ% "!9rC#bN/XJ"sƚa d{;1@k=760Udm< 2~[ 15;o~t;{0[sBL"""R/)tdj:{"[Fx c6qOM?U7tuQjg(s2g ұl\:Eϰ@D^\ SF&ol'${Ĥr}S! ;j 7CyqcS0wN| hUd[ \68@!{ff{$ŬK4U{/ G @cY/q7]{vAG<_Fа# htiY,DP?-GVtg%-+sTBFk|TA҇'9IQL5KD5r0j8r"Bh={!YxCP!}֒'/&V4=n*vPeTr`0XoCx<3!3R&ƒמ>}z5'OUuCxo<}t }I# i mz kpڳj+$9E /uJ:3L $[(WIT4%úߒFI#kRCha8앰i"sbSEƓgE&K`%yVor&fle ̐>ť9<ʢ2%8=*u&xMH \ :W}f'xsμ g&Xtr`"67|ɶ`7<%0Zj9p L3 .tz6,Qxsgk/]}#WGK](IY zn̼sZy5D+pCCC l4wp̲pe Gώu ARiq KLIr8XT_.Î)aj@Wo.UZe~m"&W'*%%EvǼ9]Y5pCֱƋyH7y*K+m5MYF-¬LfXPϹ[w IDAT; CrGH6;?k.Z%2qN ɡY TA!UJ|lA^@,С_Dtp4_IY1Puz~gi|0쁃΁l]# 6>}7ў/ [+mPȇ` !'>O5$f^ګf8+;fy=Q<{ |FCك62Ե-p%ZV,+gOB#k;ll6tcZῷ~ wffʖY xoE0ud`1:F=*[e ]Z *sד`h'o(oYb]&( >M_ELߢv~̨f*]b1Y*ቬ`pԩnn^ @S !S=DDo/y,]cV{5$epb|Kt ?;y/Pirp4Φ ~OqHȰtlh%cZsnaXwm86.yzՐb2&9hb􍲤pTqf!燚2<:(Opz=x9?E,,J SY0cF9>4DՌRkWA $c)@Jin%< 3Z6@W"ҾaOMU6phlc&LDfy0jb5%s I74l LjnQߑ0"*T 943ܐsI] 7Ô.ČWg݆iC |\ZsED.ia]"*KnaV FxHx`XoY&q-H5jWV{ĶfSzjHSSIerE7Zo8r%TrCٿbon.5?ԩ?!Hu "~H]pNJC=[=d>DU3=!RS)BR Cy^ͮS{8`eg{"X [7& YtƌO,/.vbN憜"? )iMolT˂ ksxw BcI 2&)P>$,ƏN3>J6iXYhS̒q>!"ǸF+ ߴ<փ!ce h%Mtp $0y6wAZbO P$N`{ m$Fu)~8 }ئ8⵶y&Y"vu T,CJ*٫OA+9\ AKmBbǟRh1wIa>rYhٳwyYo5{챳gϞ={;<<2*c{Ƞl?$9N:YBEFjUSS8LNP0ܓz(ZA4N{`KT-̤Ȋ`u`١&''sLLkUNu?*~LneXDǑnlV2 {{Iq[2b+SʤhZ00wx̴[4S)SqX-.i+Dzykaў`4'Yڭ[Y㖳6(+39r".5R\0 ޽><<xiO{u]=O}ᇿ{ַ^\ySd{>rΞ={5|~/_}瞇z/nZA{+_ _—~o|on /"9s2"Lh'&)w[_HT[QzڧN(:DX9]=@4(YD?%(T:Ck'dsd ,{7+?{C4 pCCCúE~ ]mh " _;$G}T>c7sԩ|#_<~oG?Qk^y>;;}{㎉VϜ9S9r豃w;%T3Ξ4U*:@9*H}?GtHNt'c===9@Mn,8H;yypH9 #?<<#yd09;nh3l4K.st{m9EI0cCs;1V~G6v8{FAEdyPűk:ߕGFi1Ur>%Pdt,2N8gL~B/& I ݦ'?ë~>O/}Co}[~/k+ַ5ݗzի^o~󃃃=y~~xַuxxuSi~ IDy?23GZ;Sq(}uhioUS@£MDɸki*1h%Yut-kFD$\, G4tkD\tT 6 2Vmj s{TJl$Sy'~BՐ#yU^*'X̭R_t J/') `,'ŝdx^Y'ڄyh+)5Wﭓ@3X`V`!gNB9RE'Fx,Gt63~oy[^=)O袋.WUozӛ>Ͽ=iO{{>O]/+xoo<)O[>sۙ3gկ~K^rUW.쪫zғ䜫ۃg>]tӟ<)-z@?9z SItLcE?QMzxdJ|@: rO[aR=,y>5HI9ӪzhaL܏DΖJ$njr($/wOPal/Fʤ)]!QuEGDc| ̦;W\o TX"fVȂf^hp8[FGOqC̃Wczu0,;6.nkGGK__}c{^ y睷vw߽rM,D|_׾Ї>c}~ ^\C?>~vWU>{wqwO}_rαιz_mvw眻k.8<<;뺋.ꪫ]~W9yg>gg_җZ]=wug?~WK/r]~ 82^GQ\} Ҿj͖!?jo%ι VÕDDueYj>FDONh88@Shݔ6D# ہ  V0(?ϱ]OB93K*I00n_2zEfE7*~gq V9H-5V!=톨S]A',|JUnެ0!jFF0,3ەLIr>JPB1Oll7?l)袋ʫ'<|'OO~ٳy{^җo]z5\W ox^z _O~/__;}'?wy뭷ȏwS^x߽U_~/zыw> O ܕW^xk=x;Ί~eoH.U ) :@*&&\9եQ H7u=8>g6!+ g_$Xݣ]=R%ӟ@74YZXWEWᧈ|1)bے2ƯOoW|O"U56X u4zƔHñ̢Yv1猘K({P_~*5<̳ϤIO׿moϿ/lx7ͷmG7n'< wu}g%?]w+_Jxԧ>W'_ve&:x-j+ʄqJA&mD)W=  'FBBveku{0;s na1LR& ' I&!A(|u]N:0t:niċ=lX%,I/nX`ň!1b!pՕ?^t"JWu 8 vȌ]gX`y 5S1"Bw 7ːjj+E@-9<(;ѦTJɈT0R T$zIn!ZHnjTB&'=].q )5EvYfo~_׈ꫯ <:;%'=I]w%\x|{m!⥗^oo^z鳞,+_[nsO~>mV ed&:n馧=is뇭T͈HlaueeqlnTqр)>F4|{')^= c)_va.:MG\f;"z1hFqNa%I ;3)w mt$:Q[eж1ƊAXseT8gîsDFVP7Y j̜ :(Ρ2{ PFe3@š,,0FC*15ə*vI^|׿o;>cwus/|_o|_pj]K/؎W\qW_r%O_?Ovg?٫/® #t2 W+0 F]8@DxKDHA.OyvKInb i,Cg~i@12dة^?N˷vR5)LaM旼?$i;*SϏ;"Rnhs$ոs{o =~V!CsuFVHH(xvt08Dch9WӋ5eO5sn5|JJM%[IWfX'Ii!sQO_T_rv$m)\Cd-޿:PtD z+#pU2RO?7f}L0m'U$ Gw,/?g/|y=裏~򓟼^׽%/އt2\e)pfֹ.{ _W_}k^/};x;ԧ>}{M7ĉv]w~K_)L6HϾokmگڧ>^xʕ+W^>˿>?CxW]/N&^xi]ךe2\|ʕ+y衇/ӟ׿/||ꩧ~衇7nFUU~w~7\2L^F/ޞL&']]O>˗gիw`'R;7؟\%*A_65‚wBISն E5aƖ! 0bT~k;#= _ž` IDAT7M<X/8G*/d8ǭQAX @M+-~%ԥ[ %l+YJCqxUeDp|ng #8ѱ+sF" ?D9%AmFm\vÛN ЁV`\YH#s):M^5d|=Π%N ^D-\jDb& g@_4'$%Jʝ$O=x[}}kkkO>~O*S~/G?ӳr2H0o9Mq=uBtoSq e#M']~q7x"`dmf5mpFj"-欱 nS'ZIhh@ŪAުX]+Z)+:4?/= ?S/⿚=c$\ L%i,N\X A iK )@%K`k\XE~:rx.ϝ>;q30ܓ9S" B]10MJ "E!*\,b (Zcn ocbh Hz ٳ] f~͛7_{'Oqڶ7M??뵵;9}hoo5}{؏t:δFGyk O'N8us{l+??"~ "ښ1pT>GHجN˰Xcj>>;@~elAQcX}ەu5Y*08*g8 @A+Zܲ~u\9O)oGnXDjSTE$LiSqNd-ZCDh1rV^_BlS/*>|Of$"j#VZ >{l8h;%%?uf;=ۛ&P>y\g4Ɠ.ZL}876l[=` aਝV0$;g!$"Ώ~mQ"IPi 4@ t˗ĉrE~^O,YrGT {]|'z̢xרjg4`]'RbY 4,g$m  \i5>HHe%i=@neԑa1fgZ\ ުXo}C*|%/~?gw}7f("Lkv5\$})cB2eȈQ 4$TL#IPC5 FBcpTPGBАNDjAFDQFuj椆.E2oĨwzM+%ebeDLk ;MH(]t𣤞5dv"p S:y4s1&T*qLB!:!@s.yza4ntCQz-Dj_ZFG19!WQO 9P!R n o;vAo9Вx:]FKX#AƐj |Kd"XCMRagM4ս{UTU#ů!3Ijq:ը"4uk.5`WwF+Ib1"T*v)aFX# U8y4n08% 5YZؕ,>갸E7F:l!qL;י XokƕU]2+cοˋg$"Uwt眪STEAeu$&N,JK&`-1xW-l_s;i_r"*TA^"(޶ iKyqx$" V9qavZVFbf巋BL6Ωͪaړ-$IU~0ȶ~$J+Cg$A ꣹_7Z7X}Μӆ]<-C[7AK\BxF5qb-ۏ5ElYCO9>ggsg/U_NbU˼cXKO]$:˥6Z(K[Yh^v­U+fe檈?*Pڅ(\Psg6h7#R=SE9|Yd\.}b:kr+"[2CٿN}%DNjR׈cJ  7"&h}je/7W$ VPw7tdLٳg#hҡkj쟠9:öq0-+jⰅ)sY%p!T3fq U$Z ^7 Dpb+@ 4P b <}[O?~fE#oM!XM)# ̚g()NKR`2)bռҒ=]I`@( K@gDmH W8ZagxeCA' 'RGȄ$bR=sn;C_<{`q"E-E2tL!.Je$ Z}ep}*MbZG `PE\CgbqiO dh=@/QO_j\,媪&{`+L06 d(ļ4{?S}'"5NK%IE3I6x1NYC{NEbr|PŨ\ꩽ ?@팇MZ.D݁s-$fe /$yjrf&}%ؾ7xJCD:;)o0BRdAi6C,=wĥ3g ٹ(j/^8߂hgN:)jQU (NEaFpSzVԧ1eԌ"~+ve4je*¸w֒߻?wA uqWsrQVwTZ \_K쭪5WuU _Y #IK,g nH_.ty%#1HY8︤6aZ kD37WIzoCU3FSMr#;5.2H[᝛x-+I3v-^[%{!:4LcLWMsy@I6 j^SBVZmKVNDT*m *}?}yOz^z0%xr2 VrNN'CkmeB:OLHZԡnn KN kS;F0wJ0gzCiVh&8(q6/)rʙ?GΟ??S/&hnJѯx$X пqGxh5CALwN%1[ nPZutz+O𻾏4h(m,+L@#g+y% Xyb=*\ͫBQNO%[uӻ|O8 OoksS?cs:h/\yܛ"",NGӊ@HZ1Nk=KU/=op 0]J5Q W&IǨYeOg,9Jqn$(jzn0wb;zD#%mì$"p΍*q68!;o!xCMx%{5#\(_XRьFJʤ D*@-STC舉*UT̹G~3:4~ә3g.]tYF+&3c.+q2C]a o+); P,L"^d*XYNWs"ށ9@0!`a/`fC휛!BPU wxF4'5Wa5d" 9!<4_; xhn1=8c~w>ɟQ|5}0.aGD )XVYDG"c7 E+3%3QRKQFp|/cQzG8D#+td"&&B !/NC2vE %UW \1s-U dO1+QWƈK xk xR=E78P.%_'Q DN(+uJE흂]ٚZbi"]"hk$ OE=BjuUlѱ`zŠ0ʿ :ֺF/9^zrٟ%۳LQd~We= أow/r}$qS$RW@Eikbtј *g"&G I4CA@LjGhюa\Q㯑<17nCRrHSUs &m KFjG87'ffw%a`ʐ0bCoH&Ic@bH1 [&_̏c^E埦Bǿ )Ip헝EdLvfee5 T)*_"rLS ?YtKCW8?b>=oi4'nMfƦ?A[/wVe|vתt9 iw_ Tٟj*g셚5\~7GON|92GԐIӈ$KFc,Yho#E,QG'uW8qW5Lf2S^4[$1u)cX<߶L{@&Ac -T\$25:vh;uSRmq*K[=8Z8WonrU4 Ҫ5[2#- wZ&,mi^v䉭jQ$;Oh8dhkmi->.~zT ZK8M0cb[1|+?BCIvސŸAK0KA-d$J(8I뷽ui`e | v.@8#%٩B)_lq)f' VםIS!Vݤ>Atjŋ/s ϟ?@o)ylIZrm:qvk!K\Nf婖H\US3MbL)x 9Iɢ߄`f#)|t=7\<[ŴZ0Ђt i5Yia.e.Ph6|[O?~fƃƂD$:ԟ]~;2CeU_ aaVG$ꛔ ̨țXODĤNM)QmpHyS6GvMxR ,_6LL @RZXkr:l]\sXYE`$zѶo4L $j7^&jP &~ՂzicB_"tҲŽܹs1Wɘv]&e]$-L VLh$OveD[z@'E8dC Oljf-4_qKwqׁͪ5 d:UmmDA<@ E@-L?S}'"-VHb@z])$%ArtA}cB&ɨr@D @YEH4RkX43LsӨ$y^@ϳ>f$IVKLMɠEiԦb^EVfy0*#emRtPϳBfٝ.uz/P)Z# ST'U<# HfhYiJO?w3gΟ?3f(*~G1c.jQERE0~3H& >䮀 緬X*蚴OvC/M7rhm[a@׉8Q0wE$qOpG8I]~,|Fۄ|m6b4^Z1˪V0 1@կ)fm3sB 9T ' ya[kY f^, /ʈTO1PWےL ʻ\%s;#iA@&@<-YBx84ɻI7]m UGa)w]GU;ГȟH@G'F 9X aG,-I [^V"J0{~}5 "[&jxmg3gΜ={u.^SY®b} O*4A_V(6;=pLtؐtMK7FBҠAMBbB]#"T.,?0!%iщL_= h[IGP,KG}eZ9s(E*fyJM*@sz Bz@}t6XA^ܲps OGӑL1"nA54 ؉NcM5ZCXH.C421q_{lҥK.]RxK.;wN턷v =ެq\=+5e .A_ ǩ:=43OӢL?;RmH跐 I(TšGx$5ƛ5%by*0* oѢ4^txYJ>ڏFUYhPujJ1L2%s,,6Zû*㿺_;wEiUA `{{}.\8s*N_E aS3^She[ˌlQŤm&5k t̨ 7l݉wl=U.h!ڡ \-S\grO)Z\aR~PT24`dj1+ XUѫZ3@,f6BQL:|"Mv(X g""+Y% *2Tm@-A #DTa'"`"l'G똺(/7fGM/%AsE  2ȾLQЌJ.k2H!̌Gvx0Pܞ-]ÓMu̫fnj gmSW>M fA%MŽ6>η8{"dͮ`x[UC_h¥nUQpײ|_ra (E>4lX %jjPf%()om8 kn+LxcFI~V3mzK%zaRR>W OLiZ$h֝'p#xGTa<# R00 sAr^jA ֽۈf"Uaɪ)XNQψb wԷYUɨCΝSgŇΝS(=gbGs"VxdAޤaR`GقnA"70 @d"-ؒe)J{ hP4z:r__.+g%-]>(4.^6lko]^[jPk "s^NVzp6.E.muըGi-34{iKRz>!|d ~¼_(Iv+dK@D~3D|!dѲfTvLqAv78E~*Vm5(s8DB[ A4@N4ݞh 3nG[Gqt%"AԚ, fgYdZ3ȇGCOݑ7+xi:oW5A"CVo:Oo-c=m(,pILfk&~|_2}irGݵk7'hSF+u& (8 3=mFx=-kQBE _]pX^@{ =GN #x,0ճƚ}{{;"Pċh%?ee>.&Y7J&}v'<҈QpB2z|xv FRZtyQJJ.ȳy,WZ%@jz3ƮmPZTA/` H GmG$jx[=hV%d4ۜe{ -)g 6!h3xwݷPj_|vhKƩ[k_ ^lf'=(i|yi4#6<`OfkJ~ Ӽ-H=&D[j.(&aZY|/o=2G@Nn!u3Vre$ ] &jnMhwi9WC1kӢvUb4j'8(jy|9+` |:{zL.2<mY'TQ) J pTO#z*Q/ӆcRxSvGEƮ%iAWB uRgb0)h1'gњ`]~yQt8oll֒':S3fMq~6)@=q-X)+;34iw-BQ#p6x$_&4x[0#J^:ke4 q@Ty.TvE"aڅ[yȬ&u }pB=GK)MI"зm3&/#IYR s`*zMi(cED(rK 2:[0Cf&˱(/M!bu"+MFVm\vMZ/\z~8ilX R#lېNi4R_QTDI8Y}\-.|Wq x>u'~R7oӜ qKP'7On?ZUۊhW;A/ȑxԮ XCdU=7+gDCN[WG(+YVK$QIԏQ|eBGRƱ 6 "P̠K 3/ǽsXwʙ6jVj)o(nbߣEgq?߿;n|&W0ݷ{sooowwk87}8M}u"2>^sm67OmUG_?w88? 1Lvgfvbbc|l2#u`8ED$Qgr@ψFEl;ImMU]R~)*b^DkuAu_9# Q6:5G\isY]CO)L,ͶsIc{]v8&p%!ߊhE]"?e :mR()ApYÑۘ6q;bҐX>-="rD Y#(T1'FB)ԯvZ4gfka i||0~vJ@J۪4!n~cG(zs6;":|I)hB8)ORq74 ELkH,& 1 |-RX=c{!`?8 x6OU蓼q Xz#!q>ZЮع-X]Kn!>-9U}kX"AR;(,:/ZWCPOѐ5E$aZ.xRQu 6|DSBB@N\꜈ؘw7'K|#S.\8~R9Db!&"'qZd8CDUEwsJ.M*D'm!VLiw*T:1]ylF,2Fc1S?slXuTv"w|vS5MTZU9/7шw'=P>snccc2뺖8D3]zVjl+i@G W5Z a'T1^`&ɔKI[9=|ѹv|j0WTPsJOB4!0C78x(:lvN&)|c;U&5xrɄ)y";@W4@'ؘ%if*4?oGLVYHs-6۽5\ l0O~{r`liUZiy)d-qo{o)?g?s3'GC c\g1-aYDdxQ)Pz׵,L41KTSx.'?6Zl,,Q^B̚TdQiAl{ E߯[l'q IDAT)\hO~4<^7֦*iF ,H"E10 xY6ᑷ vIjըޝHn~sUU"fMј67)Dk1aTtR}o~~·oԐ]kT9PS 4 r4L{IfN$M,\WVܖҠ\N+ǭH b|(I%5BtyVq B5LFar"*T4m;ADu=z%Px'{Hv7)6;1{#9^8֫#T2$%yvV1>3Oߞ<<~ĿTޟ}?H{[].tVCH[@/y^Av;M "D$.c`Rlg3 yE6$@CԅM;ڱnvY(;~:f E6SH[E4cy?\<{^5IhQkPgop{jRv}0 s513 c(^7xww7>L{ݝt[[~I;v{v+=*/]2VS@D,Yw SBJZ'QFYvDG޻D2#L&͛7ww'iP13󨪪x<Fx\F5UER]&)d41moGr/GzK;j\I!ͦ4H ̷M6ۗ)m6.^e T#_j!oƌ4f^QZxt1d˔9{ۋYqoVѓ`5>g}_CKhA.CRP JٳUC+fNEUim 0 F'vpN ӧIZo+c'm,`*[Z`a#/ vرQUU#H\-*Gmj'jZoĩ5u] E)@`/I6|CvpU2$) +ƴ)\3~^@룤ۿG<$7;^m3zFӥbf@#e`Њ٥WȈC[~,nx672ŷqwq?W{t"k#\]͛7׮}~?|s|8ip跹 d]IZl%1Z~~ka Xu?iYgߟj4ߟ?{WW_7N!j=̮RJiUUՈ0#cǎmn:~|}c}mT3{7ND\ K];O1l![?Fͧ:Ɯb]h+^FB+&] /'pqDb8($Vt`/sHhY9&gX!+ϻ* z8k>= hzSKh5cTE-J)LИYȥTkrPFfb9MG^7L9IY*Tb-EQ&b?\ תW7| 5L`32KSi0SZA `\eh^oY]3Si|PzAD;0E]Co¤˓vpmMaM#㯼+iUUɳ~ƍj;Qwu׉'vvv@wM_3ɧ>=wξq=D`BDjAU혽3f0cooرcǎX_?}zkcmh4F3;@D>S]1L s;(63/f"O[r;"q`z$EtMzfSYآiF$s@8%L;/z ҒlᔫNZIT5͛=] >JлpC1]\^z}<`*E+p*4c,@ -+vv 0u5=Et`b}O{])7;Txf„m4"FBXp#^.<2*;6&DK UnLj!8@@eގg[vdí˕ a(Tp\pd*ȔIA!1jFċ ( "e*!2ͳa7b| IGS,ߜ#q>!eS-0,()8r.^S|,!-zW'_|hqݺ~vhx'O<}xju(З4mDgCѤ\GOK~n-yKb%o xͧ*(8˔y*J:9a[՜%0!8!Aq(ϼ}hA՚|ԪW$08C!~E#q[D$6e%+4skjϼSWk TY_"F3jǂ {2e~tDԧgx~xH1""BFIK؉*TR#k?ϷMCpgEHds"3 8 U>I>슁jjK^ކx<___;;;7oޜNׯ_hxߺc[kkkTU774t:?ιhD`;uw|CĘI Z^hٻHDdEZwCp-b bbǽȈDB4iQS^s4*@0)7*?MkquUU ~饗} U@,N0$¾xtnN!"ّ\"f^{ʕ7}wubرqU^z8qNO88!X:1yQT&S L0ET8p^ p <@z~C?"堷 kƅLב$'jHoCdHD|Z)9Lމ"$yZ^Q ir N*l{ m.D .Y Ş.!cSiA`x_1! ZK^NѾMv_2;vʕ{gooɓp* 9;^_T3iٝ{Ո* >7\ϩD*oMIA Vk25)dOب ,&|O&W^vq^HD ǹMb9GDC9Gq7Qf0)&k77;N{hDN9'Pt! "L |iPʅiN¹r&SKI ~#lψ̈$Sg[) B]44]y.c'o~DW\\tHU㪄-WڻQayIQq`$ v(-҆hK(0)R)).u(Y4q0 " "L ƈBD=2&tMSEo H\()%tsg[n;J+9 .ۓpŎ֤ ŧ"w|fĊp H@P;;;ιk׮{4vvO:7L&$F#v9WhZw]Ǽk!( EZSdP(XVz%!&z x7sBO~D3 5䅗^L&N2Icqs|? x#檗A4umIВ }fnaX *K7"F3ʚ>f*/2D1",]sRy@FgGFd⣚KV'7E4}rVW]/nMJ ' ]8|]EQ ߵd54ܐL0̻rџ8%e->$t9DB9#\71iLcӘ85c,h¨ :)mq~OkM|`x&{ ZvT4h 9 H6lgeyyi6kf ..LQ4p`g_؞JMTy!7vbR̓ZEav3S_&[;]/E-ANmysWMmCɲ}&Kdmm `sD$K-3[0ӓS"4F[~ĞW= _u0]2׻1+;` <; ":hB!p@ѣH[ZacLf 3\P…EmTsSFb<"h31I`e_\Iv6ysjDI@ hN[s(t`i10Ka"rMrk8hBo52 ?3p='eiLcӘ47Q,;?#DSPe8)YU_WY8 }PeœX.Gܐr; *7Bb .0l9oO!YNCzZi:C˝ ngFp<{ 1Qa6zDn[_^XȃI[chJ"z4[>xO]pYD4,2k!3c2`+P.$b@n})T!"#V E1XD1V'1D?1VxMmA؂RZ귥xlή1γ|1Vuj "c R Լ+WiR5?ԁ7dvH(`C2sv .΍PnyLcӘ41s-ٍ`$&lS(!nC>_gc$"t/zmΰf[gJMk>4)\EG@^J .=7F?C6SuІ }N] VD"WoVlqYDDqNUy_ }"24$~/ɸ݊$n'}™s ~/ڳ.ٽgǶmđ:¡-;IZ_wS+v=Yɖ'JQRci'ڭӧO./QB< ֿn %ʈ>1TV`U7@ꁈ~:P6 }2 IDATJ&˵՗{$I!I~jŔ [u"ދ8/)IV$/Num̤J)Db#Ʀn:n^o-z]۷ljkEPJltbŠ#ޘ&tX0<1iLcXIq 6AbCUP' C\27a|уE_EFV*bEoU ]$dlĞ u_u9c@k)q{ݴt *s*O!37Krw%2x*@ y(Na`P !xouo`OQȹR%DP`F`+~ P}N +r:eDB*~DOr]d-LLL^]]v'O\]^>zN<~qnnnnWW^|_<~7NZ$\_Bm۲Ǟhn@ "E)`6mkZ$=g=9]_],;]U[֭i.r[b&0XZr ي)BG`yp7Eo8ʕc/+w` nr #4%2ƀfubz؊;~9|T/KjLLfDD2̲;ZkL1 XaBK6݈ z岀 ZLڵ:˓Kw/>)ɨ/D Es,QMdHY)eS12}qK\]>Ǫ҉ &6;?>x;_/B(S8!/Z/MpUp{rsR41iLc zYz_>M<7Uoj5t rr7̮9<rsl hXjLԜ u`|<60`c S1/[ 6!["*aNJ0 tDmrr`cqQQf%#yaRP(001s!eʁ" LM_}mdDN8YJvl(`yEiw:q2|駿Ży}kGOA{n=1<}l VLJaH)xRq.0(=uM+~zSkzrb:bA6x5"s@DRfڃmvZEQ}f(Km$QZZ\{ᓧϬ4,Z+"֖mZc !5,Ί=N0 Qbr.={Tioڶ$kDRTUl5bX"D& ,|#saz]~QAP%p9G>-rEw#'o8'N)Xl 5cӘ41%rwe$A& .}uTAF%|3ws}T ( QINY18Ox8+@Z]\,o@w%Pcίs,׶ r=dҜe=ٵ (U4,S0V-W.X@P. KBk1p#e7,ۥ:b?=mŚbD-j1QZiViONuvE—~ugxo|⹨՚t; 'O_} VW/:V3VEHdZ*:Uٝ;'/}^o.cCO,]\Z][m p.{ Y_Tr ["b %K7"2i?=rO;Oo2QZkͷ1ٞU]93 *R$ÊD)f-AkzNIg $UqG3=: Zf@T~R"͔=`s@?%G$oKF*G65鞈4"onS+RVT#=1iLcӘ /Gj EG50MI;2,c_rq+(62\TȕnP#C^ VwKa{B~ut3k+"@1RMкCثsh[yY+sF sY LW])DUFk3688{jt:e;K^83NnL Kn`sh3Li5iZ#SSgfv]rw??x뇏 M렞$(U4MӴq,ː0~/UJE:Kkv{i~zF l vkCO%+/' er-bauEaaoOTQq0SY)6s H,6I>؁'WVSrj,2X,˜2ara7 ®;R쩼ˀ(xQ @RVfsk `ֆ5N#NLvMggl{b&NPK݃f$,Vu-V*Pͮ5g@,}tb$j5m_cN8x'}_?sۚo3ڷo{{}31iLc6$//Ӫđw5GA _YZz)]ŃhR| ulM}l'lT6/J%rM2l|`^ѻf*C+_ !r}rcJ-'q&(BMP#CGI, V,N,`C  ^ 2;{ɓ|+9yk;#ǎw:`#A7ڼLԝM@ƚ}KKq_ʽܞ;1-5Dv;"'Eb!"uZgYf2HRDwc?)KELҭngET;Tx H'&_?boDa2q E!wmRH(",s5ԄoFaRibN:C'NP2clfzYs9ԳE p1mk",ư8Fz=c`:8.HzϠ6>gMTuۺ W嘄-8T]ؒWAKwԷ qwQMxCVVav D̓UG3ZІMo!¥Ņ͛R?I^ʛ޿Ν;޼y޽{7M.oo| wԍӘ41'£ Hh t)zQ*Y @.ZD *(^p-k7BGi){SBjj#30wHU0`욶I :"h0Y…:c{QXFb ,SJAx!?~>t+)['059Т" ̖!7VDiӪbl5'x/GE}Zbk(ڼy~}}}}}}mEXxBEqK#fkuER1PcΦ\W?ï7L(]qY XƵjnn &^ F O9p YȲu.c$8x*""ʝ22A\PUH( 8cZO-sKj).slٚ$I?z `*F;;C Tb^ !ǻ) }7(L-s{ :?{]& gΜY8`M63=}~//&CǏ?~ _k_Z?0{n֘41;j<skLp*"|6o > h ] zS1sA;/rCA` isYBvz$\*sb]aÆaS/h W2=hrPc\QyMiԶ ]%ċ;A>'L/~01iLcv&$llV,$Uq4;f,GzEp7v=t4AWHþP!^pp"ld xB$P\5, @_K}Mvŵ#^eiQIȣR ^u^Կ,  F_K_>El@DE8,Ȥ "e# tj~E0[;3= Hɝ\w?ԓぇ~L(ZkAtq;"LNYҊJ($B8$M{^޴PE'PndԋQa\d`/2> 3W5̠zSG=)$5ն IbΌafFT~VGzi+k/XNJ)׋"ƻ$bՁ*gQ*X`2&KjvL RҖtmEEXę8M.p69@ X!5a UjsT4͈1 ~Cijejpݥl.oR[l?fcG|陗?C?{wqqȑ#w~wvorwcX7{:pЇ>|"{[ngg;N->w{쩥O;hZyk~W~y{n׾oxht?ƻ|ov[wZט41;"az "(H G0xi2D\$fa+)a)m"Rca!"<kf)EBnIHC C T`Ϫf/"R sFWU/"LD*Jv}$AA(CR\Ϡz@wW8eBT܄1HM4CdA%kXZWǨQ<~stQPIDx^p#"ޅXfn>W@ҤH~˅J K k_{eLo-Tc"0RZ'b+ZP#dq}':̚ XTz`Oe֥%MAF^.AEZ\jG cLbf˖9"%U#':x|a5g*$ɬV"R #2!+ )4AR[wL03) ZDNk=ߊfbjE$KMvnirl}4m"T!& ,Th)甞V,fjuS[:d{UU$ Ҍhi/`nh ]\naf $@ew"Ƃ\XTXpD\ 8G Of-) 3|o0BC7/0,V.$:sAg-?~|yyyiiO<c7Ϟ=7t]PR*ęhmmu{?\y{}svozӛ|I|wx;mm, w̙PDW!jOND֦٩sg{݉Nض8ҪŖ @d #ٹI<Ç:vCO,,KvU+֮/=K˟ 7s:>+?rM;vҵ#HPBf7|nQA!]S,2& c[Y[K>vOzIf9M`1Ǖ;Y@a)4;wR-"1!XV#`-<)q&ls+ŧI;ZMbfY #"$N'jbϮIvKM@ Јqki$A*EKskOQ Bb^D6A L]YeYI0~ax{%{9ZGp75e ç?_~5?_Ymz_cǟxy'''_{~+馛^;h3?3/}K~e)NLL>˿ˈСC?> tR}{=zԩ??y;~OOw;d[7uGD>}Ww7cӘI~ׂh*[~r:4+sEiBU5koў7-JQH&FFFo6k"+/Q JgaPW [ B~ c:-"LOEoU&/:{ r7x{Ri[45 Z [UQͻvOxc_g4"$I1)2b&I҅)+剉N;c=;=mv @$qwZQ; EJAS=kEWdtmeu̙3<ϤRkl2{/ܱsfn;<豇ML} (mXq%_1 ITʲ񳠔*,qyeCOxLɤhXelڒKM@ 2VU"D[1HGN{&3/ĹVւ~KRDPDB#։/[;[8j XCX.Dz6p9#ΒԤv"aș3l` 3Lŏ%UC羺8(pV]x4',K"Y"bX]0yFt~|Weo'&u#}Ye 7\=__1я~#/v]ݛûk6nk IDAT'~}|_ q ooWUzUW]0گ+_ʫcǎiFj&=E/rxaaaeeejjjtcӘ4o?z?!-|Y"椊%r\ 4*jg蹡CϙUKUAA1ʊ)c#WuBlG`R:l>eخc>rg`:($MC2 Zˇnv.7KP(OY8dP!q<߽uzd9sn/~ԙ4l'nl`rv*mUk;qwe~nӒym\X+++k"ﯯ҇ʩOOp< jpV{1 s5JȆ "KD䐰K>xg8 @Z[Er~^Ht^)bH)"@ ЁO틦i3p)+X@ V4hbT9$'VϤK6uU@6#3ZԺOS$RܚxU >pҤ#*h _MOm-?QJ9\n R(=n/1\=P݃A;++ύ#o wsϔV?ʏ#?+_}LGٳӟ?{}Ggqq~?yWVVΜ9㞯jp5׸ӧONNNiN8a m6m*޼/$I8~]wWI41F+^:s5pKBFgg/~tj\>ArC|I5vp gߨ% WP~ GVu=ӌBќg4h#0޿Uȿ:92! 8⧧Ÿ 6u hp:b@KFQ㇞uxu-Pɬ|0N =auj!@ 1Dƈ֊"0])woK)ؤz-YA"&"1l}elZ1ѾZVr')Jl2ke"E2-D %KPjY˖X%"%.o M݁L YP݊[aaGWYs{m)΋WKr!au!zկ\qvڵʟ嬀K~rR7|7 KKKയPt7C}*||OQf.~ڲeӚ/yK:??_Sv رc#kg]41iLa0I霩H/E M\șSTjM`sN4a:;#-` 9L9\MQ~E+ hP#Sdh3Ԑ^JF6Ӌwְ u0Yzȃ7Inp%񦘒EEo"(SD ?ԱVIrZkT/тC5*mH 3 M#nv~) vnn`;ܵc{igmp0Zt@ qA? P|0X D綨xkTk($9| gIkEyV~rJ>č7^wC^t^СGwyo~w}}W_}-[ݍVR.>+bbb/[o//~[oR{8󳦍>Ϯ1iLcӘQ@`Dt jPJeQؼ@A6W幱\<4({M K+vsF -(E"hQyW _^uΈXep 3ei P5KT 'n  @KitM,AXػ;7o$Co)L⸸9#~=\:>董'VUble-"3䑷+V#@GG1'I(lm;7^t-&-gȺsHΜ=y{ࣷ?`0#ZP(  bf B<ų@,D("䢎QyTʡRnKKK?jibҽo,P׬r@]#vjE!cfa 2[`A2tD{Й*&&c-[iH,2LY,mG!-ֺ肥!-E-(}177ErkkvcJ2 rq*|HC lpҝp^ \`rqf𫩲TA?o!Vn g휇R < :?^;Swyg߿/o$ѣG?^v: E_Www/w~~K_?|/_~o{je̼o-~< H# Ә41idEw _EDB(Jw1W,B"1R(ñ+EX@ KYA!) 83'0-g"_`n"$.:>yR"("db 8f)N,@?S QDt]c9ާf!D n)>"%18h9gshQxԁ9vq]Kn% *ouɋBgb."N"dv*a˙$*ʈbRRӘQk-Ҋt†ԽN%02&3(DɀXTB2"@@QQnUӴakeu31ujMcMM~<ȣw`܅f5&QJ!,V):祐ΈíY,Iګ654^uB 0ZD("\<YtB%ul(ʬ౓N-,ج)̄BDq/\}NB41{$D,C0J)D*(Mwv-=jy*[(V+ȔI:dIEX b!IvN/=xbUO٨MbdKNuMv+]Sg&'&vfM"c>Ė$qNJT!"a2W(T lJAF>7"„z9?kD$A bALeJ؋ n- .?Qb?P^vF0TD}`qp6yi}93˲/}n~ݖ}7G>kRq_x??O}yre/{Y3'>񉷽m]vYjZ^z//~h?׿v/?-[lhk.pLcӘ4г#7CDrJ] *CTgD ܚP()o 76Aj]jv`@%h:a׽!"`ȩ7 1'R6#6a7^ !Z!ֶLp{J)k$ZO0I䜳OPA"* K3!uB)m24 [)}%Ƽ%#*>i@97 xi)]Pr@a5D\T;R=)bh8&VDdoY* /CZXႛGQRk-ŭy'&I9Z󒄠[t DVhnJ 5ݳPIuLj"7#YEQ2ayk_Gr>WH9ɲ9\0yXpdYqseBHDetҤ^bΣaEIְWлZk%%MF|"Ě22[V. 2 q:oADBTPđj+;/vpGfVYU;5i`aa0g6MVAl<1v*4%4Nmr~s@+<$3ټ=^aCyu&:u쉓g^dYaE@#rݥkdAБ !DݶY^EQEQoBDEJ)\3#:"~+/?_W^k "yl n5CߕnCB/#+Yh"9sk0i723{ PZ:\t =hQ8#|y`~ÞMY:{D)%a6ƻf(XhGt].GF"<35uIwj m,H6 PD 8j7m(jD"p7i#"sE" >nږwh}.}H(?p2%y8`91iLcӘoL|Kߟ $-K s^7:v^RMƜ, A^jZac`Άi;+ vs 7KnДBXP6٤*q0ttsYHg* Xgdq(o*WT3Mu>UƘ( 741Ԧv6x@"BkX+$aD8F˽^I&VH#5‚lRD`2$ Eql DZNc=ﲋ5)kXtbkm-vGdâ(B1{.Xʼn #Ǔ$V8( xONm+;t̵dYa)p_X#!$KIDȅ LjmpzV[#Z"%| @fk9&Z#jbrF%f3Vʲs]E, tn6;'yC9}8CaŹLs JYX^'PjJ9puY|+Wd41iLߙt^-n JI#@mR~\&mɂOEDH aжͮ*o`\!|3TYhmjUa6ƥ RY% !=PڞX47/A媨4\0z]ZaҴ2!Ga})lP+u'N$2Ä20 ss j$DTb6d} sJkIfRERѹb<("!S˽5kшcfgg/ٽkr渜 sOsj(BQ4U(iԨ<5$ITF /Fc|;gh,Aok1cι͹u~o|\h%8JWkMl7t+e)7/Z+6t+&JUwi_ݏƒW-miK[ҖW@պ3g_t \cavkǐ9#N:V$n`NZ3)YYP-NJc5!^iI4xD9 $= 4Co%J \6O%zڥ1.QfɡIWn<)nY٫; \8t t {y}u1sP>EjJ:&vg2CyS6W& SΞ8qb" -rI G Saigw>c~.Map=eH7it JFh pe6fFnaer%pǹZQ 7 ).?{UG3дȧFZWGBxw|w7ivFS3v]'z$dE<]* C)#Pܠ]@0,@ww*\@w MV&_&g%I.7P.ǰ}aK3>XO1Sl0׮RnAD[n*ȥWi p{MBuI3((kQwOͲvL]AKApZ} 4J随3p|==?_tԓ(kX>$V {iYrD 4Xwѣ4֝D q5z0Xw77 -|3'95-$#2$N{+MLCeDx]ԑ}Ә`YHq+ N%૟9ŹJ\{X\RxK[Җp)IGRΔ%&ELf-S_?PK|YSAP̓&7^j/l:< _]Pbr+o="rX3)#5XѼ@%a=;l\U._rI"k 2&QR &Y*>:VڪWQ‹nx;M5 ^ ݨq'9bt7=sqNw>l6SCp8;л]~ŹNwړ>}`#O\}_s;4@l+ƪhD +c;z}[5K6*1Ʋ*H#^Ͳ]7{XtWӠZ>2*=i X֛ Mc;{[ (",,34JhC;UntP6AQ`g˚Tqt;[1B PD1C-2vX>Β,5[J.yIX-b 9ZAu8*B,X5Zٜ QoiK[Җ7jG9pd:rHV2}>*o}m֓3)'jB/qDߨZ{SbNjoA؉'.;vٳtÍh0'{axk޶;rqN&潬%GeT%RpwIAsh:I!DżS x^ ˡr(Kd^ߟ7]OpC&Ll`!^B""Lfgb%Vy5-h'p)@ٛcmZ"yu][{'3ڤW/rUݚDaxKBҶQ=+oGxK[ҖP4Na ƉYĩ-3IH< if/x׹UY*,n[j6|)^4R8\6TTej_u; ^0 A=K0ƀu97껛z%oz*1F,PB$9jic,F@lAc6&(^sm78="'B(4%!̉)GKa0B_"rt5 ^4P"K$HͻLQќntf8,B؋gv[ډDBDs@cLBA+0 ( J&w@L;{6.5$4&MAҨ;$Lv,x<+es)U/\T1= WoTؓ;H{; X=F-miK[ҖSnk=9J(VhV=D70G+wge3]6yWlA]@()2"ZY  Zؤlܨ\qڥi<߈-K-GPVpRY֪MٰR:ik\ Y|]01vD%!E 7\ xNFR4x40Gu6!Qp6mN;i[\{S>#r MCi?[=vmZzþWeH޽'Wɴ{`jnp*Y"|IUYj7eP/GzZ!Ńz:30$c݀FW7[)c#_s.3 Bc iN\D~CRk @Ct7BU ّfZw(*A жtSRF+{YN} \ 4Mkf6#!Gm'av(WNQ6;>\K>N#*Nz镅.'h -miK[No[_ene|6Ġf؁ YrlϚp_ΪPe/);X$SQ_#gڔgF.Go҄`tx]42≑40Kyފ)ʿvr(r'T/XULyk*E%Wئ)}d^N9 >i'T@GFpCyPR\i殺Xuc:.L$M gSY3QciHH:y6 m5.6;j:٣yh;w<=ϊ>I7=sQ&&t[R[Ga9",~ywQtRNZ9REB@[ugϞ}]-Y"9WMX?z!T"Ub_A;JLka+-CzCՓS) 2L13E! iI gfM@JBh۶i l{˭U0QMrBլna8cleΩ쇤4/|HE'_ͫ7 X/~z[Җ-M%AVǸ'UAb\{NŘbMV$[t0Ӂpqx`$EuY^fNe(٪6fPҗ CV S#yҜd]Y [1![9gR̴'1q/)Y}22ja=̐1&,R݃-"ETI^ D0\,sf101$VtLx ѕUѹTGYT)FJx>/:%dP@5%tϜ'.}0kDd{V=8IϦ%1`NsgI!hD7FӬdCj$uaF"" !9ߙ3̧|;몱6McHTMDEs͑'폹z߽tM;iU3=s UWarD FPu'%:Edw'Sa^5v;Ф ܊HVj9tV,\6M s;7wO-[48<v&J{q1*w=p'wQ/R1"dOhk Q`4Doe2!4%p}Tv"MRBӓ\TrV` 9TԴ4i'2R#/>H0@cCde3,;k{@Qi "e|5 C$Vh:H ˺OnɀCtڏx`d9Z$Wx۸Q "Tw0cnUle^I2? XZOq/үxַOHkz?瞓M{}蟼/?/-x˯4kݱ N=i֖-mzVH)0"_np' dezHөW "JpU(AX [ kۺݎЋKvsz5rEbV^$:Eoff`|v\۬b~gދxR',=Ώ \ I6ph[;d@\Lۏ.RN#`.ԇ%.ue{^ѰiT5-Ϟ?7;~k.F%D8RXg4hEnGy^)u˄џ_|xvb~^|݅S{w~ꈝw# &I>v-Bh&}.2,?o%<Hlirۋ/. M,g?ZbAC8B !Ԉna1[}cX9,*)sde73ϔjC?,é;<"%Y_i+QN=~%WPZGDț_Fi浹%uMOwqM-!zqR5BQW2 Dm>+ӀbO 9xWy0*ͬ1pDav5a7tQAlL <{;d/3E/9[Z8Г ܥ469̒K0++xۻ,)I`ꋮ;w['#ni"W3l<_O]K@\U=3G6WmR a3{:L{2:T/R%b25 ײ$cJV a2шJy{p nRΝcgNbMNKTӖPh7UvဏvCnD`QQjM$-8St+g 5@>Пw~w믿mO'Ԗ-miKTY2Q j^@bҬ*0=_v"5b҂CX&V_!# [P"[}uȕdnKattup^ܢ_f2cO wYcl|N^^T#ݼ%j?=#*YGBݩ<4AMY= Ca6I=I#/GY$d.!Fq ИԸ#,skU$a*{;MwbT33:.ff%:n ?yp_G %_̧Mо#5w9Q#e6p7M7EY_C \)ռ\ڐBx.^U᫛p}'lXʹ $y{71kyDfhVHac) -wnSl5mF wOߒH˼AK3>uK6XXqtJ2Ҳo"͠26wa6ѱ ECs6QlZWp.q=f f"{p0W3|We:=_~ ?s~ͣruϧҗ|So~w>7ߋEơ4z=QO~E_;/|Wz~|W}]ԯo~g}~?sox ?i<xԓut9?~ދkFO-miK\60 ~R, 9^cè~.;0VN%`[6דW/ݬod7ԁÆ2˩KTUy%aD+ㄕHO%`NMWp^"! IDAT S=,Sz,NہލMT -sݣʽXZy&y*ba??~>g:6./U꫾;wU^U۾bq}|ߏ>gfg| IT ]zի;-x7??;-miK["DCu4\è&^>\HQb Rĕ+#\|d5V`6O])AV;Myٙ“HĒwEU[%cggg"3sj)ҶPs-Trܺl~GB]$j`Ѵ [ݺI|1 2F5ɬ4|~nqqvBs 'a, ł-O֥j0 |J?zS37ܨ6dw1 Q,5#<^ T;3-4.4@c$BIaU pnq .n&zοnAqM2K1iw0sN!&)b^ϵwir-ʭQ1&Q_9Ga={*O`jS,d-z%Fo7j/y_p='oпFO{[pQ_ү!o?vɧ|'wk^{_^s/~g~W}{Nɯ= kM `2ms}fG?3y<?/|˾S?O7-miK[Q@0JVP'V!|qmT,pS3N7na;kwT?!k1KtӤQWgx"">ctӯÇ+Nr>s___{=Юa:&|XnqU'Nk~nK >Ba tuc7t|h -mCK( /kF$+}֌.OdCj̹xάtId<$IOfUS2%#\ UuUqp`T>Qn7,z=sV+lfz92j@>v$Ū؅"B׫h v`rwŽ2}2 ۺ[!Uu&1 N=y>]w-@/fnKHBafp 41Ly6\<-Y̼@2h׻v͢mh)bA[o5Qy !08fT"c9%nVUϜ9}r{s!T{;Bq@ %HP*'-9w>~w/}S]N;.S M!Eg sޑ\ <(HMV(9Fm:Bd~i @SSlЦfF6>:Ck)_6$sYY`~/nw_QAHjYm D抄EѦ 6~P ;"k#. YJ0 h.QBig[ZY "B^ /ǒn8xz?؟H$cק:NFq\1 z5t|HB<;쬑dljA0xnIF]ve/=LCVB'4qw7tFUwgPwiP64^]IIX^Oq.c59=yhF|w~{ fє;-Rw 6;34`F"8pfohRh2GdpMmC @cp-,i7F =GB`J]k(B`FX>L`s2c4\@곎?Tb`.i>HX F=; ho,J RmuGz!&\!?ۿ{^M/z??J 7<Ow}ƨ?ïX~S/ODOzn;88x^ݵ>IOl4h[oǾ_o?]p9y]zϳyNcK<<]zg>ǎ_۟UniK[Q; 92tA|ݤ<`Mw WG-E7W[R&.zThƔryfB{It8nh5V&>R Lf: 8򖴦g5V nThl#;ݚLŢ=fB#LjRK'255zGDJj!$4΅-wEc&ұ$ե !TDb*@!|ĝ4t1wтy4@4dC]I>i$nf ;~UN}UT9\ըwjEr% Aa>rʜT I+[43(~Y]y$KsV:(TsFL0Lr.⨦3Rì كAF 46+,R;D]2v-ކSنRmpm7!GoEʶgr%Je Z2i9B >]ZV_k? _g|~͏= nOxsUzV-miKs__>EͿ_ջEIF@! U[.ca͟;cDP 9P-!6]aQ`O1&c\t|zG4sFeդi&mSNlu7: 4baY^H=ԥmo)"2CIpUbe˅d{"gΝ^'bq@U`úWJihz)A X(:E43K1_h#04)%XRLAiUs5 NI.q!|;0La)E޸-eY='k˴az?7Ϻ2 ?q۫o͇d#Z%Thmo?W-]ӷ/=~߾EҖ->?`v5W>}拿+?U% /GQ8_n'NBPXF24*CLR34IAVD !z*V*K!Ag Sa~gi?@z !*ݓͱ=Mhw=4jpGj) /dPи27lG`F60 ȏ`ע&yS?TK{D|ojPB]q9hQ8?փN/.ty;-g^q]U7vf܇ =v3?ET]{xv?0.19!=#7n)vaHݢ MkͤooyM}DsL0]6l٨rOЃ€KQ(8X0 H]o˿>}`\=3=X/Y |N(A= Xp4nOcq7<ݫC-Ndg"]].*uj`ؕPsQ6:9ǮݻփvNۓZ+`&9"44dwd_[e ,P`%jظdȟd}5>=i祅.Xyv>Woሓt?ۆM0ONVڽZ O@w>g_xKi2z/{e=1l=*:'wQ#?kYW ^ڻ`>-miK]mۄ R*-Y]I& uwHWv]SQ*IlRaA 0vz7`T@a,;%hli!2(} 8E?:}B)5M,.| qHs8lc`]8jxǺX5BP]O@ҋ sHO9j9 һXvp_n @߭rԌu^LLWUgc"0nmE4(@ e;$:tMgHpH3q!&Λ{T]`nt1!($6nMӶI΁W?ƫoyս4dcF@IML5J -A03 gΜx0WuHp@1G[^]uaI NҍR0pv{L!R  McfIQ 122tH(*jv$0y: Uf6if2 ,9t9/p \^ZA@5*AVn,t<, }3Oāh9 uî"`Eb. H0҇}H>·}wst:g7Õy q-mo}^%(@ʒ\ J .(4h88"ۉ@p4XaL!H`u/BRfՠtX<11=cA߸W[h7W>XW6ӣb旌yȕ9%FrZ,fͪLlH՞OzL$C\:uj>GM`x% [^ui)sDc)sۉǃޏA=XTp†0CUu"BX7aJ3 "4L{ iO8Slyb'$SU {r^Z͈cnw;+Goѡ%qPIpI2|y GGW>֖=EoiK[^?t7}Ƨz,ŚU J2תٝKhC&)&6h}KMdf0kt]`5{DHMdnPqC?nB,g Ḍ-)r]Mfuf0=%h_U莌AFFY#ڡI >t VxTv:t,O,1$涔\tw~ Z1}[I>5=䆦wC' 1_DN.3aIA6 TvgfYbiur ,F9$7hD`" H&t3hM't."fs]kOB`]xkМB4r%a1bn:Q£H! p{9u]G7faۺ[mQu7$p8;^\AȅEf^ż7S!ma*n~i ݙz@h6H`Nv黀1LCph)"#oYZMM^~ە_ǺVC^d c#]=kxK[Җ1=7V 56.P8xu@Xzx7PVwx0s lsn"J"U)Ϥ?h^tփcG7J Tq@}SSUMaҨ{^kh}d]8ISkArNtyټB L{w7G7F~:%bd 9#ZHcM-)ATmw Hh&M;РVnV$ IDATKZ=%^J2j)v~^/XҾ`zG#?'A*TU4R-$F@h -miK[P_}}xӾ%_ '^7 BGUHH{ 9DF6RV4ac|DJ"CX%C{ݣJ~E#A#Ǯf~NQ =1ƔڨJOf6~pLpmb0+#;)Ruyr{b V$0hjNuhxܜԴ'YNHR?2Ӥ3AA #R "}bM7*b`sU#d)4C "v>"9\+rUK$ VFMN۶iB{ۓ>svoO!MuG}2HrdMLS ]s{ l=!pK` h1h_˙SI¬4lwz4s 7p 7DhۮmEu ;:Pd8}' XBLh֭$##MrB@ Ҝp̅ E`o$M-!OaMH0-vGXލ)lN_A9q*VӼ"PN`mӠB'aN.Ccn3%\ "i֛wjJ0-n䮲nrm}\b0҂%iX+!C>xAJI\ݝ)9g[=5$(՟:\Y.xg1[u° &TU{ q%h -miK[P҇?.@̊d7WER4@yeEVP"0'Y.LD.Dۋ8`ޣin6;nHdټ䞶ZYK(C6,\W"mj9dr%L>讬2ő"pi8Գ$Ml/MGpX, @IU1[ eCvR+EJ("b%Id #%dB.|졫s^k>czo^}ݿvqn:tdKU-aݵQ`v7|YΥVcIȕѰY3{~0kD\!> w[<e"A1-)6+xk=޺rFa_aMDZ{(˯:²f|Ut PU|I7:uƆ4i*!kb{v8w_rlݶvnm{{0] cfM5pre-{6lDQ- WzЯa&rEl{gnzϴ{%$ )(%33R;XלpgB;zPZ}B^vݙT׎ֈ&0ڍ>&|j:YCWV(?̨uqCרu}&@4eY=<]heo#d'34;_N|: 3&af8ooy/mNӘ3e$#;\D,5j/f(`f6>|oci9ki$C"@#  (+m}o>;v΅Dfꔈbpr})JK.)wK΁ _]xtwNEpä[}:yXd oQ;׾nYp.@p,ׄ3xA:qG}zqZHŢ8€$  = XDnO|o~7N1e6WQpexhƒ2` y3&,|rAMFғ@&XtٴW_4]]]/y3d=U|q,"n:}^c`za6i%Wqˌ̊bvE?3ٿqommݶ۶o__//yصղ׆ч:eMuFUc!N1;kJBݜ4=egW+˭anjZK'`f$wvɘZ$f)[Qg Vmq t 8eG3$0ɖy3 ğ/x/lܓ<2Oh_=VQ;2{- DVW0{ (fI$Փo,s,ص ׺j4Riqm}W$8K'92C%x>>c6JS5x] G^7[0RHhI{f̥D{l6ggg;> ໿~~:erIZ"~b]OX7MCSM%2 HvvmY,05c HDLH3 XRBQ*-erw600PD@BzrE\yφ͙`Yyz^`Ů]N<['9x+3c'MҤ,zS< gr.3q}xz[g'PU]a.K#UF%C^םx4zpZD]w~gߚK4AR=}`IAlͽvWS}}s{ЛCXE\J(l^}"m2G:A I̮ L3 ٍ1yMqz\%O&GHnv,[Ԏ&PGn=t= 4]o.wz4?=ot )RDjil&(3 AK6ve92wyP`K`fFfnKDGSl981;Z+hE/NXs7°'UzqrX >ިN.wn+rvnmmU{ܿkވٗ? py1iQ H <ӍR֟I>}_߱g6y˜& fPRL1R lWd"dŭ&̼Yd9 ;Y Zvjܜ=; Dze1smI2%n:ˍv{i4ԿԢ=/ ȓ?Yzdr=ÂjY+$n0ob a)07~/M=5ɫFfU )Hr `>ڽgÅ5" Do 0,j&zwNCLyX"*2"ܽ80Fp,n59fFhGPU*t7ϣ&Q  x~W~ަwd1`LT2!ڨW74O6D>1(+ED_kT}t"j>\opïhu`U~ϼ)D+sjG5jZ.Wc8 ުWkfbg#@Vpƀ"IRIkN.' v d  P7dcHQWu_!al]dIY/BB@nzn{}?0϶Q͇oqlj[}Iji$0뒼$;1 $PCf/kւZkb(z$a.Kf:T(PA ]0Y@\ۜ,!$9)Ŭ/#1E(C=]}ʫ{][z7}۷~'~O>~·[33F q6ᖐ[@ЍnfL&hB@) 2yd0fdkꓳYJd(mhAt 3h*$tՐW`DS +}YӍ "r*SzO۫.ncڸ6bhZbE}#¬j$h sd@4 4Yӳф$H;$S%Ro%ИJ¨P7  d0!Jp2ymBX23c"zbBE]vil?OKϺfC3c pI6>S&[lX}FE'v^4L!pk ͋ aae!4)%o!fM՜sKi`IݵyT w0>XDtnC @*ݫl X5$sJ=={Ovu=9&ALT3攖\9xtYhJ*+n)g*]dJ4"H2) B 5ؐƋ2&"YUsa+:o.G2.X XgH~_6%Q3c9&fVk 3110@*iZ{Js'bje2fF A\TVsoeE^d"]YA9*a^6s\YqcL(.f|r @if6W[m6>22VB*:Wy?0mJ-|ݼژ]Nkm}sHp0Ǘ;$i owklz5ar7YZݻg#' 47zDЂ̴eRqLH"R3Kb]xKUYZ۵F 5`ߏ @IjѣgȔpS΃<)GNEbER'=w?"Zkww6Lo޿[?v=qlY?}cylqP۴Vָ9;w7^ܽ;?KvF*\o%MWW5{fH2[jPWϹ68xyGU?<WX.UKue yY)49y֜)'[-<%Ub$BUa HGd-)J5d)XG43D%dҴnU34fiVDP UvfaVysG5N4ld2c<inZkB){ndwD/T)mAr<h???"Ν;ȯc6-TQjR(({8"U ``Y+U2K$zipGmw .&"$MJe #-UɄl}bMRJ2ĘrHU3 L9-z|sv3ҮS<_e ,~#`>;2R aikrv8Lb*aT7cf]޾m(B"`&ͳ =:P1@v m=Ե7Th1+82>>(zJZnp Pos/ =}gk`~+~08qǡ 8ckm~݌jm܌=sU9Uqy,aBՔ^OQ!Y">TUm<\vQr!M\lW߸Gǎ:?҆uw_4ilƶDcl6~v.#4 h(nrHՍ00l̮l+k fs~i*rƵRکR7?L^kXz֛Z+E%v`_3v ?\s6 ֢B_yd NK&P[j%2dYd*8L+͎0g7XzZE]}t>>iJٍ-ff-{<HYs7FC U4Ap0{= IDATǠ12|ͥ 1(IҬar^ VKW%ҙ]R93a= x,XILuw![zԟZLtՌ$ F TˢJ팍t#^1}P4yP=F 2UFST 3YI h5挦,R7D5WULmROb\%Ìn.3f2`LGYISH F<3mr i(;pPY az6Lj`PjLz YIAT2Lxd1IwW֜fCa0R0AVɲFdJl0)ܳ&H@ da$&':HHbEI2QÊ2Дk?U?~Si!N^c6@C\ʥ0MŘ3Xk4qX&ξWO#{e<{.kw隆LpeY1eg GҘ@r"I|W@i>L" 9de͠N3ctkw?]xi$ބ6COkLljh*?0g HwQYRfŐ#BU[QZ6pI0ZLbȜ :^G͐E"MrR$w~K5O#ͼ#3e6fPZnQl$35EXJ.B"$`X%D@cXvN^IZ @9\1qBd`RRYŪi. \F$?_@\!sixnC]QMԘܭ b!m+uLAm!C3&h2gfWI Fm z+3] Lb{{xvh-9l:>I0%d@'ɶ٣x.7}4y%A=݃."rFbwU+A{":LpM ,( ^5#;34f'`ms~7񍯽rw}lA"20dH>;+k +^zIZK."LkM5D*xv`FYjk>ׂٓ>مowc'#pkPq(fz< R@|"K޳戤o:tc?Gݶ9iך_e~ޑsdiф_R 13ȓbpّ{e_8+nk7hfE*Cg*k7ZHS&5&zP%yd$ܥ>ϤH';oKiFdiHއfF(oH54t"+K]>`@sw8Rzi6H+{LUlr) "ru[F H@5 * he̶LFCv:a &'9aff%]Jfv}N:ot"MN`(sA3!I9 `A:$MQD%0ٝGhN w/HvFXveZuQ'0 <3iK)Kh@wD̰M)Cf=bz!zMn$*l)LYU ipJ?#Ф&1Ao*8*Řt4㰄闘WLMO LR`B=Sf@xEEҲIk+lNr`fY|^=Oh@*iIQ9_6k1؉y)l4Ew/~GĽ{w|+:{1 {ijGW}XXN+Vn`V49rW^\[ޛMC$vo^PXu?F=GyxԘ %^]y?.SY8l_|whNevK?ldeTFgqfFdM4Y&ҡTIag7 Yݔ*$OEMz$݅D3 ' MƖא%O0#Vp6Y3?2{}$t@2$4B$F7g rv74WkZf%‌X j̜l9RkV,fe>owL/9T>׽/4kɰ\gqH{0 Y_5&" s`-!Xq&f*YjXe/N̺c}Q&FfsTE@FȬU%5E DA0QaAƬr""v~RiP6Z03iX>]JHhP15902lԛ˭9/` (q6?dZv4U#4)-WofDW NRS2v“٠>* KJ! 2QMH0&v.hO2?Ɯ+r.wBͼ#fU8+=^Yi2A|Rf :7sG;~p?On<`|ఫs6JO! D&$` *■GrD7O's0r/ ){8{߀%QE+ڤH%VLBHJ[&*̻JV"H*EH6/o6DeO+{!ذkeN]#ŧϮ{;<|ޣgϞ pqqaCk}_~'vk-϶)O/y//·W{okK$h~3xWY E[pϳk0$gЗDٕG~I s7ґabO _zN[y1ֹBvvMEۺ"SӴ_owN-rMvHev.{-Y@pGN# nOC E'E S&0g /k񽣍)ًIJ*\zWæ՚#¼[1j**3+h?QBQ2aZ7߼-FW?>ž~J/Xre@@Ŏ.fvbպ9?ݵq ǷY`sye7(9jõY| éFme#qZdߴ dC8ʫe<Οy~V>)3f^J\Ah ix۩9 VfDSwKaZ% @{w{mh wÙ]mw||ޔov3E:'U% @bT`R^&i)3>}(r% |n߹y͛oWqE#;m.!X/մ'-N.1Ll__Ç-G_7~w 'ۿٟ__Cb6ޑiѳ{wϾlsq6rpq|7 D673}1󚍻T;IJNBrVܯ_)0@ON; ~{aG3DL0Rp?)5jԧ>?ӗ_җ~~洪ǽ'K˲!M-,zx/M3Ei&LF*X=v=-"vHMsڃ?x%7^sya WmfwWW_oodEf31ORBB{-aRqbv?խvl8{^͏͏َyZ-'tuᴓD?Kg>@[wk/۷}kG_{ms7v\6~p[zSz}r|tnzzn?ٽ/|_/gW=yB)BzO^^`˓fw=8i8P~ (zf6ӧg޻=zv#\o| 9; ST.vSzdf^yz=z^4C 9 4O Ywo]l#Lɛ'j!;Zb,[fg֊ǵjkvc5zA۟7a>k ݐnTz6ƍ.ÔvZ1aDObPԦзv p|08yr]Ԝ9G7u3'7a 55}aZE;m}Y ~-ֺU0b0uL9'E2 (sgR(2+QRqʜcHY1p*UO&#c+fP,};_zG/~Ό>$l3!cԺp3,>D̊<"z@!܁ثr0*pREv-fr3-׼5,rЌ!r59'd!!b+Xf6 =rdU%:ƅ=Ɔ-'YA2Ӯhk LMHѬʢz#T2^1z8VFMe`?'/4Hg!r2q!,t+6/8h6T~\(P /A2 ed4x,ވn"1S2*{ȭ5Fس#SUi6ܷ^W__y_7XS%O~t@nGʜjae3R 30Idc۵|[.ŰZF~1'6DzBr d+8pɚ3y<䴈 IDAT:OSA1̑IfzNlutvһxsʞ.=\~#OtdƮ 3` JƮAAji @ w zKG4]W%}^J'STzP؁ds, Nс4zaf(#x3m{۾/%cLB37'7+,j[knoӓͿPإlGGfwm1L'ӳoܓO_~/=j]n{Hiǒ.[V`pD^#p U2ٰ,H+EJpX,3o:-C!8'7o8q+~4t4P@NF/%N!1.e(62f0{ nI=9m?>1sw1A(y*(& wZ9I* n@q#֐-e i -cyY%jr/%o!i(`K.rOLAźlju-IT=sUeId=]Wk^}4Go@š)39 3bܐʠ2Jȉ2ډl6)IV^AD$^4g3Zpdo|~lGz "88<&423ƩЛ\2}W| _Hi!YDC Ҭ @:<,y,΀B`u]Jo#b-6&urWxk"LR_,Pxq@;塇/w}c$)s-O0G*ڒ|yƝܮefk-%pI=,J$8 [!#A@bZU9}~wگm*a$/Tl t%<Qlj\aJF`V|hIB$Q6KB+H0`6 6硼-!ۿ -θ4N%ĔIjf$QnNR^WdUDfiZhNL`YM+3 #!,ng)U( ';{ns-whz~~~~?*)}y|4}&WۅhNw@}=2k$:Fg26k{o#G;|0*V?^5"v॔E¤jaULU=7sg)96 )mڥ~|ޒ&l6KOOgii"V.Z 9e$K)Btx3nw.M!e&wA$h\чqZkU$@ Z;:==k׮}=̳xïz+el@vl6 'ySRt-gWoݼyQ tw׮=3O/{l]7qy7,:<ǯs#j=@w>ДK_..u T;YmE^4 痻Q&vK4kW[1F)26Cg{kuj6;[^}]qvZDU1H?vx[=s_2b`wm_|֭??}z{>Oo{oyCЭ"wx*fYzA:A"Hd 2fLnV}$#%I"VHaĐdw!FΔ#"To Cj(p1q#+ƹWƍ>,RKcqXW` ƲtCN#MHfh%.eI:S\? 0vM!h)99 PЙ0OW? 4C$GSO=;;}J5S@ч]*r1 -v) =d OX"ǑUL*c^D/مܭHebt;L'K932\9;d>sYdִI j5+D ( R[XIf傷1*kv#! L2.rzU$`6e"RzkLɶ$42LtXG_9Ԁ3~ۤ(X3KJ)#V7TQJ&! %@Ԡ2kȰ^&+"34#BLFidNX)-1\C {{_LH̔*U' KRbd-!̒)i(@&Ӌ0``&pf~M#|[._?]=}gD<ϙA~'. \2{X,id2T7o\;yy6 7iKl֩ 3(aO?>⭣NmTKjzYR ɭI) :,4Iց$/5 ^s'F" T<F>b2NPbze<_W?޼_׿Uw]>ڴM2mvN?u4mzO棣_GyOtn^p}HL,t-&oz ͕4,F84cQpq6y[G絋苾s?q|s^p,p]т2ד|5smdߐu8\}g~{}cBn"2 lx}3l֐f9hKtmyb!SߞF:b'k%HP"| {%dQ<0H@"~TM~ư t e=3ٴ17!LMx/D7_XHXFwRLvHC~sCQ]!zȈɈ* "sD+dBnp+n@EEÁ*P2kȯIZ/F[wlg(" W[!$&2&%1,JL(.9H%IwFT|~&EQ1+ӍT*ЙThn,):Lw8QwL/GyO?kkwW?#XH&ӓvS 7d{%GP 3SA" ߸9xC/}cnr1:Ϙ#,&jSUvyעI?!U䨂B 0vs'6Mݜl]1,朣% fP] L\2+XU $$T&"sO\hio6▹~>p9:68[D%4Ҋ܍~}Sׯ_7vFƔ՛Oݸur4}i{Ϧ=x;#&`ǃlwzڎwoE(X&4gȍ.a;{V䗞~W쁻 @/+ۅŶt`ϗ_3?nxY? *MGB%-y0h4{yttgG?gHF*XؚV}|)}Զ%!/7ůNn[n¹XS/ؒ'?m-1c L–73ǜ}O`j=]<@Ü.O]!k(Th>Ұi~o|j+7O/JF+Y.T.m ; ҿ1~WWόi׼(ʎ6`1ݛ5}J PFƙ0g LQZ̬Dxejfk%}{c=vʕ'5 Zr&`Yj4c8AF$&s HE[*?@Nl-^r{ 3$\|#%G7Vu&zVWtTNǨw~wNOOcÎ"[HE qEC (D!Tnm!7SҼLD!%wJx7 } uGGGLJ`NA[KL\2F%m׮]{{?~GL4F6ԞGa}L (RtPVؓa4rEz 4kAvCV3vƱI?-s홫וLU9^ehӆvJv]侬O#w6 .sZTQ'SK7 ldA (d̈imD3j3a:.LGgXΊs5y;Laf ̌&i̻x?Ovoz㣏dNMs6ӏcO<)kkd~r:3}W24JWeg>s댦# ͥTFܥ S}AwudLl(aF x̻D+ 86Bwwy`@qrr ̀7(MU/LXFBnҲc(kϏ&l4MK&`B֕?|5*ێp$U>r0qQ#`yvjOµ mp#xf2avH_1, f3O~__?n/XMJN@:TJ9JEA@4H1FXnLQU:"C  QT#&bZfR"JBeEA)g+[@7nQK?WW\w"gF%QP\u *:*WGi*X/MjdkѝMM [nV0{4xeE.,IPD.P&HH ,tM0w6M~~?O<箤Q[b +_G-ՊO7/C**RAM[M˧:̊9@IUiE]Ae2!Ea^5C i0Ҋlɬ*O?7E:\8*J@0 !e;R2a`'\040$"Jy{HFngj bC$Z}K4)%a+IU1H:sңt-O};R@Ty \YF TN .3CPJZĭK)<;"- \3KdYNJv.txVA|'~'/x{3|7?+lur$,;4W*Lcs*D r2d-BBo|BuZ!72 T|臐\t+94?3zhox.݃{{=JTM Z˧NLNdKboA]PZ@l&"D6iZLdmM4o9|+Z OQ9Kӓ lF4Zi!w:j}+R 1óW}3c;7=ill[3OS?ū=yn$\=r뾗w{zގz eל.ϟl6)ze2W?ॣ8 *8|\3`mLΙ  5뾞2z.:nHۭ{>{]{fNNcޟ6y&7{Kna2H[o<֨7JBF{Def+eՋ';DD[f$xv$ KEcwvoͣfx>{qی::)(uu$۴&A26͐ґufѰCܨYh]Y+l>5`#-np]K2lb40=()XRF߮4wrYxF\ؕQHA@JY cLqZU#2:$jlCDA1|.-S>p$! FcDZ3$]Mb6 7ZrO\/텀WZ n>uޝS IDATj)?w/?{ݖ}3ϹOv}r-zlDic's3NӴ|[`<+ԦjZ & ::ekt~6-a-lmp!˄}Gi<ϛv]HϻPnjrٙe\_ARd %'=)"vg3ELB5ݽhݛŞ>)y=GPSl}rfs9t/_֕ տ7-$ewkqK,EWXbg,JU#1(9b%{MMs2f>nYg# }p=뒘>?v??KK; Ȁ(Ty JyǨP(L^tQ=NIQ ̤^xk(Oi 0CВYiė-SIG[ E3Clё*0Ü %~7 ٟ~׮]O 7eߖ:HU;+ip$3hB.|Nؚ+G?tǟ1F/~1i~>&)Tӧwrmqtw[| XO;QkL6G\]٥m6G}IF"3I$/9MmBn֜JJcn<̚ $Y8(3x&mun۱)mէgc߸vzMo|{o\o.?쭏|{v9ݜ6y9t|W4m2nwDV=+S$-9SdDd(͉3~rj|/sv/njjI dq]ZGvsꮊKe,hX⅚:i9nܸI.FgJ$p>5$F<1J,AO?}{wv|u‡ ,3:崔0V H: hlX@Z{#ȳonsؚ 1S/_^[V5$: ہ;'8==ݴF?NG۩Z@ +UfэbSLA"u΅fF^/E}u3/ƀ<8 „:w ٝp ~9춽qy&`օo@ywm&ے {V۽JfuWL۲LƤ&l3ղu}+#̜nVX 9K2Ej.OG Jf,N]!4$'20vB]ـr;!C ,;NI'CuN,B咐 FI,%&T#$7Hlg,0t'P:M e :,<;jU& ̙IԔ:-'eTJ g6d/ŏȏ<3/yK̟3qM4dFКˇ("{QCbQPí s%:V=0q*J*.a<,mn;)taU%4{YNґ;y3wh&9+7t =3 "'1pFJ"8sh$l h$UM @H+g/Lk]3ȀSs!` I?F[x}k[k?//Ρd'@۬hLK{` IsaCҏ@PdɡĮ(q* jƅ(-"&3!M>E1ɤYEJE{͛be K,m̝z^|x]]g A"&)uc]͊(%i֭4U"eH*g33K9mrݩ fY$:8S P77{j1+$G:@a]N Ě@S;]W.f3ϻkoe^6IE'ZЦKm77NNv-Bd٣-YuNҬ[ZC]-Xb|.n,=P& E4 yVU٪^KYPdX§pg{t hK1l82N?Ot?q3fo7׿soxV"/=w9r}2j)OEgabߜ 6m^*LO?aK\6vrrBrݭv;lr gsFpr@ C7v *#wQ^p1QoePl!Xb Rd|4a2(,(x VR-Ym)r5AЌJ*FΏuR΅ (,ŹÖ &yu%~1 9ɟɟjrDY׎*s-P( >Βy`^Vy F%M$asv6$QR+  hzL oKu>$mUf/ҟEh,{48DfK Vz萔,p:sRD߉MA1Ie@cY;;,*Y !6doUϵ֌¡`gw!6K }oC~\x;HjQRk-"~q;w̰iKъybҬk/($=/pϝ>UWMRmWK1XTfz)JhN[ۘ1:ܖSS2 ZZ@IX̘܄R&\f877򖷼ȰHIb3g laCtp \($(fR_S"Gc*ˍԕ,79{'`k3RndFdF*buF fǟu1#=)`fΎE"\Rr)?1#$ ~#> '??48:(/\="(f A9#P,e)J=pp$hLvs<]t]D.#BYP+I/Cmrw[0kR6|>jd+,߽af1}/}KW_>"O%wZb1_7-{M+Wޗr;wm _~Mqj؝l6r~`[IԜ}797m|_}WL]~g?1۾Ѧvio)vnWT6kZ,<qq5rGǛʼ|͛_tls?>[y^,|_P^FzTr* y =nӴ+K*93}4e̋"K4L >aO֢wuXX&3(LtNqaB֙SO~3UPXGA =#<ںZ33Lj"{0d ?dl.)0*aaM27ݎ ${DړCRp(W.݄}e=w2b]eAXfٲǒOZBaH}pGL"5`h'3>`\\=Ŷ~k;_C^u_X*wԊF*)A&@J)PHA_@woHH6f(Vz$`XR L3[sqZH^B#ǜ([_%Th_dvq5s; bj(f3m̷LdYvD2J]ml`7: )GO8zLN.3B s 3Q|M)Kꐗ{xld hI%ꭒ@4TC>*0K |/cY{(66"(ծmE`6/?FߙO +UZ7)#B ArEǁ|5f$BhE,L/2b P!Nu-OK&<we2%҄UPxDEY^ב0WN3|֕UKM ,C! 43D 0!$;Up3,h\] )1XR#e 'j6.0j.<,`"/#P"c %"a[27*+VEG ,3U q&"Ea5Y+KO8RjuhMc>ZT[>K>z>Zv#^Y/FKގ#m\Q/ަ iH9U~b 1v͍׶͛7}:??vڭ]]$;2P 0ċM0Rz[1u=\qKMUPwv>˷Эvvܱ3??_8-cz@Wfk _|ƤU:= _su֪Xnw2G^umR*eX)"ll2k%T&T@р򀤔aO-"/QX T>u_0:o}s쫯ϙxƱ"\mKC!)v3U1v /R(׷P?26 }P]I((TPy* A vY5 p%`H(tD˜AF5-( #LZl$'&:tCڐAh`92N !3Xa&__~O KUӱW$'l]Αo|#; *W`/yID*3&ԒQOvnZa($Aհ f7巟_O2{Z$5޻gfUM&!.4U+XzXI^CdAf#Z4my6 a=Zexn b"HL'YnfL|{V +AѡA^Vrj90%9ѐL4atXC$ [< #σ@H 3N  XL$0,Rv٬@J#{;GHPvq2?_V,LALjjj6ANG=9ISt!:Xh6\Q!FȠ  F2!/ȂVU56Kssu U&4[!qR4Z/],_(`^t)0hyɐV ҧi<<=ljl {@7/li C7ZEӰ9'XQ0^{8"!+1zLC7u14*rnEVH{~ݳ׾o޼+//7,&yV'ڄ^ͻqI'S?>ןwv)x܋O;s~'w~p?ڝOMp3?S?ܭ]Sgt7/|W~wO~ط֠5R` XOՋ~-޺f[cR'Xv$-]ekW~kwl9'?1GzY1G}g@u儆T(V~|sҍ#ܴo]{|װ㯯z#y 5Hh,?ozu`େ% uw`:DJPd(CkF'@&-ۊ-80HV8(xJSRI$5Z&o.c7 VWǴm`9)WQ]ް2KV4"@9ҀU p-}u5l)6/>]M}b'ڟQ ?FxW.-.E8 6`8MAJY9"1:<5JXPWgU`KU6KUb`E2үV12`0R3eKPšBND *MI""`8kʦ\"1.( h*&tEU|%e!6s퀤l 4)!Xt,PȘA#6<f mѬ4d%Um?Ve0`8ZdO/ʷp8 $?+gdu\kd&,!"ne-`J r̖}ɢF+_ AtQ(G'KZ{)z%LHk5Fj ѻ)0W*a~^uHR̂9pkZJ*+`nqM!hJkd> Zg!%@(K@\1\-@ƚfY9GHI7fRwF r<uMyB4Ȝ7ae㑢s B4GuhQQVjFb6Mq ZGIX[ࠢ!@#[㪁~| XQCඨiV !`B.Etɲ#ID| C`@J6HBXspq1Ud#f*)y.\ sTo}Ν{_ϼ򋯼­[7n?{190&Xj28 ϵ?=dO̍W_x)|~ݿ.S|qSOn/˛W~><ʻwN䫟מ}2a㍘{7NNҗ座b IDAT^쒴,O ĥmc#7K˷+7:>.F :y>q#z_=|?tڡ|ud!ڝnkB*=N|?n 2to~?^/R1m-./"6z`UϿ*&gnz")YL(x~vm1&e-2'sOӊ4N'fVyQLbXڿa딩,ޒ34Ln׬Yʵk]!ѕÞ0,ϴZ/pgK1LClNm4*z 7Gs͋z}_)_K\|`$Xaf(VK 4 ߳Q#<1 hj4T kmJ8|e ŶT8 42eěV;ܨs / QhnYEQ$il9E2gYlZP*N;pVQX}Y@qCJ-;t28)$(Os|212ҩb8Î6=;ٶfՈEau!18Ik.%mɁj%4I HEDk;ĨkޱvۨYr-ʺ\Q#]PJHL k@ rHΨV%]ynK1 FZtCE.,fK{fD3e%nDLR ɒrgCYfWD1.pXԗV. ҙ5Dmj%u֚$h.pd+ V@emOf]TQ_Aŀ ,l۠V%@,0Y,nX !bF13/y* [>ϫ0;+i R7yH5RAedT2 ,U5HW!e@'[̔ ,bv oL=`6o+/A*馚8XM.[X`8~kV@d"kbxT>:ܴLUɗ(y#ycWFs2'IA9Uf #}r*'N^{CoN,|?G纜pو<#ݣEkl?HZy5rѝ;g'7fnf=uH<<ƛ{Wz\R6'yD$.6\sۖ/Wʡ5Cu5$8z瞽wxa]"6^W\4 Er#26u acy?97O?ha0]QKZI$.%ۉf"WAc_r@Oryn->zCiEQ**$UGeKv܆w0ȯ8 k'J1h^ʿGƏ Aq(UBj`T8;" L Jj<`O5DQIDUlap(6g̪MS" -\)iBNf=!(%:PѺ.J:Q3$H\p#)I R cAIw#?k!R*̪}Aђ xfݲ:.L֟(qQ6M>F/ /m]D3f*3{ kLY$%~ mcr軓7p8cOo};7?x[LDB>wiSOY7g?{ܽs])pvR[ue., 1ͮ$|m0/8'0`nЕy:7*Bsf&/}˙.e.ޔm2*[0d_?8)d2GJKDžg |?K0MTͬeJ#q=֠UBi>PM;v>MXB֋!4[>9lº@)4tkkf{k k-+,BBV-@g2DnqO~Gy|~47cO)BP:]ŦS̐`pZȑ8c) M: *>jJ8R'0"yWr2T#?;H|J7"-׽.+-4kL-z1e bSDbO0Ѫ9SqvF!#='I&##S7D6g$(8KPrɥ,fܤ肋FE0CQ>K{3| ܻwT4,떳x)BQaڅQtZ|U*3~,s kr9 dYK%RprePy{K.YU 1 @ C*>5yt/ i HH05}"Q %PWW2B/W&H2 [f4ag)40JԄn06P* V(Cn@'zL"'۳ӊ47%Jo"!T+N tX.`D[2%n7}w"]Z >3!)M3'}CA~SO˧ffa<ˇ@O&/;̢ϭ:|yUze_[6IofҒA1w l\ߚI,zd݇ggIk5Ǭf4MR$\Vu~=@_jko$?zxzӴ뇹+ ?x7hciW-URO< Q54DZk=_yy+v_7Z'p8tEۀGK?ӝtﻝ{8kKH4@}2qCOMftNn]iΓ^X.oΠ e]jBS]GZ^ 3J06#I[V&V%xێwhfZX$mXڟo=W^} ?>j6s[PeGd+*H9mB0<#dgV"rAlh!`/e"()CffRXQ2GvFX2#5ցTTƩŧW'Huv̝;ZlGzGPxA6;SB/1ғ22H@sylybb(0#t9ݠl1ũfrSƮOXJ/.dݽ W**!JZEDXv|FW0|14bH&{0G)M{x>ݮyQ 4+k0݌v8=na`'7O~'E^_r:ݧ*V[ᚩTsKiV@s␮9LOvSqҌCH،ch5bh-U0Yyct@*07,%^*s^*5]n VGCUZEZg ZtIkO=Tkm8Jf$O#0q㵜>ݏYݕ^"0)KsQ`j`43 4*!J;=]S04ESZi$C?z,-C6>muu@ /_q$ƽ/Z%0ͬ<'O{):^Җh]ݑjksO!>{瞺.E6E7O@ZJCs;z7{4ѕ9Vl*xE{ݸq _½/|q߃O{(0&n*qB{=\xB~?w9e"]I\v] iQQ^Ka!CGd̞@RQv꧷R;>s7o81Q $2)#270?<ݭ{λpn3$<5pgwsR"TǐYfu5?Č~|@W/ơ pڤє1CDv;Cqo~뭯?8w3@F@Em%4#}h{ [γ$ IDAT4,.*ߊ!twFB!`{\i7ڷxoIp#_UJ|e#x93oZ_-duC$]Ę_߽yKiaF.2+K $=7NO&3޸9q~6;Mg>g<ȃD6Y[jL4 Ʉe'#)By~Kr绽*n8rӟVZ#g)ͧTɸr/_Qt*/W2 u@EKxC3?B9_xx{xaڟ;?ZKӬ C`0bRY&&sT+9%@-%!Ah_ZJtg T5nT%C9E[ )4lBx '$MJ2e сuCRP1xkfpo@)Bd|h7?Q/F݈rp6T (/HuruA8lbVzA3EwW${&1Xd$AڍQ9QU 7wXU) wYa $*JŬ#KF!;ָ ȝO}dX*i#r9*^OL٢D{Y %kUf&V;f ^@6|M ЛU]iE訊k8mq2 ZFeC@#\.(vܲ62e݃8M+RhllVi 2h-W =nSݒV*zCF پ)s'R3hqRh MYZ zw3p6-&j_gALѧ,v{.<7&SV#h a7F`bʭt㈩SZ XB"2RUjIA9PM@l'EfvnIҺrݗS*<(HN9@& )|Du~1Gx5_R(3rNb.Zy]DЈpqxG[G`9DER jm$/b]K?ta1sT];sk;~ʯʭ7޻Zkܘq)-cTOi|x{ԐwPDz.6%Ez,DK8Q yvozw=<۷_yOo<<;}+-yf䂕}o|DoaM_pcv \S.i[kI8XkHу9Z2W8uF9le\cyRdF{-[Vq;0h}n͍:\OOo\\\BTҵZ2?tE*ZDZ:`Rg ~y~O|[߿1S^8FEF B9:Y&f}vnxww݌fs4M~p/ݸyk|؟35 T2zR9RWĵ45:Wŕ4'O}B=kǯ*"-$/@t[g2684!J6a9ul(F!`yeD Nն̫3ˁ[ah,G̅Ev ֲmdy$v(42Oo}{Ƌ~l+ 6LI<"i!LXbs^vq\(spER%$QLڐ"R seՅ撒rb1#T]j )ynllsbڒtH'fŧEdp:b0^5ixMfK˄_O̬n@(d6Hkl 5ܚjΓʃfEw*7PaF'0[߸Q6!^U= z8mTY%ƘV+Jkc7VPdlз_ɥ+{AI,G͕$BQc#bd9Y!G9+JfL==z҈ҾI8wƲŻ\FE.>7#6i*x`_iEbF%3Nreͭ20zViI r}fql C#lI8`#s\{Lݹ -χtw6dlj׾Ja}W$V>Idp84f^=hӖQ2k9WZCPnZpQ)#0{ϼ.· )7|_|}g|;ؙEoD=he̚+0ky[m[䮹uJ9wi~qzq9;Y~֦24Jb5*+(sͫN_uVY9[P$zܫ>m:z%]^1,k6DZw'=\V#p|8x"ƯUb?M+pS XPG-8[k7OO{Oek<}O|0N]\vsF^c(egI4Aƶ3(..o޴nu7~p77/nby};au_{ 9,NvD[͕_}O'Z,ۓ¹r~b  &\jFVypJ6$aͩfu^L\-t^0ce%|ia$+3J30H~C20ϫȚƂŶŖ*:T(+ v1L >S v'޿?7go =3-4V"Z xU!b1+5`,Ke{A<8JCiç__W_B0Z28`0Q$=1M\. x?qB& L\.Ѭ)C}DY@Dʁu0$GU'Y {$-zڠf[*Dy9Q]5L)n4͸6 ׬u-W3Fmq; E Xh*Qp%LcrEU&KA_vY޹W= ?4 35Qz\vrNmJp"[M 5;?x>/| 根cmBɈU*╙<GT<y'=*X^-h N\8Gc) y驗=:dϼۃz*heWq6?;u'P*]0ucgwȧf~?Ʒ棳9?dO&uPW5xhFo9f(-xHxy?/}募_7& hsT 2E憘Xhz$?fm hm _9'[1ѓ-؇4?ٶi0&>O>ϦSJ(&V֢&o<ӃCu[vW:9vRT\kn.ef'[1͆]aZkZJ!$F7U264J +8*o'4)J!fлwL%:Dk,]ڡvo[9GGM ho^RQ9MS*FG$Y:QNHVkZ;)C@+9tP bզ(LI$9Zkw9ϩnu࣏=:ԫϜݻgG9ڴͬPe q1rH}h܆ ty3;dm[K!;Lq-A2UivP#: w q $áz)I._7="YCzl3G 96Wۧ~'> i%%2^z*+ɦPB̔ޛF˒]DfWsi(bim` 64S3 Ƌ-0`#Z Ac3XLݔ#TRUTCNgy ,@㽛'ΰo^޿ZbS~ ͳ u]gEDDuzfgww$SO-^"i9"db35 R&@bkY/j>MH^ps#O_|遷Ͻ#_V&Mbnz~?kCdRmn!nB;̧f=bR.@ PƥɱMԾ9G-r]q;|Eci[qskMDeu)b[V!j@Qi:n$ZwHP ,H#I0aTФԠ ⾈4iRVO\z:oЗ_}Kk1pJph? 9ʟJHNM&@0B %Pqhzq) UD953EIҪ3GLcdPDKz\!<|g~"hDGIdW2,o?Ho±-D ܠH2{FE#=vO"L"5||病Tbew@jfeӈC)_k>|>^I$ٽf)\\d|P=2BBB~QAҠ2 nFm)PG% c !A,EjFT E 1ɨ$4d|XUU;8\^1,hŘ(hJ/5-' hFWS-bjE9亍@4bAh4iD%E+hGKt5aD5"<ղDSūB+ɤWe+{ז?}̴$=C4$vK"+<"E @.h4)bdӖQEUր0+@ BJiƖ5 X28&/Գti|8wm{[SFĪU&Jl-ٲ\44UJAIUך&_&pdKKUL?~cĴf5_w$ni9.&Flc%o626Jm<ؠw}DR͊z 5jrҥavA:1BMBDj4H!:Vl)Y8q"R4in)0J5<IHh|6^U*V ֮sqˮ3KŠ=#amT&ݽIIlFT"GQLJ3u͗o|VW]MBr5;9VV;Fe ov,َY.z*"Vҕ9-oAwi tEםP/]a#;|˶ ݷz~N}}7aI5[})" !9;'tWS]VFMsQCZ,R38Z&VJ-+GGG6ef24" j~[W7uJ Y:s{ore>X^WNnV: 7"NǖA#9ƵNώ޹l7o.e3Bt\}'mll?M:j+ZоAFFr=I$nSw,K5d\$$2`P\ah 4͙(A+ 7j{)%@" $t C}O/}DtүKq ox=; gkhHB(d@^VAiHLi lX1LJAD]Ovy%Y 5C&ƥ(`Lj\ֵ.6I=|xAR"bP^sO}cmSy R[dXd!0k]The RH!ݏ|m]`zcO(R *T SdHp!򒏼p'/=}iowX?ޮk@QS .}^O^9?~XMbapz s>1LR#w A4>M 򳤨(Kt+U(Br4VhG1A$\ TR=XB)NEMmpIQ؎D:B^ΰE8~ ?S8ҭ!eSM-leIC91*i1x95p(MV*]f RHeIBlU "gLOm<=-!bP˥tU|joFIK2MJx8r%È'Y *T8a d+a 予0(Iy&(\#EV1"B|RpRԳ:L"_h11?kS4^.z +bI IDATCNfl_^lbPA8*ՍbXa֡K+hjRZ5"EbX4<3C=OhAk#E`Y;`F 32pI L>JzK8K)e6 X.D Vi <5)JD8*>/AWR{H-؇0t!0gH& ^URD/aMe57>ɠXu]7z5szGaXvU*1f\=rnlu]ʂiC&mOj @9~ymEajf˃駯I9s^ɢ_UQɈhP X'4Z:!;(4jqC7QhB҇V왙N<ʦ:vvE0L;z ՊL8v["56g5rn7H pHA*5Ma\86ըScLKB0eMs,r2 cuzbXRɆ62"ti ]RJTy)M@U1 bpymo>B7!®LئD#:Tww[gw2DL& Y2ԃnwS`YNϰLB"ZJwPI Q&c9N;9ބQ6y L>iZ^طD[/&&J7*\@b@'dځ1B9;M:/d z`絗~ך B2hs@AD+K*a*`9=ܤ9K@8^~/wg67T<?庪Ywa]ZVtUjR:f50f;ΝU/&gA*Հ3tGP[[6KIMXɳ;9h'Z=whyTf ýF0+P6F{ZNZሪ)rպH=:FQ5ȟ )ᢆAc]DuRaITvn}mM  C9ƧdJ!Ӌ fNnmO;sn-rJO͗A#M%k-YR0@n;n#0j )@`lhB B+)YPZ U{^:<[C_񅟐vؠcǙFm/_LˠXw-|^^*g =XcS<9!Y.WEuLHI3Dss d&)"fi@Bs7 FވL)Dt G'wO wz}}4k( w2;_~o7.Cx{YS~x~ы/3Aq"ZZ;HK_I0EcM4 qJUnMu#ɠuDԌfq]ƺ4I I]?tߓז??՛/}쑇'7+q 4+|K@$^_Rdw63pjpGџ⏸<D8$/ sR?Elh#= 0 :-gҟ}ER] 41/O72)ȨZn$Cz,`0s_/r}Ε×rnPgϊ(}Xl;xz –"Q 1D]H\cs~]Qk$x:8;BqoF2qAozg{+?@n{r;+{SPͺ@ĸӏ*M%'y\jԜW~ 9̈ZkQS?0 +iێ1p{wUY耨.٭*:+S*bʉUd8J%:zJTQF P+5.V_f⾇>ry/ CRF&U?]sW~QO|G=_zz@ F!#j!zi0`dLT"QcPNJTd0:Iw]U CK{@q@D PI pD0OYy˯>dNhi4G7cʾ>_Pwn&C[ ~I'%fWh̯V꿶KȘؤ"u.OfxԒG^/=.7||7|aUMM` :/WC80tg?Ų?~f_g}GOܢ&&j E>k%UP-B  A¶TaԬ6mF bahQZnK;n?aEO}kt(P2)O>vɫU%|gfNãᭋ?G9s_|$2B@:Hh4‹AzDiWUcI3U'E` f AHXXV n*wF m@M&Z v@@5wg~ڴ¯G.CðLg76F;/̗o;ipoqhn2tSyy|ȧ ] fIU$`$Q x#(XUjhk Us8)ƊQ9j76] D.47'}+ wWE#EDBM3ɻxW 7om< [-& $`6>gR:ɂ! SX_룣|{ڣ_{;u&:LJ)]g]M6L3+P Ux67`"樰-ҟqFyGg8Vr}^?CļR ֲm1M|msOb댑5vvn#W.M;p޴SۮƟRJaC0SG/u:]>}pؤи=Cz]׈HI7Ç,9 7svG7B աrGҦ;׎+2"xmUթ82l3ܜጭ!;6Od{sWD ,Ut=6]b6 ٝbWҝFZhܜ0]%\(Nc9O395Uуғ@L5L̪W-o}a쮖ՇFcs{&Lj7d r]Ԕ*&}t&E51HePa Kwwv\O;NLAQ5 t]y<-O2fTJe}-". UZK{@3cXp՞ j\]fom6ӎ'C]-hOCO׵mJ nkK։e~)"4XX@/J Y8]X.0 T,4:nsO~'Ax(9._z/~}Oﯞ_ͯz;ؾ= :crpǷQӓQ S\#R)bԶ`@]W1kcRD*ZIԄ(R>{ܷX,ΟuWV}/~G~Pxd܅r\E!VG_s(|g}/}r5|PĂ.ѡR#:MyZ)%|HfXM(R|,2١EěV{VYq5lqE~7֝pkϣ6ZAb^}?0r>uV˿}jYykB%&6l8@oD YW[yhPgUDY"kZ#Ǝpy;h$J!QD]xhW;oj՟9N PEa )*>eZ37P^2>itD{yԲ|s؈Q%m0ONV}\k``T8:,Ub;vǮ^}jg/[Lej|1uzYCEe&+Ʌ|92qS!BMC״D=V9EE謉M`ZJDmuA*S†ItGudu9}ٛbV.?"o/};|{oq#xm~f`b\N4c@GPkehI5xC@‡GG_Ǫ:`Zk0y߆Z:ݙNv']1&٬XuYٹMtgҩj$TFZ\l,p ^_y'53GBЪbjz1Q9ݛ|5dPCaNśںUD"Ԗxw- HBT)jb/kYϝԡ.U0 2 h&xx:nOY7<ঌ''4.UuOg$"H8[)c{sIR](8cl}Ѧg:Q}kHL{""EA!Igr6Knp\T!IݻS7髍 דRJcOmj׈=N86KW!Zͭ)!U_&0QXe^IQRCQHQ%VJb(awD D @ ;(*i)gEXBj[/kd>"ά=qf] =ˍ ynS ?[3'w\-ErLN~:{ꚷrf8Sdl3oW]l͡@Ly)#ca[\|4I. EBl4 PTa?{\NS^/~^A5zE(Y.!ʙLi+غ?AlgKgsJBUIG;6zfI&v`fJA$b3[$Fn (MBZxixj*D)arїy}}@#LnHXfBg^{%Y6 >,Vtǟ6wOb5 N;Q?Vf?*&UDR u#wLHI `LW=|g䝇k 2]9k|?|Xs7ҡwpsex;m|oq:hcLZ ktb, jҽ^c@:0޵kkGżjC k:)l&RJuo&e6qۭgϞ ϟ?3-t`R$JY EY=w}:@2isW"wRns/-U+z=N 2TC!шd@ú"]U[ϬW?b4c,LȨc.G[6.HiH7:|ƭ7],{׳ Ub\uiy\cG_?7|ns{0H:fc3Sc쉧.]ރbC%`m(:7y۶+l ?\DOZLnh0"FOFv|xX&I]ζ; –m cJ(=*[ WXuܥ IDAT5P+1 }V&\Q-uh UP4+5X+* Xu/ٰ'Zj nX4 JQajc[1ud)&Effw,}m]TE`o [.¦OӮ7kzÃG9ǜJ[1ē7P<^0oYഡȭ|{wQ*@SHV,$$a:U c!&ifXblbB'4%ȷWLޤ5,D⊈BӡHxthn@@m!h!on $"Bm8Y4")Kʅղo}g}u&K7ţ1=dҕݙi:۩.ٛ*C)U!Å G u:vV [$ 8Ѵd7PܐD/h,1ЬnƝ*TB*6_+}se=|Y]J',0wРpC@T>EZ-/ww Ẽ$ #B+E=KUp$նŠbARɎZL '(agxZ^!jZТ" HC!bKEu*loW̿zi5W۝_mEJF`чÝO&J vuW# bB$4LF*F0QwHU~:(& `ԙݗ}"ŖBE֡h!*#Wi8)Yƞ./zO^yˢ-~GW"&Q[ICn\gov̭<٘y*lcǦI  I'c_T@z_kJ|5͏̯\=xʥÃer58nY:"Rdm 6MJ'.\8{[no9wvg2) JUKbŨudmB0%;wz^{nb52xGX|z7Y:h=Cޕ[DDdYDDm'Epȓ L ɇx.N+6˘=ٶE@)a23]۟wTu2f DĹ Q[0NeHQ$m##IZCo\ n0^ÝMg'/eE ņLUA@ zT !}+zQF$L(lMQUDh q Y G&"JVeCiHjHK}-URdj:u۪s7C*; jM ݩC)}d=Q#ElSM-"fun"һsՓ'O}ӯ}gsִDww] 'C˾ׁ̰K,%`1˚.."Q50֙ het3 i q,I$kKH&Mw(67̇UO-~njI:LMg>as(2+tX:خ"!C'pS R=#5Ky\4S* AUQb:Q P}ԙ, 4B5餈0d0 A-4!Q1z9uGWw|gBBp3ԫcы΄TL2l xGaЀ0aER@nnk+A*D%#oZ86A]D F iu%K>Ț4|XsR./v&¹#v_<\}kӭz?FrN@ 6mɈA]Nr9_E]+HWpwԓ1dgc(bR ̮'/?=|us[.^x^@vZPJ9)#SP<3 a4)FL<yϽܙɪߟM'XLT8ҍ1kʠרjVfW:N]h+="%9`a 44)Zk%m2!au;-3UI?BĔ̌ MiY)PԤPՁ *PJ7a1W߼<طʴ3t'$=uCɹ-6~Yb(9I?!b-q$ bKAy!3Sߒsx,M|2ǘۃٶԉN=mn{}`_~7X*Y{f񧉥"ޱ|#Y&4n] $OxZLR O{[_z?*!Z3^:)f<#4Ȃ_zeL=h)ERR"*DnfPIR_I\3 H;1<"Ώ`*tc |`QT~Ca Sw֝ALs7?/4THLuVqGs”!T%V{Y)ZNUe?q0e)n2]]vny{wo3VjI@6LJ$ 0QkIO+~uAeww6ME@UR]kbҺTa4zЫclR5!B PUDUZ7tkCT9TB ^q'.b0Y)_7SGWX0/Ϛ=D+}:)/_qq 6qjlbhD@G4]RpE$!)0d>\ Q+|}gxKYLRی U^{ˬN;nwZ\XAXT9gu&#) ?z"PktEtLlvÆE(PIVvb]H/5 aU,@&Nn$lx/My8s&0ekJIeDU߻2\ݟc 779ySiYonjtɶH"&f1PɃDMF >x`^{?pkGÃʵj~ŰCDd0zxVj,6EJD ξ*>@doQyz~m4ڒ*'**UI* H,$4a02F B ݘ mݫݘMi3ڀ4 'FZЀTRMT^C'^fz"N9q}w=uӧOV5FѶ^׵@UunarFQu sHP a+Fk6Vʸ;u"V.@ "wJZ&wJwox_]"{a&v'k-cI e'{D_Y݇3DhE6Q\[$o`*Ͻuw 8mʸHJqEw edshU~nI^oƉluBMvR$d ,d|G頩"E-1󆦭JΧA==clΐu|Z+5!|?GHs?U!T%j.t!Z@.s$AZHB&,fhVd2I@hc.*Ō:9Ȣ կ`/e9O1m\rh,\_ wA˪KTjYء;/qu-h-?f=ahe *_1ؕL$ 0b 2P̈́ABCC]`"C6{[(@m{7Ϟ"ZBQQJ,bKKo v}6P6(( E.yn^ٟD^Jj h꒒@,vL Pzi:&.Edߒ9p`R%Y-U4@(!PvIN RJ/R˙zx3> YGe%1=RR1y|ۆ5zS#IsnDF'l6 Fp325[) W9*HP\[4E̸ JGN=\c~iE}%U͌[zS.) ^"#_`RFRkERD.B۝E~2eOrۺ;O>KEŊkfd1a,Rjj[9r1VH5?˟[:aWi>]]ݼYi;Y(=:j%H]&_3h%D"ʑSE/xX[x}fiVܺ;t,~XPXUu0lnnU9]u9p+~T(W^_-.Tnoo!a2#Xxg9sfMƌ!r+<닿?c6D$bR񥍙O}?@[Ⱥ/ZDAa>Y^-}V[$&w'9G;p~F18DdҭR7 *9oW}3cLJwae)z:gGiJԅBr܄ ~{/bIFqoj5RJa@E I qi I @1=ef#wOHlg17;~nٵ[4ke Ƅ&\#KzWx^>xƼi9=ɬg2փdEE]{LOIIZ TQ3eW!s>ؒ5@Y9er]ޛܘgu ^z?ImVU"GB tG%0tGdtoq$0z_ESߟgxȢ԰Ra7?R%z" _y Q%qyDk r^nͯlp9\g)g}Oz3/sp.]™kIԒŪ*64p82 U%F:imHSP],!0>.M_wiݱ;TY=؞f۞^=ܡYy JjXIIS؝Ν]r=rSo x֓8, Hi}압_c) CQID-NRۑƎXBWF}߶f{{~xEF5Ǎ5i03ɤv#TŶ z$ $H~[_%֮\iuq]Zt!2Iw w K_cl|+Gx6DuB]@V A2g_/[uU41}߾ٳ-eYozq /=KRBE(^>dn_ݺ~}}2>ha f޶ubdMS,}ӺZjZD:m{c`{wqՕd=dujg|ӎy8pxn2Ly ,IV%7UّsJ h f.BwNxW@0DVY*gkN6k$UAAQ}^Z|zB{ބ[ixbȊ˲u}cqH{y@O[~sDU4hg^ӵyn*=贠?E9/7]*H=2Onrڏ70d]̆h|}@D[CBkWOJ-:hV7vweW _.U>SuHr [³7 AwTd0MڦEJLYZnh;GwlwJIA6cV5 3 Zo͍2h=,]zMw)fpF_v0[GNoAUIL/JJУͥ Ër9<׼WȔ  )Go} VhY"H&2hSF)q?\"w.ޚ+ڵXetM{++R4v6 +뒦8WW7<YJzUK I,!E"{|l;e6҇G*ZigepE+?~Wt4l_o}UWUD0< dňӪ>1ZIGnYo?)- zԜ^qw XϜ ciZWxdH"iQ>5=p!S$чN|Ī[T6gĉ{[W#c.1y/R/Zk醣wHRB؂ѝL-pu+.!dsRYHR.lqFK#Kp~fBȢTTeVެemd:X_1鋃ժ9wcYMwg>_08/llCh+^,F.CYbJ" _ ^T=A=tbJH1 qș&ں1v}dm\UB=G%F%;7~S }j2g)̝9dwo3\9u̙ʠ2:EK*wqCxD*}Om*%K,2%]hrvUfY#4N&KAw7jQ@`UR Fup$&c4-ҷ$)Tj%E WM8j=\:Ȋ7lcsu4D{P!`<ڥ eO89e׷|ag/QHt"׷^v,H.'"_>D]̪6jRE *ӗBZWUU "%]YNc5KH 텦Eyy+:*,*) dڵ-BEO.KtegFw2Q!"'9**3 f" 0 EDq9sDw Q$r1`Hꑡ*j *m VO\ZŌD  J0 K;VZ?-;{H<ݐR] E:<,:֓叀~~ǟGr 3Q(]~{ ?Nǧo}߽^9Gu R4MJnL?2p^[8ٸ>>/hDQdn4k'^%=ֿxMPȤm_u>UYk{>px60 10W~ի&`2R}O}CM!RJ5!aNe//_J!@!t{T<箯_dl?8hF}T6{ $X T5=}3g 47MS,EYUE4P$K kr%!PZ FE;l:H:(DJET5,FP>S*T80]&V1ނiX䕙ٍ5[;W!Jdolj|'?Jk[WÏ}fG7f"G.&:Xޛx2m5&>XmN:Ej4tC7 "_ϡ̔:W[APCv MeF.q)i[Wc>xދFn-;1sѮmŝ|~ʰW~g}P;r0":6Ϝc:Hn쓊_~[DoD,E!d֭>]9{ Y`,(&Ÿ H֥hBB ETεf@SW}_ٙuq \d+D4/ t^9'~l}0ܶ3^t)N BE, }by'+^!5)tE%%JtMP_Tی$  ӍE7ܧY^L8\ g繛Gfڅѡ$\3+ALmwm2*ysUn ?ٯ*b`YOxMQb W~nP)G8I {(Xءiy+<|GmmdҴ`段`XdbjjXÅ֍+Bʦ,^,w^U-7{;[;;|r?YdC-MLԢs, y^$ZAbiNVdCAɮ WWFk(UXQqPQ -T]A4zUWO N_\9;YWz'˹z9g/ z^o{IXElxjH"(0 3|ܙ`&Ò&Jzn?T_7@+)G[#_杇pD;hv{k73`"}q0^^bbP$?柰`?>];fY___P*^ÈR+;2ބp1"=_vNnI:**[[[Ko<*1kEeMy۶uwUu]ɢJBVfRLH@-AVo\T=?s&-qr8,k%"Tj1X9O6Nr=p A<i˟NǏ_,~{SaHn|۹<~cT: ~"|#>c"ܞ8:" "3:z/<ظxӗr!F,"Ud*!4?]~W;k8XY?I0*dTy{C4޷'amTudvs &("mnWm%\4;ϊ "$Y d,B$-#\,NsCFDmsw<%vjm6̹UD4M^o+u{{ܩ'pF.ׄyF4{Fv'03fD̓ 2#̪kӱ~]#&`*O*SnN ,I H*E8[,-\J< 2v}4_qSg@WOVO^ۙu#?dn_7O_vzGtHEk}g[wzD<ͰHP~x 7-YIsBj`,W;3k#p9(B\OavS>y֬R>q㆟+Fʉpf՟nڬctAz>{[{󟬬s P$(B^jm𐃽7[h-e!pwfUm#WbpV#⎈_`i 7׆*h~tdw- "MPԓK0, |̵֟'3EZ!?Vw?q5-PDx"fahx4txkZ1ѼYe#2mֽ@"X8`H`VRL"zh:PnHzi @ jnLMDl6QpX҇\?wz'o?wٓ'VZoO!.1{x䂪z:寑D29L 6q)tY*")Ҵiy! s`xVV>ʰT s΃iah 7TB4ЪPA5`׉`ѰxP=w{+&g)CGNvb 0c`ItaJH.>$R]^}o 3DGAv Z|)Hg/@]=~byޔ^y랻{{ߒ$,9<ĬLvc}U%=r*0m/,YZEFڲy읛y8. +u1yYp')KNWhiFȢbH(Pʦ1 HP[2{[!2^\ tB@뫧ϭ88}E( 6‚ pln-~ӱ{Q_#<|%gqx#l# 9YMJȑ/+o>Ҟ6[KDf!jMY۟VWZJkiPOGHbmE sY^~SCZuzX=\Z_&IǓU9G#W+YUɞx;!*tF(DY9لs H 9:47J$${):-]ه2OWW6I/(8q͜QH<'Ě[_ҕ[m&,1$3Y.4mҶӟ{ _쭎eA*XۯwȬښRf2߿l]6Oxg}#]LgaBT[P"5UC|Y %9)Ѫp ںGR qm9#ϭ4,҇U:dȭ BB`MkdALjI/.w=՘ryI/9R^ȓ䉓 >fœ'c "3(B]"ԃgNu<5 RR-ras-iq-c-7<|wTدT<.݋pr(1ľ"deibp mD`^^ M V@\4%h vmc CB00]ڬxVqrkl“3mW{>tcψ t:O7og7."Lff7t]Wm|j87'˒`]H IDATTj.}\.Xã {O!URÕu0t!P Hlwb Fk9?|wNb =QIpGg x{h`;u4n}_h}F _ͮF}>ض{t?'v{~:%9KR* 6|]}uF"Pq= *SÍMdT\4[Yy?tzXU7CY~{S ؐA"4OfSogSRDLjVYEnsnۖdf5pp涕,f2\M̞QHŨ`AI <Gw-P (xa7jPWpe8RM&(W٨`ʤy{|}oeD#(̊kf8G>o&D' 9$6WN_(nN g;_ $l (ñ[ FGma8Swõ9^լ+%jKJd+++u=LUA L$_ hN A!= XWb A;WI$Bш쌀orEd8Ԉhĉw}ueC1@-A_ #IͪCS<#t5ޖL¡vD.^JA{Df⍵Sm}Ǽ4y7k>|e}W]UCCD06 *D,D*/E] C TP1;sX遐ȤHt:k#A[8Qc24_g!JD1,ڐZmg jND ʽCr6V^ 8(6޴dfbO>=$YJi޺iUn=,\H p-]ҀHgxG9Ϸ((]UEDXcp(4hJ{ʍY0XAd!rIjYRB8᥼£ f1JDtX5mڢ'W8>֖JHb>oUR. eUΈΧaMfy>L:oX]>i=ęKy2T*XB : +ђ,溚7Ϯ<_oo"97@0X>?϶$Ḷ=߹qwME}5Ȏ`3PWa^OyΣwf==1, Y]yT i Thp7\lGH`l)Qt2L'`.E1e*x=iɽ=p:n?OCmW'3ۙ)Zty"uׇYu#BoӨj۶\,cO EP!'Nդ#ﹴ*(+"{onUՋƘsթ.TO F@)"ʽaC|+x (<((PJcHHBT*՟v7k9:SUEs~;>{usvV㢪l>Ao>A{Y`'yr3+f"0.<\Uuz}\_ʍ0*VBdʸv h2]O.Ns1̛:UYWV‹Ι]~cwoF_8)F vΜ#Ad'x lk e5TiD"$"UrvjLZx\U^x5*/\tL1RRF$ N'~ֵ,⤓PWΈ u >6{ ǿɃ阔9T\2 &[On;aeg:Am A|%c-MjgOǀX v0);`Z n/nsZK[ם7&r"*Jkv2V(S'L`)pTVJMnJk5 +gXn_;O7\u."Rx8WVVo~|[8xby8Z(!q\Ws\65ݼMYl[wj ץU4iycYu]Y]XXEQ>OkTfrۖI"5UIsi۳͟U'e ~isNƘilXjC;1I;qxnMrYS˓ɤ/ݯ5ip"rL[!d5bjkդ>C|0 \}w=䒋w-^>5SHQ" R:R]sP` 6[ŝ㖼v4#vzvl)iMVMV}@뺮2}t'fnz<Pս0iw3Q.j8.|:Ps+kU%zȗ6?2VaYs}:BgH9GF"V׀ƒs3=K.ݽ\gJ$$5 @2Ϧ OmO7<щaqG.ͪ8u藩$;bO7Z'i?xɒE͍ R4z{  >VkoIqpS<鏮\\J# 9r+L;¯PEA(k/|IU/Wn+Rc(i1)Y%15K;% ΕW?}g?YWCE :MR l*2peo5Td4b€('sv~\2)gHU]2ף06]vƛU{h<j.kuUCLEo^zGj(3kbmGxlYR`4v)1 "Tfbы9rguֽO^t%=TMH lAe$6UǬ&T3hۙ=9ӟ?|p <E fU%.VWƣ:a<|˟(Ђ'zٸT6p3;|˷d^w<.#3x71dH JY Y8p(--T'^ $&Rf sT*k/q#؂DXF*(O|O>/9ogp21dGA(븋|H*(Qx+?9G"f(/>.a(`LaJ#&#G*s!nE?6_=~>yA b0hGTYÌT&>"2Df`4U>+h'OD巾_^}u?Z[':v"TR32L?qB8Aob(#̥;ǡBDVٸ /}'?yz>\Pxbf2) @LIhqB D3G<2Sif$N\&Q7(|<@"oKxSDdZ5|Y- W/=f'dP1$|[Ś3RDd'"2 U(q6F(3\@)QCBIb:ms^yV U3La)( Sl0ևOF̏F?Ň=}0X'??Ps8QAM}Z&s`aOyhULJN{W_o^瞳+b#E%BjŽnW d/O哮yN9, zt&|lyA*)r1 *|tsgn>vBPkoy`O."g)j\4#dIp ce)1¢Dw8t|8G>o>_=fD]~97=g;Mk#YC#Z'=u4jBnԑԈ,)9Y'(9JF+G3s5Ϋ. C%߈P `J 2M8fdjRjo#XYSJ]w?Q̝Q^F#{7|E`s&LWo bD [-5F2\̎@3lrԫEhDFl++ i1 2S ׽ϻ;I5;8vً5VRjR(:j|F O 3zkqL@ O @Nf|鑏,k_`o=°ԯ|[^㫟?ğ?{QLTi.fԤN4Z k,F]єpe5ޱkj? 29v5];M L#%5m5M {_ZJ 3jG/zH0p8`FͲZN'[Ҧ*D PYJpXYDLlZ;e*i));34MuU 23SGǃc'Oדּw/X my&30k%u5I#(x"bP̛- 1}THwS8e9,Ap &KS D)QzE{S7U:MPF6ۀ"Iߴ3%M{d}"j4O>Zj u"3VSNqc`Aٸhh[{"EURxsM)儂+t.uuf֛k&0c?vFGkEQL]wBL@` G")C=̘c=f9}CND5HH&:'랡R9JD{>/׋>\V?i<J0 UjMdH]3]v^̵)\;:ijvolD|mO^k pĢ Mq)S%m?KvүD}I__g~hz qy̙w݅ř{Ov`w庾V,Uv  F^ \ VHVM"ǔ<;ip΍}u)2;mg7HRڶfaUZx棫XLu60`x˯x'b*ޙڞ:D"YeN"XC]}]+{qqw}UicF4HTQb ԛ:uDjUQ #qb$58trTGYShjNW^%'+LMeKUsCUIyH1&AR!q 43W ?9'fξOw w! h K9Ɣ|}pG2 YmJ_6N. TjvP0& EAN(4.)0ed?GS/9Oa* 32AD52gO|VF~ /=\4آ)e+6<")*=$לhb&b F D^<)}ŬGVpy0j w1 k7~硥 VKX S<}F6 #/s-,yy|?/oZwٱ985b)wȔL'SAmw77FX=6O34XvE+?H|ͻ9bjr\-IO*:Y0n5iԘ%(ja j3~%Ͻho?dQV}[ן3@x7cven9^B]ǃj=sg`7ybe!0~C_)*e?!;e]V \9LDVy_D݌O6WmoȎPb"ALLؒ,t\-F{:ɏGyS:a<zGu}R,ܗ{Mz1D RgWX).py>ճEepibb44\"vZ{g#+WxnHM@0ULeOPub, 3M) 9Y 6J'<{gyH8@ko|sdzA1eU,c,A@YS7fh$2*:,zӕ+!9R3rɑE`àwCǪ?߳2/ƘL ҲnEc$[ 5Wjfd3yv]r 6l=y 7XZWQq;3X.98fcBDa019q~8w>L^; J<eVjAJCwg"y脈0K(z1Lad0@|Z]MMp!W>Pafyy4xxtȅL2Gh-F#5Ki1Vkgx<^~l(É'ĺa,t~ƛo?rli\تp6*ĕ45فHbI,Yɘh:Uب="BHsc BS]rrv'}یq4;#%mӤm_h']l!S ~ MDBP*|{iSCU28ӆɚM9fKM;?? hfN0;#6F\zjcLC-)&t/l]k ;:m~wG6Vh%%FciqFk엪Z5c|R}ɠ=LS&Q1qnmNNuveT⩺>Eh \&F71Kͪ4 L)`/, ӣt SCVK#l1{"kޝ>>Ͻ俽գq 8$baqwo8j\Vt{':$к*ug_ <ӣ]3rEL g*.p0P'_/j~fV*v%[\x.gݵ0_ݹcY5~قO9N]mRƶ{"ئ "I)pp}sXYZZy)fmTd*& @I<+lzфfϙrvM$oryqvEe(1'xcTCrο@UԪQj,yn7;]nj *ag:8,};\ssQwR M*fzgsmo=T ] BMP {Ħ1Y$gi;=^յJ3PtP.yw%wʴ")1vwX`S uF@T+]xG8뛺]Zc YL 0 A MeZl[- me?ڶ;L%NYq7DؽS5IS,}ytbSgVJ)r ok5߬ؐA7hJL!ϲsv'Hic oݻYO~ȥ;X`wǿx7o=W?޷N36bV%|VuD~οWλpoguŎwI vd 4ˈT\Jݧ@Q0*WP[R{%tYvND')4%e?%`L%/ FCJB+^Nbmy厃G}^>\_g<_~_,X89%a%8s#~>k]ϟ,}޹8?z6%rd28M 4DJr׿w+u?^ǐdILdb0XB6 C.StHՈ 1~--Mk`$؄P.4t;ox靷Uஸ wW_Z/Wk߃M ,l̈Twa3r=&Ivrm_}Bȱ& k8TdjJ}0H7ZY-JLJ!3]]:@hFPs(WG?.]/ic{p`"8Gο`\lvyfԉ]9p9%E3%u$&Z,sAQوI _JL2Q1bjzEO@wex"8 AL/pW64] A~>͠ 3v Qf̿ǟ~C/o/y&>&2Q뤬J,j\x6<62ꮖsLkv<w^l'e|׼u=cLJ~vv$SvŽTK2S($% B=[*N(q䂔'<{~zuf_Աt9璓vwLxgL/c\yy*^EATԠK.7|f(.pmwg*n:yE@;g]/w ̞]yX|ˋi!HZMŒɧr"" H #Dk aNt"ƹID5]FK mJVϤ6uqT!<_g[Es+Xw+?}. LGL;`ĈU.o p 5S7eYR ʔƕ# 7ݱXv̻Xg"Ro۱I~坿O 9 #YR׎ώ +/zUq8(QVN34\U |x_]s]1rLg9Yx, :w-KMR0[2G料(lLiIM qN%B`Tg KJۭ*u%x:gmfֶ=i{{@Ҝub=O-`č?U!AU@ݢT ߰ƼSov,${Qb [hEV֡K'jnE,D$v u<::b6d)2"#wF+awγ݌yqz=9AA )tz_[L{-*hjv1m> 9xljr҅VoF PR,o|"O12eHY&ш{6v2SG]eɷBm)shU ! lMټ- IDATϠ)Rt) d=)j3-G=;m:~nf;^sM"w2aM^=jlM V"CctdC &OB /|c><V8sEw/$p7˖j0g1fV뼖N boJw4赿?_y xŋ/bN,LVQBFFf"MB` S#/rV;0fi`fZ9),.//x wjpg)9 t ŵ$`-YZ~VF! ,2!R_u&4:{k;xb)wJ^k=)$pZL{@e<)/|-C/ (ۧ?mGR[56snZL*?;#/c \ n\{Csѓ \*On5>}qw~wb֣_lcyF֤b (0cCCI'^g7G+ n6eyٜ{oݗ?/黷Oׄמ](rC>A~'ڡ~Ne[563䢏*Vu\RNH\(K;Dggg$}ݚh[gbZ7% wM_ֽci@K[[k!T̹XK0H\E`-?iwxuö8|p0@$MBK5זSYYCt83ʀR"6{'/tG ͨa՟샇>>nmh9ΞgBǏC\x=wWlI i<al(|O.{l3ZmyN^KB简{!w|Yfm[F%7<PIq7t;(ӏӛ7o9{ 9vIoBn"ʫo0{tPCLK 9w޾s.^?3g?{xL4ȏIX:kJaa(U 6}櫳2T(J9l~gg@qh|c/g۩N%]0dݐ&Ddޟ_0skfBT mZ~ZYj5I4M\moP /cQ9ZU;R9r_7޽?AW+!z˺є=U"z(f'5Kr2 ,=H)Sd줒4_e,_w;QQ x;C;wVDF/.h pX-Ga0VEjy,ˊ7j՟./'y㍷"J@zDh5wt\NzO W3Fh Ŷv3O_Ǿr;ͪȀ9nm9ǓqY W#oa05lȘ?~W6=}wo۹k?Sx 3nlQCSv]€rta$X;9uyo< k?.//nah lكC rbMdK淟}|2֔\6-=_7{Q%0Ӵ=)>=*+?^۹,^YK1An0`~qR>a3^1q(oG7G_}$ )xpCoZ4]O+ݩ<ލ{~ߌ;YïHMY4ė;wώC];7Rݐ;qUG֕ih\5Y Rٌ9DY5L(%zXǢ"4qq/?s Gk~WsI{wzŸV1ol).#"$L 7ȄyΩ4Çwo_qZ0DY/?u2޻}4*]iUKʌs+7i.0Pk^N4Zؗo>~p}ˋ?S*LYX[Uwj"4FGO*%,C JGF![Ou53ng p[qWn$3DDV6YN?䥻G'0bBwДҎڌmKrjlpje6MKfBi[|#x'}矾w{eq8;NVL/i[kU1`X P65?ϧ4m/o^4̀nc)Ib?ӑc(fL!Q^f; nV"(dYNO\½W6s/?ʽS CD\9Pńe6u LEd0RL^dǕ 2##F1aϞ9]|?z7Ϸ8#$j_~/|\ObNs/4s%vDכƴ,-P@0JRUfwvg՟&>7޻Y8SDfdD-  ;m"6 A%HaSW &HmISx?|շ?_i;'Ȟ~ w?>9/9ƽIj4y(PrrZʘeeun}o}#KcyáF$|ڜ9h=@@}_M!k-nUOBOz1ؓPV߸q?/E ֖YIb۷y^|ݻ}x]:8ɹQ#{ k-OdqyYP"{A$k 8ݑswObfb*2l^k9ŞG,2''7Ώ6C}P\I~W}$S׺\-_X8 ZOZ^j~"NR -u?:ڹ$?#DV" P-#91sBӌRǙ b[e!َ{Ϝqz sWAz#M(G"${:3fhXWojrWƎh7/v;9|Aflo~_lSJEVn?S[}3/?[[ePRFE6ɔyJۜ^^wzڿqs\uOuL(ki>qG:2+Gvw`Oyε;9C#;|0U ߈;..7*9kwיr̗?[WV\ߺ}Խ{wǣέ^j)Gíbe)\qE3hk;$Y~3_B}ZT/ .cfTDfNBcғ!ԤlEWoZWljjKlnQNOXcJuZ*k1XH% uqo/1{ٛy"6bhE4)Kym<ԃO͑:jm&T!ׄ(U2Bt.ey,hB, <ϴGM@dcqGgjSO|=GeWRŤiN@P܏Ժ5gdf h^eU_kl%}򹓿dtYJqzi%q4Xab`tњR2^6oݕ)kPdZ"]%NN?/?C>ݔ&fS-9ea, S][fv"+X1̘e1iII_$df{̳?g4'Cqw79ʕ[FH"L4]=G|y;FA$Hi6PJܺcO=؜ED )ݫ"3 gu{,z]냓qB8֥Xif1jh{%5]]B.B# {QӒf#{ڽH?0 h e0 8t8BMl1JR>*診HZA l@R\lp|Osξ;z;[!leam^H6@yZibnZ8>z;gzx:h}84#ܔZ2ZڀL y/֍+X+ԡvqv8Z2FK1o:vF5vԀEkm·\ݷ@of;uI1n7}/ @MzTP e]vÒ I0Pva׹0GI ;ڍ)czE> h0KVYmL0[PFodKi ݉K{"Oc;Dbq7~=)jOB\V^l*{*"h\$,3+T$TZ@0Lsf4b=!(3)m`}gf*G0 f6fVץ 8{RelYͬ!1 m%9b7o'̂|lHYXZK)Kb|LjE b@Ml=;$C)!: *֤8̎l,p-*^N3W+C+X} 'ےnRB%):4z]q)"w6LZaj2XR3,>XE6nP?gAYS?R٦w&,bi1[ cPX*R.&RBZMzyGtvx/Z 2x &Y,ۑ5v{wYV7g ɆTg$ s<}iómVmlTjCC4 wYv7~}2n !@{8MSDy"3c5>6Zܴڃǿ޹sz0W*5fiJTTdnCR_l|ݯ7|Y(co@g|ӯ8Tcy#滯}o͵sHfaOlKnm.0^y)1c<8EigᑝEYJ= a9Y}ͷNNN޹sx=wnW8bLF6/hK+6hrƛoo{gK Y:֭=m6y?3OmnGV8{-ΜhjXvz?yx?/skA-~ _DŞB.cq]@ؼABt^Q봗(Ifw/PIt/ZT[TV$XSwQy;7Lxf {^AaX% Km(m:mH+0_2>/<|˶Ϯc:.FJyQx=kuNb}4il8^[m }6PG2Ment;?=Ol06(}d{tg}*;w"z\8M,G{ ԛ7pҀ貚~,sa XW7'U6s/+_ hfH7g'<4ϲ&n`@LDb3ⵯ6o$Ty 2zZ]muwځ=33>>8X_V56󻑯eNw~);z,êx.leI;[, +>btLq _M;reN;ʷNŌ 0!qYl@;o3CHf`Cb[Zm;Af#m*D9T~J9',Y)^tQ`1mW2/:e$ GXR¨9%}1 V DYqJTafAuTdzR a9I3buykͬFzaLZm,tKdzZ:{NZ"ӺoTR~.꼡iM^" k^[c^ +"!Ň(` %z/b¡bdeB AnZU״1A:f,$b4pR\No K nM`qɰt33Z(wPZǰ4 R""a$ TlTZ/fr5zuAjB% Okjd qS]`w%(~=LQ}ǃ n;wO|!oVI.&Ke{[fTd(~3tcQ8<;uS)ڜ1Mów}wZK5{ɽOOOOobqg+>w?_gggmRsYJ1٦vΛoܹ}z)9: 6m.VI[=|yxݷOg]Imv7FF/E A@}h>L+s!]>;~|;J=$9Q4TnhiID)ZK P7ؐfS枚Wup^Ô!J[fc7V,[f:vYgRhfsoseY7Ee䆬)SDfH+NvSI7ET,%g/%ʽ@F4w8hjYw2sC,|(z.+YciT!Vi{-XxTcԋXoCʮ֙/ڢ JԺԣs5& ťbf0Β5"0w&N®8gR yZ)4AY x "JWE9IRnֽ3DKwli9t3 %MN2k)]N;' s&°<{ff:\'r.eY K/js-ffTORMp+!" D+}᝛Y.#͐Ö́_jZNKCŽ઻Z;Bt,̖rl 4+ZI/XeLIBO*5vmhC9յpWK&4eB"b1z6x=kif)iވړ;O cH1L/ pT'kjhp_Jve;W3*B Y2dLҝɝYF1{ZcoHb$vy`Hb}n/xؖpr[ްctK޹s:Gl9g.KyJE/xD{X~ =4k~= 6aIK4v꾏wZzz޽{woZGGGMn1Mf{1338/..23Zu(whma,hg>ʽ;O;JaL8{^6]l>7{v`=?/~>28)?i)(C螺o芰#$Jbʝ+r;GkS$=Z{ڵ` ,&DDRR&X FӼ?S_~+'t jV/ͥrj` +9=;7UsY$Fr:[%T_NS.jnf^N欝8lN`tF"~lHٛjcOF=؝PO =tj';or^=эlFD=׫u=eiӌJqU%q^N3@ȨXXm0,ؕ, "i6w] Zgm:bjr$ [fuYSËHNAZ, Vd*tIRV] ie)[04GtОlr8|%$) M20:a^̆R u6,%[ds` ͘ @.5NҌo=ySNgfb>cqI. `'?Q(Dڵхyzg`ÇG(흄KYhs { m,݁-!0x! ͊k4O(1"P*Z{#KB',?)'PRN_NꎝX2wjPTh'ٷ(BP ,=:6aJOpR$3i]̀lq$@@K}"Ģ[C)JGe&Πru`,c-SJ3r%9^ť˲dʌ-0C(oj0:Mf43%<=W{Ks`qƐ41VZ|VsCnzI'q^qM~K;ލ/P!ӻsKmxPn_n첕:чPmzahۛq9~'=>}xl{[Jlyﻷnխ NZZa=]m8U iu>}Wv^rc_Кyr *q"QRAFmVz߸8>=YYkfk>/grW"- ,/KocEU)':_[2kz1YL~7޾^aewW1!ewm:#ڨ8,܆pƤ=~4Ş'mVJ%+˲ޙY핓mvug'o}Y->їnfdg]i}84i~g~W^X ?g'=|a{8ۓk8]$ɞ<m?LQדX'˩_2ޒFo X[N/ @sFJ 3 >}=73Fb.QuW .$c6G~>GԋeL_SZL&lJS}Iʛ̞n[3!ɰ^gEPL3A02EYסru?o$Ym7 H{40yhI7(jOwkJ.,6tXE@F&遰w۬*@o&Lbl$,_:͚UL zEʋHGefFDBefpFZA'&I"F쫥496 ^ڭ%I5A zLHB4V4k'Z(8mBBi`WU@YgL2 ejBV&Z_ E6 #V0l$FO?'D/w6&0%Hd𲚔 G* :*2r=eF+5/3nU31BfJH x)o]J'iIrRi=+#b:1a.K PNPs0 4ͩJر$DK$劙+'͢#S&\p!h LO+_ᾓ #Š<3uf@4*am<[3\XkږTMU<ȆU71G_~ z(&^ypy7;pa.2<y}}j+{bSھ@rY>A(:+}jd O$zH6\0 V>H*,K1_z,<ϭ%nSf^W7n>y57o_'=P]kl]cuCbB(ݵ$U.ݝG-y/ڶWd"F5*ћ>pGWW_kݛ^J/Q=dy3O:r^y~ O}urEc1z~+Z#We.-}Ρ^,5'q-&6~w}>)IH+xw=IBUZ۵tY~pʿC*ef9o}ss,f>I@È5Bfp>MsuUEQ7/i=n|:!_/DM }מ[x#'v^o IDATl]͗LbOR?ʤ|I/;//eHpGd֮Bf0 6|[r,ՖIl\G:P太XE k(|Edbu3 Ǭd*S}!TM ER61:r=/e9g䀤I5/ !G\ d +đ%2Ee$؅:&ìCT kc^)7zȽ|l HqT1 5HG['Yb'<_mIBf')P*cTQ<re&YKT$#=>$ջuUC<6LgݔgfijL{[`#kmt ț0I=HWq5jVj:(B4 % aE& H(ck:`] dn J)H#E3 ?̊F*5U$s* #NZľW}a;`k%-DS-·MY <FUv0K$31ELQx7;ȌZ J˞YctKj@"Y|~~?dwc^klN de~IϿ<:gşVu0 bг9FUQ*q eY=T򮌠W̞#Nh0A}m^/SkS\~uFO's׿?ϟ"tT)Sz1U4ʬsc$"PLP)/XXGƲ5/8\'?D#T;Ǔ5(<z}ï7='j>uq6薉~^w}_^}Z]Ae{C iք]Wק6gL$%{/g:ts= 7vZ]_38ǽxMщaoHV[bIC{=0:tϪC3*\Sfq퀵Z=z?_yϾke= Afڔz}Y*%5|ƨ7/8E=&krGg]9>m7폵ә¡u.)wG;[|-NQp\̸_{aL//`BZ: e'H2zM0 rx;2ͽI,W4'U%#(#7QE 1 L!Maɮ0x٩f41HK$;4hhԦښHFv"M[1 z\mAt0Lf^ICop\,SI2i5ZPU+".i\dBndd #z7{#IPV-ͦD: U-\@FDd2 *rXygmoNWI(Jc#,qQ ilha,Q "`U~Ek-[6萧FFE-u`΍TH)1w=|hnݬd *))tڼR812[14%#)Zs'Ye\)9([L6zh 8( 's&*U#Y $Qk2VA Q{V2UW&&!҈=5D ! 4j`P&>41Yh ACGeE/Ujl, 8pX 7UJ"+ChƢ|t*UCDfQ-,=c-wU e ɢ4T} ɌK9[6kɝ.vQMV'Pijun5X.krK#cx6#q9(*ӥ1LldlzI'd>Wz9c]rX3 C̺s wmU=.Og'Pky@u{k>MөM[pӈݯN6fcEV̒,Z#""G5$8uSўܒ""%z??\]_GKATj{7HwHWitsYNoOzy{>j{4YЗ5.o}>Mmӹ4W7rѕ͛5CDz,#|@r:/U>y~VHm2dՑ̶OvDcՂYؑvQo;lhGl%f-x ս2.>}ݦ}s3I,~E27xa(Qpaf4gɜS{׼&ryn;ǪUSgfQpO2/]ɾxc- 67ƖOF3ɒ__r+G"L 0pmrZ-U򡦁RM,w4t %/R*uiǾƃդw) \i}BMJ.&%:ݼ*ϥ-=]̔5Cr=Ȭd 4d&}1K UMn'0K+$1)>TJitlJ'wM[3cfOΉ")uk0w@m23˨Te0!ʅբ`K2{v!/$R37f&sIfN2}Px*^ba2pI Цi7ZX\;ZQi)khFTXf*#iRw+Ȁ̑A޼62+1pT)$IXLĸiג a*}obCxFXMšt) ,z2:X}5-m{:dn~` +j֠ '|ɱ)vx3 Ddl/V4QQMLZU>(dʀP` *vsF$yhr$VL6gȈtLrTwO&V_:e6VT8 fm2Ep)GM`w&d(ԹY{O7)ώ+?e z`]9dO_9&e?/$[Q;x:M4N<ΌUY?[Ѧ7' @NmiVn~DteDIm%z?c6C24Mߜڛߞ5.l ޞWb_ más ~4z45\/rS= MՍ/; 꿮x{pym緷y?]׿jfǁP9NQV]mS}DG8qMc w%&_Tm3nW[Ltٺ=Z.[3`]ldqn{l}t0_b3=ܿRؕ[bB[Dղ,ΰ+{" 0kQpO֒`=lN˹{ɟ_Ȍ3;kQNLGr}FoM 4‡ K /<'䋎n `&`ǎVx''vy.[1"!/Gg߯!vvb#>//zE%ISF9Q >%69Q;r0a"{B*SEiݕ DNG|U-6jN4ҧi=YD{f(H@) ԬW+o$C9[@%TY(n:j沶j8[{ZD̵fDf]9c: =5fW_#` u .Ȍ&}j. ̅gגEl1_'_߼]y +̮4/?~O^}p{Wwyhj6]O⦅`)ԬA W8:^VG A fF Y]*2`||4^<2!ܧ졍(t/:ɔV R++ۨ7z|ȿm!P2D7"HLd=]LʔZ.T04= SK B(2CX hey9I&Hf$f(z0j4rQˠha°~L5,l:E8-!@Vin"2 ,DU|HhVfH'h Ç䌢КEO<0d0X9W9*3\*kf 1"8pÚ: !}XYH(Il16lNg9B%1FEXeFҤ i+" WTB6 ןAW]DV&U]$ +D7!!f+52z.&2e2xO-4ųLhFml]I `<W)DXQ%WSst 3KF"ֈ&_ $+UQ5,^)CsZ|ESCj !D3#J Ue  ݒ#/Df8eV{B:R 0IxKRL "K @J fSX$QH)8\UQQ}fT#) mmp=TplF=H o-`kr0Bl1H*Bd1GKJlJSjL՘ȵP/ T'j"{eh!RlV^/T\Nb[EO~Hr`s[l 7wI}R)gX޾}FGޛo6nw}Yu_ʱӨ;pR?~x8>x2vx|_[7a R_5FД(".Oϙ92#}yG[\$7ymDM4V[tEθ9r%Fod(1QBF~]̿G_}kf?L+[) GP.$bP;W6DDDa̿_ؘ e-V mjө]_O}᛫nN^ˬ .3^(+v^O`?ڦ>;=M«ߟr|d?:MF*,˺jILr[$Om=Uml#XQD$OȞ~?_KF㴜>/ǟ=|Oi>KV$OI{-E*H<2>Glg܆tܖ q p<=ůZ9|*`cl>Kb9#1ta`mۚ\n-mfEVLw34Kz0`* =k՟+ Bb f(0fht]ݲ*%$ԧnk4dڹjDYPQcZ3ZҼm)F)2'lU4"cge$Ak$6X12"\ hӐ-!CF3"YDb7x2wWdSS3$wS2IxF( K ex_ZED`K`3mff](t̝ys5.>n>^lED*L+Ŭ~E e;Tb܊Ir*Hͤd`1Pj]i4 J+MC1>d Y.l*U@" .CfQ҃p-Fg8D#ў"UՋlϗ6F‰ reW꫸$Y zʫL3ii(8I }R#҈YrNLV¬8͌4, QhVw.TnAkJrQT\))%)L͋q̐{0`{UܘNl{G0b8]-]a?G/~Ic|ƞq{mFnq#x ;(嘾>Ï7S$>2yض AM&/Q{¤3/xOo_햙|z͛oH…{{w1S:)7-D#A9ފ~/An!=<yJI)&nm2ooO=i_9Ii'LVןJ:"6lr^갠%m5nq#uhb Gh5C? ]Fb##!>r`͕^ސ!êbk藙:iKt:-B_\*ܺz816&t#S$hZe6jg/?ѯ~_ww? 6jM*xt}bfY>mfCl>?A8 5hvZbHP;@_im}qqFp;eN/Et{+/_zeJq'3%`9ɻ9$`id$$7 ʪi(eSRA vn% t{JAOnO%؛0&A`۪h1ϑdpxF0EPKX 0cX9qJq*&mp2 3+eKnNm֜U5xe= IDAT`%G Zf HDSk˜U@lhPP#@J\3aGL9 zaF' fIy7"6W%p E$fOcdf׻g 7#-50Uv0:$9(1,zlҮVX:X>־u:3z#Ն@ᎰV8L¹n í4տ-L@k" \ &!8C*fDZgC/XxE^l(LUhŒ[@Ț{4`[Ua2PT0pwpje(ziKv5X#m$XrS$U DBܴ%}#PHWqV*q$rM4+qꛮ502Y6^֭MB9߮ktx6XCB@Fr p19oE :0Z)7Fe7rlMT"}(&uYaU r1,U.a92{xv "H?˕2lF ?(N"so=4rS5+o_|e͇ffGD(23ϙNf`-<ƾ>8f3K$*[HN4*aՊO}+i'fِ:sYskx:B6H9DXRc^Ѐ{y#8̍O[ҞyC',˺,J\]]ʚ[{Ut'"߱j[#jG1Sy.Zk>rw+}9n%[~oútt=g92ݍ>ͯU,nɣ}Xg>VO}TIZ Ϭ9 Scx%Y/c3]zn ztoIbEO=乀c$l VHQTiC1UqGN%4c(kMeIS!k&A hyz'IROnvn]>DOShJ / pXWupOR`a*Z0t:CB@[Gმ%4$mUP ^ǔ޹Iomw}btGp)V43òf&OXI6["܌H4GM>SP-|7 8r!nmJfsq=*Z3ӆF4hpPŬ`7\0Gq`rphEJ4Ɗw=K:%LTC@d )*5eGj)R-^xȚeD8ZƠ%HPT@Kg"5+dMr*C & U`T Nr9P*F22 LC ֳB*LF.V֡V͘,4 0jVٱ*Kg f.\7@05"3 2"fgֻ^hebl)I6S@! @. DVs0J,2 \1v9i,|Ō;c&-H 0S`}٫V&Fc|$p0լ`5{wAp!3L~s_E~R!^߼6oCt޼m%_=˺v`s v t +`~konn|>@]l(<6e(U8vWqJ[wӼݔ$xUrp38t3M7}ӟ}rՠ!͓n973l0Yf/r^ nJ# bKm8s=5q![fq  6(Ԛ֘6efgcff\'QL*|5OhNW'gG 33mkC3ݨ8t5y$N<@'!M Kﱚ%H:)&caHYxO5(j]5]Ka<=oV#EIey3>̚$ -}am]H<2zۦکEݚSovk(t=/&fff9Կ3zзޯG#?^^*Ǜh%{Xa6_*m@GkKBb~u~oyǖw8ԗ~JXYXP*a lk Pq:֓J[Մ $SƑD/DWFT-BaPso`eMCբDdLԱ%N:&KU*WÉ%BUw PEuYbERpyv+L3 s[bYϐ•$VXU!I+R[&E03ś]`;-^ ⤈! [wT25DC!sn`#%BVi#gC mI4 Y  (V-=\0mR PdD/EH"*@\sR^\RSe [1(1HK*lǵzN/ 3٤. )H=L&[\}"̶V1^Ng Ԩ5aoӶ٤dQ^KI0,n`F{R )ӫ| Li= _Ӆ}$j Bc"{xCf`xp@54Jbg`bVtOU^6|OTMP_\x ib\ssۓ7vPi7~9zQ_I侾;L}}zw/{ W}ZLJNdf>H~ 2%==_ d ' l+4'jnF}}˒}q4ˢQM!}h'x+*l7{l +7Ҩ5l$ic ZGpyۢ\QVee)l&#ۍʱK D47>B3Sz}݀n@X9ųstw:a OtH}}53`.ҬѪki-!0zJ(kp/D f`Cdېf.2EСGe󤢀KۗO+G ~\iޞN"mO͞tGv{/vcэ>tSA9FdPթ&C]&34Fw$)̫JȵijMnoC"uT lN {LG] <c3 ȶl؊[p[ǃ}!p<-s{tGHvX#B__nHxI0}Y kҀ*<@5'qian, C^,Rd[ED PD/Sf x , VlCs9ЇOXᔜHԴ(W*ےRu4! n(ܳ$СHe [ܒ*br)쀳?"* zx`h@ FO"CWr hfGXw99ƻ:%0cdQ3:E~ux$gbqCĻrK$؉s4-/SBb;ʫF+>ZJUHSivJ&fAN+<_=HG" 2 eK`qKln$=%m"y=?[SV.W%[FPD-}PTRIH%Qt@ghҠNgig{kAc;>e;E#Z1s˅ hl^B ir/S$^ғ?zXm t% | CBT^]q3:q+>+TmJ1' c3d&;+{SA+IVJB}٬$*fFG2nv];]u&̌vƵAL/-!Bt\n}MӎipkHwL<=0p k~m۰)SU3g­^H2E*"K]GV}w~Ua In$"5|Ӈ'Kюp@o7뺬w-8~, ڳhƂ) 7`sΉ9;\ 9-+=Z?+k-ڎwq|#tf CYV&R$M{M)~5]NݚH|Pp0P:4(d鲪Hb*-E1L@ʭJ;VW/?sO߹qA͈/A) ā`澹X㰦 =NI XVBݢJ>MlKU=#?_~pQ)YM>_.=5}^łNKI>Z9>f ڳà 1I;hm{̗݇ӊDжm2l0Sjqя~~ ѵ{B7yGڇqfüΪ7ޙ:[?_ I2A'SM*iq4Lo~CRÓwroovEcd d Al0 SYl7zrOUGmR>6!bW&C8*H~5T Y3kht[(<,"U~,n[_7e%Z+9 *IHsa9޶ tjyZIXWlA E2\%^:N)L9tbXUkp;uF1LCEѤNFKU¨X5W\'`){Z zsWe+$ SJq % ҅I#gr.yKS68Y5=j$ o`NO!S颓YwPt Y^]l$L2&9v%8%Q biA{á@ædI&kj@cb.lEDІZd™!,(FX%,.$d+I !Q ɂe98p1d᫿)i죌Gelkл?V 2ZB˻ʐUɔSQj8:DhjOom@效D}1FV",ÇH7o5BqV NsDzZp̞jsy~~s{f^13W0EaFj)UTrfJZycݍ./# Vs3??sy q d)qF ;ɌInfc{,np4xYͷ=1ĉ>MkRPmE}bX_d>ZASK*%2 ܏~ekѧr y s՚ةI'Iq{v}x9JV[m̤cml0w2!yuQ<+H,XH79 r(GH̅fJV~+iH;asɓ`@ Ȑr"IИ,&'+&v&9H0Y_ z[@.u3I¤3Y).S?ܺܚVi*) UkH 4 !0 MyYz<%T#(dZxq8G.y˚1D_4 țX)Ţ0!Zd2@Fp"A+BOX=.>8v[+@PC6A43Q@P$Sg|vi#٥ qyRqCVVQcaXYYd2ŽϹKp*1IlqU`@_9! ũ#еm@P% QXC2 %ADdI'̬(R0 /ںm+76aG J&-V SdUꀪq(rŪGV%L;4O뺰#IZvzGF Qf_՝K9K]0R @0r*gR*Am}8)*y: IDATVDA7Sn5: ]nxwO=N O_}{/S0_||3u3(,%9#r|>uH|9$7cpJ|Z~2ipg'O|ɸ$w 4jmS 7%IKX_B'i!=ѺNCG&:>yg .v7֏`E*|Zʩu틬 Buњ Y]\Wb ,3yѺ\6DKJ%^%isd(.tU z-:lχk3PCTce[ˬ_=ƿDkl?o͚[^o],S]#x*Ȕ>~_<^t(I]Noovdʽ7-Azfqt+o&[R]vD3[5TYay,#5fNǖN~Kk(/taYvҬY5E8 M+cl %aQ6Ĉ: Q[ BRp4ǢpQ~ܣ_#G~$rEңf0l \H.n]s1 YʱxfJHLI; ]9Rn%]ca"2-"y嫝t-wLfG;PPHy\"ȏJV+iRbXf6Y5C&if2P!`*bqRWrT"܍ݧT)[q Lϡb.j zR2ZDGdQGTzBPu_ǃ"Fj&{]^*:psӖ5YS!i٫s.بTJ`%l}U@;pI/@MUăs.$ s*#2P]KI<wwŒ!lBIW1@9VU0ݺ?f݅܅ϧXt: pbԤr += yAd̑U>̾9;_Yې=ӊqRiWK;C8 p-̧wc{/ӟ2>}sTGN'NR^㫡TF Qg`Df*~wTr@q$VWts籛W[ڻ 6-fCϹOȞض >>{@دQo,F[s71l56_;Tu~#ѹqFuΥ~}{gg>9x9Ԣ֡יT#vP<\(0:= )06B-N6~J%[Sՙ AVQ$4R:f(,.*s?m_rNŒ|8Ĭl#XiTffd*f)/#v|r&msIcwm}yyyeA^m2jr߿p\7Pxq;2&3 A$B6޽{'?]>y qfI.0ݬAUiE}+u:fùOsS X[q$rA}!Ƅ7cӇ|x~ WǷ7;f1` FC HI2TTSŽigFdDΐ&9h)[P$=\co%f%RORHתP'j6-Q:#&Xdw5< Q-YqN-!2K'֕+ %en2Q2{u0Jv 0C3&C7;t{7*s.b*5J81Yj,K`H%*l[s%+'2-)JMdSk#*{ZYĒ .W *п7[9̀EIGq:C|v8]m2> f(YU');slOD2YFŰ7ocYW^7z0[#ӱHß}\x=|'t;㲍1t??e+cf+q\s=cY;:fM˺fvf=~*hPpF񫻾i =9nt84죒Ž`ǘLT WC7ZcJ~جeEe: gV^E ڌH,2@EJ`ezQUԍwOy{sHx4'0ל.HO?y0=p/C{b6|}ߟ_}WטM]Dk kc ӧ&^Kswoq 549 nFw26sx_+3f4謢%_*ʕ5/w1q;ɼY#o_ҚY|`2uӳs":_7o8zXwL{w'mO𻍀 a'iAYF}*\AlLmJ3lJMJm:}` tڂ*(`sT $7bO Me%-( NIˀiSaTGfo2Kp-!p`i=Apl-9gvQ݋zԕG;_] aW咭!"\sGHH4 kTT2=s62[FU$]#k\ITWD@iIj;1*`Y 3eβ݇^nFVlUU`y+EE gK(ƪEfheT݃"ʋH &`zQMf"&3cWۻV~0Yf/270*Bf +h8ѥ4>Ft!P,+e*ARA5e7M?P2'MQ+ձMƮ,ݥg/Hȭ_ 4 MwR@K4|jRfccd4b =mTA@][Xfj4A02 &HѡHpBUϯ1̕m,1ֈA\R2p69ˢK *,mBnif!zf:ML{@stsǏݿ!Ufb,g///>C> mۻw3b}c1FҪ gm:,#lM c,Ƕ33w=vyg Y8_#HazG=3n`vxeR#vg|[3cxxdYWswէJ.iG؁˝]oov\AXOn 7*ykZsK;Hz6+Drkq&Ҋ@ #2ҌJGq^SOM32(JҭM2W݆b3>W0yΒUW2'cFZ 7Gl`ݗu"ָnڄ /=ecd0D.@.}~K5l2(U;ӑ" !2U$,n1-T$ gGQ;2s4#B0.ّZwjYVUsD3$F9<۲D{3=<a2"+/i:2L:da` $i^??iQ4l^!fA")e՚ٸa:<Ʌk],sIZ 40[`BB(P%%n25!&od5M>p4~^/nS=\2A'??>8/ >n=rTGWty ^$y7}CXͯv6F.\@]v&&YxPɠ;$onw]a:Y@C},.<bJԪ^G @) 7Qmdӈf!7Zoż٠e3m&?/|rD|ls^]߿>?? d+Oe3I߶m%߫iE1=>y XOTM(PضR1s6)䯾kifif6g<~ɻ||c ѵ6'󲮬Jg]dro\ܭ??wQ:YjJG8׷|M \+[щZ 'WǷ7;"xzpplCu2v8 U&U'逩Cܸ7 :6PA5-E@ (!,6[ts>- hLh̐BIDijz >UYgm.r+8(ΦT5ШfTi!L3 A I4ATٯڟZQ1a3S*GS2䛀,߼EnB*DlWӖ>޶R3S"Mj7 "T݄(&7$ %5 l˥.%vrDf*Ye[IKi-%-e5f$T vAvY[,.JP=R%i)PȫۡZJ7Ɋ  tjfʫyk53HMnKanAsћ!$o5;svAYzz|==0fac$VF,(D-jn!>6=Lҫq%禱?r8ŝoo|(]P ^a &HF hb64_Bc 4[wgWǦBKT>h$BTI{L:lJ)āWdUR6]1 G 3 Ռz\}&[WZG"dfnf -#RGIzb|-UHAUG=2Oݬ йg;jUh}j3x唸AU='kiX(LJ ~5;&%T,•IeDZm,3-"` VbRHUbsA+81R43g&wdr*TRĜQ"SE(ɠ6IBFmJ jl=L^*ubsԖVHj%тT<$ 5iu"4Ҋ@V4bW!%]hJzɫCDxg9Xa\Ln͙Q\Ii)Y f*qEr2R e01Ȳ"҂rdBV割`FW+2kԔ|hrÿ?+3ſʭԕ>ְSqW;t8d9L朊n ӂd3T A%/S5/UwϿz_~e6S0LYg-2T!;O=3 és]Ǖ-qBB(z};pK1ƶmf<^}ٻ'OplzE 1.I demu8+]Q_L£i2*oT&_e(c!aY4ݪ@(QYķm4de|]xkF*b!)NV1V/G%~ Tdո1I|#UVhm2쳅ܶ_/~g?_~SSI}{ʋ)۶].۶m\V3xxxxxxlO6%y4$m`[(-aU*Giִq-cas^6{0n^I[Esu?{X#h\?2րl\Z(i%׸,C+P^yw_79 9(M(3Ky@`Mq7IR:p(iGtAil?Yk1`4BJ&L3^ *Rʓ.8գDwDbb Ʀd®+Ys` -\QӢDTR.D4H!ӝ+F('ޢ#KYJJsvJQS;QaA"bjN;c4ߨn"@zj_ߺX2sҎ$\BtjrQVzX2 Yq!j;Q" EP]7B).- IDATyĽyḘ+~p|, E!(VlE)iRaplSU~VD")삺M4̌,e`mڔ @Zkrme[XB)YJ (U*a=TֳYjE63sac 09NT=J!tu9as i5:SGA%0K*q22 3!MTl aUYWg ätp杷#6T N$YRitJBsn`m TL+clG0+!x mŀS&?͗_/5=(jU"l,6-jzX@J1̘[o nsD4M-5sWbq˯W_ {WR %1 9ۥ;kMttWWG0bOfyDUz1Fiem]`$/n)*Ps&JP `fήѰacm۶m\.Oˣx2mq{cկ;ѥt=eVڨ<*獥_11 N Q{2.#_pW镞,[r "Y薔T3)W"cAw#Ow|Լs$HZNv@Uf&4ruHQ0v%aYVŐ7Š4$Q`Թ=hU^w9>]u{v]T܀+d-)Yf}gzxo`;{կ]_13O$i$<<<ك8ਖe*rK`U璔.HZK.j5T7|بlۖ 符ҴnR[FK=$JI". ֣֙Bu0Q]+FY͞sD|6-S+l#Xj읓ʼnJG̾5{"C 2m2'ot1l#f6̠Sg5jXBDe-bꖌ>3&V3\ P'5/KHl[3,E^oT;b·PTH QN۵>K KT9Dɷؙp IS" V[2 0*$+wӰNᓥm&`A0#帕zV Qp0*P9b i(Y6"vq8n!m%~``'6&2ydUnu=w0lhe (pfhH#8\+RʔyJ5-3E^ga:r-_|=O_WHqcBClQJ.F~L9I߻4|NH,#ݨ-{5: .PFufM_F5SYy*N t8,P\ޘ{%KT6رԪoc[GJ];]OBDfN+~ͩø #鄻ofRC;W.1ŷ\pUnb*`mu)v6^`'mԉZKUGph<<2^T!3Wyh]wbqZmourCFZ756eŠ*hIHp #OxBsTɆ0!'?DmsԓcQ˘ +coo- ^ˇ,cF:obF#g,aMkܷpF8Ik00;$l' QcԘlDu_򞾷N"UPErΛ C;p _sol=Dž'-os|#6eql^ЁNQ0ĕ EyfH3>w碚%o޲;E iu#3P荭|y@j!KgRLѮ ߩ S ݀WV#3R'M"`IT&^oW1[h15d?H*r\'+fr*k2ʭ1ڍaq?sUȈCrb^ L:- y"SrIS??,U Mҕn94p8I4Q33H* UQf.87Q;҉T:G geOMYo{ P!ݓeGީ4I)Ea.f!augmt\BFf,D Kҭh7`ӣX뺽)BfQ@ Ġ"ɑTKd1'Sg`wg4 a/^*xU)Ah3dC%1G"!3+J@#YPTҕܐ1l@U_ ,r4@LP9@UoBO ,u HaR [a2#V#1ɟ'!*+ 5:wMaI}Xa'%.prl)il̼ضt&5nϘsf6t^ĜS٢j{q,چڒb{"a%u)o r0<2ƶpO?=q3}̇G6dfނu*֗,m-`-|⢘jL.y,Η8}O9gs5(GVj}jv ! "P]X ?RIK[,(NKy#f ~lIEUk;z'oIcNsuP^3roީwzך1/k5mP&~_q\PUJwPMn Ԃ(=6f )&P-hB=GaMg qiJ{xw TnmnG{lE1&Nwn wfC ^>}/fh06Vuvv!*օwU!]uq[C_xg>Wwb9U+ZVc40ɪaG\*z!%Iiʈ-wzՋ&{ی` U,k3.G <@onaH-&"+}~7?6!ͭRON5ѣ>^.˧y£\"P5DDK ࢭ ܖjQBr9A`O֜ CGSu5dޒ3#"Q -"N0պhSׇF]BV XKαn04膴'(3ETi[Lҙ$4KgaDs~㺺Gء9eAݶmhqD/ܵmLOGME;xFjaoUh֮3"C'TcIBukH/&(:!Dح^YQOkM:Ќ~~Pi2'D7#XE<ѲH3KbSFyW\n~'jIPgt]S6#㦄:CsOÅ#j甩) zA'<)m/N3\fE=R c9RbA.9׏En!&.h=#*Eu[`+h0~u,3!JbCF݅r#pF O&Ho*ZO`Sro| ElW6gCw ϖԄDRM6Z:{ֻIR[:|kTqi.=Hd=p\$"w m>E NZ*vPz V^/lk N4;6nAs+ BJήPXĻ<<1y6q3^" oxPr1vC1)$9yhzNPY=n4jK9@ y /GouҺ[Zkѝ{ R]<P)݅Vú@<,w^*"M(BPx2G2'iAz|}5Z=66GN-IRBIuu s,r-%zl^<-Ǜ(% b 1YSep(c::=-2йQzu=B&NQLC@H;ex%4Fa*ݩh(Cz\ *ޤsb9If .Ha="kfw~  M<^D:AliR<܎r=|&ڝŌ͟Y?ޟ/k|7}?~nS7*V3`uwѠaҋH5 BBبTXޠ(&HHj>&]! kiit{ (FtBZaHqf;.wܵfvH/أ #e(y# S؛h> h]EdSQIR$,p/5, p@:)+<0+Ŭ l%D}v/܊bjǏpmw7#!2asɖe(E"B^ JUʅIu9<.݈?1_#IKy7/mc!?f0~nH2vl$5 vZHL.^d*q}L3БI #0Y;q:gZkj'AFТ EUӁRI|$7P;xZ맇 w~&i'I}qD<˽7K*s:w¡ښ2ʅ [)H0IZ o39R2bE?BɣXkt-%B!XcdAãD0!PJю7Wg,R```$M .t5)P(_&km@SS94tǢX$PZBp˾ܑ#6@IC̬h]<ȍetXH ̞!ÏU>AN[?ul:x[N!:Yb2Ĝ\sn˯y'0WxJ"Ițhiv%}f-RvY;-bG=ly )7leXnrǦ(T3z6xR0\DP4,<:c{DPފ2.QeKˍ{wx"ꁑРLixa?5`Sdt3&m>I3;s|bf.J7cBs)m@M{2iε6Shs5*J"sGXf4zP:7x6Z4Z< 2| VFNsۊ+|7}qu~7g}[? [#;pGyQ/Eo؅q`xzlM_쮫A&!r)h{5JT !),W]{h&@G7S(Qs+za7Olf{ly3uޜE̠ )h9; ӛFfa* LcbPoȇ=ʺDMJ@ "E ,1an  %"NH  +7muOkƈ>#N6ȥ =KkzAwfA /Tn̅bIݵfa\GZKAuԭ!4 Gڰ ]T7=TЯ1.!+ Uy^Uc࢞ȜJ-98Ǫ0R :A@$?,u>]jT\9l눧P q'DCIc4Y:^xZ,G\Bw)@B{qXmbGB;zT)-="ޜV5- t_ TBg^Ly: >egduW ړ&鴔OVoe9;ҏ4D< 2I?K.P:<ԋ b)BVnW̝H)hzտlDxri>Sg6`>:COD^rbk?93 x9-:tpWu{ow~[x?%/}^?yoWC^ɴrDk׿/׽w7 IDAT<,"MUe,ܕ&(.+KL$GyU"kz+p5"" jf"pSD"]v2cѐ ۨfG n+|'ƹDaNTs;Ii d׾y9P2cj:I^\T,1 "MUi0/;3i;S|Uh ݔ>kR ۽Td'in""eE m#y@c%Rq9ۜ'KDS|+r+eo~>oχ?Q_wm]w7oLsM_9S$g8Qj{TK-fp?~d=ArKyVHffa.އe$=|2BM-tnjFaʢ_@3yUI̴L³9HzNjOL>!h0i>&9?.#fHEUlV1jQ0ZUEj LQWs+֕dZy0lwcւWՌ'duגfF=@0ayA_x i_ʿ'PcEn*"&3,٭Dɑ<~D%vbx592ؗx].)E"QwjV>P4m۶~od:}zSN'&b9ݧt?7^!~ݭ36t8b _Zk#<^kѣG=#54ef<Ӎ9c=V /"{n,Py#Mf^%ּsgH'Y[g=mK_W_}Rm>yr+?^ y|5>wٿyka&w,/'C@5 bSK.o0"iH%$Hy^ǭqGdEҝq%Ki+ne>{JFRbhp |j<@GPDDB٬?JUn tp0|]q(uyL3Vm/7}d'0WQL] h>TPZsKOÄ:znj9;3âeb2,yZI <I;@޾kUe Sٻ37%f2eUkXTRXPj֎vR ER~ᆧ98Z&(dJdxtp03G5AF0?).C5imw(dc %BĐ \?)D- ciaWҚfA1)#*X a]M#8(`}Nk>4`ΦKi[`/k}+2螮X$+wQɠO[/@}㞧V>y~oyӛ^[yO8}>_O~ק~=@Yo6 0{zV׌-փ5Z "d"HUݔ3xEaB]vbHB ócT!/@eΩz`FR?5Wm/Znr Rw:("nǨVTAªi6Ѽ.e"pV8r}wNB 3Nq[DNp8] ӳ0saG.JezpESBc^B}vv1Ai y̬O?F;`dMнEcl`!g@vU Y`1N^/IVq JCu屳s-ldBE%:c,:BZqT[fsk糅01)@@eHkeN8Kgpn:2r\}V!ySpyEXosV__[ytq}?rCG>`h-`6nj.hFw> Bl)QBax\W0YzN$s.b _/j#Mi Lyǎ[ٲVL\QU8ƕM2L^`m[Mgg!ȩ0-fFBz*J&w6C~=D9Ū sOl\O-T[F0!TF9%옃jޓ)+"]98!$~{rN>ۓ83Q"j:iOy|>Y?_o=.CdQ4Mp粲2=uٝp6r"Ϛ$i+ Xt0@: FdeM(vtTZC f\1Fѧ6q;%ѧUM&ROpD9R]/j{LNzl*bW/`, iz[\@űB`L B 40(č%mh޻"cljԓ&;}C 5ݭtQ9s5υ.;쎈i붋f>]鉿P 900XggvOֱ4X nϷI=:Wٲ-A\ǻX,!BExvú姶xԿ_KL1jShYo}ǸVM ʭN,~j|x}3__G_og؁9BV Ů@iHhʓŠ9U,4BZb]"h#rzC x0.  &YD'N5,=cAd4dld2%dAX NwwѯޏFkZr AsGpI5l$:izk'#0L+1 ĵ:e"i qhXg/X ZG DET3.2,wI+xs`l9!.,.Nq@_HN^_.K񑮡98{UDD0R]@MԆ&=|w"S,##3*im^_wd|ٜN%;h*9[uH&"j2QLw=O*8\ ^Q=M? @f|_gK~+ws.nW׿[_jlMNs?X"\AS3.x)YkFOVA =g〈"^h Q0 A:.],mg\pW0{$x58Kðள#-]z$$A0 )+}8TB@9b1 J'2z9]5-qV5n+_/şK~+qioϧ8m@Wvٍ43c>J3Hh'5F"{ X[ؚ>IV,T@WK< #MKsj~DݒZ+(u\Ϫ s62}Hj L_S{W槵6@ Jj ѼG,HBag!ʗ4Mg=N@U/vJHR6@3V)M!.c cqMqS73ǩzN$B 2ݩ!"tc^H}[if;s"{qՐSYK"0ϲK˭ ya5㌺xqFs{5 `!; w">;z#gpWQյ@R&b3^~@:0qKe,}gTGbhjTJ H㢛xXb!Bwan>ފ ӭ܂e^0?dߑX*O燾N4(пS?~3/<y|ч>گソu{E~(=Ia\fb$v03Eeq>7 :@sNfn,S'3jmcAO_Aq;#ީ*ql"w"B'${r:Vzw%{g?I^U2X)(T$@.ݠjR!$,lpifC;hgݺf[lfY1@"q4ⵊ-]XD("M謹Hhh2U#S]Qd@qQmizXuH?޽Ur`߈`#|/T*TB2s6Nqkԓ|Fc,%n<* Dsޭq&.`Is !&UDjڊqMqVlf3gwφ\ BqdixcHgdڞK)hBx-;g4I*T\$#B6׋e/w#6\ Q=aJ8\5i\Ta)C.kn:0џzƟ{ן{Ox'(tQt,Ǘ,VSQt&㢛wejTfIN}x#DŽ  FʷLQit\ViLMlZD?^ʺ"OHuF_)ERԮh1EN1)Ĉ fOTUsA|p$YJ3%[n["5u)^wk~,eGHc$Wm,cs^vY3ێ\}tu7c\"hXHcqz^ zrFgȌF%a^2-aYn[s%\%=Cӎ([?W~I,];~tZt%8R0{FhwROc?R=]ZP6 4>(y?0O'~K~+w>oO>zowKg37_[xFxL6<3,+Tu%h%P 4#AɤFAW<`Եpm "Db:ӿ LM5 ɼ> ud?hhMĤ:ML>aiM\Qþ4'1:V)3rxč4T;cf( ؃ -\3&6͏#qņ1CvE"\.0:$+Fuy4">d9;+H+}-Ƿ@9ц^t Ґ  Zx\aH" ጎX~QmbR=^q_eiw켈h |:v!6p൮)9!1~!ѐ5fx7 vUqj?2~Fg-ϐgV>˗ޟxio9.7i>rCO_<[Cg8Cs7㴟yt r`m^v:p>w" Cx[05TkOSK%-)X0Yxi"Bޗ *:' f{|hik#`ySc0i)-'\BaU^' =?u[V&9,6;ttWH~AXT`=43"5~QK+K8pUd_5,)% .7F0 +_xb`I=$C^6*IH#U|cNln\ڸD`7qUW;iɭWr= e?7؅@r{cT;zH^DqwBB̔qI{rW o)?Ҿ]n>S~>͆|S_gڃP_pƓ] %Q W?4NO0$g"%:IhcOdFW.-Ur|14K"_tN6/RU&֣߸V*+/لfQt`0uҙ{}D.礈sR&`80x²&F@VF,dkP^<Xd2BE !JX%=l^ 7jਲedhHx+Z[p3hӾzEY;ZC\W "'ѮӊōOρ|r^+!6<\\O'wH8sU^Rgg]dWKRR,v3$>X\Zo㬣̘~k}B УnG('o |ѭʭ|W}>_͟7}gO}[_E/s?q #cƗZ!F Qjp^5͸+j򦑦hjL9h]"(AF. K ծ#Y@L ;(a<ۉCK jt BT( gq+t+|~}/ԅ \kZ!4~6*/UHFl;>\1ѳgSvxr,c. :7^vΒU[]6"U$2:օcl:AG[dO}jf|#`띾ee@O_QٙA,4{aڇy!tc 2.^̼OXN0'9dwBDK}}6tOϨtnmEXr7xϏ<7||+r+ey>.nW+:/7~׽Xn*{zp`(+7/P#<M9^`f3_D{Q&2@!͑::3(Ak-&=gjPRDzY9e^`.9Ϡ2| 5LMSefR* B2N\ 2C^iRgÆZ!D:xU >0[vlH(AA }A UU/w'1 Ʒ?]_/w}}ח=wEo<Mpur+r+r+LQP^Pz9qp8TvD  `6>J&*<PFebc(Vl'7€7TR΂4dt.0 t\=[C;\t/^_靛(dJjkrנH-oܭ 84`.OŏeH_#fbx/tp_js`bFEXB&̱h % 274a(*sd㌷<,ety40BٌC/+ƙ*-$U҇u2K1’n].0`D>tGy~y?W~" FvT|ɷPGyjzl !K;,:ֿ\m*+/g.QoVnVnVnS]v‘c  g'E6ajZ;)IYg:mqe oB 杖dExY؃Pf\b$AZ2Y!Blv{"R=$ԅ;IRtQ |&,';o%iW.: %x[_ҐtK 1$y>!jnYK?N 8sո{Y@ЧIaql}] SBӯBy&CAzzNiF=s dXb< l\!""-l:SakB/_R0]<CXu٦US\a~KJa)[ %yDOaWH |m/"7|gyϏK <, kjIdkIgQ"|'q0+ yuՍ!YCǛds.yx:f8;~VBn Q@u >TLu^Z!ܭ|ҕ/}yߞ??Q%u_i"?`2xYB2E崡ᬎu^αzV@A-X2Έv|Dnfƭj){ Du/TBL|H<QiT.ׯbDz\EZ:(sIwfFT.(\˵]E&7̮:%+@ / phЕ )PewnP!nǧ?dU483R4pEm#ݶ[z>9=7;rvʮιBo5Wwf'yr2VX"/3ʭʭʭ۰7PJ4bK: 9w,`PdILDFfs5hf+ʴ8vu*hO}Y Vb1}MZZWr&{`[ۻg̓č =Q\…:%j2SձIfP]7G,o%؞xm")Y EisyW8 ʭʭʭ|[$_YVD %aSh`2-j[ykjb'"x($uV$ =`oMRVu~;KCjQ&Sx4dw ҽósp#QC_1KN`r0ԉ&1V@^\=SF9ښ4j B Qh_-w,Lp]u\)Y4Vh &kPvրg?2BDz.g'==hM/T S!A ,I@+9ѢAyFW˴&y3%j݋*35@GG ORQeL`3I3Nvd]W<}w/d?Kov;vL2z,2=;{d*z%B)88-Kط &˚wiU^:'%]rH(\K9_5c_()p&'u@Ʀ&[l9EuW|o`V߽͒(al,D#5jȜZ^r;%'t ю:nX')R9ɦ'9偲Q}\O+8eHvۍuʜ=fVgzxʓa0$DxE!OYI&-:mQ5P󒑞պZ7Ҁ&<s@:"&" f!埦^ N0G H7H41vAڽWb 20ӀGBRB~&lf RBh| }K򜜦Ba97kR-gr7zFŚbP#Mø]D[O֪'@KRggve$]Kh>ml08goVB>shu7\pJRlSR4ol$hrNWC2 ?q"|Tfa}*Mix/sSI j \d>(fi/ Kzr|ԟ(@!R47͓f1:a> @y Z>mrvw@%;鱏[˻yzew 0[-볪ht<yO -|'# Aa A,kDvAeƳO<~ǀOvgd.-sLAw< Ddn;B K0bMxc~V :/b ]֚ ]YzcqM,"ykHN}rDM5pvNoa~f^BYrz?)tT e1xY?1gOwbt @y}}H6T|K+W~/}Z77+<=ԎweA+rr?Q9~^kgG}17ֵv'>wlnk)W;|kk?^]G:HuŞǻ~rDC? trcvHj?ʘBDʞb}aߩ׮uYg8 Fkdv;q\m(D!th':׵\zEr!t$M>ܪ~1t%Tiȧ+x2*(EB(Gy/>wu]:ZI1tmrazv3K9ҳ^?l8qe?u_a~fA5;vvw΢sm4E^}NGƊڽj^kYrM}I.ٿzz)xe(C0wA5τ FJze9oo|CW<X.UCdpeJX`69ku?468ދ5ծ;t燇VyoP_vgXa}٣d-݋PVܕJNظs=ڭ?tLGR{DߏjW/*p9.0V Ƣ%Rnve\ 3dahvxi=P딆N+W@3h[/j$|fd̸ Pz?fre}iݗV,8ʼN3h"S+tVuz;HݸxJc'>LG2ҮT ?%UO*g#uUuMw5>}˻cF{~Uz@J{@!>R3Ȣ*Ǜ=؃;륕&|j|h1ܯJӫąP0E4䖲8 -! qt2߷qa"Hjk{hiJjB> IDATWͱz.4:!܉*مm<:޻U앐O'aʝ>ʼd۶1:7ֳ?/ KoH)ypEs."nx:fHL=&ֻYH3Mh,)+ ]U?=~ې92Χq9>YRkq}S䀊wtLYKAw_򤞎hm8,t<\dA18&@D" ^2Xi5eC9XeD^7)֕\NWugy ]wG#::ԒIu<_qGZW0QRaLLu], ]eڍ 0@kX7 Mܡ2Hs:YOͥjysy k d8降#)`{Z{{;'kFmG>t},#J81zEձʧǃ2 r 1wq\g2`!ÒHd{N2NC͔@Lv,}aYit0+pZ7$$ت9X8:9rnh! qxr=֫7!_ٟ|5F+T0(p8+_s)qiEĥnƦyxAxžV9(,P4: Eڊ/h=i>bZIOCJ+~0 uk*>EztX>b#7v׉²P(/t(ƕN4NۨA[rL.+w^-vCSd_~6=,W"NO|KEJj#g}/:#$&NFby4hD4̡]dF S/_ odmȞԒz BfA$ttHrFǺ*`^CgybU50 X4EOD;L}'BC47j˪ѸƇLW\uR`I?<%&}q랄yu~dcmx|ia!"jw!$(4ߙc/cG~o}߿WrrVQ s ǓP޻]a;9glxl<6ñyEBi*T)*!R*TR"VR#j#Upt 6&`{s;}׾=`u}}Y{e_j2MTSN$;W Ęƚ: aC ӭxA /!wX#MVojaa"(C, ޠ9@횷,7-r yH3=`{:Hd)%q`~x͟9ONzǾ fjً(=ZQ2R̤L0C[셳Qy PI;R3.0ɱg1% QAׂZEBL6œ::,W?w;YD8Y)-K54Cݢ-=;P>;Z<ɼ(-rkZ/{lN?!2cC,;r#f(J/ƶKZȜ) lT CY)ĻU}!EEOy%NЊih-dk4D󙈐<*$Ӄw%ȜT ^i 3YI`/圹ڙmm#OL'bui&:3I%DLeI bՒѤpM%9;w?ok?bK1&b#zNĺ@쎄qg;NQ0WPa_yC-gBæWuL )?vbg.nڕ-jVᎀ~0C۩J7n*D.KT#w^ prUr}{{Cp/!N*Z)"e hQ:v-S԰L`ƒ$Qʅx,B>,bk}9CwL\f[@PCe 2֙~Y6rΤ3-ʉc#I37y hǞr}* ,)¼;! v*r'X@H 33EPμfҒI?eOhD`Z))qjCD$&(\1Ke'6qΫ{bޱ-eg΋r! F9,5d, ‚ Qe6WbAmDE $&eLvw-wK~U<}<~';w>}G?wl/ͫ}wʛ~=??*6óЧaWH١N,!=VךL˪ *ų2pN q06Erh-7~A0FЛKSȳSCBU-?-'޼KܽA;i0f>%`pZ~A SE+Q ^ X6Bӝ^p+1v@D}nRQGd[i7X-nS%)%,%SUg~M[砾H$[\*i,,B<mTfX( ^ԡq{ zPM$O@倍(\WwĆ Bt.;MqƫNoG>ֈZe}s"fyK&8[E^$}׆ظEۧkY]׳xocHDE KDܣGA&A!KN=NkS̙sھldž\2-d ?V C10!v_ʜ@fq`qx 7`l9MнM ]URE*綸!l[#4]hޞ+fNnzn! BCaP9[zw_kQ>P;$oII|.7y׻я~ț~/"#//{~~ gamܽt852N&EgQ0ߦaEiAlTvͧáSI3Fɲ7Ekc'˞\n;yp8m%aGi׫/O 5٧Fύj} C"nO;d{E 6kΝUp))1-V3P3UUh%S\G.*m[YRe?8U!1U53G*ـcB6Zi&lw83*~Ÿ3q"Jz{^ &g3-hrv  NʔS4Q$ o~qB'c#@ԱQ8GX̔$135ڽ!0~y1ᙳf4q2C\lD/^(!¿ R,oRbu -v{acL չ;_#'9C\&dU?q<ĻuhhvN=1V}ggw֯7|ӷǟg/w>zc56>1y??>};$15]'7Բ*>T@"=\% C{U2) Ie]CE|P4܋UjFM{uP]{cVD$g~^8Arg_l?` ?6R\'[b5iM=*!7"AhF!†jV7c?53ŵ>䱝"ey::)(;`72J7v ^jAB+w&&@PIy.NĦ)03*!6Kf%b <7`Qf 3 wfǡ vYCfHS5a|e#af "Xyo\PT.c۹ A@\jz|!FDvo_B;gLbO/O>ؽ=|ηo~'c;;w?Xխ[_O?3`|;LEvؕ$PfNoETLVR鍊^<^Pz꛺S@þJ&ϘﲎVqx6&b#շzHn}cyN{An3&8&kՃ.)r;*AyCGD@fX 9 "hp2F D Q2qWAZ3KQXnՄܴ!is ܹRiVgzk;Xu\h5$YA)%TO\O^䤊*gEƵp*Y<֛!^^;?A.p(W$ [ {Z"_?7/Pn+8go!V'?U\7?Oȏ[n~:w˯iN2w2{>Jq3fb/d3NNNrGGGD0 oU]t(r(QZƐ`>gH%d ҕۊDGfaA],%_:(e6Obu&S-%3Jo'h 7ԸP(;ThT%MO$έnׁ@JrPJ`Ƞ5;cC 5qb㨣gWiM]"I.̌Ds%/0*SOaXo٥S|. ;)2GM3LlšN"rv>V0رwHZWaq+2 90Q T=X]tS^B$]b;&9XMZG&$df&q&" [r *HP;h7*{ B`-uo0:]!MjN]|^V )Diqh`PgЎJ=)^'cWT} f84D1ӦzU59s5DAAt" E9nu2+bK!uͶt?GEГk̅9\8sA=`Ljpyј*;) he `P DVcz@5V8YVi1;y:[jb(b={o7Lx>Ja9<_?HE>Oo)7gKv /nzx??w?'٧~>੧>}{{}/XF6W6Ցa\+d7ʧlܦSξ ;'XcFk4HP_)iS (70ζی*6b0jA3PLzW\E//CF67i ɂtmt&G2M ^!up?t$!3 C̓_6~FCQ}QB;;'_0d|[%ɠR3~; ǁJ[5(q9 J^t=mƻ`]iN+ uG>TeSfٚ.J(m^I;\1jb8eT"CQDd')t}9ؑ;3S['7uqngQb Ɏ |ddxսyw:v' }&[Ud D@O3D Ȍ9MKr"u8M8եN](iW qgO'g>S,Q/TC3SO3s!67C|~<5z~jCW5XQ{x7/uP(IkzYqAL10-}3c-?C˅O͏ğn'@CH-gq޳_2.4Q#{f+,lj5.BΘO N9z|.k%o:|8O4:+Kdg  N ff %2bT2>=E8%h'CZt>4_-3-w۬t /e*5ڶLis1ndZU`ۡ 6񺣩0D8~^̇j`߄L`n4u7Pm>::ZS Vw% #) 9gK-hp>p >R@U!w!PcBE: ̯2vOy0X6R/œ굵{?@DGGǔ-GGrU||r؛^v7So_|}/eΝ;|;qO? u6i(2P8:Np5zaN3N&$XVd"F\ IDAT#9 Fe(pwRm&>I)u,̀yw45zH)QcHjrfJ f^ )-DsB.qIu2NI0Q@~Dx3f8m?QʜW"1HjNApJfGi 1vtts5zBD"DV#-%BtAl{T=BJĜ(,9xE GA{s,72s)h_lH @zT%$M"e©ܱA-ABpe22-vOڥ79xO%^Г}ʙlyO!%g , vteIvhS4J kg.(VHBpXMdϝ.?Y)ko_a@(7>p#瞽s'//_{M$}=;w>矹0jvW!VJzL0~m4SOӆ]i[9Yr5vXCٶA|jRpofiadKOTFF=kF;DB%F=%pR\Upft͐}ngf Vr]Aez=cGf,\]~W?򆛯yx!J˒#J -W+yW׿ݺ]Jyݗz ۷o?tpfu֓O>y֭?ai63Cw#,:aUmS 9jZ.bR^xDE=)}Bk)8ʋ,WfsK|ͺbby 6{S֯&?9٘@M }e%ޭ )T톻zߌ>֝gHee)@c~:GV޸ǎ[EY2b^2tͥrd Gs{bFIz"ּ3,No"` 裏>ò3d=݉_n!!wpBp24w^9 o `׵{A~ć@~ReBw4[nN6q<q(\v6NC+R㞰zd1h)|#}fPwGL:9V BbS" ޕlqAj7:-"ؚ-{xa %vc44aABQWp`*,@zaEE9Bba#lpJP9H_HMwmr tl4ijeV LRG~"/;k2[H`J4'b "'f%z$i vaAӂ*`)URPC$R^tY;W҃׎[t?^zիWҵ+{g_u^ V˹[D?3G_~koHW]{5=p|c~?^'( :ua(S$D<)A-#cF7=sk)%iMt3QᩪGrzd_EP6.5ǡq*x g>x̃T[ IG}gjЗJI>1|p\%hUg,6zJ+2l۪+2esUYR\Qc^dZ$:5'\N>X_.{S䢯64, , vݛ7i' ^s91tH;/ڽכ$)^p8!"df5šMi@gY0.1 jQ reG!Q;fR-&6^jYW%~;bfRge<] ncGN:XKL>^R@d% ZͩCu<٫tT<\eoW9ݣ|3q*Ѯf b$Ҍ ?]Z=7\kqQG/=? 'ݽ2e\ 9oCڭ kpk!y1J=G;MOOz9W{ TW=~Wϱ;/t^xx/|d_J4ak!5qaR74wdRV+RJ6Z٘ ݨj[X4>Y/ kVRɗ,wQieR7ْMCli/[ricm|b;*gFiF!Qk67A8*{fCk}+to߾-N$ 5'=E 0{L#JD~!T9Tb;~NBDTseK%P3H/HZ̖3>?QSdD$J~λh-Ĝ]aN!e {wx@,'ցFĺ1ơ')/냬B aYMAHx&ZX۳ cgILތU1}oNU Y\mh3۫[xI B'[|swYLzϓSZ͸^~5pVGXRM`nYp%@zY*ē tBH6z%ѧ8J$`(pd? FctwG^[Kz!%eoyu}ݻ_}ӟ썛7;ŏާ?_wOn{xJťtMifmghTXL2og(63x7 ΊlڣhZFDz:J*rnp91`/CZn*Geu{KݣԣP1qyН i'?maFqD5Dt#375RDmTRPnQ#ٮ_ s[,K$ƂCJE!y0 @uV_V$n#g3" ڭr +&5RUaADTQE]N,4%gM sz?|g|G~u~ {O_xN{՛7W/. ċW׾>勿| ^7/->9M{woٞ Mc9{BiiOf=Fr1fRm"z=0a?!Qn6`F&89 oѓG_}7{O}}zy1rQ%W/J9gc7}[m~)G<я|Oy/^o:yj_ GsFD\ QK[j{]B D{0U dE29C4ߤ~Hd(2GL$D!BN?lX+R"j BB5<6Ecrj3 n "A; )3l*vW12&/tDPuB{=D{ONˋ!!V><$S9ISW<wDv΄x׀qjHlߙYyӜPơQc{AZ^89G7(qsL04eghq5ZD e 1g4T@iN|`Mb-Vѳ{ -:x|6 5@<->feg{4vjT:O2?r(:?Ɛǿ\qqIlR) cC23  N3U x6DGÆElܶbCbVהR]*$=m IDAT<*YGdoLq$>y5gCrPc8 3) TP1ƵY8 ځ TQW" <6x{08\K{'>4,ᶪZ*/ ?fh:%trlLlfNu1 > ^1+g3=14e\!a 5D6kAg3]O(AF-r-2Ur rEKIO2ۺ-?90V]kX{_8IN9'#\_Un^a\IH}J WJS?Q/K aIܯg^@EרauWc+7W"lIfN8,1N$$ dI̠bˑaT"5@ވrpeYbGb*0num)Ғ`Dz+Gxa>]:x5*v$}C%=#t #;w\fI z?1 gLl"ۗUm,qJk{E6:u6 :dCW=j[u]05B+*WqTą 3*ٖeYם8jYr^XRsH%)&9Leu. wD_#> %CJ3Z+) ܀jz  %/y UXZ*<ڢxw)y 09\0YU$5 "Q#_{ͧ8%7l|ӳ!Գs$N;0-d@&0;Jmlaـ7k4Fak7 >+Tpz2Lq-;SQdGP-Ж"LI)y2ݹ7ΌyXA #;$eY{6stc>FIFvdf (r聉3ABSHv&uzZ5Q圛r-lV2hYYC(%{}x=]_wXp8 rGAr WW{'rޕG~_\- ~\<ǿqs= ~Ws'iOO]T!XL%dQ!2)PjT"'@'CҶ.xdP]--D,>Sz|Q9gcGw^<~SqUz5ϭ`Jpƽ;ּLjzmߙA5 !hck~ JCQVx(ךG_ >OU6\4奞Hƅ4ڳ7/ғP {fG .j&}@Ch.U6-s KnԹg|QQ Ցl*#Hi3,auHwZ.!3ʼn-CH(6qbCV LYαI u& (3f(C#<cVQ# 94nFKޑ87f߿69)US7:׌,%΂)mtXmgX̭n%Ԭ~C[u«[.5:jRJ4vR@$~n'rM4Ҍ/f":̼ &pf)mop,Z%WGns "X`L SɈBŨ$r7i?QX۬FoκGeq |ӐI՚}3E;`631ĨA]H_?;O?迼yc\#{K~ /޾vs̙ 8Dq`k:Gݘ R֙&{Y7 62yUrVhXμ9T=иHy5/ ^J3ٜۙT˜v̫Y⾫d` ~wV}V2 Tv6{DVT c䏬VU)}`dɯW]<-fؾKaXyWi3 ђ Ӓ"˺C0`aX_y-*3GW\½`zĦ,_383 13sZ3Vf&NrG.3g].Q5Ip, KHglLuՉ>R"0WKuB@L):wnW&sD$^\9PD ja[%^nEUc ҹFjwLC5$4l^+/:>T.rFXse.^+4@N1l)W9\́5bbfaJDt,]fg*s\'\\J)%bY&C5m *n`Q% -, TXMfvdCO%nWj `vYbeSny_}5ǯ{o<[`r;*&ho@6PfrC~]L̓7+ClwFGl1e{yTM5X! vkѰzgy GS 5#x`nilXdC?B1n/6oHl?l7inQ%2LMI٬'`}1l,K'j6IV5KVoRI&!퀄llkP-e#Sw mFB&+&7#2b4Rޱ$@nR'n"F$hpGBf83眩sM bTسF 6 6y|+ Ckuvc`+hMV֌u<#Yw.E H+f{;e hB\5 :eCW 0 - H3̼3Fmm~ӽ#/]#rpF>BBG!\1frQ //ps%@;z{m=o~o}k}O?SSpO>۷/Kh0UAl1Xqv\mTݴ!FﭗY;3 vCl:1sڴQOњ863}9.\f&:{Hsw6`kESHbQc<2F-8jԸS` ̠w|w?d*vwdakIvrXvee`+0Ȯ!7 Fy<-&CRU+{nzySaioν3a\35WJ]T|r#B[W ndJ8FEh-ϔd>׊)k&+VL$CT;$rf W||`퉪'՚CѠ #x؛WI;3t do5]NԎ;j괙[zڳhc=l_(z^c7fgBjM?l.֛l݂o5bfPʽ{1=+ ?^ Uu盩rBXyPŤWh-sO Pfip8YNp4<_6LOn(OgL=\ P4jz^IDU l t e" %.s;fyFXu|B rΤ5p+gˑ z͆T;RgMth5 62z[٭9/UɨҒzYbõ@u-܈LS0X5']݀hi Lt{Z)Ug̀Va,f0 1raXJ3 =VtӦioz0Mjkؿ̭iX%‚+{ wt YH}o.+e/Úz 7YW9и{nM)ͨ)z]JQ|>F'N\|Jdi̼u$#.LAm"̵m&@]ך*a#zHU P$c5>sDaJzr OTs%FCs!@++ ru낿QLMGOInFܭa:,eJ.WJ<ԁ35eFFC9.w3/ Pw]u/Jk/eyNA}M,  a)T4I7 *U=:O6W^h{=VnBH ̕-$BPP6E,CY숓cD#v!ӫrS]KX@3SRK7p+' H3Hj;H|5S K4-!6ŵ+3J?QRd98+TWSͬ3~f.h X :9P<@1[^h@ 8Dے؇gCȶ! ;$twzVy@]*xo\Cj+93;zC^/(\+tF-/>fD9.e:GóUE.hVQ 0؁P/~q/0rzԐ{_ocFk5!cA~CCn{ħfhm 1M (NO} dWJpb?4Iw9܁tv?9i脬 qK0)MD5CA%=Þ5"Z!ZK$ Qu7N4[LhmCT@!MDŌ__RTWSj=D31?sֈ~QM ah6]-Gk!q5U;0TI3y`a@)ESJm2^z%rSOCq\++:_DT$[V *‰99C/⚫҅J"Vvd6C9?Jme)6j4h?DZ6ìrM16-nc'b([۳ -Yޯ > ,Z q[w>M}__k(i콆C\5-=VgrPg?mg~ H^Hꔢ]B*lt&^33LD/y Ce(e_{ ]Wyamj&l{u*6Jg=dFZt&s1> qmPr3AJtԮ.j =R9xiuQ`mDd A(; f8"; xEy j*EH-RPI^*eß]{AEF6'rߘZWbk甲Fbɂm!+cc uF"o Lz-ckv_]|n/>6sTR*d }~la@} {SlhG\XH@k`_[o 3Di+0/x4F̻ ; =(KfǖG mO`[/Ŏ'Wx-8ol47jvo%;ݠq&`ʎ~L.r#š)j\-W ;"V?R!qLU$L5t YUʔ/H w< 9M_[/I_~}l:)N s[\@Y4WT`f("Uf @ˠSMT,gޛq|eҬ1Rik4Vk!-cfW&i"]doٴ򉃠5z'f据3b}gMf cÁ(Q0fTR]HP4Аk˸ҳnUh!$ (%ndtgF*UR Dױ_!γX >Q޶+ MJn!O$cKd Rep wa x#-9gWϰ}MѤf~WUlj 2@6s,} 'G9^@5+kEYt^C3N6d]qژ0#6cG2[TFºkju =D6 ԳĀUX; ș؅\27KȬiɰ 5\w< Ck)}y1r^CQwlCKPh #؛A>9{SwhtiZM9d^e%Om#No/q79CF40YH"K3/3}z><.h} ԭ1R5vqa9+Fxa %;iMN s2ՄI:i08ޢTyGo VOV]j=IJ4^ X [P-Pܺ/IE g)ɿK^d<Y3"YLck^O/֫]j$s:DVa+n2Br/3`~uX~MeL 当G;ȁnmPAE[ֻ^аQ+p"EJ` .:F77r u)MX wdyt#3FO\LUɎs4gcJ|xڍr?/t <[,Qk*٧1bR&{3Fm ˸=fXۆ|@pM+?-NVZl/x1Dv( Tm4r +=3Z߆SқME,w8fXJw|{:e+ K҄cTX t$>%"3chojYP)Q3k͉cоQ3KJm+B̑RCò>}+a6}根Z'9|U B#_ļ6@1R`vZmt[HH=#!y* 9:vrJn1wXrqgGJC)߳zow g])|)d/'&GuMSϮf-;dMH0uyC~Ւw!:dsڿ\J LDf u6rWft47:ˆ <&@ĎwD-3tPqoUq-ɍWQXux'Π$IwRJ˲xSJr7Wb܈ef0-I؀`D!Qac(^:w}'PJ EnyP8 fawIJ7]ּ4]!*Ù3+ hDGP?{omrՇ\ϦiBdIH& ?B"Z%U jHR%@#Ԡ+SKMa)vML P⭛ Jw?ǜ93s|~k>̜9_s̔$1, ҵiQ>ᙂ3 $_e\pDKoy yW\YЏ>Yo$ccW4ґK/K,VU+m\']Zb6}z쁂 тERjA(*Ba*[Bsl$wb+,FZtp'j DvT:Ψ7ITItL`9̦<5'4=xЁO5^ Xݧ޺jnN!ݑbsT2@Ub)mP Sv\{j׻FLTͮm]gi}P/T5y"x4]xzq{ P#6x#Ev JT ;U1/.Fn $9E7bGgNM'oDpX/q^0Kf@Q)wSV0JG r/SPkkU0jfVZ ~Nq]pj~)g2dć&GR)- '{)^J p&WnopR G?❷xD5L9MZZտ& 0#skl/(JNb٨ݩ@ ;)sNƒExבOa}lQC@}/7DZ$?63E5oHSpn=K fAsWrXIIR|19?oT@D/f`T}g#E3e̷L:s{Jz0Jz/7fZ'jQIVsUlz)̨NL$&߄b!";0JNGM"cBԝ@|/!Jf"D{42Ygkf`I `l*3y?gmfu#3=IYvL!Tܱ)sX(!qRϋDDF,JloKqoʤxPd? K| w`lZf𜺳[*eMODw*4޶=mDѨ3@DI=0׹,Nx}b_A Pk¶]i惆"&q+Riygm0:vSQr^f[cϙ9)C/ʏraַ~cl|FlQH!c+Y XBis4ّOYpG)s[Ӣ:vP-BO,! 0MD}LFFŵ8!jPf`-#¥f8DS9ZA@Bm'6 n3B2+bޭU,wt%'\^tO@8q,QѨ%t?,@if-g @D0/\[>2dcցEv++C/2f7J++s nhqB9C3 ]} 20a>E $q5}*^?ONx?]?|1upT)ז$D۸/!/1 hiUJ .?G6I7H+lѦ\bʽG Mg6c2-;JchkzO.ƥzFrym21~ g` Ds8Sm.9ex֋1蚾RݵŹ_ Ѯ;l[A@wT'P)]g6\y2 B4/;aWhl"9NclATXZ+%D"WfgYevؕmR)CIOZx#<2A{T!b ̾;vc@a[D96 BveUyǀbW=CsItff$0) xKV:U`ͅ\̭F"*l.ѐ`Ͱ?X]LwJ]\+W !ZxS{CWD%=LWl:gȯvWQOۦ T\C.JLW$JiMEBB!›&. J6|cQ ^NN# 3Z+"g㠗mad3ٸ3RkٕwfjTV?g=h:wcb]^%_J%uDT7uFYZ T'=Tկf6&+b RF  WۋCl}XsSF`dV\2}[`mO&f_A^1g/<F ;JGd$EPam!dRh5ȧÕGWh5MÌq'6&ٌ@Oeyj^${ XjblUHF$D?}&S҃>@5٤}bV !M]$ }lQ PN!q)u6l:a$i5^N.Su9Vjn=3H#D93""BW 4KUn4=K~.Bc0NPzhъ/vGZ`ĥh#^e@;м t]14Ybmx ',.A%ᙵx.UkmַUmH6]=>?@zk?7|ꟴ7_ J;MGݙ*QZl2j,Znj鄄1nSM}<ŸysQۏG|N6pRsAZEIFoյCd{%xufJ>}Gq!N\ ubKֈPcsFo4 SJ M9Qr|ɳ{B)rŅ_M ŮՐKÿV҇06* , c{ /D[2L"DyS?VμOjN},@aFAQxÐi('M/*o-Ou?q0G  ӽ8(slN5%[DiToƹ&9Z Pct_l.r"nJW&Hr$`QZO#zL <#he@ y@BigKc:ieXDm6{]푄_0tR{s>>sG^~}{OOmowooy[$ۧ ^W?37[=ynRWo[9Q('7+VDI$y/Kͤ'Դ'I,v ޕmg[:X~WWWDQ۶{DykBGXRId1Zn#N&Ohk-ӴB0Ro%"syjkGXS S4 Se|HHa4*bp Sy2hZm.r1<)vL-_SS purYnOo (W\{4vo|󶷽Mt৞zJt{g}__՞M^ӁŌIEJ/[pYX@NR*0b}f=ybx02Ҕ:7z|6IU8yr)^ ]\)JycG+;^1rX]p{4@ %r~;3 eM6TK Wrvo*eGׇݰ{DWcbXMicN+$2ީ?ʚsǂ:V}K?<| _>b^x-oys=ۿ| iBR6yO8bj" e{mr/0cO;)*OFƺ^j1e:iBW[!rQHI 7GV2a"7&vě82I E~ϋL;(>:^#dӁ6[vHhA^atR#+z?/ȝPΤ$g 27YLW4owhdm.{hQ\W 5)F }/O=|roO~/$g}'o ϴ+j2X13Jڅ#^>Nw zȝ$1R`Ɵ't`G59iSApӁ?ş5EOg$.NSd?fJ(J3SO.<-Ӂ+ ]0|*6EfWPyG0z!^#dʹ]oC5ui.#lb ᬄ4W@M_x0Mg y+.*Kq,@ a/ B(ֆ) 1a R[03S|V|Z/2w>SUs.FHrYkn.!I댡Hu2^kzY_ҽVj["I_fFFP:SsPk&#QO/js pc,)h9 1QȚĘa$'exj%Z8!"c ;U=.^tDcCxAz3? -_N,DNwy?|ɗ|K/~~pk)Û=z׻~GTv?jSTŞ بq2Cq* ye>8rk)x/d $0TpA I\={Ko =JE/bߦS2 JҤ0!R~&Mλn f%2"Sӊnw:N>&LV/pjgp錞mհA[` 7Q*~LGxK{ 꾋)x7O^pWvgb]AqLFy]8z2[ [^7DGKB "Ps45w]2MD$l_1aN|m~AQkN͔b^_FƢ7b)96k}@ب0j~EJ(&zn0XwLiTH$G~ "H$.LQC-o?Ux'*@wk٥\ vsNًk@R;Eͅ DB$ZTŊ\}Fҁe_~g$pK/oW\A IΪn"ʅg=W4`pďV6ߞKR-ۡ7Y:n(j,'s:I4taWd_ .˿؎Q"sO%y|R;n]Oė J Z S"qpu;XLJRJ9<`W23$5mf`ֽ*w{0[E8'"S 3"wyHOLjDR+UWJjw%a_NpD`"01z,H lKbo~ fFWO.Q7і0p!/ˇDf`VLt'LȐmpSq+{_bZՕP^NU:(LeqwHiUpAZ${QĺāZh;Lk #6NU= h&&+dH)-9$}O>nAJǡP` 4XbuQХ7PX"ɚj;(N 1SΈT6j=} u3'.Cii-slW W`sGT-`KG DBncŘr# 땃KDI!"JDf (,>ạ؋`R^o X5"|kB Q[~qڤYaZh8̂~vR":2  'o?Fd 媰 AT`#j'{Ņ\qRn˺(m$OkmH44aSۥbm]ZlARbMZmN%(ݓ6/u}c޷Ol8&Qqߑ<.O~MǼL=য়~_|7ߕ:8RPNuJݲpD#mzpLkH s[S;oZjcN紿Gp9G9T$B/. q //(UĠ@93;z.3MN%&Ki0Er5U=+~%j"UӵW$Fn',G:nIЈHK$t͆Ǭ#MT"E' x/ъphBHHA=a%iH/+ibXhIKYI퉔ba! l\e&r0skAB0̈ 5Y;eq4V@|< DδBi`#l;J#lsY(]Q r+wlրNqpc+b, K F)H5\$|XҖ'_;tRW6""\COmv% E.zV7];l2yPÛX'dI)LH)B3LʒKryYŕ< Jcq~Pz]]wc{?@PRr'uy?mi}vE VihBD0]csX/בOM>Ctz䄎-!-\2|iZAgZY3;x+pۧmӇPKJMj+p31ԎIbYy ]3һ8iv"b0I`4̩zm+oF] LD2*geQFl@Lҕ&Hr4 4ol1lbݶYB:u[-nJo6ϕ4j)(C)mMD:V(<H"f9mZ:8:.v@LƄZNy~%`HR`Rl f1ձX0Ӓ7P!"4.^n6 Ц҆MJ!d178~5V4Gx|le|r jhc7z07 BT(HvG`k*QxC~R^wFN PЋTi2"QmC7!,r),XHآT5 ghZ4;^BDrS#r)1TJ) Vjud隙mmM\D`ޙeM:J➇o(l[y۞ ,\z[ؘ^T_ fFmJSɱgyЗ G_r)e#PJa7\=j( ZwoU"u =o4wVM򢻑[g8xRD9.-~(7u~̩s8jr[xa1X(YVBU `.fԇeO+5vT C]Ą rM^+ž.l+,j=Φ R TUl%F_czFs4M3ەN12OTTؼ'j7:qk0?!VDFR 6, NImj>wX}qk/o7~;@\iؖUI\fc:VIr%gZkzJ9g᥆sg'5 L4JܣT&I' .)13@کdqX R0+f q<̞`:)I &tԑsZ'4 Uhp:*2,ygyXep=m$ lFwa&Z^^:a нmZUg8g;)g5- c?H "SpCrƂDz C>$+˞l;~BgTpaD>k.1hܑx|y@xYbmj z'H2ݒ$э"Zd+16s̭UñnEG 5]G; bywaNJN/%ZِaĜj2Hs=~uFd6v;8{Q+4LC۱|8Ҩ?>>s-4W}Wu;ؘЅ1Ø8)kJjw^QXG.k[tR$]倘_:)@xhOU1i Sx8hk8؇؛.PQ48W;{ W3a7K?#+ՇCSpx!K~&fgG5ZthUeL7ՖՋ -.P)W` lcð``!v&XwIU9(xif)sG/BkaZݱm9̛ENMaQuCf@X k/]ʾcުgLM†wuq (}[HӘ|3D$plWQôl10o )Ѱ "T%"9\ b(wIzhF1z:d Hxh"yX4Z[Lmխ1$[>Ym둴'gBxQٵyۙ AR̜ ˝CKs=x$V46**g޸HFxn6YG@px;#H/~Ϸv&QQ us; ADς |p*o(+7V?-ͦ E"00.0[+aShEs:嫥 k0t4Srzj5fkoD'8A9U.;} 'cpL[xiXeA(LO9;4\Rȶ6GՈyN93^mz?xZl`mH{#$11 z|7~C8φL˓n TIZESIV)a Tn']QGΈyz%Ac ~!?D@IDEn3* Ɨ\眔,DQܹYZ9|d.s/L{Hv&LU T!ye]hKء*o.w- E)XXM.)m{v J{}}z/O_K$(Cg]_R&rUNV E"u?}AGGfA3K՛5} )y${8!cMXXLL S0G[f*1o h'DЋST{yO Aƀ&\nApMdx(>%ȝ:TϦhT>i!ǢHDHBzC|!;=ބN $$_?2 ƤȌMB_\ Eo?@:q1Q#\6cu|:90J+y#6V4JXJ9'C]D`={TOč>2.>N$]:+LnCNQ2q$q篬xE.(Rz㼯LdLэK$oV҈jNڛ`7%4>6f\o!ĜD^@Ok #ٔCs뭵VmPkZ\=rQL,Q6ͳiw!Xm4J1$SeϖQnԔL fmQ)N}_SXzi@:DuC!e 6 $\$]q|t|hpf>Hq5(5YR6 :zzbLK/;,=fJԄ1?2?_Bp媱9X3H'v0qi*kAcH/_xu1eկ /Y2=9{-.e:-X^+o?/+Хگh}~7+A ~x. &Lms* ,pT-bB'3zi8mHԛAK 9HnvUiT} 1P` .aQT"$HVMn=}*UF1 es:M1Y"2q#T~9(ra~Lz+HV((e H6|Ҽs&]NjuC (ns5Kr%~j`QZ+2hT]/=ERֽ-TC& 1 w|uT)89Mg~4tY9F7E01ﮜi/!͆·//$lM1.Jn.tmc&ʃd 6C12_˗Zxm n;{H/k<`֣r d( BthjRJ]w}g\b7T|w?`D})K?Rij #á%Е%+|˺.i3Hq݅7hO7+whw"])D\p^Im @`8x: Zs`ˉa0e)14t20W`jTlZ>[~ =ͻA$.WxJ39WS$DB[2veIV|ZK[w=?2}Rϯf&1g*Ξeu4˿L "  Znbu[2YZUݡʀ{uf#5LRVt Z6ȎC }kh4Gk ! 0CtD%{UԂU3D)$]G%"V^0sCs.$%~f%ܕh#1S!և*d UXB4]؛4WJk20jƩ%~2ij='ೱ"G4=r.%JH# FF4L0cJFHCF".ʕAW-GMhʽSt" }ke!UNk4"Ԧ/$_A$f^'[jtQ$ܬœ͠ߑEquJ*4MFNvmTN?vNU=z* d6uW67z2 y 3{MAz<XmR{gD$y7ɛ-` 11P[MGߝH*WZt'uwOOHʝzxSN-Y`gqKT߁b@=nLQ0ՎBRO*~\KPKhX0f즟%+<g K-zCFD%ھN}ct nN>gf];69L$|P f`c6 xFx5  iyP3ceMq㚺V?D2$/,J]`P%#.q=BKl)ҵf-OBқo RD(=~d}|dgPQ> //H#)zq=w9/m ޥ|}x]NwKZQ=(u=yA5 q$N m2]U ުTў{1ࣚq 9+7NJ__o}7;׽.ed9é)v/Ӛ ޖl"t~ϛ[k|IkWwcmm"]Tf1`A],+Q!UE`Ԓ,[S[*JV~uL!y$"0$XۨɃO2P݁S MZ{`&0@C*$c `ga;j^9,\SGHR Y-cwl-If$^ uc8OIXw+ݾV+kh.<&{2=ЇFX=8Iw]zm- \NZ{tȦh[̢6y3- "#Γ㒘X3&#q/8޾q :bwiz#CY#e|dnwf A6akGBp>JαbͮLbb IE\npt0S|\D @G:ΰD,+(s0]=_;޿? #S|#*V$\0I"W51[SԵMQx2nebSL.&M@t8b_JN~$nE`6x`W/XexS"e†"pU :V'V9wM7?ӥ:4׏Z^Z-)b/ē.$qDJДu^m5kMğЁ*y3Y@m"<:w?T$~PF?v\ (D3?|;]oS"464 u]s(4yVĻ񀞆RE/Ҏ@YDD,^YS+voK 4qYeyىjA"d ĦXv2UQ[RђF1 *^+@:޲WY@z$db8#'9h8ّ\$E C[Fa Z̐[h%&^ht9vLPѱbKs>3pk^_}饗>_O_~}׎7,xĔ֕"U_YF,Zl$8R z/O;9}J%&wsأJ0-5'Z7Bv}c3"/hTx?uթ)'K~$w M1her6iC";$dja ;%6ִ/fEa6CjpPx"ZWѶظj {ݕT5O=~I{'f&Fx Oߊsح0T,d"Sfє E uBb7oU݉YfaԤⲇbT'42ܜ5rƀWMphJTڨwˇ_{eybD8]*PmH{%"*-0reedAH(NUX"!WVr=Ifg1YPzb WB_ +Uܑx*?E`JUQؗl!Զ&+,J~.M_^(_L5kx9EP3cFqs 9 )%V@9餌{Ju89SNiG5Ʃdylbhz~DUmtt)ʭdE2}8p(甴mG``x*b }\\_>o{؏;mY-Z"c#`̅^WݭDqvL#(Scra=ީ!Ǚ R hkt3%pgX/Qb8ΕA&t @6ۋa\{FDLUv4U4td3b@CER?*b%${(h7hUb]E$>+La:23(Dbݩ~Cݲdyt`e4jr7 ⴒSqս2@a!~[)iov@$\<"CTese{[UT-iݵ}u̎PR:ƃL%´8 dLm!7JWzї;,7 $;zp0zM Rg`*T TqvERjzZX{]>ZOĥZ+X(3K)rgDt%"6 \¡k"Bi z'x^.z49%bPF,)K$ on"538eU|Wi]~n\dMWDo8RV{QX?'tV9Su܍3 QqӜMaY(ov2kF 3-S {v kҧ:֣Y)33`B{ҵTI,;E?'[̯{wlDp3`^Ru e]Hu E]H3O–GˈL iW1Τ>P+*]{=k,8򋱉|{7 8c8+] ~-@6y F) i{ LDaG= LYx7,jm}LW,44"I/n 9^. '<ˎ >w_oC:غm)>\ˉPtmԗ 8aL#k^M\ݻ8Sya%i3tgG:a'v64KrX(ViRG"@օ%+ \{#x>Zu_ߔR`7&9/ey>_ azzs|%MH@` /s:+fwGqg% ezcJ9mA%iR'IKuv M, (=-zK `7BO~|yDݭWf0BRN UNxfK8 .A`SU(O%/hch{Q{|hB:EZF1~B hqxTg( '.W:;eLOEU?z0 d0(,oy`1Gd@G:F$Ӫ)'v"R#?M9}Yu#fPvtELo"m!f+3N[ 4mcrg5/þ_S6&!? i@%Q.vb^*Zh$W;tX9_C G$pֺasv T6s[di|Z̲`Wjx5v\@7Is[Kҫ"\PbUT'+|/KDu?Pp8ITkݶ'S~̼m[ ^z0OKm oxw{TbZLB<]l3ʉkv2ltŅY@FlE5f}{+FxEj7~Eok=h`GX=>ŰbZ\*T'ˮcxuEYL`Hφ/^y4(J1Ц#]8:KNaVt|`$CF# ZFF+1NSLW0 L!CDH-4_仯ܧkO5{6@=o%7-?s5Ü$Oh`*VQg#.=rZfWn>G*!}w?w~G|O揊10Q?pQ\[..ao_cΘ{D Y=i%z4dÜP`_jp:0b$ LIsVQ D k2plMiu `iD"O~ =3g+R՜E;˨?v-UfpXk{M-" ]\MnY&b#o_a }(Z5J@ ]n%Bw{-]bgWv=ڔ*tM-Z1Mi闤^SqJ;ɟ_IMm"lwiDoWY1gzyg*cz?\ o3?%z"߯Ni57/u,\6JF(1Ԥ6 47k1,?Lo>x׻ԟ;GPA#udڀ2#"nAAh1B:yё18i3Ұ8hD]RQJZRR=a:܆)V]ȶyDB4AH1];kLݱJSD!^9K@4qCNUR$DQ$5Rw-RKg:?*[К0BL]!~(s(a1 OGv+B$\׵6S,ЩUGNipΏ̝GŔ|fP; x&͏K ͞NMDL7fHk\#ӕ~&`2 ?Yfi'R~^7bkg(En˻5ЭFh]5J ~uDkfۛĦe@0:ha1dpk$t" s”Ɋ78̑$hc\t3:<wA'ڥ}.rH0m4Ʋykc6"`;M)E5:)3y k6 2Jt)uIsA(c^HӜYS1IPD2ߺ)F {pĽbe$[I #IN4@F$нyvbțǚW:1g*#?NJ/#94CSwV"{_gA>_ԧן_+';W\%'&-h|,ӁY#. vcƤ I4vW0 "xEf*\ ;kWW\`7m]f@}\"*w \M VG% U- *{r m>!3תcSܶ$a;K9OIDhI"[R+, 1K0 $$yI^Ec 0`C0$%GY#(ds?X Qds٫+^33]Z .'F6Mq[7@t!3baɲX W +oZ5ٲ.} q+z7(>Уp]@TDLjDBٮʠMoTQ%1R^Vp ;hpsIhcU;= Ar ,쎼/dLN|$rYy5W..TSJ!u'q+*uö@; wDJREO )nյ}NJcfRzu> ٱYδmi^*g UQIG_xW0黯 3ȬU͋e'cãJLLKzW-rOh,ֳ8 ]%TS9=hvWJDtqhx7Kc~ ~h=<$FhmG1R} dᆙ㽬z.zq, Si 7O$&͆!LX{jS&A0nV8*TruM\Kƨ7E2ϵd`G@/O<Ă$m҇1U%$qƂK= X\aNkWfV~XMWY8K)܇ƻ QgecwTS23SMMVhXQ14XLEY%#ފRAJ%Lf.s,AZ"ʷh8̙)V#%2j*1e9x_~ju3RZ`PvAZݪNFݢ WM]uQmt4⺦f[z`2$;bH/!^Nu“ׁ3kc]WsQ~U'F(Ed[(UMHdvO >p6%EMGҍFf|3W?O--36ڊd{xD\8.1=zn&3Q.ƀuݧxodgh-0=i2Q1'@m 22v=dm\)]f ZH}|FD͐g6M(mKmy>ճDqޛ^i vbJQuCOӛ"dfKءS„!(@ƞbap=``DsnM?RWpnG|aZ8,/ ⤐, Xf.;7j\9hrP7ItĂJrPvU^$涠nvN{iVN?u@aD.q0gWLir|#%-"$*LX(wYquRv¥<l>4Ԃ~kڴܬSJP#a0Ig:#atY)1`.^/ RQLB%ď@/:@R'G aGTv6irB~L8Ԝ>x0l'[OMxp_YuD=a7UD+RzcLD$L㪍ar A>pp4:d)ҰotB!xj.{"sWu~׎zq93;n0:lJ $rϼ(LLLo\w!#iXYc&)+Ypl\um˨>XE9^:uudy;[ǯZr['}2#t2,,g5|)g3*c>WQdFɵje?g05 %""_%TՈr$lo z.i\51hLzV-UZۻ7n.j WrZ3J2LYjbsGvauR8+fD{ә(D~3[j L r)4@ud@ JX c4MA[ADD9!HAP `.t4`{ave\Bs6K"d*GD &:{/Sudq]~2\6/ԍ`)|tW9n1,]MT.Dl6 nLV}3A@ruD* ;l*wC! g" ;4J֬qw`n+}c_+3_."ڠ/FldzL[L':@7;IL:1J_dlZ/\qU!Ȃ^-\UֿGfxBs'UbhYw=>3RQۤswsdκD>.4^XF SUTҦS2r 7ۅ^O!vޒB<ң04, ^օH[PF"HfA94CMffN72[x r id̩W]kY& qQ:0#PnEqd w[P_"޵kBģ DZ%l%\-e1_5Zv`Plħb_VsQ+G7ZNohZY;jJYT[jQCJxiŪ@%>J{%JoF͟$RC9$l ,&U|N괧J ?b\(vr9?nђl&1rŕ˝ߛDVƿ)%*a8@z|ʷccڜV+Ȕ93Coi˜၆̛FJdk%U/+Hl ػlX٣.}2i}5Z6QT Yװ" 8GS:**J\% }@i/xB@i+.M` d,FOv_lnAKDFuGYz#~q@uuo Y|i׳[edW%E;]#RIߎ;7aez]}sd1|`r[(hlŗ%L 8hG:6ADoGޗ0n(J&Ɋbԛ|uei ujJ²3D$dIHx3@cmI̔ 3!kXMb %C,5I7%p%.**5t B;?$^ȼ^`Q3RQLT`k&":"aU 2Q׃kK~5TnPoSz3qI@;3&?R*hc0ŮU#(Ezᦋ4*o`]3Z M] @!fn"DE;$r~%359DM`U֤ C"¥[v&w>hS $1y8Lc,'N(~+VF|oМ0={1Xٴ,C Yd9g23)HiPIӿrXς1ZJ?cҁ¾ ՇW ;#mJ˗dPJaBDGzz>8NLh5:Ɯ.u}2IKcg~6 PpMr@4B=k3MrμnɲkFJjɺ X\aJ,dX i/WucDZ%sAWnB\d$ÃǾfnL#ZU˻\g㐏rwkCҺ~RD^[K&%Z͡I֭$dD^@'?]HzQ#va灦iDvlNxy$bfҍTW;8hAq^xk8an9n&Cq:N-qܜ UiU0Xf" Ufm l_ I#wL`1cR^)o}6dYUo~ &lqhWjkҦsIpcX\gW_C'ԬQz؄4 ff*.jg~#@'QLo_~eGXPef!yׁlƪGl98xi>??q 6u]e1-G`x7 S5"r?okBx!dC9rn_(*rjhfjc<ɋT. ^> 2ЛQfLWQg* t"n:*9D5+7xoai˳>(S!il9C!*D =JƯ^> =fքkoMX@?/7'b{ޱ(@N NgR8.a4gL;Ηvˢg v|-bLA%؃I'G6ٯN7Xi$oj Ӽ>W3l ƶˍC` V}'q (S>-;hYhi_ WmI 5F-߽ CP+jMp~s uW4=S0͗N l,qxSpTh0_آ]e_1)WӂӞ!{nːE*# ٚ t#\g֠%V(-ҹ _CS{Wd㙤2jl Oxs `ж}gΘ`*R,ojŕQM3!?9}ԬC{ Y]9:NL5*ɮL?L&VYx+O)Nn(rf:n9Mǡ"N"BbTc*dmB JȠ#zE}G" B\ Զ`=H2CHDrPvMvޤ6> B7.ۤE%~Tx>g56v 3̆* ! 'RP/ `?h␅TJ$Ƌj~\k}xl#)qJkAğͤQw4٧^j;;rjɉu%Sg*jqX m,5Js}NNm&ˆD^Xgӳi ~? M+ѱa;a.P1as|%jzN1,Z刯hU n@)%?Ī_^^zCt0kek_5fY)+ #H{hXh BDrq~ r2{U?x"Ԫa!fժfm,Fe=Q~H7*$J-w>7lWG>8 AVHpScO=aG!\TGT#дZI5N"'(e5k``%z;+33H ef eXrTh6g'ZL0mmLKӺg'Bk(-dF- ĝ2%ibN$鰲4,aE4*L8Ro f&GP`lQV=K̂Daӝ2X=MNaK]vH .\7BA'{aJe bl.PfعXl^6Zfz~;}sPhGݩ~qlSlČ*=a&]mHs^Y"))jt;p+50sZy.KiUq7q S0 "'{ K6vFFNվ֮EqAm*RN{b)~zNn*Ty7.1a0b{=#?΃^)̃<3<5KciQq2kLYpA,蒫Es:laç쪙J.jAXnڼò;)J2raxF-IHS 8N 3\go˯V?5, ,T[cÑ +3,+=FNJT"w\uJS3cO7{nS(&$%҈#1C'$I[]u+2\Նeāf:UPf"z!ALVVd|]Ϥq+ܝXE:Bc_LN9Do-Y*DDZQe`&t;GQRbIdf^^ѶJ3b+dZ _Tc~!k]͏p$idR4d룅h^8o BmaJ"u /xzU<"GSXoC-ؘB …?(L]8xZA7uRXU*@D)n A;\7rz. JV w:ѶQ%ۤ%FIC%S*ZJΘ=zŻH|HlUDikf&uQ&9Q}p)Z+LV?9:s;JSLRv_Ъa pD6̴7KVD`*̑^u^ <$qj<U*HvK\ k{/Tu;s3$ϛ9RN`X!!w&_v׋S;|a  z:FLoY"P f z`nxc { of~Kی)$R ̵>a>}?AÈLҝ>]-5l,Ȧ6 6>6-vq9Cxq++,oG2i‘ 0ylXщy5@6xH[0n)- AMS4s&4 z5zNfAjridW9]t6+7sc_*9=&~~yq{pelRw#G48I *ި '^$ԑ^YdȢ˟5YaVIӌzn`[ALʟV S+`VR-l2ɕx-(ZfiW]3.]O1ѫӊa ^-jZlzsҨdRW6ݧIo%!ŎU!xxy0iʽ0dT["m)zUfa[T ܕFND$3 #6"&g_MiKdKZg,`[Q6?N~Xz#hb aV̆8E(g/%њE#w5ˬgi+]"JL/Jxo;gI ޑA4n8Zkl̬!I^V &"k`fٯӹ=wc"7w[t3kZ L0dI\^XɴMD_'_(/t>}N^DޕGW'MUbBƸ!_#SY-"QI/vb6? o4Iz;,f fJߋLmnMz]95uAez:d]}VcXe~Sey"fIeAxy*WH/O z I4Kje{$`># 8#'igj>Wzҕ\ACBS0=+}o^~(l\As€u62B24wgL̍B\ߢ(3la<""U&/* ]]򅪄^My#M枇1/s+:}h*K)].f.Ej!&Mt/`7PXH26]謞9~uJE5J88u'9AzNt )3ׅĊ3$H @ݙ iDio\ԝ)4PH#tPHT4b ͺZx&;v}̗ ( @{(]>MyR< F(D < t,tCR!BT$#FǢ H@7+F;`y`Egя薬,jh'-;*aaѝvn5sPq[#N ӌi_; 'c:\v-N$߿!3s0%{b1s+vhRu>Qvť8;ѨbxVLerO; n}C- 7}F*7tTTY"Ŷ|4XR\7&ܘb\㦅l'cgf沐Q;Trx1KqX',4t(un?\i |C̼ lHMͷ(rU 3 `fgM7Iߺ#!k{-4&ߐkaDI_i*JHXN97F ?#o?xQ2}+/?(tHhF o.8L]W\vO*ir aAk4< $?ѶVDnD5KMdokՠ%ȳҢ87mJ[{k bZ:r`:Own8\+si]_ 1݉nwev譎)Jza ;[8?pʲDu$ME51uoG^טy&nd;Z+Z娹2-xp6-Y]QUJioB 3U2m]Qp_"`a7H4q̙NIRii앙IUKChO6砘 &qN;ˑ·$@$=0$"4Lao<7l b24q`jҿ %Ƭ7*ne^v“<6QI!fs)Rlgd8 w]!U"5l<=quf(wH%z*4RfvFMפ߶ *2<`Zۿ&xwUx?_K?O~ӟ'?9z>˖6zxW`[Q~%XE5"e?PWt2VӌO>5GKMӪ8'E}q,a!ّ:);H[3િن9PM8hՏU +LYxs z~Ţ+yPc)ˍcgA{~MMbpyiSb-OKfDbFys,(^!V01 oT+Vξ "UQyxߙQJaj`Bd+fHrbEṞ|'F)T)bB= $q'[C<H5#1J`zNz`$*R\ 9DQt!7xX cw]O$ F͖>zQTB\:8KH{0JZJAN51g1Xj3CF v}5S=ou9x n*iؐK8i[02%m[y#c* lJePzů#WУJ6 c?n"XӗarvtP?/aqN9_&ϫk*Guݲ%S֧(|Ǻ1e leRB"J̗ *F9/M $TbX_cZ U>į+Kp.#Vb(R2 0c‰YJO+{ WOvxJ;ޏnșG-2# 'm(aܒ$l1W2D6 ̃@~2UąhIa$QpWN<~ZTnuzKuΚ0rx4;l/WC{O"KN}tNS~p0L]{{ʕ h t_u][\7FĎ:`)>Ju4!;тcX{1EäˢZNW8Fr^}SH-ڡ)+~ݔ0(N+ݏE ծSc/wmYtP)+AfT_.q!rp"qS)w"7QӲxCxOHfIM,b Ki.Z&|c5=PAK(zE/Q_S#{χ9O]YfnҖ擞O`/!~"I|LhWq:C][HD۪kU.mJ%9_Mmv OfS@;s!fw[%#f<ބ\&a˅RfBhub^NT$l?~b'X67M0Nvv7|C@,򕯤K4~cBsf3W}=>QX&18*lNuS:D<7ewK5%ȋG _O;ԣ% ަ iIZ2>Oj5Oe_E|lӘEЄε^}Y\9$,ef2kak_kC;b>׌!!, ݚ\vcLϙ3wȘ ,R䒳)5F=P5g"d/۲ ቒt:SNޗl/`1ߛ@?(tHhdd4%DΓZfFA@jTȷ ca&XIJ`)9;^Ҩa0Tq@1c,@:QдL7/|qF>~*GOzED!&!lT=/+m]s*`{!l'zqΗa̫{g=t2R*{r5t?g6HYR}ᄝNrQ:nuAb CWY{H;S"xD$r-g Oǯ7P`o5z +6mYf{r uLDtL8ج_GfR[*`ftZ5NK@Cj/w숄I?@ֆ-iVEEꬎT؈((JBA2EIP$kG] s+ߣj[ġ$x}=D_%[e Njl_c%C$a4/Ņ/I`B/}$Qu,+2PC[㨘pcgf6?oD&?M` 쑼1JH4g:|h}~P*>;T T`Ш4qn=b  *Av\W$؇#g#Mcr`QEe?ٕc3W99ISʪZz^x.ت՝[-?_?I_WY|R\'A,rurD@MLҜg\q; )K|~uH-G*8|xxضryy^?khтNB%b-1VZ0d>43`惤͍jQˉ#FJ` Fηݳm8aq('**7c'1qכY2=1_JBvr%OAB#'|)]D:k7$FMdq9& % 1&I`2abT?4e]_l1rޓІ>hH1e ]uuO33e%e׭11{]87%QSOdUszO~e-DjlNGkU*WnѪyC.Lcm{ԝ"I1(odE[8=E}:UG DT*o3w`[KmoU\bY.X7O1Q)%]n1vݻz/|SZݓr4tWi<\Rpo=B~FXI 6'gO';QQLu PMhi%T묦 IXrcWM"'{#T0 /i~]u"Pr  \ 'DDg$Wl"EWL߶x:ױW;Q/O{>o2VƘ4T32~-IH1mR" U_hΟց,vC8F?U{gȝ~`89]; -eKP@?$;`;!Kq(\i[W[k{ڪi$f3I $"Җ"_A&.qCaGvL"7h'1ftf˲ `"^_9G9ZƇnv2Xi$ g ,ߨҍcQţI $]%soA.H˾-4[X֢ m=w .K Eo_tAJ ;au9j.@ B0;U"`%hc) _+Iql)9&l< LPilZ W7™4_*1آt"Hʎ^BgO߄~旯՟=N35wM qrZFN/Q5<_2ޭ$tn6 )aJմ۵ 4- zuyiaUouEd>JG* 'Pu &A\kNd Yh&O8km3)G'b=~53IZH6)nDYHJjh5JMLD&*RիV7MWtQH!Uh<ҟ]c"o6XngbDnFDKVtO()a1ЁJdƜMPmXV `+MP82qї[ɎJ2,[DCw&],,1 Gƺz BiQ>RxO5?Z ߌ\}W9uOƓf\[uhfZ){g2,`Ncf p2?nY1(ǒ&%(N4]a ȁDw-Eq3\{?\9׬nbesO+>j蝨5)*%s ܌sͱ@ҍn@w]F$lM(fҨtĘHoC IDATY .XŒd1bb.ŲMwvT1gA-q鿶ZBM$@{m% -h^8AҥUy$v4]+ANqB|_>Ҽ Ek+rߌ{0Uα,T?.VT7v{or ob62<+s&*-"0U"v'ڄ4'T5|3ARNIi]B#[KuEq;8kLdK"TN_ʕG(VD۞wWJ|" ]&ţjڬh9>>2i:c0Oȧrm`<,Ѥ'pyUѽ\_ *f?ܻ?Qp~s wWZk-q$DU6^vP%lJe=*׽Vq)"s|;_E% oBt)&4^@raWͨdzl!a]}טdZD"46>)m Qk[/* BAyʴ_(e+x\A%fb)%F}j5jgHDP+ީ&Qnb] )į^z( R8x׽6T̠"ݛOTƾ9Di+ ٰ3x3kiQc]Sn PbȫıVqC,*Z'4B`f<ɐ¼&(FmWm۶ rUW5$BVBp;w?%w$vV4lEdS:.ϲҗ@9ԂF4"tތְqd{ht ,e )yivNWvj9N|%Y,<[1[PTQ?c Ix"жbs;[7伥*7.AY 4/Ncduk-o]8~UERV7u -d,4?QZ)>j=@}R}Xyx4N 0 ׍𳵈Fq?}6yỿ{_?q;w~ݟcw QHOVfyШPd{}.mXWb3'v2Xԅ!gw 'x .\pT`03W6"ԺQx58,a; ݈{݈yMjW0oj6yp;|h)O5~ <7;Ww/|w|Tm <0eeCeR`&JUkMhav}rʂ}}Ok +gkw55{nUEp3۴|pw߸|Sz4j>6y_h!ldXd-T!l A!@V\*Е`R*.b R@ɕ{I;h ^]uT;+\u`36?ѩtnq;[*Mړkwp;|í3$~}wEk8PMVR] mdzZ;goif-b]j:' 6pi_Zn=s^5:LZz.̼iL^Z`.EIFWy츙DzUd{c|6`.( ѵXldW/@!z1?d }5*ˢt PY7`AdbEiqDbn)0aXƼ/i_. [O};wNɎKV;|P`x)?ݰ 78^jO7j)?'_dSLcϤ<&=d85{xc26xG:;=+j}yUΊnz(DrD͟TQw%|#F5ި3)063 @$nt^d9KRD5r3sp;ypuv{J{7vts|r%Ӕ7`3mw_} HBX^HD۶1kuha&yTkGd>^#k8ipɛ"tzllloDi<* {0Z!_u4V[\/]\#-1ؙ\RW>яR}kַ.RvEa{a{(kaPfXP˫֏~^z˷zë_neV4CRn4g]ͷ^ȱg_[ٙ>]G>^"/^(zyyy?ԝyglT jWpťoŋj߿[?g_{"Z3R cv\9e)I\=%o2h>wO |;wx#Ŷo,D0]!m2uv]Y:b ;3ߕRܺ:(d>q{y%Yd`>򇴑{>T)/ F3ieW[&)Z'zp4,jahlW? ~xQJaRlv&VV U?f_ooT‹˯Gul{Я}şZ\ӏ"a{rE*chʆHQ]SPl0]qjf~uDwws';~W k};Quh,t #O h{^q-IM)%\=S <ԃg5~P~CØx^Z]=UK0s۬FmI`;`BaslH^HABKB` /vf4RuܾKOKwS_S0rc@/t4a(q=ҕ0G(Fu 6"vhYEipR~$Ln* 5;@X' 2x~\G̤$|!5[T/$ۅ# >pѢ"yS.QDfJ q=YW47s`Rbo&r])Ga.4EztJzHYl+Pd:L7|Cuր5 z7'?#`// K>@JE`P+Cr(x)e^<y1nZ0 R0lWRQ,rK!c(bt#֭C=::>njiy7?_ɪʽ{d̙osP͈@.v tVfy#`f+E`z/`Ω iogSη>LVUD%J/a%>aeD Q>YNzvk$JDx#d`:4$JNJh+O)"Бҳt+Kfn皌4~(i]^]l-&jvMkр (NO> CZ-(@J#׭#;{jfUWgdi`q8R9 JcXG] prxФ u_aYY`JM`7ԣy&~ $]'0+oeߌ'9v"HBZ",Xiv' Á-afFhv(Ɉ*QD%Q'`ݥXDDD" >TɬhY{ ;(%T}BX%^|Q ] X?OiBhS EU*)6#p$5V|=ڰz潶/ZS[ue,R/jZbҦB4I❮䞎%RXICh;DV0!TzJ`#۱DJ6XoQuG7V1`D̂ -`@ o 3hVe8՜WU[KˍzV͍7,--t Hf)0ˢ7B(`VYNrbf!^;nԆcLIkƮRD!e#uc1ZJ FaXQw2ІPFFLd-`"f bNGc+B'"M$ ?5y_z+^z+TvXUUD%J#Q+D@dsR&UuTۉZ>.kQseU7IWk @]лT2"?9؝>RrJcG&vƛ$7,~~˓dm]v6_3fJvI?Ҹ;> ' 0`Ě+W(clBfmHI)+`dCP9fhu:h2 QG"3 #n:*JRw`FG#QrWV 04g&&X LIjFȲ(/z߁: 1VUuwXaBHK5Zk lyjIJ01 31` ɓ P DHgp0J)So@7X\\;"%J(QD$J|" %JfH}Uѧ}Qjgl{0=JJܬ',kTbq,gΌ͉G y5lSu(4&o1Ln pNV;}'űܦhiKxEEߡ_ό j e$@z~P #C(+0,BRHmBĈm%Rk͌d--/ :b׭ Z`HVzp %m\ܚ<1#'գ5><`#U3@,Qk2HtCt|AгA`BD0H)qPʕzoĄZG=ǵi5^WUaלg/@B]ظD%JxX$-\4h:@K=3{61@#!1D_X$@RJt1ew7Mdmh*hdpȚ, V9ϰH5K|exYh"2Bf e̒C֎P ADpQF:U:1 hcu?nAǘ( 9fL7X[nc!MVqq`6h)s@ѱ^\WvR^͏NC$d9KQpEJ֚ };fkyyj;Ӊ^P$HR*!PJGJbr|L8UZzu0֠쪚MIJŇS{R(z*4JTx(QDMwsο mI[dYhZCG8'!LUBbr\mgJk!~rW*[H܏2_)sm q]C^E+?ܑ,.W:v ̱+X{y-M5da+I IDAT33HQUjpJpH ($KC8&Ä Qhfm*[?>aR3LjD$Қ qWu(%FQXoW^u]wqosð#H0Bkq;hUcbGN(k678=B ֭8Raq2}l6}ߏȀ!(Q Ȥ# *!Q:ש5#F}QTǩVRD l_D@`ǝWeCnP^cRH]ƽx̕e)QDcX9J|)coϩosխm"6h@iS Cy[k_4N5}H*$i> 3INnĚVK"1Qsɺ C]Pu褨 @5of ܳf) I@D( 1Am EjQqQ)nٺ턛~pӮ~LRi,9Fg[`]M3~ʐ#TKCoV9( R" A0z$3h$HB{+BJ:Q`h~Z;!&) bjn}>D%J62Rx: Djܻv <򋬅nrFi\D?eE*㍦#-A riJSH<[afΑ2ָe:$Or NS|mg[O՜fpɦ:o͏dhV,,膮YZLJ囎+ `)"Fľ#1R v lP9 : N$ •C:A[:ҭ{繞k[7Ȯ뺎ܮVk:2a:~uˍ7~qW] VVEּj3H.܉i}KVQM K웙 "h !F 0Ć @321+mDK!Pv'D!idމ_\:֨U6$@D6Ȕ<3QE%J(QEI_ADJ8^ҚqtţE*ؠ@'&oLPst r@$"*mK$Y1"4Z{lUޏ = In@W N C#4W2&p !PhzI/& \7.KKll\BrbyR >(arvG캵qy^o+jR "Q 0ff)1A^,%f N3TZ>؉K6-f aYj6FǤjFQդ+ R:ڄź 6mۮx%UZ@v qxj@['O @ٱQCÌeA CR't?ޭS'Ž1&4^qRYZZgȘHkve0l4j#W8`F`bD@Bx%NCb89Þ};)uRTCu3^)3pE iwFvtf6&M&b|fc>#q$2°FD, K 5"JDP0;~zf||6MLL8H#B8d"M|TNK(QD%>nΦ\d3s6XT]V-iqJgy@-2x#>b ݯ8_HɎnE:ShFRδr罨&c6\ř#DPJ)q "nuB#q\#")#ǩ(Q 8Z+5U'nWʝi_ :~裣UTAHi5 ֢2 k O>ewS(j Hϧm:' NЬ 3 jUBXh $إ9oa2 ӻlgb m] ? ! ``G#XHB;8RJgՙX!!#tK; P p|D%~PY]hV7 E2$V ʐC3^?W:<FO?kӖA;R(%c볩K -N>ibbR|6@3 s[<;/d)trdg5CJ~s8U[9 81`GʑBkM"ʭxadk?3ZL(Im{Pz4,SFitC:Aw77k1z%J(Q!@I[$XׁmDp(UpT#5C`Mcvw8 &0~atê֏$W&8lR2?ҧ.Ra Hm6j&4~K햔TQDa!8\GG0ԭN(VэQu?%ްuwW [nb݈Ć5311t3#BΪ pd>61AJ`՟uY;^@@T@*Ɂ NQ^O.!!pqM(Ȱacw`+̀@Bdc#J l/N^O@u] m[O:͛kb4K\D%J<,PVPl@[TIxy5g!̏TDsRIfQReVTdi*,)y0ۤEJo[VߺR6>kYXq} 33kB-]e2d@WT!"JJ)1+V5mC,z:*pa)u~x7FU*vzS4;ne "BJ)qrX?Shb 'l`"H F(u h Lg1lp djX# UПðR BF6ZG%c8wجZ}wjXHDd5 JBF)DuHF#lдZSNZWk4%J(Qă>6+א,PЏ5嬯a̚Sq>I6 y|/ 46k\c ))o@9vzPqWy*[vLRR%"l"!B^]iƘ(2J:.Iz+C3s+KMW9(jΊas‰S[o=c pO;v:tpvچڼ?ڦZ+\wY-ݷy=6Roj4c""mcQEXC D(`rr<|!5"HfC $60wIS8sav ~gۘ@Zv{efv%bEA`-Ikcު5tzުdk֎  @eb4CC$ J졥 MXzjU{o|37oz_}b|(!\kz5;ї_zՕ~P>O޶ W⺧?ꢜƘ/U5q+^7nbb/mt{bs͝$ν.?>׾߸f{vK(1< ]lX~@v(&q`zzM EwWض~aIB)$9 mELn-F\"Ezş(eҠI I Ӣi0 Y=^Ql"SU+WC5[vb1,ꚥv$!ڳaaEVjww}MꕊNE9ZN{p\7zEn#>B/vg)g}߀%>nş{X)eWҋ˦T$8!I,䤃@@@iW06rKQ]xGV ޵I W{f7Xu/}f~_駝s'lwz;~D~rQ_?߸Ə?3~i20͟O~ʽHy|> \7.џŻVVV[q GB< —>8sEW׾‹>T^pM_t_W]SӝJL O5W?)̟/Oߒ۩Էԧ]/|+/y O;S~ҧ>(rN?8s}D_0Ƭ_ =m w}={y㦍};hEzÆ`ٳw۶|at %>nջ) 6Q@TEBBEA*̪{QSsk͛Ѽ %X|z"v\hd130hnyD?,V)Hw-EtDVmwEQ}3~ڙ'ߧxqI;w`t61>ፍ|' #݊#\g1WVg?ݛBQ0n-HnV#t) ڄDP""h[ N>UեuS&7nZV(%6"fQ^_8>^YsU@Fcf&}K׾4`K<}X1캮@6;\͑ "DDL 8:C݉gŒܥ C)dA6"W!@ @HP1`^jnr>o{;>n߾5~W/~>:\DQ4?il8u֚J/͗#_O|3+6 ;x^DDu/ IDAT-[OFf\Y68qu$\^^fG6Nt-^rэnpj}m/ Lq]z87¾\IeK7n|3o^okocZ?A%JV+o|+{gCfmw퐎GD[0(.ؽ_-œMmqs‰ )I|`h y\kp G~BjOf~&dB`aML5.`ɔ5{ 9RP" l>!@hp8Qp!BDQEv:FId,@0b$00 uqK/~+wU=;3cffT~ث>/=m?$-I/N/q|J}E+_j@Jy9g}+ ʭRLLǷg?"bI'?0|K_}ԅo޴)Nyӛ$ o~᪗Oy2cضmCD1ZO|kk/{h'' )ۭ`XYYT*ɷ8>hs]ٳi QG`IJC2PPw\׬))rD6}ɟD%&kI֙KS1vs+\$wZkUj(=n;:(Oh1dFnu]B [JB9aI)=&aӶt퓞׮t 70nHQENo6nūV7nn6K+R)+ ͥÆnP$7}]VTMNo[wg_y%/{K\GĢw5u5#p ]lvd>2wڳ9v' BFH)N}A0!`KY  ! FU+BbF( $i PQ=cw׾~M?'s_ۿ7?r7s"@._;7M6M0+B腿k/xoj LLNN_ R_<rbڟ'qK_\x׽w>w[~ oǞ:&׽M466Kz+.zvӟK~~71-LSo0+ty*Q1rsyFo[cf0 b^98}eW.;~g޽&qYV3w'Yח<m7UC69o9_vǭ?},G7|"&JD7/{R$0'x*R^̞s3vRZv%Eê^=dPEǚlڮ"X" :#0pH㜩1̅| ?F)lTCY8pVדtݡ ֥D5v'5Z}<͇?qYͯ'"~466ae^+F8. Ștq)wer\ņ[?ou뤣ZkWT7[+a+FFGjw[a!6HJVNuj1|E7~&2Y0Pgg0¬w K֏^ERJ?0AV9|w[X\fTKNJǕ -LDDê7AzP0hug$$2J@@D)%"0  H_K^g5 àI0 K$FB@GI4!pTu~>k{?Z٭±=o}ezQC_?1#3?$[c؋\5KSJ0{/~_>ɏxGӷ胹׾w߾| r}x۷oi6ZD ñ3K WN?{wVOr{qgw쁑 ط>o;qC#c?{%~lܼelb=Y'X,|3.5?pH~@IR,1y0G!OJ%(Za!ix}erWHQIa9q=l!J2 srks{F@RFQWB]vؿmۖ+)2Vw% AA\Thhc0c'_ C===}Gy\Q)%/8^RQ*etC)QU]5(丵v݉htd⪫ꗾ~W]%!"HDl;H>HҼƒ' #)5Wk}Mj TEhR2BwW/>#H NIZSi2Ȭ@A@]7ѠuyEF3J#P,@`:4aS숣D†k V*o7?Rz /8l(=p;.’(N{׭?NO3gfh~)SNI=f&KeQ&%6]Ԟ2ad:|ǚE֓1/"h)-k2sWĀ(DrU*|Uyl$ozڪy 0"/R3KlPVS?_ڢw#٣U>̣fvtm8vl(Ƒ&}o>_~YgΑˠrĺ85y΄2JHj礆yu:rpEHl ]= u}8v1XRٛ&feI$0MbpD̀Vht?&mQ)Ÿ|ڤkd.r ]M;3k` +s,iٳk׎;ZUj:~h#Ë$" 0jRVcccc\WU*u=s]W`K+7o^Y^\?19nt" ڳsL\T†Mm%[6icctVIȳu]aZq:Z@8I+BJID^6s=.t| $@Ե*&"dCD T N(%2"3%@)n #׭ix ",1+Hm}uR DB1 ȋCS"c|qE%J<$-,HrHjqqD4$p\Dbb2k:&K RV㚪|]VO5pª\-Yšbg0)xT1^Aĝt[^-ɾ BbtD%Jxx$38IqS0VHB$I=gBĢrLo`zH"KF(nu3W:!6i;I!IN,Ua Sm%SR9U{pE{N'@" c @&`郳w}VX3IB CȀ .ȏJ$pd6}}HՃ hԕR#־* =[H<8V/,޻=ݖUu1\k_۹ }c_g^zu{E$sNG M" z/< P"3FbVMvr⎓ 8SF 4dȝasnb4KcEsq[Ɲq{JP&FmRJOV-T5iMk [y[[R 2Fjּpuն2xQSůC X($a27VYpq]2p ZdMSK vrS -hh߀BZJ+IhYiY3P Ox.cPHTMюKx.'m5vݐ[WvTs/Ɨ먲!i T]!7/P-P'(3/b^ڸ2V+9""焉H<@8!fs/O6_!uQ}<$%M;J`k;&6y*Ql-3iOǣx}sfQd~]?ƑJcw8?upyo1?~׶Oߺ9}fYHdxF8hoD8h>ŹKYW}뵭?RkΦ#)ִ5ۂ?sk6Э`ES-oMC j.UuDԲ^a^jժjiHUPDjfG-LZ[d|BRa J5PۑſȰkhLA;d:sZUhhazS!iow>BMp: Rl"|ioh4V>7~.$4w9\ԫ(`Dak Bd``j,`i|rgh{)1뭷«FcĆHt7wΉ׿ I7yǿMow!!N=5>oLA@A;AwljT- (rNgWR睊WJ^U̯i" x yU=/y}hk,lGԎ1r2cUub 6VQ B!AH*ܒNۓS\N|6{=w~CZw4s)iMk9[KkZPF u^eWpzVGCk\@OW]Xc.zQxEn,3 p͖F6[/ߋ_׮OR﫾NCnrxt:- >ͯ|+Wͳ,\ #`Vx戙A̰hss|mpt8?8sw>}lDl:r:{3;+}G{_gI Os Y(=oh _Ui`z hG(}: *#"?lw^tJΩ(]꽇څr LBDo'ΧsNlHb%:ՙDLR@)/ V4)n={5w7λn7]kZӚִ5饡5ɩ)..˶@KGqqsҸ%{vxeH `xFZu2*M&WDJy>{*Ά ?*wiov稥h֫4QY!,b)b~k.Roll;z'/_uΥie)TC5*H@I-B,c;Fhkg;"<;wNU("UqdĹ٩S/_2Mr*LV,XYա/kջCڃ Rsa:œx<2W._MpNs"+I BDְB"`C kv:*4ck6d#"*"yZhlh1<F׽s}[,@>"C7&,&ʑ$a W&#G`Vzѐ(%իW$gT3JaU(k0`l07LA(zWuY޶yd:-e#Q81bnyR*/+JR#⭭{p۫/}Ȑ1qQZӚִ5iM/)w -pNUlՔbry+vl*^a.JިH!бjV15 GiBCway˟]{\BСr!qkpo;kūb8o=`b e%6JG8wN)Ά,C23P{Ɛe6Ƙ(2r̳6M8I㑺̹} ؓ IQ{/ןW{fR,V,f o(#Oe뿈?ś[N{Ǐ?O7w?x{{ԉ'OlmmJT* S7L dO>E64Ms<+vZJ*UZX#,B=3jƃr~_7v筿8=%;59tr_d'[[^RrMk?MKu W,|3pq)ԁj0-7 HQ]5vӾZuZhlhqXMm?iW5[,9P \\sM mKԚN__ʡj$J MB"Td( ސ;C5Tj/`EP3P+Ihl/^s/,^+b*03 XBB6X6\{`#z*F/_T(D2 9%yOw<ē"N3_=bwB{^wעvoBNohC(R+Y֊ի/xi6O` Sx %-t*@Epsnlюc7H#k'0- "O,MPUۚ.;GcȲbN}LNՒh,L/qڌ_>F DGr}{]S+x:*CՕeh4NOܘNGXyRؽʋǣdYeye"d.i]P%k{5}GQ4)T!/)FM\y*#"x4cr' :m.C4O#{8gfPU2184wtA2;q쭷yO^\#Ѽzт(͋wH;@[hg3BNǟI.1! =O [&l]x{=3GQ=y+҄AG16 SvsuR_BG=7M@! oT~__1ΎRX/9?-Zy<)<_g 7h[m ),d?[uڡ>PY=`Ef֬ۂ]y @ /^de (rQAu*+3ӞD z**l"lkxC$z׽գ8&#"&]6x J"5Eqޞ,׾]N&yP%$o<󍧟Ct[1~> {MC baA/^:;8\wpz(&t:}goHs*'1GjT34>)8Rh$VyA|g}v&^ILUrT!l&IVUB1`m0[Qa% 5L^q4W &a "V 8BK~"1%H=Ή"ãhRVt<S}O}J7xז%M2!H<jXOŰ o|."O^VrЉ^j "F.v&%!YiMkF{_T!4R5ɩ.,2C,5ԩ ?n,of,kcLKʔx]ѣ1}mczptiO;'[w;yRu; JSRPOo .F̻<Ģ(H 4*ϢzQ2w:UcZx(唦Yd$~<E6Rp<8sυ;OlO0u\5nL'Ui1GUZ-p8ww9!/*J `-mɪEaE* ? &q (Yi3cC P2Ddb3B= d B) óZ[*llQbb ILTqa{ g2WsFTzĽk~^ƭ{zP.Sϓɔz?5U@B-O3R7YJnTZ^ZAp푑Uuo,#j7+cYuű+A0+W{kO~TT7-1/rfVJSzr7~c@8a6kvaէ8hI+}x ^~ûD'v]g` [h HLOp>{Hʘ4@}*Z]E-F.si0p.^D8w2Kxgg+ro}ý{k^3>߳l Zveޮ8;xrjGqy&` 2v9ԗ*Đ^JHlvWv*}cF{Yzxnm,VmںNιO}Sg/ʕ+Q;wo|=!;ɋ/=GE&~;YO}?j[o}|;|irM Z""񋸯ƍ"|ZZ_{[2ٺS_IpxkQ&x& P`@0hHv-ŪhwEphIrb50PZZ6CKn!|7AsPimd f35υ>R@+ KCETgYk_ID$"LSm[^sP!*[Uci~gϝ;~{{.]}+_~?VFt…* @k|RݞLp2 7lzꓨVBͮΞD4]([[CRz`LcLO8o̬ RT~xP?DDdaaTIA A(-$J@H/lyY[ÅΩrڰN RGP64Ⱥ -bKU^XLshRC+\兮+ y^,U!Qd ArB`V럈`+AY>(@m ͉Ʉ" 6D-R !}D% 2 x٦Y~8;a$K%kI+cMdS?#_|ݺ1VΓH݋LA|~lmoO675Q.j82Q:Q2y^6'#.j,!$n Lޕ' DWS"]CKGDyI:kLlh4ߜ{j)e Dԗ3(jX{ =(Rxkr8'([ONԃ+cJp¤G0*P@&0l{Pfl4!笉&;1rC kYQEؒCp&(SH,[n HɰK0#UbH()pW/Lͪ KَPH = 5:8$uokk?)+r%,֟V Nˠh|ITëM 0|5z#}nkO_/-|n?gV?}|O8"3'<88XRo}k8>bt3w,5i*Uqw}Ҍ g[Yz ՟-r5=vJHV|ߛn 'e"s,!DARtmT=I:J4if'ʮb&հ(zT2ZJ%tמq%'[ I{Ӫ" @WygBessDGV%p}[\]bS/5 ~;˩2X[姗C'μo7_mo_#xzdOh;V??G?:O4 HH ι;v^2<ȅ .\Z;Twцн^BC {.5:bJyb M\^WM` G Y` %L n4D-DTZ8[<9~C'Ki dRI)PV eT^nn RxY|d%J}Pp4p}vQFeV"dp8*}^yև`P @M1nmoyØ$^H"=9UG>0>L2ݏGv4EC4H= ރX{uPjՇǓugTSֲ1ÃYeP(Tfz^G"pn*U°(\NLXf-Ү(.HL=vU TPP>,}D3;5'X ׁo`Al}^@r.Yut|mKAk2pstZ7ppVj`{=ܻp8{/?}׿$I,^~]?xd~8\"r]C}w|3/^Q_ kW W^w oZjiP.ZŨj d-o{fzBlK9x+ --6uSSh`Eg&IB)G1).y9ʕ+..?ƚnAyM:^dtkg| OQ'0؈ɤKGx!Dyg摼cɫ,DW^fyw$ņyw!P& YUD T(M|DGlhĤ.`y"bxhJ Rh@n Z0,+)EDEFHYFtptsc2$/0NERkh~K燳pwzщ3lɈ7MPeNxhͦ8/#4K$I木4VU Q&k2̪jJ 1@IHCY,tbt 2*So"S.D@,*@EH** ƪJ0OgAgjh_9QuC;PzeX.jFݰ6(GqX 9] 37KoHܩe:W2m37L׬/'"/|i:ry:˿SyWMoZHǣ(MSՇ?|Cб5_N6sRT+ߴDk%G}=1COWX"Zujn%3.@Y C@e %"V.5QbTq\ȫB35 Nhlw+=bv*vdTs)ä%lt;j=Ts7-:%"K<zb ߨ*`񬘜L&Yz`#F(d~QeIfcb\|ESBg%w.KI(VEn4WHؒ!9 w`<ݙ؛^t텝-jXQEMfLdjK/'y^ *jp!׭D%(0H@j0ag#qd"@0$"aȄFidVxV hHAJ! 0 i (΄7HuõjIpS5w@c?> i߿sKd 2Mro!ZVuoU t裏vSB?c?v^x!_\^%Dn[w2mߴT.V+߬ B@8U\@O _:8%Dĥ IjJBš_*"5H$$ %Q4X8R[J|2g4FOg j}qh:at黬uHo\Dz4 )d094<(ıgL.j N/t8;dg`nnnC>X\$s^@5Lzk"g%e[`C4sƱH&];ONݺsUA*đe G VV$M=Α; 38b8""d]g>Cdf RY[늨\VVqDDÈ1PPfdd,^^佰BP0aJ^=J¢SJ'_錴Zm% e1Ƙ hzWvQWRn/㾖!`fFų;h ee5+`lY\=K7 gbxͿ"10po귈>p:̧`""xgnݴɟN?wݪ}c{׻u|7~7*UV<`-E݀U/g:UXGThicQdP;-2:}8.l>XBL"Q✠` 6Ek# PR G 5|Hl]Ѿ^Y55׮n_Cy뚑P;lJxGouLdK34;-6ZÈ"#"N|dH]L{$%Irrg3{9 -R@hy1#ÚpdU!C?OO~~<Xǥ~~ꧮ𹗺@w&cS"]mm=ۦ j} nl g۟Z|` 疉{EHFՓS$# B++<0yb{@'%Ճ¤@]s'.\}RzlbT;|#GtǕm)U75~ Ibt Xrʼ4֖tNkU#iLC즦 *Flv̙Cfkcc0&v|QY5%0&DJ:N\#s.i>x+dYdԲͳsSO~^7riEU!ES2*7pN,IhC!F=q5I9@nlLe9Pu֝.8K1&Df>OBL$1`4KeP,B1Ybkxpԩ4M3 D%#3(>DpDg~<I>GI`D{o܍ (mDE ʆ{RXRUS}c8 Ѯ^޷~i@gQ̻T;@wS ZJQi#ښ\)30"#!]‰^[Ŗ:W_ƍG`О]RDr~fsW*TVw& PV-#\V=u9M~Oakku7BE[|| ct̙__:Vo;{o+5i+% 0{ 褄f)jEAdk)YY"p".7LT}.O 3(8(6'@B`(*SzCP HK\(7i\.t2+R|Z=v-04.ڨ9T0)H$by),IDvB U4(2QA%yQdAf26\\s ȫ({ ಄0t2L&[xZ" Idp7>c XDm$i-)Z՚!*D^_3DJSb!T%wj(6ưQyN,Q6RM55l#D^ih0 U+MDX{G^и:Ц)`]xX2\&jUC+5S@xs= ё_qBo8j^Vlg݃ɮZkwy{hfhP08 $`lR`*q9U8_rqaT8TpU.@`HIL ) B @HiukFtW|޽߽{Z{>-gA۟ LQGoo~{ ??޽{!;wowݗ+ +k+6mf@[zaxk?s#: kY{hh:L`89=:huey=;s"ØC"Rd4qp- F{YnߨK=g7\,wg7K5p0{vgVלX$$^n\/7n\{x8B "oλ'CND%]/fVd|k D^G1ƒedi]{TUx41LđY˪4t/:ōӃ\^:H?!="2&*H8>UU4t462mF2Y 3wE"ъPg&Q:yYWybTnmRr57ȔFy!y#G,E v&" ۄ}`6/}Ѻ,l olOt` ʪR`@j=$"/ /#ϝ;wֵ+z ?(m@OkY zSڇ+]xs4ywIR]^T#-3 5-Fd?h= nwH¶YRZ1~bbnqzܛE$VeYI2ddp+G2Fvj SȪ*d:>Z I IHDd+:ol=E/3g1ؼeeYXl(MHho82 IDATfnCݙBK1Y=ʡ6 ԒEQhō%Pg.TucCޏ1͚cN{t׺"wO߉fNnչ99rV0\ʢZ RX-M YYMfNNH(#[0s-!F2sR7;eS2h92]ߕm<+:s?s3mÔ5Ɔn$%R_mWѶ&}6.нz-S_]a M߹R @W׿_b!}3].Ÿ5qG`?q[~-fVj\Y\ɢ"ULjXr@UJ]JGF$5gBa䢀rt3B]c"tw*{ۻc]cz^47p}(bm]x Ԓ^'UGlfppa UɌCUHǗHDg##3Y4a37'vfV(%م>z^]q2ʗqwӎpd ^] -(ٿ,[Hؗ|ʝDHb&,et_[ɞS|@;jQyvGYvE*ȏk݄o~lim˶0HCxF頝&~:Dʗ'׶I?iTHM\,,"U5q9A"d039{!ǶXTEcZ*iIbQHjpO 47 Flt|xy\'n!y`pF{V͹"J\O1@P)&2"rO)N>@0h&ܙ @>%RrXJVh zȬC/ }s GIU>̇?%0ņa%C NVu.{Zѻ6ޢx-RpT#!ZJ( t NTLNSk7$K"ow&L5z_}~E,&Q!FVr+Zk5FVKCOaN0"vr̨B$YQ܉!D3ՕeNJcŦZqvIp#PE! hz-L"u=Ǫj泇XjbͦXFp%7""LDR#@J>>|)è`d&oX?VDGIq>=*B3yffps`M@1xfD P! gwLD j7;IkӈV1H_VDX'0wcmU­|uY_ ]nhZ&-!X1F@7}~<;YL&G}eu1F'il'J DDwO~*I3鍏'n^Fu]{…X$CX[]@'? Ds n< c%yڭ;7n 0Xd4 'l<BkI',2փ޸ԍȲ,Ot1ZTj,nEĕ=Eͬ.'5qAnm2I] lR"pɹy5"/`nV/fqV ʪ2:9e0ìQhyQ)JhoaT:HHa I`1GbX9ϊ"1jxɽPd=܉(;0HW%/٩0p'ʤv[ƕrm:V0dKP!8Y.tu*0rgGu=oD1kIYכ.b~2˞~uw^E̬1`KUF33,KW|C%_fdz5q`b"w cMͅdRKH1ȯeצ_WL<꺶iÉgP^ []B,XOhjP7s2cw!WFhǔQbުH")a0'k,Zǣ-!F$80Jd a 3y5/)YL8ydI ƓC!ZmNe?_bA#/;q>5)msI> ^ƍ#wBWc;KcǤ%MլA [Yύ2ьWg,"|DGŎظ=/}!=k}|k݄+l%"zo~)qugߜ#X D!&9bT V3Nuv6IL2Qes/5fZ.kUB#k-Hk0A''t|1we-sA\G0「YRLklfޫbaFNk|gOJG'B"@pBdh5;~r$՜3>>)X8;1 #ZZUL &= 4"8 F;%+ۄ͙E193x`À^f(A`gkpCӹMnShFig޿"cU=f8FH%m*P] nL2z>w|k7I$ySaKz݀0twn^uǡbV,2z$@ޜwqzى {mfDB &l5ZgGY;D h~TUOoO ԉ,EGfgb{$j#'DiP>6ΔXj˕?V|o7?E\3 ,NS ̍HyvڭQ"ˌQ)ȈQՍϪDi]9ݶ7NG`bAɯurG⭭5޹cD8Cr} 糪U`ΪS6˟wsm=؀ u5hK-mhat) ށ L'&=hdy5Ḷd\?88xsoz铟佲 h"YiME*#E"rw>:]+ )L!i6$0 @,Q.bZSg\y5O Hs41"9 <`AsV ΃@݄ܤ*]""yMc5h+v8m#2\f+ Mf|:zՇw 79P1CGb<)n~dWϲ,Pkx SxcI$?|**l]X2 sŘ'<˪2Z9LI@,!I{AR45ۺ{zb_R\FLlX^ ijSϔfGfoynuI)W##ހm;S\z6}݁֊0m]MN8vbQt0?w/-!Wj~19}muWwutӼMx9W*B&B摠"2 ;:!f'R.2]LXBe^sLT#ܡ#V{{\W%1)uS].|A䑋6YD 5! ÜkC d!f`RU!X5%B:/GFk9شd{'x-N>Cc4A*fFp^,ƹb "u-T9 cueA̙IgĀ~mb a˩`4Z=beMfEIH m:F<=VFhoo13"o{OGyԣ9ܙQQR 34h2W>dv>.uYk4DK)%JL”3 RIb&<8b٩׉hTC:KgX gdGUU˲\,Zdx<βۣшB" `:"!,˘Y,B?YQdE`I^Ɠ"H6,wF7TUe4ʋi>dEY !D=Nkc~w] ?lSW@1RcnAWv)Ta 6`̞zb;YWZy歃=}gOi7Lxֳz;oy7?o<8ݽ;wF& Ee;Fy٘y}Gҍgs.[œi.6wN+\ _6];CrzO /|ӷӏMߺX,Rl6?{9w,~ɩ~:uvX#9HWǘyӷ>>6g m"ƦQp*c]u~d/ɉ`]sҍ řLb:fJB R\t1Vޒ, &zG!SW1Ky C|vw㷓%+Z]5)˲t=pכ؜Af,oo}Sk!iNS˭PUb@Ioߘ[7 [Q0&cш fbw0;݁؉<'Μp 9"1|,yDq۬@Ӎ9[` ,c)%W Jo3m0v74z\>o&9}/gnZ!vM%!~vmc(mb:K3NU#2s$ u꫈=?:¥/~-^駳?'@,e盫AkXMᚹ2ʓrvG2YP|41h4LF(+F,^"p jDs!< I m8 ̬FG>ݽ,+̬oYv`Y8cASI, 3*Y ,G<7o|pe7r:uźdS0j1NzPӾl{{1l'gDD~cJd.:OmC/9d7<7UYiXS֢|qGp'%{:,]nzTs,+Hq:zc[&dmepgدVo,Tz`PWGn(,}C ^йĎ̻Hf&_~tAmD_5_j5}O|~˦_Ǿ?/?7[%6㳝L=tfo>e r1j nLlQ}pqx:~H֪`IA-zX2^,1j0LZrJU7M`8}u'! [nwHk Nytw} \"'7.(i|ge0MV@oYVw}yYu]bT+9$sPFiaoo``??dY[UzʫtPvlg4DL=ZԨV7v%Nr^ՖP:|oooD4ƪ^?xt4 qmaJ~"Ʉx2TYk N"AdYyr1UEƙ T!"L WU%"`m<^[t[͘JڝՎol59oSQmR3BnZĞu'=JD3G0,s`ɕlx@QzBG7k9N!dZ52sZ-ЛA=Zw-T#6Kno_ KH 4㱤+؋uncp,U.8 .ê<>.ݭ_/fUYɔS2cY9Jc3VQ0(SPYI 'h+o7f'ؑTpG`q& yV`tb@J, `t&1? f fY~O}Sw=<ѧ> ,,'/z*~Oy7i\TT]pwFt0v=Nۙmlкv`OU9˳/~[UQ@j B` 0vYp֊ u ժE?}޺5q^(!mCS""w5E6i>Ttpce PH)3DD8Jub|r3>Jv?>ƨEƭ WJ-| ƫG\qQptt$"EQ }7g?}t|Ǿv;{{{zӒIMJ]7]lz:aiYp~|wqt/R9C++&$ndoO^5\!QeBMSU_mU1$ Qbc6f%$ui{{o>?>`V;k=:^ܽwɗ_yw;?ї^y0/P( )w9oϼ-g"Y :-'X2eJg>Nd6ͲLܽwj(VUwM'[P -Kcl}{UUyUZ:81%3ãIU-b@gK`Xe"DDf1UMAU%H톷;q @03s;'fdEnxL%,`f!b7&t\[7FEDVG388d,t$;Nmw1Bd s"Iuj'c(2 Kv]r?qnc%_+o4-13v28e}S&۸e*gZa4TiwZAE@\@g^hQ}q0Ӝ3j"aMkh0{NFFw ,#io0̡2ɹ.; 30(SXI j(0)Foݸ9:Prrw654JNAB]1jEDjͽfY&H(|_|~{gyz4bgD^kL|߬"e9L&{*8fy*t-2t=-R<.Fޤp/gxo嬮vw µj12Qs@5r޸LĬF9LC`A%RID- ۶GkC^4k瞔O1;oө3j“D5jz7wg"6?w~zm;{8hy\]WK u.=`MTdt1BEUOܖg7=:L`Qv/|gm[Oxjt|7DxgՔo?=ş%|w~~r`{WgU$wm/ʟ?7᳝cMI+Umuv*KH錮YdR˙U +&P6V M${X2&R($j1Mک6%Nٽ9kIɱ9;HHلVLc6)%#en!6Sl2DX߽~#[߼5%uO'tᵃ'ƣxq{OY, y^1լfD2PQ$UzRVdzѽ=q;1ΪH CDI9x[&P&wTwN ],; MQ6U t:TG4}RBGGGY1W7f^W([ABH Hv.x]䍲>=|PDE>e46 zEN'~rX* ~:?rS^C 0&ݣHp,LVѫ<< {"'"%klB㻓qܛ~m!r+ȣ{Za95`i7+>uX=Mݡ B%$m2c'{`la)LYq]u! :SmޖT=޻[a#93ݝ}#Vؖ",!$K!גCH!!PX +D y8laK@,첰;>ӏ>YUۏ/nܨSTV}j W^,xتcR17A콌d#;ۭfg7!>%Ej[[x{=iEg?:ч-|>'/l<;oiekkZzo_tc _77;}=oYZ lTP9FLm195kی5!YLH*$AQ@Ar&LR[u20VYT$( aJ9H)f TRAR%T(T FB(5u`9̜RQJ04dv#*8- ֬sT5V6l Q]_{҅EO?rS'Ib@$P2j]4dmMiFs(h:AͰNa?*fӘMDpi݃Z1Kigk{^${/" xl%Jj U'T r BD`0nb pFVڨA75;5@ԩN$RB;*7`PM4iZZkmlRDtfMC֙3UrSV!4'eVm4w^v6#[eWO_s~#T<%/D ;{~ر_7/"joM4&$Y6L$@0e^S Jȝ.Iꙃ((P$DD@, (*"$*Z#^ IDAT*Zfb (cLrCd4ETDb;Ҍ(H 6DD@4M .;w{)a1r6 wR#ݸ= ~ȀG^KӤIJ uB1tO<j> (W@P)X{L "D-Q.׷vG< +AH,,/l3R_ڬmyCUQA.J~ kM$FV6^:>s/llluBi&&y@DUdhFM&?qfw""!fC\8Gаxاη,9wx""lJYl1+ D}"T~Y> Hfƕy޻6kY SHjT\)?A%-hFnB ZkibV}F{jP$gsuƪSsO6CkԳ.hsaf0mqC"FhD3o}u.;<i:yPH: xOxA]cay.P)s1mu @ Z`$6k똥et@*3{%CFL@eDCH(U~# (D)VTd 2M`,1R*hTIԉ f#@yᾣ'b\$MS@ ,=97OS 3.uGWzwZGP)E©RNcUETDJa.uD1|~w/W^IYDjS|ba[7:X *kXK9V5Lh8# [k5ipu4}"3K;M{{{KW^uG(Fg gJ5!lETjH F~+z8hHQVk'S>@n`| gS'cz0(4DFEz8V^`D[(8{>DEkϸ)BPc8u|YdY+UA`Db +;ؐ8djmk g [0s%W7 "f4T%?.DffT:tbYV 7.r*~j[ [e:= }!k 7LxwZf{tQUop }EmafYUaSbM,H !d@lz=LYYGA x Q@!cIc=D ֊렊$YQk'HHFldZcQ4 CI=`* jO 4dIUML,{/_@3N>R/-}H&W_~ t$\ݳ7WV[Y;Zi͂+UX.9OWgTU|Qt{aAEfUYrw;}akDJ9ᴻ] T֍Ğ !u\x&)g?{f჈ ܊TjqdpO,AA2UJvp0Z6IQ.TEHj@TsR7;D Mxlk*)@Dq(DCEIQAcTIwƌDр-0EBʬ?ŤDHDCqx x\b Ex4io=;sB}v-^ 9WԲXO^>M7{sO^K{W\t:ƴ* 4 Fi[ bQA})=A!,*4N/뤙5Yۥ,nGq()""2 BDCTE1:JGD64d ddM9*ۄQ&HAEKg "#"rPе "dY _{A\㧘@[]^r!QOFϽt]+3 @Y;[l^q^w٣!" N)UA P cQEQDH0aQc#+KB_Dx̩id61tր BI{duWc9hm6\_{޶4:6,VFmp|Flh4E%Ƒt-]zs//*A Wi(ybVAtag͎^biOD1°W ^AD XF0xb ;[f;P-!Zuc6EP D h B@j1x_uei,UDJIehg?v3L,,[P"JRi+ 9YUP82"i6CwS:Yd8Eyg&j|05N̕qkq⸑zN[Зf9ܮ bKeM i6%'8WX EN-ع.i_xz߲4sKs?i[AD@QAH&v+N't:^D J$J* ` !h6(@R{o U% 9L!Q 6HdJ !2@DȊ,ȊN@E`{ Wɕ(dk8}ŗ_x~>~N*8,n~_CFّ3bF*C陰:{Qoiiww\~FrOTTIdUdw˔vQg6v #ī]+L}uR "FiP *iޣǎsOӌ5WV㈥!߳hn f^J{'ٟOUPI8aĥ1X@jX\0^ +Q0@c˯q? Ջh}To= k@ۿnz+EA5#2Pm N|%mN!01D H"`,|tP B"[PI,w̹3GP^6[~T:E!D4ò'2 Xeqi)GCbcH׏,[Ѱ$I׎uĦ(r疱#.]UE֪TZA5@o> dTgzӚ۵,EҞ0 b$}W44ZS^іf։vp|) PXX)"CbQD(^z퉳:{o(GΒp|{c3QND6|8ix܄b^ഷwJZ@jh+"b4C|jف0ʏV5laUuDQJD$>rhbH\9\]Z.s!@GjV\(aU*.`= hبqc.顯NzZN9+VH~j Uzq%ՌձL[c 3?2[OTSYeս*qViV0y#"a[RDeoGagp0-&V=t-~ݹ1zs}~@kY:ytDJ BJ=B@Yƚō.&b cM:%p8 ^ j·"2ad4 'E*VPiARU (bdcJפB|F_Ƙx{D̀L$ Ib_z坝DrFo. n޽#=fV@y7,:Rf0%D(O>{CkNd/=7>O?{,N0TADZ&^';<]eNB#13Mfg'?fiyIAcMs` e +seADEWJ>raI!HWDаϋ<a4ʭ"!xE 0Z29ƺwT,]W ѻbġ f5V Qp zﳥR5XCRb6@DUlUXBE_1M[ʛ1ӗFS1̓gl6j Naav o@rڛq$k{]󁺟z{u^Wý5_UaR {&Wu/WzKuy~+\0f8^j5 Z2 1bV Ĥ!HJ8a0H&jH*H.U6M42*2DUQT%TYUbh [E|BAko|^|2wKn9ueTէQN% lLJI!5zb_击ǣTuW7tidl )I$vowB Jp5'Ovr ؍j Jm5oށ3"։8O!9*NFDcNÜ?ً^ %^$w*\p{@:z|"FXJRŠ @*T Ysíݵ."'lT ) z׻"b!0$=>Ш>Zs>aq90S.^ΌФiuٝj?i ї@$DDB 4 $Z!wU%@T $AEb 'IҼ٩!=?aDؓ;>qZojnT}lJ> qxm\3l9 xYӣ@o|/ܗ:\wË`f} Gǁ} 7 F {۷_Л,ݝFU}g!R&5Jj 5FUAh JPmmڪ"@7hU, yCoGgхh` FEZ%EFJ> "mT:^@!@AUJ4@E"zEDB@ddܼO={⥬9G||Y" |Bd,ٓgO^}mw{oGCrbu'<9}b˾rRgWVVbn0;]2l ܼ֮|mvà|=䙓OG)p/^;[̧?{'jYe$JURÿ鹴p̛]̩ٞ0ÄͿ6ldB].*`sA-~HyaW3lqs0+`:LAk*"2 Gy(MXV%ۄ $l胂nykF AUU*@={f/Рa`_uSj?'Z]% )`[A=4Zֲ1Cotwufj4ux :Sש0O 2V@un'T3]>g]h˧}Q*|`mwӼ{ȝۤj:&Ti;]qr`Uw /ߜp/|~,3-YO5iLŠ&Q X}JA$RNJ[Y^J):!GDM( J?NKTѠ!"*( 0.xbX `Q!T[@ Tkcm6ȹ33]}K/ٓgϞ=z1tرeVB%"kP[_I]O>`cs{Y--gғGW:Pp7re9A-큄zJfýsǯ]x(N?أ^%2 M'ظdmbmM̜ͬsۀD&'5ZqRx{uiijoA66+\cisZEBT%4RfxL2;D*E6LEBb v4*.]rcIU"!>P8njw1\Jn< ˮAO8ܻA@e^1c0Tk ̸Phk%ՠ"2x ̴:`{e>*M)W @(r!VUP (*H( ޫW 1L^b(L̄ ,8T;JK+V檲p2 w V-s(u/O{!a ۱0[r߻x+3g)|s?t/̴/,2i>%㟢6M;sX5!V%cZ#Jռ+VB$B `$DhjlJʈ{A j"1FUUVaLdlXǎD lU$ s;Kl /lmo2"R_/PnlY ٛj/-땝k`s:0eQ*?>sgo_]]EYv:ch4YU;p;̗on&P϶N׉ 4D2<moy9w_z񵛷= "Zp."&t-Q@a(*(B  x/;;{ I%\di KGW^9z(2{Wcc;1| I Ҵ;BDBt:kkk*p5,r`cͽo=EG[RiͦME+-7j&LCUEQXNEd&F "jteRLD )@ DhB U,1"FKbzEBEJBiUD e *`uVYdh1|;L^绻\H IDATdD,Kflmm +W>Q\-z wLm S%~Na9E<+++V$1BT ^q3!BBAB^ YUU,#'NLe @Z2x D" p~1!*EDDd 'ְ!РHc2 g?o3H{Q6nilX`,P ڢC"!޸TI_ǘ{a_?T=o\iAc쳻seO%=d P=ûM";@d 莍H~⧾~js,7o3O][mϡ,|M1H2yMFUV( 0VE5HYBDJl4d:g/UI8blQX1)(@JLf]P&ۢjT' aceC, UD j9o޼SO>ɠ~ow3K,OL@qEY( C>3mJݺ;C Y,òt]Z%|h;XA9~Ro(ֳS$S:Glascd׏ܺmY;PGI`W% c".8NQh멧*=&j.NfРHAʲ\ Wx+;{y!EQQM"+]cKtaT%cš>0"w(˞dJG)SC|D8+9yo5LS/= LwEiDbvQ4ZPGqX%fਜ ^9fLڑ4dI7̋0J:@JDHDƄ:D= !x_i" +#!l%ib,D$ N%mⱞm6hQ^UiU]E KS ՉWVuDi>%F̪D(h*'J__F.ԌbF`Y:LM_oj ^z=UF$9W@E+{z?G,o<_GI C_~~?Y?$NLS[*R*يT *\2ǧ+XP Œ*!8^cg1c"8 *Wl43 M%(m07*(df6Zk,V k * 201ŸY"!I@E[# 1BPABP( ( cS- $2˯{H-+J}h٢bv y^R%+V:|M|YDBĨIuieƪP2" "*z tЗgL(=;qE` "bL嵣;;w>IY@DdD'UTʧL'g FV_ yĖ2S47Z8m@qCpw]jm$p3[<]{%Q s/0%DM' j^{{U0ĕ8Ġ横ޕ6K:u@T6GCv/]uVww/yf^ooo&`Bq A@S6J[-HJ"ma[Q2)A'S8J;,áҴF#j%oǭs16M3ޛ^4 wT=yvJ']_C W!%KV!QVj>g!v|ڴq &InAI776:N.#C#Emyb\YCP@* b%رQ4]'^DڡI\\2Z&W(&Y֦P#""!46C`o JPjҋƀ1zJ%E dMgPh,0cޞՋpS?Т-~mKm6~߬H"͌l~5/+p /;+XɁj3o+w_Xi}MC==ڠNPQhdrPx|}s>fh>e8-;g SO>w㥗ο/y~@S:- Sjr.NȤw@ RQb3" +M/"2(9@Dg{[݀Pg&($8$@({}IA*(TCG"Q<@;U L1H W^\_[ʬ;Nj%ш*7"B|qopOC6z{TUu+ X 1FY ;rxO{Y"Ryz9ʻ,[ZVֲ` .KgSgC迪@չ2-%&Q@T88ƜvxL&8`fWKK{ N;,nڼv͍m2&xNKV]oœ叝||<БguP\t`z[I%`}X"c/d< ?ܯγwe_sU}`M&/̟n&?;[E?{=h=oY9?ܮұÈz# @96Bm[sՇ=*JQQuKlr R)&Br) !x !3PM@ Z~ d)vLDDU5`mD4.\?qR%C-IHD? N!E ?!*2hQ^Bmm  1pnTH(ɠKM?onxjgz֗W{^5άpͺceW|VsUc;OCB'-n~e:-sWeK+e釃>܋/onEh!jY7#&  Xc27#V{?4 VhEѨ^Yׂs.z׮އ "rҥ H {+Y)42mUԧ}O'-ukwM(9V\XXK 氲l`cRb6I};y'/%!O: FHH)"z@RBh,ADU$t[q^͉߄?>?`߿GxV'G:Ώȿ~?r___pgRyg?G2kw|epZ'SW奃W*ɉslV.u`直Q20xv.}tڿoƿ׾]cW@Di|OWzEAMmva`jQU"AS QT;T5+)@@E ZΦig(!T[c^* ) + UکhH5DDŰ?˥DDj(lGL>cLW^8{G0!&F|HE&AT>5[^զO?|l"cvvv?7q7e6چS@>+#Pl*\$s{I~kcWo\]XbTIU5SPy{}J9͆E#Խ[;gy/AHDڵk躱I :UMk5iΨV60ԵM'Mw#kN|«zP6\'uDd"(˲յS'y{׊ 0ܸ,-taq#w$HըTF!jAPPE9&@p ww~7~'X:cOe9V{KGG5RT,ֿ%>usts\:L;tB5>z{~.]^^ozߎ~'~ŗY~4*T~gݧo?mEx)˲w駟~>_o_{v]ʥ/~G~>~^pWoݺtǎ}w|ۏOJ(WvD6(ǂlv 9#﫺^D lӯF}dH뫽^sCe&Ddgy?~洵v={vz_TVh9JL(:4JLJd a4LL2JUK̕%410 ċzQT ^b$ WИfqz$&" A]B x'&[[[ϟg'N( (*E諀AP:\;\YEQx Qq>x_ 48U?@@(Q,u&Ώ +no CY+׷^|,騪1nt-TUDhQ&&g8CVmQR>tMmSpQ&Iݏ}|{w$(/noleId|ШC@-ǩ#M&qADt@DJ5Ό&m3{ ^\@1<ϷvBP$#y3"k px":U)~Y/"x@!~K?@ 4M,2sQ8آ8c,˲,Z[1&Imz1A"FkkU IL%JN BHL6!^J;'; PVg?ݕK|ӟ :+»tHȂB,HBƙ 8L?ўy>UU jlܺWa6Ւ<:4#Ma{|P^ݿׇ]̢;}w]\gjߗ6OS+v7_o oo\v<76nk׮/oyO+\O~}_Gw|_#ʯn /r w~o/p$7}4Í֭ b߇ .Vv\ _&6MRcKN8<އ/K4oq4.(Ӱwvgl,[ BpA|4U"raE$GAT E)T#j}X'=x76F:XRDEbʸZNie!v6ZJd"!9U[[6~p8$H@İeD@U1JkFJ;ԇDѨA N+ (J4-fD2@ѽ&*(0E]|nh4r /.\'{[!mook,WcNF Ӳ]f ?/fOVpB 9*`:\A A5``Fq΍31szH4<} (NJiSD UaGb?HZl2pJk p57}m? m??H{ۋ@ٰsb5Hǎ=|왭|c298$I1D(D9p8|ҭT0I2Wݝ S$ɼ7@BPDE\0DD"RbSшG>/sro_zd]DHtP5׋qT+r0A!ݸ=fo>B ۬-IJ{OݡsijݣY3e.i?pù;ك*hWM>-qXP~? 4V/Xl/3qQ 7521-lI6O3}h|G>?B[ۋD˗.`PxX4F?}?[GifxS]ϼsuug-ɪ:58Ýr*b,EVZkx8؈"9-*Oh񩭶QlAωA}R SeeV7t{qL7*U:7Ύ{[?_G667{^$HѕCJ>Ї~B_@=M]y> yLo_;^o|%ןeYL+[e*0 GG>~SUE_,Kss*S \L⳾8*D?\U0@2!"!Q\YA6j$zEPY1!i "_g!4@6cYEc-)X_H8 }pg{xԩ=j o)va|gQj@!Ι>7;[co.I;%")=*K6i@L օ4 `.Dv AI wvދ)g4B0-V:5?&&k{KLMek628/{!"f C|3+4P%sEkjDBՀ8A0s=wn{aҢ(4X'sL!!1  2"+x3ulUe?~y31~T&7$"g_3oF"z2` =_`[.XF[ڜPj߃B5 hpBYXUeY"UFN]Lrcr9ٹ}ِ#n gNzxL8"*n*C調MC(Iqtު=ut3Q@]hVb^TqSdZ91A !$G#"y9k+F2giv}EZ{qQqǩ;?}76w6@Iv "h6kuޔe+Fe=jmgԹLM`A qm'?}[ŐT)%3btCsvmE\hO'G WYGSNc'x8vEsޏGEQ̙綶v]---9Ta}}}s{+sv)9@+sPCd,˲,Inj }ayF[=+0FVWXr!7G><v:[Ũ[lgvtègM2'C,.f 吶eig9?/Kj~m[{e_(]q}Mif0>;nj.Lfʮ*t @'n7Nܹs}_~Cf7xxG,/w:$I]~{/o>;hdIG;Ý}_؇=-/᫟܍Vr ÿ+Z xMR w=s_<)w]w8χ?>예 IR~󟇄o{F 15_ciۻ}N+5iOL楄*`@uZ)eefT DD^"1D` $f$D4&H rU֠"BPqAA5(iʠV)E覆 8}1huPV aYI+KL[MBYOf8;N$j4N;YY!Tom-K0S5$DDԌHAC;q(C0 yHǀ"!9gU *&N^%B J r1bWDN7H`fdfǎ,s* 03! 2\ڬ[\E j,XP4 uL3 15:q V4J̉sMˣES ~!3^ EQ$.- onlGdi Ap\~^EMi"R{ ZZ{ǤZB1vSY,Frlxee%eY鋢((N#M;= 9W4# Q3w]=wzLNL ̰U9;,][f!K 1 ()q ;w:DX6O"|3[3Q\8{tk+#D--u}M$M!f0eq˖|1f"ӷV҂P8F/f=ϝԦ<D2S F}-Չq.`+l9JLqE#\k5Ȧ}/M`w8Zqs.g`j N1]ί/si:|;=<Z |үcG׆ {nOx|}ɟw=~^7\hm-KӋ׎h.uQعVKɯ|>Z[;h璙}^K`_=z? Oy رcngz/{N}w}IL{C'}׾|<[azo #f~4]kGe j5Tm^h5e興Й flfVA*Jq D܎*4^TեIe%J/ Fui3Ψ!`C1;al`cM//]?$IJ 0svP ƬNDM`{7\#pgs ,wbd!"p me )D;^5'e@<Y/$ITI "Ƥ*SjO3Szc= -hfvыff\7~ǩ jxQTTMTU#:~3C1(w1XV9t`g/N.!n|i3@XU(1!&QG h/$IT6MDH:GsIcĐ eja(6KKE@wL+3)/yXٍ?%vY:'*{˕(41`4i߃~/}AL4 8^{|9tBx?ꑏkEeQ&I~@&O}᷿[z˓g>q|m=~軺n=qʲsqDv2w|?_W=O|o|㓞|0p\$ÝM3rxr}KFtѓ'O/,//w}y-}~Gyʇo|>3x;ޱ'>ĴdTWU(EvD!%PE3BfDK_i1Z:ft K$IRBYR"3DzSCDQ;ń"Aoff f~S~lM lH(&n c)e<GcԲ,"W" ,:.E5SUA 9vWd+[Q{du$b8#Z%*T55'6QL|(v}o3d$i`E0@F*EPk2=t0[ Ĥu m2/;!Jye2TVV{2c=1W\ȨҴD#?5!c;T&Cac A칍O:YHNPẢHJ56fxjL0u=8uA'5Ԛz`!2!rbgάq"XYT6lMy$3D"a! r{{^IdpɂH1"` 9t 121&$j@ P/C.:7,pr⺤l A w"x`b.kobum#lZծg^&(uMhjaRch_t r"E⃩/چ}д\yȼ dz J&$)5EhUA3ioRh領p6\BDߕrL#QgojV7Tnfz-2Ff^ lb /^<+}jy}=_qa _^X? _#m?M7~7|kod{~R~^Pfέ\&浯xя~TD7]) ,C+r<گz'̧9|޳@Qu4_z@H\Sxܓ/|\WTeߣ,hD]œx4>q$G FyC(W*>]9J4M,I4Ͳ9VQ1"\.EC1LFlLCUbv{/ c;BD %CErp0xQ{]j:Ws}" .A![~j/S&&䂖-9{Y` cD,Fd<l9w0hY$]Uet$/=xp^61w…UR((Pbm.f[(ߩ4{i)&RPA+bOx\~QLzOPjCS\5:f&fvo@e̓>Xs )'N5: b\!4Y ʠ+bS!#r8:5MP`&h`𯄨,,--hs8I|@1!0& Z@S$KiZ`JZwKL{nBZrI 7Eb˦[fDqmѱc@*LELqA0FM Mf0!h91  Fftʈ f `HDCŨȔIF$DD"JԔhL{q^ 4IɩZ^B"d4\?'C Z 1C:}QSxnuȚP=PH0˚Ϯnh6O _w]-8'~]diR{R{VjIYOvfe58c}vm"93]EQi@5g?OyE|~/__|6'u:١CU _1_1+c"tcg>ˎq&6h0yu;׼G?~O'>q~ouuw_Kꄨj9f^-p8766[|',>ND DfF h&_|ct,r ׿{6R!y *X]iy&hP "$@"CEo ex-7\MѶEYx fa nEy1ɾe"-,^S\>{|$ϥ(&Y)ATM5jfnx lb7پ^9n.%dDr[Μeb2,//3cVWWsMĢޤe3CZk' j)RZAYGviH &=N[ ZDΐxAFu9V/qe!bBLKȥ):`43Niq'2/c= D 0CS `ȄĜ$IIn>*F90)GޏJc7ܘ+$#QƼjBt1E6r_p]1{?U̟4ܻ #]eŢ6uͅM]{7fLW52.<_|ޣ|1s] w?gbUCӟ_|ɓwGd4mnl(˲o?޼jJk|ݫ~ի^~ћo]{ȑn{Epu}S?{ы[?k"Rѿo޻93<T2.'ϼ>>[_w>~?o_g˧GY^WTB:gL pűH*A]+˰3;s[#1*ry!Ĝ=fjhȀΡMJ8u0aYsRs믹+$!5nd WUADZ#;IS*bF ~w"'\]YYq egbaM3ėI3R|eKGrzV xE~ʵRsFD!1" TR{X-{>zĽ !9rEQxK߶]U+T1z1ÉhL˟]NUXQ;myI+KQj6#L* sz[ofnjj%ig{guzAJE.*,>OLMDH)ϧ)X5K“W1Y4bN2={a8ș‹!diBk[C:B߁ECPc!3[@\'4CDK4!! #r rLHII44q,Z39̙Qă)#* Os?hKe0 ímeIr)ѩ)y#|5Qn_'{ɬ(* iK<Pk}g^4]keDd4e`f1tP\3qvd=KVL|b}K_Do{[>=am(Ϟ=Sŋ_7u>OYrV{[hyyymuuiьFݿ{u^B͈O| o?я:shd'[oe=+4G ?3?)߾xsG_|+~Ϸ<۟OZZЛ* b)f'ޱ*f0CAc\$S$q ZpGsE;ѹȫq D B8q!D@&!Z#2\p'#U-$"Gxǝk{]ڑˌhd(Xgň.⮠fMD"&``jXi2/skO8nKKhD|!Ftr0UU9-qyU\%ډm9!RLhTg3*,l@X*AȂZ,u/[M_}]X2ߝssޙ od ZkjÈُp2I[§j0PQZ\@35p Z! LY\؈ lWLDHjg:Fs5Z5۬~fngP՘3Lb,ʥ, IDATJ_ʘ(%ԀA8<EJqZ]Й5`Ϋ3J4!DD ;Gr, T$ɀ̣"ch &IR W]̜$(Y(H@ @eRH@3;"PGl'Y? ^JMԋyP@U3dB|0`I2(r#@uPUb";W 4H2SkVu e6u"&]P"BvGf \k_E`]JX"Jj 8xuTh{T{*!eg}GL%԰0HvKsEՋDWý_CQ}z1~H~#A8{?i?iWotկz]9@p/#/-/݃lsssu_ <__7oyXydi^L9n+eS_j*w`b(r_gu5GxTG {҇ԋYHi A@f*6ED+ ꥀH"/gׯ=~cرcLj!xBv9BAM9af3AP51SMh5*]<(e04aDK3N\|S̶Z:GY)BYDv >0"@T WEPVU%tx'lonF#M2 ` bD(MbThd<R*fr2.5=9THomknQ! (8EX! G$ZYZqKPD *#6N| ,$aPem[RʚU6 M#ZTض+60U3#D(ňYSk֠q]EFFJEf} e)MǥTB]vsa-V1(0h,9ɼ"^UxtB9vRNj¥bN{,|!Hpxs\/|@f̈MA!94e}L1y\uP;G^o\Ʈ' `8G)HS ufOE+Djn%wS4JFf8[OU۪Ŵa0ޱ-2yoկ:ﱙ 8Z7ZPnZphhӸõCFew`(-с mH1hLd%ٻ{"@-.qdpb?R! ~kֲ4fsz~ Ƹ$|ΞNYN/;_w:h}idf+++'ON:;Nd{U|)MVY-WP@Q1ޖe԰ !~g0/\|\ƣq Pyٝ&`Y0aVQ1*mm휽g=thyS fxeYd!),qjd@ (/BH1I]c%$"]Ew QUz7PD8^Jzrgw 9q!j(Fhj9@f/ 4I\ы!Be60,c05E4S@m b1w)$17 ÝxTA XJ,n֖Oٽ|6~fiFkkEMF%"bF&,L KxRiܖF@`\C?34S0EK)>ҪPji&Ud#hGj[}6 yn`LHTg1+Pt9EߡZ$F1Q[(̼y>*]G UT Fh}P]V66; c$l fb6P%'QeNɫq$ufY@4ù+BӃtAk#l {W ˡP1 "p<*,Bbg_"P.j ⴧԃ^nfYX.R{6"zWNeZ]B$qo{[QYˣ;;ӧxZ>+_][J;8/!D+ D|9}>g~1i?^>^aW=,# RI#!dΧ-*QQD,E=:{΅`佯\+1QS&FFhFp{CF8Bx͝6p͵?~r7M2& ()aFU 4KtWCan4>/<2h @ "v2D&N,^`$Q"`ʆHI RԖUTA1 e$mw x! 1藋@FDFD@c  ꒬ﭮeKK4b8c :Л@db6r(Ҍ&5{3=W GH4p0De(,IH0/Qb3fRD(R$-)ki:U2E T~\ʬʰuLz;=,qii)I`ZZ r&$\ΏUv;S\W[Pe!Nhlbv`042z8eZE7TRRk5,Eȵj({C"<) A%2`% 1bFD5UG\ZUZ吁SQ918Hea0lgi]-wA]N%LZ\I@8-sb`ۅ>n]2p땺 ~WR0 e[lKv9UN0Ge=qWn?>/甘ߘf[YY{| 1.0׿sS8-bnC|G=4 M~m>. ,KӋfB 4I `:uRE&/0[ۃsϬoFy2#CrKFy"$AmɦaX ijfeYH<5 /fd}c;qѕ#P` -yފFU HU #BI@U~45e u!*#f.HPKolL&"PjX(Hrv4]^4 h)Ut"bۻk;:%LM.Sz4M9;疗Nx)<#:⬀c%  Fy8}ǩg_X_ KD.2cH)E+WC1mn{7YeZd6V$, "%`$B$8 _.VW-/TCz=-c!'briRbԡŨBP@+qUj1*N9b0"t*X:z:IJ1S0ATB42hjw{(;a׏s)/hsTiu taVwVS' 0ĉ83e%cs^!5[*2R/[ߋi֓pQ'}YFV϶[;2 1J]14P\cRY1$!23'IHE(O] -B+@!/hKDښ ހ8J Egf9L2"&1DtLd"hPliك;cvHD3Ү(P`0ObroH jm;9 E:pI)Nw$]T&'Yyܹ}M_&_m4 G{(m*٣y}̌,|Nmʙ2޽תhzܱ0i_Yȅbkၭ9m\D5Ш.2W3D }ND^^Z)B4Mr /""ʲ4&BI+ 4%O)> G~ wܹ5DžJFΙ+uz7MKc8|hm U]TZV뤺Y~zlR34P46L H%ŀ-Ȏ iLLCPDB/ )h,κ.I:ʚ\ 1_$YZ<=G쒮rӴ.uY/ĔIͨ*ɱcLjHb _23!5 BhbcNpGh-e#bbA,(ID4 ]>{`Vfڻi*kTZV'u{U #:&9I7,nŘ@nLD}4+qfofݗY"ğb!ćs)S ږ55*9vic Cj].`fSF3"$S`@$ ̙H.Fzzgɉ(01G1@V r!X dݥ#'OiEh!)%!ȍB:.s6M~|acf!(z[bszѦ~h=ݼ:%J&^A˯JU-3~$l)em~G5td*Ҭd-l_X|>{/:sn}s0*ҼDfS0P#A$YYb::v1h4BC\D0Ft2J31y4@GAW0dGDu 3 i"YZ9 Zcjl&tZ;7B-QI\QXZ )]#F#)cdC5 bupUC36 >M&00cYHGT+'!rnihu4 t#ei @T48^^2CN.[=~]sYL.v sܽRd1޻2govMSsn9hZc3 p)-־a˼?ilWҪk4?^ꦾkfy]tLCkMf>6zf+0~̹ B,!aof9FL !hlJ-li*=cm~2sUUďqɲc>(%> v㓧ћo}}2YdP(&mNB1> CPPLI q &3QF 3SQYt: 308An]W{v({j'zյ}:H1TŤ4Z3lE J ovEaftR>T,`U$TDD\ǑR *OyzyG4SBa6CD1iV+uݕ׬zXP:BrIկuvwTS28zt(lNۧ2/8<ۭ[oK%u9-s9W[5s .t >C5̚;]ٴtn}ySwzURsf 4E6i'd®,Kr!p8h4KUpb ȸ+" *h4$TΙlTD l"{Ti&ISG2T΁i)HH@PQ5U,sfCXy!|r렚cxeELW4˘J%M$Z @iݿc%("Xȓ,\J}N"/C2W[}30#D0َ2 1C24e0 *"h47,+D#b>ӝr+q(Dh=t-B>On_7"#j+ *"`UQC֐sy3a{}Ƽf`Q*G^7n:rվHC9uW{++kNeցֈ(583k&YDZ@BH"BA9N}@~s]\)cVPM4 (MNH:ŭwIf= >q7+F"Gɕ8ֲ.ǂJ2tzsNga~v=W۽{ۮ4[g3o;أ֥!D2eHkKZsv-l9'4'w|@(+Cd,UFϲߪy$}Mnu_M/a` l\BW OW6 yz 1,4M0H2O L9|z'4S OrzwU˻y< g"П]T^Aغ2pΙ۽slQ)F8dn S*s9(f#_0_yWYYPD,H ( 8^봝s&"r ?x* -G,Db`|EY7(TQI@~ Ap"UbLzOZks8-I\ifΓ7qd^3ѣ@!1" !"qY@bUҮ$-ʃ;s ( *ej$ImH\Ռ1^}EFl}.6B#`c+Tj%;sf# 5I9%,,@3V3}{iq":gZ5dL0P>ȉg/t3ގ{i]Zn' j ,Mm;Ǐ=iҬE>g9ͲLTݻlD(b"HL"W{-[l6>ʣj1 _ reC7n&E0x )n7.=nnOǀVߦ1ԌwNpt;lYƜ+ K6'']լ"j6-Bc}'P"L=װKF}\E(sU>f+ N2"vϟ_ܶmٽkvpP8R c.!%&œX4ݻ u*M#"C!l[ "je:@A Yfvd,r8#Yas** xguyŠԂD+"*{[Z!>S%όU e3}?̬[ MS( D )pZ_?"P !+gS=voKK" pݱYwܞ.=|Gi=0J˴hkS>Sss3p~\ØIvªjus%77/o0Yݮ"NEˡ; -#(e̊BǎYEP\}XN#]>0?s1,ԝκۙQAJgk" @U6LH]z: CyOX(_R^_I=@w倈Djx^EOFE[-u?*ѕ'Lfd6pX,<2:Cꦨ͕҆%Lt?i#Bꤗ=9_8w-6Z=[_\kJQ]uR( 8J Do>uHZ96<)?{EOLz*4( M5/ED0O>}{vm߾(&10<e(T>LXD]|ȟ2P6<7P(2a`] ⡈hfD)UՔRnUJ 's8}c; XIy{DŁXa˞aW5(S7QP_s!#eb.Lcyq&O1CD%(c{ӟ<ۨQCErYdAj\sֻqwja@ư,YcvCy\*CQ7K[K3 P̐(R"B%1eR\0GG@Fk|f=VzD L@1SKijqf\#Rtrę{T=V B]kj(TjjRl[o(N-jFd J` N1)3)?ߚdJ <(eIUI C77fYxm6R(3ܟSzb5kEgF;V> LI*-8n˕]AR ]!OWƾ7HH%SH{ r;(tidlnAqHP@@ C?;b@[-x[ HN88"atٳ;vk>cVCk2Jkd !sTJ’,N<$ ,3Oc:av R q֊#Aa Q[C-g!CFe Pu4ev ?<ƽAV?{\ĞEÃp@,8䧏7e*͟H [HE`-G^[Yj#X[[tvQAPk<<~"v&6cZ@)! j;Y uΣPt 2&.sJL"ȐbfItzgzdqrA}Ab.Y>C <Ә?.a@A@Ϟ[1`YFCu?㴧7g5^'vcأpJ[meYs}gzi&(P8FĀ< ԡWuΔ,a>d*a+~.t)QSMSC!<<[m2OXUzi1 ڸF{G2IA&0\Hd& ~~K^_>|p*:otdpbLOumn~ƷGrչYz~/Ǿ&S R.7f.vyx2y)`Í<2-):zIN墅/}\5T /\tMm3/Vr~Q*`҃?#쏾L71z+?Ͻ7=ƃZK|Vpn~^˻(2F?1:}f߾}Ν۹cWl\5^9Bw]\W؟,1V= f,C* ׵Y" % #C f`FӼɀ|3{D@f&E1ր2'4۹֜) hYP4RY[f ۵NlfmdeZFkw~-O7Њ{uL_ ]ugxna+_ ćNn ˰{d lI֑#gL D"DN@ 0[9RcJI9vNuR A?}zgea~С,y+cn4(0Օf׮}޽+Z,MDAhmNj`pGF!% 6sH&G`)R *ׂ׫݅GAlf;*" D(cx% T `ɿ| hx_.*|U?%eZ~Rr{5"c,w͉eᾳO.،.7}E?4A3:^\곊pLjڽ@ A։cGDL/=Ƀv=s‚6* jA$YƽT)4M6ʃ@,>g;)}`&FP!|9c#swZVjqaDݮց8`O7 2pj H9頯&D J g`tdTf.,u:" [[tqSnav8|w0z?Twf~SMm55xU3#, ; מOP텫Ā;5:anpFf>C/<}aah6zu݁pňs<;meM5+qեm7r3Ӥ "" Y@r ) P3ɣ0ɜ70TLOɮU[s N`~ICrh;Wdq'#Ưe|_'jz+6&E@ˈkͦ8Ywudm}3N֋2,v}U}5k.@)RI D$عYMZ" Zk"XH#!qa> "ཬY⁰b=TF, F ;IҍQM?wPi bIQZw̟8[[Q%YoW=|~\iFˏ<2OΣy [9d#H`oq#Jn`Q8`P?{@)ifY… v{ǶKfk|: )SA>^w}Z АBH@LT~Jcff4/Qȷ]|~y⃫E+/dA5fPicoXܲ 7;eػ.j"}O#rѸm]hCojDdavyjU׺۬gggQ㧔NʺҜfZ'T*ǝ^{.jM AXk$ V9:+'O=~U\}ۃTPkmHc !et@8J!CAФJ3u?AJ';t8֒6H+͢zcŒckR&"}'0ydBCevvffˇ>@<&<nj*,#Lj+cG0Wd'"PRι hqJ! ci~,T譐wgR L@sBbI LF 8a2T.sHE0;RGbs-pw;&Q&:t`oamv}B2QDIhї% yJ~#EΥJ^r;adoD|0'k0s΁(]ͭZMIZnDOsKZVl;ffk%AYt@>AŔ2@H(MSlBkF&2 IDATTVѝmn9w:<.֖!,x%T n1A?v'~ŕ֠ZEP)8g `D rT#_ӯO36Uդq@VnGhswS3'477 cth":q~烿?wo4Cg(@OyW^;ݳ}ǶZɨzm/oI $JĻy*=͐'oyQq| m5 VGIaZkH9Mv3=x`ۂآdZ*s#'g`L3ȇ`U"'jEƈ8\Z^7;DdzI2""y# ~ߤSJk!Ql,]upBD !.@ u~ZG}TDro Wޘ 7usC=b A Dʳ {?޴gMՎef#Ԧ*u]j1sssaH[}6\TW(BuglaYsZ1й% zJl,u& ͹ffff :̬SJ 8u)XdJ\Zʯ#B`z)囤_jr[?mW81hjuç(P苕q a 2^E*VXD]`ySM@Mޡh)".HS8Y6:627п$h}_|Ͽj( 'N]w<{^?WhQnqϜ)c=vWo~`vnv;wnr-o#{k뽥s?/(nfEg

B  &ϮY@*72l-I*CX !4V<\eZ(|P+a@9B!BX^o#e6>4NrR *P2cd9*" xJ9\wP&]  bfZ[QEXZ[y<-wpRE9!))L2J"Td\MؤUD+j$sH*)a@!$YKiQwIx4\3Z s*Ii4kD@'D{lfw 555xOljC60\yW%;>c꙳,jEQ=wnqfdv߶mtZ!=;f/!3d9@Q`NHEJ9I #i1H>2|f4Tv 7a8RE: Ծ#8'7>n+&!tfA/1"\J\*S`\Wl LrR- 3V{IE_(n\>.-԰U;+.o]0Cw~}5s o9';KϜ[oWUW|zWlZKxiucZ^X?zcfnՂU^/n?>>v+^헿ν{(uI} j5Ѩ̴ZMs_pٻg劉%"g?^=rw~-7?5 Co~ GrI~V}۩w( QZr <7:zPKfڌDXa^W%ՋSZeUI4MuDD cfqΥ9ά_ҽKKkkg(H%NRI@ L`Da\@YE+YERqfO9w#OhwR*2Rjm&K"ؾ0w!jV#hB@a9snq£=l=t`EAX*0P``7m\voS<e8wܮ=q'H#g XTHw"PLbC*-wԶCӵ gOmhe}MjuTF SRUXN0$@ri&$q3:@LRōV t4;\YDLXu^+h"w)-"U2#"8EHDPÓrVq 3"sav:5 ,x,_\]k\ڄ6ul8^71 5AZ9D5" #[YfI*MD6K#SKVwU@0")ܜ@{ zi>\._ F#FaduQ[jrrJk=e3cLOy6̤F-;Jh_s)lOaGu[歬_E.{7So}ПЯKoe$}ڍ{۾cvvf#0iN8}cg?c_7y~;o7ٚsn\wvs#coEFxnq|QM}~{[nyZ^Y[sqqns[f;2~?t~꣗KDWsۿ9=oo4a!+ KT8ȕRWn+(}QO`b$qy (Ly 0vF2Z:xj촳]j"xeym)%Rzpluَ/c=W@E70:aJ́8tZC<}vٚiZКGQ!)RNZc&3 Le@,YbI# uzq$O~cgΞ[6!*MZ']Y[DYZZO\67Sow׃Zmtq7MggfZyч|F`0Jcay"SФ@6}{?C ^%Dܗrsv}ՏCAJa|-\8p :"dkR!zGJD犑ID2 ?0JYg&e [ZJ쬁kv/Z+KggzYl,$uӘ59M\s9Yց6vƝLELCQڽnmv^]CD8KcTU=/* 0_$-5\ct4 jB;nHL)5cG=fCByhT9'l3c[`Q9f^h4عV~;gvYLҮgtXk 2 &2cj!cTnqn6[ڇyK.rEhZKȇ ~K .-}T2yq [>se1!`UTױbn@0LO9TFTl0rO*1yt+)ⅰp,fsY)JW ' vi +# J-vަ** _* co3ν-ic$ Ee^Mw>;_vgv.+g?oy߇3a`n|ϯ>} עZn`ٳ;_XYCW=oF^ݢL7?)}SHf} _~ԗ>O{MAl-|Kű]{ft۾z׻>OotK~|w^/꣇/,"wg~57{~'q GQi!?aTE-{dyN~v=<Ä9؈ ٝ;b˸N$M1㔭\KK'*l{ЋvHR* 8FDHd.[{g_Z+;wmףfj4gf[ss3zݘ 2'XkU^L&N$bot:{zgZ&m 1RQ("iIz̹VVՄ6YT ^/Hנݍ:?t64t5(%I7ku/p DAvp Fk"ϣSa@4o913+eۻ'@-3iM2ǨBm$I$?>wP8@rN 3;,;d"As&zÝlcຘ.Zrv͓Κ4֌Pe@6ЄJRC4$ƝĝHҚ@A0 ͘P6BBglf _"Ʊ;4Ccظ*@"U8GP\1 9bVDjݻޯ<3f3۪a՜^fRFŒHH-iMQ)ef#Ø! T鿡Nt)=7Zk(/@zOmwnfk!f~?H_ܕe=7}ni }{δZ[֊ȧ>ٷ-~ի~[X߱cۍ7\N:ňkK_YŽVZ͙V 뮷رlEY߸}6jZ<{ve-ݷwWQl+ KCVdP d@xQMs3nKbF`vg4:ɅCjl ْShs +f B"BsdvP-"8 bRAШdqZqZ{+"r\Q@Ҩ&Dlm)! "u=~tLs6f3Kz++D\ang򔫏.tֵ!t*&¥Q9xXW)>2@ɍmՑH.*"YuEkin۶m=OwĒޛ͒]sZn-E``1"3 30a"&L "X@E[2s揓U}hމ˺yny5˃E3(ĺ6υDczcO_9/)*y{}+>*2Q IDATS^7=f+_۷o|5^zޝL;;G~?׿kΡ&<}ы~xO&="bo|foL@J姶EQ\M-׎V*^ڗb?w k$x23cKxx~\UyLY)WGHOkfF5jWsS9Ҍ~;LF{OۍؚܰSQ`PJ@ص3fZVUAbUKDDyA `l hRuŒ(l1+8LP%Mk%dRRI˧VUe٤ȫy鑔i=aK{;>qY3iL!d!ls"-]!{ZG!+o0\E&U;Ac;RyUUU/^|yLfy"M:/k6O'Wȴ{$n2#)8` FJI@S3Ƌ'/#ˏ"q-dE>yYG;y dƐ@b$Ju 'Yy"WYhJ)& eN&T$QȔr2Ӓ}h]_&./Nf d:7ZO!SնAkKoʮ;z›M.S,F1$K{^B3e& Mf)RCVUF\efGǜGXA2^+HX|*k=7J~//ou@ta50[|B__U/u_U/z ~?oַ>C]| eUfs5z9ʯڗ~~۷}ۿoʲ|'}~ܭJ`fGs}u]y!"}Q)Dw]Ueey?3 `~tC==;>傃j->972ε0,u[U<\ߝWճ<؅ [UUM)yH-gA V4@Ȑ}YڦVBZ2қg@!3+)Ddf" ĦLxBPUpLSLݝYlS!#.;;,Pp4,iJISJ̡ Lq^&3˲GCeE10CQ&/~?O~9k#cBj:cj;yݠ¤/ af'yWe$*"FA̞@C`}fd ֘U[yKI5#Tq:zttE%82O>=MQSjBp[XUeBjdLȡPͧ9L PKjIͬ.c S,$'M @a{Ǯ]8,Ts\&WM,K3cy m~\fh~#"U{3"׎wv;~]O{Zq!á%? ASӤV\8`O]׮bjH 9 ~*/qpeֽk}?Vǻ3"K3oޫt /zێ چnC'iP{;5T&>+EgfՁ=eε%!ZR۲vjUڍkG M?/wטQe.\zcWy|~]x3~~'}?~wyt:!}{׾+_;;ۗ.],B51y/5Ѩq5}槿k+ ᭿EQ<{WWڧ}=?w~G, n|>oo/ |4o/xyJS~RIv<@WfJw7G\b-s386bCd44"&pERM@ IVd!Fd2 DVc溊8emkW˲PYxgYcQȈ͌EjNI4teеM}Zg͌ŅP7G@Y.888*4wwՁA<G v J|Ȅ`Z0}ץQ*/u1EtV'y&ь+%"hbp@*dFH:N Fx| ԁ@@IU:Y$RCTavԊjXcKҍ=5ZŚےKTU"*ɍ 3hUYNM }Gy|~"+f0W_kooed:Κ]EK.^xqwo;/ⷼ-oy[~W|t^^O>߾Ub?5)"ۋ.OWo|wYUYvfݯ{׷PLRgyf )) Z{Kaʱvr]i&ԹMڊi`>eYeY,kU=::eGhE#?c͌dt<;Vk`07&H3Y&qjz/~ν쎊I&UUE$GItZǚ*gi<*e5*KQ"bB4Z=ϫuȘĪ 0Ɯ9 I5 Wb咚HӒvXV#3s(ᘺoUYLf0fkIra=%0j!9LjLÃI1کS]W&$ɟ׳~}CA5̖D2>7;.rygH́EtIeHv^{Ӵ0˞5mFB`)rwrȦvb]gЮof0&Z|nw5i0Sg9g+q~~Bk:k7Y} 7_ 뫪ȋ3Yc_zλ}wr>_ι*oozӛ~~/x}gg3ߐ/}|G{{;,e旾_?CKo} 9؉^[gwq{K'}ޅ|F2}mPS6 ZeP'%HDbP@S,AM׎g.m̍kc]0I;FD1{$4FY)Ţ(4޹ti:޿YX)h{Ufq-)LANI Ndccawv002Ccoum_RuA5`1/7[ӧX CVueyVdld$t@ҾLlc iJN9g!+RJuUƘLEfS3 dr=G?y{xaTh"?|y2* ڿB_߿M?cx11;W~7_|[|'9 [˾ҥK櫿U}ŋ<03?zMowvoowk: a){=lO y?#odQ2?@`t2yMx<* Ͼ|5irƁV`L7-mx^cШ"V ,(\ܹPߡGRJBVT,48c RҎIzVO44i:}_?Wbj6U5;;Y]v"LSGGGDj@TJWĨZ 31sEB2@a: qUJKH(5P`F(o}>^1w\6Y(ZJ&dI3rY0jZDdr `*COt 5Q99: ,oc;[j*tz*N[`RUDžKRQ$(&"\H,lLhĺH_E`RH@V , fYɠ f5iLDm77>g\iRujmk4MӇٹf&}˓xml6;Gdz_}gg{>+#{_|7}?~' 熋'л{{?7mc],fq/:˲uo~'祟,"EEe|p ?[ٖ"nEbZ07~Dk%XkFD̘!B̲-E~X򕪪b,R羴Ӓ6r txwM@z=`\E$󭭭-98epSUeS]V%|>-[bmB;S딈 FdJ5%3z5 )e/y?3^;rjVYV0bj@UVV23Ҏorr 5UI /qK0#5f2(tz:Zq4{2ټ:͎fcfC1G$%4& *N\$BY4@ɐTi@UuB3 r}/)FffH-!o-Z;0W)Q$Gj^~7oqj:3[$hnX n,fudD NdYR p yX-%Zm6)3ffS}oevia6Mo"1J<]Wsx<#|.맯\=(x>oM%˴n;;;H5/@3`la[ &:7kX5X}=W3r0dWב.Wt5Qg ^E-LKhti֚c˚NDM5t_kM7U h/dK/^A o7׻b׍/V'cm֓`tϛFǨ`!Zv 5Z|}#/_ui*i4Ng4m{Pr=A^_?^c/bTXCoo/ãySJrbTqj֯?UuRbѨ0cϰ;YM&(ϸ\DBNua߷|}A-;jR.GznԂ]SU(ڣWc3mAo8Femi"bC8vvI'{A,9ώ-x I)%%@xzlj`+2xa I0l^6#R?k _'0qY]' u*;52`Xӵ?.eǿ}⩵'Vwٯg/3i^-}kzv}9ޯE)ch;j:9\yΩ+55osU϶>mu}-E7n,-/ZeHUqؘwWJmBSЪn眠Y]z5vw&}pcO'$D"1"U2mMa>s)pyu9!Z5q1s&p|2yaM0%S"ȝWPƆb<ߺYy" YrJ8L**ZвH:FVIrF3zZr簖̕biS^Ol?['U&v55,Umb55[;UUAUMH8 LD̙DU c!!,E5 !@0G hk]hh> TT̐ MZDXck1&QnYBp`anFgG:Xn 1E il.Cc2M!T|>/#? 9:d)Y)&am2uU;:FMѬu]i1yEUS,%3sXUblfNuT".[:E1BcX"DXmoo_x,^gUDmNj{ezצ2ַ95kceXuCvSHpm}i{˳@bssq]tw'9SL~={m-E)t6Ԙ.,@K ͬҽ+k>So*U͠v{UKb7u_ƳB@Cd, gD6åiL;Auc":AxچWfai݃n"Y;nCW{o+H+E=椥ݢd,Nc@vQ@$ F½X9`r5A[1 X`#M'{'Y']AlUU棢R=WnJ)5nxT?>2¡GF ؛3uQOD骢FLN,}]" 3$0CD?#xLPu76K찇ge|a!uQʁeBN6D"1|JWM%sc& 31m 4ģіb AC4vkF ̹"+ .1p"((DemIYHjƀֿLLD(@jdL.D0=ۍnkȐI03 D|g/󨚲|GȣWQgdgg~4K)eyeY(da<:-˲,lE !t8%Yv3mEgjB̩]gmESW9.s*]Z ~r/F\\`٧`F㇟ίΩ֩EԀu7u,^o/^ʯYZؿku nHZup-E'-ׂM -Pk14oݠ_~/}YX:E# mf0bp4뺮4UU]˝qΦ }޼䦽}3J)(n Hmop5c'P Lqn5gNDlƑ=b(]LyFedI)Sc*IT!}52T23joɧ]OELKl)Tś5`L Y[c׃y LXa(D`"&W:%!Q4RDr24hX3FifM`0"lj܈Ј"D,n fc"c1nAvy/ҐM<t}[*[[[eI={.<>өp"Uh6Ũ.l*"˲l6f1F4;LB$D1f PPl֍E]ZfeMI),L63u AAYd9'_:ޭnlT|S[b:t|Pm$6MM]ZZ7^5^}0§ =puUY ]]}kaA^@p\z1DA}0I"n-[9KM5;.*!gdG$\D-OW:wtڃ>jLB53I!>,iq`e]F>]9BMĬF}zdb `l14Z3T3RLph L=Uۦf)13A#R l8<U5RNupa[gf"s_H&pkįZ8>J"H{-]:}s@M)\!J0u"m︍AɁ+1#x `#Nv "^(0|Fr )"̤qx&1`!17:lC "" RBBĥ#< 4T',@B.#dzey>dYCYx^5:.*Y{4u7 a[K'v4KsA8 -$hR 0x@%P!Lh{gkk{<GcFA_]gf.~9'cŞmapo߷f& $nDb{~'NhY(5Gɮz YtB ϳ<_7NmyIxv;~N|nG!Yo8-X6 [0.>*E"R%W|i&l.!O]ykGs3eRfu <~ɛڠd-;5y#YIؽ:>Ek$QSLX*%%˳p.^GУOţTͳEUSfd;ְ>Fc߲/v/M,eiIþ_s & Q)L UF,x;.vqgw:&Vg!)t!&33{L.2bMzfk- .֥ѫO @ky| |`<;DhPSS$z0BO 9b "{^EEɌa $f +Z%0ΝwY#D0Qr8kjIfG-׵YxhgIE-v^7<{Izm4ݯ'",f35bkag35!ɲ*^җ~+\g,cwx> DH]ej7xuufeȣƲ,yum0!a!b2 Ί0L& .^Oy, Hu-4whξZłuu)\:r~o] U]IDwY3`WZ7ZS/7IM'4j m?MԉժHgyk?{mٰ7B9N=7/԰ѨY+Rz6}{o?o|G=slXL 6  H!dCv\tQS r+m4!4R̈ |>?<ժB҅Y}xTG1D5H$YDJgTHkl6}5x!_Wƣz쨞DPa"=}H{5cc`M~m2VEa22 ɸh=ڞdۓb:.20K"$$*331{F~RjB̖wuACw"#3r_^7`Md[Ifv*%%e)17f % _Z Dn_ܡW  mK։lN+1SiP p@$mQݥ3V jg A XF3!'kRx^=z0{wvG{2LgUYϣ8ceU(*2ˊQ1 )b\Md4E"3E?>)b`,(5# }eID2\rX@dR:dYQ0N 3N+!pob"|g>66C skBWhGŖ-U^xSEyi&6әmneU|B7Q7ݟnuԝ..5>l$e8Sn\ONrBMw],$5e|ҫ^,䣓{e7\ IDAT˷7|~O {kkYmqn,+栢l4#IJm3u!.jSUH6 )&bH]'Rvk]L,z^ULUUήϏ4C#!뙰IҔŔImxUH[L,&Y1Y)0k"""M@,EQB)y.Eq7^U39Ȯ -jD] Q1Q$nhP&+IDIP(*)Ⱦ^pYg?zy9\@)aNOOwuuuw}{&믻q ( F<"v2Jk`5DP*]`PpUYRT(5(iftR!BF!TF[ [-h$po5\OsJCʞ$c7KIU].C+Njde2T###cJ^eÙJX~Uaw3dL.>UJlG)_^۟R={# #S".ӷav--NZ8 #/I"w\YWc]|? Bgiځ.wܲsjoիy}\{#3UUle!ѵQuQӃ)uaRJk Uj$:*6hH sXhimS6=JPsдFќօRx +@6cZܝ@#~5~D`;A "V*t 8w_{oFDp[Ѳ RQeLȏߺmS!6PkԴf U-&nZ"MJLV34h v 9sтYULxer$u0aU~F/nBhJ=3-NP/I?(Cb.n2ҫϿ:HZ'G/:'#޹` Ν;߱`R^4~  @Ç,غ=e^@$ŠQ!UId8<Uv2qŀ;ggya4\X- p84j,` m<a52-*xFf Dv+2Ư=BQYSN 9h4BbuقU7034v0V֪UU54V32`JZkMff8 ˙驩rfjPV AiZ*֊FsPkMD@k(dDƅ&KCjۈGX2 xF5yϱ*htX_O su㼈"d PS2PO0 dAB@ Xn[&oADF =Ga}?>Qm# !f%|$rq,6_vfn6ljdb0=2A]q@DssJ7gD$s;R6Rݴ oB $@#&TFvSc;_2ĉi? ? 7yW-XVY㮾c kK 0[C=u0U\8VP!곎mѾ9,orx̏!V]5Hl q"j](9vKߖC :X>Z_ }-6}cw<}fz,I1'_^hUh**m>>?}kNE攖sG~( .܋Dr 5QiúukVߴkA+"MaSB)1y?||720.Fft "|ާW $5<ȡŽa(uocR2r0XW̪(1 °`jfvD#RBPUTrgn[cYUe0+K8W- 1c:XŠ؂43/QQReYe9555===55UjjPvY+5iMJRۍ _̋gZWˆ7bMn]I8mK$Pc׳3A**V6YK$ـ=~E6g.Q.>zX> F4c‚1f8Z@}4pX10!V8*Jc 1qj*ecӜZ' USКvo 3TuhR暫6ylHl/Ttfz #C?8U }ۯ@Ob+Hwv:PX≞7/^wF1s-h3/`.c[[f8ll~̟eYAQeYoQ?+}bMк,T`>?8:; *no.Wg?pY?}ozׇ^aqʕW]}4Q^tO.rs~!>wnE)\F_o\^[VR?O֭l1i̝>n.G>}gl]=vឹ2E,'j|(LnnAQ[Cz̦>Sj]5bwc Wl&+NC׿`:!ۍnnLDy1رcL05?7snܰq*ʚH @T(ʢ(AQ֭+ eY[""Vdt*,=J^_.\7ExӦ?)bvWt"a6BEa]/n; ۬)'Qq(N,rLc QMm\PzBw,TٝFĠ0L刍1o)EEaFyDi}mؤ `U[8.Gugf'ڵw˾Oygs_3;w. ރc9ҮvukD23gɍ X٠Z#3L-pHmNVy0bY!Ypd1yfB+7;?;׼ػpn`f?뫀52f:F.1H#)窮NL!i,ِ nc2鳟+Bo %J|5EK۴l$4Rmn#r,--&+R* ޸y3}?RG~,~Fk*RZ+VjM~=O<wx˻RJVJ+D|+_̣8) z鲜ejPC\ktd3p{wR001__xa7OMF  -p45p{rgwA)iP~aJZ'a8.0+S`ېBc"I Hic09Ff[e֥FϰW"noD8 o1Xj 4Nrv܂-Tg-|uY`ora %yppM<Փ0ՒNQGPpL֋"șZNm$2S$ z<@Uji.@6\nܺ]iIiMZ)PJ+S't7/>;^mQtÍ78d"KNyq'z:Ep <\>a򹯟qףV-ұ/y;V̬Yڦ\zоUrWw-r=,~]v0S{!9^3a5U&Ba]3W]]PE}ζH.R['RWY8y`ȕbfʞOsa8ݢ;H;E\U1cH) q"u[K5+ [(_;}l.bY;76jBU{빃.WBw}k2כ0EMX:"quG D4"s! ~VRحOwŌaeN,StJ[TUdPJwU`>u%D z!ZvDŽ9B @O`cĴ(ߺՎRRi-BQiK܌9+;k0c<;␪YztI^HbcFuAD2f%, DL':l\'|eτ;^Jz6Y=|E22Av+hvCf7\wcRE rBUtZܾ>w5Bw߿|cGiڅ⛶9(~欟]P,Bt?,tYeQ.t_EDG;U&VT(S)3u쁓 o9h<UӃ~ǽ*"DKNyq~h8_ p~-xͣ`gfIW`k֮Y ރKduɦsaq01@5}&@40 R)PAtpTIBQ SU ؾi;)E*lDDDΖLWbf4޾7G#"! "RT$]ɢa0`pČ" 23k-ljS G/^7QH6~0'vv# I߰a,۰&–I(MFc70mZJOo"&0*±ܦRJ!p82fTef0&B p4o3ػp+dfA[s_}&l (vk)1`*C(]@JBXbEASmImK{u!B;,Wdp_ jt=" чi5$Z }6=.lRϷUڝsK2#o{ 7l=_0p饿ڵsWecn;7ulԃ(.K7~>WgBJ=(I0Z=/ͯ/׽}[V*Ls;gCKۘ ڇWF!Qr6S9 m${(WZ6[gǙzEf{U &ʑ$- 5hWnc!n7$&ƱqԠ#~@&3mY''REY|NB/@Hvrpii4RH-]y-4jid%,,-;ݮΙ?[h_Uhz:lvvb}4|̡غիVh_tM7`na4UjyxP(;~~dϔ|ϜW{WYv㦝sjp‹ ~#/9Unؘ( Ar: ┮hI2"IiJүƿa-P>JRZ." >_DDD$g"]J-j*/;rKŔ]-)gYhoJ)"-!KlK٥(PQBl49KYD6kؚ 8]R MMZvoxuœ4ЪWU$4/ɤMiߑ$]{T]TL-JȞ᱕k(hLne H8C\WI-6mj79 (Ow:>1rՑiEo[lv&"c;b WY/QHR1f)Q㫶AmJ%K4-ԡQ`nj\'wI_?-]拟7>,k=YǞsc+W)3Z;,3ٲ?Nz{N<؝7o+ (zo&t۪~p啗[ʹu0{N<䞉N}wwE?w`n-_ρ_o.z&>Za!w3^{!|tw9N߁[{~7n*tџ`jq[j~6m ff? L𩡀THܑ9R 9<}4_?V Y)Ud/MjT oK](( PI,TYB.HkR4BiBRZ wb$7ѐ7b q#zk,3Y26LwLj5DeiČFBwCljffZ)Y&S);$l(#JDچI@0"ȀAؐ _mٷY$@d;;Nu=춥PRlC2cQ۪#"j!L7 {k{Uʴ2K c["ɜ]=vR'#)I*PwJC{!K`и.+;eϦ܇VnY6D=y൯կ;gxt)~?F~RZ!Ӷ]~ދni8׽ ׿5'ƍmذ~M~6mSNg<~~uAQaW\vl7\sН~;x5Wݲ}z7p^-+]{ WOy]_sO>?9'?:3_q?ۻ>_ܞe13j-uϗlܼM{۰y݆͛i^7oyG>qo-3qɄ4Wǭ)lS7Ɛ,s#e 9#;͍nFQ7힐nSmj6x wCmŋ?^wXEhWp;$Aie4WdADE~O;仔![[ZK좨M :[_Gug#c8^oՇ?/ny!_qNx[ް0\FE1Ve2o1(Ѓšx( VE!}o+퓃<%ǿamvLM{Nzѳ_#q`J w=^=/.u;>}̟?ODXz0]i05t}RJ*Z}{w05۹M70\~ŕr𤉬=ٝ rfQII?gl?4DDq%;4Ȍ@ B`kSuj7eپ'Edڴ@ l_`DTH~E܅;3q%%vOv93@90d@l=lg R*`m[ITH4Us6, RO8sF1e&< @,Ĵf1הJ )^K*l:U /6LڎfwƟYEfYɕ|H':xncՠtx]m%QwF-ج{$Ab_۔hfzC<oݸaC'FP(5(, (^heQpN#~i۷m~'o8;7>9"o8ΞOEOFʄg\X fF15V+T9Yc2~qH1dd0l0`/`(fbȀ9}¯8`m8{FB=E]vZvjP >Xf~Ӟ Gכ`nn~o'?~ڵk%}ZԴH }gd ;}d٭QzUPUP5s hwB{A1̚Bϳ`$#UDBKf9֑~\qmX&a'N֯5 UP.$b Ua(l@ K-WRc"Z w0 c} @ G`%G[aH~df}W`( j48rnaaZ`PehjTo"&ʾUT80l*qWN_Dhy6PAY5@o B4z|̭nʯH{4Φ2R̪;![%Yx{\]VȨ]nR5N<ȑ᤼[03 06Ȇ/ew͕yuMa kpp.FD;g #&`8IAu^x8 b7j{ٸR<Y_vVO5e4>~r w!$ZCDCJ5@sU0|=wfVOJ@WpDW|#f泍 5hekdX!KȴqH6䕍Fp̐h ٺ1"s2Ӛ3W:,dSv)5^KԠmJm ;5v;&ȱFgf&vǜ6S2dR d@z1z1O=G~]qK^}Iw{;/렋.䦛n m~5XW/~I3OGG?#~pl?8.>' >1wvƆ ֭]eI9op۶m۵kv8!. lWBAz~}ۯیn N>XDUcmA{K%ZnY2ə "N ;MPW#`U;>3CVEG6%_yiA\L6`BsH'S/!q;'23](Hujn"yg4l#~ظ^9[`q.fS"G#dFHT] 10 P `~\fY*2GAj\ʹܙmu?s)4g(z*RhicUlxo/-s_rc,rG-,;7"C9N=cxy 6eh ?)]gk1=vӓ'?KLsW]u;p65^ݯ|Ggg {"e~ݺi""A +x;i Y/JPV!{giZI#iCI`@Sz&p%3%rNsl&gn9hx1`aoj&!9gBwBʎ,~'Q?}4G̭j)?˅_+cLзH탛n'k/jxgcןDzCl8jWC-){I> s6&'A݇HsՒf*ƗQ_=9 S2S%ܝlq:Ӧ>~76ff6zAPi3MY)v--]DZ EUcK&<1u,aqgt'],5kLKG̹aaO6pьujz_m۾ak)EQ)${gew̾efhWChX=☇]xŗ_~3}޳jrwЈ^f3RZj-YnFF6n2qP YfBYE%1ReXQ d̰k7b@J2D˅A77Q+ !vsV\\L0ĉg%RMmW2@B:ѽTDase~cK_kidž,9}USJ|er>q#DϡRzeܜ`Hf[ЛX{hpw'Dd|Fn#}|.PLF4ZWƿ@% KR|Qo']N-#iø3}QG{-[žt~no%{mټaz"7"- |ʲ(_*36o޴fgFh"A+xϢ1>!o;hròw8L:9p&?*L Dw"* lm2^¯v7E±kL3~2.ᰶẺuz-"IIuG$ϡ[q{&߶@סt6h|@>I*嘙'"_D:A%Miz"9;pdl-⤣a>C$ T Q!@dW/QJ,*ɧ? #Ndlгliw!['>RZ uٛ+ (zŷY%Q8g=A >iے]=leV}OLGBN -,4mnIOc^K&عv9S^ۍLRZ}˕FDӋYn_E\jfÆW=iAfOD4'@,e 2lUa afĶ9!AƑϡ3)"ڑƲgV䰥Q481-G3Be%H7#KnIf3a"dyC 2RX(]ud܌C#"(چoZo ϖkN"/߬,uqlRiyoho|WhnZ{-oG050:r . WkF p[h]cgŇ*[<Pv]LAsOSߖ$kW'A_.!3q与)ML{9q -t΢o yM8ڶYie {\ MM|N Lx&fFM-,p IASo]|1&qdep)B5T*%3ohf`W6/PH0 3I>܊¸uĤX6D>'UL5ʓP<?4@I EEkӇTYxKmիq.Kdh̷wnEK(Q{bI*}=-tM(vlAR>4 l'jB+;C+xp}\> ݺڕLi4s[|*[ύ$mX2-& Ei?jH$2,,R$ey(G5W,Y;8%NŜ :y*gJNG[vy̖ۘDjVwVBaK-6C2,WWdf9y3ObZk ` ];1U)_E  V`ѱFy7Ć" "Po {^4@$R8IZjcHTrVID!D>tFm.$S" @>e/jlomȉT)ph/s";)^ @[F2XZ+ݛ[چO8|n=hx~[\E\T'!Hj!*_A4` IDATIhFM ]U|o`)v_lkoF F9Zc|ġX GJ)a@PJ)MHBMVt\%1Uf hʘUaZ Q5 Th,'f6 ;VdDsB_ cL~{I"N:LoiM[BD(y RomIsiEѢK~ƕ$h"+BӴ EhGjb@~A4$]B12Þo,E'!Έd VS%.qN$MB2;f[r*M?sK`voJg>KGl0 AL7H U!XP*ka3Z%̇gWS!I? |xkIE55_LBoG_ !=6 -ߘѦjk44v# J9yayɻ=\6٭3}4[ tD)ܖ{ 31aZfFHҚNec0+ǔl@%2,_kF[ٲGC`ڣhAT5{aDH`\7F?4Gh  iR (rdrC?&c\|րk!"=Epɉ{AóQ, wmB"z_,5D7\g rǰmu_wWJx[Y!0JLS," oA->!cbǕ0+H7grM6R [1-gی6{-5uթNYQv_Ep2f܋X h[Gƽs*fiKmmeoO]gg‰ i2RbzyN۶ a[ШTeJs6S0G$I (|#>:hצTŴt Yּ S2mCV1U"rZ0dcZ͉l"N1e6WTِtVhnsZ{" nbt&ul.hiRV:S]v}:b%6zH!J0)TRm@31h ts(,#NFOPvR*vY ] s.L `2k:5Z)?h)(mm0MⲤʺ3i֒lw̔ (Dfl%,ʪE"FM6k9d~n1* 7%.*,R’@q ;dMzi(2u=x5-힐u";"gۤf[W= ]!Z{-o$!q1)fd/kܤ EJBxͰD]D!FFvPyf;.i@2;;Wt[T:g—?x!?O ZJE뚆Ѷ7,2\ce" *nq֪j& аaalX#@#1!1T+!LU@(6y"13P%5\iȵY```QA$.͜g6$32X]"(Dւ ̄=*C<`g1ٰ!Pʻ^XJ0"à <%q q3h e0>#f&Y9NeP VڻD F&c~3-b4$e+'@($@mBKHM:6{Avqύط;`Ÿ9W(H?(se7MG>` qZk$cfDd,yETH6lY}(jѫEΎO"#$!m}$f~{>׽[n?^uuk˲s%c̱/||_qzx}j}^B]y{Yjήrfq{Labdf@Ǖ]PDD2V{ 0Ph42 1)sHl*dcW 2` 7cl.Bb  2b BeF6ʌ4*b$T6 aN'a$BIV/%4H` Y/9vʧW-1emk42tѡ8dO "P/ʹw~ 9bf"gu s1mouemO_#ByMU@م1A@Tօ1,ԘHaEܲFY䮟`. wJ L1d"0?DBrT# Bt\ϭmo_5lhd U\[PeLHYQ IIÚwUc[)]7Ur7#li"{LTCElإ{ߐK!130*hT: I6ZNY6\g =~B1 xDg 0bŶI+.+lٶaVP:$%3_AXA$Rn=?{u9N3)a i K` ƗN26f9H#>mld"JGFA(Sl?#RJh,&bhhج^oL5UET~~*3BDRH !"BB"$" Ko)W^{~}ǎM6NOO-{\r/fwq7]mǎ{/"cVԸ.K{{+X+Եxr]E6oG/^苠^9$Ŏ9lꓰ7^6\DGa5Л'Zceq4ܦN}Z(-dl)-4H!w뤧?g$)TlֆEj_l$& E *"J߁?|`2m]-'=R5`2`9lEY/ a&P®kc$%@ sUu!ZcaO r%|JdD05Nk6zrS'l/SCAcl1Dn~[d=:d@m(#BO:O oj6ۍa2tF!'8D2}91M7mS}GOOajik˃]٩̚3ӫ3kάZ=Y5j`f5SL2?033L1/<g~?{ӟc?ssh٫_?¶민rz=E ikJp82, E}O\jFk=^'=5=K`O8#x3XoC4am`oΫ cRˣ癴7sVcr[:F~ pE 'j$TXaBuu-ب66Qg?5̉>n*|;?YHtٌD|UZU2TzԥmU%.v˶hNٯKjX ꤆Nn,3Wu m|S.3&SdK~rG+aԧci]Z,KXGf֭{ٹ院ep8qǶ93?id7EB+MJbAjT]A]:]kFi\,~pQ[Vp/ϫPzn/|i.'lYMUs['O}ukX"Xŏ>Ooq;TzPL[Gkդ=gKM>ne+yST"NpJ3;a~5=ehog<_?Νk֬^n[e]pgkrIxO}BY^.97]h6*.l>ծ2BsyÚ5~ e^xO|g?~]XN o)ہcd[421p %^m8' V"("C@t㤣Ȉ[yC!u)༶Jrn|"M+EVPaisY(g[ܚX+rUݕPg,Iy"1FLaEyOpt y8)u t\4C<IE,o=$+8-)NyKɥ-& f!c}ʬtY(bQj 7KfMIl6ٮ9']ؘi;i.(}KT+LM# vReܥU&'8[Wч3Kcw \r'3[P~՟n[mێw7EQ%m߾}˖-}Àjf*[Y]z?8GrSrƽ:< 8\v`9tt/>Mldy;~}Zw1^5fvo߾y5k,=S_<ǢW%SSR+gWHP,ɿ`@"P~S/Cd+G )!bڈ" |#R1666yΡ8 Qb(3k, u6E2PIqmaN6U:m7"" i.Lvg|əqmjQK:O:zk=EP3g-um@BbI zwTSU\h_.Q&:%F)]D4vq 0 îޛGwcH ñ-wyǾܶ Oy[: ֭[755Ƙo~~7mܴp#7u6oXnEEj=^OOog>/{3r5ׯ ND/~ ]w ^W㣯ѓ7ͳq0j5wľYqo~VӳpŶmQŽwYK2Ɯ~J./̏+?ݲyUV`P";:EQ~6 E"t1֏t掳j XW~&,+1+vn[ 6kƧh# yC#s6 6$zgh斧D j6X.# 6CdDiYU'DcBB@ lZUQ+jcdϴ'L,ըH^ӷ=mܺĜ6C!WL.GShDU ":Hz}Iȏc~޾]:K:cnl4zW\n3w1Q)all/o+aDQx$'^u?c]g͜9e`nns?I[]^ dq줆%NOT!(! AL8su5)$WEVGlq =K!}N-tڂ8A(TQ$e g%rZx3@Mg"]_WY5=k-W~4Zۈ5G2W%4r4(m}{4Sx,B.}UW}3f7>ck[Έ#kͺ-;fako=F8q5NRۈ&ѺC^ŋ/VJn{YxN;422r-|?=7v_o?ޓK <$?gE7=#zyw/~)]}}j]\ꩧ+VXz;Mzz vbK^i4>|x2=r*ŋgٮRt(u=|ꙟQWW]0;u`V †\g%;Dȿռ UDQ$ VRa"B J%;s8y qYO=R(,D:)P"EEML=R*H8,̋2wZOb,ԇ/8\46ft\b 7#h46T#b<'A:5י*LA5"~0mۥW2g>M04puô Qqys$y-6.So_ULBQZIg&"DH66L9hդ y.ʴH^41$mu"Cr8cHQI$bU/҆ݒ%tOĺ;b $uBg`UkQr,1~I{W֖ŏH)jYOkmϬ  IDATg̟ Pn^2+h\h-(59^Xǰ8Vg7n~+JR*J_~w o8֮]~_=ӯ|kOF˭]˿SpSY3ߧZ'GFF{챥K.X\/E<%K_wء4>(HND0婕"o—z^.7BoOp·κoU9=J[DKED|X‰wZ>bSi)JzhҖZ[GʂaWx#I;Fcj cy0] 4TWF'-I.+^m׹%hs5D|ӧUVUk jjv%db%IS>%"Jg^wS']!28K,K%O !T/%WUᮣ̎ feh6ɻA)8lS mT14%ɔ+ PfӲz Yw*+mq*^Lr&i[b*I˗}. T*utts9CgyfŊ###?zۗ.:ڰ~Y3BDD}_ᲟO<笷vuueWvѿo'Kҝwy/]^h4hbr7ez*˖u?eJggR)Z+^~o's ]-_'͙4 . kܯ\CgP:ng@R@líF0"Ys zWhDD:@MCFS&o&D{Miumi"7Yj˙rZeē)K@cO54Q\ HZC< !E`3gF,--Q?Ӆf뫤x8[]:; >͟?]:}vBtttH1sᇯYfڵnw|r3?nel.A>g֦eqW%{tw['\v->_p7/X?ѿϜ1F"Vbʱ0<  @ AFㆅ gSV՛>W{ާxQ',x{Y3B0 _T;O/lMy$Ƌ'mX Jׂs?3]gHx%yX UR9㋱R5.s2HײI֡N;yI4+e6reLڔrwnTlY4Lzb.yŪa"&3mn]FȴP ʕ5/#'^x-[IPP+.i=XDi}7I~d:W{vֵDvj`,LZӦyk}i*VދYY秞?N9s=d^z3ZWGo}kѢEw}7>KtT:::RnO;,W lQHL@HtbdiYh=SϔK/~t>;M:U}F\ ? _D<¨rMEC&YUdQH4awb8d ȞKɝ}wq>+ pL<t´,?&487C(~Hv"ׅЙ@23$΋T\וi5WNd[ ɾ T09̕7U^g;v?V MH)xTJs\l TGN1 N@4A<=u4c.'d]w]fMT[~5kzzzz{{}k{sl7uX=_nMʯ|ɢQ8T˿m9nk=sG\ve;5\/id|3g}bQ~fM~|]g̘U.|'.~Jy`_߅;e==:hI""rYy>|Np1T|!~BuĿ`RɾN̬oLeۣIBtbY 2NU9l+E.+9 UC,,us3Us(109KiU=C5'KFD jvw5(dʂ|7 >P憛`X0m LgeYayEJ0l-x XoCTdM[V\" VCX-&Vd¿C^c\LT&d۩䋫_\#ܴ*h_͎boя~/mݞ~Fvھjzu]y~שs3kr C7w,/nڴ+O|b…/ꪫeW]uՙgsM28_k2E?4Ċއ0}{l_ժZZ*t;Whѣ}{͵ןחJ⥏B$,qؠt#)K]F߱zlYCz<{`_Lע2\ @ tkq1^WkE0R5'#TeVRa)Q=GqwOO]8&!VdNʤyC o9Ic+Ez" 챖o,zrwUGvlо Gx\駽 /0mڴ;cV7p7ww3k)ZB5O'>I>1m;oܗw28=y^sA?yoW=cSfsݳb0<u|7=ufEOwwSt]v]ѱrFX RPqs&Z4Ҝ({_heKD5v!ϩQc.("@aou/QɼD c>3Ǽ`8 >IJR@̬uht9BL 5#"p:7͉3՛c/AG?*ty|Ls0ܐ xTIF֪Y<QT&!D![fY˶ER,:m<>`%("B(bِLX 7W>`0ڋJ|RB! 0A> RYHM,-nn:X)!֯ <=D9ʴF0rZUˢY>F KҬf]mskR*$j{w~/mʔff5Zh]v_mAOYf=&RtQxQYY1"yC?Vɍ͉g䓟8wvzyy޷w^CD]ݝ]]f$~F:)@Ƶ2[ "ՎȁoPlb>F9$E"%BuªQFdږ  eb Q ܛ*=HJ}JD$ya =("J6 !()]@䛖,%"C`yUBT{G>1`&s!" 1^$m2.2ۡ" `FQD=<#('"@!9ċ D?1@DQ"(DDe+I:Q!"; IddSznTI]BAj]bbRISEleJJ%'\(P-ʉx:IlsS1#I` 0%WR(DC;Z&lj)Cr_Mq8n#PC9>5 JF 8D$E!P}2 eJwq< Q "+T3JZ|f1"n!!WPD* }Q֊@HYY ^9(rHByIT R_DZRc)2H Ȳ !4B 8=}jiyW`hyZwh}ų0#li4;y!>Yw\͛/=fϜ=kD20vu|xkqc4L"h4NAb`<474E׮{g~#o?}Ӧuuv~׮]k[̺w3M?[o'>ho9aTkZ&g1 _DDه飹Wa*kqf1YLdp@MɅ!A)L3r1D(=̒)uFa͚!*:O_j۬D ÐG7-^]|UjO=x^@?WfZJ$7:[-IPH HD'>Lf"*aiHAY>Xf)(B>A W+u>AU(H'׏K@d #cJ\$H6 p`HlV[vn Vt IZ[ĄiB?Ibs_~>h4YV kt{Dŀu(r5@(!Pa̛ l}o.uB<~"\&QF jiـ"+A]W@d7btHrSM~l@j I"[69$]aȖRQN)Nk&INFp7u)(~W=R* `46(2-_KKVZ#b\olO-_h)׶0 /i_֬]GD&ZggػC .{yۭ#cc\.jզ$w:oO6mT [=pn?}٧^h4d+~9=]}}}W*z}||e"RTVl\V͚5"(AY*\)W;: V$~1 6H1)1 Aց;wɆlmr6R-d&[8P-q $UYR+amPe*'dQ&Oxa)]J^&S{!-<{NZMi#/+p534y2{=V. 16/2@{eS*\~vإ̣dō*&L@\kw*!eҌbbOdY,o!qڔr)5Z-S3frHrv" !0jvAe*bJfٿx8\*"BVV{˄n,~m|%y$ Ɣ  I3ˌ3ξyL)Ȯ2juVG\f+.UrЍF󔁵13{+ؚZwQLX? +e%NJ!sAj-sʴm@v8\r3'mέX}[]'L%nG98A9$M$LITs4ްZy|50f+EzӀv*U0<>>BbȮ?t)3~6}G^Jyr6qLJo7fJN'Y}!:orPM]s7M.ȚpEEJpoHkJfK2 &TɉulfF^=RAk2wuGiLƊko.!׌GP{ME6}3칻u\m 3[5=[wbNl'#&N(zlȚnZ;"G.6P (KR+27!XĎ㖷: EJ e& JDNPY;&MWqj+V~i9BI&7gr>ZKB0 KRD$;"iW.nՁ&bgx*ԥS@JxY)oāP,DL'/!A4o>Rw~6{0ֳEQF ' B1Z/2c?[W-XHhǫU>$Ρ(:P Wn^kvך=L7ՆO4Iy4 _9:ӀCtjCCd^#@Xe2] 0]?7Ih,pIslE\4?Y)ĚT<<^|\O~4ƊD\iW?հhr٭.Hc.a0l#L!mqV&>!\*=[PMcPlqĩjS1LƼZi)[g-عJN(ZePXR>ɐgss^DoI. hmqII'ޓFY26X#Obzj!c-QB)hI:bQ.CdN?l|"qUpфъV0-%x흳xUaA`e0X$4YāFD RƶV<[= b'_Oʴh\0JN!&Cg2j+H b9Ro3U"6r*\W[m9oh_Zb˺0qEC)kE9E-ԏD헟KD(TqxE" PG*Dd|мۯz0l}[,fk1!#cbXfr(VPN3 ?%VfrͦhvE"M$hh).1~|WbF$[@"[X9gs|E9*:Cx Em>:סGWvEH60` [ߕ)2Mj';ks3-hE`coXBƄh0[/#"! Ҙe4M*Zejsw*j#NOlVdV|Hpl.Bnzڎ2B0 NQEudl,SHY{ik*goBO>>X |AFZX9,BIVhO2G(NE"BrePI6x4o;I~]I`Si_E pO5[ Y} D t~K"eڵO?O.:Ҋi4V.R-S5P!Jj'Kr(Lկe1ɴҹh)7.!?-7bVFs^@d>IL8^]|1v+dM 15<q iJSu-Zar?ZXt-(H &m@ Q`k&NO;%];4EISr+\Nҷ!V .6e!yf܃MVجq;S?*9Xl&m"+k8Z;3#r'!3!r/,`x ִ.D8w`vѴX-]1#"JU,H JGeM}M\ѧnA+= =%p)'^G&ئ |5Ztn-oM iHJz )_7FaKkrMij*G kM kR..k񉃂zJWFj V.Mbۍ|c-" ]q .͘ɫUMtQ1I$EN:{OcD(`̳#Ft# $" @D+p5P`@Ik_`RsaEV`4ToUG=xI] ƃ?CMR1lB&+ [nn yNL+5l@ZU6i6o``'`YGy&jolf)hst7֎ t);u0k5ifjL_22l=QW?#iP]fxz4 $6O F];DE'XH JC5~$IOe&)ΊfӬ_pX.8~\QYnL;QZSsHDSzjƍ(0r)+]JՁ' RJAo 9CoMQ&iמ<39N3PRDcWr%;%ܮ Odcdr2V>41}% QɿCʕm1H-,#Ղd3P$Bc˜|[0 "4D C~Sb/}fFR@j @! @ s a=ħ5Eao,P"2)d/ ad6 {"6h_ӕ%ŌX'4=v(W"ס HB,IK?A-{GkRpiBP9 BD:($:nDrHEB6Fb@A(bJa9$@n~6'@{ -"D% 3dPlF#nA{EKJ"RIZ`|m\)&%hҏɭ5ݟZ@DɄdq$@`L=ROYp6 Hl\eŤ-+p|<[5!cIy*c\PaezI4P@$<5 SZI!^#R+-cEY㩡Y>UHq~ޝF*2ͱE-JQ{߃A/ =4QEQXW6m^;  _/KanڴSvi+K3I*PXMZEeL>bk? )9'Qk+b&8t7S%4FUMGZɃ:(!{L]{Z71{ PnP'fki$7pr[$muYi6,U"A,MM#˗j]>xC$f[ZTʈ+\rgsZc|Ws;쯯jƌZKKOXyơ͝܇vڰO>z0lȯԘꎢWpu:*ٳf6( '21AN =tH =f:Vds6Fa'd?P/| ]_\>w˵Ʃt$ķ%.CpfiY^VŔL gF*iB{?eLlEڊД<qn]J ld*>eD1i٘'L(KHkQ^&AIHr"]CAI&ҁO5%$LgC(*آBty"5'i4̵F%m!D+}1G]avH56V.tޱתU!i)(QxvGǖUzz;::Un_~z[f>pu)a P_ ( M6@;j_w_~h̙3h"'NLzɜG67'q[jp ~T#DIEH#W]G}wXIVB k~m$so5m,d6{EmA† `[+Rp"/#S`bD ZgL7x^LM6WeqN.جɣ_avmZ@(`̐V.L0\Mć0]XɜSH0\|*lRdcm G.2ywTF<Dp4x8v!:3q8=rh4W^EвghÀ?'|+ʕ='Xx;u>xbu g;JGGrD+qƕ˖Ժ>rDzܴyFGGbS{Nc=vtMZv]WxfvGG(a466>6>l창t5[آ\׾?;[B+i`Is7۴U];j;~[NoKdǔ5񞁹V.O_|.B&$Y@ʟh1mr藊ۛGAjLs lY}4XH*#\h᜵ܹTqdf:!(]1vi>7 ZI1AZxլ)K)1Zg`nS^\=̐MoԓhF5f MFkdy!$i&EQzu֮Wqؑ3oGqٽ==ri"xg?w_wئg m9GvaTڷ~p}Z+;-?{I}}g{>zœ@D7nq,^/uxqyk^588PVRǿ G豧̙Xߨka+e:{V=hZ#Y3.[WXqO}3+V~/`P~0}(o~]t UGy x@ y7=?䃚-V:_T!& Ae1["4"+?hG uyP5V}~lkb]3G~^d%bH3KȪ%?eW3'ZxaOe3o|QjXhMWay[*.׀"\$x*kignQl8MLU\*imc'WD?y#ES<]SOJEhvDt?;sO- BEԫqӁöC"d}}JH祗qjaΈ;.I~`zF#5\q'ٚhɶ`f=m,P!GE_Drex. p* rdճ` b62۳EYE-yk5iXJTk57)r[,$۰T)s%fw xߥ'6lE>S#WDEDn9R)aZVy 3A)b c?q%A5ßW^yCʕpaʹtjtgstӊ%߿~Ye7;o=xcW~ڡ7{Q IDATѮZǞ86o1ǼCO?>ԟo?M[~tcI; Cy3CDt/u1>Sׯ_r… `tt\*U*6~)=Aj/_L CE.9Է ǿܠϰ:~8м|";!YB} N>s޸"7\$7+māT{j+g.Gl3wZ׺ 8>l E"P`3?!O##AB!f,'6Q.)s+sDDsÎ{m&&[mr8xZL5}fJ0b2sc3ɽRΊA S`3 U Q^-Dv[Bh6Y# Im%Ǒ߂ʗrTP m_ mEO]g\roϮ>G6=0w7o;6jj#(B3!x'C_h nڴiӦMJT*^f1{Ks*yp5ks4u7$ߌRK@ N99<{c}K&xjӜMzx~bLc-`AX4N{b܉ czE_ ){K c_sw L1FV Xa9fj큭bX1]Z]r\scB\L{vܢ*" EZ 7BxzHHy8"$YP|h 2b%1ڱf"\ә&8 EM^!5{N{׆ ]_x,r9(W*ZZ.Z(%/\@ɺHH(׉B `=== lr=zUkF5QDXV+'‘ё(fװ9;.㯷}w׿dX஍C °L@e˖/_. p|||||< (fLhQK /ox9x>|?#On꼹;P#rA\Һ+uw֫koFc< ;kiFFCQF#Խt!_v7?[r}dCJz30::Z.*Q'N#lٲr<22~zD\. I<{R)b{5 I/=es{Cw>A!x{wʓlad78'ӗ*RcJ*k14yOԈ(:P\8M/O) rg" R(KP_+ ÁPAѣ^-}v+K={Vۋ])>܌UByfBL\t5i5ͷ<\R&F|(@ƃ45ˀa#a~u%rW;tVð־T2QEɸ)Y3˼5*UZ#qr٪/.x25٬n[.TB|]u%(}gn\ˁ=u+͜9C^; <TʥSzw3G1py P + ^k.,W7oml47?j}Yz|pjGs+z՚=vƛn׿{ő=z _~h}Zє7]`>S*-ZTACCC;>{UJs ۯDVNt!i($zVwg]8ChZ~y ╊u&p4W@ДوB+l#HSE!ۦgb$|U[XCO"b3(Գr VUȺ,7VR}̚v7kq=2S"Œ`08̛x^$ܕ8sp8vRO|.x, 8lV gI'7@|igu?s?ܽkZGR. ]!bRO}3^z3gА<zʔvbooowWW70o jh )ԏ{ iIs;oj 0Ttͯ׿ʒJbWMD!Dľ8ȔPB0|% ))E@* (AƱV" "݌2PN NDZFb"BDHT_1Ӏ(_RyG^I Gp%"~_ a+w?RT3@!,VkD$(\@LtfasE0kDD, G@%XjJ.b}"bla IE'PF2#M׼@j!1heb 骣҉),,E,楻..WBDB>Խ; N#VT@;1r8@ 0Cɝ"b3tC^"yR&b:3>>ViQ*T.{n4=de|E9@T*EnY@"H--@l9E@Q[ Klw"x#UiaQHfaBڂ2],J E" $κH!7<(7J$&v }W!h]|_DžB =r\&pM-m.T& U\l2i;8Ӻm‚OZ/IZ"HRl cdoH" џW^~q$)=-"eQ`-JErlZQxg@ ߌg 3 ?s_쩱3N?iΜN2e`gޖ=XvL:KAVV;Z%wwaq TYo\>c4q+X r,AJep䷟xqyٍÕJZvuvvwwuuunS˿7M5=93Yߜ\ÁkaA !hj,^5q/ ''D9W($`:Jri46 %tgw.\FYVּ wyHKf<\IURY2J>PȄ+H I<%̓"zhk Yϟl}+[ _>a$+%5\ϻo<<\ ygqo,-T*u;FRR)KtM_h .|{}))O?[È`;VHiEV{:֔CP\kŷȂ}⢉2l~Ȧ:G#W--ҶIM4ɹ`mYXc͛6z\T-_+j :;峪Jy%\kAغzk| l5 a:Cd8M14!\p/~^";8##fnzH粦HeJ_)/D(f#LyYfVV̄q]rcOV@]D$Z]!f[C]-ÖW b֐]|J(CV F3`2])Cʞd/Kxz>]tAD> Y2gܲsrk!ciCte+"m+ 5tnm]9.zGi}T$GS0]Z݈KoP}W#3;cfH娴q4\Jopnfij-ғkF[$pV$kWDq8e,ybè"dik5I-Ƅ ={CXz Ck'r|%#S:BrY1 U=l@/c` "JThskqseU[-l>`+Mz2!Xڥi9"Um8~L=€1SP~8M7kFL4JWt8GYd0mZ sޚx&i[v^_w%2;*כZHbe\"2TSxttJ0'qQc݄^XBv<3vJ(!&P\^E,2O) Sq/֪)^o(ޏ !TE6zƫEz7?Udi3>1 Z÷) 0 )+IݽID(Xk+{*'ӑ>!*Rjb%Fc+ f}y8FRjZ!Bڹ^E鵸:bD0Q?(;5x%fҺVlð!=/!A!/&@8I0AŒ(z!>%B y*"BxQD Dyr@@9{uWuUu^k㜳ڽ_.IO%n'^,[-ȥ<0}';:x-ȼ\Hmk0;8Nwy'0r%9 >pR,KS't-P ysU(/ Ȝf33Na_E *Dɑ8%eh@LjzZغ~FmhCh09a-M%s KԄ~4u-iQ@+,3$)Io.2T쭊dK&@)">7M n?q1j5ȧTM6CZK)ZBPnaT.K IDATȚ۵0ԣ.] "bB0DL=QP\Z"Eچ6(_$9n[ H0YPSFȦG!R\-eL8o|0UZ5Ol4{ףoZV|cWI:sw[KEޘ~Nǟp܇>tv?qiGlpir1\+$?=׻VaoĐ1~'ݸsYFx1]m(]nx_bZ$mB4>Q>^Řl6཯|kl3fłwH_1lg/:IFyn雷E8QiR*u?Z׍b}M޺GLև} D<@| |L2h&Yb٭b4ѧrM`Ta`#sTʎb{Y.DKeƟyij;::L)f.KbLSfa{A[J2W2o(t^dmO~]}6OfvC=DŽ)> cAQ)dw휬Vh}5  ZTiQTwҶ c,O )r6r( \ի̮ll9 ;]]>1kIs.bNs̠2O mD@?W#qC8><]&%lxN%ι%(40*[(nCa#vG89 AW|4y40aHmZ3\\ƏDL1Qee3pўxm}Nu4>a7(!Wm05Z̖WOLd4`M:kI>b`x ߎZ^ϒQoJUlL("F Lyp PX8bBoDu5Z{  lnJH9@UJ; 0 ]8xVFZ \5Ij`3d$YA!ą̈m3٨wfu-RFaCJ vj1O:@6m  $igtq~JS'7w)!ЄZ0k(lQo H*ޤUl)~wLl쐼\7TXV?`kV7 q@V4vͧd& 'KҖ P~L{h+(! c;2R ̶AD% i5 /X">Sw)Q-uK*ȘD+B ࢵ ʤ;x9i4:hY*M-^b!O㌆fDv8ê^C-ms9@Dޙ˭s(ɀ"U@o8$qoY]V|8t.x<~W_p6ퟅ>Opg/}~{'ɭgK~sb? 'p'"-{5=,  -in FsA5ܐZ` BhLĖ px8ƻ2q%VZ!CgV97mυ!FPh?SS# N#b䒧.wSKdz#X%a#:J^ڹ,ۖu^hE)ׄdгˋTgu^hfD )Au.~Q5ß_A'KA|ړg3|Uxv0A 7sc$9E0D`g y P |; I&O)XF:B P$9sn 7ad8NYg'?D3ΫSF֬V 9"s[ݝJlG;x$DJ21ZV;qfBk.J5Ղw׷)/hZ[*/KSE.J^#uyf^X@ FmK+%=?K"=5;JbT&s]T~FJ(a:mۆv89(ZW^yWr-?w>Om`JpCzpiJ*,YV'Q VqXKTgx\"G?GAioii 1tEuRϨ◖HuqȊSށ͗Deu#+ulaBuEEUd3/To1⇽$7\߈CLlŔ? f7`CG0ה?"\KE ;L"=kTG_<&ZE~䥼 qS;9:_PŊ?0pWdH<-ttC1w[V[/袛o9߿~-W\qYgͦ{>_y&_u>[ o]~"/ }S wޜY\馅 G|RrKPIjg$@\̌cJ@2%͒+H &''p8 /L "8ءJFnЗ4;3FA6 9|̂`~thĦ8MDpp1=/_au[O.*%,X.-y5윫`- Wb9/B?(X]6,}4h GrbvlAj&Q9zuS3#hO~됛kb]37fZt;Pvؖnfi^9{n[oq{ͷ7|ۈO:~8aPIL;J:WC0|oo{x>>Ow--N w‘<9[(8PA 9\09 ߧEeXځ<#0QP<؉dg\ؾ򹝝@P7(.g0HDDႢdA  K76!.V*+A-hMRb%:jHf<_1&#daXcv" !S\2-Th])7Zi kX+sZԍ\4˫9W !LY7iaK{`>Λ:K^i~:Yk$i=ƗV{{yF^G%mfؘTX-shgy@L,{__tE%h]tM7ĽO)G)4':6?Ioyo_s5'x7Bw>g~gOOx3}l۷DrKs늙Y. J(*;skzYeIs6<Ӄs6]ׅj!bk]g"[ 2TPjU ͒ /% vϨM:h3ہ!z׬s,Yp=k ^7IdM0R邛EKS@IBQ><Ɋ@:;"rxHNóKQT٬a5$vT05J3Jr/O.hInyƌ|wV{p$+|W^yA=൓G#w]wu{R_|䆇}>ďpݏ}»%;FĎ8 ^PШ+,G>rТx~ZlBsw&$" +?ٽ*w..8>̨=xj w!ёíT>nuQ_p!p \NH/1^50p"&;C`f|xCV1hfĻj0dw΅kϒ})2lϐFa-U RõL~^E$O&' t!tt݁5m2I,p1U>9QF^p0 ۏ9=29nb LΟoR ؀MQ?^BDy,6;A/(sh=!@7|?Jg^q!߾ExR[oHIs sM pՅA@̒ZkT ['z_ l(y4^{kplhC)J=O'h[Y"\Hvm{H_#.HGymƦ]jK2Ȝ$#k Kγ!L 0!zڊ$fAL *%x)[Y<RnrKԎݶPϔgA2'5$mΫ_pk4Gv4<s_)-K3W}&ѣ̗͐Jy}(QJ(o|U$3[YglU|)9J}6Q{)Wb<-'U3ZMz6TTH″,2"N% xtmrGgfb<{R{-ط۬s`JQ ?INXWC[+#3k]ς72@2\o^P4`k2A//^QRНsck> oÒbPai«J)h힖}EbؗOQTuFQb:^ +fS9^#hֲj:ycTKUe LL 5_o%!=ɝaE^}M eB~m| =Y)io|E6-~:N)XaL35VМ{M/C IZ"voG1kZQP. b" #ԕ$џYoܸm8v&/{Km$ usU~MhɈPnU7ĴPXy\y%BEGIGk FIqA]DsGխf ~Z$@Sy#MiNwy9Kc?׶:!Xihŕcj&a4/HD~n2u=- c^2cI0 1*om1*NR*vٍ澮LgrXKXM=z߾}~cn0kCOx왏 E?C?k˹]GyW\a2袋~TXf&>T¡AzK\1mkCe b0E($[h`ɌZLRg9ra,R1u%3K57:օMEO@7M "YuZ4[06K v|[=>(&ހyAv%YnIg1=CG 򋴢?2UR»a=9rD~YуȅdSm1R5#ڢFF7Im2`;hsUF>>xSv.F|n0k0X&zCV-a>'~Y?#x' cfw9I".,`+9<X9K8e ƒH93q28GHn8Ͷ7I-݃) IDATdNYfmKU>s {YGUX!_A`,; /72+"+)H 0tX}F{ ΀NJЭQnLbZ!bPx%$}ZR|ǡ5~lӡXrlth^i*1!y ƂGC;:[Ah|_ou'`{.%ZE풯i.;V\IJWl*A?-oyMHsAw4޺xEEDV*G]yG G@O,k`{H'DsQÃCKDDta?‚<wag/D ncԋE}@Ev8oO-npC#`1@LI@ߞi6n #pW͟Lq" N+rEpdGuÌêh=4FC0h*!IaAH]B-yF[/ճWƒnp:}E]ds9W\qYgN ?}?>qiGlpi} w(ڕg#2 l\Â[MF؊@1&KW;˭8Y4NWsw G2S|n&8ϛJ|J:LzEj+L C ғkt_Y#F|Ȼ`O\_EEYu]4i`fn-WݤM*D) <>=:;Gj a.x'ehrWKԈM+}]xD xIя}|6O8.0 tnil&n8e8(_>~y,-kxb1Wp|իE-ͩ@Bmi-LJ w"Gxa^ڜ5ŵ1jTUdLZ̒Y3TrghTX*",KGJTo{7S.}(%,BVLmݝM>r' F]9<g$K2vF`@NIZ8M1VZk6f*lI jZɉ(-ٗr6L0rFJ1G)cpa>!0{;-ՎRw_9Ŵ=S>?PW4ΘvJg(#~4 ]Fv{T;~[adK>q4r^;z:AOYX߆>4`m>Λ N׌DXe[‚bkŜy݆-X$~ÍT*N˼ uNV0JNyDnM_W?pgPBwQ*$>6rosdo2rE1rJ; zjbt f^8fpR-k!>OIzݵ;@D0'\7&wt(QtKmb(I!@<">w|cVŘ}z3fj6MkkۖCֵR_ktH \>`4 |`,ucF<6L5vaz(mV]jPL%}8̚0fݚiFR[V,PWRE!Hc-{ʔ! iNbF>M7ƠݿuhɌc M=7FMY 1ƐxMQxBB^*^OajfHq|HuLp]BZ_` !qI%JU +7#6 c떫K%BJ gUĨĜ-ڋMhsxC6%LeL'LƙF84P5(qSEk#]^+%p1c* UB#h8腻wІ6C6%/Gr~Nbmf_<%z4b~g#ɳpipc|f>Baŏ2^,Bg\3f0@x='"@J(2-PnbRKez2}vXdDjX/]Cuꊷ^iF@ %=S<ݧcWfxZL8GDt;.{SA*9nB{gqj:pY1&%'11ӍmB1.[`TҐRȥ) XJ K.dxM:δNG(.۳mۡO~{>?Fd,sA\Hmgu7_v=y޾ >>7}Ʊ/Ks+X &NeZJ:m!?x׀[F!4Zyc}!$Xrj%i9z% i<ݬRW.sTԙ'd}UX03+x}Ydxc/`K $ʛrc-T"hZ5Eh1⧪y`fQ c%wsueSu%P՘v.g=m /(hvoJ5@8`:[ȶ:(׭@hVNФwX@C7B3Wz54 _җ/~ѥ/y^߹}Ov[U %npgi֙p99F|ٱ[ y'~r+E VE-&OU~gZH պ }NY T@"Tjb`pI`3y4wI%j'EC 7{LށShXPSS[vu_-ۏEbyl0\dXy:. r=;m }Jj*($8O–g}tZ/5Z#ޛ]?MD/_~OyЃOysܐIJ<4/Х9{344ujwRuAQRv93)_ ErFL/)9kLKJ3т1ipvMna4 Yj \uVi:r[H4f3Ho[̺&لԉ~K3rI<,Ɯx}$l+X\J 4DȊ2ɡ8"WK2c^K4җW>ȟo׼/uQk_!ʯ{8g_v%qy/?ԧW]q߱MaJ~)F1Z?YG^-^0ȕ"n[ib&o;LPމl,ǾVva_6Jn^&Fi 6*#nr*);obDٵaZ,禎7-*XW Mex/꿾3^:O腗?߸⍥;_ڷ\<u__/ˮk~^:ꕯyO%[^]㏻TxgimwێFń`Zp`wWO3=-~(t8KH^3Xrl)5gR/uSjQ7>5kWWaQRfkAu`P#`+TըZT!Qb'O$܉(#gXQФJd:۫Rv;c/LTx>(hu8hܑEx.qPǽ 2_?4"`v4 k +[x)H?U+HLSnɼLkYp~y"~`W$:~3y{{gCೞ7>Wxk~8ӫg<)'p<<x~|[[?}D`8∭;uG0{pLOs/x~3 y=O9'֡{B+䆨q y#]JK p5- G9o7ΠrmsF.햟c4s{T 6e A:SUzbD+@Eko$bXY>S@ȁ:dΣBxk2V]SØhY!/ "RLPjqF7}k&LA{#G>u>_0܇f__LtRL3ai>.lfCZIGEu5c^n`A3^v5 LT 'x~GtM<=h@ O s{#<뺮;8n_׽u{{?;K9ܿ?ؕ5WUSLp!!8@B&#<!Or"w|IcPC1`TÙ丑(؂fjx4,aWI凢 !_ &nhrך-ThXpt*Q#s.QM.NG~aRq.ӕ[,2kMǩ 9Ec̩8 k`" "<uI"!fPmIHcYX:O8D-e =t \L@<䁠 ƞ'mT(u*h[ҎR}<vSH\ck翁:hGW9:;o|{c=p1>υgcN#syu??wwqc ? {3L$e7 s;Ac\I5} (۾ Rl@ҍP u ӿh)*U2Jzf|N e@ W"E܉K},C(KD]yt?95$ # }2䇽3sG i} @pRXa""_(.<Dԋti|nX%"tޓ[@FvjDrެ E{IR{ hrbm#=?2؆*4b//5ן_}Wsvjv}e/?gӟӟ˯{?_s}_ g?\}0k~ϣ/s<mvqߚ!y :jx dH ?4K$@TZ/-'ѩT#,]$T (4Ӫ%k [MN%%JyxLJأ>RH~rSםF[쌩/T9S{J59BuJX+0ڶc|#do#UwvKq [ttʗnYuz$ .?@Ddc ux kmyUwDX{("${GE[mhv[ m/>{ݏ'#8BD{+_cO~=y?;W^Kq7?x{˯~y%w7WOxؾGWp/OWcgyOѧuܖ6qsg-M [jA`# J?O1^.IZ5cJU#K1r򌺮[.%;0ֹ Z]lA iXG5!|k5v9VlO߷rj9aC'ٗe|ǽF{QјRnL15"fAn 3LHeR2j5Ct*/s. ^3#D`Tb CDV5maeK48ZlPՂn@1BwFmN`(FOͮFIuտE&8',*!Dv(ꎉUhcjmwAuiA[~?|ˏ0]C4o}(`zME.[ɠAFY%XEF˅ږr)gi+/Cj'-ppv'X0N%'Ru23+N$7xnrΖɶjAZ5Ct])gKr3|iim? |g7d],&&Dx%6('"kւC`;;O<kjZK sx:CV2v.=l0 > qW۩%CYĬ{MOY0xCZܧehX dp@Ka USҚCp7^[Aeߡ#CM,Jjbm$UF #*W/c̭s[=G7$"MQ;` bڒZ`4NηOjngZR MY$B7BJX iyrx |bqv 56v~kw[ 6%TT2b IR8{W%!nŢvm'i!mp{T7CBJ2B( ުE+RɞUl;5k3;"޻t-sT'd+(V*[*Ȧ-5R SG7lPr2-dj|Fϊ6>CIH`F͸=[X}؂ch":zSkCļRFmVa\rJ!]-dub![$Bk :2-xDc !p%"[s)Y3<莬TRa옃87}o.r$F3 #ϹlI¥GqK b143Gr)0y}q]8J)tp} -wjlsEsNC ĝ55w]bPLGIUz++"NE&Z-RNT/&1DX}XfN%3_s~V]'ծЃx蕿ɸ-@ǟii/]mQجjP< \j)G[YB"re߹Vx0VȔ20QPݠ!V2/vhHx|i$RhH\lWu̟Z0hk(l g׆qsHL Т>Y/)I#s`Qp[^瞄>K2YE”ZL tja6Cy6ѶgR.SG#mՕٍΉ;\@3ȶ MQ6Hz?%&!;Rm}}m#Zf3k)Hʢ~S.S5VwL+7Ȧs)5E-3ʻؠ@L`.QI}hP*E)01Q0pe _̑m{"HΖRQMZh:U]/IdCI}cw9lO{rc^hLOZ$ 8Q?s?i$Iaʔ 1.~3& ,e:ijR3T ZR*YBt&<%TڤdI(5z.Ibb%̚7 2x%buP*4<[1/RT߯B3uDxѨ^i"2-/-XZXp[fA -mmxXy,Jl66GRiF=IÖ}{]w?w:_^4GD3 Y̰jMJu .~8h3ؠUWԩbbRBĺdv@muMQb"$DCZdZꆈ(Kr ܰUU.] 4`V>7{K21OH6* YD-=H$"t,V'" UC[kg/ a-y* κ.h8 NK*׈0KZ\]4Z6(Nsa-D{[=iW ~i ^pHcvmj7=S7e'[Oʌ=q=:jWZVa=G%/Pʫ΋ oS͐-H€MŮ*J(CĊ AY\yTRxOAV]B5!\[1M|)nr,`wv[ĺoۨU~1/~5ȟ؆֖8N XE@DhăZy6"kX#!X|T`.F80"ܼTO֥-$k$JT 4>>-F/)ԺhmbVl$n5`H0vWH\茇=ȓo@eҙs^*Nє>c?ì4S%ŭRDs; !X )$/Menq[$PJ^4 GS1E21_6lE.,Zj'uWKd!@8nʃK0wMXR)"jw Zm݇?Q ; CT2uKZ|Vs9谰CqfL쨟^3&vPW=% j͘ YZH90)l!)ЌSi0=(RcD[CK\#od鶏ŜWiEGzgޅ}>GGnbNn4a7\Ւَ! hH # 2#CIn։~y mGB:pϐ '^},4x3]aqi 71-P$@9\z '։.+r4 o=QJF}ZB;(CR~>v_b!*B n+F\Bkv"=O L1\L5ƑjIf1mܘic|UXC*\7IWHl>kߣC>[1'.͛mQ0=EDS@ou ~rt%s\:g0`kk-, IH.r?BLL,bk#]LX!|}yJۂPˎsnp{\aNܾ]vv)~2ڷhpd*ECA<)( %I׳,șA$WTǬ'-Q..&e@}@J%"'e0+kDއtD0[[[tqKd; =hB-зMJoC‘뺎[pD' yq1;9R{pǠd9:-C;"GQ)>g[mfD;%h֡K@U<lOo/ZW&l0pZ;;A3Ac 9\#,`](< a5Emp4lhCL+߼ꪫ>_^7Mw}S׿lB| }x{־G} Bb`ըg`f9uFܤg1Λ vm d)ϏipF8>XL8Y '$l#v3֏`}J R)UKSu|"FN & 0. jVIѦ_I"26i [3hM1~+|xqDc""-y~#/-k n3MEK)I $c_Qu[SRFz YM] Җ4 Æ% يSL+J?OCiu(sM;V)Z K<}K^mo^W\z饫y_fFD=ݦ'i T`h0.9߅%9t *Ek((=z wyyeaS7Zk5"W-۵- a mR4i`4ƽ 9â8Ik-2zN'DnwL>5*МuTcI^=H]rMrL4\}4X<s8QV4f;\<pPQU/Y2KݛO h@vS )"ԓFMD8A1SZ0*MWflL׸}ߺsІi%?z7`Kg%/ٴ:m)iL%Oyu4m~gCJ~ jگP0Li֌XA&PEq@ c~ma J3ϕNQcZ(E9yU̚&r˼-溴") 0U΢ %UA鹂Jmj-CH~O?M#=7:Fqq־0^1I%8 3wg&ooNZ(z|7}Cc{ 9y>~6c6kFSLUMƌemuSŨj}y-[om6tw&8p[o}~s9wq~'=CszQ,ۯ 2*61xSGM>YZolL+6DM[+9 wV 8B 9 "Sj|:'˶3Y|3Rr *CD4+ģ%Ú h,l:6JoK 8!A.N0SzQ "מYLЬ{ԯDnjO@DQ$kA@%,Wz:>5\RFSMcksTգ mР/c ?{ u7٭~Ж466Yi0XЈgA$|*#r X4ukuJ%k*sdbQqxȝ%{B ۮ13Yoz%r6|eL#7R.BԖb6BV`V/(׻*ѾqC/auY9UJtgٹtFqmUXb"~%: i64vIq'?~5-ņ)ڜMu(;* iFPXlP,6!7@a HdW2#hp+ӉEdW zdȜ@ƧA "~ã#=YAlJmԆnDk<,襈3,Ԥ"Le+$m]$SW)B^MJAD ~_!oה|8tyȡֳ?Y)WlY4TlHI[!Z&1sm7-O%96Q8A/u: oõ@ "1itQsxکKuiƸ>]V4N3hn δ~|{{kk; ypob̧==[zhh !*nEi:d0ģvns ZO%̉ ̷ mA$:㦰"ctFbn5v2E@Sq  >D2$h ¡kfa+vp`\)Ohl%$LԤ('⍑\`!M_FePO/^dUR;_RXWh CD[3eFZ'^^٤9bEN)pkE 4x,꠨]N>c9+@jBL9밥Je$F]~˶sDAFg"c2Kϧ|83so>cO:餵gtr뮻Zb~MѢGι`ar )핼8Df:bEn.;3혾9QW8E]",s2?E9*.H Y[|OcP<$P[ɖaeĄI&aQ^z?'@@n[_ͅ4i=JR\҆8grL 6[D<\d Ci޲A~E&<邖l'K%敔6،C$(qB(dH୫)Ց# FZB9ކ{\AG9le5)ͥyS,&i tk6Z$B{8Q^t6̋a?V0a!ųJs2[W5klsRICG㖄:ռ1UBYKyר'qۖ-ys^? Oo.9y!¶`" 6R> V WT(BH0i&j,GUG6a^[2m c4Dv**P$y8ӇrFwvyΤ|҈ĮQ XkIgZMݺ!k5D\1Jc}SjNTXwTT-f 2 @_/~)";*@ z+#`Ҽg*BqӌXtRlu&/<&rPԚEכJ5y%\3ڂֳus9xx\' q#|cJ1[ :mSۀ@6_+İ,^^H IDATp-ڤأ~rLYlaə ANs1 $8?3x[ M. l'R59)"nP' uB=ρ P1VCZLR)E. `M`>yjm'qyR W|w*|". ;uRji뜢#L Qyˌ(j7K"7'OP.gB_ZEY mhC+Prqn2_ _|_|.ٵgkkz_|}e޲HJc`q+Heuu#-)D|ˍ]a?IH)mq\}DML:U?ԘagA;QQBIH yxPzěx*b(~؅!k$٧p/9k!야tŎ-c㑷a_5߶O>]%S?ѶT -dc)7ꦩ]^4%1%סnkp(Ո/xT:[}}|y+LЯ`Qq }hT^i\:(Om9䤾v;' w4o[91*#Th,JoQMT4#职W=NZy1-GmP7y ZF eG7^DȐŔI gP

gqߐYEvko1 ׸ 2'lg-bt(q9X&)eׇLy I>-`$&l !'Ld,`Q p./2/ DJ"$^,WJM# e_)gaVm̾Uɜ 6fLJPcD*s0`QhJ\!&yde{I+ԵHA,bPq{e/mU\P>4rz\irkel7g:GVq#K;nzl<  `v*r>G̖m9^`2)]k4DhۛSi(ʵYgx 4f_M{ ұ_Byk2cBdQtPRCu ӳ]Mw_ׯ?d30ƂCqJE<tP3a梴B$"GDz~;= v>JP##ai=eVfIp i>]fŘK"{?)MgxeNJcv)"Fc;1lQmbԉ #\ohlIrÁDeځKaE(_id)ܗxxO4G~P4V;L{EwffwS7 !$BEųwٕOO=T@@EH'N eNfgg7ل$8ߏٙwyDq//*`1Aʫ+3l;_ARMGgsF$F$N3"T@<,"@bQC 9l2͍1`` F޿ߚ$*DNFp'4B`\. pa2LP<.dCpGpsA:AR/Y P@!YWa݋DEݰMB1 ! $ž]0tHKB_dG+ൌlz/7 ~BG)W8 Xh7F?c#'Ƴ a@uѽيIy,6+m" NCg * :V /!t…k.>T)0G8w0)NOPB)ӼC!>+Mw<߃}0GۂfY"ӫ^e+ d3SǣX)| LPo&!_]9(J1RD%+HB=NtH(Oq!!?JuۈІ ,2,>gU!xxK OHH X4Xdhy @/qZ爷T 2ѐXuEFpD`kC5~; *?PMA+,gX_I=c]矉bGzE- O&tQos$?^g@A,|0/w R#ش/B |poF OۅnCoQ|5Btn=-wy)"Ar,>g9[!0K^DY$:ؚ}34`ϙr \ԁgKE!NVy&T*"~,!7g+9u$0$`EM-<79S, ,x$!</:^B^o bs ˋD '"bC(G8( /xsz @Ǡ p+,=)~NySytJ ?`gyF=CZآ, V*Vg0!4g;I`t L1+4ܑ]iZIr:o amwfS`CP ,{>嫼xlb9>"t_pM50(*A|4Ό@|y Ȱy;?p~;26x߸Y9/xϧ, a߽]@]𺿻[@2E)^%,6f V;^AM( >M^ڊGy'ʠ[Ot|+U ]+峃5I'z鹚\D@ *&ny|0F{||19 !)8c(J,XL17<Yм c|lG,wjX$$*|S&Pr’ө|WH7!_p{ ڎɛ>drfI'KĬGY¼ ip>3wN4?8*(:Oc_U(UdTP7:W͏EƆ3MH6clOR'_Z|=ߡ]Y"P3cpy11{Ɠ1Hfc""p,$-6ԃ˨ ̆uP} &ߜ DG1A _#y #0`4MOAi‚~%_AkSF ITy_ݨWBkVaȇ.6!$&E׊h;b{@%i9ow]@&²L&~ /@WT@ &rs/x\v?C?|Vg4: | A놈~dpD%y_,fME/~34?wJM#smdZbH{zr4MS4B1ُ_s8 a8SN|ɴ7eiF&eF@$ͣ@_eܘ%)#C̲,P qS^OnE؛{-|8s gy]Qcb $ʃG˖&֑f4!4gf/aV io ^!|K{k BUi|Qy}yQ3 )"Ug;U;Gߏnޫ4/$>~H,<9D1 \$i4͗ɽ— (PoI}#-ΧOD#[; ſuw\ ( =N?!*z yۋZ WX M孰g Eo)ah~)81cÙz_U&]=x Sļ#;Y10 l: z`{-^ G!1vIs-AFv!k]<'@T gr^{P4#>i? xsأ] #3k$\@|]c4w__+/H}>Hy!#r&iGJ`{@Aw nb_z;?{GH"; m@a$G뎽'?˳r/1F])@%z<c,Ӄ \`B2$.7FSE9vR`)R"Ngq|bIђ~H /: y~pׁm",2w_ b+8h9uw U0U *- 4dpSDp`wgw@zwt! Qjoa zTd_٠Bdl 8ڿ3sU=PޒGdlc]Wl@&A QQ :bc锩oה 0F$SDD$ѻBoiVdz Qwa[BJŵ<*H A z0ް4JDHoOH/^c΢jtA7W:\#],` $H A?$)A K A $tnʆI| ]snw)EM9g=7ՖJ?&:M~OO2%,A $'8u81``꠬PBvE&,"6}"|vfS,< ݔ\҃+,I}w*?  $HПPQ^5muC$#D~.f]. E&itMNЏݲiOkJ M](̰r#"P"$H A ag! A@nվI`z .>}D=[o,v# $H A $HS K A c瞺reOx|4bxQK?,^AT]])"!Xr@+Hr9{,_ڍ:eo{l A +>6F(yEIM朹~GʌdȴtivY,Hk=9@t{.*)MG  $H EB|u^aQ.X!z_#wJn~ R_C7.vvh.D5 @z A $Hw((ExQ<~q̫4vy 7c&_}-'NZf+1z=l2H0'Nh)H}}h[r;Gt57=v{^rw߁ Ä5:tOy/w $H^vog22zS"|3+Ll] NU%oҤ0ek~AN8zkrdZa%,A $8qd2~J9ƄxXO1]].[6r 50r8TW@||P$*a`{i%?عGa9McXJ"6YAHN$JؖEY˜.aϥH A M"~X#0{J}z=))qꔉ/jMm-455jMnRVS['w>Zźw$'RMۆF97.A~D !?ۃEs|Ѵ\\-r}% KD%H AsIIw>yqJx/%$_E#'\s-6n g6Lyzt_np3{I.joo}Kad;v]u좑VJok_$H :9@֡Ecv A $tkm6uRhjj6L_+?c/]a^Yi8Nn, f|*Sl~pg pXB_X $H8KLp6h3P xmv,;1xfP&`hAO!& s!qo":ھ7{vFHX $H ! a!=o@rvA`/FչU+Egkۿ(hnhG=FA"$H A AN :gFohCu2">kMԽjD='dwƷ+` $H ?aԵ6  Lm+` ]F$,A $' Z+'#(sɉ`oj>c[Z\=7#\tc A $Hs8 ap -?LS7} ֹJog|cs~"˨^$u|g]Er $H AB}gB*tH5M/]H A $/p>Q0PH&KG>Ѻo)7Qߙ)q,?8zԋ1H! =ܰ" A $HcgϺ As2, $H A $H !,ܻm fh~ވE)gK1 $H A $H ;fCGy"H7xMZlgC5 $omz ]0C~BO:tre R*zR*TH;Rw@R!5[[}&HŅ{JI@Kз0rD1̺H,KzҗZ<<'W yYǟ\HuH;8R1vUغm8gBJE\JEbJFo+"G!:\ܹ Ꮕ -@֮,(ۍI|zM'N~ˍfʖm;m]Tct: ?ubT y̋X `LYyek]٠BZcXj5X!+8"oبӧS- BҴwJb.Ď=cyZ] K1/W¥b옑rY(7uo6R\*^?’ӏfk\*.2(i !D!ي`,vrNDxR1(w~͕A+O]RRrHз 8 X]B)<1*רXƽkv32&6\xHgcKۨ# QZ?2eJ}}çLT*Mńo۶mz+,ZqSq؉[dYeY2+s`NVz1^.U Z|aҥ`2^S1ovZQ+ {.uJg]`47ҍ~VdB(B4MQXĸۅmwKu{I}!΍?uΝ;Z-Bt* L~ӧW+ žcKnah Q(B=X3vݮ>Uk˭_+߽`F-))ٽ{w7GUTTgLrn;CPŅ8qj 6Ikp\Mv+V,SF&; w#H/70N-I^E)6"a1;'mʔ)+W\a cUr~XSuuL&8 dds{vuO>PO+Ap8Mؙe+~]tyKKDںV|Օ cZNJbO,C//[ǧ&|섄[w#Q]?䢵:eP K;]6$ \XHc:t95u8$wpVVF}z\,JASa CQEQCƞ`SQ*u9΍?,%JFbZlFcEen()wu}}E/}?=j¯7k~YFr{quN[Xf}Lឿu,vEQC'''x.L&#dP .žmLry8~쨤N3ԩ\>S|cN!BFh(@!( 9L az90˸, (4!0 òXז[V3SZZ{tab1pz 8=雞~1#F,;q^{MVK\1n܄իWN:e[ .EEEEEXj))F^ߍʄ?LC﮽+H v|7<=&B_lՇXii^=kMGh]?zjVE `Ox*yuN [[[9"obiǏV9!/{}/Ņ9xȪ5kC|xH }i ΋MۧMܼvښvD$~WF]7>0_~999Y.?o|-y楥d2BzNjZ6m 1VUw/^|1Kt]{ (JBtͷV _׺P%}|pذiSt:&oۗ8pvZkb4JXͰ,bYBUPL0,JE_׬=UvfDq1Jb9S^u7']tD ~U)) X a\N6#ѲP)r_|iܝ^UYYE︥s?qKss\^!+ Q657+ѠUPՂ3N~sͳ.G_~zTN>x󖭓&']7}LyfF: VS[@]}錋U*v?AY-7]vcK84jULMK5ܧfaQ(: 濂1,øN/+'u qK?=fg}RRbn(]7Sh{nd2,KΝ{gdd@aaҥKm6미/2!!!,2 òlEEEVVL0ań7:+-N Hڥq'˪*+eN:\䯝իW@ccZVTdKp0ƕ ]wPQ\.kz;/]6n#:ڰmxL}CڃUZ, ֭TC,ڨM;mŹs{S]5˸V+cY?[j+/~t=Dde8ˏo4ĥsϵ?ko.bYωB #CC^sƥ̞=7^!…hYP0qDZuuu7ntdB4' .9CTBęM, 2k?.{M#`K@ jETwnKJJ{ǖ,Yr"Q!Zu6P(\nWaS%(rowe((ϧOj剉 NL!-5PPv<L4`B 9 yYMδo[?L|FBpnxྻ`ow.UnN7s,8ph61NkЪLfǟ/:]vl_3Fgwa 8_O+:_j{>'ƑW֭4n6La 9HHW&'%{2nooSTmMeA_^O_WT rL.u+/E64=+Y؝ r0 ]f/EbEƠLx:|t\]|@d t- ~*,n*ejG}*ѹiݻZL*9R(dGxjUk~n>ϿT*7 \tL(ɼk޿̺ IMTyKJp_[AYs>OTt,}홶9ytvB> dpbU*;}љ\DUTT:NjUB|||guewREcwe{*.KOɛo[ve&sB|1%\iٷV0_}ݢyêk[d ^~㸱z}EE={rybsdt8NA**Ok5۷B!wg\5Z'ұiXeYX~<Z]QQn R*1_,o/^TUU7ߛL;n"᤺ŶG%Z6C/l}]>f-rqTYFJE{mJT`,3Y]j J+mNLfP7̎UiY'mm9xȆM[ S>8gPllj+rYf2%&$TJnj\(( ( !D#`eLgرkGfR}2Λ6#G+EÜN.\r5 bQs7ʂQX IDATf֍>Lf>5w|5z ^zYW yQKMN^v3glܴ%јWFNw!y+*4^'AH(djZt%sʂӓȱvD%Αc7m:~Dùo6^|4f>bLitrsaBo݌˅)u#DQB2NKѫ-vWm}DHYpYD._yuy4.nKvˍEÆ-alẫ;jJFkԚ'O;05@No0LIFJ0n_~rKHHߧЯ ]# /9990nܸkN6&rܿkkk.\=bf…NS;X=Wd$pLGkkkZZw:4M#FxB_־:9>3MQQ2ilv# (9eu(K͸nW?8кz7$Fu-@IOs7Wn+X,X@ù\.aq\5k~]r%~o?`u789\uSV^U\V˪NS E) )R 0^Arj[t "G(uUU.ر?,鵿b#zՖ=Z+V516UDkkoYۀuKOY/,yjδ HK%!YxK.b͢/1=66cFo!l,;m4&xUX&)$cf3Ge]Lni8A!^ZoOMI=`ۮcb6vySS1M׋ϺRIZj ˲j3gaℱDBLLttI2NhXb4XLtWݠT*hݵG%ᩆ߫ړ4+lox!}(,ȿ?wK~ߺ}Q@bn6233Fܱ{%3{`0~l1 Z[SsKwk@M,zp8fvm#;.br~ѹ7x݆MML[pzn+̃  nbL])i$752v{΋U%;ln++3=>. ='vێ]Cƌ.!!ccb; I0ee32Rű'-Vmii6h4EYm6"hj(mٕ V!wQ2bt70vZGFsp:c%ozmoAϛ2)77cwyCrcӨeHMKMZWSryskk\llTd2˲vӟtyw# <Xj=l ǓFQ0) ^wCr ?䳗]z_|kRt&FcB!6o~hX-;]?v. co8pШ@_^aKW̸‹I,~dEM]yojiiML4b d*Mvg7B[!fr!cl_P… gΜ)<`s>< ɓsܹsz}tt,̳[-eM@L8==\4M&%&&M=67+/eqN9 EKKgU--(DS40,cP.욟sw-"nRd'׿vWVlZˀ%n rs-[yMWrhm3Gj>4[\(t)[V|m 3iv!E]K߯zj1y {U9 i(k`Yvgv.JW]w 9`h~(;`A7wIf<нv}Zۯ?{6KZ+9k[/~A˖tcccNW[{eOE]]˲Znqvb ZMl+?Ezx$v;BK#*SI32u QV+d_hľf1[S[gZqw21@uM'~2 bYnwnRRBV#Gn :|`NW' -1mp萡:]ZV*JUЙСCtw6z䴨#F'NL&Aħzj֬Yn\[[SOƢ.aOX+:,J)„OV Ns82bdddԤ_>666,~ު%fbbd4`2:\N܆v}[kRm{x+y񣲫j\p)hL&"]ZadvF56KJ˲ړO>;Cd2M 9pPHKK;x֭M궂n嫿P噗R 0-{|wjCԍ^ro7ZW )L^qv;搖;8豓=!FKrw98Ov6 , ӈv, BpDIH>twvrR,;s&;;ܩ`@eYr0c:랊VKӪH` z}^D-[ǎ)j5*T@P2b[KFv~p8߈EaVԖp[iDL=Y\v6++IlmhhDAGir.5ճXEu(J%--1Q+Jr|nW{q:]ڞ$=]հdqÇdG+s5.dۜ,"A,¬H_21c d;+ 87ʂ b|>K2*'#dq8,k7 }S/:qKgLͷuySro+q|Aq׃s{ #c7yt AkHm0SzyS5Zoh#j@RTxDc97b7f܈XDǨrZLrzSŧVi4LF2ـ3@0&ī5q' hr\ B!(dٸY|F]*5X*zS=kSL^aME8fe튙6J5 ʀݙt܍nQrTND.+ pn*MNvvM:oʓ 5gsH޵l^)%^m;v> |N)#ؘh~kYmm`+z]^RJKK޻/ju1'bDl cN%-5E&#}n02n㽑PEQQv;EX=65D>J2ubbC{>~oECpppJrRkkۆM[Rz]ϷoO`Z$A2^ZRl(<1qꪇʺz=q廷VkuM1oՊPYDv\Ԣt' ZB ׫ȑ#+yׯ{mhH$%%:ujS|=bh/В x5`*(Jܭ[Aj w'"4IyGQt'w?`Sv͎^Ti=͋9DIl,^ ?nñ̌4 DQyTEw܋ H\lܜ={r}ܽ 8͞BCCSSSe2ЫxcY@>#FxݱjC8ltt)C KʏW`f6sz烐 Z[[;;@)4.JD1aAR0~,n\n7nJi1=, gkN<]V^B 3kFXXZ,-5*+W*[Q557e2@V;"JBP=ivG& Gp CP0Ԣ b(>y\*# BcUxnXvd/yYT䬙tSݳ?%K.Ӆᘌ$~ݹBr0 '~;m6uҫhcXR~ac͓=l6OϿdҿ᧷.wLz ֨E{ .\ؘGKM4!!>N&#*BQDф`mYPCUYkQ$pBQGD0W\h K`.WzmxQKXho1*7D \h\!Ӯd2e=뒳لbn'݄RTes6` X7m#]W7x?WE Rh[PQADS`(]Zf5PVRpػ/_g7B*A Z.>o]Kj1b(d6YE-uUse ( 6C",/nkTʀ|>8o(xHp`&)itZ4ԝ*:xT?"88ߐA\$,?w}3KB-!e?BB%OEuZ7>t1n ja$1X 1:3ݗ/z"oJp(o>~m)ƍڮi%ؗL"L:y=ᑤq,x^sS/cFgtwwI㹾j^Z4*\&m;RQ^L7!/)3O1}7Q"WB.Wŭ(]އ%$$$11$ɞ]KAztRħjؘؘ([#bF%ӠInV%}8/NJ%;~om5IU*9(aDlؘ̈QI#>oFE{`8ϱs误+Z ED@AN "" ͐Hk(O{ry,Q]V+"a kǘ _*$_ziYJդeytvR,`0=,TԎ-,|;V)q}oc|'bro6_BdtAY}E1:*":*BCȑIKn %P"8`*mDBRMuuawu+MI&ߺs.1};%|KPHrnK^1j,5erJ~8"&ុv];+ Hbe[$ 2##\8zٛK#)R8}?X^̚9gBQ*5p0Tp:]R@P ehVV.^_~.G_*JG=5]]>@Ą6 -Fu8a;~䈽ޔSEkuUcF_}ŒC7ڵkךfEm۶~z]e uz~EռE01 ' Yp!Ef6O]hCNpn;?,r3<a@ s=k׮5kP׆a:ϟi&ߔ1c,]>^p"н GEGT`u  Pb(j+///1VNN;dr)Y8f],=XZm8q$8+%&37g:S*pd2YHHppPLuphr5qʉs-G"H9)?7[^E8ˮ0E +Wz充_o''}IajÖ D}Ǥ/+Q23ҒF&x0)~E(h6` 5I$)'Ac(@RIh~]C %tyQwt;ifbbA^ʋVFBTZFQàtIx/2\8^{5l2rrK SP"2\.WÁ"AJ\%_!biAb "Rh4T #'  {a"/*sKŔ)3: KVZ5: # De& (6vY0 o }s{=Ky #wqZEYf)..V*EEE8gff߿?@w7tӞ={ssKxвڹ 4E ʩ'/fG- ӪPccVNd"@ F0xXXHVLDJ.HO("(^#"+<1z?Uu I5؜k"Tl+-(!,%p{nJ_9 8eR_) P 6 1E5d QUr9p9"STu$}EAl'MTP멸Xtm-Z@g0DXfv p_v)(-wH:!,A^P /Q";3aOk^R/  c/+Я~hVFڰT+(J*U3ǎ%`/l+{@T`0V_n^WR[0K0/ ]xhCP90( ( [Δ 8\U4HsRb 0pqa!BrcVID{k^QV4aqPymp PS'ruOCfW/ٲB1șp C+/p"ˡNy<5 XA(hommٺhɞ0ݴȱ{Zv% $bE1@s^ dt =~|7 +3 1yR3/>ŭ헨p1I[a󤉿 q'9?;w}i% 'wj=3˭?G?G_/~\oC'kCBNDepvK/aF)D1,?8nْFgNXff]]!/RZʭ/n.unC8A <A:uuuQQ~oC~[-_7޺uk{{{tt4JnSEP5ठ( ݡ9qK+W|Ǘ/_n4r ImhhHLLE3'gA6!M_W:=F <)19$Z@q` qE)=BO"p G APQDxA`x9kdNL%ݓ:M3XQQQ[+aNxlV^їDIqaD^YO6nvb* ^'XR$0{^x$)s,iQ#qi@i{kV.q1-?եj B}}qQETQXio>sNl!BHH()!,[0 $(d eu*ϧss}W_վ* 2&<޶ ŭpŭPo4&5 M$y_RO*~?QǟΜ7xs'-xT Kޔ.k]hu   b A$ IRZ&L!vW qsNidV@:$@lv_>oe0{>|;ܷo_iiiCCCYYԩSFkj#^~z0wPc OzN2׫k;UZ-<4rD]094,,h0Ň)#Lle1kϾ?q,ҋC399 I: j:[^0 $xXM՜j /_ɟO?<!U~AmB_7%"ooݏt'M5TVE*N f\nZiRxQer9I<L ,FVLl9Z8\N%XnO;&9^O@A:?]yhhh"Rf R `eڿد F/9r$33a믿^qWad$_@q\blWX ڮVxnme&Nd2I|rdfH7RR⛛kjjJ 9]*r9u: @ȑI($*s 8A"Տ: ĉĉW^Q N8&ˎ@jFW 8E IDATxC}a~_6V13սQ|ķ,X%.>\2И?]Y=?|"]Io?O*~?#Q#j/'WEwI꼗?\Lv5x9R|)5JwKUUk}FcNV* f}i rLF1$ 0(Ɓ1NDx#}蔝6{"RVW(AدpڅSX}}bT(Jb6k&W$,=&^(BI1Qٗ9NSp^jisr Pq#]:/q@EjV;dPh$LΊy jfg{g׬yC@aYvԨHALHK+d&4EZSHxAAQndd~>W^ǏUߜ} T9!#~Y\}>Ao07&+xfHJ˞5kS]Ush zOC s/ Al9^{uz.dpV֬5kSqa߆HpEKk햑dPPh`MHs1yoݏ_ pn sFTc7J0W[ZZT*\.&y\. ?9m P'Ȼ7a 3bb\r 4E!r$1x~Cb^^hz}ff#MP[^Pe97g<5>laZqnK+\ dL|aN:0**ꦛn>]{d*׫JPh iiɛ6n7F? }8yrK9bCwJ"ⱧQ6d2J9 m^wv@ 9[63Q# -ϸJeIY% ov>"1gdYѯݭa§"@ϵ-~/:?|ï(K|9^Wټ{llea=}'10GiLDP]y An-2bli BPH*@ɤVe2YY5)D1XY[w SN L&cDD$^e2 I̹sX>H=P5 Z~ڸq… ^^EÉ3pW__nt+((gW ZϥKZj͛6mJiŢ85njs!%uwgeTwؑuZ^#Sa=m.!:BjAC[#8bp$ (` DQA@IA`@25SugjxY= Mq#'\Y=Zi /Tt[74"t ?0(i7 B8)x_g*k8{14DnԾ3 Qɛ)[vs6wE8Q@RzV+Ɇy_DDeD'x(/Ʒ7ZW,|/o--or &@yn70rIE `X$ȁnشo?q6 ) ϝ9c]ıCRf`ػsמeIl'^&U*iwgFzQ1k_ehjlV[GGsNdeY775581vL擏=~+><2:LoЊ26kXZ7Vs)=Vk{[ M?qpHJՓG,YSOyq1*idw># boƿnr>*)$Lz=OGΏQ_pXl姛ӗӧ˧疩MsD#Jܸmӛ;esSGip~+W'^aӖx~hhiiKKM(C_xH~EoݏK3WぅKo"j#71CRՖxLLFdNBڰ82h+mziegYtu TJ^CE;9xG ~!SpS7Chh(kXj m-]ݻ%wٲe^ݯ dJ[o啁jkWǨT)__uʅ)Zb*NQ< P@hk3 AL:T@NB1IpŢ1$9 K2%X(|dn:Nz㻅2k,DZ ]^^~&11!9yw/+V\ ++VCyX)3L*!'-Eߡ3dA`{I1"̙jI2شK5u Z6D)­ð[oEMҍA ~xQҚ=ͳ>J*@/}| 9:2h;3%o3)%h7}~~rBR8~?y.!_*%qav=ȑ#SSSڃ n[s7VQ_ _"Je2I QA`y%d*).=#?=tީh;ؓfe&}g@{iS&IvCMj{.m?|k2aPhwZZ!!1iuu rexfسݏgi;|t+NliT/4BϚ6DxFF$m>|4Ꝼ|d`qi"R!|SᩧJJ>^ڏ U5I y8ӯ*^9SS6T*%]6-JL]{CէxNm(SJM0xA1%6,,TVU>Q?o+Xh'[ėf7#:X(@[%XD#QKO?֥3>]QkG"K:b9)+^Kow`5l JTs-rF -A*$*aFIAɦՖ8!Gދō92jl&Ϛ;''o-X1v\ ڄ'&V7鲠MUΈh۱c_CCcTTd#U_X=E$|h/ΞCbҲ?KoЉ@p: z@O\_vs.1.{LGG{s@z ;&ogHW]ń* FW W(}͟}/G.ӕg-\{O[ Eqp\&a\Y3KTz`m[[[{sKhGK T/ vE|{meHZOY7P(ׅm-~TZOy|Wr/_=wW?nf2O@v/p:!3#-6ЦeTRbGg'JN+P%(8wAIy$[{K޵F Yu/k_\ꉓzkY ?5jM17xd.Žw))E$>>.-5DrƵuUU5cd565<n02P!A>F@]]Uٱ#Ug*1\/WμdjZj]Wb}2`ޜ[ݻ䃷?^ݤ)$e^t@mkNgS8رή0} ]$IfzgJQ7lڼ}.i6'Nȝiiٽgu^UPxvtȞ 8͎\!G1ﺨ<~#upErPi.>32˿E{TTrƍ뛹XRԉ QmmmA&# dFQDNRFu=5,˲,' }_"<#/Y/A*>\W646 ` 2ysצZv `8VV~\&s)#MFcRb3F}#Oo ~^uzeSzz~|̕~ʌ^3MG K:}vQ^*2NǩC5h#b6<*:u5F%]z7nZ,f^r ב$?ܽ x ?l4L3O92N,9Z*6o.fcZj I*2@P܍A_\d*ҷC| 9tlEۤ@ՙdʪT_v%vCLxt4f$IMځ:?ƳToJ_{vn(@myw"O14ϟ?yӹ}s9tPxxxppp^^^HHHssC:::z~W\qEnn$ r̙!̀\V.>{[""e$)6lشkNKҶ釭N+N6!aNjY,!,+ >T7ugE?<ڣWGt[*MǛ+>jyn|?n瞿?|)O!BQ_EqY^yڻ(ffwlI$$@QQOO=S>|&HZIuvgdn6O$3sܹsB!ͷ[IKM~Z|_u1`Qy ĺ H20=E74:g,f `.101 khhl(r8 p܌'zg?~:m xc{=W,}KNJ0ͫ~XAˎ=Ϙ6tH]}{}Eřʰq a(n2[hijr8 )X=YZ?cogq >.6$8x2sBCb]G~BDFZJUq}³fyl[OnS+8>I~XWsvDNfJrRbB7zt P~k7/w$կYd{]*(ܕ%kj)z]7ͨkϾ4Hrh_zD"^|pqRBX"ihh(9vtpaȐP\FQ&c3C3ITwXm6Pp8X{/#<Pa so}+aGQ=ܝq2ȏ(< g*_%0{_y}I?胈eVl|lo<*odmm33((ZKdzgC5ѩHB,*;|H V4YA{}/CģG~d٩/3~hyu10?e&^"ǏQ*ZNi$ɯo(INɅr%\8I1\ުSo|̝IIF:NۤaGgf8~LlL4 ˅А`+W9cMӧ@Hp˲+_})ӋFp%TNtBz;L,Ŋ/0 B (X,6n4ݛTV O<.A-n<=쉓e1 ~=~h4f?zxСrt8q[.zG7oT^~fٛfeY_%ߵD‡!t)7mss?m1. $t3jppP3㎃Бs[WRjtF:qg0_~>6:j)˲:m-7vϮz݆So6u2Zvڔj9ٙW3[,U:TШg 񈰠sg+mp4, 4F͍U0$C;l6FTTTGp=ML㺭\i2VkPm]A2 hlV;|I% M Bc0s.Cv{]QL&)""<';'FJ|> x_Ͽ9߬oEX ockK8VJ(m|@ssͧmF쨭+2uTP%bZ (+?hp/e|sos:fُ?;o D\G8~˖ x$GD\!q{}qjMK.2TYԬanDTdЎvsmyuVZQchiQ11wj[9CI;I`fdϺ@VЇX*.]`…!==]*>c}]RRfd2T?SNuuфZۛ!>1vR+*.2nVp0&3Tc Z ѫ؆?0PĜGk^V㏢依u߸jc _9v:O `0m}*~ɒd2P(MpҊ۷ h.))9X;..I$40lUUGfϞ-6l\ZZ6bDvEԘ&4s'PP  ,d~\[ѻo.H.f/ B9{룏>ԣvɽ>YGf/xvh4  -!΄ ũ- i_9]X+[k<0fף>{zʝ3u'"l(BQ.qAG6f $I R@Ҵ'pWvVS[o!kUc}[oB(-%7J(2vtɈN͟1u/ef&'dp݋u%))u'zx 9WR)95%mb"@8% E H<,#ƒ 0EuttX,Va`+;R] q4MMFc{?/H%Uh4hv;%4KJ/e$b{luEA2{'e+>fvɸhN! qot=?}<3w|sI}?\s~%a"nRyrG:ud6ڲҟ1u_[Sxǵz_W`XݛixdBP[[T*XE zSZUYU(eY>EɅ8ZtJa8,|lj AF)xڕ^RTWװ,H#P"d I;mVw*+q#}QptŧKUUp$IP2u{ .g 0vǯXo~_q w~JJkOU6imhwKC *iwmcy eq4;O+ҺV%)!^ pwhq2_;='{os+\mlLsՒg!@h"fzgٛ[ZB@@\iRėnM!5gbl-B0РW*<1y$d648.x;aj.Ou p vlQlٲÇfTHę3g^~^{ɓ/RTT"(((ĉ޹.z ~m|#<"H@(666>}*+-Mׯ_>111,,lݺuЭqDH$䓷$'񲺺SB `@5͙23G>pr1k;`0, >8Ym°-mN SgboDJcE\.߿occdN6,׿޿dևg !4ڭt{;oKRDP( \.'It2mfswHKK4IgΜ 1Y~x̘ܴ4.oHH_Ye)tmܸvCA1pa1ܕ7;rFN=X) G}A{:NZm|ןPX>u;u^hhH$6MҚ4?2qw8Bi݁UT6bPeFn}oǴC;<#zxO(I74ͿkaXL𢢒HTb^Κi/FzZA|?pf:{\\\HHHHȃ>`v; ;3=7mv0qK>=wyv9^_-@ٺ>^rO^K 6T;$H6쏓5I{bHt:y~X`q0D,ldgmH`N(2'yby={kώ/HTiy<a&u{;8-ysѵ2Xd$b1Ia&_3kִܸ!Ch4 :y>wǝagYC3NM-͍/Ŕ\!|J-'4^O^OHRǥR)EQ!am[n]a9)BeFs[/~Ot:\.HrX,r^Yx9}w2T,m Cq֩ NCB yM||D!skAHD%G]qO ל(@:LJ=v_4P(t:vB\4)HNNieYm+Uok*ҲS<#F|@PY]TWWR͔h똋LDZX\ 3,˲%fL)BV\'Fh=97'NƸW^k?g͜OfOwڛ@//d23d2Xމ9lx7qA,)*~՚YӥRiF B;Emy;S LE&ql68q"88bN'8h&;PR .+>scZxBa6}ʍ nl2nK|\B!wNW!dVCCP*88z*:vlVgq_MQb-ʒs{s6l(g\ʍ66tw!nN0Y׬7I uu׬OKMVU] {Brl͹ƑMЉUd":::--(ŋbAÇivηDOʧ}.X&;Z(458zۜYRt䈜{Tʡ 'K܉D=gw$ ۷_.wPZ[T^`$"='S+&e4}CG-7;S.wܺG߬9yypjʪʰ s55p2ocJ/ҨUٙ]C(j4gXa^KLko\᧔DJdrٹsuMƬ4MD~ IDATNhlj[B@5774ŰWs*瞒/c'N"qCCSsskrRAz]CQ dR06HA ,VrJI>^ȁBH ՎR*bhMZ$ٷt{5pf4 9$DfY(xC`<ڂj6yzUŎff/o½(4PY|,QfpzV2YlB_@lm-Ak}R5v#mNȤRX3 ee[?܂g_zxM;~Dv᭥}80\_Z;vM>}ԩr>@lݺ`81Z~B̀O?T&q 7KT* e9bxb',YKqDrvHHHd)##bp L3u$cv{C_ wt[_/A|*.!D" Fٹs]O,HӅ LFGK+BEEezrKvh/|~9d7IP~`l29ίW48={w~G{#P$IsOloL?2q}Niii~\.wsW9ǝK 9~cz3U:mK/<3~^M3E_ wyZHO8~AI646|I:4AA8+ZzؑtJm ]{*MJML9Yz,.6%kjj_6HwU9Y3N)=-O?"pm+W hFȾ;/ތwŪR*R SO[OMNXvmeeeIIu}C .^OO2YT]m; ȹ&M0,"<,7']{JCȫ B`Y::ML*=ܣ^{-?oo_m*Urrg/LɚON?&ç kg̞[XX2 mv6Y`{zUTdg9ϭk)*-5ߝsLHkQss2Ns6]'%tҋݯi u F)0al3v IfNJJ8~fŢؘ{j0q0HT*!p8L&Bm eYD^9pxa{o#odvVI6o(<@28FѨ;::HanC!1q~o'+7,\>}ۆ_VwkNTe㪍뙽˚IwATJE&9!Kxlho7%xM eg/~'3]y{䓏߿y 3d )))IIIR-r8~+,,+/3{zZJVY΢?DE̟7ϔ6;Uf+0>l27 '{zO^^֩gN[LcG]]8xHA~› 4 A_@L"ʝreqrq-?,{S9#3{{W.]}KՅ}Hwgz\)/iDbZSNVnmniknl0N'Ry\6IU\] s ^x{h}QEen(ww`섄8^Pei& -+FAoX|Dž>qM.-t2L`3 u~R;~_K{AǏg Tz_q\Ӎ1ϊ\ z]-B!ɸB`uKRڵn5A<$IBAQ.%\ nye*O`"ںzxjG^/ ?k}DvĄI&bn+59\Eeٶ*?JLv:I>T*eyE!TXTa0<*"rXx͹s|?pHLY<`gRBbi 䓗ŵ\L, y#bn&O-9t3Y_}pll 6U^~nX픃,JupN1u=@Baxؐg l__o/@;/9zk {&0$1XK Ȉp,=xILr:,; ub0kO Psh.jv~ W*} 'pxb8 Jr9\.4֞H+?2?ߵ5)::Z~mޛ.VucG [` .;=a0$4dHhe0`]2L&aG4+뗋kxuOޘT0ٺU_}u*Vl}p]):Ys%\A\puP7z:JsžkdCtAQ--@R87fb![Rן՛rMpzM90PxEϦk|8Ȥjپ~q~:gvbC"SHl LFZJFZʀ ` 8:C\գ=s]&&'z/\w]jh''gY^} 48}z׫?Ukˁ- 1ˍȈ 79 Į="#`+A. rq<2^ir. ͨ7A\2w3A `ɧ_\23PB|,`W"#8`+A. rqzئ؄KЯ:cA^m1hY τV2Q3A b 1A bçKdg?Q m 1A b 1A\J&@Qq4q1iN'VfIENDB`stopmotion-0.8.0/manual/screenshots/mixing.png000066400000000000000000003143331234321124500215540ustar00rootroot00000000000000PNG  IHDR>] pHYs   IDATxiWu.|znRkly-c03$7!!<&~ IB )$ 6eI%knIC^I6COT~k~Jӈ#F0 h>Ĉ#3vbĈYT1^8?>4z824VT* ?,jT ٽ{jzYzX-bV=zy*vOJ᾽{&WJ cĈqkףg._tQK4cm89>(- =)?ȑr{tӅZ02v^ϥ|}{z z\uRo:=[^u d:Un%\%jr`A/]s[-XX 4;=;[hX]:20?#ƙ ulܹ[Kg'#WXh}Sڿ?><`0ܾS.%Uz`S۪]a3\O]J3ǻ=gj0;~l/|EOz 8d g ޳w?-1Iň̌?r˗FFF\{5矿O266 ;]8ͥRw!?arO}qӦ _Bx͟{Ի#FxhD7T̍FCD!JzN{od? -[ j~<H{_Ի#Fx*F1^P1HBQ%WBT(2UTAdDSUqH?}m3pc"熢v\k~7Sk6oDƐPUj6݇F  "ABQLC$Β^Z"R%R1 @0. WÆ "6BCD PǷ~n [7Ce)*( ̡h;…A|؅Eȹ#&UĿ|C.?z{.V@ X^F_;H(yM.~*AMhURU3+)=P0&K>7vo팶y&I#ߵqL:I'^`zh?O~c?x3f >|x>sEOȊȉVCkp>% R-p%R3v"8k5c(QƂ JV 03Ԋܗoz|se!LBI#BH专Qu*&+b~S\9){Ϟ_x_39hWۮ᷾SX\~~37_oQDoA_Oʏ ';7=R=nfrl+#9Opq(UwEs8׏HR( C/ ַ̜:WMHP g9P!ZjXU[12zSUӋMd3 m+^z.<]Tv緿=>>oevF1?65$;kё0- 4Jt>+ %Q"0ٱGgi%%cц /H5mCD{ࡠl9 zf*HA.TTTUb*p ǔP Qƅ"k F+},Fӆ?];?gmf;gtس_`E[uyU7a0K)| i/6zp!&C0.%TE`XX9IPq.h TNyh`35r{AqcU{TG쬗xȧs|@.'0 *.b.0(S1N3N)iԛfy? 5?ߛ->>G>_oyMa[,U]_r˗z'V|XnfR#ЅxzR-&TK;"wΕr\ lX s=R֡A5LJ^^֥qBU3)>زEu}i/KggK0SЎ.&jq9}X0s=:2Rݔ\Vjt-4 f,1N+NfJ2xult&[/Ї>яMo_ zxb+q׷ $_շMo|S6=WDKsRڐWP"ِ=Po1; *T%4LL-SX T ȹR.ܮpYsr ⋼45xdzL \ʼnvwOJ:%2cBC]DDV亣*VyLuX,(iT>o8ӭg?~s5gA).Lw vOm.d1f49`Cs`}Dg׬fFgD>X*7^:ԝDjI  k-3[v%Sv_mC J![CD cr U,Qi:=ٱuM̔dW4 5m0>RRӝ^G]y6jl qdl8[zqg8TW%"̤P TO g'>vM֜֟K.\t-O{<4wux}y3/U˩'p6:2hsX%Y gݶ@<],Yw=w_tyd=}=ԗo7^zfa}*}ݷ;y+0, -o|d_䚵Q-޾gҎ|'˹O 8`pPox]pv~xϽ5{ْvs]vQ)}}_޺ȁuW܎jRBM4 Ih4_\0j-^rh.K:/YK3AB)Kְ*[F^s%D7˩Mk<ԕF*eɷVV1˂@*Q[^~5^GҺ$z*P/aCRI"tHP֟șQ\MUD-`捿.ԍ2gjqv'?SGaRnL ni=n[Uvڵ/F _rL)%hW }H;i)q+RyЎ% $0@)ԥ\)j\.٣W_rn*Da\']\0h:ѝJZw+`!6Y@$n"%*|_ӎSg0fɤa5Dnɥ!Hn" Q+֪ %QkR;O=]=dŒ'J`jƾcIJS3~$s1lԿ 0T "JgG\J'Ĥ" bp4pRSeKxa/ lYw% <6,9L&zKD"OLL>ճ йRH$>v 0* v1G88UJ%OxHM+@u`0TYY-^SDIA}$,YɆF=8{ թ+^sϳ %IoNP8ѷdfj$b7ә|-GLwO?NuW+tZh-^Т(U+c#nTfs㒎eض zit@LGknW]>vlUG%uJp"1?gSo|"R!%(G/S[,+bb%ܒ:[)1<+Ae [>7[^U-HqԣRTTGЬ|d"=56Ĝ&Z (4l6T]ߗfӥqqnB^$vx +'&[ ?ew[׿fP [V}dZdUV)fyba}NRHЀ]n%O`" 1 Ng E 8k%%*h(HJR gy@Fgilrt;n܎)[aշjUzsPZc<TB44#gSi?̥ۗԆrVX ZVZm6OS_gl:gQ::qV$XbՂYҮ}a:VKdP ED%׳\tBQGyA g$c8]8U26F@f[+ZJے  k4~_'~1|z 5"6ʵb G0l@A(-VgF5G?`?z+ׯ MM>'=|8ҩgzhk*Ҵa*X1jI&iVEZB vL^DJ0ozk|U> kh\nW<4Y-""r ^$"jEZ%4j&%Ihxjt؇?z8'|9'B6K`(P[SDž$a WQjӤjg na3pk@0|y֭Ah(%q*ed2c j Tɥ;eA ЀlED VZD UٙXo*VՀjM k 3H^}Nެ=gn1}K+IUۋ]X5Z5LD0̌3lO-]{wַn{/%>MozQQ3scC颜J&B%*ֆaڣCa XZ+Z^G~PKm jGe;(XL&&Ī` LeLOM@7]UKQy-A!f6;5+!%] <<7[Yjv,7l^o!8< udE$\U"+VG ,K%SJn:}o|ݵ]wZ__/^W^t钟 z2Rn8|r` KW^h']XBqhEKqkJH~?j f%4"(}us(%o*%"an%D]ݑY)]PU UH&R~aHC(3Y'V;}1N7N=Ɛ0% ERoc3DRw`GPr"01#|ֶN rk^+G?zk_޽{_}~&o߯VHwG^Aͥ"X Vl\V3 (Y lgOfй. !H/4 g#=rfAve\6m76]= Adk "ߵay>Z!U\OVT,tQkF#BnwYS>QP+NS*~c8=8U"&neR:DCFbr :W`&N>gdN]wuulv>~y~o|8!)KBL)Gz lt"It1I'#6lؑ}C73T6u&o#](a`0d lJh#3f==b_ƮނjT %@K͠:TӋS)f֕I^nGλMg_pQ`- 5Gl^聝J}Ӛb)NN7x}ailtʐMuBPXصzbP(&z-hb4759:2W@R#[_^2O3B6l&_ rB~?~* sSzVظuϽ& !iH:;Z^o6`pXyõF9'ꚝ+G&aÞ}J6]yFE4^4)yVeW1'|AɼgaK,Tldl@P}q[To(M~Raevffݏ[M$Ry}/&$('W*lx Qje5&NNMP&ߝ=vp0L}?ASK ^J䗮(NS.!#Ç[yRn2D˜/66µ/zbxpoQ&g2l@gSSܣ'}3qنLW-?cغtYB3>ؠg2k?'$`@`($X:B6J&?&KKfF2l*tkRVd\l6*bmШ1p ͦ0iĐ_ob N/_<{0yɔg٦q;ۤҙfCsDI$.7\|kG{?w;$ӹd"f'/_w+&z"fS[6}ApDt7ڍ/PV5D,UUV4.3f\BYđa5ozۅfЯ֖ZeH0yukzS~+75y+z 1N'N9nڐU򅈫T`rpʢLhUtEHD5~׮^LhN`С=Wp/ےȰD7$9ln*rO8a0YQyު9!\^=ҩ X&ϰIhcY Cv6lZ;vxKN|~7&|LD2Fz=Bq{I'j^);7_K^\ώW"a3qh&bMSֆ>HZQf΅V¨*\ tsQuUh@Ja<=2l4HdEƷxQ~24Mgc:ďzj*ﻕN3Lg6׹s/z' Mrt%:T1::XI~"eTd*33=ZHflv_UG=UlTLan:hT$ 2+6_>۝=DYT-25٨ O')5R׼FlT$J%;r9f_- @$a* 7tm(o7TT( \XϹrS" L%)/J$ j|Y11[Tyj 9xܖy#\KIPRUQR m3"edhFh]DBPˬBNO%m-uF# >x^2׻p Lʬ泥*5|O%_+F]aQr^kٝW\&|KMð0,G#˥2~*\T)㼋8x d%(AVuPT)X@ X\h;e=#0PWj=B28DJJNHHKT](Ϫ=d)DѪaJ~ f-NwvI}1bx6g(dT(1#J3.nST2j'@]VWuif-]/LM忞rpfXJi~L,A!RA]*F4s/NSJOMP_oRv_ fF\8a%E2StVh4E&4ɩ'(gW/\[(>%.XέiVM)g)WjZB2 QGGP(4)˖-@7kW_N!TyK3_i=F? j67V}}W_}Iax`\gDMRw h !fOF__1<1"6NLD{g>~_ڗm?ȿ?OhO֭[{⑈הx2JR.Vfj 3F3; -ox 7oz2O]z%/I)VO⩘b<2L"[LRdkZ& FGGI1b_Rg`U]hI[x*N?i= kcĈqZA>{*VޞCNڮ|XНw~ącĈZ1b`AYd:::NDB\D0 ǧhffVkѱc֊Ke$FIDZff D499lD422\. glnܤkZUZMJsQsccJٜ|Sslk^4W,KJ9k377;v5WNjn967MDӧ\rBsZ͕)ѳƓ?u1EID %y OADV<ٷ^͹g'mw睹9Kh=1`&*6 qPQb 0yfpwjAlBf#֊13[""fVQ<Ī23jhaf"j5][ 3+=F0lTՊm8,TZ!"fJ/)Dz ڒyiQa8Dp\2H̤ږr߹".3v~F*Q)AEgrnoxT(ďCa.!]k"N뮘+D檒+o&]U[Wu#ۊob4־IN6ZnkmxYhOUcP;=3" wr%]\y6bv(.+T]=UF.2t6^O#ctّH&+XeDyFDD(a}Uk{7'ckxۮ hzg&Q"DDB"VD lj%ffrcѫ(`Q+5DHNWS(٨"تUu'wNJZwB;Rw"i-"*}T#:42LD&$[Ȋض`ZM:|ZQ#SUmU5HDq!ud ,h]肷 ]wmڠyjRDcoQueAT­;ˮjYK^qLIt)UxFUqkI"S ;Qw}@ɝA4LD/ElMr yfgfGGF-ZOY6J~񁁕?u玝[/M#tg@a CUĪV:\D GR rG@ WcU"*"0-1`Q%DFAld|;u"zʼ4H9zG80LN uӏ8U!7skČ"3[KOczµ~ l(ǭʑiw%egP]G4#{(2Aa3NiWo L4hgLQD<[" 4̢q sкQk]vgZ%bk݂臶 !wζ.Z06g`QasGU[GlD"J2@+y:gU*מHrt#WD@M7S,{JX/K̽}KOFZ-E<_Z+ư1FD$ AW!&3 +ƘD@yT ylEy R`L)PfvrYD~{""E4 D0AL V5іh(4rH 3#C&;"tpfQD4OE9.{dNalqƉ:GV1H)#4ꐺ "v(:W6(Wql~,y#h.<ǭu5֖@Ŧ%9-?mCb;o?FMZ'9!n'IUjYJXTD K-׿AOO?{u&詴^*i0Q Bϥ >fՊC׮gjez}@QhP2bg"( X g {@EG4!y11afB*lerPPQg<6l Ly1l+ZE"3mo êX0܁(ѲUmȮT qΎMoZ+UfEQSny燢hӶcBLD"2ubVű<Ydډ$鮕#L"vUw~႘nDD:Lh'[cXD}bEDBC1+s}'sS,l1\r gRU3%S{TDJ+ZJ1\"s&~("dQ ҅SQTwBK)HPqQT +*d9U_8B*` bIM i_4&@Heu"]hLt{5G!)dx_UD/x6Tx4?㬡d؝WgO%ƚD=?8S6ptг0CzLgK IDAT+D7 3PW+% R|X;^P0+ M}lAD&0TKKK;=>A\Rs@<$O666w期zO}SDTJY\\|g,b#w~d&`FQ8*rm\Uug I.*Edf2IEUsK)l_rΥtuLg*ǒZ`P)iJ[ v@%QZ\{QPn6뒪ΒX}^Y\v 4θc`DU.H gX̒~6$̂xJ< ,K UUnP~= ÒV"DA/V^jPU_-ģ]iSh0זr_"¬S}t7|۷^8;{w}\}<уO@T{,l/*y>9qߋl =iuc>&yL& k8,)2NnXFA~*nhߞ~W듿;93{U,q6e݈(:0!+E!p܋1ΰ 6qFha# 98_MiiRzNWjƕ<: JVa*&CBG0nD"L*Pd4&3HYP-ǠPweU;W P߀o`1/U|?.sjiǓ^<_zo7R:|S Gc=t҅+/=UnlH?>:z4g<SwbqN>U͚d нTL| M];`ƿ@ zT!ZZY%r۲*uPMr},EMj["EП"J!(oo&9 "l GD1!EEfv/Fm5yyg w'ѝOUj@U l'> wlVSnn~1^nQq;:lh_^yktpfKa}}?w7ᄚvf2[_Ig|)H|_ `ꡬ qpd\ßݿ:+o木+w9uϽ}0J(%HðIZP%_NM"%AaA(OZoԣ o'PESj4DŘWo=}Fz-i[*tv?~WWT&qL)J1h"} @Z4Z('KHEDQv^dŦHҵd;D?TCOau Uv f[w8Z:M{pQ֋Wz:;) E.}t0TPS*P%W&e 6G*$]q:xů@޶W{~ҁ,S!ҁգFj&wD)BO!q*J#P_JHCf4+) < qݛ"-Ml<-a z5UEUB̨"]#TFZ()ƣ^|ϜY{^[KGe2;>x G6gkc~' i>/ۿ}J>nnmz^UO;quF(ʑ2>ӝ\ΧcN Oԫ^>(l)s.b}R°Cp "8kFu46-g"nZ-H"&bǮ;7j'w4z:^SPDUsD"10.Xy-I [~i@/]|]i޽lԈҢS6U]^ZzKO~#gVflJ_|n\<5|O 5H.Gݷ-VUE,)6bs31gCsW:pI[`WG~ QFHZ! C5BUN*_Z"?4cS[plءP;Jլ*a*3840Q6Qv ^bGP~ysfCۛu/Չ҃.8͇ȫЧ&߸il}p_5qㆍ+ 4l0h=Pܖ\u1  ǵ\G_|iJA؀xjEUմJ ~̫{v2;'^ˣÏOa>X8^=xǣ_|Twyiyrz;u7 bZȸ=*A^g%_\|d!hN)^%d,DDKꚏ6Ņ:HC eq9SK9* pbCHNX\ \iZ4X¢EOV#dqQP.?fa [9?eD$*\-K! c^2?T3Y 娉UYI{jQ{]7patf2<#ҍ>K+ů_[dh@Oi\~tDmnmfݼы=|) AZ"^% C~u#1_+R$L<*FÙZ b[JUqTY8Bh+pBkkāIXC[j"Wq5Cė+LQ1>L"͟*"L `WQa?$f*3U%" Nx@/6NU]Okce/"3ŋlQ:ƔmN)S툈*HyQSdQI` аxssk.y\x%xE oa6M6iA ^(8<9y0 dv|}Oy|||97SJ\ׯ>?;mn/ն}OG朝F:|BIhCA ^tP`[~TUZf_mNkf""RB`$71kE RTԧu?@:P 2RS"++sQ?K3F zTOc{PD@Q Gh_pudC9 NO"&f#8(^qR:տmoy9O# gBO߸(MYb,0/1$w!Zг^j'?sg&=!R~t "%J]B] M6ȷ ZVb+udY&LW( ҵ{C5$Caff4R#FBEϙBqQGaEw2[iT^ Wj5nx[(UΧ^~ psu剭\՞D pj3]%+S怎"œ"Am\O+zk,pjq;;g_lfgwoyw/>n>_p')+>t1-,RRҨs6 yԏuiTP/8052iNZEzo*x؜Az^gVÉ q]W, iĤ) H= "6NHbq:Nd &9ŽRNCj)UdQDSM9h CbTzWI4bY%SE2֨Hl]*Zr )e̪K*5BzFKd<,c &F4b}FB_VD{j(P2zqIR6.]`[8_K/2_x{JIA$bg?t>[RI>ą8 &PBpsi PI<zh{U~7O58'J].`qh^ ́YqMgITzwdE#VmԈJrt iUœzYÐЌ[2.29%&NE |="}_ 8BWU%j g~K+~2+M~ӟVhm;O'hJY[ !%0NW֚ L]4h ¬^~h TfEIE ÍGP 7a6x>z*S?Xٛ \ ` x=SJjmLDRRc)fNѐ N>HШM#EW,mJ9.X8d~lx[%qtt~\LԻf_O~j>~w-.ޗix[? |+/>7>׿}W==?G~SsC !V%bqNEJ03o}[#c}O}d_&oo-O_ zwܼvڵ?я}˷|Zo}{7,/?Ybb;HDx>ӝ좔BZsJ`ks^:S,Rg9íʹ]|$% e&Jx@QT&-,4A)HIJa8)_65d!UX;[-& `q+X&FA>0z PZ +&5s,={s , F,p^RE 0iؼ^H&ĸQqvȉpCKsSӀ8PZs@4Vo}ba J—]1TqbZnDNJڐ;<\`|r.H1LU\ħ>O7|-3g~~ 4\Vd-O>۷7Lk IDAT۷oܳ>;?0?if?I鮵_q}RF]lI͊&) ig_xGG]rVRB;ZZѡXP(Yk+S{ILii* 6ЦĀJJ>)%ʪD,EmKDZ.ic۵BW+A ϻ#B4 @EDY(D6" 1PoYMip)ZT(%-"P":2B*Ę84`Ak)^^%d!Q.S2TZSG?LLVf =$[5tSll}j·w?]Dt֭ձ_z׻u퍍?C?_׾d|U;]=5;>ol]to|oҵ~~5  ℾȥ( ұtj[kek$;(Iʅdj@٦V V3ёlu h>虵 u>loM%r9MƔP:ER`7n3IJ:n& UQP as^rV%6{TEm/B(=@)@JIԇ =Rd=đ}u@ ە4rw%M8`K@=ؠ&0XZkEs"si 6c TVX5m+1TbHJ4V,ab^>Sаq_$*A0 D D)1[5[FFY" &#s~C[?僟OgjZKɜ9wJ|=߽{z{~}~GNd-&3[ O@'aоxՅ eV", #ՆX 0) g(m繙NX44E-v' fI|a"-J%u>Lk_9Notxtƣgۇ6g6C>W5¨'t?ꎹnJOQ7 ht3e1LŜx/SZ Yg[r5yݐkFVo&*mp,BbƠ0ͺiONX&9Y95eAѮû,UmY'Q4"RfbBQE'@TgE_2EARւ-[/Cw9Ǎ7?3o7>Sڳ9UL?cG|ӟg-ߺqf}}s܋/^WOsiث9en3]F֪j4}]=b HSȥ (eBGI(AL J]1Dty a)Z˷GܕK}[|{']nαtǭ>qhJ$3qP13vJlT!hS&Hq _dfYI"EenAWkbZ=\A@} [ iW- "WQC.)UiOnup;zc`t>? Ο7}ӟ~ɧ^}wi$F8K7=|>˭i*HIbt63 '[ϟxt Wxg_VE QUj6_SL( mi>-NVR<hvw駻ɢS6lHJvy\9:Z^@b0x܌F (JMm gFq5 w?|1t]aӒDS =dX&W禾px%wI9ЂP<An5ZԁV,V bUhWQSOի­ղVB!l ֢#yP?n~m*,=:#xj1DQ+^@ Y tOv4}gɟw|W.Fv(͗Wzc>/}kOFoKp-q붞L磥lΖ}UTQ y]JԩH]⪪4 :UUaЪ)$"`g}e'b)zb XZN r= xe6bF(9RîEIXpY50fϞA-tެAeunl@sDENJO]fmujJB';8Wܼٞ?N ÓTkG:jA," ^T` R >?| Љ ?|z孛텮F y Q7^M vV&ܴic9 GRő7?Wp=B"eHfI,>'ϱ]J)*Rٕ:юG8<(R)ݾJ.RKKkW&!7s#BU-ƳNuHu%\NA({\1F,FEYoݗ4|0y <99(FԹnk$аŵw'ZS+{pR7kG49nb0Fh"0!1{.R95y~1`MijS{{Bb  \>OV?Ϝ6B#LјR S)() j8ddPj?HɉFDId\0?ά:VWPN!"9wl_KY- 9T7 wDun>l0y.BߨfHj+}X)J:$X`9ĕ/I`uX\]u%{X[M=$n rXhf\;7C]ܕs!52 +ruSg>Wa2~pҫO'3C/ߟN_~%xy\@l9@]bLߴx!_QNJmWV[V*V١<ϚyʅIiY@HZe}=,y|r4Ez}1n/.%Ǻc\Y};[tڎ旮!uI!UI=ۼ5-t:]/*xP/.OώS6toGnOŋxfeeL, yoK+)U ],nT%m!&*V %%:K*)%o_HKٍre Slmghϑ![NUk1V7WVOC<"(2{"vs+3W/* gbAkoPb+ =| !UxO~L?^N;mssk{{lv _9m4%5l;.^нݹdi W.7?4J\|f><JZ]@E19 t@R23[7*@JVJPj+l|Z U;syfˊS9eMX2u1"D2IJ۝L:A蓫fPOgВuҁ%\ՉB {J88rel>'")̉$HwC.q^O~n;)# /`vͲ]Ǥܠ-yqa,,1M7Ύ6[3 8qQjikwnFLO7; 'eY\ɸe&!$,sPJmkɒ3rnv7֋p rliJW&G'8k25 MBЗXά#нWsv\ܒDtU(\?0\PԶym=edP2-I }%d!'3LtqȩUA}0B1 h@G#>:l"ހGP,ME ~PXw%LFWٰ@5jsLpN̡X]yꩧyڽg˱~ btolpsj%z9:}z?sƤKDϱs &;n2YvNL )Q,kFjPnpLiiSH”dKo̧)<0^1BRbƤ" AX Pz"ZFLJҮ't%s2cݺY?MF).ibWih~fΞH 𒚊c%)*(k3ޞJ>7=hv"HknUui)vy46 ”`8*CEr0ݸBhA_%zI?lEN\2+H{ { Dդ 2`z`w|P_ڗa1}h$'v(jPh_X ԣ' p4!>tzJM7KW>}/$vLhxIVRr7m7_]A,,/1G:$\s k+ӌ6j9`/6\9 Q+`‚fsRST2eF )g:8LnR,+B$22̬EEG¥|zyyEM3}ΠacYi I&wS'ה$9QQV'++ ( euB bWO ܘ,(o rĵCQbQI5d5tBH X;j3CPe0z&6FЈ7A E PAdBӨ]1/RT9%k9 An v9h_"FJXQ~f ]h cn1S^r2!PY~V-_ ;qI>8ԫNST*ž9XT?S$9ά>|*3sbNEوsFaZ^I+)D\Q4@.% ؄OhXP\Kʥ*;)chi=$DɕSGiĢIꚍ4ܦ)Z";2뚶,ŔwvƩIm.啅|GW_ݺE`3Ql@0ϟo_LC.VxWmĪi{Ĺ0@:-vq/11yx8){s4wК@Oؽ IDAT "%(fʪH5D? f?qθaeG4RCGUTVAhщ_%B,ʶ?ȱ""$&JΫ)] mxK\pC[z #fKVۓsft;̦̤)Y\@!m$SHjr JYMmiHYm*(d%fivnL܋IƶAn(5m]ą I@}XdvyÃy.4YE*D(%1_~v:߼pa-_3ZXm7o%AML%M8Igx4ԍO(YUض'`&KwUPg=YE۞IAʑ'l,aŕ44ejN6&BTy bb9BVbAcHP! 3|A$S@5Xև QO`V`Th]"'tMK605k\jcȮT"˭d,)Y|c`%^]6,|IE$Vm$!Ebe\m%atQC-QI .2oy\ 0) Aq`vSAhl b 4 B|w)Q3ZXlJ 7jk4jZV%c|g>'6FM{@IRHTϚ4avC!!}R21L)$yM+ OcHJnlAs2p11([9AYU&ޫn_9pa!z+O"di "JVRؘJq<.h ) 5J4(Bp*ݯz!DH(; t Jr}& ІUJ17H<^ɧ ERӤ8ήt4M-Y=wۻlyیxN$YEAͶJ1 F%Bn3vj]mYRĨB)Zk| Hj\o~}?WxPڱjw9oug:\'OEO!BZtIˏEfg Q{HDKs LjAd쳤B_xr ̠Vp(PL]eiQCGTFʺݸD۩,l՛W7?џ|/K_;_;~#"B J*y9]ם=ݿꎟV‹~˳yB%rOK_^?=QZHtg K!Hgɪ y'BPUe%ILSɦc(= o'ǽ5o!"JM‘ӧ+0H6Zy\WroµUk%0"z&>lqTs0MwE$(# (LS]$ 6;lPM TJ$L%sv F$S*k\ۍph$ ώҁzX/6k8cğ1RUL,30jSqڙ{khz٣Q;Ԣmf3sP>p#dWt^4o>ǏӧOM01O=9=z<3 _Ӻ&j_4X"txr~{}Z6λ#Y(5ceRPA(n bǤCT D"!RONBt]1\o( AnxIڬ7ۊkPأm\Mߟ'r6P9* J4ﻛ7+H^+/; XNbgߨBYJ ( ث B1;vuՂ<z ] pPawt aJ|8FJ#[)Ut cV)`Q+ b,B(si%?7 IhqpeQ9jPtC=ՠ9 T5T'I/`nUIiL@z:m1iaLmHlWKZh҄O+T'yLbVA0SD?O\{MWѣG]m6??HyGhظޠ{wEVug7jqt_wnuF׮bwuAu=qS9b{y=~ȝNN3s$;bDzxױع@X?j`uND! *{[h߻7ߖOfrbomRՊ; k7a줭w[RXhH%QVWa8uBaxn??!29̗_~֕rnӇů03 bټ^zk{ q4׾NO+V"Uιݽ+{WMyCNON[)S$ Q"  C81y_T*ˠڻɆGDK^+"\۬Ϝڋ/߼Dr͓'D,AMʡT$aBZ IDaBcO$##_BDy'$!tƖ4J4m)ֱS)2JLNUHFKk1$fu[R"$(~B2O 5()Y B1(E߷_DHZ"ۜ'7\e~ӭ,bD"y'ujNN:URot!׭ P_ycgQ5 V8DQsľb;ݯ,fCܨJUqw[\'p25{oxb-{{dVmv͍7 }HC?ǛY&:IT0['s䡯J_|ڗ_3yb8Rܜ{q~ +Q3TwjUj] Gx7o/-͛R fk ;g[Rb ~mSc1YQ,Ή`SsvךO__h7gf>[޽"zR sSދvTlj¬jZlL+3*'w] DPfjE0-UH  DB\WvG^3 BD U@=0;j9X$>䘔5roYQD!^*G_G"jRQ 4T D$HRԬlb@7lq?S0("X߸B")FGJ"Jx'zwBTIJ bd__~Hb3WRŹP(2{nx|rT4 É@HhPy^U/vpawzv;9lwweAN)Deg|zPLHɲU0-h hJ9^:q)•[e['*yo]/{ =,㧶s a?O˽gm\.G>f+<n׮]{n4ϥoɡ3-ނT;K\ UMN,[2C$ٞt?L)y±,t@ cPIY` v HuWPGS,䔠@g!#v PX> YD*+x4Ђ`GRVR\'Gcn՛ LcJ f"lg ?2(RZvK5/H7,`D (>޸y5FUK"ɌV31kyugoq|<U.\dD8vBmTv =->giH#h$V*"+:U'  d粪-) "RXPB0 .I RJKT8!ږJ9NK(}-h6 mS'RiVB̦G1e81"JAQ.rQ?:TV Kc?D;Eo)SdBd P)|j%`2EAcYb*_֖3ؚCyLһ 8+Jun@l;g|27RNCr~fnuų}|l~w]K|̓jOڐs#e si-iWCڌB$?\ yS+, ~rce6%9BJ,ffM HH2ϐQb5ie+:uTc/%F`e`$;t#A dHYӝ$<N"2͔_{=ef>5s.Ȍֿ$4TQPA"F\U;=jK1c\ē*@T-.?aLΊr~cr0GH$BE!NPUuz椧sOo"A\}(%-ا|ɡqf,s\Ekȩ=FOUg\%ssb .vz^UDU^u,I){[Ԫ@ Ji4:lC:HNfb8ί7q%AyҳH< Tt<+0(TJ]"S#RJ@I04GɈL($Y,*!A$BL\~$<}`\KfrFtMWKn}?iE=s>fJ q5ʆ6NUE[%!<6QK9E&KgwiGd)xir(^[бFq[dzAeC)~U"#gLk,&T9J:`t%(mX9a I 1%e4[í9J1合TV:O\"k %(%:J#R±SgAWFfG.{l$"L+9&sw+ȸ^J*&4ZUER\ʧKDe(ظk:67?\' ?-m]ʸdmHK#..a\.( Jl6:נFBlP"Nu%d" *Jl}Vg&M=9'N^{ Բ륔ZN'J6u3xU~z;';].׎穽ۦ .nr>,.WV建^F3ޅWȚs.+Ӗi" Z~cӏSf_Jvr6J}q3[R.; cfHV@$b"F3* 89Y]Bj4<3,M*0 jIj{;1 +S '&^:mFtCX4˂z<~9vxƕv6W*rĵ#6%SYgidP)%e[0 TQThW[z I¸C6sV>Tf-XIp٧ )U^D_mf[2Ulv9Pks栖@Z/VB,lѢ獯:oS1 'O8zJ׾l6/ڦYwe]Dj(̎ي;I{đ2̋mtWDE'~,R`B&ޣqwn9NLId U/~-(A39ȱ՞'R䉈9AE (9g;oU#γw̎ QSe*b& R;=`Dmw_ߗ![Ē"&* S%p!P%kl  }Tzw~?ެF[1 gELV| `#]إIt1sG'G撶"Y+D̕PHbL ^H+5KًR&]NUunfX|޶m۶ͬu@TUr"yQAT>I(ƀebnRNh 7h{ Nqh]B9]G}K_vT=]FL,ZܽOEeM#Q2jSmYUm *2 JO)Vܘ핀,sZ,섙7U_]~뼇hLp('B*Kh" A@!bG@4F !(BP\5 j@ s䉎OVo|zQR&ĉP M + 'pWbP*MJ(Gl+kS7Zӗte\I=qoV.ꦽbufu:Yn#!קggUU5MU6vִM49!<%) e;'A(=O*DHQ㘊'8ZgڊI)UEfv0q@sĬbˇb UDfg ?-b,F4bRe^M0%YO+)_Tx{?Z]*[sɱkK&*|_'PUlt;-{w˽i?OƝ=6 t><(34m8+5h~>ؘ0sQǷ$*7FGJ.hlGRˉt1eQW崒ߕ/nS Gifv f}vvzm! ͦ8AUUY4|>_,l*fD)qQIQJ܌RYHF !!e8N:L1MTX! L3ڦ}wv|YsU}(:H7oµD89>' !tU Wh4erFdV7e(i@bE%Vp "Gi[aNy|L_L-a$BGǟz\uKO*ġ61 7l|A=+'_gw[ow@! ( T٭21iĄ"ۨeHvObrpO^$3޼$GbA,!y`mDJ9frDM\.%ЯnYVg'0tO68^{:_wάm*19[0*d_'!sɕebϳG䋈@v8@mSaC1j̯_[~n%{DZ'y+{iw7ggM3S0aX ú{Coډ9D1v6o۹Zbcf}0O}V8ĸQBTՊW딿wKHYcari*.a="Ju AcD #ij NO}ί%.CJZT0LJ|W37 Y|=hI &%C(FMZv$d*$Plca gOSXSߊމ̋I=i=%A] g(* ~u&*ITTT'̻g_ʸy1A"L<@GO<D䐨lBQ3i˧7o"#J~S'QwM[sU`9U1Z6C]7t} qsng !J~9Oգ'%4e qJ彽)C>#>1[nI } 0tQDUb"&a0Уu:0; tͬAknڥn{6LrJBG!tH Ğ]}.DF}vv P؃<~U"1!kS7!퀓%, cv~P3L@=CٲTȘIRTEdb(:{f P*H*oNR-I 첨?S +jDʉ46fVAd KqL(H,$J$XiBc4QZ胳NgŢjRY<0$2BSPwv4jb9fvvvC\of37WD8GI߱*Fud;1 M~+}|\{lU&YUDqQ^HTw!!J$Bɚ!c~7PFeb7䫊H2H$-$Y6󝥙dI ڐkV$m:~~a3 9Dw PE8Z\0Q|jʼd[QSfZbU*[*&$⚣f΅V%ȟW1},Q'A -bzmV͔T&-ذܩok41 ?%DRgWdgci]f?zAt_p\:g1E)&4([W{w;Lwb nv;<C-cqIt8s{"j(j!JI bN# Uc D4^D4 yRneزt'D !> ` $~*a Rt6γ<'yJɘ$a6XLӈ.GXS%.am0QIKV9! 2m9WHœlŵЋ;yXLY2zv|}VD-OU#-]xt\);%A:g_jJ- HԴfibG^y >__>);rCfQFljfowz\UMUjoy)آ%*וcV+3QYUUDS9^uUUw?}wVj%TAF3"%{2B(ݪYJJ,֢Oe.GQJ^m72AST" kV~$2sR|Y!Qcc&?fERä]NDJ4a5b{{3vj,g?zcU=i[8KCs%ԩxf_u#aE-~ET$BIRby{nxlVUu3{{'OW6S3FA;"fr3E"s{G+ݬjf R#&mZnvџv&ӔE%!D %|-}&Z*!$QnS'mGhs%yT٘s$57sj HT3jk..IEv\e]DyĢ ( wwcHbe߲U2]5xъ Id%qCSk&Sǖ<bɏn$Jr⚙ʙB ppα.տdHFr#U#xW3&uR,ZZQMb"""cQz@TVl͌Kjy`bVK(CI%dU1c2)qAO_dʢOh檆8)fr7j-nPDQO8,+?dy-UM9XAŔ'es ҇x2N ČTȗ9rnquw0.tn膡bBX Xhz$i(LViL1Ok4㺴ƒDO UnSLO,T5uSsII_aU͗w>zN?}FyН=jj4 >XbCY+l g]ׯכhJб~&Rγd,R10mû^Na7*l6P]|V,W'ƅ0~tR33-N۶E!VgN̻cw"RHBrP–UT- JTͅػQIT F-ıc5*Z.6֘or['ը9  //#Ps`(9|wo`r+Or=+1Wl]uJNj1ɓG?y$*`2}UUU]UUmIJRb &&91r$9cP޸{9͛nl6}GYK68{M9Zѩ11;m9(rr3 l^H'fbYT,yX W՟"xCPp'I=9PU1$vS "BF .<9rŨD$9Ry(E)Rjbf3d{Ol]gT&Pά쌷%mZmq#T+dzbqW-u]{ vc1vv{fV;O@$\-n<|{<:oyg風s9UC)~8&J[KvN& G-CFD\Uyji!\ 1H'RYހP:LMeHz5NμybQa1 H]/zplZQP╟w9۔ő(s6eK n(;l%fc):őUc!Hx*A+@̎]}/z؄ G7iHQ`&?s/؊1g[H(ۿuW;l  T if]YcE ODEuk~[/|볟ݻfE6\EL)1A-#ǃ)AmJ8 J- 1R ;WUUw٫Լ`>yyQLܻ^NCӶŬ$v|ZV?>Ϋ*}TWum;ti=pŎ>~N:*UBLIdOy6 L$`|hTD4注E3-4]8N"&<8Gǖ X9,(9eC6W_X,grEFڕ<_73n.5fVFW[o,} !zςX謨eM;,ܪpfyPf;Qyۆ Xn# qZ,3(Ɣ" 4qзd -)(Ft֙̚Ay(ۧ#uU~>[zklqe{y[RK-K6ز-l3a0l3 `b"af njq`l02X[ֳ%[}sT+3Gι^eKuvڵڹ2nlm IWp7A8h啺&T 7.gq8]m3ʬbvA( ;JYP* G6j ^1"0 f%z+/Drw싂s[́%z{š5IJ=FAW^# _,>kt׏ 殚-EV4fs*"NāֆVv5v!n^Xi)4ӭYป\G>|b#xbe0h)/Nm>5[UX^z%:ln}3>aj*K\v+fumSqYj涞[/V9aã*q|bqB ʩo8`f9"qCZnS,7*"WGNEkcgVgk֤kk (N@1KjSgN=ciAïvHӧ51``y`|g̪?iOxPՆP(Ts }~7XTQ\N0Wa臈ȣ,),XWPwserZNz#P,KP _9DHlvB][V; H.d;C~KߜN&٤IjXfk۶]跅EQkVZ-[ʖEPc$VXm5R. _77ՁֻZ jRm,mUV\|OuMwpNmc t[w;{{F:ȍ2<ˈjgYYg `e/133GV,HE,JQor%D﫚^WѾ`kw<O4.XLI 0K@Y1Sumܮ:^ 76rpѶ4M`Q|yȔ>ߜ.$N>A`LU:О s׶i}c}1%j^9_,Ja1Ma0=Dx''+SbJS:_vy~(*cݩvT8Д6h"DL"[|<|K Mq!XKc9 uőpWKu7*l9ɑ0 CۈFCzAi( 0n`f+Li4jY͌EnfN/f3bAΪv.nj&܀sC$1iVf.4K5 wU5WԮ6BL$N9fH͕cݩ ƒ>GrF?Ma@Rgh}2 _0D(,y˟2zc mc}m/<4j(6$IM8{Sah%BTf Pe<دv;E]0LD+3FYG }O&DžIyP2%x&8hp|:;S?ޗD+7Ӝsή'II Ыyζ3^=>aAhtׯ]߿5!܇ $#VGfX=2 9j'!uT5~DWh^-`0qt8}($-@5" C\2^DE@"ڶ` !YʼxT3AS;'kk+1]A6*?S&e"v1_V#&cIb+%pԪ#rÜU1rg a0s d-82}kcy[[[>X t>^vesm40KyX"i2YXZ[[OD:&dk: }42Wsq۶]>tkNp7Wg܈"#.fA('[*@vM5nMدi^-@!Ù)Ih-`+3XW rAyg;szpciYrZ N"j6xV>_GNyasp&EJ!quȫTD *%Ftx) L\SOmnnkq㦪}O3bTGMiۖ)XD0"L0Yΰ 0SCB} 'v"ڠXRQHaTX}ջ:zQ%\u O#09ΊaQg0KsV׼]a6dlXP"04j?Xah@f5zj2ղՑ0FR'$ qkAн`R[`;VQ1Yq8\BwAp7R;֗GG KΩdN020ܕɋl!um$m3!nj`怷aji* j}`-lMp7!ʚ[@}MLQ4"Rt8IS o>󑧟3nnmn됅ѶpzgCVrg!Թ)Pvn|fMۚYa3عu2H &!PվwI3iR /u,>8UP.y[U֕ڻ i@P1όr& 7 N$- !a DcؘΟltDBV0`S0ቚIrO^uTw0NSР|++#Ձ e #BCeBك3q-˟:uͯǸuR;\-3dJF׵_8X917׼+սKFX]Wu`i>GRMGWz@NMM gd3K2ǮGe*޼j>Ę^i0?݂I+@ $qwUUUҀs?'vYXR %ṷ5w$C5j G/ݍ-r#1EܨDB^H[[wH0GUVL2wXֺ 7)U2т0")M\ N[] IQ`m Q`8b߼~c2qБ žɈpޣI?Yaڕ*&]/>n0|#t_U{[; Ixs}ۿz~&fO~߼wK/0%rD׿'fv wtөNR]8*/^Yï_LV0)4FN"`NƽC d=6%!kL@Bk7&3s&%n8hEijy1ff`npNZ/C^"**ݯHbr54CS`1ȣgilNZU `NNhh pj4=؟F8HzYə(ޫ7XswrV6&7u#;bLhCgJ?xy=nVW HLż4+͸3;8{K_ܸzsM|q̧s,qv-M%}2l{~#<$uۧ^/e&: )VzEvɈ41? ?F u'OUZH#EV@ʀpk|IH0d,4=CQ\.;}uԿQ c nJ~4ՆVb΋Eas &s; //0͖䷊RB4qk KlL=T- 0•a #$$RFFfΌhF;o捃<|60 ymeYRp)pgrfFOw$X9P쳛\~6~PA U*xLRl\2SRbƧ>LU/r{X_,cgO:tg4y׵V Ь-X̱7;=^w&OMla:mi(:Je~nv8789~+iUP ގ8MhtWnH_x P4GnUhLabbD 6GbR> kP?HԩR1ac-#p4a+{%˨XvQ*sV^NӬCNnfn3E! QE,E~[ߘDSh̬e>@zw^yffl7?lmjI -Pѥ)uvcZBW%3hy:=hieu쏅Y }a,ˋ0GmrA5\.'_h?C'>lOҿ|};?u{|ʕk<ȅ| 굫gOc/Ň~c/>O]4sSvt]F%ֻ8ut@z{)H0eQYGnvF}8z yrtmVO׳WUua,533R#!@#Kk5"`$MA|O ]ޥ(ȷ#tJƋwʡ0TlYN0(ɱ3IU-*Suf]|ʭ͝q朇ga(\kR w׀ya\__oRCZd嫯gY,@k@yȹsJ&ՆO`\zYt%>Xv:| 4B=Gq:LYXB%xwf a&6S+YGOvwOOҢ}?{P?܋zc_&wjڶmILGC{}V[CgvȬ2JA3 侇OXErIh;mi[AwycȰR֕фeܻ粆갘y)k!9:fYza̳C^Sqʄ&Guǔ""y^NE褐ļXatRD aeتcy }OQ } ?f IDAT0y[n@/\ɿ =/_|q|kΞ= ?kZ׮_y ox=>3ݾ68>LSzgzKAp6peأ7`Woq XѨ8TF:z2[p: 2)y^^'ͩM>w!{ `yǭ@!`"bPWW330|PC6;#†YQ `a(Jءېg8uk]'6BAu36gg\." jK[96`n|kr Qz yg'DZW%+ד]/{%V lY@Z|2CbG(JL̮Es,(d4 KY$jPt>S7o…<>>>Piwu]7nk_蔍T#ӟS?_j.aovm{g3wS[^x\"Jt펻 z U&@]W6^H 1VpRi٘8a=;Go.Fa1F9@.5kw]cV}-:8HOݓ9QrW㦮(V:|"YMLmmCMu ^9ƭiEY F`oP*ň]s/t"Y'pp+G)P2va9jq6" cx4IDl&B͈%Q 3{edԘت5Ubf*VhFVd݊Rq'v?D|??COOܻ7fzo}=ͻ~Ŀȵ 7gNc''PPS{?C7[G޺NiwsNwwy,AvY.ѮZ0g?qb$Wwtl|#O 'E[y0:ˏyˊ {Ww7J2WWU.n'?WGOc ߼/MQ ci>|(oD?UJv"/1B"N*h ""fR"S-`3blUD0Q^'|{{gٻ}=De+y9n/ .]zoTͯQyg~ǿw~ˏͿ菭G:_@ W@AZ&_Xr[y9ڇZ,Gf=o^|_~C믶/??w[7#ox/<|r?Y-o[TMNN>eyPY&J 3tnO\sDG Y+?z7: Ȕ'l;#ꊶrT?bgڒHwODLŹV@sԝ8~=BEq(`Uk.j6 ?΍_-Rln?ϩN `DEp"D8VN09I B5ZTv;;'a c0IK[Fp3b}fqx,LWBZ3N#s;^[nşjw~'!'}bw| 9AS=G;;^;c_'>Nj'&JDڔm6]4V4 MJMa( $I%&$h$,,qrƐ!]P EEJniVg9&H8BppH0R-V&D Fĵw_(|/`hzʕj`fUCND߄Paƨ$%ܢ'WOsc,`Ib #0XL "faԜV1svYBL9c7XI>1sE` DYRP(_fǧ#d29}bN,@BcyC;_ ]Ot#Ͼ§^Ŝ la2$]\R¤!Qbbf&ΜTDgnfbfA$ҶmJ)Mmm۶iRj۶imF.HnD%;'bᔢX)p\PM:՜De^U@K8XJ 6#UOx;r$T ggU3"6*Zp(Aܟ#G(3}5!;Y DAR^jV&Ih D^$K9QW#MPĹ+-<,jL BE6 E7dN̅~t:"UwnӢI6 UY?z述tO24bѻi&k.xԦT6kJ KDbw]Lΰ#>$S!3H(Da0!a~m+,amMD85M44ۏ?q1wiuJvwyV>﵏0P/p¸睠n&Wa^f9=PHǂX&l^ߨy7b"6-f~G` %r^=<8(J:BN)wˊTVybJ=9^_kg>~O8{fwu'̧^Kw2\U^g׿;?SnY{0kh') R$qK{/3U KBANF<>Sk++8QFcK Jz]j1z bRӻh,*N 3WѱW\:1'ibx`W_WMF9""bD˰s<('+QQbjrl ƫ>hQ/"q܂>6`6Y!:&RpcDO",Օˑ3D!"nf\vN{p>Q$R󦧞zM{ raV{3 '2.74{1:t G^TͬTɹ{z v f`^J؏DRVKeu HږX,v7ZY)~W|Ua*V5T UB(!qNb`B0tѯοAl`V교q^3 Gs`74QM ,h.Z;kQaZ:tZSf˵:9 .`LPWR& r0RG9Lj͗Xmr>;zN5۸D G^}պYF7JPw]qxhej~ϱYEaDDbۉR-s a *9xX.Vph-k p|/d!*^ 9Q*<Eֆ`@vzO!J\CݝɉKӻМ<K%-D-]mӜJm^˯-攕|hƜx3%L8q ŅnX{,'3M#/ UMbsV6@ #$.'Zzs/22|h{gg{g3K;[g&ݤͭSvw&[ %@Nǡ k.!jԮ2ҫ%+1,ʠ97KrDqzU3DQw#1ޜDR-riWk])p `1HɅ yrHU/A ȈI0U+ηӑWvH97c` *6$>b֒9O|k9Q$O(:ZCQcASomnޭ|fPə]fIpsFnSI[ɝ@E~gn܌*-%~2Fœ*˟X2SZSRJ!yV^KI eG=NՏծX׮LIRӶdskckg٭36vOO$$/oJj苴Teh̔jIwOw}}]I6 jy{z/rʵa0amsƒ?0Φ7]q~ѳ3F&k9 V7mcj,ln0 FĔD nf.91̒[v7i<(̥wapDy,cl.,QI8k- ;G̽TnDoլ$2#Ur(훳_=8X?ukaILPat'I,0 b`Ul֚ps>OzܩƔEX2 J۵ ̦ll(R\?s!=hPbSNgE_nw.1!s]e *C̏VߺUmfNat<ϋlz׮r՝Sk_S tT/}~cOo~oM,zۻ53/ƋS'}۾DNo\~7ͯ-4o~$afسfxƃ_x챇mrL`Ͻ+WE^xSML43f,ls jD/yը94|\lu\-F$F82q d pQi B?5Z PĊi+RQjH rmz8n]MDI(5 sdwM wM+)5-IPaH7>}瞽jX' j`uR%̌Bo:&?G8fWn/UVW7!脷[3LA-CՆ|M]!n &Iږ&4"@A iTVelZ*J$z%qpkoqpڰi ޫe77JnZin0i1ȕ+mn&mj`˯]AD$`Ets{] :>DT"L$5>=z֑:걄ZBԂmSDu"?w̨V<|)TIe5vۭk.4;Q0.nw7W Z~wY$5,X }G.Av>r6qc[$.&)7;4O\֯_8) fljg5p[:'LyPfiӾm;{z]~ LO%c_tvܹ_~D}II(55'\H ~xޚ aXdJD(5M׶k,-7)%ui67 G;kݠsZc^*|0$D`YӢÙ7WY%3$R01~6oXR6ld3s9\aUă07)Z p2N{OB% N朳.:/Y!|I(PP[QS WBFF~!Xqz?;Ə}Cg|3w+_?GpӇ?#} ħzӓ͗6[ C^©mow]7իI^i/^JdƬ~ ;0w0%l6L?C@H43nP$g?zOE1i3kSIZ"7\,YI,D. "O5:y |A=Ls6#;ozꍷߘL&DW/A(8,\$=OxUUEnӜDN8ӛ7W]w{og7!"KlH̍5F]+]CK/IkdƩ!B;E1_6OUCǣ+a by>,$A2頖.,@`vfb4 y’9B#3s)sP+9ep)}nMv7Wgf0y&`,pY/v*0G7Tr0/b˥LqhDW/U-~ v[6'~ܟ/}>|+7^M]{=yBpki}{kW7>0]~`;;ߟ}h"Wo]z/3{N;x=O~ɯyk1=a<"YD6Ē@7gL&:I7\x55] %Ю7ZجRgjr4]KJ(b 'HrlmS KqA;a$AJrvs&60iam)'#Ds胗wOu?z]8_߸s6x&8Qc^znz兗)nݺuʭpONlU)`S *k쯄Yd&fE3&cv啃ƍ{EHH%XR#݆wRZ#!\fyՃKfvwzNC< yYTfHEEԳۋ~PuarӜqa IDAT^jP?<}=};W?ه__WN0s&`xp꺆0,Ӽ[_ʩxûg6G) 2g 8yݗ!MhrX66۷s^C$+^0S(jsۅ"β6̻vuèݑyh$SBr'ZIX,?_CC73p`)JhE)9rZZwٲÓ 88^tg?tLR PW8qF)$mnt/x0h<[י}>=ޞݼzWϟ~xuo:dONL,iD9 0p'n 9LnJLvU~ju7%;DNTP5KW#""T|&!k6m`|T:rixV+4JD1ZUR{!/ϡ@ p0,z6̠ydH:d|F?l=Ϝ?g>{m?^ }׽mO:ySowy_?y7>{sg~h}Ï~[f;5^GΝ|[?R־O{ۚp%nby뛒ZF"EfrbPs4iss=@b}G"8HA Y4 M77b3 Wc_rsq8 G/OpoۦiRXbP&PvPLmv% wܓ`k7V"ԡ>%g!Xܤw7.f/_r*(9\ $N0I+Bt&b“p}~e.]v0y#v, lM;MFA?֨`zp/ 'nzWp 9 w p{kFuI9ٴwsY)af+ aLWмBƮ%e&n$R0ʑ330j2/e21D%gWB$z3rI+EBiVx,5`;6ꚞOpO??{zg?m/ʭ>g:|+$?{Oҋ\ۿkϽݯ|yKW_<ƥݸK^|bػ_zߵ7Aw}^pWxq~Yb>ۻu}2M1p7MNDn.ӤkztkskRMɔT"K'$R"HEKfG_{LXk37P2+\Ve[/}/o M L!,B⊡1 mrU7Ngg"X7ˮr؅Q)|^;VO<Ͻ~$"ȱDkk[P@cH˄)_{L*xOg{dDZTjl':L<|mx2Xp*~WjfeA?-Kĩm[ 盿w|_'^?;w~_;yA 䴸<떱iZnvmW#s^p>WWfyvz{"kFo>tv̋ IAXBhLw< _8<:L82q6zuy~\noWZiI&@f;iր))bv.9xoof*gWX|/sqӎc3YrpR:ʄXEv%Z2&]9gJ Ə~<y/STCdU+?C(\Qy0ATLy fzptO'yێF[P ҏz@)x4>hjg"vS%WUcUdO߳fIl/&zH.XaJrn.j揉Z`R5 F(cpրykRN0//k_,WݷYsʄ`b$Ƚ=~NN Έ)::Uzvga\w$ B7AmCWWFm$)M΃jd"a)H^HIaŠQw5|rCͨMFq 9BÑ(iC/_xtVww]0op{Oord(yf(1ef5B21R$I6J$3nIYAiFxH"9d5iNW;ڧI% \gWYv?Ѫ@.U\ekAJDTkyQKZ9  Hzn=piHfut6oGc<ۭTP^.c˯Ψ+cKjQ!CTa3 %τҐW}7lztDYu&ir)|$f3GPY) K8< c7(K__ "0e&KftU?x[ߓaS0X 7@JZ +*^JVq mۭqD8jaU,йQ2ү%gU$xfxC14QY~qc6mlZSūE? })X..?B{byvZ^hÍHՐ  AJSEAjJ'HJQxl6CNjjک d*KC*rJJm gx+D?p|μJJ7QXaꇙsݧ82mX&S[aa>ߟL6LI Xw݃fӽWnI?*دYŵ3_G +eAt7ݺszo?!xh\5PrqL/n !xMY%_PzUϘ Դ=!"လ,g,6OY %O5v{gߊ2ʑEwt2m<ŋ1G]H%F,f^.nu]$'BlLMg|2ޛ<$!mmG3(%[.}xB>huuEP=x~V $Lƒ9p8r25 x&XͤVEZ-jXtv "y^!pL'H% &guB9]I, _jET2<{48/e"K χA%ҳ2cU5haFȤOzR31!ng2ԙl};sUaM@$_-.?<|q^ )9>>%&&i# (FAɆ>`fu}7ze2Y"rcXŚA-n'|c/a˳8Ϙ]>=Ȝj$hm=>>񕓛mL @0%?[?W_namqfD-Lr;Qo;i6yu#~$DN-ŖbnӯΟϬ_|DDk!1w?xWGf#FR@ 1ҤQS(sElA@fiw?:M g?VL0\?? ܐӋˏG'W?xHb˦Y@X\,WW7Z?|{w`#;߻y>E3a6h\\ug4\ *RX?dil>Ϟ/)oʩT1`0ԧfIzd6]u.R$GeXUd`FD16!$9f"ȱkm8ED9M$gɒsl6zp?EʪhQOeغ[yǓ}}'0rfכO=wrau IBDXe9O @pQ= P"P5m`3FB& e4wA` W*mH. 0LJ>ʛe2e3rz>Q($!GqnR# !x鷚Vj }w+()$r./>COIL]H1!g]*')SDs,샐@0\^^ݜݐr5Clz& x4F)^Y"e,!28i@$I˳.R]lTƜgr9Z nZm%J-17VMvݦtA׊юf 0hjTdj`.@-ufp<@,NM&z~ȭ[NOO3jݽ/OsތD!bM 3oo)!) <>OvGX ;FR:?x/Y35ES7\j9*_4.~U']bmlN+.=(%cgXy_  "@fjT8j8DtI=Zν#41a6QUAr.гr`6Z{]XuvsGq2>NGZ><8~W'b_PϿ jYam Nm IDAT&Y41Cٜk{"4FaHBT(p ћ׾w_8xN_$*U秊! ;Zf`-ZVTXVIHS 1ى!ԍ]K<^ѰO>zX^fU`P̒r<h$CH H !qM["Ȕb,+Tg9D4'vMIs64&F 99LyƠ̄AiEj@ʌ**C(jߧx2=i2.&3v # T@,c۶LeMs3 DTx4j\K]"-XkB/+u3X<zNa" W~^\9/fDdX^^n4#.8شm4n+-Wn,ܣZq0t]w1=gw'z"2NU ɪTs)g*rNCre,$HJg*YlPUoSvpoDnfnLtO.?zs.?E@JY4qp=4IuE)FP C30^|K ,.:rIB3R ^.u7CJ 36r`"央iYL#"rE9rG!ĜB_sFE.UU%fH@B +hkj) T5-Wh(L+".`Ru??__o߿+O}oo+wzA%84M LE;!`)u>㨲N!1C*饿UY,~Ͼ{۝9 t\~\홂Oe/k ad %1X̬ ]v@4M#TLų4,HuK˴"_0CJvrtM= EڭWOn5#$MCr*!ZN4ˌ\Br}4[l,#UɃ`d? ddVfWU{ nJ\noRE7"CI(RR54Ԍ' {GúWٵC$D)DD0L̵Ol&.RA f*RfvvE@帖nWx;V/yr)g">zܻw/ SJ2b”)u@ia`/Ti>|b(mjqaàc88PiYwu8680Hih:F#fklԬ[-6 Q< fj\.W9'l&0Aɷ@E粸N{NkD!` lP`UƓÜ*0 J_0, J"<Ү5[w:3ҤİmUSn1tg`R mfQY63j A rFՔ 3< fjse-)}g{#fGQDxgUy㞶}*)l:/1P1aP-S?jUڶۂz*XP[a_F VH2C%EŊIF݈fnӧk[%cL1{'lWCoyZZ$ýN.>[YPjִ϶- @ym5;J`ih]~O({I1&j& ],/J$9M̴ BL8 d+sv*I!$jǯvWOM̦m<~|JJ^ sO'U+"fyTa$GS8,SQ!q;ิR](x)ZaG4ːf47MH"lȒUѵ,_A aJ_P:fR{fl+u߶2-Ʃ_şA477L&_ʗgC>n`[mգ*x IYrʃiPKr* Ϟ_h7FD?GP& !_S9L8P`11sxqL4`19-dQ6EB;<U] "B(P#.GM$s-0O@!/Ϟ> dțWsgc6PS-bV _N;/߱]YD v}{{o}k}t*&e6䔒n'1z 5)8L .Wt ;řKl[f_[<Ȩ`,7TgXQ$`cL-8ݼР9D4901kHNyF&XBL4e@Ud~8;?n׉J\T9f0l>äM)onUd{TP$.# œcoݹsiā)dɁ7z6FnH sT$ 1I vUrN̡~ltf`NDBae 8DFP5B0sbt`S.Tښ]om,LI9>#'g%S%5~w|ꃻ}t^Z~BnCAm$-.ԉyP0bӌA"($Q5x_L&P֢(XSqyCk@Djnj+4댨b˵w_DTZsXQGy) ݾ&r>\?ge\ztztt /2f R)278d!31|O!4a;GݽY qtTOz A@Ym?!ӟ_*DYvVP`f* wMypK|!Oq ۪vK]'ceYUJ񰣚&UB !DDfؘao+y|oDnbF|%j(ht %őC0ʒU.gJāVv*Ga&c\C zh[d!DJ̄hMc)MgqQ?ǪinFXTn S%b0TsTr4 db&E;|9#\MD]1k:*smY]`#—e8Wo6?o޼/uf҇;&*>0PZ2m$&t4-b^PX-z}& Y-M0.)j ܮ-KR ibV>vEcY!E'-kw!XY[8v'[0eR! TX !DpXU-EaiKTQ0RPja2?x_җ_~("")Sė_N߽DLdDP1ܼ9ykI!(STUT\Hv}zةk2YM̔TԝF-ﷷnMoޚ'E A/[wR K)p8y;|G Ȅ jg3kԶ<Qbp91a,Z0 DM/TR7SyPf"H/9.Ry_ǩhbuxl(\Uè I,rA®&/7BI3`W㑕[<<~yVy ݮIlAwTk8UIBwr5jXAi[X܅*ϰԵ+˫^v5zKh>@p< Fk*W1TIMmS5.$>+bF|+_x}޽Oum1 %VG''a:I.MaQ"( m_޻?,Z62Ʀ1H"7qx60~Z_-V} #̶#EgN[eϔE*^@M42 IU3_|);lL3%d<l4Ƕeb%0tby?zq!u%ٻH fvIV ccZX'=N1|XכtvkN&;~qeEʼnc +qRZ.T\qҭQi]>6ToB5   3A+UfՓ>lb]&U^Y0jv5՜'Q{02eh1u^"/EpsK_W??zh˫jd&OO'MdōɅ2J_hw$Y.y3 v2%I@{0Y۶ERo N4\ =ƅU!l.SNHo2͆+AFȁl9;;gS5U)]CAM39fȓEΥK@oUP|O"E uf_!3a!(Ʀ`'51$(0.EQa'(f1f˕nT(s_۩+`{ _X5 (0ڢy@!T|Y/WUAgfIx-5T$9h:F5K\DQEã#9 :['/~铴Гӳ;kw` pJ 2CdZ˚*# {惏o$)Ilh> Ef0<5˅(TW2Z܏NO#KqAWI!b6iG{Yf2ę(2X )q:8hn><< B*M}IkM0U ָdf92&<~t\j]los"_Bܭ\%S !8?iӌ.OHXpCp S6!m^x \9al@:Q8ʈƵ.6"kW3uyvJB.;^-ʲH;Ј 9ndjuё> ̌Ђyo-Ϳ_^W)S9<9y嵗M']<I. mҮFBhD1aob H;.޻'' ՞Jeba`v8Y nbc@.B$22FMRU^;M) f+yfsE2P8[m+o 뵚P H@@7_wZ\<=@E IDATכa| U!$4OF^jyIګ/q_>|F iLbj'/{W]blC|ތG<Ժ`X*_^ ݆R,J 33Bsa9 +sѬr<v:25R"7Q+`tG4&-̀ 85M3j,@XǣȦeIdzf|CO,sv_ b#f\zF5}5K%_6?qJ%uBxsN$1RTUD$dдZaq 8)Ff&)+(Vgxp/ZE2Pf%} 3V[J8CC#è jhU߶hf.7ed,K Uģa[):OL,ʅiHUIMuGl dhu!pC@Jh̘y&66Ð R 5mxQ??;8ﺮtr탃Cda8 t}8U^p12 h6g-u&wUs{د#;E1I [bHX{$ 4<ۀ 1 xdk4*@4 FɂIQds{/|B^kUνf7;jW8w·ՄGȸ>ѲҀ,0(0AdI Ib1CIQε?uzAM=)Jj8[rfSC 4BKkf.]4& :V,9 !}֚wyVسMMLca:( f sg3q2=o ѨIiQ-c\]YH)@Tx4LEn#k:l/ٍ"`Bwwu4{#PE B[HԔ<5 \Y &7iĹm@YIJ(Sx=Zz )l\YG+UU*gq$3hkj5l\Zyӹˢj5AcՒCpePVWbU4TƝ ,:]iRUK4ـ85HBB4[jM(ħ)mv9utgt8eAdM39RiT=ORIl :`Ffnnome΍;wn޽}kwIH٭syz}k%%OwS2$waGLSʩН,8*ۨbVwZefyȳ& Hɸ S:eKu-4Y.-cߡ 6g&SV#UDTZ1Sj;&jL sad) `M%LDe4IxRS$wFɽWlX]YI =3/ Zh 5(Sh(Ly!0 HI0 `0`%(R[{c0bT()ZJ\!ƺ($t> b`1hAT:(9TU1B=uYVĆ*m`9‚ZZyiCYW'DjSh4:wnuesR3 9ĪG䜿P3Tՙ.sqc}8ד/n߾yd2QSw Ϯ]o{ $FV}{wx3#ClGoӢ#Ց75R> [t?\e/y]32Z^ν6VQh"b&$o)x]N1ƹW.^_nzetgڄIi("_TD4P /^p{bYܺ+/_ݩ'x|b <Ԁo}=+ˬ$dt w}kWa6VolC1-:%7DY`sN[``X^pu2U2' 9vZ,heXUB8{Xo5 ЪAjV YƲ"4QU VW;@8TD 0"IQ4SE"* Qa€ϜYN䑴+Gê,pJS1 *P+kAUC*P&f*@Cu u!Q` W AA(R D`ne0 +8ب`65dd0V 'W{x oxd쥗>u秓z]S2D !_|Ãxl;R׷/~[=WJDb@ ˱3dacm8K^0E{Z㑘8{b@L",PivEDF(@,MRlXz> t2yCkkp}eڠvzmm=ƒL‹k+j@Fð*G; FX2-J*NŀpP/sMIBJ3u,CU9a1A@dEIŔbtDdBDD0+YJk7\|3gPaerw80UFQJ@00A[OM!P 󋵆&2eJB:Q2 Bpk?m!y2-z_r̞~wwO߿GZ]]{.^|g~jow'e3]9*<'IU]4&Q(#jđ0rćx[߰q68GL_ ~SoMDYrW9&Yz{FcJ5J!YF$ d$oڣ_0{$6jNl(c,l:ܹ}[loo;^FEn^fYfUt<Ɋp,Vxۇ( Q@IUbTVq}c}k㱫/T/>;2d4A%I$"-U%)T63!rLw3jf AS#*FFPQKf`ЪL*i!(1 %494WL.7c`1Z̜ Ud:%q2r_=y o?onn\x'?ׯ&013@dj]`3'/{>o;4#2J^DF3jEkup,2"U6,wT[(@є[ =-3ΐ @e5˟b;\C{:cnjs0.,"A/H݃ڹps/=`mP ފPaƙjXstw88K4W/^xJFd S+P 6ΝG  }Ơ3^~qEHABcit2)`9ILAm:UHN餙1PQS7)MqP*#2U)Q3ޒa\@& W] CCkv,xV !I)XVy1%0#Z4YdQbklS77l&j4?˻l=̓>wܰ%EܤԢbfΙVkLVE4CUR)^x[7=P5SFSj4J9oU n%]H۝5Z|Z@'ӫ{sae HSܱ-sVSkzfُ{3g7o^FI)ڼls.^<՗ד#ZIQTٵ\ smmm\~ωY$E!).]:wvs_ܼ~[Y`dP>4͢Lk5Uc45&5)QPI N^$8(h u3`.G3:c8qൕ3gWA 4 GA hJ 2ޖ;_C+ch'ӧ7>\Oe%)$ _BU5Ù920SUVJ k/^]پUX,e ,ur dP$=93frtI-b}.-ram3=-WAv|*X+3tzyY7o=SMEd06M䙧p?C_㟫'{z`M&i! Ah<5 6᪊m~+}ss&\hP(z: @= R9f:mEC sL6S(f^eٲ*GGts Dʍ$UuZbd4zG}8FGq2Ɯ+OL@+-3"j bSj&@k(A20 Wl @[$v,ov[)f*⥫z/ShleqfsDw4-܈0ݽIt6Fw.2FEd2`='C1 !e.IƓqSOSJD!0)5MZ5|K.^K@`eeu}ee B!BJ4Q1c "2ξt\1VAC餚O67i~OWL=O@BwBzkJS02d|#ufM5U\ܹq3Gkﴮy58 (GTփ}2% Ξc |GK bHxggp4bf`DJ,"f#k++꠨wvp.Ɇj#1UC5S/iRB쪎g!~ifROhttyv @Ay lYbGI#!PЍqӹ`9kWKˇ}\NMӗ_~ҥKK]~ŗΝ;iJt:zڃ>x$qJg/]ȍ7/\pz睝UzΝ;y|Q𫶴D1čWW+k$h|4L!" e4)Q)!isYߜeYqB,8H2a{Z;dQbI"bjr-[1V@ !piL~m\|%Ԉ㎕9?Vg%!''咚gpP˺ñf0F_x*ê2:UFGiy/E|绿ᑇZ[_}7n$IV NN,Օ{/_%k&ܟ}O^p@@ ꡇ^O P[ww` !4pE0%Y0j)B@ʅb1 !B` FŦISKI$6.8E "BI:ɉ%Շ+keYC!3<ss Z#(#BCƂrkwf Aq0.4: p(FUqGcb X"EWUj֚l:N:*1e^U' U4AZ,B Eh9LƓI#BȊOhkd,")P(b,",۝݃W0M?\UݻUU[f֤"`!BM54EPQ!L$M=@):ZF92gjfe L"pZ~T'1!Ĕ<;@j-_Ƚ.h `FfѴYYmxp&j9_¤d\ eð2csL,7Nџԯ_zuYeտ7np'| 9g"'|ӿw.>8^~'?)3ڍ~ 2L$JY1,Zu? ًMG[i4q:X$՘ܬ\ S$Zo̲:DD ImP` @MH)nԳx%F42A\7iZ -͉b&"uSףt7/r8TUC1Ffvx8gA1~EB`M=&2dfi糎!qԎ͹@%-){x bk9(2|;ϺmfDR>dFj"xi(L-H_;O8SpNDDeYv1`Ǥ3U2v}FVWׁ66bPhqeeVw u)u6s@u UZYYS"׽Tgn33 fY։'5'J:':%*E]FP01eűQjYheiEynq`δVբ.#dA)%Q3SSi)I!"GAzH `*MjjIir2a%h^ #`>$mqdJ Roi!d@|ry=P}"X(*H)9L fP21,i谱Yj89|y|cĪRj:<T#/F8Ʋ)h3.E1Y:U/#rr<ף!1ʆ`l˰N-!fdu~ξY 0`a&N'z؇??Iy`f2O~S/u^ܻ=~o<8ӿ=<{gxwmGGoxG{ʽ& 4Z`A9c!LMSClRBt9&Qy9l\Hݤذ)Q˱Z"fJݝ3Nu"FY,j/uD,ΟB (f {V]H#2 zϖd*4LjMSK蔬H f を .t6ܶ.: Q@ u9ͭ%#"}3UֿG^S5۟BD!Fj{ W[AUSN ȡ "ѽq(AX5(y:Ihv(\`8pU)&rY0XX6fÁ⯉˨l7wo#^2>a&y:/iNq/M.[_궟foz{}l}Ӭ{>O|u@_@D=sʅ|oo~Boݛ??0ѱ;=i&\A9}yO)5 k`ƁaKLhu\m A) 8HDb 5!HjFw :C TUY\Wmgf INZBbFfR~3@E-rRe.2LQaҖby_ #,XEAok ˞udT!c,s̔;SjjMÉіĔKruVuO64Dct`.afvuDf`GnkXj;LvI 02 <Ձ8ĢrPXSYP$O.Q#.,]ne:Rze~2Aw Gh}yek yY(6}NB5 }{WU4 `8|Ia~CAQiʃ+W.?h{l_exx|7<14_77?o:fݧQG@.IK\ qq~[bSeY+K{s0!u?Ƚ4MSU3/p8Cfx<*ˋ!K/4M{GG/8)4M3c+bmZ06& "- Te7 jQ.EMsN\;XEERVj00ئdA6dǍ>P1j!ZP0R Q~=}RAݲb`1Ѐ X<" 5 FR6x`M;-;x%06#12ЦU@Et;$%H*4K:2}cf fB o "9f75X6br&&f > c6"HC$MIDLIr T[bbBp,\ s*;bl*5ơ4&B1+HdVʜ;}Ӫnh݊9I:'9^DyzǓ uG$GbVVWlmmU#٢(&_ӝ0ǯ׷/?nP ,DSH3Bd2f !AQ !D3@@M[iU)Ƅ-SRvSXpqdp6͜ɾ;vb DcX(ٓ\(CB9)D(I !(ḫM``6Ҋh1T_k!56QSZ"`x@V<,@`<٩g"2F:OVJ1%f1WIW9y5:a&K@Z`UU1ӛɯ&:cE:5_=b|Ռ|!k=.G;2E$p4rb< 1Og!f0SQ+;yur55M'4ίcQs %?CUfV#?I.C-G 9-\UT^FRL'x25C]70:NN)AYMTRIJdj` Xy5A3U,fbZ%|Yh1'&*`jaʬPeYĂ9e^PPXõP堊lOwMShܺԨ[ ̦Ț6n꺞ͤNtH4!YDTCgqkఆz>~ oG ,Dđcb $xi %x%$ }u%⋃wʽݷ0W^yl/>y;|ƽ]>om+g}r4MQiɀvVcda7ۓz{6R {1=МjV-j<脙eBf-/s`P1SNU Se:I"M][҈$YSdG46)5)hjiLDK[A w͊"g:.+%qXq.!UϞQV`%(@Hhx#M Tj%A˭HԓiSdwǤs DyhV:ٕ\1rY6֭y/Y3sPp(C@uO|5I^aD" S\tU}9;;{eiҴn'Ľ 6g_b*ΘZ 2{dF]VniEOh>@m5taKڌiHz:XckQTn{yW!0wO;???}[Dt_n,Y {|W6<8!Alg@A>k 'Y}],vC-˲Z20] tV ekKP~q B_qCVZ߿, BH;By҆6v9vv+e4Tݏ`SXW>LUkhj 39ldE(,Ut}c𰩛dhDkkt@ٔunh39"G0$31ʠ0{:3b&HKrП}_שK,'g}{?Oʯw~^uj(Wmd-eS[ygռXponOiv|EmN_lz0:nvou6y{ǭx]Ny96+pE=!@>SȘ`U8`k{. iV`0C hj LTAcEbv\Wqj D̃<͵M?~zElp{%1=˂D6kiF1Q>.Я_V Nuק^]NĜ蠪G(?e}G=:92Ydžea[{5ܗΜקOퟎ2ڹ7WWW_z9G ᵗ^eݽs«^uJ cn>&~;fWv]9fǸMԾ tLXlOͣ+В RyTDA7H7g8i7^[ h.Pv_6(e1C#Z :̅ oV/^xٗ|#s'ɃLİT̥X ҧ 2!H Q0uFA aMf&-J3x&bFd<`[ _lN{s.툓S-s}])ʇ~dJ_|W~t5z 9{O@&xdzSOȞ׸Sa] {XҖ,urm֣g=cBdrυn5H`FN>@̳am8R0 0AÑ$)31bX`sR !)GXq,qVZ 4mnzxb~Sguʩ.^r1ooo禳gϞ={+z~[[_ yw6etWuj;E,= Y>Uq/vƻ=^ol [gV._: /R(#@@DEE !Fw]s1!DJtx S/2tФmev,d ijF0M pAb8<]*ubH:lzK:nP롣՝'[:}C+mb/pb2PԱ|fu{rʩi2`-Y6`ypOt9zn~![j.S5Fvҋ^e)n>PaU'9矚9=P ͍T2- "T%$N0$A)ZfLk&ӊ:Nȉy1Ucr QfR!X&/rY+Ddl 39 !ן_&~m[ |;?#~?˷?ܝ~wo^/?7o]{χg|د7?y;ߵ?y]tҥ{\uSisf,迴-7;Wtkji`2hW|__yq,ɭ] 욓F&B̡9`SZIDAT0IiÃûwD#*zzp7O@C4\ >5{.s .{3JSCb6XN3f՜l-Kq =v+p?+G޿9:''?}?׿;}:ۃ>_Wԛ?c'pgޟ'<Z8s}/GH͆sEKW>}o]}6{,/U~rԻ-K eSK.li'Aɮ뚜gDԘùLU%ZD̐"fPq8L'1T$Ayyiv3id}<[ a6}>pH9D,Af&@N >?<:8x+E_ܸq={g>p|׍Yk3&XJ8}Mnߺq_#Ν'3/}ȃe%-a?zJ8Fxd,>*Ŗ ݲɺ_֍-gw`Ɉj!:)5%ѓ_zv2igF ''A]D5M#"3bdB"WUUUh:i" .Sb%nfsMVԴuޕHvUsνe{/x؃=c0ر8#"eAWD$RHXl B0!!$B〇3c3='?oWL]{{ιg"N,a 8͓.͒GۋFwu(G#?h7^iAP_~K}7mBVۯ{;mԶ5nr޹W_|uvqll;6] 666iPHagI4_?&Ps]P(h*(h 9:eF*g};3Go0ӿSF#co2"Ef F1lM „Q˕jNN˥2*3x]a> Z _Цp 7u j D]m/2 @[c2qpML@ SS;46v趃vPy4T>pc'm;퇱&4m[ $9dLYE>UxH?B(}zO_p d2Ugd+^fX0,l]b?VQD$##AIH 02 ʉF4Ҫ\kC.aF٪p"ahLYi{{hl6B Dw#,cAma ְS.k2s!j9Hƽ6_S9"B,ڬ߯"Nl脏<p"Y'. ̆$P`]-S} HS) )QPbv00&氳HRV 0  bXSI2V V 7ز])hE)TDcˎip3l̈=x/\+ سwORY} >8y zm6z]*c2? aIJ'&L DFAwZ6OP98#gOϷZ-f,RiVCj#d9jGPR,dew`XTT!*W"@6(AѶ@# !(ԉ*MP2(u4f=eg3^RSF&t7O-,,<Goaqqwϕ]XqD_2&+4;1fzd@M,fn՟y:&rY& W=m)iJL!:fVvΌSgѫ۶o?:%Y18"BRqBB]UA N Q pZT*Cr=0@(ADDoaLSr""I "*rC#1SqL_|z¥̠8kW\QpE3Ǐi/G>FsU]ڹWa>6F{}1!/7VДح2$>H֭NZ^d+FaQU-[JTcf Ф&fKeD%^g#l[H̓JOz<",{%5yiڧMGsn~}/CCEnPƪX7 @63+ Ȱ[M@;z0 4pAa@aԫH#FB t$RUHA U]oFTA *Ed&3*~D@~uZ!ֽL$ˢf|$%5.wVq^@3kZ?wCΜɋ?ߵgэ~l(i~[( sϫ}W> }KdcWDorkDLb#oV 9U K²B2116E8щS;t<75*_~f8)7[i%&a ^n ߐx)p)_t0pJZX"dAGJx٦4J,0A\0 . <vUCj$FTNfi\ȥLZ)-3 >TV;-t7\{vYV;vLh̳|.rո‡g]ҕgʒ $߈՝ȈWYoTʔ*NqI. 8Ԅ QZ*e[ىpȀ He;v|nڑ myBTZkDv;Ӓ1lfCixnvβzn]gOxKO=s_-O{ Oc:?rj~O>6Ň?Bs^3mJu΢du?8HHy5`Wo?pRUϬCBA1nԫQ'0X[AVBd&.A3 VZ)"D[hё R ( 0 3 mgj/`ISSmW<{z†.D?~|Sע0\z5`gۯ}5OK;(3%7Y,P$_Z\> px$@(Ȥ&J T-O m)G}v;AРA02h:ql",F? B"B Aʧ-D@t\TR&JBhj: ]dҬ$^""$.:|3  {cfK0&"扏@Ey}.j8$ԴQ}'mk쿌#Ip5$m{g)v!컜 5Z5;q-6Gbc ,l"R;11YpBHYZrT.JٖڜB H ؚs Q"$B Q%ɓ>%=EA<ը7羷)vV?Umjch#և|UŶӚsn3TmM]DAol)3|~r4MT\:_IvV 5hFl86s9.&)Vʆi(I)"E(]AIZ G`DG򡣭dž1f$O`ZRpoE;WnErF~ھ'b&ORv۷\ʹPAGD$}M1iͿظs ij/@b>:Эk 31lX"֞0~+Zm\-TBQ"e?V|i/Vg&Dcm!9ާW"䒦Tgtm9®\$GB:'aj@R?S8_ d~\cTTp;]sCޞV0nLڸ^fݙf'{ّ^0 c 3H}t 6d{ L*j=l]DV˅ Ik+THs@ ;UUEr3mckaw k3}Ldfne&S:Z]SK%{dԉXxJ]mDpO/SYViăQš|X{*Z!,W t'y`yj||^U|K "HDYXB إg"]2?e6d9#-3H_jt<BW^}ɸv_nN++ +T䷍tnI K9rJ/b"r~T F^ex+-;)Og9zХƒ4ÊWתHNuzE%;CSVq>f'UUKJyev.eĺ)5"i+J;zr.?y f;VfϞ~`VA?P}[Q&7NQ!=*[+MFLP*V2"yMw'T&tvLy^eS 0~(|e?zC_hN_zǡC_z򟮺#/ݻ%z͛˵?|iSg[j˞z[Cߛ~]7==~@`RApe9zŮ?՜ڳcϵ>nĨ_ҿ~o'{O7GOVFRW^̾#oy;?Os=Tmb{|pzwf{ ]{Ց}Oj O 0KKSxs$<Ӽu/!.va9 džkwlپ :KQtRkykfgQr Z'_}xĉ$=K7p_3^pv}y|. 03g *CC;v,WS[woW#]9[o-}@hUWjCo}?ݕr}jjbtttx964<4[u7}ǎա᝻v# mtSG!w^Zj4/w?޽{Unwfffz 0>>~K*r ;&dOiHlIENDB`stopmotion-0.8.0/manual/screenshots/playback.png000066400000000000000000002622511234321124500220500ustar00rootroot00000000000000PNG  IHDRE~&_bKGD pHYs  tIME 46 IDATxyeUu/]k{oU]CI1$O$_b{'b4&gDP
 3<}ܜMmoF /rמwǂ5V~=sIX=1=iApι84|\PmhxPm[pOu map5K[O/.>,<+qϛs7ɝ]HaF7Jڕu^_}O"7])`XT-ڛ/nJ|uϋS/ٍ2p^r]Zضc]߾߿Y6]íƣq[Kn:;[ZdvyѵzWuMLN\ׯ^7y=^: GD;F+׌Nt<{X5D4˫LLLQ__۷̻aǎvۆ z"2WѵO=gw7w WU553۵ow _}ɿKK7O \t~z;{FW3*ܻkWnY^,57OT:?/}; S[_\pgv#Xƞǯ[S}aWrwm{⹃/j@_oglgO}36X)_'nX9ny4ˑYw޽{b~xM7y/O~juQhqT5W&KVoݾV4īsNWkmo: CSczj`v]lb&"Z"JDloyأr3]c]_p*}e',aT^m,r$|O>d@.`|| oxü2?nX,FQtX9}ա= -wm;aÊ᱙}RݽopW}7ˏ|wvuċ{`og2_N5j#3ɟjʩjʩ8ܸDANvߝOKgP'S˹/z97Pϧt$t) P7fi?^spfr4KEjfiRb8S,VՃkСR"k,W*3L4(QD?42Z,Tu7\ֹ>4/԰o=G+"$ UG i,Gڷ}}/;8Xn={^dS|/ܹ+|S־tWG{'zk>oniޥ}˪l,?zvoڼ_Wkjs4KKjۻ䗮XR[7266~+rX,7-Yҳwށ}w+9g~䱵kV_rE0KعkMrw[k[jZK'T7}3C##Wʛs_񦥽–S6;.dEU*w޳CCCfv>c^{E |jv-kΘfi#B w50o,׿o}jI J=w_⍗mذO:iEW̑я_[ocgzz/ߵzu w导Ӷ\zEgq?}qm8Wۮ _-[6?cO?mIO\ ۞yzک|[77K4ˑO|I- WrrjzrjsgqaI ==ݿo\ۛ$IV[x3 f'?wZxN;5MkhZZ $Y.;ܳ뮿s>SWv[|偃_ryfClXwLgggVKOOOkkk\iNfi#ENQ](03LL׾/~+{;U|p5O\OZ {ͫ/8^13Zod ^u?'WB`u'[߾B#9pGIJKmqQBbK}ufztif4nFu6+7`vswo wwuW} d!.T*ȳ۷?cyo:4眳:Nwտ;՜+,?⽟kS{4Qt.{Ii+/Hc3e/ruŔ|>\’%tքtιɭW~jKKKs4KArYY划SM>z4K%ыŢ67K4ˑT(@.Y؄Z3LYY!ŽKѧ۾"玨[aQJ" 0e D a?q5DslXRDfg^-{K[;oU5ĒjjeŻe7Ϭ?*F[U p pzK Y;0#hG -:p76{/T$NMM; chϱ ι'n:nVNMOϜwYÊn,l:lϓ8=̈ո ygewyl#p_t{0hv#%yQ(4ʩZn6.I;P۹pR+[֠Y]3tq&М_[?h_,3ǵJ xSa!{"ahaQҀ. L[KD} ǐ߻g_6A_ brʨ 03N퍟۱sWRhfsi?| 7ѧ^%ۇg9afyPx~4gm^w9$l6zDXT\d+~s)fALy?͓[e@/9.9/(fǠƯS^Qݩ5Uըft=M]]GG?S8yS'7ZHI1jT!g{_ܼoq\[\-T>Hy&oöL|'ybn#dL t¼6o}`Ҡ|eQDDfsռ7;{R=9J3eABpTٱ݈v`h[/r^xR Co4f>Z[h'1EMǞ޾O3Zr=mJ҅rC . ?RCG2TSBϞ=!_x\uj R` P>m63XjЙeb23{3퍢СCU[6m 5"2;oUYYFөq.p]|ZT*7ݝs4>+,3Mѐ&js'=YX6GQ[ʈ}Ohmm]d࠙`7XfXU L̺  }|Ϯ^GFF&&&=j%\΢<ݸ͛cwҦhoVCCC)Mhc@J4m=7a%ّ%l`p]uU_WsY5g0*T̡C4F\ve"loXN;|{w] [D2+_%NnkvR^'f0\pk}hqi@H+*wYqΚƕѠJ^uUW_}u!ܒkPƎJ9ammٲ.u(l;1S]a޽o 7p+XMe a`G::GS{Ё|_3z.Ws=$%G?y"I{ggF#R:L`;##-eq`?=ƍw,2yr ?P5,954O;r\anJƝaυ fb@` Ȩј0{#4~ / XW" (Hcccs Kя}~ϙRe9G.J\>/tq<O|uv[yXF[OFuzz}$լ<$Q;M16>oUe}sRfӥ؊5*4}JBfHM$ދW A,Bdf'B}U2^رc?5@Kxq~ fP$(I$I{QJj4}IRs}-ikk˯ . UՅB*ˍ 61,I`$qMD{FYRŘ8JEǒ_kSz{챫j~N*uD7!L5 IX'Ox/Jfb  WU1AAx422rYg}\.͞k D fp`V&_'Z,TR]A |OO䢟:}{o:PO_/\.̅B8ZV*RyFT`,K3 /b xL=fgjD*jDbWU*%%oy;6.; ??[nZGyIjR֪v[/XbZ)|-8avP3($QN1BMհ鬍Gh苔bO݇qphwa淾/ԭ^UJ{WjSef33`rLÀ9'>Vz0Sev2B-?/SN?`]ߺ8EI-IbQg6dTR8`15Q*f0S"6(uvig}vT{؃(/E$q""#(9)sH]1SST/ d@jj2dpp޽{2S.~咚78Zj&04W$ LdqUTՄ4mA3QJ55kJ5\:jsk-xDX|KVS6ar4di_YFjP2W#'>&R>׏?O] |gFgR$$>II1H$I.b2g85IV95Q5*0QU;N;"TX~?|?l^`w}@dNM ` bDQ(er#'3HnW jQ04b%[ȌGFٙ1TAFd _ǀ`"0IfR&ڤpoO;0،Ș#`bjZ 6hU|bf>0H͘H& LL d QXNn|8Ǫ1K!N2(ՍMȁMb#&#)O"50Dd Ұըڑw ⼄ɩo֭]HV<3@UMDHl[0GĔr3&<f*YU̼@ 8rQH2/gTIECS$+-uvcrĎR"j*3I3gU"W Bbh2l#LPD|L9 B5,l8'4DUUTETTU&ʱDDq-T|03@0 CPQ|%;jEURWST}R313f(eqd52^uJZ"9B=r0dT=Da2ff1"ȥutNTcU z_g1uZut.ʹ\Йv IDATTλ ̋ƪbJ#!t$ק-ϲ:Nݼa9Fh\ܲޮ2>XV#T-zRH 0DJT$%)Ѿ31}-&ʚri)=jINcwDs.L`*E 41TjP2V) ƅsNDs-'eC[OdL4,gLDq*3qA-lH"vIA3Q(`2#uQL֭Zv'LO-[Ѿ{S< )ffAUKf U zEAy.G6s95/ƀM.;4:qڝ}r۳`vS aS𝑚*LQEj1ve j &3XSl>.ɩ?s𑧞A4*88 TlFPmBÈ^&rgG4e\qek]-*hvT"4ӓ߰b8qpxdM_QwLtUz3R) TI2f |0 .MY"I[>OFZDZO 5"c'Fn8Ԑz HDH5'~b3PzAIDQMGo>L~iOtpSIĄ"gfP~b1Y\bfHIfNīi|1') J"2B^xٵjR;ڶlQڬNp` @E5"4;8cw(0CġA'ag (g+N:nht| "x 6H)!7j^ERZdPUUM)]fY'ڶǏjߖ6OLYŧj+LXHuQv 1OD~rjQK}ӿs*fز"8Һmm⎧.Ka` ՌC Ms̚Ҭ M:hmH>J>A[*zO:?DW{xR 9H E΂gIbV/ \pk+LcP[U?(٥Žttttwl;-B1Ø]=^-sd)iLĦbx DeOhLN1I»CxҥFYj7ڸuF0D s.-Tl^96WUU% g-cCL\] ֶ|!?sgitݭ8N>D,bfChg~C)DE̐KOu1y6r..%ruWwyt_msqLP%J~+6UU58w85a漋r3sW{W]= w3E& P6b(UњyUfQPJ>>Q|f(bsQK[wGo9kIυopʕPrfN6PG W;2h"'FXb%PE}H 5c9ǎ ;;GǮmϛj&BA d"q$M'24zAycb35l&@ p@⢎v``-[23Qđ#EB{DUyTd1ja'b&0GEQYby|PԖU1[?ݟ*@y ٣ *"*E5V ~~¤̔6cL"^0LcHF01 , !1@L5.Uag(l%mKz&%.\42HFαEu5NUّBU됩A@>#&L<\sQTjё;3oNcd`8|fPND Bk,/$嘈 bH [qԁ]a׾fdi벎XՐ" $g4J`%Z8"pČ S$QZ}`L }ݫ ]8[Յ٩$u0x]/5"R~qbSD.b3r!f@FcьFΕjb(R=\%*Q\Xup $4(3FڀFzDrK@#b5!nmk; kWңpԣJ"B E R(Bxg d@Hub5L4d_h+S-]*I&kNɹϋ|JI" +ćl'T bF2Q̹2@(Qp+ HcNGʱcv|ˁϮXo?( ݵˍs?޾h7DS#6L!PX J4D|k=~xd r.L vW841QjcG+޵>3]nݶu,/H6S!e4HNlpf7gEsHU$hV)L< FZ.S%>JE&&P0QXL p7(9DbU3l6=3^LL;`ښs7:*`GU%,l._JnIIa0KOkʩV!ЮeêRqr#jmٗ۠e'VI^z?;ˆ#̜t,>_ VSS"cnXGF[w\bbd9{UyG;Zg%8:W`Zz1∳B"Qׄ,XЪ1Lrtvu+%K@+z?DyS0K`z&FC%[>5#2ZC*@JLUco!\ 1 9S5)OO'f@F-m S-;wM[C&K[IXDS@ʐ0>#)cS5DLRMxwW-IJ33 .NN87G*DRF0BWM͚A9_AɄ Q3 fS#x"/*l"fQHZĵɵGb;m]wuݵ xBꖨ6L%#c(5L,B=j>Uy(bnAEո6aȘz:W3;cJ0ppRw24-%!L!B՘O,SC-JJje|Ϟc2˘XSNJ9"b%Q36#rLPI[D.D?4kXD,ƍ*뢓^qܒ\BGXjiS0;zD@Z4 NUᧄ"fyBc,ZQ2͘2DULNBjIZ73u Hϐ/{YvND䐹QxtyDQ>kS|9'(&hfԪ[&ٛ*3s1X~ֳ/`A &b9΍P1zUG@j#SgLM9<5) -yT'4 +FbiXcMBThqz/k]UvӷwSҧR>Xz?}GNȭMu?|uR@ẌXETK qL#"G̙iR W-$ccm@ː0꽩ZMfαlS5DG7ڥlgf$~A͌Z'㓻xBPd^Ksi[ "j&x0`~P"Sn&zS |PpωHEDx'13(|T}wީgRW=m ^$SU@.#2eiyөdOwS 7KIZr ՚7f$q3mL~̱HK$YtԨOT&JVy--y5d[ӝvR)%$gDL"uLesG;O'Z Wyٯ<'$B\arjh-YZ['gw^I(e#s. K8beRJհ`A̶̔)tUc!zN< Xr&%e%xD5gr)E]ຓSU&Y6 )ixf`gX):ZdPI V]K-?~ZwIuhX}6]Z^1Aȑ~$5#3@}ndU5A|=µT=tώ=Buzj”4CDWlN`L0e ddXh]Ր@jv*im'}/iUr9Ǣm54u;ǠJG bC&˔Io0I%ֻzY^*rhxqK`1L5\5I9k vdʩ ^un;lii~{u>~2J`[3^95qht v&Z,Eم- sBC`#6NhS3GcU4NRשY*eҌ &,EjI\.յw7'oGL%& &D p0=8P%8)}qu3EP">AFhT眙w{k*}t_/gp!Pa99U~01iЍx9N9 C L(< & dо3J=cǾ5 09E5bQcfN;NML"(2`Ϩ4S*q0; PkNJeKj]m<:661^[xtO@z2BHcJL8$yj &j̧(^-<4 $TO |h ZF]mTI-{)̉ 3;&2$͒J2ZHDl ħ9sn_sjK IHJ%.ʧ7=􎩙)(X!^Lq^7@A.- $= K)6\%}{ fk؈G&Nă8ʥwH. 35 ٝi08rP$d rC|HȧS.k*J'&Hza|vHsgU8]DDj`r]K׌|xn3rQӔ5"a01o;vf>Q$$H[2f{jI3# zH2nIߚɡ&dCKw[pƨBR@& ufPD `vBu!h4U l,][=~R.zZ^$0(q (L}`ٻ`/8 ~㭿z׬?G|~tt\袊0˻ժ|=M\.rkb9Nf9%4T 됲XtR'hٰ>gFʕtI[ӹs̜4Uufv1d!8* ( Nk&Rd!, e$}E/4j>Ĭ1qÊՑ_wpf{TKBS@=xLlȮbT\],S"!9vYjb pl& ކ9 WoPfnim:d2]R ҸwvApBLgXX<X4l=MB̝l~Ze&fGDm##FƧG'J3 ==!rv! |)c׈ _^˛_rx9O\ß8*@t3 ,T8ؾ+ecOG.@|HL( `8y8"N\6"0`y"sBP&$!n'iA9e JSW˵xpp8:pp^$vF9v(sfgDDZODx#A@Q6313"G` XB\H`5@3jq<44>`&˱OT52EQB"{8N%B{Vpm 5UQ1CFRd*-WjI{_Uj3 \s Q|4ZO$N)LRՌT%@8ef BgqPWĵ1'JDEaW7KT>񒰱U4ȼOU5>zZԿz__~G1K3HIQ6H|`q׳ltb'sy2 ,b0 Yc}@0o`@gHb`ɫq̜7 I{7t]?S HUcD4đ4kQ?PqHZU"D ˂R` sB)ҮU&*kFcr."5(' f( ^pƄx52XD$љ9=p@g7%^s!ƍ8$(ѳv`DI2SC:R5UQA'=d3I@L=@W Wc.* -9BlV$Vah5]] "XB 1UQJc!ރțIDЉ'ռ˫l .$вoي=c;Eޫ$CC&GZ:[Z[˥͘9'9T jHi!áGǔSj_?GB9)a'!GI"=+oyF&iǹA)B*ñ+I2؅g@lFȞsǜ98 dn^tʤ$:nqrǞ0*heȑ@f5Op#QHf9b&R3"1h7Q&Cp:Qh|2@RѸ6=v=o#?Xa0ÑK}}]ιEtqS!|d#8p" sQDeBE38j@OT{`cKj)/jưsjRUDl si.Qw.\`W!uĬxQ1uk߳n KBgx SQ@.dMqT$rJFds ,w L:}oHUqFbr{d@Rx63Eplk*XD03R O`&3K^.ALOR(fAeuZ^N5uWwUbb C D,K!B/}҇Vhɖ5 VHD6eYტ@ @LTCMY9w^fUvgVUwżQ]޽{:{X{mi| Zllwo>oڅvgLsqM%wuFpOdgeL0JMRa)bb$@ų8 }л5M{S/%^r+׷W^^^8t64OSJjےKc,Xh2 j>7)O@2йCx،Hm#Q3jڥR-&/wΞ{M[KFt4d B˲[6)2aQBK`B.\Eh0Yr.5IKNrGTrݽ뼁EݎC1ܻn,Z.P's_ol0n:iHn4:~dg+R4{/]jdm s4dwxaLӒ;8ҟ:<#]9w M{6ɠ*.<5L3H4Bºt(Kv$˥YCb K$4 DT'9DI~uD&;/nNJRV0@xByF ; 4m'A`MT*ej))II5qIZ^yin(3|Ƃ(O7YjQr,&dJ ٳ9lb8a.徇TJʥkX.7pi/>R:2zbxix<>yjeYC+94mPh^n&ZP/_z5ҵ֌GPT.Pu՛}kwcsk}aaxi}SJLMjl*"2ldƾ9J1NW7kե}=_~y4j5f wtݤ+ @)<^8J,[^Z̉v P@F3xf0ANܯmMzQ1LBڂ?'7~ֶ&~>.k,j9TN7³T@W$Zjƿ@@j5Z,WֱtjG dc& /^}'~~/^'?p}4BaUD3,i9J_S A֒ūPyyGmfĭ'} B)T~… ؓ?+3ݸ^:s*QT)I\elK8ZsAdHfʍ,>Vrfj厚0ʿ]𽜋F?o~ן}t;'Ч>| y;'&I䅒#kF r(\T'J(6# F ?Čh, -ی8JWSW.<|7O;.#p4Ge.fDKkR;0MX 4^facg }|w]+h<4PRO~oM)EsgϞ:w䉵x>J0z:RYm3QjFH^Tݔ6'>)G!fF 2J$|%a:z'? ȇ^~s ZJ씖}㷾J{|[$[nhǨy hdWKu£BZɡAE`)m4*-TjX._]V63o\Y]=wSzGexC@ 2>UuT%%j8xdǁqz ( dlݴNZhlÏ|93 (!h!z3Զ ށ{_q#Q^HKi˛@V9I)!dXmmGܷztχ:(P)jz.4`u.j?6>[/9z# Z$RӝZN]5;{ /a䢳: Aa  $ڃڢ(R8e{O%rm‚ո|י>K'[>2^ҀNʔ}Ի!UD02Yh )jSC9@4?>pLQZ&"m,AE_H(>Le_V,m @H;'} Ӌ6 t7obF`442 Ő:3Y`&ArAVh,l7 X]j6G_:=NKOM/4+c &se/Ξ})D*d/=2jУSLjPS'ϙi6S }vA*qNM$:Qb,TX )@ɪb>UѮ ;Cs]y`LPW~>,l/X9ŭuCwy%3)ٺDm"n?!X `fjIX=6F2| kEJkP/sHTWrɰr*Յi؍c-e_oE܁9Ip`:֨E6XD-?fxp´:U{|ج(܃0''E9h.aJM8cQ9MVJ7PKpVELdA0`;;Fԇp3œ]5V':aƋlr%;Ng_YkP wS%;h5Nd$!BM1!@I67|qzQB[sv3j8,P[mfjYTs۵/d 3` BI|mSOOۗ;o39::!fsZMʂh`h*<#:}*MbS(kR)JSyp2 U߬RS`!>$Ree`XL9 oat`HrhǡFhxBXXjǨsPRSzIC >CMH2N,X{yy,=DE~1ǡjC`XQ1 ~wa`ꬺPx 2t 9P \'}ăo]q4mmFohፆSeyañ>>4f9ZJ6qe0 9L'qK,qp)ڪ=4}nBԑUukiE郁[3mE󴮾qd 2$E'Z9qv9Ŭe{ j\]z&ߝCT@uD!LRzdP YH!_G{68yG$䰽k}.e-Oᖅ@J4zA#2x ^ O԰( Ptqf¬ ,HaG*E0Q` tĴ?F[e4`"V^H$]E+=(m. n cJ(tAFpQS4r(%j R@'kBѫ`2"t \;>- RBycVCmtUYh340 u3`Ȑ©-ZL-BJ1S2l Ke! c:d`d,!(Q0zLY5(&< +pPSd)LTj0"VUb EF(*W TթRFX-aBTe(uЁV5:Zg"TĄ"2?crzV"QCj$ 5 U-6;4%Mm@Tb;ھDt L򆐼o0v FpC(;{X:yZ:uZg)(FOSl9U%T`QD1 XSBP3M  /_'Yu`j]o3x޽İh#8HE4 RSuÌ'UnXªtҰCl# B$oF"5wa&9 ĀT}+sJjײ!OSH5EBWoPy5nrnҊӆ`L%#(߈: x]V)ú" k㽄ΪzFIbC`~a9@'&"i#ZJRö@]y۴ vLHu[*9 rFHaDo嫧EФhLQp_}u,TcX[X' YBDJ2!/XQ\4O}۩HE't%`J.4bTba.UY:% e>"hCh:`zŵܫsTL.a`uP =7.=M¡ aVVbh&BP:э`KXMd {Qj+O0:$ =ƏR5:N1Y Jt HeQFhQQ%zƾ6*p!a*} (U`х/J,;u> TP2Xv8ThaS ߮ :+\VƐJ  qx<0q)O`A1hِ *1|آ 6@5j@@+`-ĝXijfjmr ك >/5^5XlMNw4`155UyaERBHNޣs `R; cQ>+P2a8`-$11Cd0o4jMP`#lOJW?cI`(I5 ==GD2YSH:86)rcV}=ˮPӊH N뢱EψAYR#vV%XAДƠHpDEIVD92)b IfRh1 +![p % *s"Ԍš) t5A >IZ֤$a$X.I2bQIքPsL?alD,T}}AjkT1p~<:U\Xf3Jj:,d}DMxZW=+)Ko$E6CoSXLzmHaAJc7lFgG Nw>_R:`=U RdEiZПAQrJʰC-VC@= Jغ}F$}ʻ׻}#:, a3`eu($ڦZhD. M"TAb JBP5՜oCU2YizĆ V׉h7ЉVdQkh& !3}<,HfLCQV-p6se2AM9j 8-`)51,X4UX;uU˚Pj!#*q- _zU7!zװEU ddrT`8p1Q+MҬ b=E&@驍LLj^9JPtT"u$l41,ZR'$jaPNHQ$ĤYPoiȑN+*mҟ[D| IJbz(f.Emh|dx_,MpZ;BKX:Qj7)'?sժHrXwѢ|ɆrlY)4h5XE0l2Wר@h2eR,2Ne5#p@ , D,,XECEKc`׀6EۉS`dD1M>U7 E/̞);x Mȇ5I5>ƞ.HK4` uwᇱSÞqj.]<,D4 ̵ؠ2ȅ^)e9l՗jI}B4!|g@4J.OY<|w\Mw dG8uv8ȂTځخkJ`Ϭ'RC?IfDuZ%9:6=-Y r9Zp6rMC-g25p:Y _tYEБUeZmzi3kEvJh,ol P.9NbxOi,n IDATB%7sej]XZ!LʨSǞ5Ag(d2Q0Qx/4ZJjVef3 6d|-X1y㞲I"U*hgKZjrFq mWE hd*5Z來"СEM .#+/粶v^ĩ._R^ƛtIyDYVeψ[@ӳ`d/ުJ; f F*|dr+v[C1>spperrH>OjeU>t(D,$6{ ӋW6 1`dr2p0p m +-2+Fϡ`m4ȋG*j#[V76NA L F*Cu+ /7Icr RH'A wE z*y@uΥim,y`cē|hCځ8`ŶPUhG%ty_erGyzNضǯ\Z0Vlod.\|F.ȇ*,ѹ ڨ[^'x^;֩^|kׯا>1jwu( яN^ze{{mc׾w}?yH=:kǏX[~+;;m;r/ѱ⑧ڦك0Rmj+g;uc1ڭSq~'xqtj2;[YIMc\L)^t4]݇fG?=0|_~_??*i6ڃSxSi+Is?:X~رR7@^#{S5v ^$gԟАNA=?wݟ?Yñ6h4|<ЎF.6{9zDG^{Js_sgfRa ?~sw$A?pѮAGGlln.I[N&xyu$w&KGѱ#'H>t.$}>¸)'%;w}\G1,.,Gc/eqaQKK[ ťuGٜDuIsߍ9?qҋ/L?x샗^|A>\8:9u}K7_8q v#V|{~W)妫\?Upߙ_z+_:J$GqoSoTs ;o5bͯuxv]3?w}{NA}~l>[]S:̥Ĺk$'z(}~=@tB;RܜsgՉu[Kvƛ 3W.x̙I&in+xI~'|gbe*^wp;n} ~/ h+Oixnkb~מ t4.{W4ékn|_7٩'2Ĺ7ywiuhK._p>~swW~=Cww3'?ze$9j_qݾ_2 )E<%uxí=}NGnÅ/O|[O}__OͿv[>}SJO3OjoX? |C9zq?kCjC^YGPu׬W_Ç:"k,V:wj/VeIwӞ|j=Y;ZG{y4َ7t}S.zsFťe̐9Wڄ?~Z\7+/O 71;x?G|m?Ջ׾K'wK [YWs7_y Ӭo1zgc7ۼtyxڙf}ɩ;O?a͉ܵw\Ƿ~ AF&ϸK;]oq7S&cfK^zĩ>O~WGt7b!,br(8[H_g>{ʵ=}仚œ-v1?t+k^헨0>F`-_W/I[o~-箣]JXe9ɽ 6 {0qx}y;g7ONo~?NqT훉?doP= \۳Y)yD oo A\4 ! xEÆ4pђKLtHE*.")5 I/VҒL-%kLEd3O`h1TİIUD57?Jy;8u~?aO= 㳶-+|;ˇOixdps9glo-}꥿\>rq| Wc>1ykݾwy*v+">3QhHS0D"r{X#S9c ͟AS5* pf_+䒗RRrdMlsi---QJ뺍Fmí94RJax)h4rd2r7b@ΥRDH)R)4ru[[MJP㱻gyu]ב6qm |KD dRι sm'߹h Ҟi5|:$@̇^]7֦Na4hdzxnk> +QOv6q?"2uAeqSz5Aä#2r8 thl׫zVrcoRf.g)H^|%8|!W\rɧN9=YJ$F%. 0we:ڶ\>L&,./ܝd4dRBu]LRJ)emҁ @v]K85LKێh)uRC#www1FIVJd),*xoVdɔŽs/M6MCh'fFU'; 8pz ׯ? `7o t(ˮ??ӽ06nܱ=ug_vؠgWwx.ɽ}+VZ8j( [o~8I (yBSwiE Zd:&u^t:L9ReJr47MN;"4/rI)5K5#YLe# 9>0*ŋzLPm@:rk`C~y cgK0/e>+hgd&uar`2\ؒ1!|p|~~}8n]{N}xz 0z|0 "N8Ń-7aRIH@mv3SPl8C֘/dz8q1\:K@);;s%tMNusnƀp QKeo@tdfR$,fF**i<[q6#R Y̏AgfR`^maDP<~_43ѳүVl.?M< ,vWn_轡)G;BsC;gI0A֎_hl뷫8+Ɋ,.GRCݴnݽKrnڅODf,TC0s;Rd2WqwR.׿L;A19Hz=ٜ{`bfݳR$y+(| #%ѫT$² ,Z:ya B>ˬUyd'/~T﫿3K-;a<OZ0)h~7D$nIu޼1:\Y<61$|Dܯ$,QE0>R֠/$ЫY^ˑr(w/L& dBn2m붷ƚ/s]2#d\rɥXAX$̪W=u!] Vn,]\wRxto6B~BJ2wr`([s{qI k;qCNU,^J`%՜U y d& 6 *-..| m4j<#sݛ{)lso5$%KK$7r2ҬQD5c$tRThAXI^Nrnsss{{; G.]>L4YԨK)fi2N-irPv&f* L skA@/FrX8;{| O$ c/v5UOoH.}A [7n',,>7ٙ( ^Wk >D2?+}{nyDhY̧\k=2 lfhi9Wo0n :شfl/qG]S[6K<:ً /9/ TJ_vvv\2012^OK.Vή2ltu_h) ' 1fT':cݥG}lBԤGD߬\*4Hi|D#%KŇЧ.}rlF;zKVliʮa%5 >Q] "9PJ&K I~ C7o |[<0f8u}m<ЛS/_|⥇:9^<kPnڗ6i2bA؛1\]K)NB9{7Li9॔&%tRs7rdpR%\$.Gԧ%X\H1'f%U%Yk,&(Эx13˦W33#l0K$35B]=w>*>r> ]M=}ׂ(xd+Rm`WX8 Uf-:/ pݛ\]+\2|躏Lw YKg}f/C3.--=p|_7NY}:_getJƮsfpZFXbFxq9h@>9;t!x%4Dq\r gtd/ŋn:NM3.dtI"(ŀJ)mM'ӮKZQ]+^:l}X7(gO 3=)8s1 txgHОyn{ I- ?S[TfiyQ WNҼ<-sC~Ϫq(CR Trwʊdip d m0.0yDi,3siFTȦFp+)zAEVV XJٿ!`!/]}X-莊D+ =T[<>< __o~kuy~_=~G矿WO_3un:R Wke3wδO@b9,0+FH@F+Bm;U 8c uF.kH_ƃ1#{D"$Xv}V{@2f[0"T$,yd/LJ7%jrmE<~!f.wy^5Ӣ&޻]a1Z߷}}c9JP %mRpB &TG+5jHu( PHiB*IE` 6?ml{}}گok1ǘsZ܇ulK>[WWZcǨ۴o8qM<=l)B*dqАiK.?e%ϓ9=㦼u#e|~~}{?~6W{;[w߸qwyG EGw2zp* IDATqttu]۶z>>*3u]g%U(҃@ۍQ i?e7Tr^Tkf[IXm͍Q*iՁIz |͎Dσ`.:!KeP5`:mt'bfTwFO% `7CQÒ4Es3I 2;$c}jnXABDŽr)6TؤO>GQL^yIj tT!qt7z>wr~*4S &JC>Yu=7K_|/s[oG_?ݽC?WcӟƷO}7??WaCSG'B~S ;jܧ+@Df: ,|_n3Oد~7W'kׅ+O3oi!NbN%B*{#LU#U#E"SH!"2 OFhK߱^2L3Jo7]0PiAD D@R,hO_W3*ut_vTi SQW1k~4;Ybt|V-OkNU#h|`'e Whfޮ禵j3K}[@M]=ac{H& Roa۪X~z___o@_;??y̢Q3(3`H@U+2+3I V&aР!a&aD"aV$gI9@MLs{S;'ዔWm.SO V7vҽ᫃G:F**`8JMB[#t;ke\Y*W>IjuU5anwhU M(%h<U~R]#qZ"ҒLMKyv}NAs{_ſM\1N4`Dtl%`&{mc-R2jK 3kZA`ce{%†8kL2jAltvH$  HQMkq5As"$1gB  h,b-Xڰ(vBqP a.q )]d8UrJ9kЧTMԙ?bh8s[w;t}*Og7;,BAYJzόm?*Mŀ ޞKU (R#P$# 4}Q%&&ʇ5떇͜ # > ȃ_"Br,a%%"∰e]_"C)c%{?h}jsIvMHIrÎd~Ml+Z+4DTʴ'0qz3ޜlLƁWND4!yGOFŰ(UrK TBCD6^3  q2v.kJirNKSD7eeb61b6ᵳz bsD L'qxKE!LBC*06KeSB8J6L -J$yYr)tyj8 <*[kO##~fHMUf1Bh2O:1AʔK5+ܭ{N+O$)HFW+P ~#4M'ocr/J0CL䬩9FYE1״BQrH˾pVyo^xCm s<ȼ(Xʏ9PvUɟ÷e$nVCsea@"QU섯DLV&öS q`뽋޷N^KuM !_ tZs>hJ 9' !yd=]nCaiDݙCaz|b @)dvTZT36@3竑@x~r)³L[zZyz :_.y(3S!M̩Ov#}Xf֬5$m}0,D aٮxKHDa ,FU렬4Ɉy F-s8y)-*EZHI.[;I*ZY'/{vq/L&I)mcm<3B8*ي'(*|xC~f?Bfm&@m|`+;E1sBCKr#;Vu~H_foNݓ18m0YuPXi80%zXgh?M L89=gQ~3&0%=/ Hrsc{f?^ PAh}]}X*M`3*4M5@.0S=4ú`VSwօ*ĈŹ#%2 i/N2DH]y?7_Ky:^OSal~8|U话h(EYN+&,]3En&1Nh%R3Gdwo HZd9.ºJKqԷaҽREBy`c->*G}aYgW%`)%~C*/\nIP b|1"k8FIUXNIUt('M++%*>Bfti<>H_Z?u~{u…47r& ŋ^uwLiieflv8-+D(;sQaJ>TOM [Ag2JҸqI*R">2t?86R0*MpU%ZEьs!H"(k (+-q4Wf]iֶƷƐ ~fo%={<]LܒVQE4XQ 7TCOUUBlYͧPch,C{&e 83VIRƤ"bR*WY͖7mJpz߃TPk$` .tঐ Oπe(&xCPLuPbZ[SC}Cb!ۛV(vJ'[eZjoD@Pu6($%MbUҾt c~#!4aa  *$ӱ LaH{D+ .l3Z.s!he8[߉@zGI(+=f\CX)٠U ^U/__5X%98LEUqPD\X&ܩӐ(:ǯфj'" I%smjAn\$EʼB(F"XS N;wOբVju|ӟY'љM`Bsg2E$2RaHV~aZ TYDl> YƘXIMX8%&EN7TϪ5%~篋JGH0."CS!vpQG{[ G'v^wVHIZm$)k3V#F ٌ~/uGF"ZT:8ߘEBP>}|Rw`^f@&k*c!N𩃃G5^66~cxfbHV &)f\?IؔiB4H3{;^}gQ||dr.yg{K_. BDv׋KvWn9yj{u "YYgqaXKDDJE4%7CXClUcY`șom2>Uә^C A,`8`gm>ɰr6"q"RJ 6'21;zpc2vl~aKR<[F4הIJfkX/ڜ>ADgw/]tKWn]hUDu{5 L Yl٥UtJ<<8XgܿsÓ &L7'\z!`m2p#|+!eG!I\u)4޶*:VrS5-^֏!7'}i2 HhEǙ}˔jD}6 ptút:Z]ïkF˞憎U7n:%z\̙q:5![yٳyRH.ɫOu?q#.KDTD&!Jc_~w.fj@a^#fWo, X0 J˓%-7ݝׯ_u3Wo4.j+|UmT1ʍBb֋#!; *;n> `1 Ә3LbB@vJ.J(n B,uxL.Zq c'L0(9IP)Kf$Ҙ=y[Qi VR?m}Z܄ŴLT)ue#YQ@/ZfA{/T[Ÿb^G9sK<8P[uΊ t6 ξ~mj" CGw]qur\(Pˍ5/$;vqfBXP0vm[ˍW^qp?͑H\j/{KoL;#_wyibWEY%kH3|S1 i0K9(稨}$/+ˏ+H͏[ Y !0'%2~9>5w"0Q gej?Ȍ\1`&% 22S*%{I՘m4֫R2D$ԉYexcx_n篼[Ⱥzo{c~j |Jy*w=v xsWMlGT!R,ŕrʕΜ J-^x֍;tO=wnk{KEbn}~uygWxEQ酘i7do/nK=>oj-Cn՘XU (u2e6ʹ7j) Һ_̤S;ckvO,S5I: ٦Ɍ>l*Qݺm)  !BT{ L*?U-3D1`o }KBŬFr\W5>u7K/_]{vzZ5w̎5!Ç}b: }[M{G.]:lH0sGM- "MӰ"?iz+Gfcstk/wzQt]7^s6"[wd^w1ClonMD*Rm!c.ITa~j62+2xT0@vXMaRJ8t(O;OD#13mbl}H&_әȯ  Mj"(ϭ+Z^ Fߟd]yi(3d") ~w7#_ֹ̹K?xp]ӿOOKݏ<3>{ttT^ouΟ?#W Ԑz3ђYe;6!k&bn8w…KQ IDATwUC۷ж>@QI*e;" y[wV?Zr ΠfjHXc/ momCqx1F21HcFGSd(upf Ѹ!LcY&~e*F>da'Ns i*"Z41UV3"OGwe1O:+m͉"+R=q'r?3]#Ww~?O^? .< /gS|eB׺\!44$2a4CSQm,7ϟE'~cos4 gܹ`[P4!}B-.<On܀Ⱥ7|$}*}KS"pw >^8HJK{STS]۸jCYhʇ-;5qэ\suM.Q,N: xpp#9~޲e8Fr1hd M\GhmAQUc-퍭m]I'M5m(X hDJȠK!_= I/>ͧ>'}߷m \̟,J\_r-SQ5 rRPDUK%a%4I [3R;H/˒NHGC'}%M1n\@hB$㚴N 0c:疢-3xtr-P5ԪBc֥G62(1fM+BP<l\mW<3EЃ Ė@ 2T4#hi:@oT9[vSNPtP^ҫ??|z4`[]r[ gH瞽vrܸk$EӋX L|d%Jz`b;k紐D.:B)%2.:wILS*OSjEuqNfg]&b1GPs>PʁUP>sCswFA= _1H gPTq~Dv BKy{weoٝf~嗙PΝ;:::w7n?/WjZfyș4 $ck9bkI-v*k.hCxcA-< `cn[]]吧KE|2 76PȢeyE"{[EK1{㵇fZu)AJȣ_-ᩬڶ !`Lkw8Q*N{wRlSE(aDudtfj53FeNG9o )T*QŲ8ˆ3%nK<:C}蛪~seŧ/V{7/'x?S …<>h͛7;a?xڵxo> JY%37 N("^31Q,7vvxr,$ē/_MD"i`ޜӉJhD$ C)$vq mŃ*4jXvǂ(zGǥSI oj+Qa XT:ā#97D(+9 *ِ8sb"/?ELf}K@ŞVN׬Sqa"Ul1{M[G,y|{EwOO|:»߼yk!}\2ԩ4xUC8g`n瞓k0r%A!%JX.`^$0QZ 6{0mkZ/w>m !f,B p:mnnHCˆQ6feؓ! 4\c\5a}OSde)#`ێr{kodʂelig{s٨l ptXVJJzиԫ6dh CkP64l"]U A4gϾlV ^?Fy nTD"-X*n^Ψ})d&JDZ}UOE|N닷?w^etӍ2:*s*SM$!̼|ʉ~%c[ÐW\m" vl ն]lnnonn>&D"swYIɌ8 +]WwШºElaܱ͡׫.4MacŘ؏=z:؛qG=5J,qҖÜCc fS>5/+] "Mɥl>yXzګ;@s_` bI˾rI"ܤaWuaRk, x8ȼjƷ7\3O3__ǫ{kh~X ٿz^za"s̜+ Mkږotl?ti nX#)$5u6 t}_>FE#A tmYѴҭ6۰f-@,B tLUHhH#9#FڪԖ E|-(Q PUq#)%ZhظB>3CYB&yWrp-=Fy¶O ,dT҉p SDT;?,/L1uHf&!H2qH{ m0'9 Ծh@3r:fpYIU%n5]jQMd_iOrV£@}#W\rͨ䨯IߣaMSF*!b)tQ vo\,_T5OmkA4CIc)m{1x `"дs?yѯpmsPL ( WWظo /nsj1=Qq<ݻEPՍ%}& ]ЈJӨ/q&Y5N'4]$Č֕Eq dg8Ps Mުa`3:vW:u->&~ [(}XekWc;VOdJ&W{*U7!O7 َՕĬ `Iv;svytp/IH`M9L}Mg~\ vxcb8zNk5ױYŮ"mၝ5Zj !vIb &b76A`p& VĪ85쒙SGMVZeKM?ԔcԉzTcKܻթ=Yu 7u1k+JGσΫ6Җ_PgQȉdS=-~-p IȅQÁQ !i;Vy\lmnNľW<6l5IvHӗfJڳ !v+B STHe3KU&i4cEolllk`nmQ}4LyT96 ىQJKvLQ_̊?|9LrzVS@wTJveԡI FF48Nn7hU*4N\B3622Nun@2FiMۊi-e|l%RbÝUz:']<98w~owo vhE]$GED4+B$DBt5 B0*H (I%BQFhu5[ shl#B-x=`.D.;oCXTlWX9|Wә-VR>U=KilTEm 4vw|S@wZzElUӼ5ӂbV8zdOFaPuԩ_t 0k1\_"n:>XI ҭVnnݼģaĖ59c ,;AIXt|HzYA@+F[7@SäP#DP$(>'APӖ$o̟eUkaQTK@hਞj*\`@/ Ya4\&#s^]\Y%a:\]dĒxA +@瞞+D%XD$:*_+L̩ $مx]{.o݌~|l‰y`j~I4U04mb">1%F֓;TAг`e&/\GmYgvʨ=^-BeHJW/•1d͙g\ihw(Z*XT>{n+cz8H3AR&Ԭrq>kij2[tK<שW*ri-OD#-(y%4m6#u;ǫnm %MvZ?%V`F jy':306jn<"l ["DQJh)*YF hi[H37RX*@yIMe% EI(@%Pev Xu<@UC'/!M$D$DdnGFkU"N2p0gY=f>YܙtYB55ξETek!2Xʪ;JYY).`eUHY59f2rYNt &gmQDHbD$^>NC"d^'USl)(~ 'M?">5#{`~ d*HT1!Q-:y8NKmIݯSQe'2NvCeǙr0yوH6 !昢)cv#;ݦxqd%eW,%!XbIi5LCKK'/CjbrJqbpU~99U|;!lfJhD'$jV%+Ň CH ,2-~%&UT ϧ9*M樄l9yA+ґLSHϯ\>wuR&")W#Q"Q$ Ѐb\٦RQp7zgMr-s5/̭UccxZ# ֺ%["(ԖͼK>Bg SiJHUe8 ˚za.aaAp2 @y4S1+ʷ]1fESXU6rI8S|*Oc+9YS&3ke6qR)7~:}⛸2>d8Yq 6GzۆUtut۰IG DB0Q0ڳIO? 4)yfI]׊\CEGd#ܩL[i?Pި?PӺտM.L3.39D{rܸg9\Ӝm<7gN bJ,؏xR`Ǖ5ϳ4._|giŎJߛ[GτYHxJsK)D 1,wDqY(x\/x嫨̼D҂Ӡ˦qh5WǾm}/]]h F;=*!DV"m46JG 85d &\r_(xGqfS;Lt2= *JZ,Zsb]Bqi4ا̒mE`9W]+Yg eP Ccng^Fk3{ٶY⹒myd{)s{[ ֔wo_վNFUĮKGMbjDo6>Gxl J@$4 D(2@AGUĵ XSvJ#.ѐh6wg? 7g8PL8S"&v9XC3$0\V'H*\7J%S)=P.MݔYK}‚gQ=<ѻgYQ?d#L%Nϭb0wǧ^ӦqUpGvU5j;\**° >>}-o6t"A`SԳ6m` fDN Sd V慳}+?z6U@B#2Zav~lfkq5}Ar$YG0&|hku`gMYt 2-Rg'؏Ƃ!iT iD`W / Ubn IDATP3fS,gԎ2:ܯSwS;"ȭ{]cʩl;ˢvlĨhF Mz~ϞpqII1Y<*YAj hv! JHޜM>PڮBJKjYiE6~O[-!p1̷.%0@$0K.ibJANxs}76P,HZ&@@)u@2\RDDE[Ћ$m5Й&H RU4i\u(CE dq筞vnu{D'f#IQF'A7e!㶺M4㇂n%((_j%Qb٠(kb,IZz D!#w*)B!Ɔ%iW`@-5x~%p02M{K52Ay*mT@P0&~!p2!&!@RXѨB 8Rp=iLamRn=Y:u7b?rgt ?@VX2E]ߑf̳_|O0@}hsaOg>SҒ], c(2"ГFZ" !D@Xykl;;;bvh+?iIFq`{`UL Ee"vUt-bm_^Ab򧓢 ˣ+4ksJsM9t A ]9hwP(3f4!0.5FǒVdCLZ8#ꘘ2x>o˜ݯSsuG%hM#W"7m:lO=ݍ+O^Un4W&KZR V, ■L{b}DcW]wHJDIzXfprF jNF$(n 3uR^HFSES ĉ Q?9Dy'2vApQ9ݧ)^WcfM*eBEtByVVw 2CcqOS%N ǼTD*n; b7Ѳc1B]qh~'h ^1(XH sXAJK&(r51CVү(6JĹN%D&[*m mE4BP(ŸV=32GAU" 4MC uԳ鮪TDs(Z^[aS㷩 ]HO{^o:{7`FDfw6oֽo\5AZH^LUOA}Ej|d~1o` ѯ*J p<<1uO*{W>=s&u]gM#A  !X/L&uD~C6+<5 yP[)q^R`Ꙗ5kBqVD" 0X-tyFȭ*T'ݪi,U\2 Ee"7ezDD%QESUfwUj^Q{C)l/$IeVUד8EPo)g{W$r0s/dث !Q)%c1P nAP5b;AH ̶v&ҩuU RE3<m6[8 U;fݯSOM& =FA6eBR̜5FP%Oj/qAY6-o~׿#5JJD@Fʹ=P`07 -6/AW{^5ptD%aW!B{0JT Thԡt]]sM5NYMQ/چh,~|@R*$F#CXѯ>.yi@.ש:8(CL f R0p=: 9Dalvoo޾~+/[r+!hb&=j,KQm$|=Q4$:@ n'' 1ܾ}_ON,)߄x@^ZS~.3]"L f+I:\R"b!=CuumZQX SJCҺLOjtCcя`%a+9Ozm埭9(tWpZ)(@,"BSZ~GET>D!*y"aܾpj%,vz~o}T;QS"&e4iYd^l\JzJd j}B$ʢAO?*ƮiX+XQKU0wE^~9/:Mh;]3DN0:-_S "Q4UVpVR F͈WߛLٳ7́|T$Zdz4?fi,yt(MѨ3zXYfq{g3&^cuwƫS6ϝGoDT)J 8c* Q"qH>EͭqT _7yW>7]7]mX"4B@> Z?O[*l/ פ^I JDg'> XؾFШ)͘qCu?) 6lJVkBsB6~ ceLJD2#'kqVRwC0߫@ Lk!lerNs4kܬ0)5yPVhS'I$KQQe&{I)щU톩<^]}\b|zk# hЦF_Gg8Q{rTB@wNnܺq6͝S_ `-t4&hg|]IR=œ_|ዿ;8<FOb]4B4 ݍG+8w%*U.|~ 3e0%K#T{~v3vY3Y&'&jP 5`5 { Kl~4 B4 ( 3˭".Q<0G t!,-ME8*2t0,d-tI2SoyGΝ;5^|}>PHvɘ8yd=œ[ lmm߹c86KQ|ں*"53,VP5b>>ݼynm홁ÞAEci-U- PD(nn+NlO:]|tb]9neߴZF6]a+ߥCuͰgbI"u4Cs;Ұv:pyP)ʋA8`$DLǿ[ʤcx쪳5 ZGy E'azSHڔ3e٠H:a sK@ab3 !9)DsgoE))*7Uh,jVipL/$&} (gn?c1Ir+? ,9@i@߫!#x% G_muI66և`|Ơ"縖O+_iSM0[ X bjϞ{ǞƵqhwwdssR}:^om.MoY8T2׸Ҭ! ꡂj;ydWy'-f^--`ʹݶgbe&'{b?f&趧3c`+4f3lE @TkWosO* 0w!^˗y=򕯊0TL3Kڕ}iN|(p"Tf>\c4C}uYr0xy=I{1lUxv6H43_ T肙4-Eh+5gҢa'U6I|k5g1[禋T=Rz૯8u_৫KAbl[cs[{eiUa`@I))b$OɃڑWƅ ɈtE,7Vl<5\^q1%0& oy}Љ>S_=ODzQLzp1Ҡfz K|:-]*N㣗ߕEwνBLuD?GE$¢xk3Jj@(y򧪂hg#E7J="ȑ+'g'xi3L[Ub V꾵)a=UҨ݇$Іi@3ZNj,@܏,pY"$KȯN5Bڭ]%"GdZr2S(sѰs$yf9%@S;pq]*5ȋ¼1_49 7Se=~&wu竞>NWgU;nes=鿂8C'Y:LN}qx(1O ~: BdG`ڔ(s-4]Qҥ?w5Q`VVg|ͱ!OCAA",iVؗEobscHf-)L3t^TfZ] W63qZçSů }kNy_'Nxo~߿5zϞ8zّK?BFhS'#/v`̏ۗrssSܫq֥l/)Ԓ.EۓH_Ҋy꾃b$ M4r өUSʔV-D Dʨd@j vlu g9032UR΁^9s2F@PʋD PŒJje0GB.FJ@ Y bBV)tQӗ'&Q`j.gn Ȁ,b$-dBCB弋Q?_@fF`׼X5DRN޳OD=4sYy)2BU"+H\ȧϧWg>O痗vg<3v={5w 7<`ss^ڹ EUD}t!*++؁[ZZ?kzeee>Gtgg裝 qiy D*j y2XY^:wd:FPuƲhT5J`QiBx hniO&ڰiq0N%5Yf35\*u@Y^TcXIRLV |l鯈m^f Me <>q };;!{#G9m??>KtsBrDDT ߽[Uٳm^ؼ9|xowޛ~3Tӟ>||y27ډS/?oСGQQڞ՛<[L \zS9ؤcz6Os.L+ 8lAΟ;um&JA*ddzCWr P8HSK+KQ%&>rw BB K^q7JRJ+еPȡ :ð)x*.`QY=9-7ߥkÎ`j԰ BʜǮ (01N]~fa]zp:s{Y\8ͨ”[|w}~տW??;?ݢљߊ;yuEp.--eGsϗvw>2"o/?8qq;7ÃgΜw%/mwv[D?/{ %@CЛO9cH]l˯jR[@`Z62onNvD(?@cmϞ9fdtr.Ϳ lՕe?R1! A r`9-kjYzW΀{ƼUԥ)jQ*ۂl_>9ߕǩj`?Cl,y_MH+\k֒,ׯVzpv;h3ghx:g>uɼX"fɟ;s00w7^ 4ϽF"?—(U_CKx_J[4r?KK;v4gFĄD8gUy"^+"(BWc+T7+O\v3)IƷ- X=6!3z쥯 H:mOG; Aadͬ!05c8w^EP1n{g fFFhjgϭ.߿ nB(80sjO#9Nff"6c+0yݖ'MYqX+?`e4ҹXOfQ3v : ̫|:GCk "BDF IDATg2=v\&PzYZX t:G_R}#Kčo>0cgg]w4/M@ET'~^;k"jB1{cHHL b9[fxuUO{T "Hnڍ3T/M9loB5BE*θ+ybYfMCF@3JZOfX)Ma!R 3t-yU^Ωڢʯ㲋z% 0;10Fȍ7Vlnn_^:h]QL}ou3F=G\ SbE;apqo &d,"Fɸk3D05USxc tGSDlhƅ+ۻE0q "^;vhݴb"0m$ˀCotTM|BE@҄䎎FZ1\OzbT:fi3a9QTHLPːSCM9AGn'^W~\2jΔ+dn^=o)^;ylf>cr2\ #ԭ: ?[o_D54(?ԾcCpbI<ҥC>)(m4F&KBY"0R@4U0%b"5%QcNڱ9~(KDDX"iXO< Hb`< M,(kdw_6nGJlPa'Tك@DPEMMMsƝJKbC:QU$DQ0D#L'$3J!vXCl HDzc^,9ܱLKVw@LBܬ‘Q^F$4@!bZyKY_P}OEs2 j{WJRir!6$raXvDIdD[H̭ %.!fQeR rVdُ0MUձ%ǩ_v`j2]8wp+:xޯׄ=mͭ`~i|e xOb!'9Z4P惖8Hmۊ hNsȭdfh"ڶq:~_E 5k ^[X2j0>wL)  F]Dd%[T#e(b*M DD4D@5bÉ >U$2TjF:mZ-'f0YGRKS^1m=0GUd&Xce&a1Oi'i` ɫ*Y -')A+maVcsPwU@Ma-YCf3k`=ӌ2Td1*">jơUaw.3igfqjyϽi2( y| dknCH` ZW(J F'&K-1D Dz/?0. ؊L6_?ra K"0x p:nn9(M D$cmciBg(xp^(HȜqk-LtAڨ]G^3ns;@2yOSIgkr\u>UʗNX.*{&.jB=+g_'D92X ^pkVakψ|!Z`u+xj\jiU(q6RcΊp꾦i7DF伦?8VzySR1'wžxhE % M-2/im+*qnԣO^uQiM F/6k(`+SncǮ\ 50.ne*kZ`ń='k&D́bW\DT5Ąȥ ]֐rd*Q!y'ZEKf;a茤fj7tz8MDɋ gk6`xYB4\3x-YW&^{і3J?'Qzk$ T_I)c;0w$_z1}tY7.`)X!#Wbg$4;J 3 TTPl@iw'TP(twȃ_?tpiy}/~G&BPb6E"'N>uawk :lZH<8؃ed"E({s'`I\&,Ϊi۶Ldhb'Bgy kŐs&"E_IUԛYF!T)l%ҴTUfT |tNYX+垥:{:#G:u& bD+ ePA$_B*$Pܡv{Ԏ*rIǸ|ٟ>5@`TYUCCs7C$\D]wr΄e>CU$ }g&Y ]ETp"qyϪأ'_u՞`; 2sK` mcCEۣҽgNܷ{f 2$q ЪM[DoY)C04ghUA@E@XO7ՔDE$ Q7;}Zp)$Ylȵ^.k9JfQUE ./S.vh9l $y6!ۈo{rbEQ j&l:] *LWIX7N(l^ ^4”x._ʢv#C@dx Qj]Tr  SCS0ư`@(iR}4SH]&⩧NEd@$A5 w%gMyG}F6Uf,h;mGZD2!FTLD[Afb5P4c0 ZX 3_'Yʾ;Yb9^ ''P3#H&4X͝ /eYEA[;={sS[~#o>|}䙼^Lь!rV+@F o9ꨡ)1CbU2M索:67/L&(Ïo4kd :E2u@v…h4L66wvwQ98V$v#* υ 4Ә$.-.䄓,2E7\j6MS23}ygSf u7]{,z}NgqU hͥ3j̝jIZ^+1_mG<c_rGKD  !f.Qih3=^=3L|&go+_҇?2 }ͭ x#5gMƓ}ߵpi7Ƚ~e{g{ڶ?ǟG?vձc|K?>t?Oll\]wݟ뮼}Ǐ?W7?O~믻k8DֿΝ;'޵GxC۷ۇ%(&S,"X@Փ KɬXVںF4 dTQ=M{;| $(1N&oLB(b*iH3t$ٯ#s6<2!2̌UBCqNXyf~9J[zSD̥TЬjgJٖ6;\AB}sn:yԙgugcܿo?owg:<}կzΟ}S~/}\/| [wD4N9sg>wNjoW_ݵE#7NsW}Gī]yݵN~7}?p_[z;w~4o5ߛ}"dCP*=eeo1Hb`^DhĴ5m͢Yw0U6i <ǟ`(- Y45$ g:>ivEhTzJTJv%Rw!EIY$R'hO4Ęz x1MXP Ҳ5¨{CC=UY]\/t `lѪSI>[0.UbYa]"񺡼K$Zt t"Bʆ*_)PY9[޹ɸ7E{KqBo1={u'wpfG/;r_ǟ?AHϹ|owGexzW_uռ#cǮX]Y9~77~3.\\YY9tM7>{gwO~nG>?{}āنY !Y`g1NScZ=ϟlNt6[R!Vń@R`Ҷ1xw0ǿ-74AC;_—F;tڶ`(CjJP%0+RIqWY!*1֊?+wSAg| zBZ`)}O-snA~ŠZ|qZzV+Z]a'Wéǣ{uKd#ZfE}cj%7C<ג+DVujY/gY䩓tc˩coA|Pt0Zky*Byq)Hk꫏!$Jڞֈ O8}/{}+#G5{<|?/֋Wk~#߷oyy]~ߧ>KK5Dxp}ˎ|.- Ǔɴm?}Ǿ8֪E@ARDJ쩄mV Wio R?7=zUg  ˃ 0ޙ=)B2ʗ%mtBH;OAAc6%U1d<ؓ1t:{P$%Fh%Q*[+vL\\܄\f iB(3zrYl=NbT 0g_ڽ㹌3SRJ8/v 1Ms1 G|Ƈ4#YSym'eFa}#]1e3"ԫұZyMO>3'UGۻw7;lnmؿggg4<;XZZZ]]'kk{Dd2s=w>maຊ>sVD\L++z?Ϟ=~`2j1ظoxD`sss߾}Oc+lN3Mu&ii%K?Dvv\]^֡Uk{-%X;0^5ҧ%T}׆~;\*E~:޵vBemiiʬ΁cW=㟿狇|g z!AlBA/u0ÌNʾ_vZ0R24]Y޹p&B3 F4T\! iu 0BR0l)4҈IG}/fe` Mp旾m2O _Ud,B`@D<`rߟ롊$͑LDM',Yr䒄feTK%sU@N$&NVy8CBV( 7ՉQ :˒Sn'D T3F40j(Q Jfͦ>bs qi_ç& xSH0g7n%{Ĵ!:A0$tvT%uv"Wa:5Yg$kf00sg:z%6Oӟqw|MB;":} _$ ()!Qqkˀ$eŰBlB-a@iA ۨ(hY`fDt0!ph&`8qC_y9B؂/\]WU,wMYI')Q%@" ҼL6WzJ\.`Q%՜wk%ZQf T~PINn/THH@$pfʾ92Px[*hEI٤!X"W5X h?/WTt=;י€f JUDE7pX S(H-{dA+γ[ial۱Nas.3Sa[PfM^/YںpS0IILK% ~E`cyj:73d2mf0hOC=;ȞDۙX, ȰL]}C5~Ë͚1ڌȜ7QUeQ&@ DwT< Bhc}N PР03¯70G!)=2[7͎# 99 }G~}s%t &FfY+wvx\FFB-Y&Ll`ng(:Iǚ鈣| *z4,'9ufaU9dUWw1ֻuǬ&*UK%V% f(B3UF pk>}[OI9VAL#UY.ڷ:5[/ABV.Ɩ|waI G;&B0TlW%Fw)]++1qѷH%_{V :+MdtxsH @H"Jy$"0e$s'@^;s NvDdT!$j--K M۶?w!p`6L-ƸSx9 R3& Vn( O:_UT,r`Tiqb)FlG:2.b (FcbIEuRbA*T#3gT@ 1@NL\U hڐ2DȆ "Q^VY6v C'CH5T1;!cr(`VM 4,)ZBTQi┚J:`!CB~Q3Aָ8J,!}:xXQҟ@FNvv@ Tٽp.2eax9!1).l3tL431f搵DM.Ap-@- K)f.kkēO=7][!cVsOddHɹgP5,dt2CsbM LL)xskkD) uy532_ɾ$#7p|HP9с}/%xݟeRQ>9eƙz3gwL(jHF`0 ;E#Q ,R4h `sb1#C& TPd$+"n&o@0a)` 0ڲ!rMFWy(RhW3fv["q8R3)o:&&0Du:'%[od11cbvd|f]zVgUOUYӸҪv{gĩ8@΀|諫+W_}#]vSk$`괇MP:9V:#Kv/LB0 MQ%jb 0@(#ZIȎ&6p·9A7bH@I+ȋ<"0ZKQ޽/zzFc#|}w&J<@16xJ&f 92 \l+ s/A&q Dda2+x?#mIMCĐj+&4!iBcę!ӈ!4D؄&HX10i sYOA i\8˝f& :&2^@".!L]cfE:P 9{9p+Z`n`{8tRoc "Y!/PS"g?o뮽S\}w݆H f%10W{YK s)C`a@#f%$LS(E SAU !zI8CUQwrhI-d5BlV/xm׿&jASCh(-Ufg dZ٤jHN $dbQ@;}13D-tS 72bLW7$cL3GqQB i=Rnz9Ae#2*j(/)-^Ky( [F@ާii;V(J S ?@Q|.(Na,`Ӏ醡Ppx=kk{ϱkKAr(f !QP 7 X,P 轺^s_sݾI)93$J)l4RHy1ۻ"! ! aחAV R1Ĭ z4(1̡|A[!q-[@@BD+20bZbMl/s&]Z\R:, T^4ʆ #UTUVf^Ie٧/C?KʋzWlbόw?O&q= ێWͭtkk$VO.x+{ekkkyy9/ufn9iWJfPqMfHl xskwi"C QϹlгo㍧N9عs$NJ$$i3;g/ +2jj"0y.&dJ c-WXFh>|ٕʗ9n'&Fy;@kWc(3sqoB]tҾS`\!2."66AZi}rw?/UD:찢ogIaQ4.O raW t>~w{=|'|'=>?cv⩓'虿Kz=_ꟷwv]>=}{]u9ȍ~Շn8vcUGe88#{/?XkG]_;v+G]_W]vbF ` &1q'Q +hX]9ru{xk^?[^xّkk{B3$(Ć C &<)CF (%b,;^;^"-BԬٷ^NYwm9N]xXFAeQY|DYQvF tLf2 iSd0di:iӖpr,1~/$nӁ@vSUSd7I)+Leee w+I!u6BmK"!pmᡫz ?{gtdɤ1jQʩ (NU:4dP]n%4ayil"}ShE#JHD6;;@"4׬mX)_I md=gBV:=QC(f/lq6' vQW$`q_R+Nq &_0ȴjTU}F#%;#{fqfm*矀Umf!ο2.}%*F?wk1oF-2 gGY &$\IU$v4`>qmPU&0YD`v{yp@4*2‹!*âJX%)hH>@G`Шj+"ظk0 cSiלڐI۶+t3Ux d0`d'F&.!eqҐbĀ3EB9J6"ʾ8^yj;uP{ok TOwko e1ڢM n}{gNn1NVD)] oG #dgG;h6O|}gƣIۊ f#X L 2lp@>׿aPpK^4JŏuW]{u;; ǸحDQnLF"DZ1lef#Ա/!Qm|ڡۄV424 -,ﳩDE4ƄuKzS7wlc\o,gQ, rBh4 6Cϛ" [~V>0?[u CZHũؖ8:W{;j6LC0.8@ iDU;qRF P`aհF @&p TfSNCp5i8*1YYg䣏/=mU 0mj(" k1URc*2@{xk;* DB ig,4R 0 E%Ƹ]vgp}֊M-uAh~ASЩBç%m,+=ROX t!h<+s7->{_ DF)%`Jj9D+ KL娬1jP)v(2L1ԪUJRFD}9g9Zk^s_5ʄvfD^(R_V ` +]71&S Up.+[hޭJ#{)۪AM5g^5/9bN!D\ #¥V(łey:7Q5anaÊ=vR4:^v3=y]_;̑NE+b<Ú %W\u8 S>1nm+Vi0]AHP FA5F"ol@qIDNV.;n<"B=Ph )VX9DDB]JN.;do Θt 7yݝLT&&r='NX{ ζjJRK&F3rŒ<9r ?_W@ tz$1JhE,K,`p4A ac#Q-p4?cJFLQ9+\|h=w|{mlr SږVA(D "E3ӽyիS2=)l1Xl#Dc2D\;Tswj! @@7G I & zީzh 4vLH)]^(T:@wQS(¸(T) _K0 ,-B:1 V%sBTd$ c H )vګlȲapRP~Q^|+ 9(͜)2`V3w$ZC0qhBXE/\*(.Qڊ邈3;vo|kw,[em͔0eQJh%S̎^˯Vw-`х!J %0,Q =HHa֟م }.\(j"X!,\4LTBM 2ُX&)C 4֯UiD A 2 Z|괻RAhWXXdA`%|1Z-@X_J%ci\~?^qjeKbE5cxZQV ;n$6]D(Xdb#R^D9̀Zi(yu/h;̑`t:SK_~E/̈(I H1ܳF)2h :P$Vx'1뢁s&n@( v~HY5* !MeI 'ٹ(5JSt&~'pmŧToį_oUk8~C]yԖ$X 4;U,F[|*l@$ >BK%Ri)beB[c._Rs5DY*{X@|ͮ#P6~QW=Q}\$J+ IDAT^ r[CbnKQqj az{S8 D Q. ѪS. ޙ}m2)ݙ6PcCmO>1!*^0)!J禧yQuܡzf;=.ӯSR*]I(D, K ZH4%){G#aH$j]wt2[I@%t|QTPBHDL%J!?#9-WUdA׍?* !Ѯ`%B$iq*(bU"+(QqaJ,e{WLstcp qIH1 R:)TEGtJ􎩅=;v,]޻pы1sPH6 Si,0ggH9O4[Y!bK1"BP`]`ARɦF҇ H)҅К+9f(a*DPVARA4)f8W"y VnWK'kщzA* r@6T5#hm$JRҾ&Kc+ޝ?Ph%pN*8b;NM‰yA9|t$ʦxjJwz$}1/8]9тĔV5 "Y00&UMLR@P)hSaM&5&a :3PH+"1ZI]u-NhTtS-y1q2 P =~ܶ ;L:5 dtӳA8;(ԻaO#Y yYh~w"̆4v\D(י>-.q_t 1وL#u S7vρ6&1R*e3(IB6H#,,,Od\E!dV`N7ku*0JkQ DQZP"á2 -ɦm:;!( K.@tAሑrHBQ3q.0=0i2EٓS;Rܳ12͸d15 Uq}(q}Bu%+p'G385PO!Ed\53uK RjzJOklrZ΅. C*z`ZD(€0f!UB k hHvtH4k_RgYL0 ?DJo*AQAh4 3@ahCl$Ī1` Zj~+H@<"\z#\]G ě*qsc&*UB:ݾ|CQI'SHh\(oK9A zGt$$dJ *sf +%HdJOOk`g]B+c,,RDk R13RvIIo:DD$B4tA=pǻXÈ3 ج0̪JP)ʐ-(z@C)<#nL.=No㓔έ8OsΧ#1 *R'0uHQD9dqD'1]y#2?C3$ *UeB0mǩ%F"lsB<+06+ff>m:.lPaɀEHC w>%wA]M@ %dҁY;m0Mv"Ó(Y!UBY([%Ƥ  glDmE#ƕ  @@5Y?@'ޚ&r&:FAlrd%]ޚroNOU.܎SnFbJczu|SܝM&I\R]Bl Bo":/@Cueΐm@w`yL oc@]__Y65s|q[ 0E&Fq*hSs!$q&[Ak"|&-V^Ws(K 4^"c#-OT`aJ*w?I^<ٻCHbB^g遂 (Kh6N.H)zXB4zZ.EJa#6CbDL(HxCxg;+Vw1"TGеʵlaKĩ+^Ѿ, ) $DK0 6Z"3AT*J|\RdKٖiXњm7R]o-1zf4`p b) 6\X^,7pH}.PI!‰FJ)K]'0T VK8\ u/f5NAfcD#YRuxaIhG, 55`n<  6*?w<v)3e Q%"\nTr JsjLo1!9 j7Nɕ MJFn" _2RgUlá852N B}jrJd-u)-5Ԏrm3PvRkVk 6g#e- J <51" 31T0TaUlI+) jU "2,)@ 8VeP&N574-S(:˞P\+1Hm1\ )ZdK}2A}&iSЖ.43r{4SZ&RP GxxZyYƤ$VW#q /"V}M4Kay_4bEEqh!G$eA(U`ŒORQX@C(yuqD[K[` Z 7$T̈\2P [quM+VՐUg(z$[1%S^#դ]CTbp* $蹕`=QǩxpN9wE{/SPL ɍCҊ`:;t hbDdÐui'~Ja enʁbCu>u d 7I.Ȕd)wr>SQ=M)( 6gϔڡ:SbZ&2(Lo|tv!QnX\\WT%3"= ${L0<*yq*YF7hPI)w8#{ISu XWu:ye^3;kE{Z !źis64ޔ)kk Thr$ J%T驞Vk JLҩ:B Rx$"F)˲4CcL`KFw{^1 39Yh2dHITR[\ &trc./jKK׃*wz*|FCG9\"*,Pɼ{p8 i4Pʉ I75>t<4esrf`vlO}g+L+1ĤfC ufCXWpXOA8mI+(݅* "4CI*d&ڊƊj%;%bBpJ`E9b:UF`5ʽZ Isuɫ<~H<0 )kdFd|Ԉѵ2j0elP`AJU@R籑%u"ic,R *KUDغVV4ʾEA҅!)YWNtxFZi"R6s$f_LGapxc]YTV*?F!+l6e[&=Icui k`U S z.=G]A͕u45[m֘ GFR3?Zr[v=a;v޵0?ɳgV9~E$I,jWQmRD` ab!. RS}ў'P՜*DB AuU&$h Ka7օ4A9C]('. vx/;E#S4;^g330ת`֛.q&;kB(M QaB^PZeAIi{QRd㖧:N7$*jwkLO޽kĹol:ufQ"O<\kVޅ'],k>^SV[*&"CPJ Eb!aF{-H:]#ʚja[v`o%"P5EX[e"ϐvTE`;;+_UP}$fq#2u)$i\^4*rR%4@qI}^#$2̳8%@\8G@¨LH6_%{K.zA#s?^~Wy+nXoc$uWn7\wu{#g3GÇ]Y}#W]qy޻g׎ ݮitJCn.H~ϴ?Zv H&("yE Dݻb 2-SA.'(*^D<t)k 1P(hQj T;2KFʐxLZ iiQbJ}ClPѤ ]-:,x$Yߵ}"ƿmJ&M^oBTVk/+*UmF"6<h,>#?co~wsw\;8>zۗNӛ'778_ O)E]sUH=.Ƙ; > Qʼ`8n{+_Y]羇^W:UGYslw0Rv{ BD:ZA)HKC >3VȖ )*B %+: K5r#`!5t( |ME8G +ccA#ҁRqhv7fr = !ILNutc%7*IDg@ Q4Eux8>1 VV}=Ė!Aw?qjii|gnRA"9p?$kRk$x1w~K`{/Ut" ]{eum~ʉdç(꧎JָIQR-Ves&qkS ۤF H_A{J%Zڋ{>Zՙv)tnC‚HHU2ۅںbEBX[w$qOA 65QX(9 OTHtMFv4u/uyR>nt6}w> UDVэ1_\ň>M~vIH;9vY~RMӏP9> DƷS)GH_|6b?[nyӎw\^%WZܹ;_n'6a)`vv~bFvK/o{xVΎ~oo>H.W&BoxYC:ȣ&Zbad^V^ H @ ]آO(qĀB A͈ A B#OCf 3ӌ)#=#{@׎&.TV&6Տ=bf:-5PsرHà 00GSI~H(}ؗ3z/&d .B'a䈪ѣL#~ⷣ1)E,8+vga [aak7ȺEoTC[ټc1t`=/xUs37p}9:ӻw.xK^i=E$LOO话^[= R\z饷ݻwmo=y~4_Wr˛gȈtJ?4%oJRYv?A9*V.GpC 2~eBtl=Ġ(`uh!0&^X$`QR7:BPN2'qeXכqj鍬} _&2x$.=ętp†A*V5{ٲ8?ssͣ<1=5uN pݻ0奛i (7oZ[=ۮ> ^wѧӚnyO{=,.e?S=`x3{xT xqZMH /X6c4(b{D b9Q TMi;ƂankH @X2) @(|ԳUk3&8r̍*Ue }4Yfb\53D!ʯc*'YSqy/}DUhVA+\ @QF5Vksw:#Oz(jefv67e(N? `f9Fص*WN&$x]N}IʼCmĻ+)LYy3"e|u,G,/1DN\Х*H{͘SO p,d1ŵȟ4ƌGF:ŰN:!*NGVR<HPwbʟ'51x$ 9@aG9sk9n)U;cx::@/Su庉ۂ@ &66Nu={v8yj;L/-.8t'&NoE{յOyeֽK3YP^w!%'hZSwAL@*#vj D)) $T: >i2 eʪ "I9&@O}HѪP2:x"9!vɓKȷQUԣGC܄jk+Qioqde^F1!/Ҽ >fkoUB!졢1\ lWA0zVQ&8U5#וJ;RX$A[rNP? l7;;3H1T[ػ-=yߺ(ˀ !dM Ӯ&?%nU Ƈ7Clx88u %^h ZY)rftBs0isjqv$O+a/H&Y Xr80 ɨ9 R_ F-Fg\I$2nrvW_ >sO<0OrݻN:}ǿ:x(x(&:ۍ.?W5f2jvtt$`>q6`{-!H vzlJ~!Q (ʢ"%Mg‹};kr5;ɬ :̉DARf#-fԎ06T!yaM\)%TՒԢ"hRI>?R5'6M6Ll3 &ya~ɧVVV/9<ƩSwYŋ|$Ow{70NE1:B)`5nwg\e"Bp)8JUߙ7}b'R%.!LYZ71Ⲻ=?Ԉ2mTm#P;G)!+I}L d$Lm>0k34-t-"=\t)H]>O ^$`ZFP0B>1D>CP'ѷq;rM7\G;sv;_᠟\ճxW22{e}}w_­~#G%_*;? U6O(bi )֔62p?+sn1U;?G(W$J͟J~b@pe"iT69=OB0qR^V[m#Ko.!"ͪ5 IDAT8Q ӝ<3pX$V+sb&#'CE x*8"J3+s Ko/,8t#48gV]toAD|C_?q奥~/yTt BQ@ QH%Q )"!D91K#KGȜ>` eS*Y i:JXDD9;!~Ql6eb X]Us[4 L o$WԷOiݤN"UNX:"l<,cJw] +\$a|OIR]!'fWxؿ'J^/?w>xWJOyM1L6KF;]ݪ ?$,#llWd!*SeE"(EJbhTG IHQQ +,A@&nUyAjI O6HΖwE!v:O8Ŷ;=^7!qNOOauuLם]YNwn"*t ]n mBhY[vZV"HooaKz%s}`O A@ a[ {@euf!#ȿd c'EjgvIL1&YW*>+2DX{2z\~g da ǢLȬR VAxW b# l"q G Yrd,nFM٢;-$^ed2 \` \d(T_^}B7pq-4>By}%>N, N:?﮹];>w?7;{/xͫ_奩n<_ѣߢq*{& d*)_3fxbZH~ %WPlT/u#.J rV:V@"/Xݱ5j/UPC"$Fh&TH%1FNủ DU"P-H;5NY1Aգ}vhݩMϰ௾pv*tTFi7(3غ6f1\7a]_׾腗~d׮3>?9~ݻv >_;*Mca8q)~]ݟYYYݳg;Ct;~}r/'SB~U+ &(b%IdX>vb$B];T+UnA٩J`%\UJtaGX9y2*HLNP\*#^{+n{{_w>׿|W|SSTxA4* ߧF-b ac D:lɢĶ; ~=h"MAo`]Weikc.f-F-%S١l)嚒JL]o;Y)f@& Y ~?^:F`7Lxm#rDn0 )&!ya4'L`%dzFK8t{c_Y__~D__ջop83=]Z"/--MOOoll^__tN?/c--.ڵk @F|7c2ՎaDR+_0U%b1\j)c`4B@xnYU?Z+adjk2&%u)H|'Dawar>e$O d Pt1P%2R-]8jDc &j`A+UIk_sW]"x~~?wZKgffHюo>ٙW~k}}Mo|_|/pϞ_wqϞ]~b^ Le¼im џDʤ *s0UێZ2Lc}iT1.j():֟F1ğjc?Mqrk5*Y!;SWD=@A4@"\(rƢ43|%jc؆O~-zyǏ0G}|aa~iiO3v'^k^n1H( Zr& ]يFM^PA7{d 9D7AڢE?kBAA,aXlCbՙ"e ɧ( 砣% :dL{(IcyNS;yuys%qJaoK%F{$%tD:HC l @s1NRa&%344dNVƸ \|S`8C%q^j\>+J ҸI}ykpL%xԪYAT)# .`x%,%ѶH4VGS%"ySm+v/.R  Hޓ^"}"& ţ~WX#yَSPDλv6hD n[J\ m%{L3":CS@>b|-eH:`% #IY+G"߿ YN*UK'NTAжl ?r׮ХڊdTGqEQ7Ξ]9za/ڳ{:~/ vCv׵3PzaLBM=UTUƉ<#x5#G:I#Xj3&ecׁ]8z$ŰK(%B(f,<+ iyʹO0H)RC$qPmWA :'Dtʐ$}k#>m7#GߛT{Qslœ ""l}W/˙AT+]*SS|VĬ@P4P4AJ(ZV~:n(8U+}Eh"0"jaD9HMs `|( K( bGZ҃92*iB4V*SP(њ]5U㐰uS'덢޺E=AaGS5؎M:oDAZ-¦%qMP><ҿ,W^y,N;zSGMwx1T-'CĐ y `uB^-Ejph4TbOexڑ13-YܫL/i V%hcJnT3]ӄרJJI c%:<'$04 pSeYc93/.,,ۯ,-. fo3#oj+JQM|iAV~R6R v$qVsK˘, =W|-:#GGJoܡw ~h&xJA 9C_JM,?GqzM>33S_ 2MR7ia+/i (l)"+/+-X켴ckH5)m]*:оJ*Si ܇i70T8QԼ8~RIUlz6%=ΦT]Q#esHnM1kpfG'Aȣ$qOX"2Uja&ѦNqYPsؠwM?v۾zƉ(#*hN;eidRu1qꓟ1oon+w|l|%r6-M(z\sLVvpo6^> )j@W"ktJkoÙ(R+S feazgk)A5YS}sa9~7*) zի7}gffKm7770q)JRA_t-,: =rI~_{~]&OATE! klDIOG^XxQ4gCYFkgbI~ds9Z:;6ةg$BtŢ@H|

.;"U(հyJ;OpuZvK7f=ҤO tY,l6p Hpk16><4e97?>vpX0we%,[\p s1 <DZ 춢06N%!KǧʣRxx'sI[aRfSE!01*j6 V,!YJoM5d9a!(7X4B)WUUp?*Gl@T5PUb!ŕ~pu !ߓ.%HqwݽxMt^Ju۳c)#5xa4tCE8d PP8NPyzި9>5djXZ6HڈP2ѹ#S I0Ie!)U{_Y%B?8!"WR3\Kϳ ԓO 'JWhDj[S-2 5=W*HDndj,a*UeX9N@"Ndړ31OoB™„Em:ZA˄` )*)LYV#lmo~~ũs+ݧ=?M/&mJQ ^F;6,[0t(7`)Z2 Mo"ܫqoե(h|" %{hn2f|T3ͽ :YFlv"{T۹[9sz$-ĩÿpa! ZDOJHes~ј5t5'FϤwcG( pR) d(K4|܋4\56STT^8DA>@UxJf2U#j| J"*_S pK1(_9R?Akp}@m ,KM#>m 5NsKĩյ 6<΍4Y6c(뚗{)Y.(DFJdӐA`LeLRFմ `Ƅq nMSU%&uřTK[8 S7U-]bJ$QrN !:gH vS#F4[.?+fvh['oac=QY^qڹvdX6 qS/P &]bP4< f%bږM7*\尪Im$j%VPmPH$ɤ/@ւqR3LlM51"}7Ij@SKZ]p3)wwډ@ +&~m  yH,Df"(v?PsEv ,  !JUTc0qQ0W2+ܒʧ.^*(k5^u.(NŠL~Io-?u)9o4@ۦT]UwADV(4i}mY%jSFVT-.X\܁0"ZOpobmn5* Ju*}ʹOmqo~`ϞKo~v^IDAT./?q?>M7L?_}v> 8tEa? |Cz+_x_Oر3G_䉓ѫ_ n} ;??OO|#ݷ|~.hٳ+_|'^o|w`sޟ|>zD_mяk_+ywGd66|> ffffffenv_fgԧ?; ^p٥~׏<?|UWwO\r_r|Ӷ}zɧ̓ɿ_z%{v~W{~]{vnUW]I;k0zͫ_} O:UsUW|?qvee;> e޽KKEQ_ϾĉX\\u33SSeYC\rr nGk-`3GLOMM,w˺d捍ͩTo}{;R!Xo޵C d8}\X;NQ߷o/λۻC)}~KKK ?#_o'ٙ]vѡCW#KNJŹNQ߿Wk?t[_/1OWgxu/G^qMKQ2xN?lcx^GN~&Z]][__߳gwYl}.3?~̎IENDB`stopmotion-0.8.0/manual/screenshots/run_animation.png000066400000000000000000003256161234321124500231320ustar00rootroot00000000000000PNG  IHDRDT"bKGD pHYs  tIME/$`DZ IDATxy|\G/~ΩRkvɖ{k8p , a`=`ǃͼ12o`xB /Iċb'vo־^:?,90o׭:u|ϹxxAA1FnFn|NAAq*pLnFr#7r6xGe\7otҠ~1o@o8M;&?|7meqg_ r/Lq}WWa_ .ӾW5_}Փ05zLpל۵U}w]krOX׼4n}s}ǫ?tѵ2wU7-( Ӄ:ߧ/ 6~`Η$Mae3jW$`?ij!MI/5~|iJHo} ;8KSuADt""OS_5 nm"sM脅d9a _D"+_="r=a-[V/n[(;vlޒI 9b9+3pmuU% -zFo7P[VW]rBX< ~?/ HgVp1w79p]7?(= t:=ێim[lLg /߾тhWwE{NJ1k6;86<(+vɗy_{>g?|f׉tw?G= 3bʍx;ӧOwww7oܹsMa#4g޾|cs6+}w O}g.&SgÛ nz3<OmX9WD6} ?7߽j9`wg>|˺e ?~u}x27ȍx ?~q{ԧ>5;X|7Yfm޼u٩mmYDm JH< sx^8 wƖ4ն]5 V̹3LU%]8Vݸj#(;6,hi©JʍxFaas=w;;} ~=t"nSgnXME:u&٩}gفʲ{|[Z{s ~럟Mkx<[ξ{ 7O}O~@ܶLi_9ԩEy{ sfAߵ7O?'3scO`iQYqϿ٧wشz^}u~ޞpḪ[Foظq]v=Dz!w>e=_W _>Y\|a7;oZ 63{Bz̠B'TRM@l<θR)`K@ e\ϓR10`#]W"+ʢ&7r#7~ڱcyɒ%3g|#W򗿜L&x_}5T:oXyy੤#wo,zdG]ui$<㉴T FSs£np]YSQTP6VWcm FK/%#PA4|Փj,f;7. \2pdG"y sgθg/ Fnƛb?OMiJJJ/ByޢEڭ޺th4//% S)]P~ˮttSnh{ZZ{wTґK]|ߝn^;_0 =|B|f׉?/jcÂ,%R^3^")U"q/}k'3|u>|v-K?7O~=vS~ͫqᄍoh,d`8r]OZn/=ygOӯjk׮?444L666y)+oZOsW ৘qGx=_{Z&j*8嗞b]~~e5yZ׾-fhB_Kb_/kOSm)s B}랫w.0 מ@Dp`;u&!B#7r#7>CJT2MJnFn= 7r#7rv*7r#7r };}֯['VXޢ_uϜ=я~<{qM˖&k_l˹v˦KT*/t:wk+{ﺵ yેέȍJoG>%׮YUPxٖsu||6R ܱ mt $֯:7dr||K)+*ʯ[Mv'p¥s.LzǺ{zsK'7r؟b+W:tc'[^)} 'N...}ΘQvKuᢢ/ܻ梁Zԙ-}}%Go|r+(cc}g7TV ?ӣ˗]WYYqJJJ^9׿ի\{[W[=44?GO1s&~葇vtf2O---iwݽnv۹k9 /^4:6v؉{߻FJ}}]#0::>p_UU]/Z_/500|4H:}&r#7~"ru~?n}fk0Aׯ\wܪ90ψESvDq7n8;/Z~P>cFiiiyy ĂMh~eee$~kWNm>]!/?n()e<}xG.ՑpjllVRn[7LL:*Jzqόp(?/lFYd*ŊKJ{zz &??޳Jg17.,(Jg23ʺ{ĬHdʋw=v"HD_gl| 9ttvdx$NWVg\:⎎+d?dII5u㌎2òu b]mm2F[:߶,).x㕏qSKt3:: /PT5=OVVTX(75 ^5׾H"G`dd겝ګ** :î/  -_v]IIqnd2P(42 tEEF5q_FnƯԟʍȍx[S9=znFnGNFn}~jhh8=z37r#7F#G"ᬝ*..:Rbϟ4O;ui!D{{b+.@BMIlEd@-Y7{Dl[B"3!0*PY)X)I)lZ(Jt]n%G8 "B"q !0$tML"d%%+RI46@{9!hd!(@D@6j`4'!L (f@z Rd'eYs'D$H`iO!4SOBHYR=%U%%0zP=4'"$ֿBDF{}zi^C3*J)X*IoFyŌm\7cntv "ٖs4dT+S$32(F"`@`#'w4ªһnYS#ԫ 01*3]!L9F$"TDX8-:._!B!`aA}w|NjNz{SScDC#W"D@$sN ~ ,Q-bfT tSP\"tnmNccGG;t9ƙ+CJ)lHc֒j B+@lr"# Gd"e!⁣_zŊ###[lIRPQ^ixڣPXʚ Qud4K| fiT?GEt)O3D$>50C~vfY2x ,B3! I1"JBذv(PƇ$!.̜3_?|֭qқ] R EĬHrM5 ("BŞ%9K A9R/@9~ŋoذ… {eDk+"P>遌gr0Al&ѥ]][oU{ַtey}w)T[[ۮ]Z[[ xȀ &X R,KO))R RP êXjƒI 7o >u Ȩ74d8T}h*B2P+Śd2n6+6ޚPdj UaHdeeeDzQ_Wn$Pa}/U J!0oxHBhMH8[>͝;7Yq-B̊Y*Fm4I_YQ;UD$ DŽ.gϞݹs࠿Q $s,}beWdoF©EhboM Ҥ"Μ9>vX<P*B"|jlv$$xBBڹscl^!]ß:qw=XVLiBn<#6GvhFGhoufۥ2&&qeIXYFG!HcD\pa}}][3L!2 "k uI` u7 XI!M$+Yo#]$F4B=OWJGh" G *4(U~@b` ٤3 a}4#*$aGG7o޲eK#k' DAG}0V`|ܘmA}j* g )$,BS6f搐qυ0;Η^zihhh`` [4JϘŐ#]>D I(]wҜM>3AŮ-BbXcccss}(<۝Zx"4o^wwo,6::c7OCŨ 5OJ]"f(4kց4, N՜ٴ3is{P'IP+r!,lK^hSJ@\2b/aLQ ¸VHdƍ7n<{|- ՜/0!k3)DCfU["vL :p@"FL"8=BIDP6eq UmT C98ݻr~=P UjwɊ y `.?:* V%Űjjj6o} _v?'>BdЬ3&Ygw BBB$ HBy[nz*{-k`}h.v*K|ȱ ֽ7 D:f̈&:̄RsB3R =6ceYm_ʕ+ƈXD{~ dZlPRgDT ,Q1ri ɏON'zHTS!DdTd26d3, REy߿wnqӧOb19H#0e(^Xl!h3jCw5Y1"2 Af|O<=M vR ,O@"dVZy IDAT\ YE,aͣ ň}}};v8x׾ʾ>6neE[S!d?!2+eBP٬Z<2( СC0Ƿ;Ng?n钅W)ԡCZZZt` 0kVYrOkodIjmHI;:>dI.C/':dp-KD׿~Ƌ/ 3H[VȆhm0g 0[rDU=)P q nzxSҥKwڥmdAL8B5um$?D;f*D2 kJ J$2HPg5BD}Ɋ?$+1 &!4ދE{YY]q۶m=PSSS:2 BQ"F$iy + v9Y* 3"bdϦmذA'v|;ک-w|'H,]phJ,m7 jF_u%~FY6:Z#$`HOЗ%qU Rh:ΠB5q4Mds!`uY+ XcժlZ2 Bs!"VSSsΓ'Ofbk܏ieB+_Z^GoA: `CK1=ӵ۷o CpD岦fTM'54p-V4}V+2_@hX ٰf1/[6 iZeX`} 0 TfبY#UoV-k"A32c{WuƝS` Ec ZҬ5,Y8L|H$hVz̛ThPVî#O@ebVǚE~ gΟS-" \;rhmO=ڪOσ&T Qo00@)xi>zO*+KY<+!|-~1X%pHيc"?`6g?f#XfMYi3 &52x%YA: D^CPL+vUB~ GM 8FUP#F]6~E0"х\ B[M'3+6z 7$,:k_Яqvìʭ?n UdA6ylT?Y׬YeN8̲z)ԑdL̞G1oXͿ{l%`&fzsU{ڭDP0 4JJ!fl@([Le2B @bsk'}nSaKgiMX{~Uu}PoX,F/ҞI1>و[ 0Rں]+![#ijk6u?poFLVŒc B3Tl.װ^R5 IM@(,f i8skFh3KoK~*r;:RV͜5Xu/o uݐ}*T)]-M^KLJGݲFBL$ es~Ո@mfߙ,A.ѷd2f[WL)4[h%Z`9)YOɏjSh-ɘW+H$&6Ч$ BTl'g &2P߲gkٺ 4vD_`.j{0dQAH $ho5LVMDI9D`UOeesj!dD֚/ @N! Ƒa?_@LD~Lm ^1AkGy|lST0qcM+_1Ok|rl1Y$dx]ͧ X$Nʹ(PƷN4kYm&(XardkHꬵo$=clĬơWMDT T)65l BlzV̤O`73,*Dd2'u0S3t Z|F̄$'&(,;~/TfEΩb+2dJ2Ce6(PIZ6 d 20*HD"-b2(B 4_:jcW27PYY JvN j:'JRFs5m>rQM!I_:dt_L:بqȊ:l 8}.Vot T:sŞ؂5U捌HX.wB:V=Xi90-sb # mmWz*6\ (2(41HЫ"chfӅ Fh@zfh^PU2;.wo\6tтyPX!kKBjLG0PCcbQ|,BB=]*,.Z4^A~> !H@I4R$SFpY}ݖilBEY CϜ -^X\XH!*P| WĢ2S{!LX"v(e GFO=/lQRHF"t;}N&z"tL$ԯu_=S6&7.lPzep[joLO8Fdm:~.㪗_y̢PD lYYA:يsm(O[LL)ˌ(r=≴pK}Ӳ|*fnl7MjI  o/?m*XJ6N6JNnu`d4$^zצ%ah2\6_J mO./0ٴ%0UDxR!Ɩ˛o]]XPmH_iHf&- BwTE!t{{X71Z@ O R@!~!Ke $GF;;{޹anY9ƓO}"B &%W7[{Ah3~ZjT2"c2|3T>π˯6:=2 ppd|? ]^'Bed%s/ ]vniRJndN m{/u3x-p31Pom߰l)ͱ $[Ei3ېEh1Ym{oiJ=@Lݶ\kO2 9ٿexO07 v<7 lb!gu\m\, $q-DhOQb@gڕ`nf`OWD< I4mܙ3iջ=)úӝF ua2 " 2aW3xԙs=}CyW?0;S_Qp 6߶iD, ͚-B$[7h`"=!}l#T-:\ǟe_U]>2+Q?#K}덋,8ߓu!9f3VHdjV6Q˝t 8|"Dv}vdfihE˗_MF#"ֱgU+5BWjZ@hLCCãgZ.'/>p2$ zRY&E[m*#{I73{8h].=\1W_7ּ[:}1V!AYuR B0u槬dYa6| P=$w-Gi7oOzgϝxkhm vwx|ꍫo(-ɨY?L;*3E@Tl*Q3//*|\6ZܛݳwS]mȺU ?c"6!]A!_:3U$^y 뺶\^^)@UT^mkt|sf+[;? Ϛ)>h'"̪OsB޵j<ɡUU/Й,"P|Y F֩ȏ3WRm՚!euFL&CH^>Qy2g[׭j֞њIưZ;i[|RU4|=Q.2tD8(#7Per0fuMܼa\%' k=m\VbU8r4KGڣv)3}ȗ3 )PS]]ݿϚmU6_n7-%D@Zj^CCm*6wemAH\Ǔdh ;0yD*/Q\PQNy"xUAف :!5tW#$BI7ݴܻ3ζ1oo %B RT*g.Y4<.iAdlqh,5BW jĈY}8% JҼDK.]F*BTT2L%$g-_?2MaAo*fZ6̡EP5ՠԌHO/C:NL]ji3fΠg-ʼ 8*ЏM&#LR)RX6<K L^q`q3L2̸kuyZ#_˛- Qm~5!@f F:?ؐT)7;#0JsT:_lQ_! S`5K譠L,Ŧ't{g"//46G p-A*۳$&F(Zf686/`ȋ7sh$6#SVBGޤ*pc#IdI sf-@'ljI&RFBQ QjjJ-;BzHgH$MN 5:"2NRDt]ueɌZ-l (d c*D*LlbKyn(?u2/F5FIY@8ycm郿dJx ̡α ,,.%SɁNꛫ1!QN!qAXIJshtTxfcEMcaY](p=t*Mkk*8`NeqaX<1OLuuD\fa^Id %x",<MPGZ#A9ճJKfEg&%C{umZlYGζ5*N,6>8**M c^^8@)H&uꁭtLD&%*׿<ҙT8<>tۚ,_tJ߂>zJK\7 yJr' XpؓLd&2UFzk&b*,.\wGMImayEUTߊ|_p,Z8}*-~}ἁ/7? !(A"/G"JR[p䮦Rȯ_jsq.+74<çwuJ+T>VO^ꎹiт+g!<|L]03l>Veu5EQ 1ؕKw9eUsgkJy^>)3\VRj]݇϶vv%S)X)RñgڇIu/c#[w4Kv7Mfjͨ@X)5|{ 5̜[^3;??|B. +%=ڹd@3}C1}dJӇ ƅ=R#4B5OfyAS LAiɌ"!" #ek77DKKR*)wtzhdxC BмD@\0;=mE䙝R}wO-BŎ!'DVݲm]wâ92afmRI%3AbJyp`ϡDgW~Ʃ;DhS!{}Baoۯ9ˋFf̬/( "䄅QRc+W~ijAC'/*%L>~{ϡt)V/8#C'[v sa |P2+a1cf}QEY8!vB)|Ⱦ}|z|lM~YJIF/C3۶| ñ{}i 4'Cxg_z'>|u .5+ސN>_k|w{_)ÿxN~/9s?. .2ݱkqn}xj7M~Kعubd(7^>:ԠPѡcǎuӮ zO[EY+滝ŗ^cc{wD4>?ϿrvS~d>w(Cy!3vw`疗vބŒϿxtIk~Q2,ͷ[\zݲ/j?kHpk平Vf0D_]UvExZćkxnr|~zc?p8^9CP D(zq (DH^vk}V smPxD ًOp/V;?G 9<;-# G/?3jF.-B9? Ù3w*0!p^u{ ]myvٛ]/C\|^\X|c~qqq~#SS `a$_~m;F}=TLsOg/pv[B[z\b;~׭7B[L0qGXZ]7-?͛36}_޽N Oܻk~ 7ݚ,lϟodt~~oxsP-ʢoiSқ%|خwBr暅h(5 az/9pm8Z['<M$/fgm3kί_}sOt:- ƚӻM33 /@,zk2{-wk_!e( eYN%˗_X=7wNˍ'y7Ibd`['وwr-fEŸ}/ eͱy߁ngmum}b13=@8eks4m{BeY~O<|WV[zykB(cY$@`6 }̯gO;/ΓG#nnV3-"át7Coxp̭{fڭN!pY(/C8~WʉFvx-4 mA E6;o_??zwY>v$7qn dǶIBj#ᄍm޲cm2pPg_ /^ȞNOuZic`, [P#dıEf&w=?yqf!P9o?7ꑴۭ,w`nEm;GkZ(6玜XZY[Y/?s$hoɹ^=0Y8oJ]{c?kz#eYsy7&ztڽ^]3-kKMcÛF- KeWN_8a_ȟ?=>3+Xqm-dIs#Cxsay{~yOW|% ؽ>}<[=jwe=?~奕ҥ=pv<8vvk=U!$>?}vx7W ۜҕoHj3^S{|/֧?ŅV8}KKKga e(SSfmw؜̋*H(|rYʎmSƷN[%+AV)$KV 'dž>'g^W[-¹޳/-_ZZkZ/;܆;Ȉ,@ڹD4S_\ >0|^_r @ijf;7O s/׿ۿ={zP<ʹKV[/o@BeûcӮ h!K+e':_o_Q8+ DCүH Go)Gt^9j班pCgxL}]7q(Z+ZY+hX-DK >'/p^-/_;vjj;yzݛE ϡwߞwn#8ΏP[^o 6myx[!vEXI4HA.#}|뽧ŕw<̋^YB`g?KK>Jr闭V/o{o GN0$9}cas`S.ڹ 0|2?yѯuog&׻.< Je=&zՓ,Zy'u( a.ھ5È@$['ƚ| :M_b( =y̥ng_ً+/}Te0 ecC͏>tׯїWy=,ty=~N&a'Xn657mFG_m#\<ًGO_ E/|}Ι珞YXZ>zv.s(/TsŸ<ڳOg;C؈@:.y=T,\\m?{tY?3KKqp46ԼphSY(,,aAc+sx^>R] !4wݶcff!桝\wB.@wמ=Z?\Bgδn7|-[!p("=w6\ 50<YÅrHsDa'uwm6zO.sX9y¶M@j>,L EQ1ks+ n6L5~MeSw,s@p$fv |[[>ୟnC:{RFhXeYU P6O5u,-Q+G{[z#Cjabaȑ[F5qI8_{?ı2w~* qQD`y|g~,npZX K)O>G/eI=_.R&NiAh3?t`K8 k啎YwྕբhJ#sQ$P֐CHޏO7uW[G}o^%p_fnfavXE΃;bVCh zܶnpul6s^̻79ȤϜ#N^ZZyn@WN͕Ʀ I bP}an_rSmO38.i>p~aGdž'GFcyu۶͜3G@^Fr23[nYo^\Y/01>q-3ڽbvzaHXHKl4.}%ljjdbth|gnh#aym~3R(2 ]+kN?=;f\-N[b@d]O 9=.SS#cC#fM>828 +`}MZ=owLίg;g ?YOŰȊ1髺20C7ɽR11129>41j[ G|#ψȵs1D \r>S :|u۷-+"m 7(Z $0+T $\ {vE8uqp7]\9GDШsME E޸wt(][ع-6MO~Co L]:fP=7tSrw߻=:Ry9")8'WRdVX샿~|tM~h424'bNkl:mvw8r䝳rh6'2Uz$r"@tFHغiTW:yWc#M1iVVqg @.߲i̦{o?Du FtA)D^ S~^Q oP#!Ie0x@t˧&붃ΑwüywBQlL͞"Yl6''ZM[z>k6zE9<ԌBdk( ,3!R 1CG'n?8rǡ;G2w@YeY w2vda''S~/BpQfNYA˝s{9G(,,H|"DtDET,Jwly.:G hؐcp7nx9O&&ȡ<0Ô!ƨ_(r>3`sQR4(g[Ḡ42G{jl( {r0 *YHf`E4Oy3R:t$ TF'[6&D ;9#1 PYSp1!3AB Ω9g' %#8$yo#'QwBTk2#Ps(Ɔs.[̡dP MP좑1#ry2G\RwdKDH*:*1 A|m\@;DNBU߲uP'DwKbՏ1hg46ز"80ond9i~jtd䞻|#&%~jqP{syg\AUlWI8HS`oBQJ#F&Dt{HT k8物, qޜ: \D(& '2e%S Le_BdHP'RS2Hh h`jنDME@y"H D9vEҸ:ĘRIqtCAP P"Q&OJ]7RLXtɌ}&`nw( DQ4erX= hɜDA'XF\CI|ЫRUU9Ԍ@"DY= y&+%zDҍ֝YkD !J'E7*iP 4.@|e`>URfv<+Ů l%Q*[y E1Yh $QJU*u)dilO " V'IqEl@ (@ܐ+ x& s % "Qb#Ӂ4"P QBykr0>q\W BX0&HkC 2TLl"%1nBh" G"W82R7պ/aQ ]:԰Äəx ]"(# #0D"$GhYX {(^IRP-QY ptcՋj DN)Q>v &"D^uv  6)1h!k"BQpR5*Dȩ8#AG- =&zh! x _O3#4XIbFBZUSHqhPr@'ъ@mPr!"!*Un9G,4uz$D=IXđ >c"|4HdIN@5-Dwr?n1b֌˔=,},<Â6 'JJUB:b3 %C 6cOn!$lMdƎO1{"BQ aӄUf!j}^86w% وA݁zJ$3TB@0 `fq&,`8wCqPElGQKZ(bȺ@6ZV"1VVM,@Ba$R02DtS% B؄m ISXDh:$2"v3Uqޞg਒RYrq؀f :v `H=CWg<\kIY%y! nZ`CtɭxXr]h,!-(FM@D`DX41UdMRXODbU9T}ꃔPc1Oz|fhU5A,!IB& D & MJJetGW*:L k),H@$zs,稓 ^ Y-UP4i",f>u #M$uk?TD.B,T u"3P7kNd!y^Fsg&dVc)k,D_(@Ff8D3k]XteՀZBI`L, «wlk 90UB;e +\;WX)Lq*V"ʲƍER ujfSfA-]t4cS>sX&-eznECZQ]Y- DN5ocaܩyT@:PpU_l$w) x4 ; 1'XU}/ŭm5(^ P< 8f6 5B"Ҽ/WB mu$P fa,0 7aL-i)F.fh""BxHAu,#h 1YA̒Ē\a<,/Q2*aй8eYXT@⒦ {F9Ak%~ '7[1e s`$"QPIYn^ r*=:cbW(ա8!@@q0*DuԎ2@l} nV u{ҬY'DPlFl!#B}SB)3.)a%8QP PBBUBa Q^$YYY(Ƒ 3RHi`liYv2Qt&M( {Y` W%-wPT0`1f!*xb,Tj!F^S[f=f!T=X\,bʚ/,]Sz"^p4%vAV͉C2JkQ-!`I!%BXj¸5YXtjȣ CXDR݈0X9ēP2z`T +c+c*j.[Y^,Uӊj`!^f!0(qfsVU\9bh8=RYq v|EʙW*#cB!H g*$>Ndc+.Rx:#,Aj5crgrc5Ÿ (t}!T'xтVt0bA+6\֎Œi6Gbq:Dؕ+Ajct ԭz,(x#a! :+ؤ3\ 2f-H{."*Œ6=c2sɕTYs]2 5˴ N-Y>Bad7C Xi=` #6}gbH VDqV/4 I@ 0Xg YC0 ̳5hעd}@xH*c`Bt7X$Zs|j,!@/pF* K9Z{Ě^A, Ev%?%!ZQsUOX{.)>XQ/OJ*?UޥNDf~ + l2a \J d N44Bb7bdkn)":սR] ޅuYDܜJرiBu%Ć2 %ZkJ&hZ(ˆ(\ЌLPq v€%5Yiwjm>C,Ҽ 098s%H`#/8(̖ AVZXE[L^;L~%IfX+Jm J OC?dfFI1( -YY "o9 Y^,NA/"&XW4wʒ1:4TQ0(E h8kǞY:IX!XRm'2^@1 Qߗގ\DTJbiM8H !“6 k1Z) ~b0 yw`VL0u&cVA  Mv ZN_ !Ďyu#F u$naMl!:22 (TMc 0 i! "dBlY 3\-['J/\ BRPˀ3L"HK{9 ePBBR8 !hV+X6b%uzB9ePSCC5d :MDBf]} ys9:yݪ]XIVΏc썭,fA5V %K'R]ղ9h:JTzmDBcVA'حIPJͩlh]ˢMsumj4[IH`(#^2FU"!$ (v諻Ø`0uNBG/9軔.DDpāG,Ա׵0 1vJBA Yv *p(FWx;=Qt c%rD(6U1nXlVgLt(loThV] j+[ڨ58G բ0$1z :Y8Xu6[afL>th\-C}wPrRIQ"wXl1Q%x4w)3eDBlLQ%.*OE(#+ SЌ]e/G%bT SU,-L Zy,0?b˛6袈S0@!Pfzઍ2հxTe"ja`BD?CȱT mӋ2j ZhEސ,\P#}rEWW.s@$d` F2`!"TYhmtc#5N,LCZDKLCQ2E.&ZO 5{bdtӼ<ϻ gL$BtF0֞@+/ȁ.NUg\FU7P*ʀ 9!2YB68[:2v`&$Z,յX[Mx5caJBfD9ru - ]Bi(-F!R[,9D"PaN#&$1*1u !D Qs_䜨|"'*8QzKr\":P rF 2 S_ՠBA  d!ȄEt V?% K~822nwdF[}5Sw2ekD`ќ5vY;D똂ZJĭ"ԈmcƸ>j(KG,xp dI/ F*ȹ ֣Wŝ% I)KJ""H ћ\Ʒh}R~d!ؤ_zΕ6[,] ˫%:Ɇ}D\萴K faH ԆJiŰPMꚖBZ/\,@"+ EHvn7'lC֜`Q+(ҺS˂jCrXvCV<{| P`Ok 4FG{ݞ Bl4CxɞgN-翰izzhhhmke{]gy׮k׵꿺z{뭇ޚ{4nˏ={ߝt:uf٣Ga/_⩋/}AMI[v399AoDZ\Zj4^t;D4>6vm~WQeQ&YgKu17Kq[׋͏S3ڝdY9O+'OeY%+ʢWCC+[kSolj@ʢ,Y1o [eB ccc"\ 7P{?O|-Ki~5hv?'B^; EYC:?[JPXܹV=6:<==S{Vm><X3e}{2,~'YVU?7,tݷߕ8r^{{nv;pJo %[[\Z t:Z76)u]\s79wv]߬ сd{˝ rM'NkM,.8ur ^(sͽv]6'?VW-W<{9ff6lv]׮kwj*N?xiND_\v+n yE.yzK+jR_ǥVًX,EMWV`uu6\gf47/"~qiYoz ?nnNG.Z~Qď۰2 qeV`yeWfYtʬŕYLLtҍ>na㍘oĚވFF\nwx#>:}y#20g>c,∘ȉ03{1ʲ,͡,By{iBp΋p!s,F2g!DžW8ޫ &SCY39XAy/̗ ]qeʲhƿme888sHVJae> ̛q#U?B]r#S}O.v9"  BWZy0' RM]&!H>0s4*>IbO3N+H?!M0B;%41BC4Mg<DT7 VfL8A,_I*;PԑNGQbpڭSe(ӵڻAk.ˀfm*yq5:tMGf%S)&,f)vZ\)8ʓDܤYvYE3l#c[Uwu-^8mgQE^nB`c?!}`0M1DL_A># ]=G9J2jOy;AyfOk QJNLo4FXi Gst`vHܔNDrtqG߁)V$1:"xJy $Ԏr7a+jmծpZ'"`c%DUu1j5b  Bɉk1>-4sIר%4x79ENz *;K bTRlb`DU*H בM|6w:w~oY^Y=[n…w~^ӿ#GW6l.& v"1XIRbJX)mT$nI\+ RzbPŀ0Ɯ6TmzDIrJTTX;{p9` IZZ0y HB|gD(t,⯚Z5sWw6B\^I IDAT4m˪1 Ng-H)U+mф&c܊R4 xdK"`JS<^ `1NjoQ+kI#eg߄WqރHxr}ekg*ye? >) wEYfpvyTP̔YiUAH5RK(tQV-= KF2E)B#NHHC '~5 nU @W~O/.w͏|s_||#oqfsS휜xc C5%CM2~غmta,eBD @ b i%Gbj2@T1 bJ"$w7z.ҿ&A4`6| (!ӗ9 llPUCIHGcSh*;"<ܥ*|8%B#Ӳ >+TYƏI/#*s5שq%& 4K\ee`zi#8]LaT; h'j}`&/?>_nrru7l7\Q<7zϜ9333/=zn>\],Xrf2¢wZQy(- d*ڰΉTJl+eM$Xb0|cx%jCL.U%A\o%EX5|&1+#2h$@Z ;+ՙV8c8Z@-=H}ue-"cCYS \\Xuz詜bU$ZѤn%C&#^밡ru7~&Snvfn|@5^,"Mwwu+K'N'O\[[{衇qrr2kMcɍP R @_~* iZ@%FL%#3(ԕe .Z7Qa%|#މ DD 2$ X Wg =RBI ;Q! *$vq}\^„$JK ChrIDٔ_׭D +/I2Ěh4 pRP?d:v#8=VGV`.6$(&-PS6@©\ RHՍ#Xd=Fc(V-FLYIDLLZTj=  O@S\IUj<:im޺޽{O~h uYH --:ZǦYJD|SgF K$TQqUgRӜ} ie N} X҆mIu?Yj $R}PjSuռ!׫T VU/\Kl҈/Hx"2#,FtsE-ֽx2kj@\i.j:Y@+hZK[0QzϹIiL;j$d8qV=$.7G7m}\6:ڻqmcG:1!tߘZI-vxCGٹsm"" ycӦi"2711qTrkԭDco7[7MM/K~);ndwԙ/KqljV'#/6CHhMmm7G?qg?ok^U;jL~TjWˆ1Q!ĭy*PbO$( .YmEl;r(Iuc(dRt%6+bNN5nh!V!0,c tjA&Le`D1Uzc o$J,3pZ,UuO[T$Pj+-z*bBR-*[BΤ쓨{m,R1'4a80WPJ i *| pxy/o{-?½[x?1.at#=VǏ2ue'6ɏCoM+^83}Ɖ Envhxde>@צB@ `@Bmq|E#XAG0ز)<ku1KČ%3iYstaϒЉ>*E-JԆ"оMK\gpqPkĴG 1 :^!#WJۇj[&@aͫqjM7&8z:0GX0hkag/qPDba$_T6 676A̰cj{^u.^-!DA$Hh6!@']KH6RC((hѮz ^7VRS:mK^8,&l"W^>nݹmύO>wf;+㸞#=$m3o,?iwNc!ˇ ZA5'eFTZxḒ1lPc1X+ۧDwFAFFFtα&"vkER Ir)v` qh@R, H[mc)#TC!V6Z a"q?$&x-D~vd3F3њjN B! u+Z  jOaX% Wg{:+PK@ke#񄩿>Fωr@'p<#V Dz|#& 8^@{cfDn;t}ıKss{maǶsDx?U~/yt+g;JX\t-Sx֘ٔ&ySS- •F#IƐj9iZ&R*PgvOf#n#F#"$`#/:\"] DW@iWijIe1J\C,~o}kPS7!ج i ԚW >bF.62oLFGb}(ؿL`-\ :B 8ϩ>0x~W*JƢVu+o6wXbz |aa~uvcO򷊱u?z{S?px/G`ȑO-&5Zз SrӅ ,@7SrӠBj+B C#ŚE4 %rU_}YdZ_;b5rx$A VldO~cRPn Rޱv]h/H;h8EM,]Lz kV|ʦb& ܇I0sKDZlH*BlZ-35dP\,=4Ԍq[OYSq {%$#RiC!$|"^, ZWW;WW\ٺ2 FuݣM&˟ 27O I]?;}N|/ͭKoB$FW=03n0+$n$INm%iNA$s1"b^֯#\ %Ha5 3a//`T(lBt!b RLKH ,4U0 ̄ȗE=Z@_{Vz6P,"fǾ 3|B|䔂!F"!$yQ>UȔrXD:KR5UP Gk(*@lC,q9}Ѡ1O 8 [iŌ"Ie('97Z41*, @/.YkbiV@Fv&H u45‘L Ub#U)fAVE*W񗲶(hނ@dHIcʱT$Ej>ɴ"raiv!(+4ج`bhA!b yt@3mxp"Ra[Ozz?W_kfggB$A:):@jtĶJ:DŽZ9ufe&*L02q90v)e;\LRxN2҇8pJDH[ U"8ݻ(`#VpG>#Xΐׂ11!S)S ̐DvѸBKGHڵ#څ}.¤ .ZāDAT4).Yj{aXrـF`aOw wkPm.|B!72Xk3_H܉p\I}k}oYs'~o4B8:&:xDFO`B%wPh5[`ȵ®<CtLH '| -#p0F^/?0-d(߂X- APX[@,-v#h (mx߼Q7LAvy SY$z0!zm m&ZD;SY}QQSagUY8)>aܑnBSpunh;̥s1MVm{$vudFe\aa6)<ҸFNM|Z8,d%v*9RܳBڼ|;!7D/ɳb ƷH@l6C7Qm<4 dT)ݰӦ`=bc6(!"dؚ dSM./_q*?^[YZ ss'OO`uu}}i<R py1 0Ѯ;EvO(0*zt`TLy6di PCr%-@VilL$BBGvF4c]fIOp:|[F[8bD(H*dzfM!S,.dg,Z%HVd[#L N>Fo^hceCE2tedDVčZEiR}Oq>{{̬FZIC5NQI5;8 h`)eJg˶1|%A,!LIb nH8S[R$"`:_,\맆#wpGxUU1p2_<#-$+l3rUSPJ R BT 8a0(4s럇~YN)WH"STxh2Jt _FBa"t[2=bCY3h]ұq#iJ 81)͚Өz4dJ1gt  IDATs"-1aD> F6{t dO"Nlb  Ap}Ν[{=Kь]$DT>ԖZJeM(0&S$)MAC񉲮,*Ep.6P2`]N0ʇ$eLM"6=g P$O辿dLex-^%5ݥ3P[./ 0ݴyi[e%esŢ |Nf]!i)IT"j0sPj8ۑLK4kKq—#N tdnV>s{r17xyݯu2 ,O \Bt{;k5D4K;Ve5)ieX)|N;\l#f4[A 'uK&U9;ti 7GU`nmtZQ!)i? 3cTa"x~i`VXp̡|p,`KBor5/ K2o??\X·Ԓ] 0_Zٛg|/4FoQk{\?yݯčmZ<yg]'N/?k+kյuG#F"I|\u0̺2,QgEӑ|sqYfhkSIՖP 8ʒܕK(y5*{tN D Q;PLl(TZ2 zvg'5l*؎NL}@ 1 hGaR] J|ol#lq2JZN8!:rH)oA(x$xy;c0B(S$34)`ǘ%6c$mG1ʅ|~mw}ӝWWVW׾k? ^?g3_|{w/,_v𝋻O7~7}}vy90Fyњ.[(j9B0i$(c^blb4xdK93s9 tcVEJVWaFY TNތ`z|nh.9W4)l(FJ~e%Q@4sC˺x<L wy1*;hx"D†"ž'f#t/GӇDDpaD%rh2c])"_oŴf=r"a4pe85B6JbD!xگ /cI+&>qKyU:X]ux7zɓݏ|=K>?x߽w_c?wқ3*˗777?O...nll '>qĉ={N_=C.□K:${\XR4q-SToywD\4 $t@j(u4eO%0Ve h)Al N[#1WTI;8,!02ynbD /`LJ~țGQ$jps cePt۹˙yp\~(B#@L=Hq& 9bX4 |b5 3xP%袶S7kq>/_??#`0',_6 {/?~OW,///_v뙹] xZWEkq[Ŏx/E.j4#>)zAA/A(.0mEŚאoڨm}㘱y PT:@ŊP15 hjcf(SrHBMR({UuUGx3ώ(YG Ŧt$PI_\^^p}{~w0o+^> S,ms]O LHF%5}v8M2+X,L[-yS܁Fc߁̢LKCPE7Zm0u2]j,A]ESǒ{ZtUh\ƪxMH%^H#( qX8R9{x$$s8<"JхY71DWlFASBCDDIlx$Q!}qRpTPҧuvdO 'm! ܄&߽o?{{߇sw>{7Pn<ٳ'NЇ>.xgo7@+D|h S۴i?t63nRY])-ML~`D&JHt8'%54Ώa&1npyܓY"l%bjZGKpleR\"I29 Nfwt8R?H7(زCR/Ɍ%^QEn%9vzs64~V]*1PXԄ)M]mf7-RA^= *"ռ41f`_}_g^<~O-O?yusF]/c--h *g!h$ǖx#DȫCN ix((3܆-H|PXnHt?-$2y#?siOnfL37ekYӃŋ"=rshì!… Ϊx{ݤ)B!O11D@ 9W),MhBd[BI#d&L~EHоyUneSjcWd!9[Zk̖"^PDLvi,y17cu4e! %ʖn"?Ν7n.:x>1K9`ڪFɻ2[;W^{9tgz}λeJnA|#|3;8xҥW_}USojTw)KEt!7GCF!&$d.YM_c 6!a/՝$JKxk EV:п2;곎%&dtDڎtIIŨA#@!q̜ƷS-#X%7FQ2J$BWS$~La>Sw'UNr„)D3SfĆ=3N8dqŽ]j'Rs4+$F5XBiGIn8E~z|ӟ>>u=#?؏os)I^LbWa`1-hD:O6!:(9 (:aHgZz`(X81t@5Pa%0@=Jgo Wϑ/@Pc,@(s;h+IE !T&\w;P[șzߣP\jX1Kz)8?"_Hvق] K~KP &)-ƒ M'V0\Om.@fUM]t60ZK¶sߛgS' V?^:/} ӃCQz,&.c{F  VA.V6)ޡY&c(!iD|"JHv( L)(U3Z V_L#b& !NI8:deZL[Ao1a phHY]%#:p^V\PX<j-"k5M!R4kEb^ K"4>t*'&}> ϦT9S-g/!  '=P]b9x","GtƭJ̤|bV%"%(* 3I6}ob?u1 7̟y,/ñcՓO&| mtJ8 %i/ 0z2DQbSD*ȑ "PL4d{:r^kn".iib4;iD:~м)sŁ%l OWh`Uč %dV]+)~M[M(O$k|1'rNJ*bsl᧡IE\BmF0-2؉l2>OBy,2!S"(GIie=5&'&P2\8.qᗧ `bl KmSqрX @H<󄥬 :엜:'jd C}"%U0T`n<G-pbšd9>Ȭ4|R.Xʹ3lxf~Ne"hBlz5fփH1r| 2EKvr 'Dx H!ũC t˂yb)IA7@N{|{Cxlu. ~Tau*vmɖX%TG5"Iv{vܱ8qep+L(ja &r^>͚~QY!P$ `DSuHtn 8(Jn8l4iW&.qlR!cʍ&1.hBkf]$b^ɼ742p2N:}b9v RfV0CuJU$Oۿ *Hh5ѝ0ʪޒjar*!&Z$Xe|#EFqgxK1aC2.-퉆#`ʟL2ʪKIB & @]ܢ_ 5`,̠ e4S0%EG D ۀ6X+bp }%٫t͟go'oO?{qn0+WO9fڮյhh01nBv<N7JEYsV_pJ= v(}>(a>kIJcA5GU:d 6SmMN/y+H:uK?ӷE5؈v AF eLuι+t">h&(]~V4Ѕ $dU#w&uQ9!Si*-jz )``d~0vR7ֱ,UԢ́lW}m5g[-݊ PM1MpC?A'#."֣ZFBtJ1RL6*ymI$ӷĎA S8zUU?y\D4*+^$8T*+|iP؃QCɁ) ji& ÷ kJkčB`jЦqNgC,X\WAh iA4"" 9{vs觌1ysD:>ctj'"pN1Mej\ tߛ^( O/IHR 1~[o,hWyq[ N| `}%3@lATʐXo5ꍭo T*Tݭ% "tHI̕J\޾1 :NQFHWt;6Ռ۸8T7tR .[Y9٘ώaM/FQԪ $a ;kʊۗЮLDM: RrX[B)ҳNhH \T:?ʹJbGN@)QBހy T 1 "$Ywg^aWɥ>Τ DF!7:Uk+-]zm" Ϝ=ݻwO6EθQܯKPvx"ݽXwCi8E@+1I+dudXQ8\>,l䒂[)cѕ03vg%VMSdfF&!і>/O`L*D ?93!I˙/ ヨ\!f,|DP Q@n,!枒0xԓs! c"q W]*)L) f!pwG ^n1t)Y(Q =_CΞ;os¡]w9{~u}?wٹc`%h+sX0sTB!OySMhgƯuu BǪEpaXkTЧ3\[˅ZJCgx+ HH 3le!6ڳt íE d 0mZۘ rᜄx! c S7uѸmF}`0 pUbX NrECՆz]&aYp2LJG J6I|Ub{ ޾sCoNL&B!mG@}E%iSfYMd-+qD`Б0#)'qr k2d,mYYSrrKJ}`ͦF(tgHF% hTOQӏc sjen附ԑ @ ?DǓWW._1ڜ4-{UERUn {-ܹ׫}4s"3#LKBlDI0ǚ G櫭Q,2)6yen .m9^H㧈b^,MQgw ֗%{f 4++]Y^^7o}spaLnm\zԅ;{=tIN&&çc.dN@҇F6G+|B1W$ 8qtк9W<>gm|Y]nmbs¦4$~j61V0Hjk;Jhfk囗SWfr[GaIlFZ7o#i usdaWOx[ zFN"ϧ>$dƀVL*쀒/9Wl33ؓ kSΝ=wic}kR|+-{QOG-'\@6\wk..m߁{@%GRv u _kH}8yss&pXtH6+&{ Y_w IDAT) s ϴx0h dۻ('j⹱ D bdi&ReKXDS>$/IJCjHLaqAAK90a(j$E@®C9*sf)(B61UljCHj#Æ>㩖u2gTqe/_ `EYQJXD⣊Sjbmç4|ҕteesk<}-3xOCGFTUns\ml]zŇ=z}}"dA${ d K `TԖD=~x xDdP A#+ +gG(k%Ĵ/hwkPOtPаLr [5 ,n0 AQ#C"L4o:V$#K5m=OzcknEB,`xMDuUރ1?bVuzy+Y0$p hW]d(18iP'7+'O>{a}s~~O+S|㷾Cȭ ~zwTjImblhl^ bJ1o -(h}ů_J4[oƒ ;1$tfD@UUrCSAW\= -n`XmT fYW;R6eW3Eaȇ4n3sT]V<ٔ:ikfQ|F9"´ &5$aXo[ [+ΜiDCǁHɼ(jt*fKѱ,0"RԼ>@A =J;ĈF)R@i'^8֤]O&ur2{f%. MH ]23i놽oӗƕеUsru;ٖwnw yŧ-z#YL( [Yu :(o_??'Omm=z'*h8RƹLQ:j+ѦMZ;ˎHiiP.6Y3< Y%!m(ɮT^BQN3'#w {K(9 U-֙4!r,q[O&xR\9razUsCBpA38:\kEju  r!"XE0 ˆ$,W_=±W6&zcT&e={1Բ$2GtQE@re/9r%- oċx9Ɨ4@O>!֕ w* E/ֻ!cd䜛a5#MשuySw~;O|~~ǹFQ`Eu kGݰEѻ+#o!0sbs 4K(=_p/ A,C֖64"(f"a^,HzIRE9Mzv`uR}~ 㺽|/^5j/"U Avfkq=gg==AMT2s?̶@ hf(K/=嵍xkRo,^qC-F0hn!`ys[lp̍H Ҏ&-4ns뮅#DZZh0ZʳCEpͳt۽sK%h.?:ʫw~3_o~ׯ9}{?0?WoA?Ŧ'9=3(*q#-"4#VGcOec0(z< 9;&BY-~}+"PBP-\, <_N@Q;(x] xf|sN:syec2{/Cw{~~ҮG~hҰa<$"-GJv^TũJKzj~{A$e]B,[Y]?~յd4i&mr23@h:B )xD1e_9wAU5u1s[ stT>߶aԸjnaG\ Zjؗ# 3Mݖ\ߥifؒ\Ň GgcSO<."s9OᙳݩO/`aaȑ#[Νp)P{I!D_zP9DlK9;ƨ;( c]b簈a"dYG1!f 8Lo.t7&|)Xqr$m y$aQ)f #EcV X,T★Oc@/qۍqs?yҵIݲ{dUrո:{ډn߷чmtT@4ç>%sWP0HDRLO]G[d2sUmA_4ر )$~¾}szU{s="1 CxN)̂ƊF:WQ= +r(mm#4+Q*ʋGš8:% Y@^DWd=,@ HW$֩S??;w}__g r̙mჇO:>s[wyuN%K ;0yڍ85VPԿ>=NwĠd/)9JiR @zK!@ u)j%yIrm]ΞƦR*@n ًk͈XUֳ':fF!6MԞEF+k sc;TtvHXpG'08N% 2s3t~'&;i4pu* '$3 !Jꕵn]3cZ3 VCۈov&53љG깞1H"dkZHDS2u跣6yDUݦƼ, Vsbb緁?UUogϿ=1'}O{@<}s/R@n j+Ka0,*L:Uj0~r4a* yMXC'W4ɹе+2ިqŎdW]@|AI ȷ^̔taƍ9{+y޻_=Gj>snī [st[u3TPc+k|] 3"L]ېwfmL1!ي% ą4h֜nw}nԯdi=r}gG >U(B~W N48spߞ^뛣++[cnu3M=ųss{30 ḅucf=v049LDK5,D.'OC6d 񆉣,>Z1bjٳ{v{iD`ys덍 z"277Ux'~*2y` E8) @c&N5,3 j.CC{ $IG!,^*Hquv N̫9,EVqL}hltzO8#ƙXH5ҋ'{~}O;[9Ft;_>>h0#~c3kG 7_8=􎙪Jp/ghELJnȘcAý(pyګgA=Fh&#~_хnn@zqTUk~}lF/-x/p|e7䘽gF-2nF-1]"f}uf>O=2.iqvy ;o]' _)[C :<0XYֶ~qq1.Ϝ[XX8qĞ={%X[[es-ێT):)--bڞe$ r !B1HҲ]-!SH@PȋD{g ƂrgB;jeEH>t&i )ˆՙsg89UX"~>O7f~5a #;\p;a u(V8]Ql&5QF V'("^C'[/0xFB@gd 7{w|DƖv/5?U,9(6@P `Gڳc~3k[c!db\Mv.4 Ff`$'ꎝ{&mvGʐ/1$bX=]/a62o5aݻvzoVSaЃX0/eeYHTC(QFL":`b8KԞLL1[x]v̪cޚiY !"3`ҢUė b\Y VOp׍{ܤ¾oDM& zķo }>*J|_Ņw$iy! nH& lMر6[f/w[vf5#vU^Ž^EL+sm]櫊~C@Q㨱1MUv'g(ZRUxi?xB"JG.}{ Q gD8𡣇G1tq'Qx(j}{l B2p\83Xeyu}kf,\7<QM= Qv 1JVciqFb̢?·˃hl>y6BS)2.j+APcӣE8X\cDf9KK-$Q #@\⁋F缴iDL?#5=bX oSrVtaҥ+W"NRT*l],/2nV{/8p@_6a@we4Dmf%p$p[3?WW4V$Rzud* !+[ }G+q ˎzmqF_xv.<|p74k}l.ݽ4S3m勣WLV[ !<=3rlN $+J Z)L/8GwXHPԛ/ #5 HFɩxH?!xŖCm +>R H\EftHr{WN_@ns35Q=F$v@'tVY59EM@Mh3I*ٙP_(QЇaHCLsEtk #!BkmB2d%qRUc]45_c59crQl^7P.zeBi…޷>xO?sx/ TZ|}VۿwU}yre\;wWYi{xˇ5'qqEͧ:_0 V7iX9vҞxH, E5H,<-J `9瘓 D$‚YK&X \[ꃟao7kKُp{ #S:e]g\4R>~$SZN PWr&SPnJO{utL⊨s 9ƕg OV"Hz(kWn#\<3+y#iuvwr4I1D( bսGztzρP \=5S0ޘU?"_zOe!XTdbć["sbc/}4w&!oʸ*%/3,m,7dnv3;NQ>>K-bdḞ D/^MZU{|j}f#K Wf6+^2"#sIYQN(3 oSz^_hk'Ip )\R1P>†m9d{p^i{ 9 y+.h+da"-oΩ׵}#.)4{)cFާd$ "u'z$΀ȏ/Ud8 H錀>7fO(dg]@} /lpӶqOSr.G4‰yh߸[w]J92"׫^; ZF"VPR ,N ޜw]٭wr7j )g|YbMs Z//4?*Jvj+3ݩBR"Әa,d>]^ RILyόԤ/L$*]|u+=CbPVY/< J>M"`aUӝn-Irݼ2V^9D+/d2V-UaRZ''4R@( }aTD EƒAKCOy|}RۖQCY95YFHIxmX]i˶fM0!JwK1+ /~qښ-^N1W_}T?h޴l'!3+KU8ns E4\n*2EGa|:`v)2CcP 㹟gz6URtwast0߿hL$TMwQjE4Mr_92cx uB aW4&,a3,&& G|})oaF~ӿ?.-!'xcFA6nw~t.b**Bi(r A,O5̺ Ǭnkl,mjl7oǍ6$ 36"H !!RF"SFPIwq,I|Eȑ`" 1GLJn^.#4aVj끗12ِ Lcu/Uj\DgWˑ(|ZF By,Űe=S?=39y6Bfcڬ_<^xY^I:ěD^T`D;W+C, +;BdJi2#4{d\(YZc48 3"-a) s8]q?7wfvbevplvnYڋc:YH-3G&2i]&9& ]@`aw"@t9w B'$S+7?ؑ% Gw҆Yeb7X5k[@JP-ɝ$y8 >8| X:zyZww^BipgLEc,בx)Ҳ3Y%LDEFe,$,GN̛su]؅\A#f"N[:~}۰,5vfhDv8m \`vVT-|T_6D.rʟ<1R=Q ~UF M-l^ޱUvZQ+J0Ox?XDDEBX5i[oϯ^/cZ32 í! b_++'([#5/ q7I~.(3 5B-`g[ȭ%߸fwi}cO4l):K."GKۋyК' @\ᰟ!/cF _Mnf,u|NjnDb,,qW1h]Ҽ&N@R\mL(NpW,E^~f|٬lC퇿!.*eHqAUl$\qK,fH9UՀs&s"[c!EVGʆ obss7;yG;;;J,V_AE ϫj8gњVuP&wS,bR(ˤmBC^yrr墿^l`0A$w|(=9Gݸ7ߚ|L5Тcrg$lFR0;y{ϰMGJ侁sa8`÷ )N,:%&ow=?:>{gu$'D2%,wb3sF31 ٜ\r9Β!M[(,LGu};L/5{Ta\^z*.@ֆ;dϾ~l>e`\d@/zz'iԭp`ѠD"0N"'2:ye Yfu zE0(T)Rl $0u / 咬MY) #YǘxxQo*e<*גTpoK#MZi?}̓'v?=}kD&$"e)Y"o({$$ϛ+{׮7.J6^Т֨uZ{6d-JO?=8~g>ۜ+ܙzPvFWjcP둲#k`b,Yޔ rg/۷n]q+BQI/V żL:I#*| wz4aSN2y}<>9c_d"%NX7ޯ)F2gx23H] ;3I5[x7 &!0[)iE1(39(|z8fΪ}1))FۦN`DXjTL4'Oc(N5ߙz0Zxn߾xSԭ盶 3mHݳW4 #u}bjsOvxٸ2>%مO_i'yՁx D&ޕa燃ncA?r(|'U6L!b T"eTBg!twg3\_UP? ?[jJyRPC. eF^yCO~sN.9|t;#xvg=8aN̡m6,~./K4oD`zAy%H: W^{R|峃ޓ ktrow+W,Tʃu (Fifs>ZǛGV_pC?GOL(rgri.6m0[>GOJ Lz`ќwRթ5oЛ>`0el;_l]5IHnp/v\E\du_#3LâhPAro{ggX.FL Hdwc lT4){UR:\OjOKYH#)r!GGoãA0b8y.-0HvڽwvgvzܟloQ$PzQdG /pqo$H2G2HZw?GzMSޝI6m8Z4W7֍ݝ7f.I}. | x2АVe,Du w'x|lֲ}c;7ҷ `q\՘bNؤ j]Dh&D)YGn߸pDž=^x3 zvo wǝۋpyLd#HȍK gB-fH"&-3d@,]Ð`YXAJ#U. q5k:%iMo|3?qJ6]Zur+="C<jngivwoVmgۜׯ%a[ M|Y\>c.HJkUœ$!g6WGGqK#( Aprɓ;o]ݝYZ@  }ps6QDDILb2`~nJj)ě" :GKX4Ͳm]ݞyX64Bn`q sz7J.'eҭBNŗ?|~v{[O>ͿC#w6FgS3DdS͒G{';3e# ; ځҤ#DGJ.G/O F3$i8dP_/9m0Vb"YlnlcOfDhD3Wʢ![Df"9SSXEUR+u]weo֭^\4ͅ8+5 _', vH3 f:!'dt9^_Oei7p!q l7W]oκؿ#\D,4IC'O19uv/ a6gMo6lޓ2DB;kgij3cmimC,ּ7'\N@rAJϹ0P?UtVy./gřφn7?/_\WNz27ܙ84ZX۠;;{*ETMۿ DήeB^b* wܕL$1Sd,]<=s=HoE 5(F-5\]/t*B$wɳO݂<)16sPP!rQg0>Dt bkj(@~w^̢%(&Q@^S҅egnYV3+&Ģ#?x۶K~8}ZS2/+ޓ*ARWaixH9~dP̺q}~zvzܥifֶ̤ MJhUֆUmy;#ujÕ,bNnM,j L%8T3!LSϏ?!kg}5`f =on\ٚlv֭ׯ]]no5;[xqt?=g_1='wڠdeO\J):$xm3V&U c"@MןS2.Ej=ٽ{a "ν귈DX%Ir|7GGm3h ft'/>{K9 Gty^,.i0Gtzq'j<3{~n^=_tUɕ;3a߸;?i DHsk}z1pTo]U %D2 پn*eMQ*|Ԇ%,[B~{;"6m;Z>"zgks/*YhBp%/FHID4ls _~ruhyeQ*̧"M8XFok^d^cF_ ^*ETeɄIjh+7kΩju𴘵˶a\jP $M]?m#"$npXT@yUv9,!eR>ujUP#NBL t|ϔw;8Frƛ{{tgo]n_wo{䬺-~rob6ڟWw?m["!8åD"_-{a551{ܕ  ,k~޴<79,QǻWP:yL89>g@exk_PhzfM,z%fbJa}p9f 랾񽷮x]%܏*`v !@(؋cܙBzݛ꒲X6+x@y {9/OZ" / &rћ9Ǿ<&RTv> t*28ff!>ޠhhdB6 UT.Lf12T;ز1Ob'bC} -FbLwMwzwۭ&"'hY)dw?ѳo|{Xoz+ԼjWd7yK:j\9'Ļ$i,ݽ2-tW9Ig|i6A Jl;r&1Q9H rhɉ5p "qd?˯g'׿ "_8d'j7._s~ua%X5FKɛyݗ;`fW*XDAJ"MPU$}ÙT9%k."9-*\*93kJm-EN};xK, *'"j!I|\]]vֻvMRӺ_l{FdcJ.:oݹY_1Ɣ{xi: /#fpȔ96fy2%"#Dpc57yg̉>{r LM2Ó k.bp3Tѧtz-!1bDDV.Sfې AVȫ:ݳP /?<>XIXuQTI"=%Rb,pԨ6D.Dsg&Ve6v(_,?=~像>ӻ7IjYܛ&DXx p{ qD֟QEBA%\ȕ ?Hl82&Ի2+kQLI8V.lR 5ʤDa-d\*d#k2V~FEhRʀct2>b UZ{] j zϿ>y;k@`e݀ Hjv8Cj-9eDܹ9]+[sQ); `NW߾8#:3O -`7v/Sy+"U3EzTZEOU̎ V| o{38(YbX 4ku6d1,E&LQt$gKCҀ"m4-BpV#H37pq99(ݽ_٣?9xuwOFr(|Vnse[ Mk_F2D} l^[OyBP.#! p$W$?Rb8f0(֒<1g{V{&ҌzGrF&V}gRڠm"4Dl>զ\89?;:ߜu0,9QJ5%hB1g|vz9hInWCdϕ; ΧK CLj"p2ΒsJ))n;oh1ψD}3V[V{D]r$(Cg$?g;P86>8b6ɖ(CzvyUq/Z@ eFqɅxSOReFd1]!sɉs&֌.B܂[-cp;GŶ+VRTcbTi"fcDb%AAs5(8Ȑ80R9V+/\oxN?~[m6m0hm'1S~qx A˭ZBU(Gߨq{SnjbY.fLOm%;yWt16|q63 XB42mVYj%gm^(7,"b&·vo;W|<4vI ɽxGSѓ/Nfז-3܊ծR"܄j2mfaLvsvbM4ӏi9O MO ATb=ψ*ֈ ky +X<2[jLUDtplb,d`ƀ@M+0"a#rG4LL1Zv@Jv}v7^Myʍ{;˅h1 ce'D8aQ9EO($9M@<lb1la#aV% Bt#EgШY` lƾichέ`qq׆L"qO;77'PYT^Usl611ݝ&2DHD4B&iU1yhwn4s?|r0XJűHB߷ {1˦Zp:/ɝ<G n3҃IRJxƵ73 JyB*")azыyrauwr#v]i%kzooXӧT+0-ȑ4tZ.KWS9O. x8+ߜSM;v?w]RΉxL$Y HJ!f~"B.ٌu/3ZORM*5& ΍XBhSN*67O<}y46սm"(ݟ=;61 2cqD"GMzʟ e׮7̢$6%JA].w?7{vCfw  L. wi\])8ګKT|Ѯ٣_Q0oΩ}El)LNOtr==8'o}J#eDF"w'E 1zwgQ@-yH d13vd1 6F{8J~KfL$Q! zypscyoݘ.@''h[򞽇pgޖ q1A64kfL@ٜ(ۯE"sdl̼Is 157$;~?*aĂ./^\ؕ!~A=3$߸A_C+ǀW Ol czE!\G/|_ÿfHŴIdɁj']tF@)`m}9&&(Y3k%u|:HPwO'qU%K,έ3%(ĥ@]_o7)A8㍼i}"/;$| c#l#%_yqzzqtoTՠ:95ReRY 6Ç?|m̒Oae3M IDATW>2] fs(9DJxIm48n.y;z'f֧۬'y+QDLpJJ,)jV-3JʖG7M{ sMA4ML^$Ŷ0!f^~sNKUQs7N!vtNOݷngfgm$d\M;#<9D@k[0OvϹ;iM& d)ݣG_|gmQ DV3x:$V19l\[7<,fxqUxYBY""p3d273~vrwf%%̛vfA[[>r+( -;+^IUfw7@݈Š 7K2%XPkg}@^rXSf&6q>fI(彝b1yJf~7S8hJvZhA.$ݼr2aшiUhs+Ûs_!hFc ez,˲45s`CxSef%x~H$hB$ !$$݈Ϊ"39<|f;Z<9#_yzZ۽7<;|q/\t* B~  `~f*"(YIDu!aoPDU=bcK2xbF*h"r>|-M-r}l*\M0Eǿ1f2 >u0a M1A4Y5SnSU!bBOfZB]eF<!fgL?$!,\r;U-Ml,՞bّ&}kj<[ߺM+̱ ܲ``{o? ehiF`(2 ..ϝ9y{{aSXp촲VF"Z-VUMA2Rm;;J %;_/ja..NO:ə~.P39VvzwW{E枇>:DKn)݈,ĘZT k\BVF3bb\d2&SR38臅EXXKX Xj R)bS1B~՝͘c¹͵& r颤l \R|׏V4"fSS}QѦIPDڥԜNndHH̴7ntj{;G\hU~^[s&t05+:m !!ghƥ`g`RQqdEfTDPFjA6 27r(*@l‘*S_!f5&́45O6ntɱP[y#fkwfKԚXNlث:5_4*$4CtviZř|x79zyzkeH@ "w 1` (!` DJyHDhdQAXI4`&St! apؙBΟ< /e56V8s _<OXTAZZuO?}hTׂYN6UU9֗gzK?*Gb/KԌ'FL(H9;:t'uT1{^K]l:<|6pwxks;άm*%U0hH, XʥkUoG|rL{ҵPjv||E5@[ vgmnɼc;5S=35WWuj1,"T.YVd_C#9}qk+Ͽ}ʕ+gWVEHfd(ӥF&`N').UD@v/$sT4%G1fTJSj2 E9jQ$F"q/7. j BΉ.@TEl6A,,/ggo3;W.// CH&"@Y&!"3*zy01#`BTU=1@1FCyxIi@1@1U |iLN,B@^qŭU@|ftNDRTŒPL2Vu F5N`Ġ=몮 T%13ry+#ՆdP jCU!悉,F9$]`AIX!"Sׯ/K4p2#bGL"{w3Rc`RtLeo`([냵?փ{EWPK{ Wl}U4{`KdfjN0*ۅ$VjCO@rOw[)ppl|x'^>'=z{)@jDHr`LH C,2A\?'oӪ>G;΁m "q4` L08AEk8nBzv=ĶCЖ5EU':I3- }ns6BKWs'l=Z>!Q?;kW^xZ "@dbl$Xk];m w(69 S 8#uC*<9ZǏ?C Tn?|B( z<ݸfZT|Z{KbKh&bvǑ{fBX0p2_=|;c(^[_ӫ="CJ"b"#B5WAg 0Lvޘ*nV4lS:Nkz\P5QU5fs*S}h|r.9WP&D8Ȇ(R?މ#*TV T ţۣ,"Ud4A;ћA'p|dhPQAͨOㅂf.Dl$2'Ubf%UEop4VjTD˲?T=jk9MTӄ vyQ)<`4d+Klf@,mlNBd7_ξM'hd@H llU@Јf[g{{_>vjcee<\Z/ "voIKi6x]Vhw>H*Ƨ0Yc|zUl6U `){C <"GKWU aьwb,HYmT!,8`gs4gMq CC7d9.Qۥkid.&w^/`D-i5M'Us|p^Q ™Օ Ǩ,ُ|UM'v=x8FXXTѬ`J7\I]D!(, v&[ՂeY t՟ťXj@`0ȍ0H&$Ĭx.4P(faTR$+-ش.uwW˺rJV+@1dAD}eh0:E' =+0QDSeyme*q%iDcuLYA:y VlmrMt#k񖳯#!d,Z L,lg[WHU BQZ0`TESع]a[ao>K.k biUo=STfHuh2aYY5@kl#?I㤪N֞X}fB.U:q[y%1~Ao^<Wi]U&nrIզKluKUӚ⸚N9pPB+"s fP1`w$ &qQ8V݃8^<3EձT+;Pz?|[k=;c%uzIj9Gl;IKgҭNȈl D-i6 Ubm0u"NᨮXRab1Y ΓX*JeEAX&iE޺fkA-"**'gwk؊HY_K/MAM5A3)^n޺JR͙ D*Gxk55"`ATx*_yLQܔy|~^Xa];wJ@DtV񽇏WP f<3̭:$J"pj{C M 7]>OY- Isd̋tǗ~ʈDh!XgE"`Yi|wbd4x-3!C dRSkjU@ ZjU<~_[]X_KNfh|xx4."-ꅭ㷷TkU&!N؝zISaY58NjP G*D)C񱚀()`-DL,FX =q41NG դA9UjLifVPHVJ9P [*YnS!t L)JDew}ry7O6Vo}}T 0Y)@{M?Sn?/ ݨz #10"4gR:RVë:"aYVoqe<}4e5t"3#T B)Z"jа 00<(*1F3K=i,W3 T5F2@Bf07.}sW=VY}}9,P#taSnKUnҖus-[q6%SGx0:B%P 5@Ve=(Ȥ 1MV8zFw$Tե$9f,C 2E0$3U3F}>Ih9 MEb"H-bnvbL pgOl*h"㈂=%FUq -k b5_޺lgmq\~IxV àGFd/ڟB L}MXF wlMᄂsm@w^թy|JL;&~3A{Z[BYmu?yt[;&F!BD`M#%5/WCA&уU ,!yd9֙^'Z[ fF}hHP_Ҡ?Ϥŀ` ^?_pV͐Bd1HPB)C  "%T32rpB 3R7`3@&g&Zb "Ć\R#%u<6}25$nj vYԁ ڵK+>G+F jrI#3<<|uε+4Y)qbnW(hRV<t![hE7C4SI%Q0Ӕ+xSo?xV* "fdf|ٗ9tϙreQ㨡}Y`L0,7.}J:t*mfO)iժn"Qyk}J sd:tqK$ri6)X[lUqǚ$0 A,5y) rq8 VU(dnN/AQ"&b6G=-8e6[^MMSx΋{m#H-iysJro*-)ۜGѐCǝcޝɏ-6Lٓ b$^8U$sg!2^Y:-J엁V@mUHRRG"u-U'T$J dbD" Lq~+eeKrX`. hDLE(#s8P=W:E*/Dܝ9b L+3tK&:7:ᇫBcypki`U( bQ)jM j4f:F5:(8H7w XB*,M,b $"z/-   4 a2`R%6[Q2gp)'qrHFVzmgI⮒HL`T 51NT3xG~` L0eO`jk0(Z,5?~mc^#"X,LvNYlɌAOUyb@qӉpz&:5343{O neBTzODhX工Pvwf n?ƞz^澇3{X ?xvFB2U!$M.g PhVTUUTjѨVA<Ug$C^@$R m|{FU QƆ2Ą"(ˢ,\W!pD)ފPB`Fhn $ &YHePF% 7~MX_jl-Q_; Q@ClG!5n 7큌^njg?ox;+6ly(ErocJ9VȁJBAED$z2wP j@E H\0x=mN)aIмIܢn! F2h0dK:O:RbX#*J%2Ė) ^.LOh v fu:U-O N^*\sˢĠM|ffRʲdX[U~^!!112QQ~҃8a 3"$ `/&)B&Gl&׍\;nQfW8_D]:=Og"F@R 6&;9%Q12v>[DD[.Gndf c`F2ICFD3L  3xF`HI#lM9fg-rCqs[Dβ?QCu)P$;%Ll}qѼONbw;Q BXIPbfhuuH;!' vA>&r5*/x& Rvzp҃0ʖ"1jD 4CBj~dVy Yh5YL!{ۗa[8w䛅$>UDMBeDPRPC^m(C%O3ҦXjJ3^Oɔ&G7?7e׭N}LZ9oS!'22$3wLtWNxJ 2(ZW;bftvhNHJl$t]Ɖ2)9l^5S(xT6rS-ezh8}87*95 5:ҿTH8yt6xIvtU[;m[\4e޺M[1m; RJ[5#M1&*hm\a9-!- FM£EĎ* yFi!033a/re:{AةMvExI?U\[qx)A. E;E!5sssBwƁf8!!yI%~YۗHdGUU|9ΧV2?sRi0tS_RՑ!6bTksp -[isCs5 nbDf:5kZ6Fk^Ցkt*s!AYBmn6n qlJl*ʼn?CR<{P5ΒwwT !amj"݁~Ӵjݨ lyZk M]6=m@;O7%s7ec  zMw P%(sh0lpB1=zة"Y=ФM4 cd@TswMP? $6"`WdH=chqhb~}5u$2>=W:fev~K|Wcɕjm ӦHEU}8ZQ iMMiawnN:aj;[??|uSF0"&2u`Zuj0zyD*ri٧jD&X})K>O D}0I+rӛ/{ '9뵨tf_W],m;(_թo/WۙT!$%Swmei܄,+KpP[rtcw}%Sv OD0qdk+ykLs.1 ڦ{nsDn-l%ƶ!7WI7FLF͇``̖H$EXZ`DRKL#z{/Y`4 Bn_ǧ n _ibؓXW+F'HrNޔGl9i%WA&Yv*l*z KlY2 I*lg@Il9/g >j>?w8oSu<&eqiDst:E?U]]vu0ݽwb5]^Z:\7ի=<<6eiŅ#EC J88tGw|c6=~bv]l/͍`t8tNQ)Kgb\.hk$2΀HwEZgu]!7G3xqZu6x-pY䗧o@ChH!:hHbR@w2O륔ܨ1;$K+4y.aЪAM.u"̃]ǡ(InZgpAjKC:RJsq"tmA,VhFnAk]( [kv:1s$_<܁XZ/[Ђumvvs@!"^?DރDjEQ)z=c:/Gu]w>L/ ٬z=qgQa.B\\|̕ط)]Z LAw 9EMKoL `ץ)N%&$k3-?M9eJ{c^t$2B+8IR&#Tge&w{SF)4?킒<2N Y* M p)ԷrЀB\YCWvK-2DkzF Fę>ؗt] ="22@p7`/sQ.u sI_nQ9'UQ?K*}lVjt`v6TQd*oGS +fw2__We9_?g{Omf~?/'Ov G?onܽ"BfBG E!PȌ\kf[:/ IDAT8@D ĀB8"0'BPp .B(×ERic@iI~#P79;`'2u)P)T8PiIizds Ѯ-1***@J4"FZIKӿ?Od P{vb [-̠Fz@I.D mM{57O3Pum2 PcI/--ʼninS\Nh7d*m !m1=ܬ-&=iKd?mo~pW ]8DUD&ɿo{f~gzѥ"[(3""ٿw={|R҉_~ٿ;?vӇx_h7,.};؅a7](" }6I?Aٿ֘^0 109 C`.8TB`*3s Č~3#"PɡPP80STH~;Hu\@ٔ!1ywU'zyR]]oٺ*&1`d `YQgƹrg/8\ttDENDE''EBBH t}ts8Ng T.s~|waD6%t#! 2UC1[5(dj* C(4C 0 'p&DM6?%eqqX홁)FP34#D#Ä P3 oDB BcX.f&-Xh8\(,ܢZMXae VAvOMDnDxe!¶AF#QGHD{ SDB_4FB͐ $a:@N'Ytq>VwB lZ6&>Qu|:Q/8pnXU?pǝ[~?ر)sr~|x= c2^|l%pwxÛWgX3L71Hݔ0{ڙNLdI”3cEd´ L귩2\t`sLnwCRK,h(s$I\!<PA&2҃ìĘ2ҹRS.j[/D,QNՔ6"(龒N `]OKdp$ ' &;b4sLT7Q D7%#N ƛBi_ZSB8Ʀش76/0-#>t`|槍o^xl…7ՇBΊuJ㦹 a;wΦs޹".U}7lr±XfpW5Z pFՊ Aj{c0Zaݪ.ᡕ˗ȴ 9)?̙3_{ Kpy7?{sE˖.7 7/5|Yznd>\r%?y%lgwؒeG8)Benw V-IW"ޔ/A 9YtfִћYbK]KWE#3.S^'*BaL* ~NR3Gv|d|8x|ZIծG!HE[aXn.>vP@!cx8}<ˇ:̽UR`d7hQAyp1OBvW \HM m L=;ve8hw*I*vCMFGbE_O٥P.U+&ܶR)쳟֯_̳g~ܹsOO%/Z|3Uqw\|DOXj˖Za[ۖ;)Gh.P.Slp$4Mh{lW>MS ծ_USu , nA]_K <[ \ͬ3w*IÈi&@ /ʹ&(meoĂй+Q OJXN ϶V u.Ny߼[` V:}} ha>\ U"Cȇ/@{F@NXIh;C|Lf6_ `<Ҥ Y\3Oy%z7/ sv"C(miUNZfϞo߾E20*V0cc Gf LYg̓Ǧۿ3`;v7oy }sf޶}'G;~b^R7ZGvn-h aͪ4( z INy:ly@D`hű26DA l6,`D)Fjgʎ&k_!"#n grm/rUʳK=rXm@g[@bߕ6leko _j>, D뙮,qopkԄ*<>,uAЫԧ`=4Y\.CѦ`šg[HB0F^{W1{lt۶8uܹs׬Y6ێNM\pfXha=NJV\xYj}|d+ f>p1`H3!ݜX;$WqN][6yֺv?#*%Y# 糁QאϘʍ0ڒTCi֊` ' *엺jh@,Ѯ~k[R:, {y1ZC +8`^FbuPDv\m0sw)UkgT5'I>_,YO6B$|:yccNettu?4ukN_lѦU7'ҽAXGJXWk+r/+1["%UޓFǺ7yHIJ&b礳*9ѳVq^ $ng!s[D\hn9zά4BFjGUZd]ylqe0׆Y098wkb]u0TDdG\bxxhr}m;ftl钶moCǏg[&M8B-~S ӣ#x)ablKwKt"-#N9 5:&Y7Jo.foкõ8p0"=dw{,$EsTyPd&-bpw0IX&=Rnu@vv ;sD%${-0RLX\@IĂC7rWsaY ]2@;u*I-gPPYz OFAI#"[>_Y謅K(c#[_ ~ ѶCׯ_{jѣw^j۶{YO 8ߴl}̙365|-{X{Sx s֎Z MC-g<3 PY%zQ]frfἉ3{'X .$EI 7%ʥjZIɆb'uL~\%%khpP68 ZBٯ#VԔAdCHZɿl%p!OcZ4vzjd{c dG.`VfKpAM 1OÇSzf hs%qȿ#!QRX:syp^ksO8q&M=zނ_᧯xR<(6S2yŵRZ=5M#^EP4I TDJL!xd;}tc֙Z!:)3a,Sw2 hJF,f"o"Ǜغ|.Eۍ X1af̤B)RR(\jkʉԞ y_IH9B[B7>l-}h~jlc:(鎴P];gDBl}rrE^|4}8xGO,9t豩5'2N|ٶt<:9/|E~Z>rƯ|mjj/ Yr3|Bw)cߣ& r3؃ l}Un9gA8A5wBZ)IRB"V*1 p.:fݢaoB Չ\)bN;c6ؒP!Vܓ;DE)-\!?#\DD(c{xw9HZv Wd5B@Lji؜ U _B86,)}#2 PŌ}xfdT)ѬS޾s[y5/w}?j-sسg[xͺ츋m;9yзyFoW.\[|kyn@~|&jE. pE1\Nq-BS*&⋾9l@eH߀^K۫J)3Bl2S[acԶbk. '~ AB U2zL)dÅJuFL?Vi uv9֠ l4IU^r\hBBG?Aʾ1<ԇLz(}}M}ZSmMdx}ԧ<=9!ozï23ߏBCtw9H*IX; j2VKD:% [:m*5NX$ә^㝩q eZp51b#R2{%*jeVݿGAtȫp Du3_j&pf}Q8ETR4r-9hPulW* P5H dH B¸0j;#-OD$ 471ߗoúU\r9/:ܧ=tǬ*S˖.?`ҥV*EWZK{Շ?Çϛ7}5+۱Fx N֫ӹãmt6؉gpbV' ){!"FeV/9tTNwifw>F,:KX* u"r(,>ڃzZcpZ(i%",\N^3TcΈsdh0X~24 8L20 4F('##hFYRRyE~ԙˀM4uD" fb} :TBV35.XZu/qUG+iw\J:4U+4UTҖY/37n?xj>x7=};N,_d]m{%iAo#X)Fłd;դ2%m%<=.&r!7T@Z*jBI -4ՂL4MRÃ_xf V OۆgCPX Pz}J ]ZAP_<ZŌ Up!JqYOӦLMSK8jIhʇ0q5kB+޿/LcW) ZeotukO󇇆>k?IJe}smE-T;PuE"0̕Pd)`Rφ&ӂI10& #IG_~rv_\c"A|ycN>{K0 O %' }Z$P aM,p(Yƒ, ;o>]k+K%*5RBMc{Fry[Ƣy_*)B˒;说f)jʙA*5ͬO)ɎS{$j6X;}HaX3Ҥ^{Jb~UnS?e(b4V.<%I udhC k| IDATɼy4G9%AtmLcQ#{z"$b@ 91M}ٴu'#PyCunuٛ^ḧ /IZf, jهf(@yH02D(-&gI|b /A!PuPPnՌJ5 fF83ujǢz,2! D$S`lAIe-5"ȱkWGwH@vTJadbqAlé*DZjƺ5(B5Y # AE&23zTI})V C"]rqrf%+Ap/pb#A$Cpp$b6Ig?ş4CKvyjbKի@TV*֦ 7ZY3[bÈ@Cy6b=4Tu곟lذn~vѹs/7sf櫞;~sy)]l!LPj)K) lKPp:8qx1aYAv`,#1X :Z֡AcPhI5βU,EtІEH#0+䐹M&U`Mrȝ[ySn뮣G'7lXd|;wڵz˶u7ƍOF|IP:VJJ%+*3|YqG?R '.D0/OXTP2$4a zzXv`5 9 ,vBʑrADȰt ߦgw:o:47,vSXcr!+J,IxxPYŖ1,bW|wy}k>bf\KYRԠpjM"X1.e`U &tݖ-w]^7g>iӹϻ41˟_nآESSܹk][l=xy_ gu麷_|;w-?7~ Ox /Ї/>c?vO<S)Ӯٵk0?'3ʠ0 pj%N_v,y` %B?,./ \&TbW(o @(A%>($$TZ8z$ʡ$Vt!ƼO}l=&ܥ:HHSqtTiB 1RF"b \\fə/]mSG%_r@l*y0%3QKL+;z:,Yؙ&& o4[hWE}4 c9 {ό~;;w/gqk_mw\ÍMo:xG^窣ʕ˟'\7r36o[}tz+^^޹霳o[l};߶}~O"yѶRN_ 37%6YN ťHsN&xh'_`F;r UT7Q7E6ڽX6" { ҈!y|/$1bQ$* Vn⠼ =%eS oi/(ؠyyǎL)A;{Eƶ7FBXi`yqDy* ^dF3A/\%boR>A@jP3@u].:t@h~DXĪFw.쒫\=6իV^SOλt=65 'j!ew߻f.]DDx={.]d;?yS|嗾%/>rg'>54 xWOK *-tNBD:C c #P 1VPSO`%<-7ʋKg tZLbLn_L;mx䄙ƺ,-ʺ C0=G\む+Pӧ qNffx(CqH” 3k- ,/ +l\ NcfHgfqhel|I%ՓIPꕊqDUme ;*~"//3gy||q?/YF^z͋o=k/ys&jϟz'^~>\+-E/k?14Լ??1KyYgn_>G.|K_|Yg{*It`emS=+V*3K{ jug)F%h%l=:ѣ"S Ujm1k1W J:p)6=HIV$ij ْ>xp"#I#sϭ8XT| D26=PM`~WJ6a֥K%5(0|$B6뮷qݿw}[~ v%+WLLo\/\*.wTvdDz+ !1,99M I#Uhd\@)4 ~W4 [m_ YY^Ae?T3oLq}ɛiO{PA\U;}X:;Hl1̗LAѱ2|Gg|AXxJaZ}^hDBp^X"l۶BW5K} jC4 ѣ?8y:w6ť{.BD,p)`r7OWSkĠb6(޹ CHАRӱhΒMrc P"A'+SթCz\֣ᡡE^HzȀHXV Z0=K=h4úG6)t5t兑T<م2C$ k0' t6Qӥ d.x]Z.Qb?WW-BJu7ZB) BxReQ]8%l]$o9R:P1՚ yX4G6(Y ̀RL6k<4s(QNK95*ڰ4݊j%^3[8}+hǶ{6s~{:pYNvXܒ2عLl uz舨2M)eV |/8ulÓsb UM>P PNBߐj_P8B`B+AbJtF%Ju) p7D K}`>Ci9ۛԃ`ʿHb[Nþ}7w?akc a\"*Ν{˭]3xcŒX6 :~Xz3dC"V(dgPK$/$"̆2)~TN S+؟;eZ5_y61TQᎂ #pUfD2BP )KNvg+ ^DžzdJ-"Cu6ܿP i􅂢 u":tK;8 ߉vj'EHpFt#j8B T,> Q7's؂9teTqO1KS []x_sж<󿐯%N3Bd˙gp#!W5;)ml#Y؎,`Ć0Rɲr簄Iie!zI՝c~=t`TVbԢBWO^'0wfIJ''r/}!6ϭ Er9UJo$#C}3sqZr}zK$q.R -ND@e(":14%[]@xlRF uD$)R68 )uBuK )bmn/!PMp6f(9ܢ#fPL^ stVRy ňia@B! =U]mLE u(FϞ@$x/x]Ӎ] mWRS0S~:G7'R܁pT0,ȖA\-:p,"mv@G;h⤼D8~j֭_o~饗NOO_}앯|͛uzƳ zm [)I*R9{; ;ɦ>v\[b\; kxl=IہKVv1$("t W$fQ1\\8:pĞ S9B:FH"rbsªڶdseM56Im1@n݅롙T9WA ՂR9~4.o!f-G{|v_fPVnJ'9 3v5t A6VZ@#N]ve+W|; SSSwGGG:ucDdӦs/MMP-H.Ȳ/Ȓ:`IW8~7RHm\3 u%KRp:YPILAxp%1S*1M ݷvȠ+YgCvGgX0#U&pÈ=sx_rs BXǐI]gàiYC9`78C\%a-)\r*'d9D5bY &HSoGO=ztCCCK,]vw߶k 3ua2[)X󀮍i i#W)Y/"@ê_q .)yiV0w;N cR(G)ZM'm `,$$On?K!FUOfmE-%QJC XqA&\7>`ˤukPKkL ---Z.)0(1Hb& 99JV$/uOgD$7K#}¹A"@ `#SǏov߾}/S֯ |˭'""ܕY"ƭ4 O7dA!ubhvVgS$S|6kp p8fy6&Tg"8'nL qY<%K=ˤ0>IMDwjE-Nԡq(fIN::@ @Z -%m@Pwd k͂7e ,mX7F `J9iiij)'Fx* a/Tm)h}*-x mP 9 QQ(KI➚Qܱ̉&͡@ E'5b*a>aYz!20Q|ꪫ7Gy ^p>&}ӽCW^?{^ ^g쩠CfVx1ma[DuNDD* =?1hZqiHWn? L܊,fh SO֩5P˺8*#vЍ19['4piGIaG )3#iH}'ZRR 36%XǹB%) i Aj80ICB&0}K̃󫀴ΰvfNu`ebFQ M#@ 4ڨ!aIկѥҚ$­V~yȫW~_911oxx=^tz^7GϬ;y!yh2,FԸZ;0LJ9I-퉽'0+ U'[Ra@dtͮ'=?tw''{U~#}Sp,"ؔáhT̯4hEv5YyJG)KuRHlyň[ـ Pc-CB 34M}s$9YQ'Ja/Ŋn{mx[344==3^#o3@Z{b}1iCksM_}Lש+àsⱁ!HD̅RuX|<:9,M$"=PܢPmt{`P9#gp4M)![tPWEdqS2*L ϋtZcc+ 3 iQgR:1re-aN\@XW).}9 wˈIf0l0pRTnj1ܛYvh xK{Qx'c([=VckE 11 bM6!brv,Ž F IDAT n\6̬$F6:K0;QS#$LLՌ?"n| 1]!tqά17h`B%/~ '!"Pa犒:PW 9d%2JJ[) qd [ݠ-+Mbk6B$.Ánt-(-ҕI[J6Q)66Ζ: pa{nfPbxl7!zYj0b'`YJ2:Gonw2G I"8XL Rf+oZUXg9`YʕTV CO"1r}tz',*@wA3dFӋyyIAN*,X/UZ-xioօy1xrmxLC9fe^{yщ|3Nr֙⮻( >5y<۶+O\z*>kw6}G۶~{iOg4g;OrO /Ч_Yk=_~[.'z;v_;voիs3>yljW>sW>::zƯ~O5ħ^W-[G7K\'NS}֬^+y}jrؖmo߿ws/K~bs#G^n;K^«?7NN_}~n^f+<  }/IOzƻ{|bb|e֮;g… &۾c}G/>qbzddΙa:@|qM=ѹs-Zvw6ذ~ݜٳ׮]{۶mt3L,[MqüyMCLԩcaٳgor֭wz`w?_5M'Ν>̶y82ott}7|+7r#~/pm/֯_P3gǏ/Zm;ܲsַumZ7 'N<Զr1x<#k׮Ybb(,X`ymܸ~Ϟ+WxӞlҕ+W,[dʕ+,x؊7{v4ǦZ:>>>nR˗OLL,=k֪U+W^~cǦ׭]~ډfZjsYbIJ6{ĉ/tݺ5gQ@?lb%V_ D6p"sk׬3g%Kz衱E8== wmȑ3z۶X~c]u7G3sc8cǮU|:5y<MӬ[[~LLj7y<~Wzp }Ǽjq1y<^qDIENDB`stopmotion-0.8.0/manual/screenshots/startup.png000066400000000000000000000361721234321124500217650ustar00rootroot00000000000000PNG  IHDRDT"bKGD pHYs  tIME *v  IDATxw|չ7gծؖ{7!@rM%p IH !7B(p7wZ}U23c-Y]2`#ٿ'i̙ϙU7L0Ȳ_ S$cX#0o^rƙx;;quk٢[K".3u};[]_k!c\yyDzwksޫowz-e-ךwuu[WB߽9UzttH۽Ͼq =DLJOv]n珮v۝ݾ\#}h}۲kum"ƨ387m:10"N/A,{RS DLQw~.۲G>dK1[}vظ_[|6Cq_YXPZAd֗Rv0M=BرXlϞݳgvBgN:ЦnY~„ F""{h* [IۣJfL,4&kqw쯵yV'x̔t0JDyC{I(Nk\X{mq]X۸&t 3l߾c&Lrp}^ZZp[d۱__}ϯmX֖O.)]_-dʝν/=DDјdLÇv{EEE_zj}N۾}{aa &_ydJnÑ،߿aɨ/uoK,_qKy~>F~ޱ`zlvnTtJ9o_xkk$O2hp♣O6hٓ _<%ɠy-~k紻ʘ2wJOL+j^~o[Μ]a|op O,e>[>^{ĉ_xܥK)OW~6mވٵ0'ѨoَukUVתZcK2km$rG~t۞cO.K|a%|lϏy|ϙQ24gKΙ^rʞdi]wըUS?,ɠ}Hs6ٓ Z<Ǖ?еnoh硆/1 }0mޔBQUpm;= 1+WLx^}Zq<@^^^<뮻l~Io:pȜ]DСIGNo}m)pοw\]~uCDǻK[x_ic>sOHHE彏}nJFN]e&7zoñ/|Ҿu1"z/~Zc0qt}iEɉwzg_ۨV YFDqqܹs׮]{whgIJKKڢEƍ?Ea9%ɣ{0uMo'TxR6Zx͗ϒ`"ڲf.rΌQ3yꏯjT7,skzӤeӲ+&yoߝh\<ϯ%wyA7.)yNK~ϟڶm[<_hOmܸH|5i<?q_]-}S1EL\SSH@SSD"/b TZ[Z6~o_x˻^M$..KG(}Wq_&3>0 ͉{}vk<9J_-תos}.t^ʃov>owop}o׋u>7{_=>RQvڐU8.NV+H$EY%1`evɩp(U)6ltH9͚9= M4=JnjtXs"߾Y"$iMJ> Nx:G+lݮh/\p$h(jֶƦiS'~3gLUՌѣJ{ެ̌t=d=yŋι[׎A_]}b=Z^y㷮nՉ""YW]jK<'zQ8ۊ[hάMyɧCp $˲f?kY)6l DTUUSQQ][Z|c)w.8(V;pd+,&8V[V[|ӖLEQ-okkON6w^R0?ޞj\~M0>5նwfӦ466]yŲ߬t} 7|1o7֧$[2Gu 9Ykh4\{6jxmNk6_spZ)"jkk[bX%qYf˯JIIY'rH$UIQ t:]sf3fw~""^w-7|jOС#QNvk\v}Qw_s{mjAD K\sf5FAV,% dk4>'R[Ww߁P(l4賳Nd^2=nO$MYcjmjgfG`(h6C_z_W fio^ߦ[SSm(|>hZq\Vff8uj?tղMTWz }/AeQ}>1DR&hL*1:uISm(Jo ̌' :^#"q\V։;AvvV&tZNxWYt&No6VCb*v fURyԌDQLII|Nk=0)r ǧ\.w4Go0Q52*jBQttJϩ744ť8 ),ȩ`(p:+*v`88q)3pr S) S@N 9@Nr 9)r S) S@N 9r 9)r S)@N S@N 9r 9)r ?󧌌P(-8"VD1/8RFC(ND#ɢ̌t)ScFL7l6c@t8)H:SRR$I9V;oy޴Ç);cEQ:'!IFF(X@DPHVV2LpXE#Hٌ "OmQŌDݣ(JFch4))㺽NDFcܗDbZo]?@gtY%L6Y,VǝD$UM߽lIKkۣ=x[gǮM9pxvT*׭c(O9qZ%茕py?>w~7n41FFAV'~ u DS,PP1FDQ Rmi^[o42YZ1EhTTEb]f"=k~m_tK;¸3hDV+IRZ>, goNщ9oBQkk:j ђ/|x}/iS&M2Gm""g4x4&)FZnb |*VWЭ .\0k$WUV5FD9DDFQ9DWf6cfxA1&B(-zPH{(i>_z) pa8nQ-_y>+'[N7j:V_S-t)jYB`X t^p:%I&v(DBP">_8%"O|dEis8chQ CDvxbvS$tQ8DB9]G$ScmX,s=MDgޮ(Lv:.b " r51kٱf|yL0YQN(ұfkeH]sCÝ91;g ~|C:6?!d}tMZH FNN}!ۻ㲢V8Q7uZsh)v©'ۉчо3pFo8qs΢kҨYq`cњV9Q%*1:&2ɘT}U$"e9TN16(LI1rrr,ˤ8SR fO>CƢ92ҍUzg'q1AJU[7R5Y0fOCs e.PTR2FG9^̐Nb ,r߲[!Y{'J2fT'qb c( m|V!&MVWؙ65wfgYY%ѓ9D{ϑuu[']=5á"8#}}TO r]%g}ӢEZ!3ȩ^!%ޕR&nyNwIRǧ\O_zYB%DT"F1>M9)2#h$LDfd<12rRR )V#'D}mfK(X$pz@$vpǧ'qPF,Z//z19.fNpyNQ=Rw6z}Ecm5ЏS 犊 s({[Zۛ[c$cq1vHG߮}>?3 pSC|hKko,:%?fNeW{>wιK^z?EP%NOx//^j19duۖMkmKGN؎V֍)3%V9#$zFT*U$=gm֔~ѣyxدuHsϯ͓ڬ_sF vIIDAT`pڵɁ@@ٹrʚV^^ c3o#n8`SC{KJr3r=x-_ |]w+^6yW_hhDd2'M:N94 d^;kꫯ6g֬)S|>wp8n^(() `ĜBNz$L6e)G+^yOWͷ?t%jҨdǘR:~yMEߦϮGKKSZZqL2_~y}?;v;Z^p5z4sGEDvv|~p vi2j-hhŞ0b}C'|:Akn}O,&W ㈇x?OYQhڴݲkyQ[YY=w F#ނOqʙOVqyv/pߐwk74j-rŎonnnv[[[mm-ϟsFq `S_IN<;m5UGz1ݱ`?TRǓ~OJp<3qNsFhŊUU==x**ggOsFq"/C~hNUĀ>TO}#95h)' _}?u;3:HHIQqP79M0$NsFcL-VKLv ' rFO G #͘nH$2ӾDL (ŧzr6:W>~UC-N͸O}(>sq88 L̩QQDQZRHʩX,v{˝LD:M@VuiN1\.OsFqu{VK v^Oi49#N%{)btv>t3e # sFFL=Q\ .5)0Ra0[aϛMD6o6u~rUskHZ(;v#"QQرsW]vj})4={uuu$j"U/)**S+FиG֬xl۾{NRgEb1":܅&+).-btP꩞jnڼu۾Xv}Vnj٦~kJ2M$Sȩq}'M iS&3F -MvuzXxC'"ɔHݑy s FN=u}O=~]ɤjoW^WRIQXcc(Iq6/;É*10}EG+Wi5&3I)SX;i$"e!;;[h4WUU8bȩ.ԩL&5ERqh!"RT1@Dx^"2eʩS#:-GjX,s8DƖ{$&2+77T 10rr괜^Xo2%)%INNNN%dlHD0@NSGtɅ|VIjZNK(% +>gΜD&FȩS?QQD,))u}$ F*F=:RdeʑS~| 9zjCL:; FLNEQ? ~^j0sqe 9߸d3RzJו ) S)@N 9@Nr 9r S) S)@N 9@Nr 9)r S) S@N 9@Nr 9)r S) S@N 9r 9)r S)@N NP(ؤ(ٶR =c{(3JVmkhyf ;pj,+2Ӄr `x)@N|㾮++S9n(iF{)e|cSs8hԑp ?ot#-myy9ܜlZ5@cYklV߯iSmց{p>% @!ƚ-)=eY* ?YVUR1JkfHQXk#* SkԉHQZٸY38>QpɲQ/7)(ƺWT3*xy>b{/J%& #8#bDWքaE7o:1c11v=۱@ÛdNiw87meI$b8ѾٰyG<|5py5x}7G"-Y#b@-;>dv̩D0F#j}[۝D_Ȳs&;9|GIXuٺco$|{Ζ5T2"Ͽe`(پK;3 ›V9ƤdpS ?oniQt/K;RQ]LD---7n$DPT&GQNE%ٜ8d4-KQg9!:ecǛ)S=]fh 1e)Ԟ)%$z1)lz3:>""ecNk#J(=6{dF-)Cރ_xecJ]~]FoN2hfLk7GzLaҤI^p^#F qz*OQAάYU*1;31WxuF[DiS'8<QΜ=K{"KsқjNP/bDd2.] z>ŋƔ8n lƌg8Vye[Rg(Q^p/de*"ˬGLuO4[Zz$I ̜:Q% ULף,.ɴ71{u/hR4rs2 Mu'kFN^Qs},+im0sJ:NKJ%HϡPbI8.F<\OD^OZv>N% u5")ĈHQ;.Ju|֡P[յX-D$+J0TTDs\sñދBi9qZrs}4MZZ*ef;8yDd42E'))rsNelT*ufV&6?Y,)C͋VbcӆKd2 +j:p1\.egeTb$iim$&.9ٜle!Vlv:vp82 ΢JHQ*tz][dYj78^"$l2b 6~:5p[95/^o d$Ijw^CsЭ$$?upxm/9Œm6%%`s  .x76WnջnN/h;e'}  dѨ#%Jw{eSq"qϤ}+^%u^٘njo) 6(rDžY>i4Z"EK$+ ֶNCD7+3[97AsZZ[9332[ZZ^y^%""uM!5Ֆj@Nˠ O"ײ>tl-<r ԍ֮ƿ.**(.,4 Q~~A]j]{:qc.gC~ANU 0c_tUW,#V]rK.Gp{[nwoz_U]qزX,~H( cJA>x l6ﯨVqc$I EE6kccsݞ^YUC<_\\8׈pdUee՜3v$I>J-$Q4) {^*(ȷÑf{^YYF7UUO^y v{fi/Mr|>|$Ix?˯3$Ip?u^O"9{13g$"ӹcǎcIDxO>[fh4zMˊB 9pTuu gΜM<_ǎ;"rJK.:'"Z1b ɩYfegg?cD[[[/riӦSX4 1t #Μ*hZQSSS;nok4L)FeYv:Vu/^Qac{WN S;p=t(///**2k֬ٴiˇqʪ+*H$T#%|KVTTT_q'NKR8_V\kuۇ*I,I)3ͽ[;TgNIR}{ }덒$)3*F4)$ɲLD(q"e?0s*%%6--uD/^hmkH@l6a윲Y-<޿{^L"Ղ >%bI:on#*$Ye,\ p$8/>ˮ{gz꼼 =hTIټ.p:)HtuDc:5k5W]ƿ C[n[vm8tGf8+`K."ƱcKEQ|oΛ7璋⩧(3#fdfuds0jljv:]*jbqZMDz8.2b)D$"ytAOIIu{nli,3kfAA^II1#F3Rm99Y6y6p*Q,3Ξ9#?/r[,);wsZF$544襨)..8. > ά!EcѦ&^|zE|eHft=Ke) biHDDPĿb}jTwu`yIENDB`stopmotion-0.8.0/manual/x126.html000066400000000000000000000131061234321124500165730ustar00rootroot00000000000000 Using Stopmotion with your webcamera

5. Using Stopmotion with your webcamera

The real value of using Stopmotion lies in working directly against a webcamera.

If you have a webcamera that works on your linux distribution and vgrabbj installed you can start the camera by pressing the (C) button.

If not you can go to the the next section ``Changing the import settings'' to set up your camera correctly.

Figure 4. The Camera menu

Note

For this to work you have to turn of all other programs using the webcamera.

When the camera is on you have three modes for viewing the video. These modes have different purposes and are there to assist you in creating your animations.

Image mixing/Onionskinning (Shortcut: 1)

The image mixing is probably the view mode you will be using the most. This mode allows you to view previous pictures (up to five) on top of the camera. This way you can position the figure in relation to the previous frames so that you can create smooth motions.

Figure 5. The onionskinning/mixing mode

You can change the number of pictures to view on top of the camera with the ``Number of mixes'' slider on the camera panel.

Image differentiation (Shortcut: 2)

The image differentiation mode is primarly meant as a tool for moving the figure back to a previous position.

It displays the difference between the selected frame and the camera. This way if an object in front off the camera has been involountairly moved (fallen, etc) you can use the differentiation mode, together with the image mixing, to move the object back to its previous position.

This can be done by moving the figure until the picture is black, which means the selected frame and the camera are ``equal''.

Figure 6. The differentiation mode

Playback (Shortcut: 3)

The playback mode will continously run the the already recorded frames as an animation with the input from the camera as the final frame.

This way you can see the camera input, which will become the next frame, together with the previous frames as an animation.

Figure 7. The playback mode

You can specify how many frame backwards that should be played (up to 50) with the ``Number of images'' slider on the camera panel, and you can set how fast they should played with the FPS chooser on the preview panel.

stopmotion-0.8.0/manual/x177.html000066400000000000000000000112401234321124500165760ustar00rootroot00000000000000 Changing the import settings

6. Changing the import settings

If the video importing doesn't work or if you want other settings you can change the way video is imported in Stopmotion.

This is done through the configure menu (Settings->Configure Stopmotion (Ctrl-P)) and you can either choose from one of the predefined settings or create your own.

Figure 8. The Video Import config menu

Image importing in Stopmotion works by continously asking an external program to grab a picture from the camera and place it in the .stopmotion directory. Stopmotion then displays this picture, and when this is done continously you get live video.

If you want to add a new import program you can do this by pressing the Add button. A new row appears in the table and you can fill in a name for your setting and a short description.

You then have to specify the command line options to import pictures. These can be set by selecting your setting and pressing the Edit button.

There are three things which can be specified here. The prepoll, start daemon and stop daemon fields. If the program for importing the images grabs one image and then exits you can leave the start and stop daemon fields blank. The contents of the prepoll field is a command which is run before importing a picture. If the import program is running in the foreground this will typically be the command line for grabbing the picture. Note that you have to write (DEFAULTPATH) in the command line on the place you otherwise would have speciefied the path to the file where the image should be stord. Stopmotion will replace this tag with the correct path and file name.

If the program you use for importing the pictures is running as a background/daemon process you have to specify command lines for starting and stoping the daemon. Again you should use the $importpath tag instead of the path to the file (se above). Prepoll could still be used but is not required. One potential use for the prepoll command when the grab program is running as a daemon process is to specify a command line which performes a operation such as scaling or rotating the picture. This command will be called on the pictures every time before importing them meaning the live video will be displayed with the effect.

stopmotion-0.8.0/manual/x205.html000066400000000000000000000052461234321124500165770ustar00rootroot00000000000000 Adding sound

7. Adding sound

You also can add sound to your animations. Before you can do this however you need to have a frame to attatch the sound to. Therefore you should add some frames from the harddrive or webcamera first.

When you have one or more frames you can add a sound by double clicking with the mouse on the frame to attatch the sound to. You will then get a menu where you can add sounds. When running the animation the sound will be played from this frame and until the sound is completed or the animation is at an end.

Note

The only currently supported sound format is ogg.

stopmotion-0.8.0/manual/x211.html000066400000000000000000000071341234321124500165720ustar00rootroot00000000000000 Exporting to video

8. Exporting to video

By now you should have a nice animation of your own. It's time to make a video file of it. The first thing you need to do is to install an video encoder. If you have mplayer installed you should already have one you can use.

Go to the Configure menu (Settings->Configure Stopmotion (Ctrl-P)). and press the Video Export tab. You should now get a list of video export settings:

Figure 9. The Video Export menu

You can select one of these provided you have the programs they use or you can add one of your own. To edit one of the present preferences press the Edit button, or use the Add button to add a new setting. When you have set up a video export setting you can close the Configure menu by pressing the OK button.

To export your animation to a video file just press File->Export->Video (Ctrl-Alt-V) and you should have a video file of your exellent animation. Tell your friends!

stopmotion-0.8.0/manual/x249.html000066400000000000000000000062651234321124500166110ustar00rootroot00000000000000 Using Stopmotion together with other programs.

9. Using Stopmotion together with other programs.

Stopmotion supports drag and drop and you can drag pictures to and from the desktop or other programs.

One especially useful example of using Stopmotion with other programs is to use gimp (or another painting program) to add effects to the frames.

Figure 10. Adding effects with gimp

The best way to do this is to drag a frame/picture from Stopmotion to gimp. Change around with it in gimp, then save the picture in gimp (File->Save (Ctrl-S)) (not save as).

Stopmotion should detect the changes automatically, provided you have FAM (File Alteration Monitor) installed, but if it doesn't you can switch to Stopmotion and when you select the frame/picture in the framebar it will be updated to the altered picture.

stopmotion-0.8.0/manual/x272.html000066400000000000000000000042321234321124500165750ustar00rootroot00000000000000 Getting access to the image files in your animation.

10. Getting access to the image files in your animation.

If you want access to the image files in your animation project you can open the project .sto file in your file browser. The file is a tarball file and inside it you will find the images in the images directory.

stopmotion-0.8.0/manual/x275.html000066400000000000000000000156051234321124500166060ustar00rootroot00000000000000 Shortcut keys

11. Shortcut keys

Table 1. General shortcuts

Ctrl-N Creates a New project.
Ctrl-O Opens an excisting project.
Ctrl-S Saves the project.
Ctrl-Shift-S Saves the project as.
Ctrl-Alt-V Opens a dialog to export the project as video.
Ctrl-Alt-C Opens a dialog to export the project as a Cinerella project.
Ctrl-Q Quits the application.
Ctrl-Z Undoes the last action.
Ctrl-Shift-Z Redoes the last undo.
Ctrl-X Cuts the selected frames out of the animation and places them on the global clipboard.
Ctrl-C Copies the selected frames to the global clipboard.
Ctrl-V Paste pictures from the global clipboard and add them to the animation after the selected frame.
Ctrl-G Brings up a menu where you can select a frame to jump to.
Ctrl-P Opens the import and export preferences menu.
Shift-F1 Gives you a whatsthis arrow for querying information about a user interface item.
Ctrl-F Add one or several frames/pictures to the animation.
Ctrl-E Create a new scene
Delete Deletes the selected frames.
Shift-Delete Deletes the selected scene.
A Selects all the frames in the opened scene.

Table 2. Play shortcuts

P, K Play the animation.
Right, L Go to the next frame.
Left, J Go to the previous frame.
O Go to the next scene.
I Go to the previous scene.
Ctrl-L Toggle whether the animation should loop when playing.

Table 3. Camera shortcuts

C Start the camera.
Space Capture a frame from the camera video stream.
1 Switch to image mixing/onionskinning mode.
2 Switch to image differentation mode.
3 Switch to playback mode.

stopmotion-0.8.0/manual/x30.html000066400000000000000000000070231234321124500165060ustar00rootroot00000000000000 Getting started

2. Getting started

Once you have installed Stopmotion you can start it by typing stopmotion in a console or from menues:

  • In the KDE menues you can Stopmotion it by going to Edutainment->Teaching Tools->Stopmotion

  • In the Debian menues Stopmotion lies under Apps->Education->Stopmotion

When the program is started you will se the following:

Figure 1. Stopmotion at startup

To the top you have the Framebar where you will see all the pictures in the animation. The center area is the Frameview where you will get a closer look at your pictures, see the webcamera and preview your animation.

The left area is the tools menu. On the top of this menu you have buttons for adding pictures from the harddrive , adding new scenes as well as deleting frames and scenes . You can also start the webcamera with the camera button .

stopmotion-0.8.0/manual/x459.html000066400000000000000000000043701234321124500166070ustar00rootroot00000000000000 Troubleshooting

12. Troubleshooting

12.1. The program tells me it can't import images

Have you checked that:

  1. The camera is working in Linux and the driver is properly set up?

  2. No other programs are using the camera?

  3. The program used for importing pictures and video is installed and working. (See the preferences menu (CTRL+P))?

stopmotion-0.8.0/manual/x69.html000066400000000000000000000051061234321124500165220ustar00rootroot00000000000000 Adding pictures

3. Adding pictures

The next step is to try adding some pictures from the harddrive. You can do this by clicking on the (Ctrl-F) button.

You will get the following dialog where you can select the pictures to add to the project:

Figure 2. The Add frames dialog

When you have selected some pictures you can click on the Open button and the pictures will be added to the project as frames.

stopmotion-0.8.0/manual/x88.html000066400000000000000000000066721234321124500165340ustar00rootroot00000000000000 Running/previewing the animation

4. Running/previewing the animation

Now that you have added some test pictures to your animations wouldn't you like to run them as an animation?

Stopmotion allows you to preview your animation before exporting it. This can be done through the play panel.

Figure 3. The Run Animation menu

The play panel allows you to play ( (K)) and stop () the running of the animation. You can also move between frames ( (J), (L)) and scenes ( (I), (O)) as well as changing the speed of the animation preview(frames per second).

Note

The camera has to be off to use this menu.

stopmotion-0.8.0/src/000077500000000000000000000000001234321124500145165ustar00rootroot00000000000000stopmotion-0.8.0/src/application/000077500000000000000000000000001234321124500170215ustar00rootroot00000000000000stopmotion-0.8.0/src/application/camerahandler.cpp000066400000000000000000000106051234321124500223150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/application/camerahandler.h" #include "src/domain/domainfacade.h" #include "src/foundation/preferencestool.h" #include "src/foundation/logger.h" #include "graphics/icons/cameraoff.xpm" #include "graphics/icons/cameraon.xpm" #include "src/application/modelhandler.h" #include "src/presentation/frontends/qtfrontend/frameview.h" #include "src/presentation/frontends/qtfrontend/qtfrontend.h" #include #include #include #include #include #include #include #include CameraHandler::CameraHandler ( QObject *parent, QStatusBar *sb, ModelHandler* modelHandler, const char *name) : QObject(parent), statusBar(sb), cameraButton(0), timer(0), capturedFile(WorkspaceFile::capturedImage), isCameraOn(false), modelHandler(modelHandler), frameView(0) { timer = new QTimer(this); timer->setSingleShot(true); QObject::connect( timer, SIGNAL(timeout()), this, SLOT(storeFrame()) ); setObjectName(name); } CameraHandler::~CameraHandler( ) { } void CameraHandler::setFrameView( FrameView * frameView ) { this->frameView = frameView; } void CameraHandler::setCameraButton( QPushButton *cameraButton ) { this->cameraButton = cameraButton; } bool CameraHandler::setViewMode(int mode) { return frameView->setViewMode((FrameView::ImageMode) mode); } void CameraHandler::cameraOn() { DomainFacade::getFacade()->getFrontend()->showProgress( Frontend::connectingCamera); cameraButton->setIcon( QPixmap(cameraoff) ); isCameraOn = frameView->on(); if (!isCameraOn) { cameraOff(); } else { emit cameraStateChanged(true); } DomainFacade::getFacade()->getFrontend()->hideProgress(); } void CameraHandler::cameraOff() { cameraButton->setIcon( QPixmap(cameraon) ); frameView->off(); isCameraOn = false; emit cameraStateChanged(false); } void CameraHandler::toggleCamera() { if(isCameraOn == false) { Logger::get().logDebug("Playing video from webcam"); cameraOn(); } else { cameraOff(); } } void CameraHandler::captureFrame() { Logger::get().logDebug("Capturing image from webcam"); timer->start(60); } void CameraHandler::storeFrame() { QImage i; const char* path = capturedFile.path(); i.load(path); if ( !i.isNull() ) { modelHandler->addFrame(path); emit capturedFrame(); } else { timer->start(60); } } void CameraHandler::switchToVideoView() { cameraButton->setEnabled(true); emit cameraStateChanged(true); DomainFacade::getFacade()->getFrontend()->hideProgress(); } void CameraHandler::setMixCount(int mixCount) { frameView->setMixCount(mixCount); switch( frameView->getViewMode() ) { case 0: { PreferencesTool::get()->setPreference("mixcount", mixCount); break; } case 2: { PreferencesTool::get()->setPreference("playbackcount", mixCount); break; } } } bool CameraHandler::isCameraRunning() { return isCameraOn; } void CameraHandler::setPlaybackSpeed(int playBackSpeed) { frameView->setPlaybackSpeed(playBackSpeed); } stopmotion-0.8.0/src/application/camerahandler.h000066400000000000000000000067661234321124500217770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef CAMERAHANDLER_H #define CAMERAHANDLER_H #include #include "src/domain/animation/workspacefile.h" class FrameView; class ModelHandler; class QPushButton; class QStatusBar; class QTimer; /** * *@author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class CameraHandler : public QObject { Q_OBJECT public: /** * Constructor for setting up the camerahandler. * @param parent the parent widget * @param sb the statusbar for updates * @param modelHandler for adding frames when capturing. * @param name the name of the object */ CameraHandler ( QObject *parent = 0, QStatusBar *sb = 0, ModelHandler* modelHandler = 0, const char *name = 0); ~CameraHandler(); void setCameraButton( QPushButton *cameraButton ); void setFrameView(FrameView *frameView); /** * Sets the viewing mode which is the type of effect used when running the camera. * @param mode the type of effect to be showed on the video. The modes are: * 0: Image mixing/onion skinning * 1: Image differentiating * 2: Playback * @return true if the change was succesfull */ bool setViewMode(int mode); /** * Checks if the camera is on. * @return true if the camera is on. */ bool isCameraRunning(); public slots: void toggleCamera(); void captureFrame(); /** * Slot to recieve a message when the videoView are finished seting up the * camera. */ void switchToVideoView(); private: QStatusBar *statusBar; QPushButton *cameraButton; QTimer *timer; WorkspaceFile capturedFile; bool isCameraOn; ModelHandler *modelHandler; FrameView *frameView; void cameraOn(); void cameraOff(); private slots: /** * Slot called by the timer which checks if the frame has been fully captured. */ void storeFrame(); void setMixCount(int mixCount); void setPlaybackSpeed(int playBackSpeed); signals: void capturedFrame(); /** * This signal is emitted when the state of the camera is changed. * @param isActivated true if the camera has been activated. */ void cameraStateChanged(bool isActivated); }; #endif stopmotion-0.8.0/src/application/editmenuhandler.cpp000066400000000000000000000074021234321124500227000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/application/editmenuhandler.h" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/mainwindowgui.h" #include "src/presentation/frontends/qtfrontend/menuframe.h" #include "src/presentation/frontends/qtfrontend/framebar/framebar.h" #include "modelhandler.h" #include #include #include #include #include #include #include EditMenuHandler::EditMenuHandler ( QObject *parent, QStatusBar *sb, FrameBar *frameBar, const char *name ) : QObject(parent), statusBar(sb), frameBar(frameBar) { gotoMenu = 0; setObjectName(name); } void EditMenuHandler::setGotoMenu( QWidget * gotoMenu ) { this->gotoMenu = gotoMenu; } void EditMenuHandler::gotoFrame(int frameNumber) { frameBar->updateNewActiveFrame(frameBar->getActiveScene(), frameNumber); closeGotoMenu(); } void EditMenuHandler::closeGotoMenu() { gotoMenu->hide(); } void EditMenuHandler::undo() { DomainFacade::getFacade()->undo(); emit undoOrRedo(); } void EditMenuHandler::redo() { DomainFacade::getFacade()->redo(); emit undoOrRedo(); } void EditMenuHandler::copy() { QList urls; int selectionFrame = frameBar->getSelectionAnchor(); int activeScene = frameBar->getActiveScene(); int activeFrame = frameBar->getActiveFrame(); int highend = (selectionFrame > activeFrame ) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame ) ? selectionFrame : activeFrame; DomainFacade* facade = DomainFacade::getFacade(); for (int i = lowend; i <= highend; ++i) { const char* imagePath = facade->getImagePath(activeScene, i); if (imagePath) urls.append(QUrl::fromLocalFile(imagePath)); } //QDrag *drag = new QDrag((MainWindowGUI*)this->parent()); QMimeData *mimeData = new QMimeData; mimeData->setUrls(urls); //drag->setMimeData(mimeData); //drag->start(Qt::MoveAction); QApplication::clipboard()->setMimeData(mimeData); } void EditMenuHandler::cut() { copy(); emit removeFrames(); } void EditMenuHandler::paste() { const QMimeData *mimeData = QApplication::clipboard()->mimeData(); if ( mimeData->hasUrls() ) { QStringList fileNames; QList urls = mimeData->urls(); int numFrames = urls.size(); for (int i = 0; i < numFrames; ++i) { fileNames.append(urls[i].toLocalFile()); } emit addFrames(fileNames); } } stopmotion-0.8.0/src/application/editmenuhandler.h000066400000000000000000000065041234321124500223470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EDITMENUHANDLER_H #define EDITMENUHANDLER_H #include class MenuFrame; class FrameBar; class ModelHandler; class QStatusBar; /** * This class handles request related to the editmenu (undo, redo, copy, cut, etc) * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class EditMenuHandler : public QObject { Q_OBJECT public: /** * Creates and initializes the Soundhandler. * @param parent the parent of the soundhandler. * @param sb a statusbar for displaying status information to the user. * @param frameBar the frameBar containing thumbnails * @param name the name of the soundhandler */ EditMenuHandler( QObject *parent = 0, QStatusBar *sb = 0, FrameBar *frameBar = 0, const char *name = 0 ); /** * Sets the gotoMenu property so that it can be closed. * @param gotoMenu the gotoMenu. */ void setGotoMenu(QWidget *gotoMenu); public slots: /** * Goes to the frame with the number frameNumber on the framebar. * @param frameNumber the number of the frame to go to. */ void gotoFrame(int frameNumber); /** * Closes the goto menu and moves the focus to the mainwindowgui. */ void closeGotoMenu(); /** * Undoes the last undoable operation the user have done. */ void undo(); /** * Redoes the last undo the user have done. */ void redo(); /** * Copies and deletes the section. */ void cut(); /** * Copies a selection to the global clipboard. */ void copy(); /** * Pastes a selection from the global clipboard to the program. */ void paste(); private: QStatusBar *statusBar; FrameBar *frameBar; QWidget *gotoMenu; signals: /** * Adds the frames pointed to by a list. * @param l the list containing pointers to the frames */ void addFrames(const QStringList &l); /** * Removes the frames in the selection. */ void removeFrames(); /** * Undo or redo has happened */ void undoOrRedo(); }; #endif stopmotion-0.8.0/src/application/externalcommand.cpp000066400000000000000000000105321234321124500227070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "externalcommand.h" #include #include #include #include #include ExternalCommand::ExternalCommand(QWidget *parent) : QWidget(parent) { vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(6); vboxLayout->setMargin(9); textBrowser = new QTextBrowser(this); vboxLayout->addWidget(textBrowser); hboxLayout = new QHBoxLayout(); hboxLayout->setSpacing(6); hboxLayout->setMargin(0); label = new QLabel(this); label->setText(tr("Input to program:")); hboxLayout->addWidget(label); lineEdit = new QLineEdit(this); connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(submitInputToProgram())); lineEdit->setEchoMode(QLineEdit::Normal); hboxLayout->addWidget(lineEdit); submitButton = new QPushButton(this); connect(submitButton, SIGNAL(clicked()), this, SLOT(submitInputToProgram())); submitButton->setText(tr("Submit")); hboxLayout->addWidget(submitButton); closeButton = new QPushButton(this); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); closeButton->setEnabled(false); closeButton->setText(tr("Close")); hboxLayout->addWidget(closeButton); vboxLayout->addLayout(hboxLayout); process = new QProcess(this); connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(readFromStandardOutput())); connect(process, SIGNAL(readyReadStandardError()), this, SLOT(readFromStandardError())); connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(displayExitStatus(int, QProcess::ExitStatus))); resize(QSize(593, 363).expandedTo(minimumSizeHint())); setAttribute(Qt::WA_DeleteOnClose); setWindowTitle( tr("Output from external command") ); } void ExternalCommand::run(const QString &command) { process->start(command); } void ExternalCommand::readFromStandardOutput() { textBrowser->ensureCursorVisible(); QTextCursor curs = textBrowser->textCursor(); curs.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); curs.insertText(process->readAllStandardOutput()); } void ExternalCommand::readFromStandardError() { textBrowser->ensureCursorVisible(); QTextCursor curs = textBrowser->textCursor(); curs.movePosition(QTextCursor::StartOfLine, QTextCursor::KeepAnchor); curs.insertText(process->readAllStandardError()); } void ExternalCommand::submitInputToProgram() { if ( lineEdit->isModified() ) { QString input = lineEdit->text(); input.append('\n'); process->write(input.toLocal8Bit()); lineEdit->setText(""); } } void ExternalCommand::displayExitStatus(int exitCode, QProcess::ExitStatus) { if (exitCode != 0) { QMessageBox::warning(this, tr("Result"), tr("Failed!")); } else { QMessageBox::information(this, tr("Result"), tr("Successfull!")); } lineEdit->setEnabled(false); submitButton->setEnabled(false); closeButton->setEnabled(true); } stopmotion-0.8.0/src/application/externalcommand.h000066400000000000000000000043271234321124500223610ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EXTERNALCOMMAND_H #define EXTERNALCOMMAND_H #include #include #include #include #include #include #include #include #include #include class ExternalCommand : public QWidget { Q_OBJECT; public: ExternalCommand(QWidget *parent = 0); void run(const QString &command); private slots: void readFromStandardOutput(); void readFromStandardError(); void submitInputToProgram(); void displayExitStatus(int exitCode, QProcess::ExitStatus exitStatus); private: QVBoxLayout *vboxLayout; QTextBrowser *textBrowser; QHBoxLayout *hboxLayout; QLabel *label; QLineEdit *lineEdit; QPushButton *submitButton; QPushButton *closeButton; QProcess *process; }; #endif stopmotion-0.8.0/src/application/externalcommandwithtemporarydirectory.cpp000066400000000000000000000065621234321124500275030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "externalcommandwithtemporarydirectory.h" #include "externalcommand.h" #include #include #include #include #include #include #include #include class TemporaryDirectoryCreationException : public std::exception { char msg[100]; public: TemporaryDirectoryCreationException(const char* reason) { strncpy(msg, reason, sizeof(msg) - 1); msg[sizeof(msg) - 1] = '\0'; } const char* what() const throw() { return msg; } }; class TemporaryDirectory { std::string path; const char* pptr; bool tryTemplate(const char* var, const char* baseDir) { path = ""; if (var) { const char* v = getenv(var); if (!v) return false; path += v; } if (baseDir) path += baseDir; path += "/lsmXXXXXX"; pptr = path.c_str(); return mkdtemp(&path[0]); } public: //TODO there's got to be a better way of making a temporary directory TemporaryDirectory() : pptr(0) { if (!tryTemplate("TMPDIR", 0) && !tryTemplate(0, "/tmp") && !tryTemplate("HOME", "/.stopmotion")) { throw TemporaryDirectoryCreationException( "Failed to create temporary directory"); } } ~TemporaryDirectory() { Util::removeDirectoryContents(pptr); rmdir(pptr); } const char* getPath() const { return pptr; } }; ExternalCommandWithTemporaryDirectory ::ExternalCommandWithTemporaryDirectory( QWidget* parent) :ec(0), td(0) { std::auto_ptr ttd(new TemporaryDirectory); ec = new ExternalCommand(parent); td = ttd.release(); } ExternalCommandWithTemporaryDirectory ::~ExternalCommandWithTemporaryDirectory() { delete ec; ec = 0; delete td; td = 0; } void ExternalCommandWithTemporaryDirectory::run(const QString& command) { ec->run(command); } void ExternalCommandWithTemporaryDirectory::show() { ec->show(); } const char* ExternalCommandWithTemporaryDirectory ::getTemporaryDirectoryPath() const { return td->getPath(); } stopmotion-0.8.0/src/application/externalcommandwithtemporarydirectory.h000066400000000000000000000041411234321124500271370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EXTERNALCOMMANDWITHTEMPORARYDIRECTORY_H_ #define EXTERNALCOMMANDWITHTEMPORARYDIRECTORY_H_ class ExternalCommand; class TemporaryDirectory; class QWidget; class QString; class ExternalCommandWithTemporaryDirectory { ExternalCommand* ec; TemporaryDirectory* td; ExternalCommandWithTemporaryDirectory& operator=(const ExternalCommandWithTemporaryDirectory&); ExternalCommandWithTemporaryDirectory( const ExternalCommandWithTemporaryDirectory&); public: ExternalCommandWithTemporaryDirectory(QWidget *parent = 0); ~ExternalCommandWithTemporaryDirectory(); void run(const QString &command); void show(); const char* getTemporaryDirectoryPath() const; }; #endif stopmotion-0.8.0/src/application/languagehandler.cpp000066400000000000000000000131461234321124500226530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/application/languagehandler.h" #include "src/foundation/preferencestool.h" #include "src/config.h" #include #include #include #include #include LanguageHandler::LanguageHandler(QObject *parent, QApplication *stApp, const char *name) : QObject(parent), languagesMenu(0) { qmPath = QString(stopmotion::translationsDirectory); activeAction = 0; translator = new QTranslator(this); // Get system locale. QString locale = QLocale::system().name().toLower(); if (locale == QLatin1String("nb_no")) locale = QLatin1String("no_nb"); else if (locale == QLatin1String("nn_no")) locale = QLatin1String("no_nn"); else if (locale == QLatin1String("se_no")) locale = QLatin1String("no_se"); else locale.truncate(2); // Put together a translation file based on the qmPath or keep // it empty if the locale is english. const bool englishLocale = (locale == QLatin1String("en")); const QString prefix = qmPath + QLatin1Char('/') + QLatin1String("stopmotion_"); QString translationFile = englishLocale ? QString() : prefix + locale; if (!englishLocale && !QFile::exists(translationFile + QLatin1String(".qm"))) { // Was not able to find a translation file for the locale, so use the // language saved in the preferences file, or use English as fall-back. const QByteArray localeArray = locale.toLatin1(); const char *localePtr = localeArray.constData(); Preference languagePref("language", localePtr); if (languagePref.get()) { translationFile = prefix + QLatin1String(languagePref.get()); if (!QFile::exists(translationFile + QLatin1String(".qm"))) translationFile = QString(); } else { translationFile = QString(); } } else { PreferencesTool::get()->setPreference("language", locale.toLatin1().constData()); } if (!translationFile.isEmpty()) { Logger::get().logDebug("Loading translator: "); Logger::get().logDebug(translationFile.toLatin1().constData()); translator->load(translationFile); } stApp->installTranslator(translator); setObjectName(name); } QMenu* LanguageHandler::createLanguagesMenu(QMenu *parent) { assert(parent); // For the .po files. findtr isn't as intelligent as luptate tr("English"); languagesMenu = parent->addMenu(tr("&Translation")); connect(languagesMenu, SIGNAL(triggered(QAction *)), this, SLOT(changeLanguage(QAction *))); QDir dir(qmPath); QStringList fileNames = dir.entryList(QStringList("stopmotion_*.qm")); //English is a special case (base language) QAction *langAct = languagesMenu->addAction("&1 English"); langAct->setCheckable(true); locales.insert(langAct, "en"); int num = 2; for (int i = 0; i < fileNames.size(); ++i) { QTranslator translator; translator.load(fileNames[i], qmPath); QString language = translator.translate("LanguageHandler", "English", "This should be translated to the name of the " "language you are translating to, in that language. " "Example: English = Deutsch (Deutsch is \"German\" " "in German)"); // Checks that the mimimum requirement for accepting a string is covered. // The mimimum requirement is that the menu option string (English) is translated. if (language != "") { langAct = languagesMenu->addAction(QString("&%1 %2").arg(num++).arg(language)); langAct->setCheckable(true); langAct->setChecked(false); QString locale = fileNames[i]; locale = locale.mid(locale.indexOf('_') + 1); locale.truncate(locale.indexOf('.')); locales.insert(langAct, locale); } } Preference languagePref("language", "en"); activeAction = locales.key(QString(languagePref.get())); if (activeAction != 0) { activeAction->setChecked(true); } else { Logger::get().logWarning("Something wrong with the locale!"); } return languagesMenu; } void LanguageHandler::changeLanguage(QAction *action) { if (activeAction != 0) { activeAction->setChecked(false); } action->setChecked(true); activeAction = action; QString locale = locales[action]; if (locale != "en") { translator->load("stopmotion_" + locale, qmPath); } else { translator->load(""); } PreferencesTool::get()->setPreference("language", locale.toLatin1().constData()); emit languageChanged(); } stopmotion-0.8.0/src/application/languagehandler.h000066400000000000000000000053561234321124500223240ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef LANGUAGEHANDLER_H #define LANGUAGEHANDLER_H #include "src/config.h" #include #include #include #include #include #include /** * This class handles the loading of the different languages which are supported * by the program. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class LanguageHandler : public QObject { Q_OBJECT public: /** * Creates and initializes the LanguageHandler. * @param parent the parent of the LanguageHandler. * @param stApp the main window * @param name the name of the LanguageHandler */ LanguageHandler ( QObject *parent = 0, QApplication *stApp = 0, const char *name = 0 ); /** * Creates the languagesMenu. * @param parent the parent menu. * @return a populated language menu. */ QMenu* createLanguagesMenu(QMenu *parent); private: QTranslator *translator; QMenu *languagesMenu; QString qmPath; QAction *activeAction; QHash locales; private slots: /** * Switch to the language in location menuID in the languages menu. * @param menuID the ide of the menu options with the language to * switch to. */ void changeLanguage(QAction *activeAction); signals: /** * Called when the user has changed the language. */ void languageChanged(); }; #endif stopmotion-0.8.0/src/application/modelhandler.cpp000066400000000000000000000167311234321124500221730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/application/modelhandler.h" #include "src/presentation/frontends/qtfrontend/mainwindowgui.h" #include "src/presentation/frontends/qtfrontend/framebar/framebar.h" #include "src/domain/domainfacade.h" #include "src/technical/stringiterator.h" #include #include #include #include #include #include #include #include ModelHandler::ModelHandler ( QObject *parent, QStatusBar *sb, FrameBar *frameBar, QString* lastVisitedDir, const char *name ) : QObject(parent), frameBar(frameBar), statusBar(sb), lastVisitedDir(lastVisitedDir) { fileDialog = NULL; removeFramesButton = NULL; setObjectName(name); } ModelHandler::~ModelHandler() { } void ModelHandler::setRemoveFramesButton(QPushButton* removeFramesButton) { this->removeFramesButton = removeFramesButton; } void ModelHandler::chooseFrame() { fileDialog = new QFileDialog((MainWindowGUI*)parent(), tr("Choose frames to add"), *lastVisitedDir); QStringList filters; filters << "Images (*.png *.jpg *.jpeg *.gif *.PNG *.JPG *.JPEG *.GIF)" << "Joint Photographic Ex. Gr. (*.jpg *.jpeg *.JPG *.JPEG)" << "Portable Network Graphics (*.png *.PNG)" << "GIMP native (*.xcf *.XCF)" << "Tagged Image File Format (*.tif *.TIF)" << "Windows Bitmap (*.bmp *.BMP)" << "TrueVision Targa (*.tga *.TGA)" << "Portable Anymap (*.pnm *.PNM)" << "X11 Pixmap (*.xpm *.XPM)" << "ZSoft IBM PC Paintbrush (*.pcx *.PCX)" << "CompuServe Graph. Interch. Format (*.gif *.GIF)" << "Interleaved Bitmap (*.lbm *.iff *.LBM *.IFF)" << "All files (*)"; fileDialog->setFilters(filters); fileDialog->setAcceptMode(QFileDialog::AcceptOpen); fileDialog->setFileMode(QFileDialog::ExistingFiles); //PicturePreview* p = new PicturePreview(fileDialog); QObject::connect( fileDialog, SIGNAL(filesSelected (const QStringList &)), this, SLOT(addFrames(const QStringList &)) ); fileDialog->show(); } class StringListIterator : public StringIterator { QStringList::ConstIterator b; QStringList::ConstIterator e; std::string buffer; void set() { if (!atEnd()) { buffer = b->toStdString(); buffer.c_str(); } } public: StringListIterator(QStringList::ConstIterator begin, QStringList::ConstIterator end) : b(begin), e(end) { set(); } ~StringListIterator() { } int count() { int c = 0; for (QStringList::ConstIterator i(b); i != e; ++i) { ++c; } return c; } bool atEnd() const { return b == e; } const char* get() const { return &buffer[0]; } void next() { ++b; set(); } }; void ModelHandler::addFrames(const QStringList & fileNames) { Logger::get().logDebug("addFrames in modelhandler"); // the fileDialog pointer is NULL when adding of frames is // done by drag 'n drop if ( fileDialog != NULL ) { fileDialog->hide(); *lastVisitedDir = fileDialog->directory().path(); } if ( !fileNames.isEmpty() ) { StringListIterator fNames(fileNames.begin(), fileNames.end()); int scene = frameBar->getActiveScene(); int frame = frameBar->getActiveFrame() + 1; if (scene < 0) { scene = 0; } DomainFacade* facade = DomainFacade::getFacade(); int frameCount = facade->getSceneSize(scene); if (frameCount < frame) frame = frameCount; if (frame < 0) frame = 0; facade->addFrames(scene, frame, fNames); emit modelChanged(); } } void ModelHandler::addFrame( const QString &fileName ) { if (fileDialog != NULL) { fileDialog->hide(); *lastVisitedDir = fileDialog->directory().path(); } QStringList fileNames; fileNames.push_back(fileName); this->addFrames(fileNames); } void ModelHandler::removeFrames() { if (removeFramesButton->isEnabled()) { int selectionFrame = frameBar->getSelectionAnchor(); int activeScene = frameBar->getActiveScene(); int activeFrame = frameBar->getActiveFrame(); int lowend = (selectionFrame < activeFrame ) ? selectionFrame : activeFrame; int highend = (selectionFrame > activeFrame ) ? selectionFrame : activeFrame; DomainFacade::getFacade()->removeFrames(activeScene, lowend, highend - lowend + 1); statusBar->showMessage( tr("Removed the selected frame"), 2000 ); } } void ModelHandler::newScene() { int activeScene = frameBar->getActiveScene(); if (activeScene >= 0) { DomainFacade::getFacade()->newScene(activeScene+1); } else { int numScenes = DomainFacade::getFacade()->getNumberOfScenes(); if(numScenes > 0) { DomainFacade::getFacade()->newScene(numScenes); } else { DomainFacade::getFacade()->newScene(activeScene+1); } } emit modelChanged(); } void ModelHandler::removeScene() { int activeScene = frameBar->getActiveScene(); if (0 <= activeScene) DomainFacade::getFacade()->removeScene(activeScene); } /*! \fn ModelHandler::editCurrentFrame() */ int ModelHandler::editCurrentFrame() { std::string gimpCommand; if (!Util::checkCommand(&gimpCommand, "gimp")) { QMessageBox::warning(static_cast(parent()), tr("Warning"), tr("You do not have Gimp installed on your system"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); return 1; } // Determine the active scene and active frame. int activeScene = frameBar->getActiveScene(); int activeFrame = frameBar->getActiveFrame(); if (activeScene < 0 || activeFrame < 0) { QMessageBox::warning(static_cast(parent()), tr("Warning"), tr("There is no active frame to open"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); return 1; } DomainFacade* facade = DomainFacade::getFacade(); facade->duplicateImage(activeScene, activeFrame); const char *path = facade->getImagePath(activeScene, activeFrame); QStringList argList; // arg0 are the options, and arg1 is the path of the frame. // Start Gimp without splash screen. argList.append(QLatin1String("--no-splash")); argList.append(QString::fromLocal8Bit(path)); QProcess process; if (!process.startDetached(QLatin1String(gimpCommand.c_str()), argList)) { QMessageBox::warning(static_cast(parent()), tr("Warning"), tr("Failed to start Gimp!"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); return 1; } return 0; } stopmotion-0.8.0/src/application/modelhandler.h000066400000000000000000000073221234321124500216340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MODELHANDLER_H #define MODELHANDLER_H #include class FrameBar; class QStatusBar; class QFileDialog; class QPushButton; class QStringList; class QString; /** * This class handles request related to adding, removing and moving things * in the model. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ModelHandler : public QObject { Q_OBJECT public: /** * Creates and initializes the ModelHander. * @param parent the parent of the ModelHander. * @param sb a statusbar for displaying status information to the user. * @param frameBar the framebar containing the thumbnails * @param lastVisitedDir the last visited directory * @param name the name of the ModelHander */ ModelHandler( QObject *parent = 0, QStatusBar *sb = 0, FrameBar *frameBar = 0, QString *lastVisitedDir = 0, const char *name = 0 ); /** * Cleans up after the modelhandler. */ ~ModelHandler(); /** * Function for seting the button used for removing frames. This button is * needed for checking if it is enabled when attempting to remove frames with * the delete key. * @param removeFramesButton the button used for removing frames. */ void setRemoveFramesButton(QPushButton *removeFramesButton); public slots: /** * Brings up a dialog so that the user can choose a file to load. */ void chooseFrame(); /** *Adds the file fileName to the animation throught the use of *addFrames(QStringList). *@param fileName the file to be added to the animation. */ void addFrame( const QString &fileName ); /** * Removes the currently selected frame from the animation. */ void removeFrames(); /** * Adds the files to the animation. * @param fileNames the files to be added to the animation */ void addFrames(const QStringList & fileNames); /** * Creates a new scene. This will be added after the selected frame. */ void newScene(); /** * Removes the active scene. */ void removeScene(); /** * Launch the gimp to edit the current frame. * @return 0 If successful, 1 on error. */ int editCurrentFrame(); private: FrameBar *frameBar; QStatusBar *statusBar; QPushButton *removeFramesButton; QFileDialog* fileDialog; QString *lastVisitedDir; signals: /** * Notified when the model is changed. */ void modelChanged(); }; #endif stopmotion-0.8.0/src/application/runanimationhandler.cpp000066400000000000000000000140001234321124500235620ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/application/runanimationhandler.h" #include "src/foundation/preferencestool.h" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/selection.h" #include #include #include RunAnimationHandler::RunAnimationHandler(QObject *parent, QStatusBar *sb, Selection *sel, const char *name ) : QObject(parent), statusBar(sb), selection(sel), playButton(0), removeFramesButton(0), loopButton(0), pauseButton(0), timer(0), sceneNr(0), frameNr(0), fps(0), isLooping(false), startFrame(-1), endFrame(0) { fps = PreferencesTool::get()->getPreference("fps", 10); timer = new QTimer(this); QObject::connect( timer, SIGNAL(timeout()), this, SLOT(playNextFrame()) ); setObjectName(name); } void RunAnimationHandler::setPlayButton( QPushButton * playButton ) { this->playButton = playButton; } void RunAnimationHandler::setRemoveFramesButton( QPushButton * removeFramesButton) { this->removeFramesButton = removeFramesButton; } void RunAnimationHandler::setLoopButton(QPushButton * loopButton) { this->loopButton = loopButton; } void RunAnimationHandler::toggleRunning() { if(timer->isActive()) { stopAnimation(); } else if (startFrame < 0) { runAnimation(); } else { resumeAnimation(); } } void RunAnimationHandler::resumeAnimation() { DomainFacade *f = DomainFacade::getFacade(); int sceneSize = f->getSceneSize(sceneNr); if (0 <= sceneNr && sceneNr < f->getNumberOfScenes() && sceneSize > 0) { if (sceneSize < endFrame) endFrame = sceneSize; if (endFrame <= startFrame) { startFrame = endFrame; stopAnimation(); } if (endFrame <= frameNr) frameNr = startFrame; f->initAudioDevice(); QObject::disconnect( playButton, SIGNAL(clicked()), this, SLOT(runAnimation()) ); QObject::connect( playButton, SIGNAL(clicked()), this, SLOT(pauseAnimation()) ); //playButton->setToggleButton(true); playButton->setChecked(true); playButton->toggle(); removeFramesButton->setEnabled(false); statusBar->showMessage( tr("Running animation"), 2000 ); timer->start( 1000/fps); timer->setSingleShot(false); } } void RunAnimationHandler::runAnimation() { sceneNr = 0; startFrame = 0; endFrame = 0; int activeFrame = selection->getActiveFrame(); if (selection) { sceneNr = selection->getActiveScene(); startFrame = activeFrame; int sel = selection->getSelectionAnchor(); if (startFrame < sel) { endFrame = sel + 1; } else { endFrame = startFrame + 1; startFrame = sel; } } if (endFrame - startFrame <= 1) { // only one or zero frames selected. Play the entire scene from the // selected frame. startFrame = std::max(activeFrame, 0); endFrame = DomainFacade::getFacade()->getSceneSize(sceneNr) ; } frameNr = startFrame; resumeAnimation(); } void RunAnimationHandler::stopAnimation() { if ( timer->isActive() ) { QObject::disconnect( playButton, SIGNAL(clicked()), this, SLOT(pauseAnimation()) ); QObject::connect(playButton, SIGNAL(clicked()), this, SLOT(runAnimation())); if ( playButton->isChecked() ) { playButton->toggle(); } playButton->setChecked(false); removeFramesButton->setEnabled(true); DomainFacade *f = DomainFacade::getFacade(); f->shutdownAudioDevice(); statusBar->clearMessage(); timer->stop(); if (startFrame < endFrame) emit stopped(sceneNr, startFrame, endFrame - 1); startFrame = -1; } } void RunAnimationHandler::setPauseButton(QPushButton * pauseButton) { this->pauseButton = pauseButton; } void RunAnimationHandler::pauseAnimation() { if ( timer->isActive() ) { QObject::disconnect( playButton, SIGNAL(clicked()), this, SLOT(pauseAnimation()) ); QObject::connect(playButton, SIGNAL(clicked()), this, SLOT(runAnimation())); playButton->setChecked(false); removeFramesButton->setEnabled(true); emit paused(); DomainFacade *f = DomainFacade::getFacade(); f->shutdownAudioDevice(); statusBar->clearMessage(); timer->stop(); } } void RunAnimationHandler::setSpeed(int fps) { this->fps = fps; if ( timer->isActive() ) { timer->setInterval(1000/this->fps); } //Adding the fps to the preferencestool. PreferencesTool::get()->setPreference("fps", fps); } void RunAnimationHandler::toggleLooping() { isLooping = !isLooping; } void RunAnimationHandler::playNextFrame() { DomainFacade *facade = DomainFacade::getFacade(); if (sceneNr >= 0) { emit playFrame(sceneNr, frameNr); ++frameNr; int sceneSize = facade->getSceneSize(sceneNr); if (sceneSize < endFrame) endFrame = sceneSize; if (frameNr < endFrame) return; if (isLooping) { frameNr = startFrame; return; } } stopAnimation(); } stopmotion-0.8.0/src/application/runanimationhandler.h000066400000000000000000000106521234321124500232400ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef RUNANIMATIONHANDLER_H #define RUNANIMATIONHANDLER_H #include "src/config.h" #include class Selection; class QPushButton; class QTimer; class QStatusBar; /** * Handles the running of the animation as a sequence of pictures. This is implemented * as a timer trigger, to to make it easyer to time the fps and, more importantly, to * avoid threads. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class RunAnimationHandler : public QObject { Q_OBJECT public: /** * Creates the RunAnimationHandler and initializes the member fields. * @param parent the parent of this QOject. * @param sb the statusBar for displaying information to the user * @param name the name of this QObject */ RunAnimationHandler ( QObject *parent = 0, QStatusBar *sb = 0, Selection *selection = 0, const char *name = 0 ); /** * Stores the playButton so that it can be toggled * @param playButton the button which starts and stops the * animation running. This is needed for toggling the button states. */ void setPlayButton(QPushButton *playButton); /** * Stores the removeFramesButton so that it can be deactivated as needed. * @param removeFramesButton the button for removing frames. * This is needed for canceling this while running the animations to * avoid system crash :D */ void setRemoveFramesButton(QPushButton *removeFramesButton); /** * Sets the loop button. * @param loopButton the button to be used as loop button */ void setLoopButton(QPushButton *loopButton); /** * Sets the pause button. * @param pauseButton the button to be used as pause button */ void setPauseButton(QPushButton *pauseButton); signals: /** * The animation has reached this frame. */ void playFrame(int scene, int frame); void paused(); void stopped(int scene, int startFrame, int endFrame); public slots: /** * Starts the animation if it isn't playing and stops it if it is. * * This function is provided for ease of use with keyaccelerators. */ void toggleRunning(); /** * Runs the animation. */ void runAnimation(); /** * Stops the running of the animation. */ void stopAnimation(); /** * Freezes the running of the animation. */ void pauseAnimation(); /** * Sets the speed of the animation in frames per seccond * @param fps the number of frames per second the animation will run at. */ void setSpeed(int fps); /** * Toggles between looping the animation when it is running and closing it * when it reaches the end. */ void toggleLooping(); private: QStatusBar *statusBar; Selection *selection; QPushButton *playButton; QPushButton *removeFramesButton; QPushButton *loopButton; QPushButton *pauseButton; QTimer *timer; int sceneNr; int frameNr; int fps; bool isLooping; int startFrame; int endFrame; private slots: /** * Slot for playing the next frame. This slot is triggered by the timer. */ void playNextFrame(); /** * Runs the animation from previously-set current frame */ void resumeAnimation(); }; #endif stopmotion-0.8.0/src/application/soundhandler.cpp000066400000000000000000000061011234321124500222110ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/application/soundhandler.h" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/framebar/framebar.h" #include #include SoundHandler::SoundHandler(QObject *parent, QStatusBar *sb, const FrameBar* fb, const char* homeDir, const char *name) : QObject(parent), statusBar(sb), frameBar(fb), homeDir(homeDir) { soundsList = NULL; setObjectName(name); } void SoundHandler::setSoundsList(QListWidget *soundsList) { this->soundsList = soundsList; } void SoundHandler::addSound() { QString file = QFileDialog:: getOpenFileName(0, tr("Choose sound file"), QString(homeDir), tr("Sounds (*.ogg)") ); if ( !file.isNull() ) { DomainFacade *facade = DomainFacade::getFacade(); int activeScene = frameBar->getActiveScene(); int activeFrame = frameBar->getActiveFrame(); facade->addSound( activeScene, activeFrame, file.toLocal8Bit().constData() ); } } void SoundHandler::removeSound() { int index = soundsList->currentRow(); if (index >= 0) { int scene = frameBar->getActiveScene(); int frame = frameBar->getActiveFrame(); DomainFacade::getFacade()->removeSound(scene, frame, index); } } void SoundHandler::setSoundName() { int index = soundsList->currentRow(); if (index >= 0) { bool ok = false; QString text = QInputDialog::getText(0, tr("Sound name"), tr("Enter the name of the sound:"), QLineEdit::Normal,QString::null, &ok); if ( ok && !text.isEmpty() ) { int scene = frameBar->getActiveScene(); int frame = frameBar->getActiveFrame(); DomainFacade::getFacade()->setSoundName(scene, frame, index, text.toLocal8Bit().data() ); } } } stopmotion-0.8.0/src/application/soundhandler.h000066400000000000000000000055231234321124500216650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SOUNDHANDLER_H #define SOUNDHANDLER_H #include "src/config.h" #include #include #include class FrameBar; /** * This class handles request related to sounds (adding, removing, etc). * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class SoundHandler : public QObject { Q_OBJECT public: /** * Creates and initializes the Soundhandler. * @param parent the parent of the soundhandler. * @param sb a statusbar for displaying status information to the user. * @param homeDir the home directory of the user. * @param name the name of the soundhandler */ SoundHandler ( QObject *parent = 0, QStatusBar *sb = 0, const FrameBar* frameBar = 0, const char* homeDir = 0, const char *name = 0 ); /** * Add the soundsList to the handler so that it can be cleared and filled as * needed. * @param soundsList the listbox to add to the handler. */ //void setSoundsList(Q3ListBox *soundsList); void setSoundsList(QListWidget *soundsList); public slots: /** * Attatches a sound to a frame in the animation. */ void addSound(); /** * Removes a sound from a frame in the animation. */ void removeSound(); /** * Sets the name of a sound in a frame in the animation. */ void setSoundName(); private: QStatusBar *statusBar; const FrameBar* frameBar; const char* homeDir; //Q3ListBox *soundsList; QListWidget *soundsList; }; #endif stopmotion-0.8.0/src/config.cpp000066400000000000000000000004261234321124500164710ustar00rootroot00000000000000#include "src/config.h" #ifndef PREFIX_PATH #define PREFIX_PATH "/usr/local" #endif const char *const stopmotion::htmlDirectory = PREFIX_PATH "/share/doc/stopmotion/html"; const char *const stopmotion::translationsDirectory = PREFIX_PATH "/share/stopmotion/translations"; stopmotion-0.8.0/src/config.h000066400000000000000000000032751234321124500161430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef CONFIG_H #define CONFIG_H //Global includes #include #include "foundation/logger.h" //Global defines #define QTGUI namespace stopmotion { extern const char *const htmlDirectory; extern const char *const translationsDirectory; }; #endif stopmotion-0.8.0/src/domain/000077500000000000000000000000001234321124500157655ustar00rootroot00000000000000stopmotion-0.8.0/src/domain/animation/000077500000000000000000000000001234321124500177445ustar00rootroot00000000000000stopmotion-0.8.0/src/domain/animation/animation.cpp000066400000000000000000000331431234321124500224330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "animation.h" #include "src/foundation/logger.h" #include "src/technical/audio/ossdriver.h" #include "src/technical/video/videofactory.h" #include "src/technical/projectserializer.h" #include "workspacefile.h" #include "scenevector.h" #include "sound.h" #include "scene.h" #include "frame.h" #include "animationimpl.h" #include "src/domain/observernotifier.h" #include "src/presentation/observer.h" #include "src/domain/undo/commandadd.h" #include "src/domain/undo/command.h" #include "src/domain/undo/executor.h" #include "src/domain/undo/addallcommands.h" #include "src/domain/undo/filelogger.h" #include #include #include #include #include #include namespace { bool ensureUnlinked(const char* path) { return 0 == unlink(path) || errno == ENOENT; } } FailedToInitializeCommandLogger::FailedToInitializeCommandLogger() { } const char* FailedToInitializeCommandLogger::what() const throw () { return "Failed to initialize command logger"; } Animation::Animation() : scenes(0), executor(0), logger(0), serializer(0), audioDriver(0), isAudioDriverInitialized(false), frontend(0) { std::auto_ptr scs(new SceneVector); std::auto_ptr on(new ObserverNotifier(scs.get(), 0)); scs.release(); std::auto_ptr szer(new ProjectSerializer); std::auto_ptr ad(new OSSDriver("/dev/dsp")); std::auto_ptr ex(makeAnimationCommandExecutor(*on)); std::auto_ptr lgr(new FileCommandLogger); ex->setCommandLogger(lgr->getLogger()); scenes = on.release(); serializer = szer.release(); executor = ex.release(); logger = lgr.release(); audioDriver = ad.release(); } Animation::~Animation() { delete scenes; scenes = NULL; delete serializer; serializer = NULL; delete audioDriver; audioDriver = NULL; delete executor; executor = NULL; delete logger; logger = NULL; } void Animation::addFrames(int scene, int frame, StringIterator& frameNames) { if (sceneCount() == 0) { newScene(0); } int count = frameNames.count(); CommandAddFactory::Parameters params(scene, frame, count); bool showingProgress = 1 < count; if (showingProgress) { frontend->showProgress(Frontend::importingFramesFromDisk, count); } std::string error; // error.empty() is false if string is "\0"! So we set this explicitly on error. bool isError = false; int added = 0; for (; !frameNames.atEnd(); frameNames.next()) { try { params.addFrame(frameNames.get()); ++added; } catch (CopyFailedException&) { isError = true; error += "Cannot read file "; error += frameNames.get(); error += "\n"; } if (frontend->isOperationAborted()) { return; } if (showingProgress) frontend->updateProgress(added); } if (0 < added) { executor->execute(Commands::addFrames, params); params.retainFiles(); } if (showingProgress) frontend->hideProgress(); if (isError) frontend->reportError(error.c_str(), 0); } void Animation::removeFrames(int32_t scene, int32_t frame, int32_t count) { assert(0 <= count); assert(frame + count <= frameCount(scene)); executor->execute(Commands::removeFrames, scene, frame, count); } void Animation::moveFrames(int32_t fromScene, int32_t fromFrame, int32_t count, int32_t toScene, int32_t toFrame) { assert(0 <= count); assert(fromFrame + count <= frameCount(fromScene)); assert(toFrame <= frameCount(toScene)); if (toScene == fromScene && fromFrame <= toFrame && toFrame < fromFrame + count) { // Attempt to move frames into the same position; ineffective. return; } executor->execute(Commands::moveFrames, fromScene, fromFrame, count, toScene, toFrame); } int Animation::addSound(int32_t scene, int32_t frameNumber, const char *soundFile) { TemporaryWorkspaceFile soundFileWs(soundFile); std::auto_ptr sound(new Sound()); std::stringstream ss; std::stringstream::pos_type zeroOffset = ss.tellp(); ss << "Sound " << WorkspaceFile::getSoundNumber(); int size = (ss.tellp() - zeroOffset) + 1; char* soundName = new char[size]; std::string sc = ss.str(); strncpy(soundName, sc.c_str(), size); const char* oldName = sound->setName(soundName); assert(oldName == NULL); int32_t index = soundCount(scene, frameNumber); try { executor->execute(Commands::addSound, scene, frameNumber, index, soundFileWs.basename(), soundName); } catch (CouldNotOpenFileException&) { frontend->reportError( "Cannot open the selected audio file for reading.\n" "Check that you have the right permissions set.\n" "The animation will run without this sound if you\n" "choose to play.", 0); return -1; } catch (InvalidAudioFormatException&) { frontend->reportError( "The selected audio file is not a recognized\n" "audio format. The animation will run without\n" "this sound if you choose to play.", 0); return -2; } soundFileWs.retainFile(); WorkspaceFile::nextSoundNumber(); return 0; } void Animation::removeSound(int32_t sceneNumber, int32_t frameNumber, int32_t soundNumber) { executor->execute(Commands::removeSound, sceneNumber, frameNumber, soundNumber); } void Animation::setSoundName(int32_t sceneNumber, int32_t frameNumber, int32_t soundNumber, const char *soundName) { executor->execute(Commands::renameSound, sceneNumber, frameNumber, soundNumber, soundName); } int Animation::frameCount() const { int modelSize = 0; int s = sceneCount(); for (int i = 0; i < s; ++i) { modelSize += frameCount(i); } return modelSize; } int Animation::frameCount(int sceneNumber) const { if (sceneNumber > -1 && sceneNumber < sceneCount()) { return scenes->frameCount(sceneNumber); } return 0; } int Animation::sceneCount() const { return scenes->sceneCount(); } const char* Animation::getProjectFile() { return serializer->getProjectFile(); } void Animation::clear() { logger->setLogFile(0); scenes->clear(); executor->clearHistory(); WorkspaceFile::clear(); } void Animation::setScenes(const std::vector& sv) { int count = sv.size(); scenes->preallocateScenes(count); scenes->clear(); for (int i = 0; i != count; ++i) { scenes->addScene(i, sv[i]); } } bool Animation::loadFromDat(const char* filename, const char* projectFilename) { std::vector sv; if (ProjectSerializer::openDat(sv, filename)) { setScenes(sv); serializer->resetProjectFile(projectFilename); return true; } return false; } void Animation::openProject(const char *filename) { logger->setLogFile(0); clear(); initializeCommandLog(); assert(filename != 0); vector newScenes = serializer->openSto(filename); setScenes(newScenes); } FILE* Animation::initializeCommandLog() { WorkspaceFile commandLogger(WorkspaceFile::commandLogFile); FILE* fh = fopen(commandLogger.path(), "w"); if (!fh) throw FailedToInitializeCommandLogger(); logger->setLogFile(fh); return fh; } void Animation::saveProject(const char *filename) { assert(filename != 0); WorkspaceFile newDat(WorkspaceFile::newModelFile); if (!ensureUnlinked(newDat.path())) { Logger::get().logWarning("newModelFile not removed prior to saving"); } serializer->save(filename, *scenes, frontend); WorkspaceFile currentDat(WorkspaceFile::currentModelFile); if (!ensureUnlinked(currentDat.path())) { Logger::get().logWarning("currentModelFile not removed after saving"); } logger->setLogFile(0); initializeCommandLog(); if (rename(newDat.path(), currentDat.path()) < 0) throw FailedToInitializeCommandLogger(); executor->clearHistory(); } void Animation::newProject() { WorkspaceFile newDat(WorkspaceFile::newModelFile); WorkspaceFile currentDat(WorkspaceFile::currentModelFile); if (!ensureUnlinked(newDat.path()) || !ensureUnlinked(currentDat.path())) { throw FailedToInitializeCommandLogger(); } clear(); serializer->resetProjectFile(); initializeCommandLog(); } const char* Animation::getImagePath(int scene, int frame) const { return scenes->getScene(scene)->getFrame(frame)->getImagePath(); } const char* Animation::getSoundName(int scene, int frame, int soundNumber) const { return scenes->getScene(scene)->getFrame(frame)->getSoundName(soundNumber); } bool Animation::isUnsavedChanges() { return executor->canUndo(); } void Animation::setImagePath(int32_t sceneNumber, int32_t frameNumber, const char* newImagePath) { TemporaryWorkspaceFile twf(newImagePath); executor->execute(Commands::setImage, sceneNumber, frameNumber, twf.basename()); twf.retainFile(); } void Animation::duplicateImage(int32_t sceneNumber, int32_t frameNumber) { const char* currentPath = getImagePath(sceneNumber, frameNumber); TemporaryWorkspaceFile twf(currentPath, TemporaryWorkspaceFile::forceCopy); executor->execute(Commands::setImage, sceneNumber, frameNumber, twf.basename()); twf.retainFile(); } void Animation::attach(Observer* o) { scenes->addObserver(o); } void Animation::detach(Observer* o) { scenes->removeObserver(o); } void Animation::registerFrontend(Frontend* fe) { scenes->registerFrontend(fe); frontend = fe; } Frontend* Animation::getFrontend() { return frontend; } int Animation::soundCount(int scene, int frame) const { return scenes->soundCount(scene, frame); } void Animation::newScene(int32_t index) { executor->execute(Commands::addScene, index); } void Animation::removeScene(int32_t sceneNumber) { assert(sceneNumber >= 0); executor->execute(Commands::removeScene, sceneNumber); } void Animation::moveScene(int32_t sceneNumber, int32_t movePosition) { if (sceneNumber != movePosition) { executor->execute(Commands::moveScene, sceneNumber, movePosition); } } bool Animation::initAudioDevice() { isAudioDriverInitialized = audioDriver->initialize(); if (!isAudioDriverInitialized && 0 < scenes->soundCount()) { frontend->reportError( "Cannot play sound. Check that you have the right\n" "permissions and other programs do not block\n" "the audio device. Audio will be disabled until you\n" "have fixed the problem.", 0); } return isAudioDriverInitialized; } void Animation::shutdownAudioDevice() { audioDriver->shutdown(); isAudioDriverInitialized = false; } bool Animation::exportToVideo(VideoEncoder * encoder) { VideoFactory factory(scenes, frontend); frontend->showProgress(Frontend::exporting, 0); if (factory.createVideoFile(encoder) != NULL) { frontend->hideProgress(); return true; } frontend->hideProgress(); return false; } bool Animation::exportToCinerella(const char*) { return false; } void Animation::accept(FileNameVisitor& v) const { scenes->accept(v); } void Animation::undo() { executor->undo(); } void Animation::redo() { executor->redo(); } void Animation::clearHistory() { executor->clearHistory(); } void Animation::resync(std::exception& e) { if (frontend) frontend->reportError(e.what(), 1); scenes->resync(); } const char* Animation::getSoundPath(int scene, int frame, int sound) const { return scenes->getScene(scene)->getSound(frame, sound)->getAudio() ->getSoundPath(); } int Animation::soundCount() const { return scenes->soundCount(); } void Animation::setCommandLoggerFile(FILE* file) { logger->setLogFile(file); } class GetLine { FILE* fh; char* buffer; size_t size; public: GetLine(FILE* handle) : fh(handle), buffer(0), size(0) { } ~GetLine() { free(buffer); } const char* get() const { return buffer; } bool next() { return 0 < getline(&buffer, &size, fh); } }; void Animation::replayCommandLog(FILE* file) { long startPos = ftell(file); long length = 0; if (frontend && startPos != -1 && 0 == fseek(file, 0, SEEK_END)) { length = ftell(file); if (0 != fseek(file, startPos, SEEK_SET)) throw FileException("replayCommandLog", errno); if (length < 1000) { length = 0; } else { frontend->showProgress(Frontend::restoringProject, length - startPos); } } GetLine lineIterator(file); int r = 0; while (0 < (r = lineIterator.next())) { executor->executeFromLog(lineIterator.get()); if (0 < length) { long pos = ftell(file) - startPos; frontend->updateProgress(pos); } } if (0 < length) frontend->hideProgress(); if (r < 0) throw FileException("replayCommandLog", errno); } bool Animation::canUndo() { return executor->canUndo(); } bool Animation::canRedo() { return executor->canRedo(); } void Animation::setUndoRedoObserver(UndoRedoObserver* observer) { executor->setUndoRedoObserver(observer); } stopmotion-0.8.0/src/domain/animation/animation.h000066400000000000000000000313071234321124500221000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ANIMATION_H #define ANIMATION_H #include "src/config.h" #include "src/domain/undo/executor.h" #include "src/technical/stringiterator.h" #include #include using namespace std; class FileNameVisitor; class Frontend; class Observer; class ObserverNotifier; class VideoEncoder; class ProjectSerializer; class AudioDriver; class FileCommandLogger; class Scene; class FailedToInitializeCommandLogger : public std::exception { public: FailedToInitializeCommandLogger(); const char* what() const throw(); }; /** * Represents the animation. Is responsible for the undo system and a bunch of * other minor stuff it really shouldn't be doing. */ class Animation { public: /** * Initializes the variables of the animation to starting values. */ Animation(); /** * Cleans up the animation. */ ~Animation(); /** * Attatches a new observer to the model. The observer will be notified when * something is changed in the model. * @param o the observer to be attatched to the model. */ void attach(Observer *o); /** * Detaches an observer from the model. The observer will no longer be notified * when something is changed in the model. * @param o the observer to be detached from the model. */ void detach(Observer *o); /** * Registers the GUI frontend which is used to displaying and updating * progress when running time-consuming operations. * @param frontend the GUI frontend */ void registerFrontend(Frontend *frontend); /** * Retrieves the registered frontend. * @return the frontend if it is a valid frontend pointer, NULL otherwise. */ Frontend* getFrontend(); /** * Attempts to re-synch the UI after an error. */ void resync(std::exception& e); /** * Inserts new frames into the animation model. * @param scene The scene to add the frames to. * @param frame The frame index to add the frames to in the animation. * @param frameNames a vector containing the names to be added in the model */ void addFrames(int scene, int frame, StringIterator& frameNames); /** * Removes frames from a scene in the animation. * @param scene The scene from which to remove the frames. * @param frame The first frame to remove. * @param count The number of frames to remove. */ void removeFrames(int32_t scene, int32_t frame, int32_t count); /** * Moves frames from one position in the animation to another. * @param fromScene The scene from which to move the frames. * @param fromFrame The first frame within that scene to move. * @param count The number of frames to move; all frames moved must be * within the same scene. * @param fromScene The scene to move the frames to. * @param toFrame The position within the scene {@a toScene} to which * the frames should be moved. */ void moveFrames(int32_t fromScene, int32_t fromFrame, int32_t count, int32_t toScene, int32_t toFrame); /** * Returns the path to the image file for the frame specified. * @param scene The scene to which the frame belongs. * @param frame The frame within scene {@a scene} to query. * @return The image path of frame number {@a frame} of scene {@a scene}. * Ownership is not returned. */ const char* getImagePath(int scene, int frame) const; /** * Replaces the image for the specified frame. * @param scene The scene to which the frame belongs. * @param frame The frame number of the frame within the scene. * @param newImagePath The full path to the new image for this frame. */ void setImagePath(int32_t sceneNumber, int32_t frameNumber, const char* newImagePath); /** * Duplicates the image file for the specified frame, setting the frames * image to the duplicate. * @param sceneNumber The scene to which the frame belongs. * @param frameNumber The frame within the scene. */ void duplicateImage(int32_t sceneNumber, int32_t frameNumber); /** * Adds the sound from the file "sound" to frame * at position frameNumber. * @param scene The scene containing the frame to add the sound to. * @param frameNumber The number of the frame to add the sound to. * @param filename The path to the file with the sound * @return zero on success, less than zero on failure; * -1 = file is not readable * -2 = not a valid audio file */ int addSound(int32_t scene, int32_t frameNumber, const char *filename); /** * Removes the sound with index soundNumber from the frame with index * frameNumber. * @param sceneNumber The index of the scene containing the frame * from which the sound is to be removed. * @param frameNumber the index of the frame to remove a sound from. * @param soundNumber the index of the sound to remove from the frame. */ void removeSound(int32_t sceneNumber, int32_t frameNumber, int32_t soundNumber); /** * Returns the human-readable name of the sound specified. * @param scene The scene to which the frame belongs. * @param frame The frame to which the sound belongs. * @param soundNumber The index of the sound. * @return The name of sound indexed {@a soundNumber} of frame {@a frame} * of scene {@a scene}. Ownership is not returned. */ const char* getSoundName(int scene, int frame, int soundNumber) const; /** * Sets the name of the sound with index {@a soundNumber} in the frame with * index {@a frameNumber} to {@a soundName}. * @param sceneNumber The index of the scene containing the frame * whose sound will be renamed. * @param frameNumber the index of the frame the sound is in. * @param soundNumber the index to the sound to change the name of. * @param soundName the new name of the sound. */ void setSoundName(int32_t sceneNumber, int32_t frameNumber, int32_t soundNumber, const char* soundName); /** * Returns the filename of the sound number {@a sound} within frame number * {@a frame} within scene number {@a scene}. * @param scene The index of the scene containing the frame. * @param frame The index of the frame within scene {@a scene} * @param sound The index of the sound within frame {@frame}. * @return The path of the file containing the sound. Ownership is not * returned. */ const char* getSoundPath(int scene, int frame, int sound) const; /** * Returns the total number of frames in the model. * @return The total number of frames in all scenes of the model. */ int frameCount() const; /** * Retrieves the size of the scene at index sceneNumber. * @param sceneNumber the index of the scene to retrieve the size of. * @return the size of the scene. */ int frameCount(int sceneNumber) const; /** * Returns the number of sounds in the frame specified. * @param scene The number of the scene. * @param frame The number of the frame within the scene. * @return The number of sounds attached to the specified frame. */ int soundCount(int scene, int frame) const; /** * Returns the total number of sounds in the project. * @return The total number of sounds in all frames in all scenes. * Duplicates are counted the number of times they appear. */ int soundCount() const; /** * Retrieves the number of scenes in the animation. * @return the number of scenes in the animation. */ int sceneCount() const; /** * Plays the frame with number frameNumber. * @param frameNumber the number of the frame to play. */ //void playFrame(int frameNumber); void clearHistory(); void clear(); void undo(); void redo(); bool canUndo(); bool canRedo(); /** * Sets the observer to receive notification when the can undo/can redo * state changes. */ void setUndoRedoObserver(UndoRedoObserver* observer); /** * Retrieves the project file. * @return the project file if it has been set, NULL otherwise. */ const char *getProjectFile(); /** * Clears the animation and loads it from the dat file specified. * If unsuccessful, the animation is untouched. * @param filename The XML file to load. * @param projectFilename The name of the project file this XML file came * from or was last saved to, if known. * @return {@c true} if successful. */ bool loadFromDat(const char* filename, const char* projectFilename); /** * Opens a project. * @param filename the project file to open (ends with .sto) */ void openProject(const char *filename); /** * Saves the active project to a XML-file which is written to disk. * @param filename the filename to store the project files within. */ void saveProject(const char *filename); /** * Creates a new project. * @throw FailedToInitializeCommandLogger if either the current project * file could not be deleted or the command log file could not be * reinitialized. The project may or may not be cleared in this case. */ void newProject(); /** * Checks if there are unsaved changes in the model. * @return true if there are unsaved changes, false otherwise. */ bool isUnsavedChanges(); /** * Create and adds a new scene to the animation at position ``index''. * @param index the position to add the new scene. */ void newScene(int32_t index); /** * Removes the scene at the location sceneNumber from the animation. * @param sceneNumber the scene to be removed from the animation. */ void removeScene(int32_t sceneNumber); /** * Moves the scene at position sceneNumber to the position movePosition. * @param sceneNumber the number of the scene to move. * @param movePosition the position to move the scene to. */ void moveScene(int32_t sceneNumber, int32_t movePosition); /** * Initializes the audio device so it is ready to play sounds. * @return true on success, false otherwise */ bool initAudioDevice(); /** * Shutdowns the the audio device so that other programs can use it. */ void shutdownAudioDevice(); /** * Exports the current project to a video file as specified by the video encoder. * @param encoder the video encoder to use for export to video * @return true on success, false otherwise */ bool exportToVideo(VideoEncoder *encoder); /** * Exports the current project to a Cinerella project. * @param file the Cinerella project file * @return true on success, false otherwise */ bool exportToCinerella(const char *file); /** * Sets the file to be used as the command log. * @param file The file, which must be opened for write. Ownership is * passed. */ void setCommandLoggerFile(FILE* file); /** * Replay the commands in the file. * @param file The command log file, opened for reading and seeked to the * beginning of the file (or wherever is appropriate). * @throws FileException if the file could not be read in its entirety, or * another exception if decoding the log failed. Some commands may have * been applied. */ void replayCommandLog(FILE* file); /** * Have v visit all the files referenced (images and sounds) */ void accept(FileNameVisitor& v) const; private: void setScenes(const std::vector& sv); FILE* initializeCommandLog(); /** All of the scenes in the animation. */ ObserverNotifier* scenes; /** Undo and disaster recovery. */ Executor* executor; FileCommandLogger* logger; /** Serializer to be used on saving and loading of the project. */ ProjectSerializer *serializer; /** Audio driver that can play sound. */ AudioDriver *audioDriver; /** Variable for checking if the audio device is successfully initialized. */ bool isAudioDriverInitialized; /** For the reporting of errors and warnings */ Frontend* frontend; }; #endif stopmotion-0.8.0/src/domain/animation/animationimpl.cpp000066400000000000000000000027711234321124500233200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "animationimpl.h" AnimationImpl::~AnimationImpl() { } stopmotion-0.8.0/src/domain/animation/animationimpl.h000066400000000000000000000216351234321124500227650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ANIMATIONIMPL_H_ #define ANIMATIONIMPL_H_ #include #include class WorkspaceFile; class Scene; class Frame; class Sound; class FileNameVisitor; /** * Base class for implementation class of the animation, and any wrappers. * Represents an animation that can be updated by the undo system. This * interface should therefore not be used by any code upstream of the * undo system. */ class AnimationImpl { public: virtual ~AnimationImpl() = 0; /** * Clears the animation so that there are no scenes and no frames. */ virtual void clear() = 0; /** * Returns the number of scenes in the animation. * @return The number of scenes. */ virtual int sceneCount() const = 0; /** * Adds a scene to the animation. * @param where Where in the sequence of scenes to insert this one. Must be * between 0 and {@c SceneCount()} inclusive. * @param newScene The scene to be inserted; ownership is passed. */ virtual void addScene(int where, Scene* newScene) = 0; /** * Adds a fresh empty scene. * @param where The scene number that this new scene will have. */ virtual void addScene(int where) = 0; /** * Preallocates memory so that AddScene can be called without the risk of * throwing an exception. * @param count Number of calls to @ref AddScene required without * exceptions being thrown. */ virtual void preallocateScenes(int count) = 0; /** * Removes a scene from the animation, together with all its frames. * @param from The scene to remove. Must be between 0 and @code{.cpp} * SceneCount() - 1 @endcode inclusive. * @return The removed scene. Ownership is returned. */ virtual Scene* removeScene(int from) = 0; /** * Moves a scene. * @param from The scene number to move. Must be between 0 and * {@c SceneCount()} inclusive. * @param from The number the scene is to become. Must be between 0 and * {@c SceneCount()} inclusive. */ virtual void moveScene(int from, int to) = 0; /** * Returns the scene requested, which must not be modified. * @param which The number of the scene to be returned. * @return The scene requested. */ virtual const Scene* getScene(int which) const = 0; /** * Returns the number of frames in scene number @a scene. * @param scene The number of the scene to query. * @return The number of frames in scene number @a scene. */ virtual int frameCount(int scene) const = 0; /** * Adds a frame to the animation. * @param scene The number of the scene to add the frames to. * @param where The number of the frame within scene number @a scene to * add the frame. * @param frame The frame to add. Ownership is passed. */ virtual void addFrame(int scene, int where, Frame* frame) = 0; /** * Adds frames to the animation. * @param scene The scene to which the frames will be added. * @param where The frame number for the first of the added frames. * @param frames The frames to add. * @note On failure, no frames will have been added. */ virtual void addFrames(int scene, int where, const std::vector& frames) = 0; /** * Preallocates enough memory for @ref AddFrames to add @a count frames * to scene number @scene. */ virtual void preallocateFrames(int scene, int count) = 0; /** * Removes a frame from the animation. * @param scene The scene to remove the frame from. * @param frame The number of the first frame within scene @a scene * to remove. * @return The removed frame; ownership is returned. * @throws Will not throw. */ virtual Frame* removeFrame(int scene, int frame) = 0; /** * Removes frames from the animation. * @param scene The scene from which to remove the frames. * @param frame The first frame to remove. * @param count The number of frames to remove. * @param [out] out The removed frames will be added to the end of this * vector. Ownership is returned. * @note Upon failure, {@a out} and the animation will both be untouched. * @pre The scene must have at least @code{.cpp} frame + count @endcode * frames. */ virtual void removeFrames(int scene, int frame, int count, std::vector& out) = 0; /** * Moves frames. * @param fromScene The number of the scene from which to move frames. * @param fromFrame The number of the frame within scene @a fromScene from * which frames should be moved. * @param frameCount The number of frames to move. All the frames must be * from the same scene. * @param toScene The number of the scene to which to move the frames. * @param toFrame The number of the frame within scene @a toScene to which * the frames should be moved. */ virtual void moveFrames(int fromScene, int fromFrame, int frameCount, int toScene, int toFrame) = 0; /** * Replaces the image of the frame at index {@a frameNumber} of scene * {@a sceneNumber}. * @param sceneNumber The index of the scene containing the frame to alter. * @param frameNumber The index of the frame to alter. * @param [in,out] The image to swap with. On exit, the frame at index * {@a frameNumber} will have the image formerly held by * {@a otherImage} and {@a otherImage} will have the image formerly held * by the frame. */ virtual void replaceImage(int sceneNumber, int frameNumber, WorkspaceFile& otherImage) = 0; /** * Returns the number of sounds attached to a frame. * @param scene The number of the scene that contains the frame that you * need to examine. * @param frame The number of the frame from @a scene to examine. * @return The number of sounds attached to frame number @a frame of scene * @a scene. */ virtual int soundCount(int scene, int frame) const = 0; /** * Returns the number of sounds in the animation. * @return Sum of the number of sounds attached to each frame. */ virtual int soundCount() const = 0; /** * Adds a sound to a frame of animation. * @param scene The number of the scene containing the frame to add the * sound to. * @param frame The number of the frame within scene number @a scene to * add the sound to. * @param soundNumber The position of the sound to add. Must be between * 0 and @code{.cpp} SoundCount(scene, frame) @endcode inclusive. * @param sound The name sound to add. Ownership is passed. */ virtual void addSound(int scene, int frame, int soundNumber, Sound* sound) = 0; /** * changes the name of a sound of a frame. * @param scene The number of the scene containing the frame to change. * @param frame The number of the frame within scene number @a scene * containing the sound to be named. * @param soundNumber Which sound within frame number @a frame of scene * number @a scene to be replaced. * @param soundName The new name of the sound to be added. Ownership * is passed; must have been created with {@c new char[]}. * @return The old name of the sound. Ownership is returned; must be * deleted with {@c delete[]}. * @throws Nothing. */ virtual const char* setSoundName(int scene, int frame, int soundNumber, const char* soundName) = 0; /** * Removes a sound of a frame. * @param scene The number of the scene containing the frame to change. * @param frame The number of the frame within scene number @a scene * containing the sound to be changed. * @param soundNumber Which sound within frame number @a frame of scene * number @a scene to be removed. * @return The file name of the sound that is being removed. Ownership * is returned. * @throws Nothing. */ virtual Sound* removeSound(int scene, int frame, int soundNumber) = 0; virtual void accept(FileNameVisitor& v) const = 0; }; #endif /* ANIMATIONIMPL_H_ */ stopmotion-0.8.0/src/domain/animation/frame.cpp000066400000000000000000000112201234321124500215360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "frame.h" #include "src/technical/audio/audiodriver.h" #include "src/domain/filenamevisitor.h" #include "src/config.h" #include "sound.h" #include #include #include class SoundOutOfRangeException : public std::exception { public: SoundOutOfRangeException() { } const char* what() const throw() { return "Internal error: Sound out of range!"; } }; Frame::Frame(WorkspaceFile& file) { assert(file.path() != NULL); imagePath.swap(file); } Frame::~Frame() { int numElem = sounds.size(); for (int i = 0; i < numElem; ++i) { delete sounds[i]; sounds[i] = NULL; } } const char* Frame::getImagePath() const { assert(imagePath.path() != NULL); return imagePath.path(); } const char* Frame::getBasename() const { assert(imagePath.basename() != 0); return imagePath.basename(); } int Frame::newSound(WorkspaceFile& file) { Logger::get().logDebug("Adding sound in frame"); preallocateSounds(1); std::auto_ptr sound(new Sound()); std::stringstream ss; std::stringstream::pos_type zeroOff = ss.tellp(); ss << "Sound" << WorkspaceFile::getSoundNumber(); int size = (ss.tellp() - zeroOff) + 1; char* soundName = new char[size]; std::string cs = ss.str(); strncpy(soundName, cs.c_str(), size); const char* oldName = sound->setName(soundName); assert(oldName == NULL); sound->open(file); WorkspaceFile::nextSoundNumber(); sounds.push_back(sound.release()); return 0; } void Frame::addSound(int index, Sound* sound) { if (index < 0 || soundCount() < index) throw SoundOutOfRangeException(); sounds.insert(sounds.begin() + index, sound); } void Frame::preallocateSounds(int extra) { sounds.reserve(soundCount() + extra); } Sound* Frame::removeSound(int soundNumber) { if (soundNumber < 0 || soundCount() <= soundNumber) throw SoundOutOfRangeException(); Sound* s = sounds[soundNumber]; sounds.erase(sounds.begin() + soundNumber); return s; } Sound* Frame::getSound(int soundNumber) { if (soundNumber < 0 || soundCount() <= soundNumber) throw SoundOutOfRangeException(); return sounds[soundNumber]; } const Sound* Frame::getSound(int soundNumber) const { if (soundNumber < 0 || soundCount() <= soundNumber) throw SoundOutOfRangeException(); return sounds[soundNumber]; } int Frame::soundCount() const { return sounds.size(); } const char* Frame::setSoundName(int soundNumber, const char* soundName) { if (soundNumber < 0 || soundCount() <= soundNumber) throw SoundOutOfRangeException(); return sounds[soundNumber]->setName(soundName); } const char* Frame::getSoundName(int soundNumber) const { if (soundNumber < 0 || soundCount() <= soundNumber) throw SoundOutOfRangeException(); return sounds[soundNumber]->getName(); } void Frame::playSounds(AudioDriver *driver) const { SoundVector::const_iterator i = sounds.begin(); for (; i != sounds.end(); ++i) { driver->addAudioFile((*i)->getAudio()); } if (i != sounds.begin()) driver->playInThread(); } void Frame::replaceImage(WorkspaceFile& otherImage) { otherImage.swap(imagePath); } void Frame::accept(FileNameVisitor& v) const { v.visitImage(imagePath.path()); for(SoundVector::const_iterator i = sounds.begin(); i != sounds.end(); ++i) { v.visitSound((*i)->getAudio()->getSoundPath()); } } stopmotion-0.8.0/src/domain/animation/frame.h000066400000000000000000000117371234321124500212200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FRAME_H #define FRAME_H #include "workspacefile.h" #include #include #include class FileNameVisitor; class Sound; class AudioDriver; /** * Class representing the frames in the animation * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Frame { public: /** * Creates a frame with the specified file for its picture. * @param file The picture for this frame. The WorkspaceFile object is * emptied by this call. */ Frame(WorkspaceFile& file); /** * Cleans up after the frame */ ~Frame(); /** * Adds the sound in the file filename to the end of the sounds in this * frame, giving it an arbitrary name. * @param file The file that holds the sound. * @return zero on success, less than zero on failure; * -1 = file is not readable * -2 = not a valid audio file */ int newSound(WorkspaceFile& file); /** * Adds a sound. * @param sound Ownership is passed. May not be null. * @param index Must be between 0 and @code{.cpp} getNumberOfSounds() * @endcode * @note This is guaranteed not to fail for @c n calls after a call to * @code{.cpp} preallocateSounds(n) @endcode */ void addSound(int index, Sound* sound); /** * Allocates space for @a extra more calls to @ref addSound * @param extra Number of slots to reserve. */ void preallocateSounds(int extra); /** * Removes sound number soundNumber from this frame. * @param soundNumber The index of the sound to remove. Must be between * 0 and @code{.cpp} getNumberOfSounds() - 1 @encode * @return The sound that was removed. Ownership is returned. */ Sound* removeSound(int index); /** * Returns the sound. * @param index Which sound to return. */ Sound* getSound(int index); /** * Returns the sound. * @param index Which sound to return. */ const Sound* getSound(int index) const; /** * Returns the number of sounds in this frame. * @return the number of sounds in this frame. */ int soundCount() const; /** * Sets the name of the sound at index soundNumber in this frame to * soundName * @param soundNumber the number of the sound to change the name of. * @param soundName the new name of the sound. Ownership is passed; must * have been allocated with new char[]. * @return The old name for this sound. Ownership is returned; must be * freed with delete[]. */ const char* setSoundName(int soundNumber, const char* soundName); /** * Retrieves the name of the sound at index soundNumber in this frame. * @param soundNumber the sound to return. * @return the sound at index soundNumber in this frame. Ownership is * not returned. */ const char* getSoundName(int soundNumber) const; /** * Retrieves the absolute path to the picture of this frame. * @return the absolute path to the picture of this frame. */ const char* getImagePath() const; /** * Retrieves the base name of the picture of this frame. * @return The picture file's silename and extension without any path. */ const char* getBasename() const; /** * Replaces the image path. * @param [in, out] otherImage The new image to set. On return, this will * hold the old image. */ void replaceImage(WorkspaceFile& otherImage); /** * Plays the sounds belonging to this frame. */ void playSounds(AudioDriver *driver) const; /** * Makes v visit all the files referenced (image and sounds) */ void accept(FileNameVisitor& v) const; private: WorkspaceFile imagePath; typedef std::vector SoundVector; /** Contains the sounds belonging to this frame. */ SoundVector sounds; }; #endif stopmotion-0.8.0/src/domain/animation/scene.cpp000066400000000000000000000142131234321124500215460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "scene.h" #include "src/domain/filenamevisitor.h" #include #include #include FrameOutOfRangeException::FrameOutOfRangeException() { } const char* FrameOutOfRangeException::what() const throw() { return "Internal error: Frame out of range!"; } Scene::Scene() { } Scene::~Scene() { unsigned int numElem = frames.size(); for (unsigned int i = 0; i < numElem; ++i) { delete frames[i]; } } int Scene::getSize() const { return frames.size(); } const Frame* Scene::getFrame(int frameNumber) const { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); return frames[frameNumber]; } void Scene::cleanFrames(int fromFrame, int toFrame) { if (fromFrame < 0 || toFrame < fromFrame || getSize() <= toFrame) throw FrameOutOfRangeException(); frames.erase(frames.begin() + fromFrame, frames.begin() + toFrame); } void Scene::addFrame(Frame* f, int index) { if (index < 0 || getSize() < index) throw FrameOutOfRangeException(); frames.insert(frames.begin() + index, f); } void Scene::addFrames(int where, const std::vector& fs) { int sceneSize = getSize(); if (where < 0 || sceneSize < where) throw FrameOutOfRangeException(); std::vector::size_type newFramesCount = fs.size(); preallocateFrames(newFramesCount); frames.reserve(sceneSize + newFramesCount); frames.insert(frames.begin() + where, fs.begin(), fs.end()); } void Scene::preallocateFrames(int count) { frames.reserve(frames.size() + count); } void Scene::addSavedFrame(Frame *f) { frames.push_back(f); } Frame* Scene::removeFrame(int frame) { if (frame < 0 || getSize() <= frame) throw FrameOutOfRangeException(); Frame* f = frames[frame]; frames.erase(frames.begin() + frame); return f; } void Scene::removeFrames(int frame, int count, std::vector& out) { if (count < 0 || frame < 0 || getSize() < frame + count) throw FrameOutOfRangeException(); out.reserve(out.size() + count); std::vector::iterator begin = frames.begin() + frame; std::vector::iterator end = frames.begin() + (frame + count); out.insert(out.end(), begin, end); frames.erase(begin, end); } void Scene::moveFrames(int fromFrame, int toFrame, int movePosition ) { int size = getSize(); if (fromFrame < 0 || toFrame < fromFrame || size <= toFrame || movePosition < 0 || size <= movePosition) throw FrameOutOfRangeException(); if (movePosition < fromFrame) { for (int i = fromFrame, j = movePosition; i <= toFrame; ++i, ++j) { Frame *f = frames[i]; frames.erase(frames.begin() + i); frames.insert(frames.begin() + j, f); } } else { for (int i = fromFrame; i <= toFrame; ++i) { Frame *f = frames[fromFrame]; frames.erase(frames.begin() + fromFrame); frames.insert(frames.begin() + movePosition, f); } } } void Scene::addSound(int frameNumber, int soundNumber, Sound* sound) { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); frames[frameNumber]->addSound(soundNumber, sound); } Sound* Scene::removeSound(int frameNumber, int index) { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); return frames[frameNumber]->removeSound(index); } const Sound* Scene::getSound(int frameNumber, int index) const { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); return frames[frameNumber]->getSound(index); } int Scene::soundCount(int frameNumber) const { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); return frames[frameNumber]->soundCount(); } const char* Scene::setSoundName(int frameNumber, int soundNumber, const char* soundName) { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); return frames[frameNumber]->setSoundName(soundNumber, soundName); } const char* Scene::getSoundName(int frameNumber, int soundNumber) const { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); return frames[frameNumber]->getSoundName(soundNumber); } void Scene::replaceImage(int frameNumber, WorkspaceFile& otherImage) { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); frames[frameNumber]->replaceImage(otherImage); } int Scene::newSound(int frameNumber, WorkspaceFile& file) { if (frameNumber < 0 || getSize() <= frameNumber) throw FrameOutOfRangeException(); return frames[frameNumber]->newSound(file); } int Scene::soundCount() const { int s = 0; for (FrameVector::const_iterator i = frames.begin(); i != frames.end(); ++i) { s += (*i)->soundCount(); } return s; } void Scene::accept(FileNameVisitor& v) const { for (FrameVector::const_iterator i = frames.begin(); i != frames.end(); ++i) { (*i)->accept(v); } } stopmotion-0.8.0/src/domain/animation/scene.h000066400000000000000000000161161234321124500212170ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SCENE_H #define SCENE_H #include "src/config.h" #include "frame.h" #include "src/presentation/frontends/frontend.h" #include class FileNameVisitor; class FrameOutOfRangeException : public std::exception { public: FrameOutOfRangeException(); const char* what() const throw(); }; /** * Class representing the scenes in the animation * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Scene { public: /** * Initializes the scene */ Scene(); /** * Cleans up the scene and delete the frames. */ ~Scene(); /** * Retrieves the size of the scene (the number of frames in it). * @return the number of frames in the scene. */ int getSize() const; /** * Retrieves the frame at position frameNumber in the scene. * @param frameNumber the number of the frame to retrieve. * @return the frame at position frameNumber. */ const Frame* getFrame(int frameNumber) const; /** * Removes a frame from the scene. * @param frame The frame to remove. * @return The removed frame. Ownership is returned. */ Frame* removeFrame(int frame); /** * Removes frames from the animation. * @param frame The index from which to begin removing. * @param cound The number of frames to remove. * @param [out] out The removed frames. */ void removeFrames(int frame, int count, std::vector& out); /** * Moves the frames at the positions from fromFrame to toFrame (inclusive) * to the position movePosition inside the scene. * @param fromFrame the first frame to move. * @param toFrame the lst frame to move. * @param movePosition the position to move the frames to. */ void moveFrames(int fromFrame, int toFrame, int movePosition); /** * Cleans frames from the scene without moving them around. Used when the user * aborts while adding frames. * @param fromFrame the first frame to remove. * @param toFrame the last frame to remove. */ void cleanFrames(int fromFrame, int toFrame); /** * Adds a frame at @a index. Will not fail if {@ref preallocateFrames} * has been called with the appropriate number beforehand. * @param f The frame to add. * @param index The index at which to add the frame. Must be between * 0 and @code{.cpp} getSize() @endcode inclusive. */ void addFrame(Frame* f, int index); /** * Adds frames to the scene. * @param where Frame index to add the new frames. * @param fs The frames to add. */ void addFrames(int where, const std::vector& fs); /** * Reserves space for @a count more frames to be added without the risk of * an exception being thrown. * @param count The number of frames that need to be added. */ void preallocateFrames(int count); /** * Replaces the image of the frame at index {@a frameNumber}. * @param frameNumber The index of the frame to alter. * @param [in,out] The image to swap with. On exit, the frame at index * {@a frameNumber} will have the image formerly held by * {@a otherImage} and {@a otherImage} will have the image formerly held * by the frame. */ void replaceImage(int frameNumber, WorkspaceFile& otherImage); /** * Adds an already saved frame. * @param f the frame to add */ void addSavedFrame(Frame *f); /** * Adds the sound in the file filename to the end of the sounds in the * frame with index {@a frameNumber}, giving it an arbitrary name. * @param file The file that holds the sound. * @return zero on success, less than zero on failure; * -1 = file is not readable * -2 = not a valid audio file */ int newSound(int frameNumber, WorkspaceFile& file); /** * Adds a sound to the frame specified. * @param frameNumber Index of the frame to add a sound to. * @param soundNumber Index that the sound is to have. * @param sound The sound to add. */ void addSound(int frameNumber, int soundNumber, Sound* sound); /** * Removes a sound from the specified frame. * @param frameNumber The frame from which to remove the sound. * @param index Which sound to remove. * @return The removed sound. Ownership is passed. */ Sound* removeSound(int frameNumber, int index); /** * Gets a sound from a frame. * @param frameNumber The index of the frame. * @param index The index of the sound. * @return The sound. Ownership is not passed. */ const Sound* getSound(int frameNumber, int index) const; /** * Returns the number of sounds in the specified frame. * @param frameNumber Index of the frame. * @return the number of sounds in frame {@a frameNumber}. */ int soundCount(int frameNumber) const; /** * Returns the total number of sounds in all the frames in this scene. * @return the number of sounds. */ int soundCount() const; /** * Sets the name of the sound at index soundNumber in the specified frame * to soundName * @param frameNumber Index of the frame. * @param soundNumber the number of the sound to change the name of. * @param soundName the new name of the sound. Ownership is passed; must * have been allocated with new char[]. * @return The old name for this sound. Ownership is returned; must be * freed with delete[]. */ const char* setSoundName(int frameNumber, int soundNumber, const char* soundName); /** * Retrieves the name of the sound at index soundNumber in the specified * frame. * @param frameNumber Index of the frame. * @param soundNumber the sound to return. * @return the sound at index soundNumber in this frame. Ownership is * not returned. */ const char* getSoundName(int frameNumber, int soundNumber) const; /** * Have v visit all the files referenced (images and sounds) */ void accept(FileNameVisitor& v) const; private: typedef std::vector FrameVector; FrameVector frames; }; #endif stopmotion-0.8.0/src/domain/animation/scenevector.cpp000066400000000000000000000151231234321124500227720ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "scenevector.h" #include "scene.h" #include "frame.h" #include "src/presentation/observer.h" class SceneOutOfRangeException : public std::exception { public: SceneOutOfRangeException() { } const char* what() const throw() { return "Internal error: Scene out of range!"; } }; SceneVector::SceneVector() : totalSoundCount(0) { } SceneVector::~SceneVector() { clear(); } void SceneVector::clear() { for (std::vector::iterator i = scenes.begin(); i != scenes.end(); ++i) { delete *i; } scenes.clear(); totalSoundCount = 0; } int SceneVector::sceneCount() const { return scenes.size(); } void SceneVector::addScene(int where, Scene* newScene) { if (where < 0 || sceneCount() < where) throw SceneOutOfRangeException(); scenes.insert(scenes.begin() + where, newScene); totalSoundCount += newScene->soundCount(); } void SceneVector::addScene(int where) { preallocateScenes(1); scenes.insert(scenes.begin() + where, new Scene()); } void SceneVector::preallocateScenes(int count) { scenes.reserve(sceneCount() + count); } Scene* SceneVector::removeScene(int from) { int sc = sceneCount(); if (from < 0 || sc <= from) throw SceneOutOfRangeException(); Scene* s = scenes[from]; scenes.erase(scenes.begin() + from); totalSoundCount -= s->soundCount(); return s; } void SceneVector::moveScene(int from, int to) { int size = sceneCount(); if (from < 0 || size <= from || to < 0 || size < to) throw SceneOutOfRangeException(); Scene* s = removeScene(from); if (from < to) --to; addScene(to, s); } const Scene* SceneVector::getScene(int which) const { if (which < 0 || sceneCount() <= which) throw SceneOutOfRangeException(); return scenes[which]; } Scene* SceneVector::getMutableScene(int which) { if (which < 0 || sceneCount() <= which) throw SceneOutOfRangeException(); return scenes[which]; } int SceneVector::frameCount(int scene) const { return getScene(scene)->getSize(); } void SceneVector::addFrame(int scene, int where, Frame* frame) { getMutableScene(scene)->addFrame(frame, where); totalSoundCount += frame->soundCount(); } void SceneVector::addFrames(int scene, int where, const std::vector& frames) { getMutableScene(scene)->addFrames(where, frames); for (std::vector::const_iterator i = frames.begin(); i != frames.end(); ++i) { totalSoundCount += (*i)->soundCount(); } } void SceneVector::preallocateFrames(int scene, int count) { getMutableScene(scene)->preallocateFrames(count); } Frame* SceneVector::removeFrame(int scene, int frame) { Frame* r = getMutableScene(scene)->removeFrame(frame); totalSoundCount -= r->soundCount(); return r; } void SceneVector::removeFrames(int scene, int frame, int count, std::vector& out) { int start = static_cast(out.size()); getMutableScene(scene)->removeFrames(frame, count, out); for (std::vector::const_iterator i = out.begin() + start; i != out.end(); ++i) { totalSoundCount -= (*i)->soundCount(); } } void SceneVector::moveFrames(int fromScene, int fromFrame, int frameCount, int toScene, int toFrame) { Scene* from = getMutableScene(fromScene); Scene* to = getMutableScene(toScene); const int fromSize = from->getSize(); const int toSize = to->getSize(); if (fromSize < fromFrame + frameCount || toSize < toFrame) throw FrameOutOfRangeException(); if (toScene != fromScene) { preallocateFrames(toScene, frameCount); // this will do for now, even though it is quadratic for (int i = 0; i != frameCount; ++i) { Frame* f = from->removeFrame(fromFrame); to->addFrame(f, toFrame + i); } } else if (toFrame < fromFrame) { // this will do for now, even though it is stupid for (int i = 0; i != frameCount; ++i) { Frame* f = from->removeFrame(fromFrame + i); to->addFrame(f, toFrame + i); } } else if (fromFrame + frameCount < toFrame) { // this will do for now, even though it is stupid for (int i = 0; i != frameCount; ++i) { // perform a rotation Frame* f = from->removeFrame(fromFrame); to->addFrame(f, toFrame - 1); } } } int SceneVector::soundCount(int scene, int frame) const { return getScene(scene)->getFrame(frame)->soundCount(); } void SceneVector::addSound(int scene, int frame, int soundNumber, Sound* sound) { getMutableScene(scene)->addSound(frame, soundNumber, sound); ++totalSoundCount; } const char* SceneVector::setSoundName(int scene, int frame, int soundNumber, const char* soundName) { return getMutableScene(scene)->setSoundName(frame, soundNumber, soundName); } Sound* SceneVector::removeSound(int scene, int frame, int soundNumber) { Sound* r = getMutableScene(scene)->removeSound(frame, soundNumber); if (r) --totalSoundCount; return r; } void SceneVector::replaceImage(int sceneNumber, int frameNumber, WorkspaceFile& otherImage) { getMutableScene(sceneNumber)->replaceImage(frameNumber, otherImage); } int SceneVector::soundCount() const { return totalSoundCount; } void SceneVector::accept(FileNameVisitor& v) const { for (std::vector::const_iterator i = scenes.begin(); i != scenes.end(); ++i) { (*i)->accept(v); } } const char* SceneVector::getImagePath(int scene, int frame) const { return getScene(scene)->getFrame(frame)->getImagePath(); } stopmotion-0.8.0/src/domain/animation/scenevector.h000066400000000000000000000212341234321124500224370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SCENEVECTOR_H_ #define SCENEVECTOR_H_ #include #include "animationimpl.h" class Scene; class Frame; class Sound; class FileNameVisitor; class WorkspaceFile; class SceneVector : public AnimationImpl { std::vector scenes; int totalSoundCount; Scene* getMutableScene(int); SceneVector(const SceneVector&); SceneVector& operator=(const SceneVector&); public: SceneVector(); ~SceneVector(); /** * Clears the animation so that there are no scenes and no frames. */ void clear(); /** * Returns the number of scenes in the animation. * @return The number of scenes. */ int sceneCount() const; /** * Adds a scene to the animation. * @param where Where in the sequence of scenes to insert this one. Must be * between 0 and {@c SceneCount()} inclusive. * @param newScene The scene to be inserted; ownership is passed. */ void addScene(int where, Scene* newScene); /** * Adds a fresh empty scene. * @param where The scene number that this new scene will have. */ void addScene(int where); /** * Preallocates memory so that AddScene can be called without the risk of * throwing an exception. * @param count Number of calls to @ref AddScene required without * exceptions being thrown. */ void preallocateScenes(int count); /** * Removes a scene from the animation, together with all its frames. * @param from The scene to remove. Must be between 0 and @code{.cpp} * SceneCount() - 1 @endcode inclusive. * @return The removed scene. Ownership is returned. */ Scene* removeScene(int from); /** * Moves a scene. * @param from The scene number to move. Must be between 0 and * {@c SceneCount()} inclusive. * @param from The number the scene is to become. Must be between 0 and * {@c SceneCount()} inclusive. */ void moveScene(int from, int to); /** * Returns the scene requested, which must not be modified. * @param which The number of the scene to be returned. * @return The scene requested. */ const Scene* getScene(int which) const; /** * Returns the number of frames in scene number @a scene. * @param scene The number of the scene to query. * @return The number of frames in scene number @a scene. */ int frameCount(int scene) const; /** * Adds a frame to the animation. * @param scene The number of the scene to add the frames to. * @param where The number of the frame within scene number @a scene to * add the frame. * @param frame The frame to add. Ownership is passed. */ void addFrame(int scene, int where, Frame* frame); /** * Adds frames to the animation. * @param scene The scene to which the frames will be added. * @param where The frame number for the first of the added frames. * @param frames The frames to add. * @note On failure, no frames will have been added. */ void addFrames(int scene, int where, const std::vector& frames); /** * Preallocates enough memory for @ref AddFrames to add @a count frames * to scene number @scene. */ void preallocateFrames(int scene, int count); /** * Removes a frame from the animation. * @param scene The scene to remove the frame from. * @param frame The number of the first frame within scene @a scene * to remove. * @return The removed frame; ownership is returned. * @throws Will not throw. */ Frame* removeFrame(int scene, int frame); /** * Removes frames from the animation. * @param scene The scene from which to remove the frames. * @param frame The first frame to remove. * @param count The number of frames to remove. * @param [out] out The removed frames will be added to the end of this * vector. Ownership is returned. * @note Upon failure, {@a out} and the animation will both be untouched. * @pre The scene must have at least @code{.cpp} frame + count @endcode * frames. */ void removeFrames(int scene, int frame, int count, std::vector& out); /** * Moves frames. * @param fromScene The number of the scene from which to move frames. * @param fromFrame The number of the frame within scene @a fromScene from * which frames should be moved. * @param frameCount The number of frames to move. All the frames must be * from the same scene. * @param toScene The number of the scene to which to move the frames. * @param toFrame The number of the frame within scene @a toScene to which * the frames should be moved. */ void moveFrames(int fromScene, int fromFrame, int frameCount, int toScene, int toFrame); /** * Returns the file path of the image of the specified frame. */ const char* getImagePath(int scene, int frame) const; /** * Replaces the image of the frame at index {@a frameNumber} of scene * {@a sceneNumber}. * @param sceneNumber The index of the scene containing the frame to alter. * @param frameNumber The index of the frame to alter. * @param [in,out] The image to swap with. On exit, the frame at index * {@a frameNumber} will have the image formerly held by * {@a otherImage} and {@a otherImage} will have the image formerly held * by the frame. */ void replaceImage(int sceneNumber, int frameNumber, WorkspaceFile& otherImage); /** * Returns the number of sounds attached to a frame. * @param scene The number of the scene that contains the frame that you * need to examine. * @param frame The number of the frame from @a scene to examine. * @return The number of sounds attached to frame number @a frame of scene * @a scene. */ int soundCount(int scene, int frame) const; /** * Returns the total number of sounds in the animation. */ int soundCount() const; /** * Adds a sound to a frame of animation. * @param scene The number of the scene containing the frame to add the * sound to. * @param frame The number of the frame within scene number @a scene to * add the sound to. * @param soundNumber The position of the sound to add. Must be between * 0 and @code{.cpp} SoundCount(scene, frame) @endcode inclusive. * @param sound The name sound to add. Ownership is passed. */ void addSound(int scene, int frame, int soundNumber, Sound* sound); /** * changes the name of a sound of a frame. * @param scene The number of the scene containing the frame to change. * @param frame The number of the frame within scene number @a scene * containing the sound to be named. * @param soundNumber Which sound within frame number @a frame of scene * number @a scene to be replaced. * @param soundName The new name of the sound to be added. Ownership * is passed; must have been created with {@c new char[]}. * @return The old name of the sound. Ownership is returned; must be * deleted with {@c delete[]}. * @throws Nothing. */ const char* setSoundName(int scene, int frame, int soundNumber, const char* soundName); /** * Removes a sound of a frame. * @param scene The number of the scene containing the frame to change. * @param frame The number of the frame within scene number @a scene * containing the sound to be changed. * @param soundNumber Which sound within frame number @a frame of scene * number @a scene to be removed. * @return The file name of the sound that is being removed. Ownership * is returned. * @throws Nothing. */ Sound* removeSound(int scene, int frame, int soundNumber); void accept(FileNameVisitor& v) const; }; #endif /* SCENEVECTOR_H_ */ stopmotion-0.8.0/src/domain/animation/sound.cpp000066400000000000000000000044011234321124500215770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "sound.h" #include "src/technical/audio/audioformat.h" #include "src/technical/audio/oggvorbis.h" #include #include #include Sound::Sound() : af(0), name(0) { } Sound::~Sound() { delete af; delete name; } /** *@todo check audio type (ogg, mp3, wav ...) */ void Sound::open(WorkspaceFile& file) { std::auto_ptr a(new OggVorbis()); a->setFilename(file); af = a.release(); } const char* Sound::setName(const char* n) { const char* r = name; name = n; return r; } void Sound::setName(std::string& n) { assert(!name); int size = n.size() + 1; char* a = new char[size]; name = a; strncpy(a, n.c_str(), size); } AudioFormat* Sound::getAudio() { return af; } const AudioFormat* Sound::getAudio() const { return af; } const char* Sound::getName() const { return name; } stopmotion-0.8.0/src/domain/animation/sound.h000066400000000000000000000046531234321124500212550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SOUND_H_ #define SOUND_H_ #include "workspacefile.h" #include class AudioFormat; class WorkspaceFile; class Sound { AudioFormat* af; const char* name; public: Sound(); ~Sound(); /** * Opens an audio file. See {@ref AudioFormat::setFilename} for * exceptions that might be thrown. * @param file The filename to open. Ownership is not passed. * @todo We need a way of mocking this for testing. */ void open(WorkspaceFile& file); /** * Sets or resets the (human-readable) name of this sound. * @param name The new name or NULL for no name. Ownership is passed. * @return The old name or NULL for no name. Ownership is returned. */ const char* setName(const char* name); /** * Sets the (human-readable) name of this sound. May only be used when * there is no name already set for the sound. * @param n The name to set. */ void setName(std::string& n); AudioFormat* getAudio(); const AudioFormat* getAudio() const; const char* getName() const; }; #endif stopmotion-0.8.0/src/domain/animation/workspacefile.cpp000066400000000000000000000174541234321124500233210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "workspacefile.h" #include "src/technical/util.h" #include #include #include #include #include #include #include namespace { uint32_t fileNum; uint32_t soundNumber; uint32_t nextFileNumber() { return ++fileNum; } enum WorkspacePath { workspacePath }; enum WorkspacePathFrames { workspacePathFrames }; std::ostream& operator<<(std::ostream& s, WorkspacePath) { s << getenv("HOME"); s << "/.stopmotion/"; return s; } std::ostream& operator<<(std::ostream& s, WorkspacePathFrames) { s << getenv("HOME"); s << "/.stopmotion/frames/"; return s; } /** * Gets a fresh filename in the workspace that doesn't clash with any other * file. * @param [out] path Will get a @code{.cpp} new char[] @endcode containing * the full path to the new file. * @param [out] namePart Will get a pointer into @a path that points to the * basename part of the path. * @param [in] extension Characters that must come at the end of the filename, * for example ".jpg". */ void getFreshFilename(char*& path, const char*& namePart, const char* extension) { std::string pathOut; std::stringstream p; int indexOfName = 0; int size = 0; do { p.str(""); p << workspacePathFrames; indexOfName = p.str().length(); p.fill('0'); p.width(8); p << nextFileNumber(); if (extension) p << extension; pathOut = p.str(); size = pathOut.length() + 1; // keep going until we find a filename that doesn't already exist. } while (0 == access(pathOut.c_str(), F_OK)); path = new char[size]; strncpy(path, pathOut.c_str(), size); namePart = path + indexOfName; } /** * Returns a freshly-allocated {@c char[]} of the workspace file with basename * {@a basenameIn}. * @param basenameOut Pointer to the suffix of the buffer that matches * {@a basenameIn}. * @param basenameIn The name of the file. * @param inFrames True for a sound or image file. * @return The newly-allocated buffer. */ char* getWorkspaceFilename(const char *&basenameOut, const char* basenameIn, bool inFrames = false) { std::stringstream p; p.str(""); if (inFrames) { p << workspacePathFrames; } else { p << workspacePath; } int indexOfName = p.str().length(); p << basenameIn; std::string out = p.str(); const char* cp = out.c_str(); int size = out.length() + 1; char* fullPath = new char[size]; strncpy(fullPath, cp, size); basenameOut = fullPath + indexOfName; return fullPath; } } void WorkspaceFile::clear() { { std::stringstream pathStr; pathStr << workspacePath; std::string path = pathStr.str(); Util::ensurePathExists(path.c_str()); Util::removeDirectoryContents(path.c_str()); } std::stringstream framePathStr; framePathStr << workspacePathFrames; std::string framePath = framePathStr.str(); Util::ensurePathExists(framePath.c_str()); fileNum = 0; soundNumber = 0; } uint32_t WorkspaceFile::getSoundNumber() { return soundNumber; } void WorkspaceFile::nextSoundNumber() { ++soundNumber; } WorkspaceFile::WorkspaceFile() : fullPath(0), namePart(0) { } WorkspaceFile& WorkspaceFile::operator=(const WorkspaceFile& other) { if (other.fullPath) { int nameStart = other.namePart - other.fullPath; size_t length = 1 + nameStart + strlen(other.namePart); char* buffer = new char[length]; delete[] fullPath; fullPath = buffer; strncpy(fullPath, other.fullPath, length); namePart = fullPath + nameStart; } return *this; } WorkspaceFile::WorkspaceFile(const WorkspaceFile& t) : fullPath(0), namePart(0) { *this = t; } WorkspaceFile::WorkspaceFile(const char* name) : fullPath(0), namePart(0) { fullPath = getWorkspaceFilename(namePart, name, true); } WorkspaceFile::WorkspaceFile(NewModelFile) : fullPath(0), namePart(0) { fullPath = getWorkspaceFilename(namePart, "new.dat"); } WorkspaceFile::WorkspaceFile(CurrentModelFile) : fullPath(0), namePart(0) { fullPath = getWorkspaceFilename(namePart, "current.dat"); } WorkspaceFile::WorkspaceFile(CommandLogFile) : fullPath(0), namePart(0) { fullPath = getWorkspaceFilename(namePart, "command.log"); } WorkspaceFile::WorkspaceFile(CapturedImage) : fullPath(0), namePart(0) { fullPath = getWorkspaceFilename(namePart, "capturedfile.jpg"); } WorkspaceFile::WorkspaceFile(PreferencesFile) : fullPath(0), namePart(0) { fullPath = getWorkspaceFilename(namePart, "preferences.xml"); } WorkspaceFile::WorkspaceFile(PreferencesFileOld) : fullPath(0), namePart(0) { fullPath = getWorkspaceFilename(namePart, "preferences.xml.OLD"); } WorkspaceFile::~WorkspaceFile() { delete[] fullPath; } const char* WorkspaceFile::basename() const { return namePart; } const char* WorkspaceFile::path() const { return fullPath; } void WorkspaceFile::swap(WorkspaceFile& w) { char* t = w.fullPath; w.fullPath = fullPath; fullPath = t; const char* t0 = w.namePart; w.namePart = namePart; namePart = t0; } void TemporaryWorkspaceFile::copyToWorkspace(const char* filename) { const char* extension = strrchr(filename,'.'); getFreshFilename(fullPath, namePart, extension); toBeDeleted = false; if (!Util::copyFile(fullPath, filename)) { throw CopyFailedException(); } toBeDeleted = true; } TemporaryWorkspaceFile::TemporaryWorkspaceFile(const char* filename) : fullPath(0), namePart(0), toBeDeleted(false) { // not a totally foolproof test... if (strstr(filename, "/.stopmotion/frames/") != NULL) { // Already a workspace file; no need to copy it again int size = strlen(filename) + 1; fullPath = new char[size]; strncpy(fullPath, filename, size); namePart = strrchr(fullPath,'/') + 1; } else { copyToWorkspace(filename); } } TemporaryWorkspaceFile::TemporaryWorkspaceFile(const char* filename, ForceCopy) : fullPath(0), namePart(0), toBeDeleted(false) { copyToWorkspace(filename); } TemporaryWorkspaceFile::~TemporaryWorkspaceFile() { if (toBeDeleted) { unlink(fullPath); } delete[] fullPath; fullPath = 0; namePart = 0; } CopyFailedException::CopyFailedException() { } const char* CopyFailedException::what() const throw() { return "Failed to copy file to workspace directory (~/.stopmotion)."; } ExportDirectory::ExportDirectory() : p(0) { std::stringstream s; s << getenv("HOME"); s << "/.stopmotion/export/"; std::string pathOut = s.str(); pathOut.c_str(); // force allocation of trailing '\0' p = new char[pathOut.length() + 1]; strcpy(p, pathOut.c_str()); } ExportDirectory::~ExportDirectory() { delete[] p; } void ExportDirectory::makeEmpty() { //TODO } stopmotion-0.8.0/src/domain/animation/workspacefile.h000066400000000000000000000160201234321124500227520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef WORKSPACEFILE_H_ #define WORKSPACEFILE_H_ #include #include class TemporaryWorkspaceFile; class CopyFailedException : public std::exception { public: CopyFailedException(); const char* what() const throw(); }; /** * Represents the filename of a file in the workspace (~/.stopmotion/). * The file is not held open, nor is it deleted on destruction. * @par * To be used by commands in the undo system and objects manipulated by such * commands. */ class WorkspaceFile { char* fullPath; const char* namePart; public: enum NewModelFile { newModelFile }; enum CurrentModelFile { currentModelFile }; enum CommandLogFile { commandLogFile }; enum CapturedImage { capturedImage }; enum PreferencesFile { preferencesFile }; enum PreferencesFileOld { preferencesFileOld }; WorkspaceFile(const WorkspaceFile&); WorkspaceFile& operator=(const WorkspaceFile&); /** * Creates a WorkspaceFile referring to no file. Both @ref basename and * @ref path will return null until a @ref TemporaryWorkspaceFile is * assigned to it. */ WorkspaceFile(); /** * Creates a WorkspaceFile referring to a sound or image file already in * the workspace (having been created by {@c TemporaryWorkspaceFile}). * @param name The basename of the file (i.e. the return value of * {@ref TemporaryWorkspaceFile::basename}). */ WorkspaceFile(const char* name); /** * Refers to the "new" model file, which should be used by the recovery * system if either the "current" model file or the command log cannot be * found. The command log should never be used in conjunction with this * file. This should only be necessary if a crash occurred during project * save. */ WorkspaceFile(NewModelFile); /** * Refers to the "current" model file. If it and the command log are * present, the recovery system restores from this and then plays back the * commands from the command log. */ WorkspaceFile(CurrentModelFile); /** * Refers to the command log. This holds the commands that were issued * since the "current" model file was written. */ WorkspaceFile(CommandLogFile); /** * Refers to the image written to by the capture command. */ WorkspaceFile(CapturedImage); /** * Refers to the preferences file. */ WorkspaceFile(PreferencesFile); /** * Refers to the backup preferences file. */ WorkspaceFile(PreferencesFileOld); ~WorkspaceFile(); /** * Gets the file's basename. * @return The file's name (i.e. with no directory part but including any * extension). */ const char* basename() const; /** * Gets the file's full path. * @return the file's full path, which will be in the workspace directory * (i.e. @c ~/.stopmotion but specified relative to /, not ~). */ const char* path() const; /** * Swaps the content of this object with another. * @param w The object to swap contents with. */ void swap(WorkspaceFile& w); /** * Clears (creating if necessary) the workspace directory */ static void clear(); /** * Returns the current sound number counter. This is cleared by a call to * {@ref clear}. Remember to call {@ref nextSoundNumber} if the sound * number actually gets used. This is the number to be used in the default * readable name of a newly-added sound. * @return One more than the number of calls to {@ref nextSoundNumber} * since the last call to {@ref clear}. */ static uint32_t getSoundNumber(); /** * Increments the sound counter. */ static void nextSoundNumber(); }; /** * Represents the filename of a newly-created file in the workspace * (~/.stopmotion/). This file will be deleted upon destruction unless it * has been assigned to a @ref WorkspaceFile beforehand. * @par * To be used by the facade in front of the undo system. */ class TemporaryWorkspaceFile { char* fullPath; const char* namePart; bool toBeDeleted; TemporaryWorkspaceFile(const TemporaryWorkspaceFile&); TemporaryWorkspaceFile& operator=(const TemporaryWorkspaceFile); friend class WorkspaceFile; /** * @throws CopyFailedException if the copy failed. */ void copyToWorkspace(const char* filename); public: enum ForceCopy { forceCopy }; /** * Copy file with path @a filename into the workspace directory * ({@c ~/.stopmotion}) unless it is already in this directory. * A freshly-copied file will be deleted on destruction unless a * @ref WorkspaceFile is constructed from it beforehand. * @note The file is not kept open by this class. * @param filename The full path to the file. * @throws CopyFailedException if the copy failed. */ TemporaryWorkspaceFile(const char* filename); /** * Copy file with path @a filename into the workspace directory, * even if it is already in this directory. The file will be deleted on * destruction unless it has been assigned to a @ref WorkspaceFile * beforehand. * @note The file is not kept open by this class. * @param filename The full path to the file. Ownership is not passed. * @throws CopyFailedException if the copy failed. */ TemporaryWorkspaceFile(const char* filename, ForceCopy); ~TemporaryWorkspaceFile(); /** * Prevents the file from being deleted on destruction. */ void retainFile() { toBeDeleted = false; } /** * Returns the path of the file. * @return Ownership is not returned. */ const char* path() const { return fullPath; } /** * Returns the basename (with extension) of the file. * @return Ownership is not returned. */ const char* basename() const { return namePart; } }; class ExportDirectory { char* p; public: ExportDirectory(); ~ExportDirectory(); const char* path() const { return p; } void makeEmpty(); }; #endif /* WORKSPACEFILE_H_ */ stopmotion-0.8.0/src/domain/domainfacade.cpp000066400000000000000000000206611234321124500210710ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "domainfacade.h" #include "animation/animation.h" #include "src/foundation/logger.h" #include "src/presentation/frontends/frontend.h" #include "src/domain/animation/workspacefile.h" #include "src/foundation/preferencestool.h" DomainFacade* DomainFacade::domainFacade = 0; const char* DomainFacade::getImagePath(int scene, int frame) { try { return animationModel->getImagePath(scene, frame); } catch(std::exception& e) { animationModel->resync(e); return 0; } } int DomainFacade::soundCount(int scene, int frame) const { try { return animationModel->soundCount(scene, frame); } catch(std::exception& e) { animationModel->resync(e); return 0; } } bool DomainFacade::loadProject(const char* datFilename, const char* projectFilename) { return animationModel->loadFromDat(datFilename, projectFilename); } void DomainFacade::setMostRecentProject() { const char *first = DomainFacade::getFacade()->getProjectFile(); PreferencesTool *prefs = PreferencesTool::get(); if (first) { prefs->setPreference("projectFile", first, false); } else { prefs->removePreference("projectFile"); } if (first != 0) { Preference prefsFirst("mostRecent"); if (!prefsFirst.equals(first)) { Preference second("secondMostRecent"); prefs->setPreference("mostRecent", first, false); prefs->setPreference("secondMostRecent", prefsFirst.get(), false); if (!second.equals(first)) { prefs->setPreference("thirdMostRecent", second.get(), false); } } } prefs->flushPreferences(); } DomainFacade::DomainFacade() { animationModel = new Animation(); domainFacade = NULL; } DomainFacade::~DomainFacade() { delete animationModel; animationModel = NULL; } DomainFacade* DomainFacade::getFacade() { if(domainFacade == NULL) { domainFacade = new DomainFacade(); } return domainFacade; } void DomainFacade::attach(Observer *o) { animationModel->attach(o); } void DomainFacade::detach(Observer *o) { animationModel->detach(o); } void DomainFacade::registerFrontend(Frontend *frontend) { animationModel->registerFrontend(frontend); } Frontend* DomainFacade::getFrontend() { return animationModel->getFrontend(); } void DomainFacade::addFrames(int scene, int frame, StringIterator& frameNames) { try { Logger::get().logDebug("Adding frames in the domainfacade"); animationModel->addFrames(scene, frame, frameNames); } catch(std::exception& e) { animationModel->resync(e); } } void DomainFacade::removeFrames(int scene, int frame, int count) { try { Logger::get().logDebug("Removing frames in the domainfacade"); animationModel->removeFrames(scene, frame, count); } catch(std::exception& e) { animationModel->resync(e); } } void DomainFacade::moveFrames(int fromScene, int fromFrame, int count, int toScene, int toFrame) { try { animationModel->moveFrames(fromScene, fromFrame, count, toScene, toFrame); } catch(std::exception& e) { animationModel->resync(e); } } int DomainFacade::addSound(int scene, int frame, const char *filename) { try { Logger::get().logDebug("Adding sound in domainfacade"); return animationModel->addSound(scene, frame, filename); } catch(std::exception& e) { animationModel->resync(e); return -3; } } void DomainFacade::removeSound(int sceneNumber, int frameNumber, int soundNumber) { try { animationModel->removeSound(sceneNumber, frameNumber, soundNumber); } catch(std::exception& e) { animationModel->resync(e); } } void DomainFacade::setSoundName(int sceneNumber, int frameNumber, int soundNumber, const char* soundName) { try { animationModel->setSoundName(sceneNumber, frameNumber, soundNumber, soundName); } catch(std::exception& e) { animationModel->resync(e); } } void DomainFacade::openProject(const char *filename) { animationModel->openProject(filename); } void DomainFacade::saveProject(const char *directory) { animationModel->saveProject(directory); } bool DomainFacade::newProject() { animationModel->newProject(); setMostRecentProject(); return true; } bool DomainFacade::isUnsavedChanges() { return animationModel->isUnsavedChanges(); } int DomainFacade::getModelSize() const { return animationModel->frameCount(); } int DomainFacade::getSceneSize(int sceneNumber) const { try { return animationModel->frameCount(sceneNumber); } catch(std::exception& e) { animationModel->resync(e); return 0; } } int DomainFacade::getNumberOfScenes() const { return animationModel->sceneCount(); } int DomainFacade::getNumberOfSounds(int scene, int frame) const { try { return animationModel->soundCount(scene, frame); } catch(std::exception& e) { animationModel->resync(e); return 0; } } const char* DomainFacade::getProjectFile() { return animationModel->getProjectFile(); } void DomainFacade::undo() { animationModel->undo(); } void DomainFacade::redo() { animationModel->redo(); } void DomainFacade::clearHistory() { animationModel->clearHistory(); } void DomainFacade::newScene(int index) { try { animationModel->newScene(index); } catch(std::exception& e) { animationModel->resync(e); } } void DomainFacade::removeScene(int sceneNumber) { try { animationModel->removeScene(sceneNumber); } catch(std::exception& e) { animationModel->resync(e); } } void DomainFacade::moveScene(int sceneNumber, int movePosition) { try { animationModel->moveScene(sceneNumber, movePosition); } catch(std::exception& e) { animationModel->resync(e); } } bool DomainFacade::initAudioDevice() { return animationModel->initAudioDevice(); } void DomainFacade::shutdownAudioDevice() { return animationModel->shutdownAudioDevice(); } bool DomainFacade::exportToVideo(VideoEncoder *encoder) { return animationModel->exportToVideo(encoder); } bool DomainFacade::exportToCinerella(const char *file) { return animationModel->exportToCinerella(file); } const vector DomainFacade::getGrabberDevices() { return Util::getGrabberDevices(); } const char* DomainFacade::getSoundName(int sceneNumber, int frameNumber, int soundNumber) const { try { return animationModel->getSoundName(sceneNumber, frameNumber, soundNumber); } catch(std::exception& e) { animationModel->resync(e); return 0; } } void DomainFacade::duplicateImage(int scene, int frame) { animationModel->duplicateImage(scene, frame); } void DomainFacade::initializeCommandLoggerFile() { WorkspaceFile wslf(WorkspaceFile::commandLogFile); FILE* log = fopen(wslf.path(), "a"); if (!log) throw FailedToInitializeCommandLogger(); animationModel->setCommandLoggerFile(log); } bool DomainFacade::replayCommandLog(const char* filename) { FILE* log = fopen(filename, "r"); if (!log) return false; try { animationModel->replayCommandLog(log); } catch(std::exception& e) { Logger::get().logFatal("Recovery failed: %s", e.what()); fclose(log); return false; } return true; } bool DomainFacade::canUndo() { return animationModel->canUndo(); } bool DomainFacade::canRedo() { return animationModel->canRedo(); } void DomainFacade::setUndoRedoObserver(UndoRedoObserver* observer) { animationModel->setUndoRedoObserver(observer); } stopmotion-0.8.0/src/domain/domainfacade.h000066400000000000000000000271741234321124500205440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DOMAINFACADE_H #define DOMAINFACADE_H #include "src/technical/util.h" #include #include class Animation; class Observer; class Frontend; class Frame; class VideoEncoder; class StringIterator; class UndoRedoObserver; /** * Singleton facade for the domain level. All requests into the domain layer * has to pass through this facade. The only exception is observer requests * for display data. * * DomainFacade is implemented with lazy allocation. * *@author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class DomainFacade { public: ~DomainFacade(); /** * Static function to retrieve the factory instance object from the singleton * class. * @return the factory for sending requests into the domain. */ static DomainFacade* getFacade(); /** * Attaches a new observer to the model. The observer will be notified when * something is changed in the model. * @param o the observer to be attached to the model. */ void attach(Observer *o); /** * Detaches an observer from the model. The observer will no longer be notified * when something is changed in the model. * @param o the observer to be detached from the model. */ void detach(Observer *o); /** * Registers the GUI frontend which is used to display and update * a progress bar when running time consuming operations. * @param frontend the GUI frontend */ void registerFrontend(Frontend *frontend); /** * Retrieves the registered frontend. * @return the frontend if it is a valid frontend pointer, NULL otherwise. */ Frontend* getFrontend(); /** * Adds the frames in the vector to the animation model. * @param scene The index of the scene to add frames to. * @param frame Where in the scene to add the frames. * @param frameNames A vector containing the names of the filenames of the * images to be added as frames to the animation. */ void addFrames(int scene, int frame, StringIterator& frameNames); /** * Removes frames from a scene in the animation. * @param scene The scene from which to remove the frames. * @param frame The first frame to remove. * @param count The number of frames to remove. */ void removeFrames(int scene, int frame, int count); /** * Moves frames from one position in the animation to another. * @param fromScene The scene from which to move the frames. * @param fromFrame The first frame within that scene to move. * @param count The number of frames to move; all frames moved must be * within the same scene. * @param fromScene The scene to move the frames to. * @param toFrame The position within the scene {@a toScene} to which * the frames should be moved. */ void moveFrames(int fromScene, int fromFrame, int count, int toScene, int toFrame); /** * Duplicates the image file of the specified frame, setting the image to * the duplicate. This is used when the image is to be edited so that the * edit can be undone and so that shared images are unshared. * @param scene The index of the scene to which the frame belongs. * @param frame The index of the frame within the scene. */ void duplicateImage(int scene, int frame); /** * Returns the image file for the frame specified. * @param scene The scene to which the frame belongs. * @param frame The frame number to examine. * @return The path to the image file for this frame. Ownership is not * returned. */ const char* getImagePath(int scene, int frame); /** * Adds a sound the given frame number. An error message will be * sent to the frontend if somethings goes wrong with the adding. * @param sceneNumber The scene containing the frame to which a sound * will be added. * @param frameNumber the number of the frame to add the sound to * @param filename the path to the file with the sound * @return zero on success, less than zero on failure */ int addSound(int sceneNumber, int frameNumber, const char* filename); /** * Removes the sound with index soundNumber from the frame with index * frameNumber. * @param sceneNumber The scene containing the frame from which a sound * is to be removed. * @param frameNumber the index of the frame to remove a sound from. * @param soundNumber the index of the sound to remove from the frame. */ void removeSound(int sceneNumber, int frameNumber, int soundNumber); /** * Sets the name of the sound with index soundNumber in the frame with * index frameNumber to soundName. * @param sceneNumber The scene containing the frame containing the sound * to be renamed. * @param frameNumber the index of the frame the sound is in. * @param soundNumber the index to the sound to change the name of. * @param soundName the new name of the sound. */ void setSoundName(int sceneNumber, int frameNumber, int soundNumber, const char* soundName); /** * Returns the name of a sound attached to a frame in the active scene. * @param sceneNumber The scene containing the frame to query. * @param frameNumber The frame within the scene {@a sceneNumber}. * @param The number of the sound whose name is to be returned. * @return The sound name. Ownership is not returned. */ const char* getSoundName(int sceneNumber, int frameNumber, int soundNumber) const; /** * Returns the number of sounds attached to the frame specified. * @param scene The scene that the frame belongs to. * @param frame The frame within that scene. * @return The number of sounds attached to frame number {@a frame} of * scene number {@a scene}. */ int soundCount(int scene, int frame) const; /** * Loads the project from the {@c .dat} XML file specified. Used for * recovering from the {@c new.dat} and {@c current.dat} files. * @param datFilename The XML file to load. * @param projectFilename The name of the {@c .sto} file that this XML file * came from or was last saved into, if known. Null if this is unknown. It * does not matter if this file still exists or not; it will not be * accessed in this operation, it is simply to set the default name to save * to and main window title. * @return {@c true} if successful. */ bool loadProject(const char* datFilename, const char* projectFilename); /** * Replay commands from the log. * @param filename Filename of the log. * @return {@c true} if successful. */ bool replayCommandLog(const char* filename); /** * Opens a project. * @param filename The file to load */ void openProject(const char *filename); /** * Saves the active project to a XML-file which is written to disk. */ void saveProject(const char *filename); /** * Creates a new project. */ bool newProject(); /** * Checks if there are unsaved changes in the model. * @return true if there are unsaved changes, false otherwise. */ bool isUnsavedChanges(); /** * Retrieves the size of the model * @return the size of the model */ int getModelSize() const; /** * Function for retrieving number of frames in a given scene. * @param sceneNumber the scene number * @return number of frames */ int getSceneSize(int sceneNumber) const; /** * Function for retrieving number of scenes. * @return number of scenes */ int getNumberOfScenes() const; /** * Returns the number of sounds attached to a frame * @param scene The index of the scene containing the frame. * @param frame The index within the scene of the frame. * @return The number of sounds belonging to the specified frame. */ int getNumberOfSounds(int scene, int frame) const; /** * Retrieves the project file. * @return The project file if it has been set, NULL otherwise. */ const char* getProjectFile(); /** * Sets the preferences in the preferences file for current, * most recent, second most recent and third most recent project filenames. */ void setMostRecentProject(); /** * Undoes the last undoable operation on the model. */ void undo(); /** * Redoes the last undo operation. */ void redo(); /** * Detects if undo is possible. */ bool canUndo(); /** * Detects if redo is possible. */ bool canRedo(); /** * Clears the undo history. */ void clearHistory(); /** * Sets the observer to receive notification of when the can undo/can redo * state changes. */ void setUndoRedoObserver(UndoRedoObserver* observer); /** * Creates a new scene in the animation project. * @param index the place the new scene should be added to. */ void newScene(int index); /** * Removes the scene at the location sceneNumber from the animation. * @param sceneNumber the scene to be removed from the animation. */ void removeScene(int sceneNumber); /** * Moves the scene at position sceneNumber to the position movePosition. * @param sceneNumber the number of the scene to move. * @param movePosition the position to move the scene to. */ void moveScene(int sceneNumber, int movePosition); /** * Initializes the audio device so it is ready to play sounds. It will sends * an error message to the frontend if somethings goes wrong, and audio will * be disabled until the problem is fixed. * @return true on success, false otherwise */ bool initAudioDevice(); /** * Shutdowns the audio device so other programs can use it. */ void shutdownAudioDevice(); /** * Exports the current project to a video file as specified by the video encoder. * @param encoder the video encoder to use for export to video * @return true on success, false otherwise */ bool exportToVideo(VideoEncoder *encoder); /** * Exports the current project to a Cinerella project. * @param file the Cinerella project file * @return true on success, false otherwise */ bool exportToCinerella(const char *file); /** * Returns available grabber devices. * @return vector containing available devices. */ const std::vector getGrabberDevices(); /** * Sets up the command logger file. If unsuccessful, a message will have * been displayed to the user. */ void initializeCommandLoggerFile(); protected: /** * The constructor. It is protected so that it will be impossible for other classes, * classes that don't inherit from it to instantiate the singleton. */ DomainFacade(); private: /**The singleton instance of this class.*/ static DomainFacade *domainFacade; /**The datamodel in the program*/ Animation *animationModel; }; #endif stopmotion-0.8.0/src/domain/filenamevisitor.h000066400000000000000000000036441234321124500213450ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILENAMEVISITOR_H_ #define FILENAMEVISITOR_H_ /** * Interface for visitors that want to find out which files are referenced by a * command, frame, scene, animation or undo history. */ class FileNameVisitor { protected: virtual ~FileNameVisitor(); public: /** Called to report an image file referenced. */ virtual void visitImage(const char*) = 0; /** Called to report a sound file referenced. */ virtual void visitSound(const char*) = 0; }; #endif /* FILENAMEVISITOR_H_ */ stopmotion-0.8.0/src/domain/observernotifier.cpp000066400000000000000000000240341234321124500220630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "observernotifier.h" #include "src/presentation/observer.h" #include "src/presentation/frontends/frontend.h" #include "src/foundation/logger.h" #include class ObservableOperation { public: virtual ~ObservableOperation() { } /** * Performs the operation. */ virtual void op(AnimationImpl&) = 0; /** * Performs the update on the specified observer. */ virtual void update(Observer&) = 0; }; void ObserverNotifier::doOp(ObservableOperation& oo) { oo.op(*del); // exceptions must not escape from here, or we might lose an object that // is of importance to the undo system. for (observers_t::iterator i = observers.begin(); i != observers.end(); ++i) { try { oo.update(**i); } catch (std::exception& e) { try { if (frontend) frontend->reportError(e.what(), 0); } catch (...) { } for (observers_t::iterator i = observers.begin(); i != observers.end(); ++i) { (*i)->resync(); } } } } ObserverNotifier::~ObserverNotifier() { delete del; } ObserverNotifier::ObserverNotifier(AnimationImpl* delegate, Frontend* fe) : del(delegate), frontend(fe) { } void ObserverNotifier::addObserver(Observer* newObserver) { observers.push_back(newObserver); } void ObserverNotifier::removeObserver(Observer* o) { for (std::vector::iterator i = observers.begin(); i != observers.end(); ++i) { if (*i == o) { observers.erase(i); return; } } Logger::get().logWarning("Failed to find Observer to remove"); } class AnimationClearer : public ObservableOperation { public: AnimationClearer() { } void op(AnimationImpl& del) { del.clear(); } void update(Observer& ob) { ob.updateClear(); } }; void ObserverNotifier::clear() { AnimationClearer ac; doOp(ac); } int ObserverNotifier::sceneCount() const { return del->sceneCount(); } class SceneAdder : public ObservableOperation { int n; Scene* s; public: SceneAdder(int where, Scene* sc) : n(where), s(sc) { } void op(AnimationImpl& del) { if (s) del.addScene(n, s); else del.addScene(n); } void update(Observer& ob) { ob.updateNewScene(n); } }; void ObserverNotifier::addScene(int where, Scene* newScene) { SceneAdder sa(where, newScene); doOp(sa); } void ObserverNotifier::addScene(int where) { SceneAdder sa(where, 0); doOp(sa); } void ObserverNotifier::preallocateScenes(int count) { del->preallocateScenes(count); } class SceneRemover : public ObservableOperation { int sc; public: Scene* r; SceneRemover(int from) : sc(from), r(0) { } void op(AnimationImpl& del) { r = del.removeScene(sc); } void update(Observer& ob) { ob.updateRemoveScene(sc); } }; Scene* ObserverNotifier::removeScene(int from) { SceneRemover sr(from); doOp(sr); return sr.r; } class SceneMover : public ObservableOperation { int f; int t; public: SceneMover(int from, int to) : f(from), t(to) { } void op(AnimationImpl& del) { del.moveScene(f, t); } void update(Observer& ob) { ob.updateMoveScene(f, t); } }; void ObserverNotifier::moveScene(int from, int to) { SceneMover sm(from, to); doOp(sm); } const Scene* ObserverNotifier::getScene(int which) const { return del->getScene(which); } int ObserverNotifier::frameCount(int scene) const { return del->frameCount(scene); } class FrameAdder : public ObservableOperation { int sc; int n; const std::vector& frs; public: FrameAdder(int scene, int where, const std::vector& frames) : sc(scene), n(where), frs(frames) { } ~FrameAdder() { } void op(AnimationImpl& del) { del.addFrames(sc, n, frs); } void update(Observer& ob) { int count = frs.size(); ob.updateAdd(sc, n, count); } }; void ObserverNotifier::addFrame(int scene, int where, Frame* frame) { std::vector frs; frs.push_back(frame); FrameAdder fa(scene, where, frs); doOp(fa); } void ObserverNotifier::addFrames(int scene, int where, const std::vector& frames) { FrameAdder fa(scene, where, frames); doOp(fa); } void ObserverNotifier::preallocateFrames(int scene, int count) { del->preallocateFrames(scene, count); } class FrameRemover : public ObservableOperation { int sc; int n; Frame* r; public: FrameRemover(int scene, int where) : sc(scene), n(where), r(0) { } ~FrameRemover() { delete r; } Frame* release() { Frame* v = r; r = 0; return v; } void op(AnimationImpl& del) { del.removeFrame(sc, n); } void update(Observer& ob) { ob.updateRemove(sc, n, n); } }; Frame* ObserverNotifier::removeFrame(int scene, int frame) { FrameRemover fr(scene, frame); doOp(fr); return fr.release(); } class FramesRemover : public ObservableOperation { int sc; int fr; int c; std::vector& r; public: FramesRemover(int scene, int where, int count, std::vector& out) : sc(scene), fr(where), c(count), r(out) { } ~FramesRemover() { } void op(AnimationImpl& del) { del.removeFrames(sc, fr, c, r); } void update(Observer& ob) { ob.updateRemove(sc, fr, fr + c - 1); } }; void ObserverNotifier::removeFrames(int scene, int frame, int count, std::vector& out) { FramesRemover fr(scene, frame, count, out); doOp(fr); } class FrameMover : public ObservableOperation { int fromSc; int fromFr; int c; int toSc; int toFr; public: FrameMover(int fromScene, int fromFrame, int count, int toScene, int toFrame) : fromSc(fromScene), fromFr(fromFrame), c(count), toSc(toScene), toFr(toFrame) { } ~FrameMover() { } void op(AnimationImpl& del) { del.moveFrames(fromSc, fromFr, c, toSc, toFr); } void update(Observer& ob) { ob.updateMove(fromSc, fromFr, c, toSc, toFr); } }; void ObserverNotifier::moveFrames(int fromScene, int fromFrame, int frameCount, int toScene, int toFrame) { FrameMover fm(fromScene, fromFrame, frameCount, toScene, toFrame); doOp(fm); } class FrameReplacer : public ObservableOperation { int sc; int fr; WorkspaceFile& image; public: FrameReplacer(int scene, int where, WorkspaceFile& newImage) : sc(scene), fr(where), image(newImage) { } ~FrameReplacer() { } void op(AnimationImpl& del) { if (image.path()) del.replaceImage(sc, fr, image); } void update(Observer& ob) { ob.updateAnimationChanged(sc, fr); } }; void ObserverNotifier::replaceImage(int sceneNumber, int frameNumber, WorkspaceFile& otherImage) { FrameReplacer fr(sceneNumber, frameNumber, otherImage); doOp(fr); } int ObserverNotifier::soundCount(int scene, int frame) const { return del->soundCount(scene, frame); } class SoundChanger : public ObservableOperation { int sc; int fr; public: SoundChanger(int scene, int frame) : sc(scene), fr(frame) { } ~SoundChanger() { } void op(AnimationImpl&) { } void update(Observer& ob) { ob.updateSoundChanged(sc, fr); } int scene() const { return sc; } int frame() const { return fr; } }; class SoundAdder : public SoundChanger { int sn; Sound* s; public: SoundAdder(int scene, int frame, int soundNumber, Sound* sound) : SoundChanger(scene, frame), sn(soundNumber), s(sound) { } void op(AnimationImpl& del) { del.addSound(scene(), frame(), sn, s); } }; void ObserverNotifier::addSound(int scene, int frame, int soundNumber, Sound* sound) { SoundAdder adder(scene, frame, soundNumber, sound); doOp(adder); } class SoundNamer : public SoundChanger { int sn; const char* nm; const char* r; public: SoundNamer(int scene, int frame, int soundNumber, const char* name) : SoundChanger(scene, frame), sn(soundNumber), nm(name), r(0) { } void op(AnimationImpl& del) { r = del.setSoundName(scene(), frame(), sn, nm); } const char* returnValue() const { return r; } }; const char* ObserverNotifier::setSoundName(int scene, int frame, int soundNumber, const char* soundName) { SoundNamer sn(scene, frame, soundNumber, soundName); doOp(sn); return sn.returnValue(); } class SoundRemover : public SoundChanger { int sn; Sound* r; public: SoundRemover(int scene, int frame, int soundNumber) : SoundChanger(scene, frame), sn(soundNumber), r(0) { } void op(AnimationImpl& del) { r = del.removeSound(scene(), frame(), sn); } Sound* returnValue() const { return r; } }; Sound* ObserverNotifier::removeSound(int scene, int frame, int soundNumber) { SoundRemover sr(scene, frame, soundNumber); doOp(sr); return sr.returnValue(); } void ObserverNotifier::registerFrontend(Frontend* fe) { frontend = fe; } class AnimationResynchronizer : public ObservableOperation { public: AnimationResynchronizer() { } void op(AnimationImpl&) { } void update(Observer& ob) { ob.resync(); } }; void ObserverNotifier::resync() { AnimationResynchronizer resyncher; doOp(resyncher); } int ObserverNotifier::soundCount() const { return del->soundCount(); } void ObserverNotifier::accept(FileNameVisitor& v) const { del->accept(v); } stopmotion-0.8.0/src/domain/observernotifier.h000066400000000000000000000067511234321124500215360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OBSERVERNOTIFIER_H_ #define OBSERVERNOTIFIER_H_ #include "src/domain/animation/animationimpl.h" #include class Observer; class Frontend; class ObservableOperation; class ObserverNotifier : public AnimationImpl { AnimationImpl* del; Frontend* frontend; typedef std::vector observers_t; observers_t observers; void doOp(ObservableOperation& oo); public: ~ObserverNotifier(); /** * Constructs a wrapper for another {@ref AnimationImpl} that notifies * observers of changes and reports errors to the user. * @param delegate The wrapped {@ref AnimationImpl}. Ownership is passed. * @param frontend The UI, which is notified of errors and warnings. * Ownership is not passed. Optional. */ ObserverNotifier(AnimationImpl* delegate, Frontend* frontend); void addObserver(Observer* newObserver); void removeObserver(Observer* o); void registerFrontend(Frontend* fe); // derived from AnimationImpl void clear(); int sceneCount() const; void addScene(int where, Scene* newScene); void addScene(int where); void preallocateScenes(int count); Scene* removeScene(int from); void moveScene(int from, int to); const Scene* getScene(int which) const; int frameCount(int scene) const; void addFrame(int scene, int where, Frame* frame); void addFrames(int scene, int where, const std::vector& frames); void preallocateFrames(int scene, int count); Frame* removeFrame(int scene, int frame); void removeFrames(int scene, int frame, int count, std::vector& out); void moveFrames(int fromScene, int fromFrame, int frameCount, int toScene, int toFrame); void replaceImage(int sceneNumber, int frameNumber, WorkspaceFile& otherImage); int soundCount(int scene, int frame) const; int soundCount() const; void addSound(int scene, int frame, int soundNumber, Sound* sound); const char* setSoundName(int scene, int frame, int soundNumber, const char* soundName); Sound* removeSound(int scene, int frame, int soundNumber); void resync(); void accept(FileNameVisitor& v) const; }; #endif /* OBSERVERNOTIFIER_H_ */ stopmotion-0.8.0/src/domain/undo/000077500000000000000000000000001234321124500167325ustar00rootroot00000000000000stopmotion-0.8.0/src/domain/undo/addallcommands.cpp000066400000000000000000000072761234321124500224150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "addallcommands.h" #include "src/domain/undo/executor.h" #include "commandadd.h" #include "commandremove.h" #include "commandmove.h" #include "commandaddsound.h" #include "commandremovesound.h" #include "commandrenamesound.h" #include "commandaddscene.h" #include "commandremovescene.h" #include "commandmovescene.h" #include "commandsetimage.h" class AnimationImpl; const char* Commands::addFrames = "add-frame"; const char* Commands::removeFrames = "delete-frame"; const char* Commands::moveFrames = "move-frame"; const char* Commands::setImage = "set-image"; const char* Commands::addSound = "add-sound"; const char* Commands::removeSound = "delete-sound"; const char* Commands::renameSound = "rename-sound"; const char* Commands::addScene = "new-scene"; const char* Commands::removeScene = "delete-scene"; const char* Commands::moveScene = "move-scene"; Executor* makeAnimationCommandExecutor(AnimationImpl& model) { std::auto_ptr ex(makeExecutor()); std::auto_ptr add(new CommandAddFactory(model)); ex->addCommand(Commands::addFrames, add, true); std::auto_ptr remove(new CommandRemoveFactory(model)); ex->addCommand(Commands::removeFrames, remove, false); std::auto_ptr move(new CommandMoveFactory(model)); ex->addCommand(Commands::moveFrames, move, false); std::auto_ptr setImage(new CommandSetImageFactory(model)); ex->addCommand(Commands::setImage, setImage, false); std::auto_ptr addSound(new CommandAddSoundFactory(model)); ex->addCommand(Commands::addSound, addSound, true); std::auto_ptr removeSound(new UndoRemoveSoundFactory(model)); ex->addCommand(Commands::removeSound, removeSound, true); std::auto_ptr renameSound(new CommandRenameSoundFactory(model)); ex->addCommand(Commands::renameSound, renameSound, false); std::auto_ptr addScene(new CommandAddSceneFactory(model)); ex->addCommand(Commands::addScene, addScene, true); std::auto_ptr removeScene(new UndoRemoveSceneFactory(model)); ex->addCommand(Commands::removeScene, removeScene, false); std::auto_ptr moveScene(new CommandMoveSceneFactory(model)); ex->addCommand(Commands::moveScene, moveScene, false); return ex.release(); } stopmotion-0.8.0/src/domain/undo/addallcommands.h000066400000000000000000000037001234321124500220460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ADDALLCOMMMANDS_H_ #define ADDALLCOMMMANDS_H_ namespace Commands { extern const char* addFrames; extern const char* removeFrames; extern const char* moveFrames; extern const char* setImage; extern const char* addSound; extern const char* removeSound; extern const char* renameSound; extern const char* addScene; extern const char* removeScene; extern const char* moveScene; } class Executor; class AnimationImpl; Executor* makeAnimationCommandExecutor(AnimationImpl& model); #endif /* ADDALLCOMMMANDS_H_ */ stopmotion-0.8.0/src/domain/undo/command.cpp000066400000000000000000000137011234321124500210560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "command.h" #include "../filenamevisitor.h" #include "commandlogger.h" #include "undoredoobserver.h" #include #include #include // help out Eclipse's C++ parsing #ifndef INT32_MAX #define INT32_MAX 0x7FFFFFFF #endif /** * Command list, for example the Undo or Redo stack. */ class CommandList { typedef std::list clist; clist cs; public: /** * Construct a NullAdder on the stack to be able to use FillNull() to add * a command to the command list without the risk of an exception being * thrown. */ class NullAdder { CommandList& cl; NullAdder(const NullAdder&); NullAdder& operator=(const NullAdder&); public: NullAdder(CommandList& c) : cl(c) { cl.cs.push_front(0); } ~NullAdder() { if (!cl.cs.front()) cl.cs.pop_front(); } }; friend class NullAdder; CommandList() { } ~CommandList() { clear(); } /** * Removes all commands from the list */ void clear() { for (clist::iterator i = cs.begin(); i != cs.end(); ++i) { delete *i; } cs.clear(); } /** * Returns true if and only if the command list is empty. */ bool empty() const { return cs.empty(); } /** * Returns the command at the front of the list */ Command& front() const { return *cs.front(); } /** * Adds a command to the front of the list. */ void push(Command& c) { cs.push_front(&c); } /** * Adds a command to the back of the list. */ void add(Command& c) { cs.push_back(&c); } /** * Fills a previously-added null with c. There must be no calls to * Push, Pop, Splice or Clear in between the construction of NullAdder and * FillNull. Will not throw an exception. */ void fillNull(Command& c) { cs.front() = &c; } /** * Splices in the commands from the list newCommands into the front of * the list. This function will not throw an exception. newCommands * will be empty after this call. */ void splice(CommandList& newCommands) { cs.splice(cs.begin(), newCommands.cs); } /** * Calls v.Add(f) for each filename f referenced by the commands in the * list. */ void accept(FileNameVisitor& v) const { for (clist::const_iterator i = cs.begin(); i != cs.end(); ++i) { (*i)->accept(v); } } /** * Returns true if there is exactly one command in the list, false * otherwise */ bool singleton() const { return cs.size() == 1; } /** * Executes the command at the front (if it exists) and puts its inverse * onto the front of 'to'. * @param to The list to receive the inverse command. */ void executeFront(CommandList& to); }; void CommandList::executeFront(CommandList& to) { if (empty()) return; NullAdder na(to); Command* c = cs.front(); Command* inv = c->execute(); to.fillNull(*inv); // remove command c, which should have been deleted or recycled by // execute() cs.pop_front(); } FileNameVisitor::~FileNameVisitor() { } Command::Command() { } Command::~Command() { } void Command::accept(FileNameVisitor&) const { } class CommandNull : public Command { public: Command* execute() { // a null command is its own inverse return this; } }; Command* createNullCommand() { return new CommandNull; } CommandFactory::~CommandFactory() { } Parameters::~Parameters() { } int32_t Parameters::getHowMany() { return getInteger(1, INT32_MAX); } CommandHistory::CommandHistory() : past(0), future(0), observer(0), previousCanUndo(false), previousCanRedo(false) { past = new CommandList(); future = new CommandList(); } CommandHistory::~CommandHistory() { delete past; delete future; } bool CommandHistory::canUndo() const { return !past->empty(); } bool CommandHistory::canRedo() const { return !future->empty(); } void CommandHistory::undo() { past->executeFront(*future); notifyObserver(); } void CommandHistory::redo() { future->executeFront(*past); notifyObserver(); } void CommandHistory::execute(Command& c, CommandLogger* logger) { future->clear(); future->push(c); redo(); if (logger) { logger->commandComplete(); } notifyObserver(); } void CommandHistory::clear() { future->clear(); past->clear(); notifyObserver(); } void CommandHistory::accept(FileNameVisitor& v) const { future->accept(v); past->accept(v); } void CommandHistory::setUndoRedoObserver(UndoRedoObserver* ob) { observer = ob; } void CommandHistory::notifyObserver() { bool cu = canUndo(); if (cu != previousCanUndo) { previousCanUndo = cu; if (observer) observer->updateCanUndo(cu); } bool cr = canRedo(); if (cr != previousCanRedo) { previousCanRedo = cr; if (observer) observer->updateCanRedo(cr); } } stopmotion-0.8.0/src/domain/undo/command.h000066400000000000000000000154021234321124500205230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMAND_H_ #define COMMAND_H_ #include #include class CommandList; class FileNameVisitor; class CommandLogger; class UndoRedoObserver; /** * Base class of all command classes, objects of which are manipulated by the * undo system. Most commands should derive from CommandAtomic. */ class Command { Command(const Command&); Command& operator=(const Command&); public: Command(); virtual ~Command() = 0; /** * Performs its action, creating a NullAdder from inverseStack once only to * add its inverse to the history. For exception safety the model must not * be updated until the inverse command has been constructed and all * necessary memory preallocations have been done to enable an atomic * update of the model. * @par * This command must delete itself within the {@c execute} method, unless * it returns itself as its own inverse or otherwise recycles itself. * @return The inverse command; ownership is relinquished. */ virtual Command* execute() = 0; /** * calls v.Add(f) for each file f referenced by the command */ virtual void accept(FileNameVisitor& v) const; }; /** * A command factory reads the parameters for its command from here. They * either come from a log file (if it is being replayed) or from the * application. */ class Parameters { public: virtual ~Parameters() = 0; /** * Returns an integer. Might throw IncorrectParameterException if * unsuccessful, but this behaviour must not be relied upon. * @param min The minimum permissible value that could be returned based * on the current state of the model being altered. * @param max The maximum permissible value that could be returned based * on the current state of the model being altered. * @note @a min and @a max are used by @ref TestUndo in order to create * commands that are appropriate for testing. They are also used to assert * that the values passed to @ref Executor::Execute are within range. */ virtual int32_t getInteger(int32_t min, int32_t max) = 0; /** * Returns an integer from 1 to {@c 1^31-1}. Test code assumes that smaller * numbers are just as good a test as larger numbers, unlike * {@ref getInteger}, which assumes the full range must be tested. */ virtual int32_t getHowMany(); /** * Returns a string. If the parameters come from test code, the string will * match the pattern provided. The pattern is ignored in normal code and * may be null. * @param out The returned string. * @param pattern The pattern to which the output should conform; with a * random alphanumeric character replacing each {@c ?} and a random * (possibly zero-length) string of such characters replacing each {@c *}. * Ignored in non-test code. If null, a string of at length at least one is * produced. */ virtual void getString(std::string& out, const char* pattern) = 0; }; /** * Produces one sort of command. */ class CommandFactory { public: virtual ~CommandFactory() = 0; /** * Creates a command from the Parameters given in ps. * @param The source of parameters to use, ownership is not passed. * @return The command created, ownership is returned. @c NULL is returned * if no such command can be created at the moment (for example a delete * when the model is empty). */ virtual Command* create(Parameters& ps) = 0; }; /** * Creates a command that does nothing. This can be used whenever a command's * {@ref Command::execute} function discovers that it does nothing, and it * wants to return an inverse that also does nothing. * @return New command that does nothing. Ownership is passed. */ Command* createNullCommand(); /** * Command history for undo and redo. */ class CommandHistory { CommandList* past; CommandList* future; UndoRedoObserver* observer; bool previousCanUndo; bool previousCanRedo; void notifyObserver(); public: CommandHistory(); ~CommandHistory(); /** * Sets a new observer to be notified when the functions {@ref canUndo} and * {@ref canRedo} change what they would return. * @param observer The new observer. Any previous observer is unset. A null * pointer means that the old observer will be unset and no new observer * will be set. Ownership is not passed. */ void setUndoRedoObserver(UndoRedoObserver* observer); /** * Returns 'true' if and only if Undo will perform an action, i.e. if * there are any actions in the history to undo. */ bool canUndo() const; /** * Returns 'true' if and only if Redo will perform an action, i.e. if * there are any actions in the history to redo. */ bool canRedo() const; /** * Undoes the last action in the history, if any. */ void undo(); /** * Redoes the next action in the history, if any. */ void redo(); /** * Executes the command c, placing its inverse into the undo history, * deleting the Redo history. Any partial composite function remaining * after a thrown exception will be on the Redo stack. Ownership of * the command is passed. * @param c The command to be executed. * @param logger {@ref CommandLogger::commandComplete} will be called on * @a logger if the execution is successful. */ void execute(Command& c, CommandLogger* logger); /** * Clears all the undo history (and future) */ void clear(); /** * Calls v.add(f) for each filename f referenced by the commands in the * history. */ void accept(FileNameVisitor& v) const; }; #endif /* COMMAND_H_ */ stopmotion-0.8.0/src/domain/undo/commandadd.cpp000066400000000000000000000104501234321124500215250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandadd.h" #include "commandremove.h" #include "src/domain/animation/animationimpl.h" #include "src/domain/animation/frame.h" #include "src/domain/animation/workspacefile.h" #include #include #include CommandAdd::CommandAdd(AnimationImpl& model, int toScene, int toFrame, int count) : sv(model), scene(toScene), frame(toFrame) { frames.reserve(count); } CommandAdd::~CommandAdd() { for (std::vector::iterator i = frames.begin(); i != frames.end(); ++i) { delete *i; } } void CommandAdd::addFrame(Frame* frame) { frames.push_back(frame); } Command* CommandAdd::execute() { std::auto_ptr inverse( new CommandRemove(sv, scene, frame, frames.size())); sv.addFrames(scene, frame, frames); // ownership has been passed, so we must forget the frames frames.clear(); delete this; return inverse.release(); } void CommandAdd::accept(FileNameVisitor& v) const { for (std::vector::const_iterator i = frames.begin(); i != frames.end(); ++i) { (*i)->accept(v); } } CommandAddFactory::Parameters::Parameters(int scene, int frame, int count) : sc(scene), fr(frame), frameCount(count), twfs(0), twfCount(0), parameterCount(0) { twfs = (TemporaryWorkspaceFile*) malloc( frameCount * sizeof(TemporaryWorkspaceFile)); } CommandAddFactory::Parameters::~Parameters() { for (int i = 0; i != twfCount; ++i) { twfs[i].~TemporaryWorkspaceFile(); } free(twfs); } const char* CommandAddFactory::Parameters::addFrame(const char* filename) { assert (twfCount != frameCount); TemporaryWorkspaceFile* p = twfs + twfCount; new (p) TemporaryWorkspaceFile(filename); ++twfCount; return p->path(); } int32_t CommandAddFactory::Parameters::getInteger(int32_t, int32_t) { assert(parameterCount < 2); ++parameterCount; return parameterCount == 1? sc : fr; } int32_t CommandAddFactory::Parameters::getHowMany() { assert(parameterCount == 2); ++parameterCount; return frameCount; } void CommandAddFactory::Parameters::getString(std::string& out, const char*) { assert(3 <= parameterCount); int index = parameterCount - 3; ++parameterCount; out.assign(twfs[index].basename()); } void CommandAddFactory::Parameters::retainFiles() { for (int i = 0; i != twfCount; ++i) { twfs[i].retainFile(); } } CommandAddFactory::CommandAddFactory(AnimationImpl& model) : sv(model) { } CommandAddFactory::~CommandAddFactory() { } Command* CommandAddFactory::create(::Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int scene = ps.getInteger(0, sceneCount - 1); int frame = ps.getInteger(0, sv.frameCount(scene)); int count = ps.getHowMany(); CommandAdd* add = new CommandAdd(sv, scene, frame, count); std::string frameName; for (int i = 0; i != count; ++i) { ps.getString(frameName, "?*.jpg"); WorkspaceFile wf(frameName.c_str()); add->addFrame(new Frame(wf)); } return add; } stopmotion-0.8.0/src/domain/undo/commandadd.h000066400000000000000000000057771234321124500212120ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDADD_H #define COMMANDADD_H #include "command.h" #include class Frame; class AnimationImpl; class TemporaryWorkspaceFile; class CommandAdd : public Command { public: /** * @param count The number of frames to reserve; {@ref addFrame} can * subsequently be called this many times without throwing an exception. */ CommandAdd(AnimationImpl& model, int toScene, int toFrame, int count); ~CommandAdd(); /** * Adds a frame to the add command. * @param frame Ownership is passed. */ void addFrame(Frame* frame); Command* execute(); void accept(FileNameVisitor& v) const; private: AnimationImpl& sv; std::vector frames; int scene; int frame; }; class CommandAddFactory : public CommandFactory { AnimationImpl& sv; public: CommandAddFactory(AnimationImpl& model); ~CommandAddFactory(); Command* create(::Parameters& ps); class Parameters : public ::Parameters { int32_t sc; int32_t fr; int32_t frameCount; TemporaryWorkspaceFile* twfs; int32_t twfCount; int32_t parameterCount; public: Parameters(int scene, int frame, int count); ~Parameters(); /** * Add a frame. * @filename The filename of the image. Ownership is not passed. * @return The full path of the workspace file created. */ const char* addFrame(const char* filename); int32_t getInteger(int32_t min, int32_t max); int32_t getHowMany(); void getString(std::string& out, const char* pattern); /** * If this function is not called before destruction, copied files * held by this function are deleted. */ void retainFiles(); }; }; #endif stopmotion-0.8.0/src/domain/undo/commandaddscene.cpp000066400000000000000000000045721234321124500225530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandaddscene.h" #include "commandremovescene.h" #include "src/domain/animation/scene.h" #include "src/domain/animation/animationimpl.h" #include CommandAddScene::CommandAddScene(AnimationImpl& model, int32_t sn) : sv(model), index(sn), sc(0) { } CommandAddScene::~CommandAddScene() { delete sc; } void CommandAddScene::setScene(Scene* s) { assert(!sc); sc = s; } Command* CommandAddScene::execute() { std::auto_ptr inv(new UndoRemoveScene(sv, index)); sv.addScene(index, sc); sc = 0; delete this; return inv.release(); } CommandAddSceneFactory::CommandAddSceneFactory(AnimationImpl& model) : sv(model) { } CommandAddSceneFactory::~CommandAddSceneFactory() { } Command* CommandAddSceneFactory::create(Parameters& ps) { int32_t index = ps.getInteger(0, sv.sceneCount()); std::auto_ptr sc(new Scene()); CommandAddScene* r = new CommandAddScene(sv, index); r->setScene(sc.release()); return r; } stopmotion-0.8.0/src/domain/undo/commandaddscene.h000066400000000000000000000040751234321124500222160ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDADDSCENE_H #define COMMANDADDSCENE_H #include "command.h" class AnimationImpl; class Scene; class CommandAddScene : public Command { AnimationImpl& sv; int32_t index; Scene* sc; public: /** * @param scene Ownership is passed. */ CommandAddScene(AnimationImpl& model, int32_t sceneNumber); ~CommandAddScene(); void setScene(Scene* s); Command* execute(); }; /** * This factory can only create empty scenes. */ class CommandAddSceneFactory : public CommandFactory { AnimationImpl& sv; public: CommandAddSceneFactory(AnimationImpl& model); ~CommandAddSceneFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandaddsound.cpp000066400000000000000000000063101234321124500225760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandaddsound.h" #include "commandremovesound.h" #include "src/domain/animation/animationimpl.h" #include "src/domain/animation/sound.h" #include "src/domain/filenamevisitor.h" #include "src/technical/audio/audioformat.h" #include #include CommandAddSound::CommandAddSound(AnimationImpl& model, int32_t scene, int32_t frame, int32_t soundNumber) : sv(model), sc(scene), fr(frame), index(soundNumber), snd(0) { } CommandAddSound::~CommandAddSound() { delete snd; } void CommandAddSound::setSound(Sound* sound) { assert(!snd); snd = sound; } Command* CommandAddSound::execute() { std::auto_ptr inv(new CommandRemoveSound(sv, sc, fr, index)); sv.addSound(sc, fr, index, snd); snd = 0; delete this; return inv.release(); }; void CommandAddSound::accept(FileNameVisitor& v) const { v.visitSound(snd->getAudio()->getSoundPath()); } CommandAddSoundFactory::CommandAddSoundFactory(AnimationImpl& model) : sv(model) { } CommandAddSoundFactory::~CommandAddSoundFactory() { } Command* CommandAddSoundFactory::create(Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int32_t sc = ps.getInteger(0, sceneCount - 1); int frameCount = sv.frameCount(sc); if (frameCount == 0) return 0; int32_t fr = ps.getInteger(0, frameCount - 1); int32_t index = ps.getInteger(0, sv.soundCount(sc, fr)); std::string filename; ps.getString(filename, "?*.ogg"); std::string humanName; ps.getString(humanName, "sound ?*"); std::auto_ptr sound(new Sound()); sound->setName(humanName); std::auto_ptr r(new CommandAddSound(sv, sc, fr, index)); Sound* soundCopy = sound.get(); r->setSound(sound.release()); WorkspaceFile wf(filename.c_str()); soundCopy->open(wf); return r.release(); } stopmotion-0.8.0/src/domain/undo/commandaddsound.h000066400000000000000000000041171234321124500222460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDADDSOUND_H_ #define COMMANDADDSOUND_H_ #include "command.h" class AnimationImpl; class Frame; class Sound; class CommandAddSound : public Command { AnimationImpl& sv; int32_t sc; int32_t fr; int32_t index; Sound* snd; public: CommandAddSound(AnimationImpl& model, int32_t scene, int32_t frame, int32_t soundNumber); ~CommandAddSound(); void setSound(Sound* sound); Command* execute(); void accept(FileNameVisitor& v) const; }; class CommandAddSoundFactory : public CommandFactory { AnimationImpl& sv; public: CommandAddSoundFactory(AnimationImpl& model); ~CommandAddSoundFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandlogger.cpp000066400000000000000000000027711234321124500222630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandlogger.h" CommandLogger::~CommandLogger() { } stopmotion-0.8.0/src/domain/undo/commandlogger.h000066400000000000000000000045641234321124500217320ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDLOGGER_H_ #define COMMANDLOGGER_H_ /** * For receiving the command's string representation during calls to Make * methods. */ class CommandLogger { protected: virtual ~CommandLogger() = 0; public: /** * For receiving the serialized command. This function is allowed to * throw an exception. * @par * @ref CommandComplete needs to be called later, when the command has been * successfully executed. * @param text The text of the command to be written to the log. Should * not contain any nulls or line delimiters. */ virtual void writeCommand(const char* text) = 0; /** * Indicates that the command has been successfully executed. */ virtual void commandComplete() = 0; /** * Indicates that an undo has been successfully performed. */ virtual void undoComplete() = 0; /** * Indicates that a redo has been successfully performed. */ virtual void redoComplete() = 0; }; #endif /* COMMANDLOGGER_H_ */ stopmotion-0.8.0/src/domain/undo/commandmove.cpp000066400000000000000000000055441234321124500217530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandmove.h" #include "src/domain/animation/animationimpl.h" CommandMove::CommandMove(AnimationImpl& model, int fromScene, int fromFrame, int count, int toScene, int toFrame) : sv(model), fromSc(fromScene), fromFr(fromFrame), frameCount(count), toSc(toScene), toFr(toFrame) { } CommandMove::~CommandMove() { } template void swap(T& a, T& b) { T t(a); a = b; b = t; } Command* CommandMove::execute() { sv.moveFrames(fromSc, fromFr, frameCount, toSc, toFr); if (fromSc != toSc) { swap(fromSc, toSc); swap(fromFr, toFr); } else if (fromFr + frameCount < toFr) { int t = toFr; toFr = fromFr; fromFr = t - frameCount; } else if (toFr < fromFr) { int t = toFr; toFr = fromFr + frameCount; fromFr = t; } // else it is a command that does nothing; which is it's own inverse! return this; } CommandMoveFactory::CommandMoveFactory(AnimationImpl& model) : sv(model) { } CommandMoveFactory::~CommandMoveFactory() { } Command* CommandMoveFactory::create(Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int fs = ps.getInteger(0, sceneCount - 1); int framesInScene = sv.frameCount(fs); if (framesInScene == 0) return 0; int ff = ps.getInteger(0, framesInScene - 1); int fc = ps.getInteger(0, framesInScene - ff); int ts = ps.getInteger(0, sceneCount - 1); int tf = ps.getInteger(0, sv.frameCount(ts)); return new CommandMove(sv, fs, ff, fc, ts, tf); } stopmotion-0.8.0/src/domain/undo/commandmove.h000066400000000000000000000037731234321124500214220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDMOVE_H #define COMMANDMOVE_H #include "command.h" class AnimationImpl; class CommandMove : public Command { AnimationImpl& sv; int32_t fromSc; int32_t fromFr; int32_t frameCount; int32_t toSc; int32_t toFr; public: CommandMove(AnimationImpl& model, int fromScene, int fromFrame, int count, int toScene, int toFrame); ~CommandMove(); Command* execute(); }; class CommandMoveFactory : public CommandFactory { AnimationImpl& sv; public: CommandMoveFactory(AnimationImpl& model); ~CommandMoveFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandmovescene.cpp000066400000000000000000000044041234321124500227630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandmovescene.h" #include "src/domain/animation/animationimpl.h" CommandMoveScene::CommandMoveScene(AnimationImpl& model, int sceneNumber, int movePosition) : sv(model), from(sceneNumber), to(movePosition) { } CommandMoveScene::~CommandMoveScene() { } Command* CommandMoveScene::execute() { sv.moveScene(from, to); int32_t t = from; if (from < to) { from = to - 1; to = t; } else { from = to; to = t + 1; } return this; } CommandMoveSceneFactory::CommandMoveSceneFactory(AnimationImpl& model) : sv(model) { } CommandMoveSceneFactory::~CommandMoveSceneFactory() { } Command* CommandMoveSceneFactory::create(Parameters& ps) { int max = sv.sceneCount() - 1; if (max < 0) return 0; int32_t from = ps.getInteger(0, max); int32_t to = ps.getInteger(0, max + 1); return new CommandMoveScene(sv, from, to); } stopmotion-0.8.0/src/domain/undo/commandmovescene.h000066400000000000000000000037071234321124500224350ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDMOVESCENE_H #define COMMANDMOVESCENE_H #include "command.h" class AnimationImpl; class CommandMoveScene : public Command { AnimationImpl& sv; int32_t from; int32_t to; public: CommandMoveScene(AnimationImpl& model, int sceneNumber, int movePosition); ~CommandMoveScene(); Command* execute(); }; class CommandMoveSceneFactory : public CommandFactory { AnimationImpl& sv; public: CommandMoveSceneFactory(AnimationImpl& model); ~CommandMoveSceneFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandremove.cpp000066400000000000000000000051111234321124500222700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandremove.h" #include "commandadd.h" #include "src/domain/animation/scenevector.h" #include CommandRemove::CommandRemove(AnimationImpl& model, int scene, int fromFrame, int count) : sv(model), sc(scene), fr(fromFrame), frameCount(count) { } CommandRemove::~CommandRemove() { } Command* CommandRemove::execute() { std::auto_ptr inv(new CommandAdd(sv, sc, fr, frameCount)); std::vector removed; sv.removeFrames(sc, fr, frameCount, removed); for (std::vector::iterator i = removed.begin(); i != removed.end(); ++i) { inv->addFrame(*i); } delete this; return inv.release(); } CommandRemoveFactory::CommandRemoveFactory(AnimationImpl& model) : sv(model) { } CommandRemoveFactory::~CommandRemoveFactory() { } Command* CommandRemoveFactory::create(Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int32_t scene = ps.getInteger(0, sceneCount - 1); int frameCount = sv.frameCount(scene); if (frameCount == 0) return 0; int32_t frame = ps.getInteger(0, frameCount - 1); int32_t count = ps.getHowMany(); return new CommandRemove(sv, scene, frame, count); } stopmotion-0.8.0/src/domain/undo/commandremove.h000066400000000000000000000043511234321124500217420ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDREMOVE_H #define COMMANDREMOVE_H #include "command.h" class AnimationImpl; class CommandRemove : public Command { AnimationImpl& sv; int sc; int fr; int frameCount; public: /** * Constructs a command that removes frames from a scene. * @param model The animation to be changed. * @param scene The scene from which the frames were removed. * @param fromFrame The index of the first frame to be removed. * @param frameCount The number of frames to remove. */ CommandRemove(AnimationImpl& model, int scene, int fromFrame, int frameCount); ~CommandRemove(); Command* execute(); }; class CommandRemoveFactory : public CommandFactory { AnimationImpl& sv; public: CommandRemoveFactory(AnimationImpl& model); ~CommandRemoveFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandremovescene.cpp000066400000000000000000000043541234321124500233160ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandremovescene.h" #include "commandaddscene.h" #include "src/domain/animation/animationimpl.h" #include UndoRemoveScene::UndoRemoveScene(AnimationImpl& model, int32_t sceneNumber) : sv(model), sc(sceneNumber) { } UndoRemoveScene::~UndoRemoveScene() { } Command* UndoRemoveScene::execute() { std::auto_ptr inv(new CommandAddScene(sv, sc)); inv->setScene(sv.removeScene(sc)); delete this; return inv.release(); } UndoRemoveSceneFactory::UndoRemoveSceneFactory(AnimationImpl& model) : sv(model) { } UndoRemoveSceneFactory::~UndoRemoveSceneFactory() { } Command* UndoRemoveSceneFactory::create(Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int32_t sc = ps.getInteger(0, sceneCount - 1); return new UndoRemoveScene(sv, sc); } stopmotion-0.8.0/src/domain/undo/commandremovescene.h000066400000000000000000000036501234321124500227610ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDREMOVESCENE_H #define COMMANDREMOVESCENE_H #include "command.h" class AnimationImpl; class UndoRemoveScene : public Command { AnimationImpl& sv; int32_t sc; public: UndoRemoveScene(AnimationImpl& model, int32_t sceneNumber); ~UndoRemoveScene(); Command* execute(); }; class UndoRemoveSceneFactory : public CommandFactory { AnimationImpl& sv; public: UndoRemoveSceneFactory(AnimationImpl& model); ~UndoRemoveSceneFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandremovesound.cpp000066400000000000000000000053031234321124500233440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandremovesound.h" #include "commandaddsound.h" #include "src/domain/animation/frame.h" #include "src/domain/animation/scene.h" #include "src/domain/animation/animationimpl.h" #include CommandRemoveSound::CommandRemoveSound(AnimationImpl& model, int32_t scene, int32_t frame, int32_t soundNumber) : sv(model), sc(scene), fr(frame), index(soundNumber) { } CommandRemoveSound::~CommandRemoveSound() { } Command* CommandRemoveSound::execute() { std::auto_ptr inv( new CommandAddSound(sv, sc, fr, index)); Sound* s = sv.removeSound(sc, fr, index); inv->setSound(s); delete this; return inv.release(); } UndoRemoveSoundFactory::UndoRemoveSoundFactory(AnimationImpl& model) : sv(model) { } UndoRemoveSoundFactory::~UndoRemoveSoundFactory() { } Command* UndoRemoveSoundFactory::create(Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int32_t sc = ps.getInteger(0, sceneCount - 1); int frameCount = sv.frameCount(sc); if (frameCount == 0) return 0; int32_t fr = ps.getInteger(0, frameCount - 1); int soundCount = sv.getScene(sc)->getFrame(fr)->soundCount(); if (soundCount == 0) return 0; int32_t index = ps.getInteger(0, soundCount - 1); return new CommandRemoveSound(sv, sc, fr, index); } stopmotion-0.8.0/src/domain/undo/commandremovesound.h000066400000000000000000000037611234321124500230170ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDREMOVESOUND_H_ #define COMMANDREMOVESOUND_H_ #include "command.h" class AnimationImpl; class CommandRemoveSound : public Command { AnimationImpl& sv; int32_t sc; int32_t fr; int32_t index; public: CommandRemoveSound(AnimationImpl& model, int32_t scene, int32_t frame, int32_t soundNumber); ~CommandRemoveSound(); Command* execute(); }; class UndoRemoveSoundFactory : public CommandFactory { AnimationImpl& sv; public: UndoRemoveSoundFactory(AnimationImpl& model); ~UndoRemoveSoundFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandrenamesound.cpp000066400000000000000000000056301234321124500233210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandrenamesound.h" #include "src/domain/animation/animationimpl.h" #include "src/domain/animation/scene.h" #include #include CommandRenameSound::CommandRenameSound(AnimationImpl& model, int32_t scene, int32_t frame, int32_t soundNumber, const char* newName) : sv(model), sc(scene), fr(frame), index(soundNumber), name(newName) { } CommandRenameSound::~CommandRenameSound() { delete[] name; } void CommandRenameSound::setName(const char* newName) { int length = strlen(newName) + 1; char* nn = new char[length]; strncpy(nn, newName, length); delete[] name; name = nn; } Command* CommandRenameSound::execute() { name = sv.setSoundName(sc, fr, index, name); return this; } CommandRenameSoundFactory::CommandRenameSoundFactory(AnimationImpl& model) :sv(model) { } CommandRenameSoundFactory::~CommandRenameSoundFactory() { } Command* CommandRenameSoundFactory::create(Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int32_t sc = ps.getInteger(0, sceneCount - 1); int frameCount = sv.frameCount(sc); if (frameCount == 0) return 0; int32_t fr = ps.getInteger(0, frameCount - 1); int soundCount = sv.getScene(sc)->getFrame(fr)->soundCount(); if (soundCount == 0) return 0; int32_t index = ps.getInteger(0, soundCount - 1); std::auto_ptr r(new CommandRenameSound(sv, sc, fr, index, 0)); std::string name; ps.getString(name, "sound ?*"); r->setName(name.c_str()); return r.release(); } stopmotion-0.8.0/src/domain/undo/commandrenamesound.h000066400000000000000000000044141234321124500227650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDRENAMESOUND_H_ #define COMMANDRENAMESOUND_H_ #include "command.h" class AnimationImpl; class CommandRenameSound : public Command { AnimationImpl& sv; int32_t sc; int32_t fr; int32_t index; const char* name; public: /** * @param newName The new name. Ownership is passed; must have been * allocated with {@c new char[]}. */ CommandRenameSound(AnimationImpl& model, int32_t scene, int32_t frame, int32_t soundNumber, const char* newName); ~CommandRenameSound(); /** * Sets the name to be set. * @param newName Ownership is not passed. */ void setName(const char* newName); Command* execute(); }; class CommandRenameSoundFactory : public CommandFactory { AnimationImpl& sv; public: CommandRenameSoundFactory(AnimationImpl& model); ~CommandRenameSoundFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/commandsetimage.cpp000066400000000000000000000046631234321124500226040ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "commandsetimage.h" #include "src/domain/animation/animationimpl.h" #include "src/domain/animation/workspacefile.h" #include "src/domain/animation/scene.h" CommandSetImage::CommandSetImage(AnimationImpl& model, int32_t scene, int32_t frame, WorkspaceFile& w) : sv(model), sc(scene), fr(frame), image(w) { } CommandSetImage::~CommandSetImage() { } Command* CommandSetImage::execute() { sv.replaceImage(sc, fr, image); return this; } CommandSetImageFactory::CommandSetImageFactory(AnimationImpl& model) : sv(model) { } CommandSetImageFactory::~CommandSetImageFactory() { } Command* CommandSetImageFactory::create(Parameters& ps) { int sceneCount = sv.sceneCount(); if (sceneCount == 0) return 0; int32_t sc = ps.getInteger(0, sceneCount - 1); int frameCount = sv.frameCount(sc); if (frameCount == 0) return 0; int32_t fr = ps.getInteger(0, frameCount - 1); std::string path; ps.getString(path, "?*.jpg"); WorkspaceFile twf(path.c_str()); return new CommandSetImage(sv, sc, fr, twf); } stopmotion-0.8.0/src/domain/undo/commandsetimage.h000066400000000000000000000040721234321124500222430ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDSETIMAGE_H_ #define COMMANDSETIMAGE_H_ #include "command.h" #include "src/domain/animation/workspacefile.h" class AnimationImpl; class CommandSetImage : public Command { friend class CommandDuplicateImage; AnimationImpl& sv; int32_t sc; int32_t fr; WorkspaceFile image; public: CommandSetImage(AnimationImpl& model, int32_t scene, int32_t frame, WorkspaceFile& w); ~CommandSetImage(); Command* execute(); }; class CommandSetImageFactory : public CommandFactory { AnimationImpl& sv; public: CommandSetImageFactory(AnimationImpl& model); ~CommandSetImageFactory(); Command* create(Parameters& ps); }; #endif stopmotion-0.8.0/src/domain/undo/executor.cpp000066400000000000000000000532401234321124500213000ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "executor.h" #include "command.h" #include "random.h" #include "commandlogger.h" #include #include #include #include #include #include // help out Eclipse's C++ parsing #ifndef INT32_MAX #define INT32_MAX 0x7FFFFFFF #endif /** * Reads a space-separated list of strings and numbers. Strings are quoted, * quotes within strings can be escaped with backslashes. */ class StringReader { const char* p; const char* end; public: /** * Indicates whether the end of the input buffer has been reached. */ enum IsEof { isNotEof = 0, isEof = 1 }; /** * Indicates whether the end of a line has been reached. */ enum IsEol { isNotEol = 0, isEol = 1 }; /** * Indicates whether the parse succeeded. */ enum ParseSucceeded { parseFailed = 0, parseSucceeded = 1 }; /** * Constructs a @c StringReader without a buffer. The buffer must be set with * @c SetBuffer before use. */ StringReader() : p(0), end(0) { } /** * Constructs a @c StringReader. * @param input The null-terminated buffer to read. */ StringReader(const char* input) { p = input; end = p + strlen(input); } /** * Constructs a @c StringReader. * @param input The start of the buffer to read. * @param inputEnd The end of the buffer to read. */ StringReader(const char* input, const char* endInput) : p(input), end(endInput) { } const char* getPos() const { return p; } void setPos(const char* pos) { p = pos; } /** * Sets the buffer to be read. * @param input The start of the buffer to read. * @param inputEnd The end of the buffer to read. */ void setBuffer(const char* input, const char* endInput) { p = input; end = endInput; } /** * Sets the buffer to be read. * @param input The null-terminated string to read. */ void setBuffer(const char* input) { p = input; end = input + strlen(input); } /** * Gets the next character from the input buffer, as long as it isn't an * end-of-line character. * @param out Stores the character output, only if @c isNotEol is returned. * @return @c isNotEol on success; in this case @a out will be set. * @c isEol if we are at the end of the buffer or the next character is a * line-termination character, in which case @a out will not be set. */ IsEol getCharFromLine(char& out) { if (p == end) return isEol; if (*p == '\n' || *p == '\r') return isEol; out = *p; ++p; return isNotEol; } /** * Consume an end-of-line marker (\r, \n or \r\n), if present at the * position we are reading from. * @return @c isEof if we have reached the end of the buffer, whether or * not we consumed an end-of-line marker. @c isNotEof otherwise. */ IsEof chompEol() { if (p != end && *p == '\r') { ++p; } if (p != end && *p == '\n') { ++p; } return p == end? isEof : isNotEof; } /** * Consume whitespace. * @return @c isEof if we reached the end of the buffer, whether or not we * consumed any space. @c isNotEof otherwise. */ IsEof chompSpace() { while (p != end) { if (*p != ' ') return isNotEof; ++p; } return isEof; } /** * Consumes a quote, if present. * returns true if a quote was consumed, false otherwise. */ bool getQuote() { if (p != end && *p == '"') { ++p; return true; } return false; } /** * Tests whether we are at the end of the current line. * @return true if we are at the end of the buffer or the next character is * an end-of-line marker. */ bool isEndOfLine() { return p == end || *p == '\n' || *p == '\r'; } /** * Tests whether we are at an argument-delimiting character. * @returns true if we are at a whitespace, the end of the line or the end * of the buffer. false otherwise. */ bool isFinishedArgument() { return *p == ' ' || *p == '!' || *p == '.' || isEndOfLine(); } /** * Return the end-of-command marker, which is zero or more dots followed by * zero or one exclamation mark followed by the end of the line. * @param dotCount Number of dots read, if parseSucceeded is returned. * @param exclamation True if there was an exclamation mark and * parseSceeded is returned. * @return parseSucceeded if this is an end-of-command marker, parseFailed * if not. If parseFailed, dotCount and exclamation may be set to arbitrary * values, and the parse will be returned to how it was before the call. */ ParseSucceeded getEndOfCommand(int32_t& dotCount, bool& exclamation) { const char* old = p; dotCount = 0; exclamation = false; char c; while (isEol != getCharFromLine(c)) { if (!exclamation && c == '.') { ++dotCount; } else if (!exclamation && c == '!') { exclamation = true; } else { p = old; return parseFailed; } } return parseSucceeded; } /** * Consumes a decimal digit, if one is next in the buffer. Does not consume * non-digit characters. * @param digit The digit output, if @c parseSuceeded is returned. * @return @c parseSucceeded on success; in this case @a digit will be set. * @c parseFailed if the next character is not a digit. In this case * @a digit will not be set and no characters will have been consumed. */ ParseSucceeded getDigit(int32_t& digit) { if (p == end) return parseFailed; if (*p < '0' || '9' < *p) return parseFailed; digit = *p - '0'; ++p; return parseSucceeded; } /** * As for @a GetDigit but '8' and '9' are not considered digits and are * not consumed. */ ParseSucceeded getOctalDigit(int32_t& digit) { if (p == end) return parseFailed; if (*p < '0' || '7' < *p) return parseFailed; digit = *p - '0'; ++p; return parseSucceeded; } /** * Consume a number, possibly negative (although '+' is not consumed and * causes a parse failure). * @param @a out The parsed number; only if @c parseSucceeded is returned. * @return @c parseSucceeded if the next characters were possibly a '-', * a string of numbers then an argument delimiter. All except the * delimiter are consumed. @a out is set to the parsed number. In other * cases, no characters are consumed, @a out is not set and @c parseFailed * is returned. */ ParseSucceeded getInteger(int32_t& out) { const char *old = p; if (isEof == chompSpace()) return parseFailed; int32_t n = 0; int32_t sign = 1; if (getDigit(n) == parseFailed) { if (*p == '-') sign = -1; else return parseFailed; ++p; } int32_t soFar = n; while (getDigit(n) == parseSucceeded) { soFar = soFar * 10 + n; } if (isFinishedArgument()) { out = soFar * sign; return parseSucceeded; } p = old; return parseFailed; } /** * Gets a string. The string must be in double quotes and the final quote * must be followed by an argument delimiter. The string and its quotes are * consumed. Line terminations within the string are not permitted. * Double quotes and backslashes must be quoted with backslashes. '\r' and * '\n' must be used for carriage return and line-feed characters. \nnn can * be used for ASCII codes in octal-- these must not be followed by another * digit (if present, this should be quoted in octal as well). * @param out Returns the parsed and decoded string. * @return @c parseSuccessful on success. @a out is filled. * @c parseFailed on failure. Nothing is consumed. Some of @a out may * have been set. */ ParseSucceeded getString(std::string& out) { out.clear(); const char *old = p; chompSpace(); if (!getQuote()) { p = old; return parseFailed; } char c; while (!getQuote()) { // normal state if (getCharFromLine(c) == isEol) { p = old; return parseFailed; } if (c != '\\') { out.append(1, c); } else { // backslash state if (getCharFromLine(c) == isEol) // line continuation chompEol(); if (c == 'n') out.append(1, '\n'); else if (c == 'r') out.append(1, '\r'); else if ('0' <= c && c <= '7') { // octal int32_t soFar = c - '0'; int32_t n; while (parseSucceeded == getOctalDigit(n)) { soFar = soFar * 8 + n; } out += static_cast(soFar); } else { // Backslash followed by anything else is literally that // anything else (the backslash is never output). out += static_cast(c); } } } return parseSucceeded; } /** * Reads an identifier. * @param out Returns the parsed and decoded string. * @return @c parseSuccessful on success. @a out is filled. * @c parseFailed on failure. No non-whitespace characters will have * been consumed. */ ParseSucceeded getIdentifier(std::string& out) { out.clear(); chompSpace(); if (isEndOfLine()) return parseFailed; while (!isFinishedArgument()) { out.append(1, *p); ++p; } return parseSucceeded; } int getUndoCount() { int count = 0; for (; p != end; ++p) { switch (*p) { case '?': ++count; break; case '!': --count; break; default: return count; } } return count; } }; class StringReaderParameters : public Parameters { StringReader& reader; public: StringReaderParameters(StringReader& r) : reader(r) { } ~StringReaderParameters() { } int32_t getInteger(int32_t, int32_t) { int32_t r; if (StringReader::parseFailed == reader.getInteger(r)) throw IncorrectParameterException(); return r; } void getString(std::string& out, const char*) { if (StringReader::parseFailed == reader.getString(out)) throw IncorrectParameterException(); } }; class StringWriter { bool startOfLine; std::string buffer; public: StringWriter() : startOfLine(true) { } /** * Returns the written string. * @return The null-terminated string written to. */ const char* result() const { return buffer.c_str(); } /** * Begins a new line, reusing the same buffer. */ void reset() { startOfLine = true; buffer.clear(); } /** * Returns the number of characters that would have been written to the * buffer if it has been long enough. If it was long enough, this will be * the length of the string written into the buffer passed in SetBuffer. */ int32_t length() const { return buffer.length(); } /** * Writes a single character to the buffer. */ void writeChar(char c) { buffer.append(1, c); } /** * Writes a space to the buffer, if we are not at the start of a line. */ void beginArgument() { if (!startOfLine) { writeChar(' '); } startOfLine = false; } /** * Writes a decimal (or octal!) digit. */ void writeDigit(int32_t d) { writeChar(static_cast('0' + d)); } /** * Writes a string surrounded by double quotes. * @param s The null-terminated string to write. */ void writeString(const char* s) { beginArgument(); writeChar('"'); bool allowDigits = true; while (*s) { unsigned char c = *reinterpret_cast(s); ++s; if (strchr("\r\n\\\"", c)) { writeChar('\\'); if (c == '\r') writeChar('r'); else if (c == '\n') writeChar('n'); else writeChar(c); allowDigits = true; } else if ((32 <= c && c < '0') || ('9' < c && c < 128)) { writeChar(c); allowDigits = true; } else if (allowDigits && '0' <= c && c <= '9') { writeChar(c); } else { writeChar('\\'); bool started = false; int32_t power = 64; int32_t ci = c; while (0 < power) { int32_t digit = ci / power; digit %= 8; power /= 8; if (digit != 0) started = true; if (started || power == 1) writeDigit(digit); } allowDigits = false; } } writeChar('"'); } /** * Writes a decimal integer to the buffer. Writes negative numbers preceded * with '-' and positive numbers without prefix. */ void writeInteger(int32_t n) { beginArgument(); if (n < 0) { writeChar('-'); n = -n; } int power = 1; int nOver10 = n / 10; while (power <= nOver10) { power *= 10; } while (power) { int32_t digit = n / power; n %= power; power /= 10; writeChar('0' + digit); } } /** * Writes an identifier, which must not contain whitespace or backslashes. * @param id The null-terminated string to write. */ void writeIdentifier(const char* id) { beginArgument(); while (*id) { writeChar(*id); ++id; } } }; Executor::~Executor() { } /** * Write to the log as the parameters are read from some other Parameters. * Also checks that the values produced are within the ranges specified, * throwing a {@ref ParametersOutOfRangeException} if a value is out-of-range. */ class WriterParametersWrapper : public Parameters { Parameters& delegate; StringWriter writer; public: /** * Construct a Parametes wrapper around another Parameters. Provides the * same parameters as this delegate, but writes out the command as it goes. * @param p The delegate. * @param name The name of the command (to write to the logger). */ WriterParametersWrapper(Parameters& p, const char* name) : delegate(p) { writer.writeIdentifier(name); } ~WriterParametersWrapper() { } int32_t getInteger(int32_t min, int32_t max) { int32_t r = delegate.getInteger(min, max); if(r < min || max < r) throw ParametersOutOfRangeException(); writer.writeInteger(r); return r; } int32_t getHowMany() { int32_t r = delegate.getHowMany(); if (r < 0) throw ParametersOutOfRangeException(); writer.writeInteger(r); return r; } void getString(std::string& out, const char* pattern) { delegate.getString(out, pattern); writer.writeString(out.c_str()); } void writeCommand(CommandLogger* logger) { if (logger) logger->writeCommand(writer.result()); writer.reset(); } }; class VaListParameters : public Parameters { va_list& args; public: /** * Construct a Parameters facade over a variable argument list. * @param a The va_list, which must have had va_start called on it. * va_end should not be called after use. * @param name The name of the command being constructed (i.e. * the @a name parameter of {@ref CommandExecutor::execute}) * @param commandLogger The logger that will receive a string * representation of the command and its parameters. Ownership is * not passed. */ VaListParameters(va_list& a) : args(a) { } ~VaListParameters() { } int32_t getInteger(int32_t, int32_t) { return va_arg(args, int32_t); } void getString(std::string& out, const char*) { const char* s = va_arg(args, const char*); out.assign(s); } }; class RandomParameters : public Parameters { RandomSource& rs; public: RandomParameters(RandomSource& rng) : rs(rng) { } int32_t getInteger(int32_t min, int32_t max) { return rs.getUniform(min, max); } int32_t getHowMany() { return 1 + rs.getLogInt(60); } void getString(std::string& out, const char* pattern) { if (!pattern) pattern = "?*"; out.clear(); for (; *pattern; ++pattern) { char c = *pattern; if (c == '?') { out.append(1, rs.getCharacter()); } else if (c == '*') { rs.appendAlphanumeric(out); } else { out.append(1, c); } } } }; class ConcreteExecutor : public Executor { CommandHistory history; CommandLogger* logger; typedef std::map FactoryMap; FactoryMap factories; // does not own its factories std::vector constructiveCommands; CommandFactory* Factory(const char* name) { std::string n(name); FactoryMap::iterator found = factories.find(n); if (found == factories.end()) throw UnknownCommandException(); return found->second; } public: ConcreteExecutor() : logger(0) { } ~ConcreteExecutor() { for (FactoryMap::iterator i = factories.begin(); i != factories.end(); ++i) { delete i->second; } } void execute(const char* name, ...) { CommandFactory* f = Factory(name); va_list args; va_start(args, name); VaListParameters vpsd(args); try { WriterParametersWrapper vps(vpsd, name); Command* c = f->create(vps); if (c) { vps.writeCommand(logger); history.execute(*c, logger); } } catch(...) { // Unfortunately we can't put this in VaListParameters's destructor // because va_end must be called in the same function as va_start, // according to the standard. va_end(args); throw; } va_end(args); } void execute(const char* name, Parameters& params) { WriterParametersWrapper pw(params, name); CommandFactory* f = Factory(name); Command* c = f->create(pw); if (c) { pw.writeCommand(logger); history.execute(*c, logger); } } bool executeFromLog(const char* line) { StringReader reader; reader.setBuffer(line); std::string id; int undoCount = reader.getUndoCount(); for (; undoCount < 0; ++undoCount) history.redo(); for (; undoCount != 0; --undoCount) history.undo(); if (StringReader::parseSucceeded == reader.getIdentifier(id)) { const char* commandName = id.c_str(); CommandFactory* f = Factory(commandName); StringReaderParameters sps(reader); Command* c = f->create(sps); // It is an error if a command executed from a log is invalid. // This would mean that the log has become out-of-sync with the // model. if (!c) throw ParametersOutOfRangeException(); int32_t subcommands; bool finished; if (StringReader::parseFailed == reader.getEndOfCommand(subcommands, finished)) throw MalformedLineException(); if (finished) history.execute(*c, logger); return true; } if (StringReader::parseSucceeded == reader.isEndOfLine()) return false; throw MalformedLineException(); } void executeRandomCommands(int& commandCount, RandomSource& rng, int minCount, int maxCount) { commandCount = 0; int n = factories.size(); if (n == 0) throw UnknownCommandException(); std::vector factoryNames; for (FactoryMap::iterator i = factories.begin(); i != factories.end(); ++i) { factoryNames.push_back(i->first); } bool dontEnd = false; while (commandCount < maxCount) { int r = rng.getUniform(dontEnd || commandCount < minCount? n - 1: n); if (r == n) return; std::string& name(factoryNames[r]); RandomParameters rpsd(rng); const char* commandName = name.c_str(); WriterParametersWrapper rps(rpsd, commandName); Command* c = factories[name]->create(rps); if (c) { if (logger) rps.writeCommand(logger); history.execute(*c, logger); ++commandCount; } } } virtual void executeRandomConstructiveCommands(RandomSource& rng) { int n = constructiveCommands.size(); if (n == 0) throw UnknownCommandException(); while (true) { int r = rng.getUniform(n); if (r == n) return; std::string& name(constructiveCommands[r]); RandomParameters rpsd(rng); WriterParametersWrapper rps(rpsd, name.c_str()); Command* c = factories[name]->create(rps); if (c) { if (logger) rps.writeCommand(logger); history.execute(*c, logger); } } } void setCommandLogger(CommandLogger* log) { logger = log; } void addCommand(const char* name, std::auto_ptr factory, bool constructive) { std::string n(name); std::pair p(n, factory.get()); if (constructive) constructiveCommands.reserve(constructiveCommands.size() + 1); factories.insert(p); if (constructive) constructiveCommands.push_back(n); factory.release(); } int commandCount() const { return factories.size(); } void clearHistory() { history.clear(); } bool undo() { if (!history.canUndo()) return false; history.undo(); if (logger) logger->undoComplete(); return true; } bool redo() { if (!history.canRedo()) return false; history.redo(); if (logger) logger->redoComplete(); return true; } bool canUndo() const { return history.canUndo(); } bool canRedo() const { return history.canRedo(); } void setUndoRedoObserver(UndoRedoObserver* observer) { history.setUndoRedoObserver(observer); } }; Executor* makeExecutor() { return new ConcreteExecutor(); } const char* IncorrectParameterException::what() const throw() { return "Command log corrupt (incorrect parameter type)!"; } const char* MalformedLineException::what() const throw() { return "Command log corrupt (malformed line)!"; } const char* ParametersOutOfRangeException::what() const throw() { return "Internal error or command log corrupt:\n" "Command parameters out of range."; } const char* UnknownCommandException::what() const throw() { return "Internal error or command log corrupt:\n" "Unknown command."; } const char* CommandNameAlreadyUsedException::what() const throw() { return "Internal error: Command registered twice!"; } stopmotion-0.8.0/src/domain/undo/executor.h000066400000000000000000000174561234321124500207560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EXECUTOR_H_ #define EXECUTOR_H_ #include #include #include #include "command.h" /** * Thrown if a command factory attempts to read a parameter from the log files * that is of the wrong type, is not present or otherwise does not parse. */ class IncorrectParameterException : public std::exception { const char* what() const throw(); }; /** * Thrown if a line from the log parses correctly but has extra unexpected * characters at its end. */ class MalformedLineException : public std::exception { const char* what() const throw(); }; /** * Thrown if the parameters for a command (from the log or from a caller) are * inappropriate for the current state of the model. */ class ParametersOutOfRangeException : public std::exception { public: ParametersOutOfRangeException() { } const char* what() const throw(); }; class CommandReplayerImpl; class CommandAndDescriptionFactory; class CommandLogger; class RandomSource; /** * Thrown if @ref CommandFactory::Execute is called with a name for which no * command has been added, or if @ref CommandFactory::executeRandomCommands is * called on a @ref CommandFactory which has had no commands added, or if * @ref CommandFactory::executeRandomConstructiveCommands is called * on a @ref CommandFactory which has had no constructive commands set. */ class UnknownCommandException : public std::exception { const char* what() const throw(); }; class CommandNameAlreadyUsedException : public std::exception { const char* what() const throw(); }; class Executor { public: virtual ~Executor() = 0; /** * Executes a command, logging it and putting its inverse onto the undo * stack. Be careful that the argument list exactly matches what the * command expects; in particular, all integers should be @c int32_t. If * you supply a command factory, you should also supply a wrapper for this * Execute function to make sure this is done correctly, for example: * @code{.cpp} * void ExecuteAddFrame(Executor& e, const char* filename, int32_t sceneNo, * int32_t frameNo) { * e.Execute("addf", filename, sceneNo, frameNo); * } * @endcode * @param name The name with which the command's factory was registered. */ virtual void execute(const char* name, ...) = 0; /** * Executes a command, logging it and putting its inverse onto the undo * stack. * @param name The name with which the command's factory was registered. * @param params Supplier of the parameters to the command. */ virtual void execute(const char* name, Parameters& params) = 0; /** * Executes the command described by (the first line of) @a line, a line * from a command log previously written by a call to @ref execute. * @param line Null- or line-ending-terminated string; a line from the log. * @return true if a command was executed, false if the line was empty or * contained only undo and redo instructions. * @throws MalformedLineException if the line is neither empty nor starts * with a command name. */ virtual bool executeFromLog(const char* line) = 0; /** * Executes a random set of commands. Used for testing. * @param rng The random number generator. * @param min The minimum number of commands that should be generated. * @param max The maximum number of commands that should be generated. * @param [out] commandCount Returns the number of commands actually * executed, even if an exception is thrown. */ virtual void executeRandomCommands(int& commandCount, RandomSource& rng, int min, int max) = 0; /** * Executes a random set of commands. Used for testing for constructing * fresh models from empty models. Only commands that were added with the * @a constructive parameter of @ref addCommand set to @c true are used. * @param rng The random number generator. */ virtual void executeRandomConstructiveCommands(RandomSource& rng) = 0; /** * Make a command available for execution. It is assumed that @a name * endures for the lifetime of the Executor. Ideally name should be a * static constant, not heap allocated; for example * @code{.cpp} * executor.addCommand("addf", addFactory, true); * @endcode * @throws CommandNameAlreadyUsedException if a factory has already * been registered under @a name. * @param name The name of the command. Will need to be supplied in a * call to @ref Execute in order to use @a factory. * @param factory The factory that makes these sort of commands. * @param constructive If true is passed, test code will use this * factory to construct initial model states from empty models. Therefore * @c true should be passed whenever the command is useful in constructing * an initial state. For example, an add operation is constructive, but a * delete or a move is not. * @ref executeRandomConstructiveCommands uses only those factories * passed here with @a constructive set to @c true. */ virtual void addCommand(const char* name, std::auto_ptrfactory, bool constructive = false) = 0; /** * Sets the logger to be used to record commands executed. * @param logger The logger to be set. Ownership is not passed. * Pass NULL to get no logging. */ virtual void setCommandLogger(CommandLogger* logger) = 0; /** * Clears the undo and redo stacks. */ virtual void clearHistory() = 0; /** * Undoes the most recent command. * @return true on success, false if nothing was on the undo stack. */ virtual bool undo() = 0; /** * Redoes the most recently undone command. * @return true on success, false if nothing was on the redo stack. */ virtual bool redo() = 0; /** * Returns true if and only if there is a command waiting to be undone. */ virtual bool canUndo() const = 0; /** * Returns true if and only if there is a command waiting to be redone. */ virtual bool canRedo() const = 0; /** * The number of commands registered. * @par * Useful for determining how many randomized tests to run. */ virtual int commandCount() const = 0; /** * Sets the observer to be notified when {@ref canUndo} or {@ref canRedo} * change what they would return. * @param observer The new observer to be set. The old observer is unset. * A null pointer means no observer. Ownership is not passed. */ virtual void setUndoRedoObserver(UndoRedoObserver* observer) = 0; }; /** * Create a new executor. * @return The new {@ref Executor}; ownership is returned. */ Executor* makeExecutor(); #endif /* EXECUTOR_H_ */ stopmotion-0.8.0/src/domain/undo/filelogger.cpp000066400000000000000000000072131234321124500215600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filelogger.h" #include "commandlogger.h" #include #include #include class FileCommandLoggerImpl : public CommandLogger { enum Ending { noEnding, newline, bangNewline }; FILE* fh; std::string buffer; Ending endingRequired; void writeChar(char c) { writeBuffer(); buffer.append(1, c); writeBuffer(); } public: void close() { if (fh) { writeBuffer(); fclose(fh); } fh = 0; } void appendNewline() { switch (endingRequired) { case noEnding: break; case newline: buffer.push_back('\n'); break; case bangNewline: buffer.append("!\n"); break; } } void writeBuffer() { appendNewline(); if (!fh) { buffer.clear(); return; } while (!buffer.empty()) { ssize_t s = fwrite(buffer.c_str(), 1, buffer.length(), fh); if (s <= 0) { throw LoggerWriteFailedException(ferror(fh)); } buffer.erase(0, s); } } FileCommandLoggerImpl() : fh(0), endingRequired(noEnding) { } ~FileCommandLoggerImpl() { close(); } void setLogFile(FILE* f) { close(); fh = f; } FILE* getLogFile() const { return fh; } void writeCommand(const char* c) { writeBuffer(); buffer.append(c); endingRequired = newline; } void commandComplete() { if (endingRequired != noEnding) { endingRequired = bangNewline; buffer.append("!\n"); endingRequired = noEnding; } writeBuffer(); if (fh) fflush(fh); } void undoComplete() { writeChar('?'); } void redoComplete() { writeChar('!'); } }; FileCommandLogger::FileCommandLogger() { pImpl = new FileCommandLoggerImpl; } FileCommandLogger::~FileCommandLogger() { delete pImpl; } void FileCommandLogger::setLogFile(FILE* f) { pImpl->setLogFile(f); } FILE* FileCommandLogger::getLogFile() const { return pImpl->getLogFile(); } CommandLogger* FileCommandLogger::getLogger() { return pImpl; } const CommandLogger* FileCommandLogger::getLogger() const { return pImpl; } LoggerWriteFailedException::LoggerWriteFailedException(int error) { snprintf(msg, sizeof(msg), "Failed to write to command logger (%s)!\n" "Disaster recovery will be impossible after this point!", strerror(error)); } const char* LoggerWriteFailedException::what() const throw() { return msg; } stopmotion-0.8.0/src/domain/undo/filelogger.h000066400000000000000000000042701234321124500212250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILELOGGER_H_ #define FILELOGGER_H_ #include "command.h" #include class FileCommandLoggerImpl; class CommandReplayer; class CommandLogger; class LoggerWriteFailedException : public std::exception { char msg[400]; public: LoggerWriteFailedException(int error); const char* what() const throw(); }; /** * Logs commands to a file */ class FileCommandLogger { FileCommandLoggerImpl* pImpl; public: FileCommandLogger(); ~FileCommandLogger(); FileCommandLogger(const FileCommandLogger&); // unimplemented FileCommandLogger& operator=(const FileCommandLogger&); //unimplemented void setLogFile(FILE* fileHandle); FILE* getLogFile() const; CommandLogger* getLogger(); const CommandLogger* getLogger() const; }; #endif /* FILELOGGER_H_ */ stopmotion-0.8.0/src/domain/undo/random.cpp000066400000000000000000000075721234321124500207310ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "random.h" #include #include #include namespace { const char alphanumericCharacters[] = "04 aqBZ\"'\\\xC3\x91\xC3\xA9"; } // This is not thread safe, but could easily be made so class RandomImpl { ~RandomImpl() { if (nextChunk) nextChunk->delRef(); nextChunk = 0; } RandomImpl() : refCount(1), nextIndex(0), nextChunk(0) { } RandomImpl(const RandomImpl&); // unimplemented RandomImpl& operator=(const RandomImpl&); // unimplemented enum { chunkSize = 10 }; int chunk[chunkSize]; int refCount; int nextIndex; RandomImpl* nextChunk; public: static RandomImpl* create() { return new RandomImpl; } void addRef() { ++refCount; } void delRef() { --refCount; if (refCount == 0) delete this; } static int get(RandomImpl*& pImpl, int& index) { if (index == chunkSize) { if (!pImpl->nextChunk) { pImpl->nextChunk = create(); } RandomImpl* nc = pImpl->nextChunk; nc->addRef(); pImpl->delRef(); pImpl = nc; index = 0; } if (pImpl->nextIndex == index) { pImpl->chunk[index] = rand(); ++pImpl->nextIndex; } int val = pImpl->chunk[index]; ++index; return val; } }; RandomSource::RandomSource() : impl(RandomImpl::create()), index(0) { } RandomSource::RandomSource(const RandomSource& other) : impl(other.impl), index(other.index) { impl->addRef(); } RandomSource::~RandomSource() { impl->delRef(); } RandomSource& RandomSource::operator=(const RandomSource& other) { impl->delRef(); other.impl->addRef(); impl = other.impl; return*this; } int RandomSource::get() { return RandomImpl::get(impl, index); } int32_t RandomSource::getUniform(int32_t min, int32_t max) { int64_t r = get(); return r * (max + 1 - min) / ((int64_t) RAND_MAX + 1) + min; } int32_t RandomSource::getUniform(int32_t max) { return getUniform(0, max); } int32_t RandomSource::getLogInt(int32_t p) { assert(0 < p && p < 100); int32_t r = 0; while (getUniform(0,99) < r) { ++r; } return r; } void RandomSource::appendString(std::string& out, const char* characters, bool allowNulls) { int n = strlen(characters) + (allowNulls? 1 : 0); while (true) { int r = getUniform(n); if (n == r) return; out.append(1, characters[r]); } } void RandomSource::appendAlphanumeric(std::string& out) { appendString(out, alphanumericCharacters, false); } char RandomSource::getCharacter() { int u = getUniform(sizeof(alphanumericCharacters) - 2); return alphanumericCharacters[u]; } stopmotion-0.8.0/src/domain/undo/random.h000066400000000000000000000072401234321124500203660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef RANDOM_H_ #define RANDOM_H_ #include #include class RandomImpl; /** * A randomness source for test-case generation. */ class RandomSource { RandomImpl* impl; int index; public: RandomSource(); /** * Copies a randomness source; from now on both sources will produce the * same results, given the same calls. */ RandomSource(const RandomSource& other); /** * Copies a randomness source; from now on both sources will produce the * same results, given the same calls. */ RandomSource& operator=(const RandomSource&); /** * Destroys a randomness source. Any copies still keep functioning. */ ~RandomSource(); /** * Random integer between 0 and RAND_MAX. */ int get(); /** * Gets a random integer. The distribution is uniform between min and max * inclusive. */ int32_t getUniform(int32_t min, int32_t max); /** * Gets a random integer. The distribution is uniform between 0 and max * inclusive. */ int32_t getUniform(int32_t max); /** * Gets a random nonnegative integer. For each possible return value n, * given that the return value is at least n, the probability that it is * greater than n is @code{.cpp} p/100 @endcode. In other words, pick a * high value of {@a p} to get mostly large results, a low value to get * mostly small results. * @param 100 times the probability of incrementing the result at each * stage. Must be between 1 and 99. * @return A random number from 1 upwards. */ int32_t getLogInt(int32_t p); /** * Gets a random string from the characters in the null-terminated * string provided, appending it to {@a out}. * @param [in,out] out The random string is appended to this string. * @param [in] characters A null-terminated string of characters from * which to chose (uniformly). * @param [in] allowNulls true to allow nulls also in the string, false to * disallow. */ void appendString(std::string& out, const char* characters, bool allowNulls = false); /** * Returns a random alphanumeric character. */ char getCharacter(); /** * Gets a random string of alphanumeric characters. * @param [in,out] out The random string is appended to this string. */ void appendAlphanumeric(std::string& out); }; #endif /* RANDOM_H_ */ stopmotion-0.8.0/src/domain/undo/undoredoobserver.cpp000066400000000000000000000030021234321124500230200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "undoredoobserver.h" UndoRedoObserver::~UndoRedoObserver() { } stopmotion-0.8.0/src/domain/undo/undoredoobserver.h000066400000000000000000000032531234321124500224750ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef UNDOREDOOBSERVER_H_ #define UNDOREDOOBSERVER_H_ class UndoRedoObserver { protected: virtual ~UndoRedoObserver(); public: virtual void updateCanUndo(bool newCanUndo) = 0; virtual void updateCanRedo(bool newCanRedo) = 0; }; #endif stopmotion-0.8.0/src/foundation/000077500000000000000000000000001234321124500166645ustar00rootroot00000000000000stopmotion-0.8.0/src/foundation/logger.cpp000066400000000000000000000042121234321124500206460ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "logger.h" #include "qapplication.h" #include Logger Logger::get() { return logger; } #ifndef NO_DEBUG void Logger::logDebug(const char * msg, ...) { va_list ap; va_start(ap, msg); QString qsm; qsm.vsprintf(msg, ap); va_end(ap); QDebug qdebug(QtDebugMsg); qdebug << qsm; } #else void Logger::logDebug(const char *, ...) { } #endif void Logger::logWarning(const char * msg, ...) { va_list ap; va_start(ap, msg); QString qsm; qsm.vsprintf(msg, ap); va_end(ap); QDebug qdebug(QtWarningMsg); qdebug << qsm; } void Logger::logFatal(const char * msg, ...) { va_list ap; va_start(ap, msg); QString qsm; qsm.vsprintf(msg, ap); va_end(ap); QDebug qdebug(QtFatalMsg); qdebug << qsm; } stopmotion-0.8.0/src/foundation/logger.h000066400000000000000000000032541234321124500203200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef LOGGER_H #define LOGGER_H class Logger { public: static Logger get(); void logDebug(const char * msg, ...); void logWarning(const char * msg, ...); void logFatal(const char * msg, ...); private: static Logger logger; }; #endif stopmotion-0.8.0/src/foundation/preferencestool.cpp000066400000000000000000000176341234321124500226020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "preferencestool.h" #include #include #include #include #include using namespace std; PreferencesTool* PreferencesTool::preferencesTool = 0; PreferencesTool::PreferencesTool() : doc(0), dtd(0), rootNode(0), preferences(0), versionNode(0), preferencesFile(0), oldVersion(0) { LIBXML_TEST_VERSION; } PreferencesTool::~PreferencesTool() { cleanTree(); delete[] preferencesFile; preferencesFile = NULL; delete [] oldVersion; oldVersion = NULL; } PreferencesTool* PreferencesTool::get() { //Lazy initialization if (preferencesTool == NULL) { preferencesTool = new PreferencesTool(); } return preferencesTool; } bool PreferencesTool::setPreferencesFile( const char *filePath, const char *version ) { xmlNode *node = NULL; char* currentVersion = NULL; if (preferencesFile != NULL) { delete [] preferencesFile; preferencesFile = NULL; } if (doc != NULL) { cleanTree(); } //Deepcopies the path preferencesFile = new char[strlen(filePath)+1]; strcpy(preferencesFile, filePath); if ( fileExists(filePath) ) { //Parse the xml file as an xml tree doc = xmlReadFile(filePath, NULL, 0); if (doc == NULL) { printf("Could not parse the preferences file"); } rootNode = xmlDocGetRootElement(doc); node = rootNode->children; for (; node; node = node->next) { if (node->type == XML_ELEMENT_NODE) { if (xmlStrEqual(node->name, BAD_CAST "version")) { versionNode = node; } } } currentVersion = (char*)xmlGetProp(versionNode, BAD_CAST "version"); //There are no version in the file if (currentVersion == NULL) { cleanTree(); } else { //The version in the file is wrong if (strcmp(currentVersion, version) != 0) { oldVersion = new char[strlen(currentVersion)+1]; strcpy(oldVersion, currentVersion); cleanTree(); } xmlFree((xmlChar*)currentVersion); } } if (rootNode != NULL) { node = rootNode->children; for (; node; node = node->next) { if (node->type == XML_ELEMENT_NODE) { if (xmlStrEqual(node->name, BAD_CAST "preferences")) { preferences = node; } } } if (preferences == NULL) { printf("Error while parsing preferences file"); } return true; } //If there are no file, no version or if the version is wrong a new preferences //file are made. else { //Create the xml tree doc = xmlNewDoc(BAD_CAST "1.0"); dtd = xmlCreateIntSubset(doc, BAD_CAST "root", NULL, BAD_CAST filePath); rootNode = xmlNewNode(NULL, BAD_CAST "root"); xmlNewProp(rootNode, BAD_CAST "xml:lang", BAD_CAST "en"); xmlNewProp(rootNode, BAD_CAST "title", BAD_CAST "Preferences"); xmlDocSetRootElement(doc, rootNode); versionNode = xmlNewChild(rootNode, NULL, BAD_CAST "version", NULL); xmlNewProp(versionNode, BAD_CAST "version", BAD_CAST version); preferences = xmlNewChild(rootNode, NULL, BAD_CAST "preferences", NULL); flushPreferences(); return false; } } void PreferencesTool::setVersion(const char* version) { checkInitialized(); xmlSetProp(versionNode, BAD_CAST "version", BAD_CAST version); flushPreferences(); } const char* PreferencesTool::getOldVersion() { return oldVersion; } bool PreferencesTool::setPreference(const char* key, const char* attribute, bool flushLater ) { checkInitialized(); xmlNodePtr node = NULL; node = findNode(key); if (node == NULL) { node = xmlNewChild(preferences, NULL, BAD_CAST "pref", NULL); xmlNewProp(node, BAD_CAST "key", BAD_CAST key); xmlNewProp(node, BAD_CAST "attribute", BAD_CAST attribute); } else { xmlSetProp(node, BAD_CAST "attribute", BAD_CAST attribute); } return (!flushLater) ? flushPreferences() : true; } bool PreferencesTool::setPreference(const char * key, const int attribute, bool flushLater) { checkInitialized(); xmlNodePtr node = NULL; node = findNode(key); char tmp[11] = {0}; snprintf(tmp, 11, "%d", attribute); if (node == NULL) { node = xmlNewChild(preferences, NULL, BAD_CAST "pref", NULL); xmlNewProp(node, BAD_CAST "key", BAD_CAST key); xmlNewProp(node, BAD_CAST "attribute", BAD_CAST tmp); } else { xmlSetProp(node, BAD_CAST "attribute", BAD_CAST tmp); } return (!flushLater) ? flushPreferences() : true; } const char* PreferencesTool::getPreference(const char* key) { checkInitialized(); xmlNode *node = findNode(key); return (const char*)xmlGetProp(node, BAD_CAST "attribute"); } int PreferencesTool::getPreference(const char * key, const int defaultValue) { checkInitialized(); xmlNode *node = findNode(key); if (!node) { return defaultValue; } xmlChar *tmp = xmlGetProp(node, BAD_CAST "attribute"); int ret = atoi((char*)tmp); xmlFree(tmp); return ret; } void PreferencesTool::removePreference( const char * key ) { checkInitialized(); xmlNode *node = findNode(key); if (node != NULL) { xmlUnlinkNode(node); xmlFreeNode(node); flushPreferences(); } } bool PreferencesTool::flushPreferences() { if (xmlSaveFormatFile(preferencesFile, doc, 1) == -1) { return false; } else { return true; } } xmlNodePtr PreferencesTool::findNode(const char * key) { //Search through the preferences for the element with a key which //equals the key parameter. xmlNode *node = preferences->children; for (; node; node = node->next) { if (node->type == XML_ELEMENT_NODE) { xmlChar *prop = xmlGetProp(node, BAD_CAST "key"); int found = xmlStrEqual(prop, BAD_CAST key); xmlFree(prop); if (found) return node; } } return 0; } bool PreferencesTool::fileExists(const char * filePath) { if (access(filePath, R_OK) == -1) { return false; } return true; } void PreferencesTool::checkInitialized() { if (doc == NULL) { printf( "A preferencesfile has to be specified before " "using the PreferencesTool."); exit(1); } } void PreferencesTool::cleanTree() { xmlFreeDoc(doc); xmlCleanupParser(); doc = NULL; dtd = NULL; rootNode = NULL; preferences = NULL; } Preference::Preference(const char* key) : val(0), owns(false) { val = PreferencesTool::get()->getPreference(key); if (val) owns = true; } Preference::Preference(const char* key, const char* defaultValue) : val(0), owns(false) { val = PreferencesTool::get()->getPreference(key); if (val) { owns = true; } else { val = defaultValue; } } Preference::~Preference() { if (owns) xmlFree((xmlChar*)val); } const char* Preference::get() const { return val; } bool Preference::equals(const char* str) { if (str) { return val? 0 == strcmp(val, str) : false; } else { return !val; } } stopmotion-0.8.0/src/foundation/preferencestool.h000066400000000000000000000162571234321124500222470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PREFERENCESTOOL_H #define PREFERENCESTOOL_H #include /** * Represents one string from the preferences file. */ class Preference { const char* val; bool owns; public: /** * Retrieves the value associated with {@a key}. {@ref get} will return * this value, or {@c 0} if no such value exists. */ Preference(const char* key); /** * Retrieves the value associated with {@a key}. {@ref get} will return * this value, or {@a defaultValue} if no such value exists. * @note No copy of the string pointed to by {@a defaultValue} will be * taken; it must remain valid until any caller of {@ref get} has finished * with it. */ Preference(const char* key, const char* defaultValue); ~Preference(); /** * Retrieves the value associated with the key passed in the constructor. * If there was no such value, the pointer passed as the default value in * the contsructor is returned. Otherwise, null is returned. * @return The associated value (which becomes invalid after this object * goes out of scope), the default value (which is not a copy), or null. * Ownership is not returned. */ const char* get() const; /** * Tests the retrieved (or default) value against the argument. * @param str The string to compare against. * @return {@c true} if both {@a str} and the value is null, or if both * compare equal. {@c false} otherwise. */ bool equals(const char* str); }; /** * A xml based tool for adding, changing and removing of * various preferences. Everything is saved to a xml organized file * and can be readed by the tool for later usage. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class PreferencesTool { public: /** * Retrieves the instance of the PreferencesTool class. * @return the PreferencesTool singleton instance. */ static PreferencesTool* get(); /** * Sets the file to store preferences in. * @param filePath the path to the file where the preferences are * stored. * @param version the version of the program * @return true if file exists. false if the file doesn't exists * and the preferencesTool makes it. */ bool setPreferencesFile(const char* filePath, const char* version); /** * Sets the version of the preference file. * @param version the version number of the preference file */ void setVersion(const char *version); /** * Returns the version number of the preference file or 0 if * there are no version tag. * @return the version number of the preference file or 0 if * there are no version tag. */ const char* getOldVersion(); /** * Adds a string preference. * @param key the key for retrieving the preference. * @param attribute the attribute for the preference. * @param flushLater true if you don't want the preferencesTool to flush * the preferences to disk at once. This is given for to allow * optimalization when several preferences ar saved at the same time. * flushPreferences() should be called at once after the preferences are * set to store them to disk. * @return true if the preference was succesfully saved. If flushLater is * set to true this function will return true automaticaly. */ bool setPreference(const char* key, const char* attribute, bool flushLater = false); /** * Adds an int preference. * @param key the key for retrieving the preference. * @param attribute the attribute for the preference. * @param flushLater true if you don't want the preferencesTool to flush * the preferences to disk at once. This is given for to allow * optimalization when several preferences ar saved at the same time. * flushPreferences() should be called at once after the preferences are * set to store them to disk. * @return true if the preference was succesfully saved. If flushLater is * set to true this function will return true automaticaly. */ bool setPreference(const char* key, const int attribute, bool flushLater = false); /** * Retrieves a string preference. * @param key the key of the preference to retrieve. * @return the attribute for the given key or null if the key wasn't found. */ const char* getPreference(const char* key); /** * Retrieves an int preference. * @param key the key of the preference to retrieve. * @param defaultValue a default value for preferences which aren't set * by the user yet. * @return the attribute for the given key or "defaultValue" if the key * wasn't found. */ int getPreference(const char* key, const int defaultValue); /** * Removes the preference with the key "key". (Which, in practice, means * setting it to default). * @param key the key of the preference to remove. */ void removePreference(const char* key); /** * Flushes the preferences to the file specified with setPreferencesFile(..). * @return true if the preferences were succesfully saved. */ bool flushPreferences(); protected: /** * Protected constructor to deny external instanciation of the singleton. */ PreferencesTool(); /** * Cleans up after the preferencestool. */ ~PreferencesTool(); private: /**The singleton instance of this class.*/ static PreferencesTool *preferencesTool; xmlDocPtr doc; xmlDtdPtr dtd; xmlNodePtr rootNode; xmlNodePtr preferences; xmlNodePtr versionNode; char *preferencesFile; char *oldVersion; /** * Retrieves the node with key "key". * @param key the key of the node to retrieve. * @return the node with the given key. */ xmlNodePtr findNode(const char* key); /** * Checks if the file at filePath exists. * @return true if the file exist. */ bool fileExists(const char* filePath); /** * Checks if the preferencestool has been initialized and exits with an error * if it hasn't. */ void checkInitialized(); /** * Cleans the xml tree. */ void cleanTree(); }; #endif stopmotion-0.8.0/src/main.cpp000066400000000000000000000117261234321124500161550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "config.h" #include "src/domain/domainfacade.h" #ifdef QTGUI #include "presentation/frontends/qtfrontend/qtfrontend.h" #endif #include "presentation/frontends/nonguifrontend/nonguifrontend.h" #include "src/foundation/preferencestool.h" #include "src/domain/animation/workspacefile.h" #include #include #include #include #include #include #include #include #include #include #include class CouldNotInitializeRecoveryFiles : public std::exception { int error; char buffer[1024]; public: CouldNotInitializeRecoveryFiles(int err) : error(err) { snprintf(buffer, sizeof(buffer), "Could not initialize recovery files (%s)." " You need permission to read and write in a ~/.stopmotion" " directory.", strerror(err)); } const char* what() const throw() { return buffer; } }; class RecoveryIncompleteException : public std::exception { char buffer[1024]; public: RecoveryIncompleteException(const char* filename) { snprintf(buffer, sizeof(buffer), "Failed to recover previous project from command log file %s." " Perhaps the file is corrupt or you don't have permission" " to read it.", filename); } const char* what() const throw() { return buffer; } }; /** * Recover the project. An exception will be throw if recovery fails. */ void recover(DomainFacade *facadePtr) { struct stat st; WorkspaceFile commandLog(WorkspaceFile::commandLogFile); bool commandLogExists = 0 <= stat(commandLog.path(), &st); WorkspaceFile currentDat(WorkspaceFile::currentModelFile); if (stat(currentDat.path(), &st) < 0) { WorkspaceFile newDat(WorkspaceFile::newModelFile); if (stat(newDat.path(), &st) < 0) { if (!commandLogExists) { // None of the files are present; clear and start afresh WorkspaceFile::clear(); } } else { // Program must have crashed in the middle of saving. if (unlink(commandLog.path()) < 0 && errno != ENOENT) { throw CouldNotInitializeRecoveryFiles(errno); } commandLogExists = false; if (!facadePtr->loadProject(newDat.path(), 0)) { throw RecoveryIncompleteException(newDat.path()); } } } else { Preference projectFile("projectFile"); if (!facadePtr->loadProject(currentDat.path(), projectFile.get())) { throw RecoveryIncompleteException(currentDat.path()); } } if (commandLogExists) { facadePtr->replayCommandLog(commandLog.path()); } } int main(int argc, char **argv) { int ret = 0; DomainFacade *facadePtr = DomainFacade::getFacade(); // if program is started with --nonGUI if ( argc > 1 && strcmp(argv[1], "--nonGUI") == 0 ) { NonGUIFrontend nonGUIFrontend(facadePtr); try { recover(facadePtr); facadePtr->registerFrontend(&nonGUIFrontend); ret = nonGUIFrontend.run(argc, argv); } catch (std::exception& e) { nonGUIFrontend.reportError(e.what(), 1); delete facadePtr; facadePtr = NULL; return 1; } } else { #ifdef QTGUI QtFrontend qtFrontend(argc, argv); qtFrontend.processEvents(); try { facadePtr->registerFrontend(&qtFrontend); recover(facadePtr); qtFrontend.setUndoRedoEnabled(); facadePtr->initializeCommandLoggerFile(); if (argc > 1 && access(argv[1], R_OK) == 0) { qtFrontend.openProject(argv[1]); facadePtr->setMostRecentProject(); } } catch (std::exception& e) { qtFrontend.reportError(e.what(), 1); delete facadePtr; facadePtr = NULL; return 1; } ret = qtFrontend.run(argc, argv); #endif } delete facadePtr; facadePtr = NULL; return ret; } stopmotion-0.8.0/src/presentation/000077500000000000000000000000001234321124500172315ustar00rootroot00000000000000stopmotion-0.8.0/src/presentation/frontends/000077500000000000000000000000001234321124500212335ustar00rootroot00000000000000stopmotion-0.8.0/src/presentation/frontends/frontend.h000066400000000000000000000072311234321124500232260ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FRONTEND_H #define FRONTEND_H /** * The frontend interface to be used by the implemented frontend. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Frontend { public: enum ProgressMessage { connectingCamera, importingFramesFromDisk, exporting, restoringProject, savingScenesToDisk }; enum Question { useNewerPreferences }; virtual ~Frontend() {} /** * Abstract function for starting the application through the frontend. * @param argc the argc argument from the environment through main. * @param argv the argv arguments from the environment through main. * @return the return status on exit */ virtual int run(int argc, char **argv) = 0; /** * Abstract function for displaying progress on timeconsuming operations. * @param message Indicates the message to display to the user. * @param numOperations The number of calculated operations to do. */ virtual void showProgress(ProgressMessage message, int numOperations = 0) = 0; /** * Abstract function for hiding the progress info. */ virtual void hideProgress() = 0; /** * Abstract function for updating the progress. * @param numOperationsDone the number of operations done */ virtual void updateProgress(int numOperationsDone) = 0; /** * Abstract function for checking if the user has aborted the operation * (eg pressed cancel) * @return true if the the operation is aborted, false otherwise */ virtual bool isOperationAborted() = 0; /** * Abstract function for processing GUI events. This is useful on timeconsuming * operations which aren't running in separate processes or threads. */ virtual void processEvents() = 0; /** * Abstract function for reporting an error to the user. It has two categories * of errors; warning and critical. * @param message the error message to display to the user * @param id kind of error; 0 for warning, 1 for critical */ virtual void reportError(const char *message, int id) = 0; /** * Abstract function for asking the user a yes/no question. * @param question The question to ask * @return 0 if the user answer yes, 1 if no */ virtual int askQuestion(Question question) = 0; virtual int runExternalCommand(const char *command) = 0; }; #endif stopmotion-0.8.0/src/presentation/frontends/nonguifrontend/000077500000000000000000000000001234321124500242725ustar00rootroot00000000000000stopmotion-0.8.0/src/presentation/frontends/nonguifrontend/nonguifrontend.cpp000066400000000000000000000145071234321124500300440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "nonguifrontend.h" #include "src/technical/stringiterator.h" #include #include #include #include #include #include #include #include #include #include NonGUIFrontend::NonGUIFrontend(DomainFacade *facadePtr) : facadePtr(facadePtr) { } NonGUIFrontend::~ NonGUIFrontend() { } int NonGUIFrontend::run(int argc, char **argv) { printf("NonGUIFrontend starts running ...\n"); return parseArguments(argc, argv); } void NonGUIFrontend::showProgress(ProgressMessage message, int numOperations) { // sets the stdout to be unbuffered setvbuf(stdout, NULL, _IONBF,0); const char* infoText = "Please wait"; switch (message) { case connectingCamera: infoText = "Connecting camera"; break; case exporting: infoText = "Exporting"; break; case importingFramesFromDisk: infoText = "Importing frames from disk"; break; case restoringProject: infoText = "Restoring project"; break; case savingScenesToDisk: infoText = "Saving scenes to disk"; break; } printf("%s...", infoText); } void NonGUIFrontend::hideProgress() { printf("\nOperation finished!\n"); // sets the stdout the be buffered setvbuf (stdout, NULL , _IOFBF , 1024); } void NonGUIFrontend::updateProgress(int) { printf("."); } bool NonGUIFrontend::isOperationAborted() { return false; } void NonGUIFrontend::processEvents() { } int NonGUIFrontend::parseArguments(int argc, char **argv) { while (1) { static struct option longOptions[] = { {"nonGUI", 0, 0, 0}, {"addFrames", 1, 0, 'a'}, {"capture", 1, 0, 'c'}, {"save", 1, 0, 's'}, {"export", 0, 0, 'e'}, {0, 0, 0, 0} }; /* getopt_long stores the option index here. */ int optionIndex = 0; int c = getopt_long(argc, argv, "a:c:s:e:", longOptions, &optionIndex); /* Detect the end of the options. */ if (c == -1) { break; } switch (c) { case 0: /* If this option set a flag, do nothing else now. */ break; case 'a': //printf ("option --addFrames with argument %s\n", optarg); addFrames(optarg); break; case 'c': printf ("option --capture with argument %s\n", optarg); break; case 'e': printf ("option --export with argument %s\n", optarg); break; case 's': //printf ("option --save with argument %s\n", optarg); save(optarg); break; case '?': /* getopt_long already printed an error message. */ break; default: return 1; } } return 0; } class DirIterator : public StringIterator { std::string buffer; std::string::size_type dirLen; DIR *dp; struct dirent *ep; public: DirIterator(const char* path) : buffer(path), dirLen(0), dp(opendir(path)) { dirLen = buffer.size(); next(); } ~DirIterator() { if (dp) closedir(dp); } int count() { int c = 0; if (dp) { while (atEnd()) { ++c; next(); } rewinddir(dp); next(); } return c; } bool atEnd() const { return !dp || !ep; } const char* get() const { return &buffer[0]; } void next() { if (dp) { ep = readdir(dp); while (ep && ep->d_type != DT_REG) ep = readdir(dp); if (ep) { buffer.resize(dirLen); buffer.append(ep->d_name); buffer.c_str(); } } } }; void NonGUIFrontend::addFrames(const char *directory) { std::string dir; getAbsolutePath(dir, directory); DirIterator di(dir.c_str()); facadePtr->addFrames(0, 0, di); } void NonGUIFrontend::save(const char *directory) { // returns a absoulte path which is allocated with new[] std::string dir; getAbsolutePath(dir, directory); facadePtr->saveProject(dir.c_str()); } void NonGUIFrontend::getAbsolutePath(std::string& out, const char *path) { if (!path || path[0] == '\0') { out = "/"; return; } // isn't an absolute path if (path[0] != '/') { // make it absolute out = getenv("PWD"); out.append("/"); out.append(path); } else { out = path; } // ensure it ends in / if (out[out.size() - 1] != '/') out.append("/"); } int NonGUIFrontend::checkFiles(const char *directory) { int numSuccessFull = 0; DIR *dp = opendir(directory); if (dp) { struct dirent *ep; struct stat st; char tmp[PATH_MAX] = {0}; while ( (ep = readdir(dp)) ) { snprintf(tmp, sizeof(tmp), "%s%s", directory, ep->d_name); tmp[sizeof(tmp) - 1] = '\0'; // ensure null-terminated stat(tmp, &st); // is a regular file, not a directory if ( S_ISREG(st.st_mode) != 0) { ++numSuccessFull; } } closedir(dp); } else { fprintf (stderr, "Couldn't open directory: %s; %s\n",directory, strerror (errno)); } return numSuccessFull; } void NonGUIFrontend::reportError( const char *message, int id ) { id = id != 0 && id != 1 ? 0 : id; if (id == 0) { printf("Warning: %s\n", message); } else { printf("Critical: %s\n", message); } } int NonGUIFrontend::askQuestion(Question) { return 1; } int NonGUIFrontend::runExternalCommand(const char *) { return 1; } stopmotion-0.8.0/src/presentation/frontends/nonguifrontend/nonguifrontend.h000066400000000000000000000063301234321124500275040ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef NONGUI_H #define NONGUI_H #include "src/config.h" #include "src/presentation/frontends/frontend.h" #include "src/domain/domainfacade.h" /** * Frontend for using the program through command line options. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class NonGUIFrontend : public Frontend { public: /** * Constructs and initializes the object. * @param facadePtr pointer to the domain facade */ NonGUIFrontend(DomainFacade *facadePtr); virtual ~NonGUIFrontend(); /** * The run function for starting the application. * @param argc the argc argument from the environment through main. * @param argv the argv arguments from the environment through main. * @return the return status on exit */ int run(int argc, char **argv); void showProgress(ProgressMessage message, int numOperations); void hideProgress(); void updateProgress(int numOperationsDone); void setProgressInfo(const char *infoText); bool isOperationAborted(); /** * Function for processing events. This is useful on timeconsuming * operations which aren't running in separate processes or threads. * This function is actually not needed in this frontend. */ void processEvents(); void reportError(const char *message, int id); int askQuestion(Question question); int runExternalCommand(const char *command); private: DomainFacade *facadePtr; int parseArguments(int argc, char **argv); void addFrames(const char *directory); void save(const char *directory); /** * Sets {@a out} to be the absolute path of {@a path}, always with a * trailing backslash. * @param[out] out Receives the path returned. * @param[in] path The path to make absolute. */ void getAbsolutePath(std::string& out, const char *path); int checkFiles(const char *directory); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/000077500000000000000000000000001234321124500234175ustar00rootroot00000000000000stopmotion-0.8.0/src/presentation/frontends/qtfrontend/aboutdialog.cpp000066400000000000000000000127771234321124500264330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "aboutdialog.h" #include "licence.h" #include "graphics/stopmotion_logo.xpm" #include AboutDialog::AboutDialog(QWidget *parent) : QDialog(parent) { tabWidget = new QTabWidget; QWidget *widget = new QWidget; QVBoxLayout *layout = new QVBoxLayout; QLabel *label = new QLabel; label->setPixmap(stopmotion_logo); label->setScaledContents(true); layout->addWidget(label); layout->addWidget( new QLabel( "

" + tr("This is the Stopmotion application for creating stop motion animations.") + "

" + QString::fromUtf8( "

© 2005-2008, Bj\xc3\xb8rn Erik Nilsen and Fredrik Berg Kj\xc3\xb8lstad

"))); widget->setLayout(layout); tabWidget->addTab(widget, tr("&About") ); tabWidget->addTab( new QLabel( "

" + tr("Main developers") + "
" + QString::fromUtf8( "Bj\xc3\xb8rn Erik Nilsen <bjoern.nilsen@bjoernen.com>
" "Fredrik Berg Kj\xc3\xb8lstad <fredrikbk@hotmail.com>
") + "

" + tr("Contributors") + "
" + QString::fromUtf8( "Eric Stolten <stoltene2@gmail.com>
" "Josh Green <josh@resonance.org>
" "Jehan Pag\xc3\xa9s
" "Tim Band
" "Ying-Chun Liu (PaulLiu) <paulliu@debian.org>
" "Barak A. Pearlmutter <bap@debian.org>
" "Cyril Brulebois <kibi@debian.org>
") + "

"), tr("A&uthors")); QTextEdit *qte = new QTextEdit; qte->setHtml( "

" + tr("Translation") + "
" "George Helebrant <helb@skatekralovice.com> (" + tr("Czech") + ")
" "Gorazd Bizjak and Matej Lavreni <info@zapstudio.net> (" + tr("Slovenian") + ")
" "Guillaume B <littletux@zarb.org> (" + tr("French") + ")
" "Martin Herweg <m.herweg@gmx.de> (" + tr("German") + ")
" + QString::fromUtf8( "Jos\xc3\xa9 Jorge <jjorge@free.fr> (") + tr("Portuguese") + ")
" + QString::fromUtf8( "Manuel Qui\xc3\xb1ones <manuel.por.aca@gmail.com> (") + tr("Spanish") + ")
" "David Hjelm <dav.hjelm@spray.se> (" + tr("Swedish") + ")
" + QString::fromUtf8( "Koray L\xc3\xb6ker <loker@pardus.org.tr> (") + tr("Turkish") + ")
" "Diego Giordano <fusion_machine@tin.it> (" + tr("Italian") + ")
" "Matteo Comisso <teomatteo8.9@hotmail.it> (" + tr("Italian") + ")
" "Wei-Lun Chao <bluebat@member.fsf.org> (" + tr("Traditional Chinese") +")
" "Maysara Abdulhaq and Ahmad Gharbeia of Arab Digital Expression Foundation (" + tr("Arabic") + ")
" "Denis Fokin (" + tr("Russian") + ")
" "Yaron (sh-yaron) (" + tr("Hebrew") + ")
" "

" "

" + tr("Logo") + "
" "Gorazd Bizjak <gorazd@zapstudio.net>
" "

" + tr("Coordinating") + "
" "Herman Robak <herman@skolelinux.no>
" + QString::fromUtf8( "\xc3\x98yvind Kol\xc3\xa5s <pippin@gimp.org>

") + "

" + tr("Testing") + "
" + QString::fromUtf8( "Tore Sinding Bekkedal <toresbe@ifi.uio.no>
" "Finn Arne Johansen <faj@bzz.no>
" "Halvor Borgen <halvor.borgen@hig.no>
" "Bj\xc3\xb8rn Are Hansen <post@bahansen.net>
" "John Steinar Bild\xc3\xb8y <johnsbil@haldenfriskole.no>
" "Ole-Anders Andreassen <ole-anders.andreassen@sunndal.kommune.no>
" "

") ); qte->setReadOnly(true); qte->setBackgroundRole(backgroundRole()); tabWidget->addTab(qte, tr("&Thanks To")); QTextEdit *licenceText = new QTextEdit; licenceText->setReadOnly(true); licenceText->setPlainText(licence); tabWidget->addTab(licenceText, tr("&Licence Agreement")); QPushButton *okButton = new QPushButton(tr("OK"), this); connect(okButton, SIGNAL(clicked()), this, SLOT(close())); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(1); buttonLayout->addWidget(okButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setAttribute(Qt::WA_DeleteOnClose); setWindowTitle(tr("About")); setMinimumWidth(550); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/aboutdialog.h000066400000000000000000000032271234321124500260660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include #include class AboutDialog : public QDialog { Q_OBJECT; public: AboutDialog(QWidget *parent = 0); private: QTabWidget *tabWidget; }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/devicetab.cpp000066400000000000000000000275721234321124500260660ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/presentation/frontends/qtfrontend/devicetab.h" #include "graphics/icons/close.xpm" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/flexiblelineedit.h" #include "src/foundation/preferencestool.h" #include "src/foundation/logger.h" #include #include #include #include #include #include #include #include DeviceTab::DeviceTab(QWidget *parent) : QWidget(parent) { deviceTable = 0; addButton = 0; removeButton = 0; editButton = 0; closeChangeBoxButton = 0; deviceEdit = 0; devicePreferences = 0; deviceLabel = 0; checkTableItem = 0; informationText = 0; numAutoDetectedDevices = -1; makeGUI(); } void DeviceTab::makeGUI() { this->setFocusPolicy(Qt::ClickFocus); informationText = new QTextEdit; informationText->setReadOnly(true); informationText->setHtml( "

" + tr("Below you can set which device Stopmotion should use for grabbing images " "and displaying video.") + "

" + tr("You can select from the auto-detected devices below or add devices yourself. " "It is not recommended to use devices which is not auto-detected, but feel free to do " "it if you are an advanced user.") + "

" + tr("The selected device is recognized as $VIDEODEVICE under Video Import.") + "

"); informationText->setMinimumWidth(440); informationText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QStringList lst; lst << tr("Name") << tr("Description"); deviceTable = new QTableWidget; deviceTable->setColumnCount(2); deviceTable->setRowCount(0); deviceTable->setSelectionMode(QAbstractItemView::SingleSelection); deviceTable->setSelectionBehavior(QAbstractItemView::SelectRows); deviceTable->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum); deviceTable->setHorizontalHeaderLabels(lst); deviceTable->verticalHeader()->setVisible(false); connect(deviceTable, SIGNAL(cellClicked(int, int)), this, SLOT(activeCellChanged(int, int))); connect(deviceTable, SIGNAL(cellChanged(int, int)), this, SLOT(contentsChanged(int, int))); addButton = new QPushButton(tr("&Add")); addButton->setFocusPolicy( Qt::NoFocus ); connect(addButton, SIGNAL(clicked()), this, SLOT(addDevice())); removeButton = new QPushButton(tr("&Remove")); connect( removeButton, SIGNAL(clicked()), this, SLOT(removeDevice())); editButton = new QPushButton(tr("&Edit")); QObject::connect( editButton, SIGNAL(clicked()), this, SLOT(editDevice())); devicePreferences = new QGroupBox; devicePreferences->setTitle(tr("Video device settings")); devicePreferences->hide(); closeChangeBoxButton = new QPushButton; closeChangeBoxButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); closeChangeBoxButton->setIcon(QPixmap(closeicon)); closeChangeBoxButton->setFlat(true); connect(closeChangeBoxButton, SIGNAL(clicked()),this, SLOT(closeChangeBox())); deviceLabel = new QLabel( tr("Video Device ($VIDEODEVICE): ") ); deviceEdit = new FlexibleLineEdit; connect(deviceEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateDeviceString(const QString &))); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(informationText); QVBoxLayout *buttonLayout = new QVBoxLayout; buttonLayout->setMargin(0); buttonLayout->setSpacing(2); buttonLayout->addStretch(1); buttonLayout->addWidget(addButton); buttonLayout->addWidget(removeButton); buttonLayout->addWidget(editButton); QHBoxLayout *deviceLayout = new QHBoxLayout; deviceLayout->addWidget(deviceTable); deviceLayout->addLayout(buttonLayout); mainLayout->addLayout(deviceLayout); mainLayout->addWidget(devicePreferences); setLayout(mainLayout); QVBoxLayout *devicePrefsLayout = new QVBoxLayout; QHBoxLayout *hbLayout = new QHBoxLayout; hbLayout->setMargin(0); hbLayout->setSpacing(0); hbLayout->addStretch(1); hbLayout->addWidget(closeChangeBoxButton); devicePrefsLayout->addLayout(hbLayout); devicePrefsLayout->addWidget(deviceLabel); devicePrefsLayout->addWidget(deviceEdit); devicePreferences->setLayout(devicePrefsLayout); } void DeviceTab::initialize() { Logger::get().logDebug("Initializing video device settings"); PreferencesTool *pref = PreferencesTool::get(); std::vector devices = DomainFacade::getFacade()->getGrabberDevices(); numAutoDetectedDevices = devices.size(); deviceTable->setRowCount(numAutoDetectedDevices); // Auto-detected devices for (int i = 0; i < numAutoDetectedDevices; ++i) { QString name( devices[i].name.c_str() ); QString device( devices[i].device.c_str() ); QString desc(QString("*Autodetected* ") + devices[i].type.c_str() + "-" + tr("device") + " (" + device + ")"); QTableWidgetItem *item = new QTableWidgetItem(name); item->setFlags( item->flags() & (~Qt::ItemIsEditable) ); deviceTable->setItem(i, 0, item); item = new QTableWidgetItem(desc); item->setFlags( item->flags() & (~Qt::ItemIsEditable) ); deviceTable->setItem(i, 1, item); deviceNameStrings.push_back(name); deviceStrings.push_back(device); deviceDescriptionStrings.push_back(desc); } // Userdefined devices int active = pref->getPreference("activeVideoDevice", -1); int numUserDevices = pref->getPreference("numDevices", -1); if (numUserDevices > 0 ) { deviceTable->setRowCount( numUserDevices + numAutoDetectedDevices ); const char *prop = 0; int idx = 0; for (int i = 0; i < numUserDevices; ++i) { Preference descP(QString("deviceDescription%1").arg(i).toUtf8().constData(),""); QString desc(descP.get()); if ( !desc.startsWith("*Autodetected*") ) { Preference nameP(QString("deviceName%1").arg(i).toUtf8().constData(),""); QString name(nameP.get()); Preference deviceP(QString("device%1").arg(i).toUtf8().constData(),""); QString device(deviceP.get()); deviceTable->setItem(idx + numAutoDetectedDevices, 0, new QTableWidgetItem(name) ); deviceTable->setItem(idx++ + numAutoDetectedDevices, 1, new QTableWidgetItem(desc) ); deviceNameStrings.push_back(name); deviceStrings.push_back(device); deviceDescriptionStrings.push_back(desc); } else { if (active == i) { active = -1; } deviceTable->setRowCount( deviceTable->rowCount() - 1); } } } if (active != -1) { deviceTable->setCurrentCell(active, 0); } else if (numAutoDetectedDevices > 0) { deviceTable->setCurrentCell(numAutoDetectedDevices - 1, 0); } this->apply(); pref->flushPreferences(); } void DeviceTab::apply() { PreferencesTool *prefs = PreferencesTool::get(); // Remove old preferences int numDevices = prefs->getPreference("numDevices", -1); if (numDevices > 0) { for (int i = 0; i < numDevices; ++i) { prefs->removePreference(QString("deviceName%1").arg(i).toUtf8().constData()); prefs->removePreference(QString("deviceDescription%1").arg(i).toUtf8().constData()); prefs->removePreference(QString("device%1").arg(i).toUtf8().constData()); } } // Set new preferences numDevices = deviceTable->rowCount(); if (numDevices > 0) { prefs->setPreference("numDevices", numDevices, true); prefs->setPreference("activeVideoDevice", deviceTable->currentRow(), true); for (int i = 0; i < numDevices; ++i) { prefs->setPreference(QString("deviceName%1").arg(i).toUtf8().constData(), deviceTable->item(i, 0)->text().toUtf8().constData(), true); prefs->setPreference(QString("deviceDescription%1").arg(i).toUtf8().constData(), deviceTable->item(i, 1)->text().toUtf8().constData(), true); prefs->setPreference(QString("device%1").arg(i).toUtf8().constData(), deviceStrings[i].toUtf8().constData(), true); } } else { prefs->setPreference("numDevices", -1, true); prefs->setPreference("activeVideoDevice", -1, true); } } void DeviceTab::resizeEvent(QResizeEvent *event) { contentsChanged(0, 0); QWidget::resizeEvent(event); } void DeviceTab::contentsChanged(int, int) { deviceTable->resizeColumnsToContents(); int totalWidth = deviceTable->columnWidth(0) + deviceTable->columnWidth(1); int tableWidth = deviceTable->width() - 5; if ( totalWidth < tableWidth) { deviceTable->setColumnWidth( 1, tableWidth - deviceTable->columnWidth(0) ); } } void DeviceTab::activeCellChanged(int, int) { if ( devicePreferences->isVisible() ) { editDevice(); } } void DeviceTab::editDevice() { int selected = deviceTable->currentRow(); if (selected >= 0) { deviceEdit->setText(deviceStrings[selected]); devicePreferences->show(); // Disables editing of autodetected devices if (selected < numAutoDetectedDevices) { deviceEdit->setReadOnly(true); } else { deviceEdit->setReadOnly(false); } } } void DeviceTab::closeChangeBox() { devicePreferences->hide(); this->resize(minimumSize()); } void DeviceTab::updateDeviceString(const QString &txt) { deviceStrings[deviceTable->currentRow()] = txt; } void DeviceTab::addDevice() { int newRow = deviceTable->rowCount(); deviceTable->setRowCount(newRow + 1); deviceTable->setItem( newRow, 0, new QTableWidgetItem(QString("")) ); deviceTable->setItem( newRow, 1, new QTableWidgetItem(QString("")) ); deviceTable->setCurrentCell(newRow, 0); deviceStrings.push_back(""); deviceNameStrings.push_back(""); deviceDescriptionStrings.push_back(""); } void DeviceTab::removeDevice() { int selectedRow = deviceTable->currentRow(); if (selectedRow >= 0 && selectedRow >= numAutoDetectedDevices) { deviceStrings.erase(deviceStrings.begin() + selectedRow); deviceNameStrings.erase(deviceNameStrings.begin() + selectedRow); deviceDescriptionStrings.erase(deviceDescriptionStrings.begin() + selectedRow); deviceTable->removeRow(selectedRow); contentsChanged(0, 0); } } void DeviceTab::retranslateStrings() { informationText->setHtml( "

" + tr("Below you can set which device Stopmotion should use for grabbing images " "and displaying video.") + "

" + tr("You can select from the auto-detected devices below or add devices yourself. " "It is not recommended to use devices which is not auto-detected, but feel free to do " "it if you are an advanced user.") + "

" + tr("The selected device is recognized as $VIDEODEVICE under Video Import.") + "

"); QStringList lst; lst << tr("Name") << tr("Description"); deviceTable->setHorizontalHeaderLabels(lst); addButton->setText( tr("&Add") ); removeButton->setText( tr("&Remove") ); editButton->setText( tr("&Edit") ); devicePreferences->setTitle(tr("Video device settings")); deviceLabel->setText( tr("Video Device ($VIDEODEVICE): ") ); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/devicetab.h000066400000000000000000000050371234321124500255230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DEVICETAB_H #define DEVICETAB_H #include class QTableWidget; class QLineEdit; class QPushButton; class QLabel; class QGridLayout; class QGroupBox; class QTextEdit; class QTableWidgetItem; class DeviceTab : public QWidget { Q_OBJECT public: DeviceTab(QWidget *parent = 0); void initialize(); void apply(); void retranslateStrings(); protected: void resizeEvent(QResizeEvent *event); private slots: void contentsChanged(int row, int column); void activeCellChanged(int row, int column); void editDevice(); void closeChangeBox(); void updateDeviceString(const QString &txt); void addDevice(); void removeDevice(); private: QTableWidget *deviceTable; QPushButton *addButton; QPushButton *removeButton; QPushButton *editButton; QPushButton *closeChangeBoxButton; QLineEdit *deviceEdit; QGroupBox *devicePreferences; QLabel *deviceLabel; QTableWidgetItem *checkTableItem; QTextEdit *informationText; std::vector deviceStrings; std::vector deviceNameStrings; std::vector deviceDescriptionStrings; int numAutoDetectedDevices; void makeGUI(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/editobserver.cpp000066400000000000000000000044111234321124500266200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "editobserver.h" #include "src/domain/domainfacade.h" #include EditObserver::EditObserver(QFileSystemWatcher* watcher) : fsw(watcher) { } EditObserver::~EditObserver() { } void EditObserver::updateAdd(int, int, int) { } void EditObserver::updateRemove(int, int, int) { } void EditObserver::updateMove(int, int, int, int, int) { } void EditObserver::updateClear() { } void EditObserver::updateNewScene(int) { } void EditObserver::updateRemoveScene(int) { } void EditObserver::updateMoveScene(int, int) { } void EditObserver::updateAnimationChanged(int sceneNumber, int frameNumber) { const char *path = DomainFacade::getFacade()->getImagePath(sceneNumber, frameNumber); if (path && fsw) { fsw->addPath(path); } } void EditObserver::updateSoundChanged(int, int) { } void EditObserver::resync() { } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/editobserver.h000066400000000000000000000046021234321124500262670ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EDITOBSERVER_H_ #define EDITOBSERVER_H_ #include "src/presentation/observer.h" class QFileSystemWatcher; /** * Tells a {@c QFileSystemWatcher} when a file is replaced (indicating that * it is being edited). */ class EditObserver: public Observer { QFileSystemWatcher* fsw; EditObserver(const EditObserver&); EditObserver& operator=(const EditObserver&); public: EditObserver(QFileSystemWatcher* watcher); ~EditObserver(); void updateAdd(int scene, int index, int numFrames); void updateRemove(int scene, int fromFrame, int toFrame); void updateMove(int fromScene, int fromFrame, int count, int toScene, int toFrame); void updateClear(); void updateNewScene(int index); void updateRemoveScene(int sceneNumber); void updateMoveScene(int sceneNumber, int movePosition); void updateAnimationChanged(int sceneNumber, int frameNumber); void updateSoundChanged(int sceneNumber, int frameNumber); void resync(); }; #endif /* EDITOBSERVER_H_ */ stopmotion-0.8.0/src/presentation/frontends/qtfrontend/exporttab.cpp000066400000000000000000000336751234321124500261510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/presentation/frontends/qtfrontend/exporttab.h" #include "graphics/icons/close.xpm" #include "flexiblelineedit.h" #include "src/foundation/preferencestool.h" #include "src/foundation/logger.h" #include #include #include #include #include #include #include #include #include #include #include #include ExportTab::ExportTab(QWidget *parent) : QWidget(parent) { addButton = 0; removeButton = 0; editButton = 0; browseButton = 0; yesButton = 0; noButton = 0; closeButton = 0; encoderPrefs = 0; encoderTable = 0; startEncoder = 0; stopEncoder = 0; startEncoderLabel = 0; stopEncoderLabel = 0; defaultOutput = 0; defaultOutputLabel = 0; askForOutput = 0; infoText = 0; makeGUI(); } void ExportTab::makeGUI() { infoText = new QTextEdit; infoText->setReadOnly(true); infoText->setHtml( "

" + tr("Below you can set which program/process Stopmotion should use " "for encoding the currently active project to a video file.") + "

" + tr("You should always use $IMAGEPATH and $VIDEOFILE to represent " "the image path and the video file, respectively.") + "

" + tr("Example with mencoder (jpeg images to mpeg4 video):") + "
" + "mencoder -ovc lavc -lavcopts vcodec=msmpeg4v2:vpass=1 -mf type=jpg:fps=8 -o " "$VIDEOFILE mf://$IMAGEPATH/*.jpg"); infoText->setMinimumWidth(440); infoText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); encoderTable = new QTableWidget; encoderTable->setColumnCount(2); encoderTable->setRowCount(0); encoderTable->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum); encoderTable->setSelectionMode(QAbstractItemView::SingleSelection); encoderTable->setSelectionBehavior(QAbstractItemView::SelectRows); QStringList lst; lst << tr("Name") << tr("Description"); encoderTable->setHorizontalHeaderLabels(lst); encoderTable->verticalHeader()->setVisible(false); connect(encoderTable, SIGNAL(cellClicked(int, int)), this, SLOT(activeCellChanged(int, int))); connect(encoderTable, SIGNAL(cellChanged(int, int)), this, SLOT(contentsChanged(int, int))); addButton = new QPushButton(tr("&Add")); addButton->setFocusPolicy( Qt::NoFocus ); connect(addButton, SIGNAL(clicked()), this, SLOT(addEncoder()) ); removeButton = new QPushButton(tr("&Remove")); connect( removeButton, SIGNAL(clicked()), this, SLOT(removeEncoder()) ); editButton = new QPushButton(tr("&Edit")); QObject::connect( editButton, SIGNAL(clicked()), this, SLOT(editSettings()) ); encoderPrefs = new QGroupBox; encoderPrefs->setTitle( tr("Encoder settings") ); encoderPrefs->hide(); closeButton = new QPushButton; closeButton->setIcon(QPixmap(closeicon)); closeButton->setFlat(true); closeButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum); connect( closeButton, SIGNAL(clicked()),this, SLOT(closeSettings()) ); askForOutput = new QLabel( tr("Do you want to be asked for an output file everytime you choose to export?")); yesButton = new QRadioButton(tr("Yes")); yesButton->setChecked(true); yesButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect( yesButton, SIGNAL(clicked()), this, SLOT(setYesButtonOn()) ); noButton = new QRadioButton(tr("No")); noButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); noButton->setChecked(false); connect( noButton, SIGNAL(clicked()), this, SLOT(setNoButtonOn()) ); defaultOutputLabel = new QLabel( tr("Set default output file:")); defaultOutput = new FlexibleLineEdit; defaultOutput->setEnabled(false); connect( defaultOutput, SIGNAL(textChanged(const QString &)), this, SLOT(setDefaultOutput(const QString &)) ); browseButton = new QPushButton(tr("Browse")); browseButton->setEnabled(false); browseButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect( browseButton, SIGNAL(clicked()), this, SLOT(browseFiles()) ); startEncoderLabel = new QLabel( tr("Start encoder:") ); startEncoder = new FlexibleLineEdit; connect( startEncoder, SIGNAL(textChanged(const QString &)), this, SLOT(updateStartString(const QString &)) ); stopEncoderLabel = new QLabel( tr("Stop encoder:") ); stopEncoder = new FlexibleLineEdit; connect( stopEncoder, SIGNAL(textChanged(const QString &)), this, SLOT(updateStopString(const QString &)) ); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(infoText); QVBoxLayout *buttonLayout = new QVBoxLayout; buttonLayout->setMargin(0); buttonLayout->setSpacing(2); buttonLayout->addStretch(1); buttonLayout->addWidget(addButton); buttonLayout->addWidget(removeButton); buttonLayout->addWidget(editButton); QHBoxLayout *encoderLayout = new QHBoxLayout; encoderLayout->addWidget(encoderTable); encoderLayout->addLayout(buttonLayout); mainLayout->addLayout(encoderLayout); mainLayout->addWidget(encoderPrefs); setLayout(mainLayout); QGridLayout *encoderPrefsLayout = new QGridLayout; encoderPrefsLayout->addWidget(closeButton, 0, 2, 0); encoderPrefsLayout->addWidget(askForOutput, 0, 0, 1, 2, 0); QHBoxLayout* hbLayout = new QHBoxLayout; hbLayout->addWidget(yesButton); hbLayout->addWidget(noButton); hbLayout->addStretch(1); encoderPrefsLayout->addLayout(hbLayout, 1, 1, 0); encoderPrefsLayout->addWidget(defaultOutputLabel, 2, 0, 0); hbLayout = new QHBoxLayout; hbLayout->addWidget(defaultOutput); hbLayout->addWidget(browseButton); encoderPrefsLayout->addLayout(hbLayout, 2, 1, 1, 2, 0); encoderPrefsLayout->addWidget(startEncoderLabel, 3, 0, 0); encoderPrefsLayout->addWidget(startEncoder, 3, 1, 1, 2, 0); encoderPrefsLayout->addWidget(stopEncoderLabel, 4, 0, 0); encoderPrefsLayout->addWidget(stopEncoder, 4, 1, 1, 2, 0); encoderPrefs->setLayout(encoderPrefsLayout); } void ExportTab::initialize() { Logger::get().logDebug("Initializing encoder settings"); PreferencesTool *pref = PreferencesTool::get(); int numEncoders = pref->getPreference("numEncoders", 0); encoderTable->setRowCount(numEncoders); const char *prop = 0; for (int i = 0; i < numEncoders; ++i) { Preference name(QString("encoderName%1").arg(i).toLatin1().constData(),""); encoderTable->setItem(i, 0, new QTableWidgetItem(name.get()) ); Preference desc(QString("encoderDescription%1").arg(i).toLatin1().constData(),""); encoderTable->setItem(i, 1, new QTableWidgetItem(desc.get()) ); Preference start(QString("startEncoder%1").arg(i).toLatin1().constData(), ""); startEncoderStrings.push_back(QString(start.get())); Preference stop(QString("stopEncoder%1").arg(i).toLatin1().constData(), ""); stopEncoderStrings.push_back(QString(stop.get())); Preference output(QString("outputFile%1").arg(i).toLatin1().constData(), "" ); outputFiles.push_back( QString(output.get())); } int active = pref->getPreference("activeEncoder", -1); if (active > -1) { encoderTable->setCurrentCell(active, 0); } } void ExportTab::resizeEvent(QResizeEvent *event) { contentsChanged(0, 0); QWidget::resizeEvent(event); } void ExportTab::apply() { PreferencesTool *prefs = PreferencesTool::get(); // Remove old preferences int numEncoders = prefs->getPreference("numEncoders", -1); if (numEncoders > 0) { for (int i = 0; i < numEncoders; ++i) { prefs->removePreference(QString("encoderName%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("encoderDescription%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("startEncoder%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("stopEncoder%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("outputFile%1").arg(i).toLatin1().constData()); } } // Set new preferences numEncoders = encoderTable->rowCount(); if (numEncoders > 0) { prefs->setPreference("numEncoders", numEncoders, true); prefs->setPreference("activeEncoder", encoderTable->currentRow(), true); for (int i = 0; i < numEncoders; ++i) { prefs->setPreference(QString("encoderName%1").arg(i).toLatin1().constData(), encoderTable->item(i, 0)->text().toLatin1().constData(), true); prefs->setPreference(QString("encoderDescription%1").arg(i).toLatin1().constData(), encoderTable->item(i, 1)->text().toLatin1().constData(), true); prefs->setPreference(QString("startEncoder%1").arg(i).toLatin1().constData(), startEncoderStrings[i].toLatin1().constData(), true); prefs->setPreference(QString("stopEncoder%1").arg(i).toLatin1().constData(), stopEncoderStrings[i].toLatin1().constData(), true); prefs->setPreference(QString("outputFile%1").arg(i).toLatin1().constData(), outputFiles[i].toLatin1().constData(), true); } } else { prefs->setPreference("numEncoders", -1, true); prefs->setPreference("activeEncoder", -1, true); } } void ExportTab::addEncoder() { int newRow = encoderTable->rowCount(); encoderTable->setRowCount(newRow + 1); encoderTable->setItem(newRow, 0, new QTableWidgetItem(QString(""))); encoderTable->setItem(newRow, 1, new QTableWidgetItem(QString(""))); encoderTable->setCurrentCell(newRow, 0); startEncoderStrings.push_back(""); stopEncoderStrings.push_back(""); outputFiles.push_back(""); } void ExportTab::removeEncoder() { int selectedRow = encoderTable->currentRow(); if (selectedRow >= 0) { startEncoderStrings.erase(startEncoderStrings.begin() + selectedRow); stopEncoderStrings.erase(stopEncoderStrings.begin() + selectedRow); outputFiles.erase(outputFiles.begin() + selectedRow); encoderTable->removeRow(selectedRow); contentsChanged(0, 0); } } void ExportTab::contentsChanged(int, int) { encoderTable->resizeColumnsToContents(); int totalWidth = encoderTable->columnWidth(0) + encoderTable->columnWidth(1); int tableWidth = encoderTable->width() - 5; if ( totalWidth < tableWidth) { encoderTable->setColumnWidth( 1, tableWidth - encoderTable->columnWidth(0) ); } } void ExportTab::activeCellChanged(int, int) { if ( encoderPrefs->isVisible() ) { editSettings(); } } void ExportTab::editSettings() { int selected = encoderTable->currentRow(); if (selected >= 0) { startEncoder->setText(startEncoderStrings[selected]); stopEncoder->setText(stopEncoderStrings[selected]); if ( outputFiles[selected] == "" ) { setYesButtonOn(); } else { setNoButtonOn(); } encoderPrefs->show(); } } void ExportTab::closeSettings( ) { encoderPrefs->hide(); this->resize(minimumSize()); } void ExportTab::updateStartString(const QString &txt) { startEncoderStrings[encoderTable->currentRow()] = txt; } void ExportTab::updateStopString(const QString &txt) { stopEncoderStrings[encoderTable->currentRow()] = txt; } void ExportTab::setDefaultOutput(const QString &txt) { outputFiles[encoderTable->currentRow()] = txt; } void ExportTab::setYesButtonOn() { yesButton->setChecked(true); noButton->setChecked(false); defaultOutput->setText(""); defaultOutput->setEnabled(false); browseButton->setEnabled(false); outputFiles[encoderTable->currentRow()] = ""; } void ExportTab::setNoButtonOn() { noButton->setChecked(true); yesButton->setChecked(false); defaultOutput->setEnabled(true); browseButton->setEnabled(true); defaultOutput->setText(outputFiles[encoderTable->currentRow()]); } void ExportTab::browseFiles() { QString file = QFileDialog::getSaveFileName(this, tr("Choose output file"), getenv("PWD")); if ( !file.isEmpty() ) { outputFiles[encoderTable->currentRow()] = file; defaultOutput->setText(file); } } void ExportTab::retranslateStrings() { infoText->setHtml( "

" + tr("Below you can set which program/process Stopmotion should use " "for encoding the currently active project to a video file.") + "

" + tr("You should always use $IMAGEPATH and $VIDEOFILE to represent " "the image path and the video file, respectively.") + "

" + tr("Example with mencoder (jpeg images to mpeg4 video):") + "
" + "mencoder -ovc lavc -lavcopts vcodec=msmpeg4v2:vpass=1 -mf type=jpg:fps=8 -o " "$VIDEOFILE mf://$IMAGEPATH/*.jpg"); QStringList lst; lst << tr("Name") << tr("Description"); encoderTable->setHorizontalHeaderLabels(lst); addButton->setText( tr("&Add") ); removeButton->setText( tr("&Remove") ); editButton->setText( tr("&Edit") ); askForOutput->setText( tr("Do you want to be asked for an output file everytime you choose to export?")); yesButton->setText(tr("Yes")); noButton->setText(tr("No")); defaultOutputLabel->setText( tr("Set default output file:")); browseButton->setText(tr("Browse")); startEncoderLabel->setText(tr("Start encoder:")); stopEncoderLabel->setText(tr("Stop encoder:")); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/exporttab.h000066400000000000000000000062211234321124500256010ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef EXPORTTAB_H #define EXPORTTAB_H #include #include class QPushButton; class QGroupBox; class QTableWidget; class QLineEdit; class QLabel; class QGridLayout; class QTextEdit; class QToolBox; class QRadioButton; /** * The export tab in the preferences menu * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ExportTab : public QWidget { Q_OBJECT public: /** * Sets up the tab. * @param parent the parent of the this widget */ ExportTab(QWidget *parent = 0); /** * Applies the settings in the import tab. */ void apply(); /** * Initializes the table and fills it with starting values. */ void initialize(); void retranslateStrings(); protected: void resizeEvent(QResizeEvent *event); private slots: void addEncoder(); void removeEncoder(); void contentsChanged(int row, int column); void activeCellChanged(int row, int column); void editSettings(); void closeSettings(); void updateStartString(const QString &txt); void updateStopString(const QString &txt); void setDefaultOutput(const QString &txt); void setYesButtonOn(); void setNoButtonOn(); void browseFiles(); private: std::vectorstartEncoderStrings; std::vectorstopEncoderStrings; std::vectoroutputFiles; QPushButton *addButton; QPushButton *removeButton; QPushButton *editButton; QPushButton *browseButton; QPushButton *closeButton; QRadioButton *yesButton; QRadioButton *noButton; QGroupBox *encoderPrefs; QTableWidget *encoderTable; QLineEdit *startEncoder; QLineEdit *stopEncoder; QLabel *startEncoderLabel; QLabel *stopEncoderLabel; QLineEdit *defaultOutput; QLabel *defaultOutputLabel; QLabel *askForOutput; QTextEdit *infoText; void makeGUI(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/flexiblelineedit.cpp000066400000000000000000000036171234321124500274420ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "flexiblelineedit.h" #include FlexibleLineEdit::FlexibleLineEdit(QWidget *parent) : QLineEdit(parent) { } void FlexibleLineEdit::keyPressEvent( QKeyEvent * k ) { switch ( k->key() ) { case Qt::Key_Return: case Qt::Key_Enter: { emit returnPressed(); break; } case Qt::Key_Escape: { emit lineEditCanceled(); k->ignore(); break; } default: { QLineEdit::keyPressEvent(k); k->ignore(); break; } } } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/flexiblelineedit.h000066400000000000000000000041161234321124500271020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FLEXIBLELINEEDIT_H #define FLEXIBLELINEEDIT_H #include #include /** * An extended line edit class. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FlexibleLineEdit : public QLineEdit { Q_OBJECT public: /** * Constructs and initializes the line edit object. * @param parent the parent widget */ FlexibleLineEdit(QWidget *parent = 0); /** * Checks what kind of key event the user has requested and * does actions based on this. * @param k the key event */ void keyPressEvent( QKeyEvent * k ); signals: /** * Emitted if editing was canceled. */ void lineEditCanceled(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/flexiblespinbox.cpp000066400000000000000000000043561234321124500273300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/presentation/frontends/qtfrontend/flexiblespinbox.h" #include FlexibleSpinBox::FlexibleSpinBox(QWidget *parent) : QSpinBox(parent) { } void FlexibleSpinBox::setMaximumValue(int maxValue) { this->setMaximum(maxValue); if (maxValue > 0) { setEnabled(true); } else { setEnabled(false); } } void FlexibleSpinBox::keyPressEvent( QKeyEvent * k ) { switch ( k->key() ) { case Qt::Key_Return: case Qt::Key_Enter: { emit spinBoxTriggered(this->value()-1); break; } case Qt::Key_Escape: { emit spinBoxCanceled(); break; } default: { QSpinBox::keyPressEvent(k); break; } } } void FlexibleSpinBox::showEvent(QShowEvent *) { this->setFocus(); this->selectAll(); } void FlexibleSpinBox::setIndexSecond(int, int index) { setValue(index + 1); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/flexiblespinbox.h000066400000000000000000000051711234321124500267710ustar00rootroot00000000000000 /*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FLEXIBLESPINBOX_H #define FLEXIBLESPINBOX_H #include class QKeyEvent; /** * An extended spin box class. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FlexibleSpinBox : public QSpinBox { Q_OBJECT public: /** * Constructs and initializes the object. * @param parent the parent widget */ FlexibleSpinBox(QWidget *parent = 0); /** * Checks what kind of key event the user has requested and * does actions based on this. * @param k the key event */ void keyPressEvent( QKeyEvent * k ); public slots: /** * Sets a limit for the maximum value. This is based on the * the thumbnails displayed in the framebar. * @param maxValue maximum value (index of the last frame in framebar) */ void setMaximumValue(int maxValue); /** * Sets the value to one more than @a index. */ void setIndexSecond(int, int index); signals: /** * Emits this signal when pressing enter. * @param frameNumber the choosen frame number in this spinbox */ void spinBoxTriggered(int frameNumber); /** * Emits this signal when getting an escape event (Key_Escape). */ void spinBoxCanceled(); protected: void showEvent(QShowEvent * event); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/000077500000000000000000000000001234321124500251765ustar00rootroot00000000000000stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/filenamesfromurlsiterator.cpp000066400000000000000000000042631234321124500332160ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "filenamesfromurlsiterator.h" #include #include void FileNamesFromUrlsIterator::set() { if (!atEnd()) { QString file = b->toLocalFile(); buffer.assign(file.toLocal8Bit()); buffer.c_str(); } } FileNamesFromUrlsIterator::FileNamesFromUrlsIterator( QList::Iterator begin, QList::Iterator end) : b(begin), e(end) { set(); } FileNamesFromUrlsIterator::~FileNamesFromUrlsIterator() { } int FileNamesFromUrlsIterator::count() { int c = 0; for (QList::Iterator i(b); i != e; ++i) { ++c; } return c; } bool FileNamesFromUrlsIterator::atEnd() const { return b == e; } const char* FileNamesFromUrlsIterator::get() const { return &buffer[0]; } void FileNamesFromUrlsIterator::next() { ++b; set(); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/filenamesfromurlsiterator.h000066400000000000000000000036621234321124500326650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILENAMESFROMURLSITERATOR_H_ #define FILENAMESFROMURLSITERATOR_H_ #include "src/technical/stringiterator.h" #include class QUrl; class FileNamesFromUrlsIterator : public StringIterator { QList::Iterator b; QList::Iterator e; std::string buffer; void set(); public: FileNamesFromUrlsIterator(QList::Iterator begin, QList::Iterator end); ~FileNamesFromUrlsIterator(); int count(); bool atEnd() const; const char* get() const; void next(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/framebar.cpp000066400000000000000000000612361234321124500274710ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/presentation/frontends/qtfrontend/framebar/framebar.h" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/framebar/framethumbview.h" #include "src/presentation/frontends/qtfrontend/framebar/scenethumbview.h" #include "src/presentation/frontends/qtfrontend/framebar/scenearrowbutton.h" #include "framepreferencesmenu.h" #include #include #include #include #include #include #include #include #include #include #include #include static QImage tryReadImage(const char *filename) { if (!filename) { qWarning() << "Couldn't read image: Invalid file name"; return QImage(); } QImageReader imageReader(QString::fromLocal8Bit(filename)); const QImage image = imageReader.read(); if (!image.isNull()) return image; if (imageReader.error() != QImageReader::UnsupportedFormatError && imageReader.error() != QImageReader::InvalidDataError) { qWarning() << "Couldn't read image:" << imageReader.errorString(); return image; } // At this point we most likely failed to read the image because the suffix // of the file was different from the actual image format. // Loop through all the supported formats and see if we can find a match. const QList supportedImageFormats = QImageReader::supportedImageFormats(); for (int i = 0; i < supportedImageFormats.size(); ++i) { QImageReader anotherImageReader(filename); anotherImageReader.setFormat(supportedImageFormats.at(i)); const QImage anotherImage = anotherImageReader.read(); if (!anotherImage.isNull()) return anotherImage; } qWarning() << "Couldn't read image:" << imageReader.errorString(); return image; } FrameBar::FrameBar(QWidget *parent) : QScrollArea(parent) { preferencesMenu = 0; activeFrame = -1; activeScene = -1; activeSceneSize = 0; movingScene = 0; openingScene = false; selecting = false; selectionFrame = -1; scrollDirection = 0; lowerScrollAreaX = this->x() + FRAME_WIDTH; upperScrollAreaX = this->width() - FRAME_WIDTH; lowerAccelScrollAreaX = lowerScrollAreaX - (FRAME_WIDTH >> 1); upperAccelScrollAreaX = upperScrollAreaX + (FRAME_WIDTH >> 1); minScrollAreaX = lowerScrollAreaX - FRAME_WIDTH + 20; maxScrollAreaX = upperScrollAreaX + FRAME_WIDTH - 20; minScrollAreaY = this->y() + 20; maxScrollAreaY = this->y() + FRAME_HEIGHT - 20; scrollTimer = new QTimer(this); connect(scrollTimer, SIGNAL(timeout()), this, SLOT(scroll())); scrollBar = horizontalScrollBar(); mainWidget = new QWidget; mainWidget->setMinimumHeight(FRAME_HEIGHT); mainWidget->setMaximumHeight(FRAME_HEIGHT); mainWidget->setMinimumWidth(FRAME_WIDTH); mainWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); setWidget(mainWidget); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); setMaximumHeight(FRAME_HEIGHT + horizontalScrollBar()->height() - 5); setMinimumHeight(FRAME_HEIGHT + horizontalScrollBar()->height() - 5); setBackgroundRole(QPalette::Dark); setAcceptDrops(true); Logger::get().logDebug("FrameBar is attatched to the model"); DomainFacade::getFacade()->attach(this); } FrameBar::~FrameBar() { } void FrameBar::updateAdd(int scene, int index, int numFrames) { if (scene == activeScene) { Logger::get().logDebug("Adding in framebar"); addFrames(index, numFrames); emit modelSizeChanged(DomainFacade::getFacade()->getModelSize()); } updateNewActiveFrame(scene, index + numFrames - 1); setSelection(index); doScroll(); } void FrameBar::updateRemove(int scene, int fromFrame, int toFrame) { if (scene == activeScene) { Logger::get().logDebug("Receiving notification about the removal of a frame in the model"); removeFrames(fromFrame, toFrame); emit modelSizeChanged(DomainFacade::getFacade()->getModelSize()); } updateNewActiveFrame(scene, fromFrame - 1); } void FrameBar::updateMove(int fromScene, int fromFrame, int count, int toScene, int toFrame) { if (toScene == activeScene) { if (fromScene == activeScene) { changeSelectionHighlight(fromFrame + count - 1, fromFrame); Logger::get().logDebug("Moving in framebar"); moveFrames(fromFrame, fromFrame + count - 1, toFrame); if (fromFrame < toFrame) toFrame -= count; } else { changeSelectionHighlight(-1, -1); Logger::get().logDebug("Moving to framebar"); addFrames(toFrame, count); } } else { Logger::get().logDebug("Moving to a different scene"); setActiveScene(toScene); } Logger::get().logDebug("Setting new active frame in FrameBar"); setActiveFrameAndSelection(toFrame + count - 1, toFrame); doScroll(); doActiveFrameNotifications(); } void FrameBar::updateSoundChanged(int sceneNumber, int frameNumber) { if (activeSceneSize <= frameNumber) { resync(); } else { getFrameThumb(frameNumber, true); } setActiveScene(sceneNumber); setActiveFrameAndSelection(frameNumber, frameNumber); showPreferencesMenu(); } void FrameBar::fixPreferencesMenu() { if ( preferencesMenu->isVisible() ) { if (activeFrame >= 0) { showPreferencesMenu(); } else { preferencesMenu->close(); } } } void FrameBar::doActiveFrameNotifications() { fixPreferencesMenu(); // For writing the frame number in the frame number display emit newActiveFrame( QString(tr("Frame number: ")) + QString("%1").arg(activeFrame + 1) ); emit newActiveFrame(activeScene, activeFrame); } void FrameBar::updateNewActiveScene(int sceneNumber) { setActiveScene(sceneNumber); setActiveFrame(activeSceneSize - 1); doActiveFrameNotifications(); } void FrameBar::updateNewActiveFrame(int sceneNumber, int frameNumber) { setActiveScene(sceneNumber); setActiveFrame(frameNumber); doActiveFrameNotifications(); } void FrameBar::clear() { int size = thumbViews.size(); for (int i = 0; i < size; ++i) { thumbViews[i]->delRef(); } thumbViews.clear(); activeSceneSize = 0; } void FrameBar::updateClear() { clear(); activeFrame = -1; activeScene = -1; emit newActiveFrame(activeScene, activeFrame); } void FrameBar::updateAnimationChanged(int sceneNumber, int frameNumber) { if (sceneNumber != activeScene) return; if (activeSceneSize <= frameNumber) resync(); const char *path = DomainFacade::getFacade()->getImagePath(sceneNumber, frameNumber); if (!path) return; QImage scaled = tryReadImage(path).scaled(FRAME_WIDTH, FRAME_HEIGHT); ThumbView* thumb = getFrameThumb(frameNumber); thumb->setPixmap(QPixmap::fromImage(scaled)); thumb->update(); } void FrameBar::fileChanged(const QString& path) { DomainFacade* facade = DomainFacade::getFacade(); int sceneCount = facade->getNumberOfScenes(); if (activeScene < 0 || sceneCount <= activeScene) return; int sceneSize = facade->getSceneSize(activeScene); const char* pathStr = path.toLocal8Bit(); for (int i = 0; i != sceneSize; ++i) { const char* ip = facade->getImagePath(activeScene, i); // This is a bit slow because we have to search through // the /home/tim/.stopmotion/ bit of the path each time. if (strcmp(pathStr, ip) == 0) { ThumbView* thumb = getFrameThumb(i, false); setThumbImage(thumb, pathStr); } } } void FrameBar::fixSize() { mainWidget->resize((FRAME_WIDTH + SPACE) * thumbViews.size() - SPACE, FRAME_HEIGHT); } void FrameBar::resync() { clear(); DomainFacade* facade = DomainFacade::getFacade(); int sceneCount = facade->getNumberOfScenes(); int scene = 0 <= activeScene && activeScene < sceneCount? activeScene : -1; activeScene = -1; int sceneSize = 0 <= scene? facade->getSceneSize(scene) : 0; std::vector::size_type thumbCount = sceneCount + sceneSize; thumbViews.insert(thumbViews.begin(), thumbCount, 0); activeScene = scene; activeSceneSize = sceneSize; if (scene != activeScene || scene < 0 || sceneSize <= activeFrame) { activeFrame = -1; selectionFrame = -1; } for (int i = 0; i != sceneCount; ++i) { getSceneThumb(i, true); } for (int i = 0; i != activeSceneSize; ++i) { getFrameThumb(i, true); } emit newActiveFrame(activeScene, activeFrame); fixSize(); } void FrameBar::insertFrames(int index, int numFrames) { if (index <= activeFrame) activeFrame += numFrames; if (index <= selectionFrame) selectionFrame += numFrames; std::vector::iterator pos = thumbViews.begin() + (index + activeScene + 1); thumbViews.insert(pos, static_cast::size_type>(numFrames), 0); activeSceneSize += numFrames; // fix all frames after the insertion point for (int i = index; i != activeSceneSize; ++i) { getFrameThumb(i, true); } int sceneCount = sceneThumbCount(); for (int i = activeScene + 1; i != sceneCount; ++i) { getSceneThumb(i, true); } } void FrameBar::addFrames(int index, int numFrames) { //TODO as we're no longer allowing cancelling during this operation, we // should implement caching and lazy loading so that this isn't a problem. Logger::get().logDebug("Adding frames in framebar"); if (activeSceneSize < index) { resync(); return; } insertFrames(index, numFrames); fixSize(); } void FrameBar::deleteFrames(int fromFrame, int frameCount) { std::vector::iterator start = thumbViews.begin() + fromFrame + activeScene + 1; std::vector::iterator end = start + frameCount; for (std::vector::iterator i = start; i != end; ++i) { (*i)->delRef(); (*i) = 0; } thumbViews.erase(start, end); activeSceneSize -= frameCount; // fix the selection (we want the thumbnails that are currently // highlighted to be in the selection) if (activeFrame < 0) return; int startSelection = selectionFrame; int endSelection = activeFrame + 1; if (endSelection < startSelection) { startSelection = activeFrame; endSelection = selectionFrame + 1; } if (endSelection <= fromFrame) return; if (endSelection < fromFrame + frameCount) endSelection = fromFrame; else endSelection -= frameCount; if (fromFrame < startSelection) { if (startSelection < fromFrame + frameCount) startSelection = fromFrame; else startSelection -= frameCount; } if (endSelection <= startSelection) { // no selection remains activeFrame = -1; selectionFrame = -1; } else if (activeFrame < selectionFrame) { activeFrame = startSelection; selectionFrame = endSelection - 1; } else { selectionFrame = startSelection; activeFrame = endSelection - 1; } } void FrameBar::removeFrames(int fromFrame, int toFrame) { if (activeSceneSize <= toFrame) { resync(); return; } int frameCount = toFrame - fromFrame + 1; deleteFrames(fromFrame, frameCount); for (int i = fromFrame; i != activeSceneSize; ++i) { getFrameThumb(i, true); } int sceneCount = sceneThumbCount(); for (int i = activeScene + 1; i != sceneCount; ++i) { getSceneThumb(i, true); } fixSize(); } void FrameBar::moveFrames(int fromFrame, int toFrame, int movePosition) { int fromThumb = fromFrame + activeScene + 1; int toThumb = toFrame + activeScene + 2; int dest = movePosition + activeScene + 1; int updateStart = 0; int updateEnd = 0; if (movePosition < fromFrame) { std::rotate(thumbViews.begin() + dest, thumbViews.begin() + fromThumb, thumbViews.begin() + toThumb); updateStart = movePosition; updateEnd = toFrame + 1; } else if (toFrame < movePosition) { std::rotate(thumbViews.begin() + fromThumb, thumbViews.begin() + toThumb, thumbViews.begin() + dest); updateStart = fromFrame; updateEnd = movePosition; } else { return; } for (int i = updateStart; i != updateEnd; ++i) { getFrameThumb(i, true); } } void FrameBar::doScroll() { int thumbNumber = activeFrame < 0? activeScene : activeFrame + activeScene + 1; if (0 <= thumbNumber) { ensureVisible(thumbNumber * (FRAME_WIDTH + SPACE) + FRAME_WIDTH / 2, FRAME_HEIGHT / 2, FRAME_WIDTH / 2, FRAME_HEIGHT / 2); } } void FrameBar::setActiveFrame(int frameNumber) { selecting = false; Logger::get().logDebug("Setting new active frame in FrameBar"); setActiveFrameAndSelection(frameNumber, frameNumber); // If there is a frame to set as active if (frameNumber >= 0) { doScroll(); } } void FrameBar::setSelecting(bool selecting) { this->selecting = selecting; } bool FrameBar::isSelecting() const { return selecting; } template void swapContents(T& x, T& y) { T t = x; x = y; y = t; } void FrameBar::highlight(int start, int end, bool set) { int endFrame = getFrameThumbIndex(end); for (int i = getFrameThumbIndex(start); i != endFrame; ++i) { thumbViews[i]->setSelected(set); } } namespace { struct SelectionEnd { // +1 to set, -1 to reset int toSet; int pos; }; } void FrameBar::changeSelectionHighlight(int af, int sf) { // put old selection in [a..b) SelectionEnd a = {-1, activeFrame}; SelectionEnd b = {1, selectionFrame + 1}; if (activeFrame == -1) { a.pos = 0; b.pos = 0; } else if (selectionFrame < activeFrame) { a.pos = selectionFrame; b.pos = activeFrame + 1; } activeFrame = af; selectionFrame = sf; // put new selection in [c..d) SelectionEnd c = {1, af}; SelectionEnd d = {-1, sf + 1}; if (af == -1) { c.pos = 0; d.pos = 0; } else if (sf < af) { c.pos = sf; d.pos = af + 1; } // put leftmost end in a if (c.pos < a.pos) swapContents(a, c); // put rightmost end in d if (d.pos < b.pos) swapContents(b, d); // put a,b,c,d in order if (c.pos < b.pos) swapContents(b, c); highlight(a.pos, b.pos, 0 < a.toSet); bool set = 0 < a.toSet + b.toSet + c.toSet; highlight(c.pos, d.pos, set); } void FrameBar::setActiveFrameAndSelection(int af, int sf) { if (activeSceneSize <= af || activeSceneSize <= sf) { resync(); return; } if (af == activeFrame && sf == selectionFrame) return; // put old selection in [a..b) changeSelectionHighlight(af, sf); emit newActiveFrame(activeScene, activeFrame); } void FrameBar::setSelection(int sf) { setActiveFrameAndSelection(sf, selectionFrame); } int FrameBar::getSelectionAnchor() const { return selectionFrame; } void FrameBar::setPreferencesMenu(FramePreferencesMenu* preferencesMenu) { this->preferencesMenu = preferencesMenu; } void FrameBar::showPreferencesMenu() { preferencesMenu->open(); } void FrameBar::updateNewScene(int index) { closeActiveScene(); newScene(index); updateNewActiveFrame(index, -1); } void FrameBar::newScene(int index) { Logger::get().logDebug("Adding new scene thumb to framebar"); int thumbIndex = index <= activeScene? index : index + activeSceneSize; thumbViews.insert(thumbViews.begin() + thumbIndex, 0); if (index <= activeScene) { ++activeScene; for (int i = 0; i != activeSceneSize; ++i) { getFrameThumb(i, true); } } // get new scene and move and renumber all subsequent scenes int sceneCount = sceneThumbCount(); for (int i = index; i != sceneCount; ++i) { getSceneThumb(i, true); } fixSize(); emit modelSizeChanged(DomainFacade::getFacade()->getModelSize()); } void FrameBar::updateRemoveScene(int sceneNumber) { removeScene(sceneNumber); } void FrameBar::removeScene(int sceneNumber) { if (sceneNumber < 0) return; if (sceneNumber == activeScene) closeActiveScene(); std::vector::size_type delThumb = sceneNumber <= activeScene? sceneNumber + 1 : sceneNumber + activeSceneSize + 1; if (sceneNumber < activeScene) --activeScene; if (thumbViews.size() <= delThumb) { resync(); return; } thumbViews[delThumb]->delRef(); thumbViews.erase(thumbViews.begin() + delThumb); int sceneCount = sceneThumbCount(); for (int i = sceneNumber + 1; i < sceneCount; ++i) { getSceneThumb(i, true); } } void FrameBar::updateMoveScene(int sceneNumber, int movePosition) { moveScene(sceneNumber, movePosition); } void FrameBar::moveScene(int sceneNumber, int movePosition) { int begin = sceneNumber; int mid = sceneNumber + 1; int end = movePosition; if (movePosition < sceneNumber) { begin = movePosition; end = sceneNumber + 1; mid = sceneNumber; } else if (end <= mid) { return; } int thumbBegin = activeScene < begin? begin + activeSceneSize : begin; int thumbMid = activeScene < mid? mid + activeSceneSize : mid; int thumbEnd = activeScene < end? end + activeSceneSize : end; if (static_cast(thumbViews.size()) <= thumbEnd) { resync(); return; } std::rotate(thumbViews.begin() + thumbBegin, thumbViews.begin() + thumbMid, thumbViews.begin() + thumbEnd); for (int i = begin; i != end; ++i) { getSceneThumb(i, true); } if (begin <= activeScene && activeScene < end) { for (int i = 0; i != activeSceneSize; i++) { getFrameThumb(i, true); } } } void FrameBar::closeActiveScene() { if (activeScene >= 0) { deleteFrames(0, activeSceneSize); activeSceneSize = 0; int s = activeScene; activeScene = -1; int sceneCount = sceneThumbCount(); for (; s < sceneCount; ++s) { getSceneThumb(s, true); } } } void FrameBar::setActiveScene(int sceneNumber) { if (sceneNumber == activeScene) return; closeActiveScene(); DomainFacade* anim = DomainFacade::getFacade(); if (anim->getNumberOfScenes() <= sceneNumber) { return; } if (sceneNumber < 0) { activeScene = -1; activeSceneSize = 0; } activeScene = sceneNumber; activeFrame = -1; selectionFrame = -1; selecting = false; thumbViews[activeScene]->setOpened(true); int count = anim->getSceneSize(activeScene); insertFrames(0, count); fixSize(); emit newActiveFrame(activeScene, activeFrame); doScroll(); emit newMaximumValue(DomainFacade::getFacade()->getSceneSize(activeScene)); } int FrameBar::getMovingScene() const { return movingScene; } void FrameBar::setMovingScene(int movingScene) { this->movingScene = movingScene; } // TODO: Check for other mime types as well void FrameBar::dragEnterEvent(QDragEnterEvent *event) { if ( event->mimeData()->hasUrls() ) { event->accept(); } else { event->ignore(); } } void FrameBar::dropEvent(QDropEvent *event) { scrollTimer->stop(); scrollDirection = 0; int index = (event->pos().x() + -mainWidget->pos().x()) / (FRAME_WIDTH + SPACE); if ( index < static_cast(thumbViews.size() ) ) { thumbViews[index]->contentsDropped(event); } } void FrameBar::dragMoveEvent(QDragMoveEvent *event) { int dragPosX = event->pos().x(); int dragPosY = event->pos().y(); if (dragPosX < lowerScrollAreaX || dragPosX > upperScrollAreaX) { if ( !scrollTimer->isActive() ) { scrollDirection = dragPosX < lowerScrollAreaX ? -1 : 1; scrollTimer->start(50); } // Increase speed else if (dragPosX < lowerAccelScrollAreaX || dragPosX > upperAccelScrollAreaX ) { scrollTimer->setInterval(25); } // Decrease speed else { scrollTimer->setInterval(50); } } else { scrollTimer->stop(); scrollDirection = 0; } // Stop scrolling if we're dragging outside framebar bool outsideHorizontal = dragPosX < minScrollAreaX || dragPosX > maxScrollAreaX; bool outsideVertical = dragPosY < minScrollAreaY || dragPosY > maxScrollAreaY; if (outsideHorizontal || outsideVertical) { scrollTimer->stop(); scrollDirection = 0; } } void FrameBar::resizeEvent(QResizeEvent *event) { lowerScrollAreaX = this->x() + FRAME_WIDTH; upperScrollAreaX = this->width() - FRAME_WIDTH; lowerAccelScrollAreaX = lowerScrollAreaX - (FRAME_WIDTH >> 1); upperAccelScrollAreaX = upperScrollAreaX + (FRAME_WIDTH >> 1); minScrollAreaX = lowerScrollAreaX - FRAME_WIDTH + 20; maxScrollAreaX = upperScrollAreaX + FRAME_WIDTH - 20; minScrollAreaY = this->y() + 20; maxScrollAreaY = this->y() + FRAME_HEIGHT - 20; QScrollArea::resizeEvent(event); } void FrameBar::scroll() { if (scrollDirection == -1) { scrollBar->setSliderPosition(scrollBar->sliderPosition() - 15); } else if (scrollDirection == 1) { scrollBar->setSliderPosition(scrollBar->sliderPosition() + 15); } } int FrameBar::getFrameWidth() const { return FRAME_WIDTH; } int FrameBar::getFrameHeight() const { return FRAME_HEIGHT; } int FrameBar::getSpace() const { return SPACE; } int FrameBar::getActiveFrame() const { return activeFrame; } int FrameBar::getActiveScene() const { return activeScene; } void FrameBar::setThumbImage(ThumbView* thumb, const char* imagePath) { thumb->setPixmap( QPixmap::fromImage( tryReadImage(imagePath).scaled(FRAME_WIDTH, FRAME_HEIGHT))); } int FrameBar::getFrameThumbIndex(int index) { return activeScene + 1 + index; } ThumbView* FrameBar::getFrameThumb(int index, bool fix) { int thumbIndex = getFrameThumbIndex(index); ThumbView* thumb = thumbViews[thumbIndex]; DomainFacade* facade = DomainFacade::getFacade(); if (!thumb) { thumb = new FrameThumbView(this, 0, index); thumb->setMinimumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setMaximumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setScaledContents(true); const char* imagePath = facade->getImagePath(activeScene, index); if (imagePath) { setThumbImage(thumb, imagePath); } thumb->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); thumb->setParent(mainWidget); thumb->show(); thumbViews[thumbIndex] = thumb; fix = true; } if (fix) { thumb->move((FRAME_WIDTH + SPACE) * (index + activeScene + 1), 0); thumb->setNumber(index); thumb->setHasSounds(facade->getNumberOfSounds(activeScene, index)); thumb->setSelected(0 <= activeFrame && ((activeFrame <= index && index <= selectionFrame) || (selectionFrame <= index && index <= activeFrame))); } return thumb; } ThumbView* FrameBar::getSceneThumb(int index, bool fix) { int thumbIndex = index <= activeScene? index : index + activeSceneSize; ThumbView* thumb = thumbViews[thumbIndex]; if (!thumb) { thumb = new SceneThumbView(this, 0, index, "scene"); thumb->setMinimumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setMaximumSize(FRAME_WIDTH, FRAME_HEIGHT); thumb->setScaledContents(true); thumb->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); thumb->setParent(mainWidget); thumb->show(); thumbViews[thumbIndex] = thumb; fix = true; } if (fix) { thumb->move((FRAME_WIDTH + SPACE) * thumbIndex, 0); thumb->setNumber(index); thumb->setOpened(index == activeScene); } return thumb; } int FrameBar::sceneThumbCount() const { return thumbViews.size() - activeSceneSize; } void FrameBar::selectPreviousFrame() { if (activeFrame == -1) { if (0 < activeScene) { setActiveScene(activeScene - 1); int f = activeSceneSize - 1; setActiveFrameAndSelection(f, f); } } else { int f = activeFrame - 1; setActiveFrameAndSelection(f, f); } doScroll(); } void FrameBar::selectNextFrame() { int f = activeFrame + 1; if (activeSceneSize <= f) { int s = activeScene + 1; if (s < sceneThumbCount()) { setActiveScene(s); } } else { setActiveFrameAndSelection(f, f); } doScroll(); } void FrameBar::moveSelectionToPreviousFrame() { if (0 < activeFrame) { setSelection(activeFrame - 1); } } void FrameBar::moveSelectionToNextFrame() { if (activeFrame < activeSceneSize - 1) { setSelection(activeFrame + 1); } } void FrameBar::selectPreviousScene() { int s = activeScene - 1; if (0 <= s) { setActiveScene(s); int f = activeSceneSize - 1; setActiveFrameAndSelection(f, f); } else if (0 <= activeFrame) { setActiveFrameAndSelection(-1, -1); } doScroll(); } void FrameBar::selectNextScene() { int s = activeScene + 1; if (s < sceneThumbCount()) { setActiveScene(s); } else { int f = activeSceneSize - 1; setActiveFrameAndSelection(f, f); } doScroll(); } void FrameBar::setSelection(int scene, int selectionFrame, int activeFrame) { setActiveScene(scene); setActiveFrameAndSelection(activeFrame, selectionFrame); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/framebar.h000066400000000000000000000320371234321124500271330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FRAMEBAR_H #define FRAMEBAR_H #include "src/presentation/observer.h" #include "src/presentation/frontends/selection.h" #include #include class Frame; class ThumbView; class FramePreferencesMenu; class QWidget; class QDragEnterEvent; class QDragMoveEvent; class QDropEvent; class QResizeEvent; /** * The framebar widget for viewing the animation model. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FrameBar : public QScrollArea, public Observer, public Selection { Q_OBJECT public: /** * Creates and sets up the framebar. * @param parent the parent widget */ FrameBar(QWidget *parent = 0); /** * Cleans up after the framebar. */ ~FrameBar(); /** * Receives notification when a frame is added. */ void updateAdd(int scene, int index, int numFrames); /** * Function to receive notification when one or more frames are deleted. * @param fromFrame the first frame in the selection * @param toFrame the last frame in the selection */ void updateRemove(int scene, int fromFrame, int toFrame); /** *Function to receive notification when one or more frames are moved. */ void updateMove(int fromScene, int fromFrame, int count, int toScene, int toFrame); /** * Function to receive notification when the model is erased. */ void updateClear(); /** * Function to recieve notification when a new scene is added to the * model. * @param index the index of the new scene. */ void updateNewScene(int index); /** * Function to recieve notification when a scene is removed from * the model. * @param sceneNumber the scene which has been removed from the model. */ void updateRemoveScene(int sceneNumber); /** * Function which receives notification when a scene in the animation * has been moved and moves the icons in the framebar accordingly. * @param sceneNumber the scene which have been moved. * @param movePosition the position the scene has been moved to. */ void updateMoveScene(int sceneNumber, int movePosition); /** * Function which receives notification when a scene is selected as the * active scene in the animationmodel. * @param sceneNumber the new scene to be set as the active scene in the * framebar. * @param framePaths paths to the pictures in the scene. * @param frontend the frontend for getting a progressbar when adding * opening the new active scene. */ void updateNewActiveScene(int sceneNumber); /** * Updates the framebar when an external program has altered the disk files. * @param sceneNumber The scene containing the changed frame. * @param frameNumber the frame whose disk representation has been changed. */ void updateAnimationChanged(int sceneNumber, int frameNumber); /** * Upadates the framebar when the sounds attached to the specified frame * change. * @param sceneNumber The scene to which the changed frame belongs. * @param frameNumber The frame number within the scene */ void updateSoundChanged(int sceneNumber, int frameNumber); /** * Set whether the user is engaged selecting several frames or not (pressing * shift). * @param selecting true if the user is currently selecting multiple pictures */ void setSelecting(bool selecting); /** * Returns true if the user is currently selecting several thumbviews. * @return true if the user is currently selecting several thumbviews. */ bool isSelecting() const; /** * Sets a selection of frames between (including) this frame and the activeFrame. * @todo change name to setSelectionFrame * @param selectionFrame the other border frame of the selection in addition to activeFrame */ void setSelection(int selectionFrame); /** * Returns The frame number of the anchor of the selection. * @return The anchor of the current selection, or returns the same value * as {@ref getActiveFrame} if there is no selection. */ int getSelectionAnchor() const; /** * Returns the current active frame. */ int getActiveFrame() const; /** * Returns the current active scene. */ int getActiveScene() const; /** * Registers the frame preferences menu in the framebar. * @param preferencesMenu the frame preferences menu. */ void setPreferencesMenu(FramePreferencesMenu *preferencesMenu); /** * Displays the frame preferences for the active frame. */ void showPreferencesMenu(); /** * Retrieves the value of the movingScene property specifying which scene * is currently being moved in the framebar. * @return the value of the movingScene property. */ int getMovingScene() const; /** * Sets the value of the movingScene property specifying which scene * is currently being moved in the framebar. * @param movingScene the new value of the movingScene property. */ void setMovingScene(int movingScene); int getFrameWidth() const; int getFrameHeight() const; int getSpace() const; protected: /** * Overloaded event function for when a drag enter occurs in the framebar * @param event information about the dragEnterEvent */ void dragEnterEvent(QDragEnterEvent *event); /** * Overloaded event function for when a drop event occurs in the framebar. * @param event information about the dropEvent */ void dropEvent(QDropEvent *event); void dragMoveEvent(QDragMoveEvent *event); void resizeEvent(QResizeEvent *event); public slots: void updateNewActiveFrame(int scene, int frame); /** * Move the active frame and selection to the selection before the current * anchor. Make the selection just this single frame. */ void selectPreviousFrame(); void selectNextFrame(); /** * Move the selection, not the active frame, thus extending/diminishing the * selection. */ void moveSelectionToPreviousFrame(); void moveSelectionToNextFrame(); void selectPreviousScene(); void selectNextScene(); void fileChanged(const QString &path); void setThumbImage(ThumbView* thumb, const char* imagePath); void setSelection(int scene, int selectionFrame, int activeFrame); signals: //The signals in the framebar is used for signaling small widget, //who are deemed to unsignificant to be observers, of changes in //the framebar/model. A bit hacky and should be in it's own widget. void newActiveFrame( const QString & ); void newActiveFrame(int scene, int frame); void modelSizeChanged( int modelSize ); void newMaximumValue(int value); private slots: void scroll(); private: static const int FRAME_HEIGHT = 88; static const int FRAME_WIDTH = 117; static const int SPACE = 2; /** Vector of thumbviews to keep track of the pictures in the framebar*/ vectorthumbViews; /** The active frame in the framebar*/ int activeFrame; /** The active scene in the framebar */ int activeScene; /** * The number of thumbnails we are showing for frames in the active scene. * If this is different to the number of frames in the actual scene, we * need to resynchronize. */ int activeSceneSize; /** The scene which are being moved when draging a scene */ int movingScene; /** * The anchor in a selection. * If only one frame is selected selectionFrame == activeFrame */ int selectionFrame; /** Direction to scroll when dragging. * -1 = scroll negative, 0 = no scroll, 1 = scroll positive */ int scrollDirection; int lowerScrollAreaX; int upperScrollAreaX; int lowerAccelScrollAreaX; int upperAccelScrollAreaX; int minScrollAreaX; int maxScrollAreaX; int minScrollAreaY; int maxScrollAreaY; /** True if the user is currently holding down shift to select multiple frames */ bool selecting; bool openingScene; QTimer *scrollTimer; QScrollBar *scrollBar; QWidget *mainWidget; /** Pointer to the frame preferencesMenu */ FramePreferencesMenu *preferencesMenu; /** Returns how many scene thumbnails there are */ int sceneThumbCount() const; /** * Adds the frames in the framesvector to the framebar. * @param index The location to add the frames to. * @param numFrames The number of frames to be added. */ void addFrames(int index, int numFrames); /** * Removes a selection of thumbviews from the framebar. * @param fromFrame the first thumbview to remove. * @param toFrame the last thumbview to remove. */ void removeFrames(int fromFrame, int toFrame); /** * Move the frames from fromFrame (inclusive) to toFrame to movePosition. * @param fromFrame the first frame to move. * @param toFrame the last frame to move. * @param movePosition the position to move the frames to. */ void moveFrames(int fromFrame, int toFrame, int movePosition); /** *Sets the thumbview frameNumber in the framebar to be the active frame. *@param frameNumber the number of the new active frame */ void setActiveFrame(int frameNumber); /** * Creates a new scene and adds it to the framebar. * @param index the location the new scene should be added at. */ void newScene(int index); /** * Removes the scene with index sceneNumber from the framebar. * @param sceneNumber the scene to be removed from the framebar. */ void removeScene(int sceneNumber); /** * Moves a scene in the framebar. * @param sceneNumber the scene that are moved. * @param movePosition the position the scene are moved to. */ void moveScene(int sceneNumber, int movePosition); /** * Sets a new scene as the active scene in the framebar and opens it. * @param sceneNumber the scene to set as the active scene. * @param framePaths the paths to the frames in the scene. * @param frontend the frontend for getting a progressbar when adding the * frames to the scene. */ void setActiveScene(int sceneNumber); /** * Gets the thumbnail of the specified frame in the active scene, creating * it if necessary. * @param index The index of the frame within the active scene. * @param fix True to correct the position, number and sound indicator. */ ThumbView* getFrameThumb(int index, bool fix = false); /** * Gets the thumbnail of the specified scene, creating it if necessary. * @param index The scene number. * @param fix True to correct the position and number. */ ThumbView* getSceneThumb(int index, bool fix = false); /** Sets the size of the frame bar to accomodate all the thumbnails. */ void fixSize(); /** Deletes all the thumbnails. */ void clear(); /** * Resynchronizes the thumbnails with the domain facade, and puts the * active frame, active scene and selection frame within bounds. */ void resync(); /** * Deletes the specified frames from the active scene. */ void deleteFrames(int fromFrame, int frameCount); /** * Sets {@ref activeScene} to -1, deleting all the frame thumbnails in the * previously-set active scene and closing the scene thumbnail. */ void closeActiveScene(); /** * Inserts frames into the active scene. */ void insertFrames(int index, int numFrames); /** * Sets the current selection. */ void setActiveFrameAndSelection(int af, int sf); /** * Scrolls the framebar to include the currently active frame. */ void doScroll(); void doActiveFrameNotifications(); void fixPreferencesMenu(); /** * Changes the selection highlight without fixing any damaged frames. * Set both {@ af} and {@sf} to {@c -1} to remove the selection. */ void changeSelectionHighlight(int af, int sf); int getFrameThumbIndex(int index); /** * Sets the frames in the current scene from index {@a start} to index * {@a end} (not including the one at {@end}) to be highlighted or not, * depending on the value of {@set}. * @param start The first index to have its highlight set. * @param end The first index not to have its highlight set. * @param set {@c true} to set the highlight on, {@c false} to set it off. * @pre {@a start} must be no greater than {@a end}. */ void highlight(int start, int end, bool set); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/framethumbview.cpp000066400000000000000000000165301234321124500307340ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "framethumbview.h" #include "thumbdragger.h" #include "filenamesfromurlsiterator.h" #include "src/domain/domainfacade.h" #include "src/technical/stringiterator.h" #include "graphics/icons/note.xpm" #include #include #include #include #include #include #include #include #include #include #include FrameThumbView::FrameThumbView(FrameBar *frameBar, QWidget *parent, int number, const char *name) : ThumbView(frameBar, parent, number, name) { stringNumber = QString("%1").arg(number + 1); textWidth = 5 + stringNumber.length() * 8; selected = false; hasSounds = false; } FrameThumbView::~FrameThumbView() { } void FrameThumbView::mousePressEvent( QMouseEvent * e ) { if (e->button() == Qt::LeftButton) { if ( !getFrameBar()->isSelecting() ) { int selectionFrame = getFrameBar()->getSelectionAnchor(); int activeScene = getFrameBar()->getActiveScene(); int activeFrame = getFrameBar()->getActiveFrame(); int highend = (selectionFrame > activeFrame ) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame ) ? selectionFrame : activeFrame; // If the user presses inside the selection area this shouldn't trigger // setActiveFrame before the mouse button is released. The reason for this is // to give the user a chance to drag the items. See mouseReleaseEvent(...) if (getNumber() > highend || getNumber() < lowend) { getFrameBar()->updateNewActiveFrame(activeScene, getNumber()); } dragPos = e->pos(); } else { getFrameBar()->setSelection(getNumber()); } } } void FrameThumbView::mouseReleaseEvent( QMouseEvent * e ) { Logger::get().logDebug("Releasing mouse button inside thumbview"); if (e->button() == Qt::LeftButton) { if ( !getFrameBar()->isSelecting() ) { int selectionFrame = getFrameBar()->getSelectionAnchor(); int activeScene = getFrameBar()->getActiveScene(); int activeFrame = getFrameBar()->getActiveFrame(); int highend = (selectionFrame > activeFrame ) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame ) ? selectionFrame : activeFrame; if (getNumber() <= highend || getNumber() >= lowend) { getFrameBar()->updateNewActiveFrame(activeScene, getNumber()); } } } } void FrameThumbView::mouseMoveEvent(QMouseEvent *me) { if (me->buttons() & Qt::LeftButton) { int distance = (me->pos() - dragPos).manhattanLength(); if (distance > QApplication::startDragDistance()) { startDrag(); } } QLabel::mouseMoveEvent(me); } void FrameThumbView::mouseDoubleClickEvent( QMouseEvent * ) { getFrameBar()->showPreferencesMenu(); } void FrameThumbView::paintEvent (QPaintEvent * paintEvent) { QLabel::paintEvent(paintEvent); QPainter painter( this ); if (selected) { painter.fillRect( 4, 5, textWidth, 14, QBrush(Qt::white) ); painter.setPen( Qt::black ); } else { painter.fillRect( 4, 5, textWidth, 14, QBrush(Qt::black) ); painter.setPen( Qt::white ); } painter.drawText(5, 17, stringNumber); if (this->hasSounds) { painter.drawPixmap( width() - 32, 0, QPixmap(note) ); } } void FrameThumbView::startDrag() { // If the drag ends on a scene this tells the scene that it is frames that // are being moved. getFrameBar()->setMovingScene(-1); QList urls; int selectionFrame = getFrameBar()->getSelectionAnchor(); int activeScene = getFrameBar()->getActiveScene(); int activeFrame = getFrameBar()->getActiveFrame(); int highend = (selectionFrame > activeFrame ) ? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame ) ? selectionFrame : activeFrame; DomainFacade* facade = DomainFacade::getFacade(); for (int i = lowend; i <= highend; ++i) { const char* imagePath = facade->getImagePath(activeScene, i); if (imagePath) urls.append(QUrl::fromLocalFile(imagePath)); } QDrag *drag = new ThumbDragger(this); QMimeData *mimeData = new QMimeData; mimeData->setUrls(urls); drag->setMimeData(mimeData); drag->setPixmap(*pixmap()); //Qt::DropAction dropAction = drag->start(Qt::CopyAction | Qt::MoveAction); drag->start(Qt::MoveAction); } void FrameThumbView::setHasSounds( bool hasSounds ) { this->hasSounds = hasSounds; update(); } void FrameThumbView::setNumber( int number ) { ThumbView::setNumber(number); stringNumber = QString("%1").arg(number + 1); textWidth = 5 + stringNumber.length() * 8; update(); } void FrameThumbView::setSelected(bool selected) { this->selected = selected; if (selected) { setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); setLineWidth(5); setMidLineWidth(6); } else { setFrameShape(QFrame::NoFrame); } } /** * Moves the frames dropped to just after this frame if the frames are being * moved to the right, or just before this frame if the frames are being moved * to the left. This slightly bizarre behaviour feels right to users who expect * a moved frame to appear where they dropped it. */ void FrameThumbView::contentsDropped(QDropEvent * event) { DomainFacade* facade = DomainFacade::getFacade(); int activeScene = getFrameBar()->getActiveScene(); if (event->source() == 0) { Logger::get().logDebug("Adding picture(s)"); if ( event->mimeData()->hasUrls() ) { QList urls = event->mimeData()->urls(); FileNamesFromUrlsIterator fNames(urls.begin(), urls.end()); DomainFacade::getFacade()->addFrames(activeScene, getNumber(), fNames); } } else if (getFrameBar()->getMovingScene() == -1) { Logger::get().logDebug("Moving picture"); int selectionFrame = getFrameBar()->getSelectionAnchor(); int activeFrame = getFrameBar()->getActiveFrame(); int highend = (selectionFrame > activeFrame)? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame )? selectionFrame : activeFrame; int destination = activeFrame < getNumber()? getNumber() + 1 : getNumber(); facade->moveFrames(activeScene, lowend, highend - lowend + 1, activeScene, destination); } } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/framethumbview.h000066400000000000000000000077721234321124500304110ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FRAMETHUMBVIEW_H #define FRAMETHUMBVIEW_H #include "src/presentation/frontends/qtfrontend/framebar/thumbview.h" class QMouseEvent; class QDropEvent; class QPaintEvent; /** * Widget representing a frame in the animation. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FrameThumbView : public ThumbView { public: /** * Creates and sets up the framethumbview. * @param frameBar the framebar for communicating with it. * @param parent the parent widget. * @param number the number of this widget in the framebar. */ FrameThumbView(FrameBar *frameBar, QWidget *parent = 0, int number = 0, const char *name = 0); /** * Cleans up after the widget. */ ~FrameThumbView(); /** * Overloaded event function to recieve mousepress-events. * @param e information about the mousepress-event. */ void mousePressEvent( QMouseEvent * e ); /** * Overloaded event function to recieve mouserelease-events. * @param e information about the mouserelease-event. */ void mouseReleaseEvent( QMouseEvent * e ); /** * Overloaded event function to recieve mouseMoveEvents. * @param me information about the mouseMoveEvent. */ void mouseMoveEvent(QMouseEvent *me); /** * Overloaded event function to recieve events when the user double clicks * in the thumbview. Double clicks here cause the preferences menu for this * frame to be shown. * @param e information about the mouseDoubleClickEvent. */ void mouseDoubleClickEvent ( QMouseEvent * e ); /** * Sets/changes the number of this widget. * @param number the new number of this widget. */ void setNumber(int number); /** * Sets whether this widget has sounds. * @param hasSounds */ void setHasSounds( bool hasSounds ); /** * Sets whether this thumbview should be selected. * @param selected whether this frame is selected. */ void setSelected(bool selected); /** * Notifies the framethumbview that a drop have happened inside its borders. * @param event information about the event. */ void contentsDropped(QDropEvent * event); protected: /** * Event function which paints the widget. */ void paintEvent ( QPaintEvent * ); private: /** Coordinate for calculating when a drag should start */ QPoint dragPos; QString stringNumber; /** The width the text should have. (Cached for efficiency reasons)*/ int textWidth; /** Whether this frame has sounds attatched to it */ bool hasSounds; /** Specifies whether this frame is selected. */ bool selected; /** Starts an uri drag of the picture in this label. */ void startDrag(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/scenearrowbutton.cpp000066400000000000000000000056121234321124500313120ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "scenearrowbutton.h" #include "graphics/icons/openscene.xpm" #include "graphics/icons/closescene.xpm" #include #include #include #include #include #include SceneArrowButton::SceneArrowButton( QWidget *parent ) : QWidget(parent) { this->isOpened = false; this->iconX = 2; moveTimer = new QTimer(this); QObject::connect( moveTimer, SIGNAL(timeout()), this, SLOT(moveIcon()) ); } void SceneArrowButton::setOpened(bool isOpened) { this->isOpened = isOpened; this->repaint(); } void SceneArrowButton::paintEvent( QPaintEvent * ) { QPainter paint( this ); paint.setPen(Qt::gray); paint.drawRect(0, 0, width(), height()); QPixmap arrowIcon; if (isOpened) { arrowIcon = QPixmap::fromImage( QImage(closescene).scaled(width(), height()) ); } else { arrowIcon = QPixmap::fromImage( QImage(openscene).scaled(width(), height()) ); } paint.drawPixmap(iconX, 0, arrowIcon); } void SceneArrowButton::moveIcon() { this->iconX = (iconX == 0) ? 2 : 0; this->repaint(); } void SceneArrowButton::mouseReleaseEvent( QMouseEvent * e ) { if (isOpened) { emit clicked(); moveTimer->stop(); this->iconX = 2; this->repaint(); } else { e->ignore(); } } void SceneArrowButton::enterEvent( QEvent * ) { if (isOpened) { moveTimer->start(400); moveTimer->setSingleShot(false); } } void SceneArrowButton::leaveEvent( QEvent * ) { moveTimer->stop(); this->iconX = 2; this->repaint(); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/scenearrowbutton.h000066400000000000000000000055531234321124500307630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by fredrik * * fredrik@Elanor * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SCENEARROWBUTTON_H #define SCENEARROWBUTTON_H #include #include //Added by qt3to4: #include #include #include /** *@author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class SceneArrowButton : public QWidget { Q_OBJECT public: /** * Sets up the scenearrowbutton * @param parent the parent of the widget. */ SceneArrowButton( QWidget *parent=0 ); /** * Sets if the scene is opened or closed. * @param isOpened true if the scene is opened. */ void setOpened(bool isOpened); public slots: /** * Slot for moving the icon to create an animation-like effect. */ void moveIcon(); protected: /** Overloaded function to paint the widget. * @param p information about the paintEvent. */ virtual void paintEvent ( QPaintEvent *p); /** * Overloaded event function to recieve mouserelease-events. * @param e information about the mouserelease-event. */ void mouseReleaseEvent( QMouseEvent * e ); /** * Overloaded event function for recieving information when the mouse * enter the widget * @param e information about the event */ void enterEvent ( QEvent * e); /** * Overloaded event function for recieving information when the mouse * leaves the widget * @param e information about the event */ void leaveEvent ( QEvent * e); private: bool isOpened; int iconX; QTimer *moveTimer; signals: void clicked(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/scenethumbview.cpp000066400000000000000000000147711234321124500307440ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "scenethumbview.h" #include "thumbdragger.h" #include "filenamesfromurlsiterator.h" #include "graphics/icons/clapper.xpm" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/framebar/scenearrowbutton.h" #include #include #include #include #include #include #include #include #include #include #include #include SceneThumbView::SceneThumbView(FrameBar *frameBar, QWidget *parent, int number, const char * name) : ThumbView(frameBar, parent, number, name) { this->isOpened = false; arrowButton = new SceneArrowButton(this); int width = getFrameBar()->getFrameWidth(); int height = getFrameBar()->getFrameHeight(); arrowButton->setGeometry( width - width / 4, height / 9, width / 6, width / 6 ); arrowButton->show(); QObject::connect( arrowButton, SIGNAL(clicked()), this, SLOT(closeScene()) ); f.setPointSize(12); centerIcon = QPixmap(clapper); } SceneThumbView::~SceneThumbView() { } void SceneThumbView::setOpened( bool isOpened ) { this->isOpened = isOpened; arrowButton->setOpened(isOpened); DomainFacade* facade = DomainFacade::getFacade(); if (!isOpened && (facade->getSceneSize(getNumber()) > 0)) { const char *path = facade->getImagePath(getNumber(), 0); if (path) { QImage half = QImage(path).scaled(width() / 2, height() / 2); centerIcon = QPixmap::fromImage(half); } } else { centerIcon = QPixmap(clapper); } this->update(); } bool SceneThumbView::getIsOpened() const { return isOpened; } /** * @todo the width can be cached somewhere so that the function width() don't have * to be called for every frame and scene thumbview. */ void SceneThumbView::paintEvent ( QPaintEvent * ) { int width = this->width(); QPainter paint(this); paint.setPen(Qt::black); paint.setFont(f); paint.drawText( 7, width / 4, QString("%1").arg(getNumber() + 1) ); if (!isOpened && (DomainFacade::getFacade()->getSceneSize(getNumber()) > 0) ) { paint.drawPixmap(width / 4, width / 3, centerIcon); } else { paint.drawPixmap(width / 2 - 16, width / 2 - 10, centerIcon); } } void SceneThumbView::mousePressEvent(QMouseEvent *e) { //For calculating the manhattan length to avoid unwanted drags. dragPos = e->pos(); } void SceneThumbView::mouseReleaseEvent( QMouseEvent * ) { getFrameBar()->updateNewActiveScene(getNumber()); } void SceneThumbView::mouseMoveEvent(QMouseEvent * me) { // it should probably be me->button() here... if (me->buttons() & Qt::LeftButton) { int distance = (me->pos() - dragPos).manhattanLength(); if (distance > QApplication::startDragDistance()) { startDrag(); } } QLabel::mouseMoveEvent(me); } void SceneThumbView::startDrag() { Logger::get().logDebug("Starting drag of the scene"); getFrameBar()->setMovingScene(getNumber()); QDrag *drag = new ThumbDragger(this); QMimeData *mimeData = new QMimeData; QList urls; mimeData->setUrls(urls); drag->setMimeData(mimeData); drag->setPixmap(centerIcon); //Qt::DropAction dropAction = drag->start(Qt::CopyAction | Qt::MoveAction); drag->start(Qt::MoveAction); } void SceneThumbView::closeScene() { if ( getNumber() >= 0) { if (getFrameBar()->getActiveScene() == getNumber() && getNumber() > 0) { getFrameBar()->updateNewActiveScene(getNumber() - 1); } else { getFrameBar()->updateNewActiveScene(getNumber()); } } } /** * Scenes should be dropped after this frame if moving right or before if * moving left. This makes sense to users, who expect the dropped scene to * appear where they dropped it. Frames should always move to the start of the * scene they are dropped in. */ void SceneThumbView::contentsDropped(QDropEvent *event) { DomainFacade* facade = DomainFacade::getFacade(); int sceneNumber = getNumber(); int movingScene = getFrameBar()->getMovingScene(); int activeScene= getFrameBar()->getActiveScene(); if (event->source() == 0) { if ( event->mimeData()->hasUrls() ) { QList urls = event->mimeData()->urls(); FileNamesFromUrlsIterator fNames(urls.begin(), urls.end()); DomainFacade::getFacade()->addFrames(getNumber(), 0, fNames); } } else if (movingScene == -1) { // moving frames into a scene int selectionFrame = getFrameBar()->getSelectionAnchor(); int activeFrame = getFrameBar()->getActiveFrame(); int highend = (selectionFrame > activeFrame)? selectionFrame : activeFrame; int lowend = (selectionFrame < activeFrame )? selectionFrame : activeFrame; bool movingRight = activeScene < sceneNumber; if (movingRight || sceneNumber == 0) { facade->moveFrames(activeScene, lowend, highend - lowend + 1, sceneNumber, 0); } else { int sceneDest = sceneNumber - 1; int sceneSize = DomainFacade::getFacade()->getSceneSize(sceneDest); facade->moveFrames(activeScene, lowend, highend - lowend + 1, sceneDest, sceneSize); } } else if (movingScene != sceneNumber) { Logger::get().logDebug("Moving scene"); int destination = movingScene < sceneNumber? sceneNumber + 1 : sceneNumber; facade->moveScene(movingScene, destination); } } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/scenethumbview.h000066400000000000000000000075251234321124500304100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SCENETHUMBVIEW_H #define SCENETHUMBVIEW_H #include "src/presentation/frontends/qtfrontend/framebar/thumbview.h" class SceneArrowButton; class QMouseEvent; class QPaintEvent; class QDropEvent; class QPixmap; /** * Custom widget representing a scene in the framebar. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class SceneThumbView : public ThumbView { Q_OBJECT public: /** * Initializes the SceneThumbView widgets attributes. * @param frameBar the frameBar for communication. * @param parent the parent of this widget. * @param number the number of the scene this widget represents. */ SceneThumbView(FrameBar *frameBar, QWidget *parent = 0, int number = 0, const char * name = 0); /** * Clean up after the SceneThumbView. */ ~SceneThumbView(); /** * Sets if the scene is opened or closed. * @param isOpened true if the scene is opened. */ void setOpened(bool isOpened); /** * Returns whether the scene is opened. * @return true if the scene is currently opened. */ bool getIsOpened() const; public slots: /** * Closes the scene. */ void closeScene(); protected: /** * Overloaded function to paint the widget. * @param p information about the paintEvent. */ virtual void paintEvent ( QPaintEvent *p ); /** * Overloaded event function to recieve mousepress-events. * @param e information about the mousepress-event. */ void mousePressEvent( QMouseEvent * e ); /** * Overloaded event function to recieve mouserelease events. * @param e information about the event. */ void mouseReleaseEvent( QMouseEvent * e ); /** * Overloaded event function to recieve mouseMoveEvents in the scenethumbview. * Used for moving scenes. * @param me information about the mouseMoveEvent. */ void mouseMoveEvent(QMouseEvent *me); /** * Notifies the scenethumbview that a drop have happened inside its borders. * @param event information about the event. */ virtual void contentsDropped(QDropEvent * event); private: /** Coordinate for calculating when a drag should start */ QPoint dragPos; /** Whether the scene is opened or not. */ bool isOpened; /** The scene arrow button for closing the scene. */ SceneArrowButton *arrowButton; /** The image displayed on the widget */ QPixmap centerIcon; /** The font of the text on the widget */ QFont f; /** * Starts a drag event with this scene as the drag object. */ void startDrag(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/thumbdragger.cpp000066400000000000000000000032211234321124500303530ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "thumbdragger.h" #include "thumbview.h" ThumbDragger::ThumbDragger(ThumbView* source) : QDrag(source) { source->addRef(); } ThumbDragger::~ThumbDragger() { static_cast(source())->delRef(); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/thumbdragger.h000066400000000000000000000032301234321124500300200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef THUMBDRAGGER_H_ #define THUMBDRAGGER_H_ #include class ThumbView; class ThumbDragger: public QDrag { public: virtual ~ThumbDragger(); ThumbDragger(ThumbView* source); }; #endif /* THUMBDRAGGER_H_ */ stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/thumbview.cpp000066400000000000000000000042741234321124500277230ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "thumbview.h" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/mainwindowgui.h" #include ThumbView::ThumbView(FrameBar *frameBar, QWidget *parent, int number, const char *name) : QLabel(parent), frameBar(frameBar), number(number), refCount(1) { setObjectName(name); } ThumbView::~ThumbView() { } void ThumbView::setNumber(int number) { this->number = number; } int ThumbView::getNumber() const { return number; } void ThumbView::setHasSounds(bool) {} void ThumbView::setOpened(bool) {} void ThumbView::setSelected(bool) {} void ThumbView::contentsDropped(QDropEvent *) { } void ThumbView::addRef() { ++refCount; } void ThumbView::delRef() { --refCount; if (refCount == 0) deleteLater(); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framebar/thumbview.h000066400000000000000000000101361234321124500273620ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef THUMBVIEW_H #define THUMBVIEW_H #include "framebar.h" #include class FrameBar; class QDropEvent; /** * This abstract class represents the thumbviews in the framebar. It has * two subclasses: the FrameThumbView and the SceneThumbView. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ThumbView : public QLabel { public: /** * Creates and sets up the thumbview class. * @param frameBar the framebar for communicating. * @param parent the parent widget. * @param number the number of this thumbview in the framebar. */ ThumbView(FrameBar *frameBar, QWidget *parent, int number, const char *name = 0); /** * Cleans up after the widget. */ virtual ~ThumbView(); /** * Adds another reference. The reference count starts at 1 on construction. */ void addRef(); /** * Removes a reference. If the reference count falls to zero this object is * deleted. */ void delRef(); /** * Function to set the number of this ThumbView in the framebar * when the ThumbView change position. * @param number the new number for the ThumbView in the framebar. */ virtual void setNumber(int number); /** *Retrieves the number of this ThumbView in the framebar *@return the number for this ThumbView in the framebar */ int getNumber() const; /** * Abstract function for telling a framethumbview that it has one or more sounds * attatched to it. * @param hasSounds true if the frame has one or more sounds attatched to it. */ virtual void setHasSounds(bool hasSounds); /** * Sets whether a framethumbview should be marked as selected. * @param selected whether this framethumbview should be showed as selected. */ virtual void setSelected(bool selected); /** * Abstract function for telling a scenethumbview whether the scene is opened or * closed * @param isOpened true if the scene is opened. */ virtual void setOpened(bool isOpened); /** * Notifies the thumbview that a drop have happened inside its borders. * * The reason it doesn't accept it itself is that the framebar need the information * so that it can autoscroll. * @param event information about the event. */ virtual void contentsDropped(QDropEvent * event); FrameBar* getFrameBar() const { return frameBar; } private: /** * Reference count. As a QDrag object might be referring to this object * after it has been deleted from the frame bar, we need to delay deletion * until a drag starting here has ended. */ int refCount; /** The framebar for communicating with it */ FrameBar *frameBar; /** For a scene, the scene number within the animation. For a frame, the * frame number within the scene. */ int number; }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framepreferencesmenu.cpp000066400000000000000000000131621234321124500303270ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/presentation/frontends/qtfrontend/framepreferencesmenu.h" #include "src/domain/domainfacade.h" #include "graphics/icons/close.xpm" #include "src/application/soundhandler.h" #include "src/presentation/frontends/qtfrontend/framebar/framebar.h" #include #include #include FramePreferencesMenu::FramePreferencesMenu( QWidget * parent, SoundHandler *soundHandler, const FrameBar* fb, const char * name ) : MenuFrame(parent, name), soundHandler(soundHandler), frameBar(fb) { soundsList = 0; soundsLabel = 0; closeButton = 0; addSoundButton = 0; removeSoundsButton = 0; changeNameButton = 0; grid = 0; this->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken); grid = new QGridLayout; grid->setMargin(1); grid->setSpacing(1); addSoundButton = new QPushButton; addSoundButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); addSoundButton->setFocusPolicy( Qt::NoFocus ); connect( addSoundButton, SIGNAL( clicked() ), soundHandler, SLOT( addSound() ) ); removeSoundsButton = new QPushButton; removeSoundsButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); removeSoundsButton->setFocusPolicy( Qt::NoFocus ); connect( removeSoundsButton, SIGNAL( clicked() ), soundHandler, SLOT( removeSound() ) ); changeNameButton = new QPushButton; changeNameButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); changeNameButton->setFocusPolicy( Qt::NoFocus ); connect( changeNameButton, SIGNAL( clicked() ), soundHandler, SLOT( setSoundName() ) ); closeButton = new QPushButton; closeButton->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); closeButton->setIcon(QPixmap(closeicon)); closeButton->setFlat(true); connect(closeButton, SIGNAL(clicked()),this, SLOT(close()) ); soundsLabel = new QLabel; soundsList = new QListWidget; grid->addWidget( soundsLabel, 0, 1 ); grid->addWidget( addSoundButton, 1, 0 ); grid->addWidget( removeSoundsButton, 2, 0 ); grid->addWidget( changeNameButton, 3, 0 ); grid->addWidget( closeButton, 0, 2 ); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(soundsList); grid->addLayout( layout, 1, 1, 3, 2); grid->setColumnStretch(1, 1); setLayout(grid); soundHandler->setSoundsList(soundsList); } void FramePreferencesMenu::open() { soundsList->clear(); int activeFrame = frameBar->getActiveFrame(); int activeScene = frameBar->getActiveScene(); DomainFacade* facade = DomainFacade::getFacade(); int numSounds = facade->getNumberOfSounds(activeScene, activeFrame); for (int i = 0; i < numSounds; ++i) { const char* soundName = facade->getSoundName( activeScene, activeFrame, i); if (soundName) soundsList->addItem(new QListWidgetItem(soundName)); } show(); } void FramePreferencesMenu::close() { MenuFrame::close((QWidget*)parent()); } void FramePreferencesMenu::retranslateStrings() { addSoundButton->setText( tr("Add &sound")); removeSoundsButton->setText(tr("&Remove Sound")); changeNameButton->setText( tr("Change name")); soundsLabel->setText( tr("Sounds:")); QString infoText = tr("

Add sound

" "

With this button you can add sounds to the selected frame.

" "

The sound will begin playing when this frame is shown and play " "until it is done.

"); addSoundButton->setToolTip(infoText); addSoundButton->setWhatsThis(infoText); infoText = tr("

Remove sound

" "

With this button you can remove the selected sound from " "this frame.

"); removeSoundsButton->setToolTip(infoText); removeSoundsButton->setWhatsThis(infoText); infoText = tr("

Change name

" "

With this button you can change the name of the selected sound. " "
The name of the sound has no other effect than making it easier " "work with the animation.

"); changeNameButton->setToolTip(infoText); changeNameButton->setWhatsThis(infoText); infoText = tr("

Sounds

" "

This lists shows all the sounds connected to this frame.

" "

The sounds will begin playing when this frame is shown and play " "until they are done.

"); soundsLabel->setToolTip(infoText); soundsList->setWhatsThis(infoText); } FramePreferencesMenu::~FramePreferencesMenu() { } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/framepreferencesmenu.h000066400000000000000000000055231234321124500277760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FRAMEPREFERENCESMENU_H #define FRAMEPREFERENCESMENU_H #include "menuframe.h" #include #include #include #include #include class SoundHandler; class FrameBar; /** * A customized GUI menu class for the frame preferences menu. * * Inherits from MenuFrame but adds some functionality around loading the * present preferences when opened. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class FramePreferencesMenu : public MenuFrame { Q_OBJECT public: /** * Creates and sets up the preferences menu. * @param parent the parent widget * @param soundHandler the sound handler * @param frameBar The frame bar. * @param name the name of the menu */ FramePreferencesMenu( QWidget * parent = 0, SoundHandler *soundHandler = 0, const FrameBar *frameBar = 0, const char * name = 0); virtual ~FramePreferencesMenu(); /** * Retranslates the strings in the frame preferences menu. */ void retranslateStrings(); private: SoundHandler *soundHandler; const FrameBar *frameBar; QListWidget *soundsList; QLabel *soundsLabel; QPushButton *closeButton; QPushButton *addSoundButton; QPushButton *removeSoundsButton; QPushButton *changeNameButton; QGridLayout *grid; public slots: /** * Opens the menu. */ void open(); /** * Closes the menu and turns the focus to the newFocusWidget. */ void close(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/frameview.cpp000066400000000000000000000340421234321124500261130ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ // This widget is created from a widget in an example program for Qt. Available at // http://www.libsdl.org/cvs/qtSDL.tar.gz #include "src/foundation/preferencestool.h" #include "src/technical/grabber/commandlinegrabber.h" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/imagegrabthread.h" #include "src/presentation/frontends/qtfrontend/qtfrontend.h" #include #include #include #include #if defined(Q_WS_X11) #include #endif #include #include #include #include enum { IMAGE_CACHE_SIZE = 10 }; FrameView::FrameView(QWidget *parent, const char *name, int playbackSpeed) : QWidget(parent), screen(0), videoSurface(0), imageCache(IMAGE_CACHE_SIZE), grabThread(0), grabber(0), capturedFile(WorkspaceFile::capturedImage) { facade = DomainFacade::getFacade(); isPlayingVideo = false; widthConst = 4; heightConst = 3; mode = imageModeMix; this->playbackSpeed = PreferencesTool::get()->getPreference("fps", playbackSpeed); activeScene = -1; activeFrame = -1; mixCount = 2; connect(&grabTimer, SIGNAL(timeout()), this, SLOT(redraw())); connect(&playbackTimer, SIGNAL(timeout()),this, SLOT(nextPlayBack())); setNormalRatio(); setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_NoSystemBackground); setObjectName(name); Logger::get().logDebug("FrameView is attatched to the model and the model to FrameView"); } FrameView::~FrameView() { // Turn off camera if it's on if (isPlayingVideo) { off(); } if (videoSurface) { SDL_FreeSurface(videoSurface); videoSurface = 0; } // Freeing resources allocated to SDL and shutdown SDL_Quit(); delete grabber; grabber = 0; } void FrameView::setWidescreenRatio() { widthConst = 16; heightConst = 9; float minWidth = 300 * (16 / 9); this->setMinimumSize( (int)minWidth, 300); this->update(); } void FrameView::setNormalRatio() { widthConst = 4; heightConst = 3; this->setMinimumSize(400, 300); this->update(); } void FrameView::initCompleted() { emit cameraReady(); } void FrameView::updateNewActiveFrame(int sceneNumber, int frameNumber) { setActiveFrame(sceneNumber, frameNumber); } void FrameView::updatePlayFrame(int sceneNumber, int frameNumber) { if (frameNumber > -1) { setActiveFrame(sceneNumber, frameNumber); } else { SDL_FreeSurface(videoSurface); videoSurface = 0; this->update(); } } void FrameView::workspaceCleared() { imageCache.clear(); } void FrameView::resizeEvent(QResizeEvent*) { QApplication::syncX(); // Set the new video mode with the new window size std::stringstream windowId; windowId << "0x" << std::hex << static_cast(winId()); std::string wid = windowId.str(); setenv("SDL_WINDOWID", wid.c_str(), 1); if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) { std::string msg("Unable to initialize SDL: "); msg.append( SDL_GetError() ); Logger::get().logFatal(msg.c_str()); } // The previously surface is automatically deleted by SDL screen = SDL_SetVideoMode(width(), height(), 0, SDL_DOUBLEBUF | SDL_SWSURFACE); if (!screen) { std::string msg("Unable to set video mode: "); msg.append( SDL_GetError() ); Logger::get().logFatal(msg.c_str()); } } void FrameView::drawOnionSkins() { static SDL_Surface *frameSurface = 0; DomainFacade* anim = DomainFacade::getFacade(); SDL_Rect dst; dst.x = (screen->w - videoSurface->w) >> 1; dst.y = (screen->h - videoSurface->h) >> 1; dst.w = videoSurface->w; dst.h = videoSurface->h; SDL_BlitSurface(videoSurface, 0, screen, &dst); if (isPlayingVideo && 0 <= activeScene) { switch (mode) { case 0: // Image mixing for (int i = 0; i != std::min(mixCount, activeFrame + 1); ++i) { const char* path = anim->getImagePath( activeScene, activeFrame - i); frameSurface = imageCache.get(path); if (frameSurface != 0) { SDL_Rect dst2; dst2.x = (screen->w - frameSurface->w) >> 1; dst2.y = (screen->h - frameSurface->h) >> 1; dst2.w = frameSurface->w; dst2.h = frameSurface->h; int alpha = 256 / (i + 2); SDL_SetAlpha(frameSurface, SDL_SRCALPHA, alpha); SDL_BlitSurface(frameSurface, 0, screen, &dst2); } } break; case 1: // Image differentiating if (0 <= activeFrame) { const char* path = anim->getImagePath(activeScene, activeFrame); SDL_Surface *last = imageCache.get(path); SDL_Surface *tmp = differentiateSurfaces(videoSurface, last); SDL_Rect dst; dst.x = (screen->w - tmp->w) >> 1; dst.y = (screen->h - tmp->h) >> 1; dst.w = tmp->w; dst.h = tmp->h; SDL_BlitSurface(tmp, 0, screen, &dst); SDL_FreeSurface(tmp); } break; default: break; } } } void FrameView::paintEvent(QPaintEvent *) { #if defined(Q_WS_X11) // Make sure we're not conflicting with drawing from the Qt library XSync(QX11Info::display(), FALSE); #endif if (screen) { SDL_FillRect(screen, 0, 0); if (videoSurface) { drawOnionSkins(); } SDL_Flip(screen); } } void FrameView::setActiveFrame(int sceneNumber, int frameNumber) { activeScene = sceneNumber; activeFrame = frameNumber; Logger::get().logDebug("Setting new active frame in FrameView"); const char *fileName = 0 <= sceneNumber && 0 <=frameNumber? facade->getImagePath(sceneNumber, frameNumber) : 0; if (videoSurface) { SDL_FreeSurface(videoSurface); videoSurface = 0; } if (fileName) { Logger::get().logDebug("Loading image"); videoSurface = IMG_Load(fileName); if (videoSurface == 0) { printf("IMG_Load: %s\n", IMG_GetError()); } Logger::get().logDebug("Loading image finished"); } else { Logger::get().logDebug("Failed to get image path from animation"); } this->update(); } // TODO: Refactor this terrible ugly method. This one is really bad!! bool FrameView::on() { PreferencesTool *prefs = PreferencesTool::get(); int activeCmd = prefs->getPreference("activedevice", 0); Preference prepoll(QString("importprepoll%1") .arg(activeCmd).toLatin1().constData(), ""); Preference startDaemon(QString("importstartdaemon%1") .arg(activeCmd).toLatin1().constData()); Preference stopDaemon(QString("importstopdaemon%1") .arg(activeCmd).toLatin1().constData(), ""); int activeDev = prefs->getPreference("activeVideoDevice", -1); if (activeDev <0) { QMessageBox::warning(this, tr("Warning"), tr( "No video device selected in the preferences menu."), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); return false; } Preference device(QString("device%1") .arg(activeDev).toLatin1().constData(), ""); QString pre = QString(prepoll.get()).replace("$VIDEODEVICE", device.get()); bool isProcess = startDaemon.get(); bool isCameraReady = true; this->grabber = new CommandLineGrabber(capturedFile.path(), isProcess); if ( !grabber->setPrePollCommand(pre.toLatin1().constData()) ) { QMessageBox::warning(this, tr("Warning"), tr( "Pre poll command does not exists"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); //return false; isCameraReady = false; } if (isProcess) { QString sd = QString(startDaemon.get()).replace("$VIDEODEVICE", device.get()); if ( !grabber->setStartCommand(sd.toLatin1().constData()) ) { DomainFacade::getFacade()->getFrontend()->hideProgress(); QMessageBox::warning(this, tr("Warning"), tr( "You do not have the given grabber installed on your system"), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); isCameraReady = false; //return false; } } grabber->setStopCommand(stopDaemon.get()); if (!isCameraReady) { return false; } this->initCompleted(); this->isPlayingVideo = true; if ( prefs->getPreference("numberofimports", 1) > 0 ) { // If the grabber is running in it's own process we use a timer. if (grabber->isGrabberProcess() == true) { if ( grabber->init() ) { grabTimer.start(150); } else { QMessageBox::warning(this, tr("Warning"), tr( "Grabbing failed. This may happen if you try\n" "to grab from an invalid device. Please check\n" "your grabber settings in the preferences menu."), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); return false; } } // Otherwise a thread is needed else { grabThread = new ImageGrabThread(this, grabber); connect(grabThread, SIGNAL(grabbed()), this, SLOT(redraw())); grabThread->start(); grabThread->wait(500); if (grabThread->wasGrabbingSuccess() == false) { QMessageBox::warning(this, tr("Warning"), tr( "Grabbing failed. This may happen if you try\n" "to grab from an invalid device. Please check\n" "your grabber settings in the preferences menu."), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); return false; } } } else { QMessageBox::warning(this, tr("Warning"), tr( "You have to define an image grabber to use.\n" "This can be set in the preferences menu."), QMessageBox::Ok, Qt::NoButton, Qt::NoButton); return false; } return true; } void FrameView::off() { if ( grabber != 0 ) { if ( grabber->isGrabberProcess() ) { grabber->tearDown(); grabTimer.stop(); playbackTimer.stop(); } delete grabber; grabber = 0; } if (grabThread != 0) { grabThread->terminate(); grabThread->wait(); delete grabThread; grabThread = 0; } this->isPlayingVideo = false; setActiveFrame(activeScene, activeFrame); this->update(); } void FrameView::redraw() { if (videoSurface) { SDL_FreeSurface(videoSurface); videoSurface = 0; } videoSurface = IMG_Load(capturedFile.path()); this->update(); } void FrameView::nextPlayBack() { //TODO re-write this vile function static int i = 0; // Need to check that there is an active scene before checking // what its size is. if (0 <= activeScene) { if (i < mixCount && i < activeFrame + 1) { const char *path = activeFrame <= mixCount? facade->getImagePath(activeScene, i) : facade->getImagePath(activeScene, activeFrame - mixCount + i); ++i; if (videoSurface) { SDL_FreeSurface(videoSurface); videoSurface = 0; } if (path) videoSurface = IMG_Load(path); this->update(); //Exit from function/skip redraw(). This is better than having a bool which is //set because this is a play function run "often". return; } } // This code is run if one of the two above tests fail. Can't be an else because // then I would have to have two such elses, and I think the return is better. i = 0; redraw(); } bool FrameView::setViewMode(ImageMode mode) { if (mode == this->mode) return true; if (mode == imageModePlayback) { if ( grabber->isGrabberProcess() ) { grabTimer.stop(); playbackTimer.start(1000/playbackSpeed); } else { return false; } } else if (mode != imageModePlayback) { if ( grabber->isGrabberProcess() ) { playbackTimer.stop(); grabTimer.start(150); } } this->mode = mode; return true; } void FrameView::setMixCount(int mixCount) { this->mixCount = mixCount; } int FrameView::getViewMode() const { return mode; } void FrameView::setPlaybackSpeed(int playbackSpeed) { this->playbackSpeed = playbackSpeed; if ( playbackTimer.isActive() ) { playbackTimer.setInterval(1000 / playbackSpeed); } } // The only thing left which is a little expensive is the MapRGB function. SDL_Surface* FrameView::differentiateSurfaces(SDL_Surface *s1, SDL_Surface *s2) { int width = s2->w; int height = s2->h; SDL_Surface *diffSurface = SDL_CreateRGBSurface( SDL_SWSURFACE, width, height, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff); // Lock the surfaces before working with the pixels SDL_LockSurface(s1); SDL_LockSurface(s2); SDL_LockSurface(diffSurface); // Pointers to the first byte of the first pixel on the input surfaces. Uint8 *p1 = static_cast(s1->pixels); Uint8 *p2 = static_cast(s2->pixels); // Pointers to the first pixel on the resulting surface Uint32 *pDiff = static_cast(diffSurface->pixels); SDL_PixelFormat fDiff = *diffSurface->format; Uint32 differencePixel; Uint8 dr, dg, db; // Goes through the surfaces as one-dimensional arrays. int offset = 0, pixelOffset = 0; for (int i = 0; i < height; ++i) { for (int j = 1; j < width; ++j) { dr = abs(p1[offset ] - p2[offset ]); dg = abs(p1[offset + 1] - p2[offset + 1]); db = abs(p1[offset + 2] - p2[offset + 2]); differencePixel = SDL_MapRGB(&fDiff, dr, dg, db); pDiff[pixelOffset++] = differencePixel; offset += 3; } ++pixelOffset; offset += 3; } // Unlock the surfaces for displaying them. SDL_UnlockSurface(s1); SDL_UnlockSurface(s2); SDL_UnlockSurface(diffSurface); return diffSurface; } void FrameView::fileChanged(const QString& path) { const char* p = path.toLocal8Bit(); imageCache.drop(p); if (isPlayingVideo && 0 <= activeScene) { drawOnionSkins(); } } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/frameview.h000066400000000000000000000126011234321124500255550ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FRAMEVIEW_H #define FRAMEVIEW_H #include "src/presentation/imagecache.h" #include "src/domain/animation/workspacefile.h" #include #include class ImageGrabThread; struct SDL_Surface; class QResizeEvent; class QPaintEvent; class ImageGrabThread; class ImageGrabber; class DomainFacade; /** * Widget for viewing the frames in the animation using SDL. This widget also * serves as videoview widget for displaying video from an external source * by grabbing through the harddrive. */ class FrameView : public QWidget { Q_OBJECT public: enum ImageMode { imageModeMix, imageModeDiff, imageModePlayback }; /** * Creates and initializes the frameview. * @param parent the parent widget. * @param name the name of this widget. * @param playbackSpeed which speed the playback has to be played in if * the playback mode is choosen */ FrameView(QWidget *parent=0, const char *name=0, int playbackSpeed = 10); /** * Cleans up after the frameview. */ ~FrameView(); /** * Sets the view to 4:3 format. */ void setWidescreenRatio(); /** * Sets the view to 16:9 format. */ void setNormalRatio(); void initCompleted(); /** * Sets the viewing mode/type of effect used when displaying the video. * @param mode the type of effect to be showed on the video. The modes are:\n * 0: Image mixing/onion skinning\n * 1: Image differentiating\n * 2: Playback\n * @return true if the mode was succesfully changed */ bool setViewMode(ImageMode mode); void setMixCount(int mixCount); /** * Returns the view mode. * @return the view mode. */ int getViewMode() const; /** * Sets the speed for the playback. * @param playbackSpeed the speed to be setted */ void setPlaybackSpeed(int playbackSpeed); signals: void cameraReady(); public slots: /** * Turns on the webcamera/video import mode. */ bool on(); /** * Turns off the webcamera/video import mode. */ void off(); /** * Draws the next frame from the camera. */ void redraw(); /** * Function for performing playbacks. Will call redraw with regular intervals. */ void nextPlayBack(); /** * Receives notification when a new frame is selected. */ void updateNewActiveFrame(int scene, int frame); /** * Receives notification when a frame is to be played. */ void updatePlayFrame(int scene, int frame); /** * Receives notification when a frame has been edited outside of this * application. */ void fileChanged(const QString &path); /** * Receives notification that the files in the workspace have changed. */ void workspaceCleared(); protected: void resizeEvent(QResizeEvent *); void paintEvent(QPaintEvent *); private: static const int alphaLut[5]; SDL_Surface *screen; SDL_Surface *videoSurface; ImageCache imageCache; QTimer grabTimer; QTimer playbackTimer; ImageGrabThread *grabThread; ImageGrabber *grabber; WorkspaceFile capturedFile; /** The facade cached away in this class for efficiency reasons */ DomainFacade *facade; /** Is the frame view showing the camera output? */ bool isPlayingVideo; int widthConst, heightConst; ImageMode mode; int playbackSpeed; int activeScene; int activeFrame; int mixCount; /** * Loads the new active frames picture into the frameview. * @param sceneNumber The scene that the active frame belongs to. * @param frameNumber The frame within the scene that is to be active. */ void setActiveFrame(int sceneNumber, int frameNumber); /** * Highly tweaked/optimized homemade function for taking the rgb differences * between two surfaces. * * deltaRed = abs(r1 - r2), deltaGreen = abs(g1 - g2), deltaBlue = abs(b1 - b2) * for all pixels. * * @param s1 the first surface of the two to differentiate. * @param s2 the second surface of the two to differentiate. * @return a surface with the rgb difference of s1 and s2. */ SDL_Surface* differentiateSurfaces(SDL_Surface *s1, SDL_Surface *s2); void drawOnionSkins(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/helpbrowser.ui000066400000000000000000000114561234321124500263210ustar00rootroot00000000000000 MainWindow 0 0 800 600 Stopmotion Help Browser 9 6 0 6 false Backward false Forward 0 6 Qt::Horizontal 40 20 Close true 0 0 800 29 0 576 800 24 pushButton_2 clicked() textBrowser backward() 34 62 33 104 pushButton_3 clicked() textBrowser forward() 81 63 77 93 pushButton clicked() MainWindow close() 772 552 706 549 textBrowser backwardAvailable(bool) pushButton_2 setEnabled(bool) 15 123 17 62 textBrowser forwardAvailable(bool) pushButton_3 setEnabled(bool) 93 111 88 50 textBrowser highlighted(QString) lineEdit setText(QString) 273 119 279 59 stopmotion-0.8.0/src/presentation/frontends/qtfrontend/helpwindow.cpp000066400000000000000000000032311234321124500263020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "helpwindow.h" #include "src/config.h" HelpWindow::HelpWindow(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); ui.textBrowser->setSource(QUrl( QString(stopmotion::htmlDirectory) + "/index.html" )); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/helpwindow.h000066400000000000000000000032061234321124500257510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef HELPWINDOW_H #define HELPWINDOW_H #include "ui_helpbrowser.h" class HelpWindow : public QMainWindow { Q_OBJECT public: HelpWindow(QWidget *parent = 0); private: Ui::MainWindow ui; }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/imagegrabthread.cpp000066400000000000000000000036361234321124500272410ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "imagegrabthread.h" #include ImageGrabThread::ImageGrabThread(FrameView *frameView, ImageGrabber *grabber) : frameView(frameView), grabber(grabber) { wasGrabSuccess = true; } void ImageGrabThread::run() { //Don't want the frameview to update unless the grabbing worked. while (true) { wasGrabSuccess = grabber->grab(); if (!wasGrabSuccess) { break; } emit grabbed(); } } bool ImageGrabThread::wasGrabbingSuccess() { return wasGrabSuccess; } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/imagegrabthread.h000066400000000000000000000051211234321124500266750ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef IMAGEGRABTHREAD_H #define IMAGEGRABTHREAD_H #include "src/presentation/frontends/qtfrontend/frameview.h" #include "src/technical/grabber/imagegrabber.h" #include class FrameView; /** * Thread used for polling an external program to update the camera. Only * used for polling, not for when the camera is running in daemon mode. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ImageGrabThread : public QThread { Q_OBJECT public: /** * Constructs and initializes the object. * @param frameView the frame view to be used for displaying images * @param grabber the grabber to use be used for grabbing images */ ImageGrabThread(FrameView *frameView, ImageGrabber *grabber); /** * Displays the images grabbed with the registered grabber. These * are displayed one after one and it looks like we are streaming * live from the camera. */ void run(); /** * Checks if last grabbing was successfull. * @return true if last grabbing was success, false otherwise */ bool wasGrabbingSuccess(); signals: void grabbed(); private: FrameView *frameView; ImageGrabber *grabber; bool wasGrabSuccess; }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/importtab.cpp000066400000000000000000000305031234321124500261250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "importtab.h" #include "flexiblelineedit.h" #include "graphics/icons/close.xpm" #include #include #include #include ImportTab::ImportTab( QWidget *parent ) : QWidget(parent) { deviceSelectionTable = 0; addButton = 0; removeButton = 0; changeButton = 0; closeChangeBoxButton = 0; prePollEdit = 0; startDaemonEdit = 0; stopDaemonEdit = 0; grabberPreferences = 0; prePollLabel = 0; startDaemonLabel = 0; stopDaemonLabel = 0; checkTableItem = 0; informationText = 0; makeGUI(); } void ImportTab::makeGUI() { this->setFocusPolicy(Qt::ClickFocus); informationText = new QTextEdit; informationText->setReadOnly(true); informationText->setHtml( "

" + tr("Below you can set which program/process Stopmotion should use " "for grabbing images from the selected device.") + "

" + tr("You should always use $VIDEODEVICE and $IMAGEFILE to represent " "the video device and the image file, respectively.") + "

"); informationText->setMinimumWidth(440); informationText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QStringList lst; lst << tr("Name") << tr("Description"); deviceSelectionTable = new QTableWidget; deviceSelectionTable->setColumnCount(2); deviceSelectionTable->setRowCount(0); deviceSelectionTable->setSelectionMode(QAbstractItemView::SingleSelection); deviceSelectionTable->setSelectionBehavior(QAbstractItemView::SelectRows); deviceSelectionTable->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred); deviceSelectionTable->setHorizontalHeaderLabels(lst); deviceSelectionTable->verticalHeader()->setVisible(false); connect(deviceSelectionTable, SIGNAL(cellClicked(int, int)), this, SLOT(activeCellChanged(int, int))); connect(deviceSelectionTable, SIGNAL(cellChanged(int, int)), this, SLOT(contentsChanged(int, int))); addButton = new QPushButton(tr("&Add")); addButton->setFocusPolicy( Qt::NoFocus ); QObject::connect(addButton, SIGNAL(clicked()), this, SLOT(addImportProgram())); removeButton = new QPushButton(tr("&Remove")); QObject::connect( removeButton, SIGNAL(clicked()), this, SLOT(removeImportProgram())); changeButton = new QPushButton(tr("&Edit")); QObject::connect( changeButton, SIGNAL(clicked()), this, SLOT(changeSettings())); grabberPreferences = new QGroupBox; grabberPreferences->setTitle(tr("Import device settings")); grabberPreferences->hide(); closeChangeBoxButton = new QPushButton; closeChangeBoxButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); closeChangeBoxButton->setIcon(QPixmap(closeicon)); closeChangeBoxButton->setFlat(true); QObject::connect( closeChangeBoxButton, SIGNAL(clicked()),this, SLOT(closeChangeBox())); prePollLabel = new QLabel( tr("Pre-poll command") ); prePollEdit = new FlexibleLineEdit; prePollLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); prePollEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QObject::connect( prePollEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updatePrePollString(const QString &))); startDaemonLabel = new QLabel( tr("Start daemon") ); startDaemonEdit = new FlexibleLineEdit; startDaemonLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); startDaemonEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QObject::connect( startDaemonEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateStartDaemonString(const QString &))); stopDaemonLabel = new QLabel( tr("Stop daemon") ); stopDaemonEdit = new FlexibleLineEdit; stopDaemonLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); stopDaemonEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QObject::connect( stopDaemonEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updatestopDaemonString(const QString &)) ); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(informationText); QVBoxLayout *buttonLayout = new QVBoxLayout; buttonLayout->setMargin(0); buttonLayout->setSpacing(2); buttonLayout->addStretch(1); buttonLayout->addWidget(addButton); buttonLayout->addWidget(removeButton); buttonLayout->addWidget(changeButton); QHBoxLayout *deviceLayout = new QHBoxLayout; deviceLayout->addWidget(deviceSelectionTable); deviceLayout->addLayout(buttonLayout); mainLayout->addLayout(deviceLayout); mainLayout->addWidget(grabberPreferences); setLayout(mainLayout); QGridLayout *grabberPrefsLayout = new QGridLayout; grabberPrefsLayout->addWidget(closeChangeBoxButton, 0, 2, Qt::AlignLeading); grabberPrefsLayout->addWidget(prePollLabel, 0, 0, Qt::AlignTrailing); grabberPrefsLayout->addWidget(prePollEdit, 0, 1, 0); grabberPrefsLayout->addWidget(startDaemonLabel, 1, 0, Qt::AlignLeading); grabberPrefsLayout->addWidget(startDaemonEdit, 1, 1, 1, 2, 0); grabberPrefsLayout->addWidget(stopDaemonLabel, 2, 0, Qt::AlignLeading); grabberPrefsLayout->addWidget(stopDaemonEdit, 2, 1, 1, 2, 0); grabberPrefsLayout->setColumnStretch(1, 1); grabberPreferences->setLayout(grabberPrefsLayout); } void ImportTab::initializeImportValues() { PreferencesTool* pref = PreferencesTool::get(); int numImports = pref->getPreference("numberofimports", 0); deviceSelectionTable->setRowCount(numImports); for (int i = 0; i < numImports; ++i) { Preference name(QString("importname%1").arg(i).toLatin1().constData(), ""); deviceSelectionTable->setItem( i, 0, new QTableWidgetItem(name.get()) ); Preference desc(QString("importdescription%1").arg(i).toLatin1().constData(), ""); deviceSelectionTable->setItem( i, 1, new QTableWidgetItem(desc.get()) ); Preference prepoll(QString("importprepoll%1").arg(i).toLatin1().constData(), ""); prePollStrings.push_back(QString(prepoll.get())); Preference start(QString("importstartdaemon%1").arg(i).toLatin1().constData(), ""); startDaemonStrings.push_back(QString(start.get())); Preference stop(QString("importstopdaemon%1").arg(i).toLatin1().constData(), ""); stopDaemonStrings.push_back(QString(stop.get())); } int activeCommand = pref->getPreference("activedevice", -1); if (activeCommand > -1) { deviceSelectionTable->setCurrentCell(activeCommand, 0); } } void ImportTab::apply() { PreferencesTool *prefs = PreferencesTool::get(); // Remove old preferences int numImports = prefs->getPreference("numberofimports", -1); if (numImports > 0) { for (int i = 0; i < numImports; ++i) { prefs->removePreference(QString("importname%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("importdescription%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("importprepoll%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("importstartdaemon%1").arg(i).toLatin1().constData()); prefs->removePreference(QString("importstopdaemon%1").arg(i).toLatin1().constData()); } } numImports = deviceSelectionTable->rowCount(); if (numImports > 0) { prefs->setPreference("numberofimports", numImports, true); prefs->setPreference("activedevice", deviceSelectionTable->currentRow(), true); for (int i = 0; i < numImports; ++i) { prefs->setPreference(QString("importname%1").arg(i).toLatin1().constData(), deviceSelectionTable->item(i, 0)->text().toLatin1().constData(), true); prefs->setPreference(QString("importdescription%1").arg(i).toLatin1().constData(), deviceSelectionTable->item(i, 1)->text().toLatin1().constData(), true); prefs->setPreference(QString("importprepoll%1").arg(i).toLatin1().constData(), prePollStrings[i].toLatin1().constData(), true); prefs->setPreference(QString("importstartdaemon%1").arg(i).toLatin1().constData(), startDaemonStrings[i].toLatin1().constData(), true); prefs->setPreference(QString("importstopdaemon%1").arg(i).toLatin1().constData(), stopDaemonStrings[i].toLatin1().constData(), true); } } else { prefs->setPreference("numberofimports", -1, true); prefs->setPreference("activedevice", -1, true); } } void ImportTab::resizeEvent(QResizeEvent *event) { contentsChanged(0, 0); QWidget::resizeEvent(event); } void ImportTab::addImportProgram() { int newRow = deviceSelectionTable->rowCount(); deviceSelectionTable->setRowCount(newRow + 1); deviceSelectionTable->setItem( newRow, 0, new QTableWidgetItem(QString("")) ); deviceSelectionTable->setItem( newRow, 1, new QTableWidgetItem(QString("")) ); deviceSelectionTable->setCurrentCell(newRow, 0); prePollStrings.push_back(""); startDaemonStrings.push_back(""); stopDaemonStrings.push_back(""); } void ImportTab::removeImportProgram() { int selectedRow = deviceSelectionTable->currentRow(); if (selectedRow >= 0) { prePollStrings.erase(prePollStrings.begin() + selectedRow); startDaemonStrings.erase(startDaemonStrings.begin() + selectedRow); stopDaemonStrings.erase(stopDaemonStrings.begin() + selectedRow); deviceSelectionTable->removeRow(selectedRow); contentsChanged(0, 0); } } void ImportTab::contentsChanged(int, int) { deviceSelectionTable->resizeColumnsToContents(); int totalWidth = deviceSelectionTable->columnWidth(0) + deviceSelectionTable->columnWidth(1); int tableWidth = deviceSelectionTable->width() - 5; if ( totalWidth < tableWidth) { deviceSelectionTable->setColumnWidth( 1, tableWidth - deviceSelectionTable->columnWidth(0) ); } } void ImportTab::activeCellChanged(int, int) { if ( grabberPreferences->isVisible() ) { changeSettings(); } } void ImportTab::changeSettings() { int selected = deviceSelectionTable->currentRow(); if (selected >= 0) { prePollEdit->setText(prePollStrings[selected]); startDaemonEdit->setText(startDaemonStrings[selected]); stopDaemonEdit->setText(stopDaemonStrings[selected]); grabberPreferences->show(); } } void ImportTab::updatePrePollString(const QString &txt) { prePollStrings[deviceSelectionTable->currentRow()] = txt; } void ImportTab::updateStartDaemonString(const QString &txt) { startDaemonStrings[deviceSelectionTable->currentRow()] = txt; } void ImportTab::updatestopDaemonString(const QString &txt) { stopDaemonStrings[deviceSelectionTable->currentRow()] = txt; } void ImportTab::closeChangeBox() { grabberPreferences->hide(); this->resize(minimumSize()); } void ImportTab::retranslateStrings() { informationText->setHtml( "

" + tr("Below you can set which program/process Stopmotion should use " "for grabbing images from the selected device.") + "

" + tr("You should always use $VIDEODEVICE and $IMAGEFILE to represent " "the video device and the image file, respectively.") + "

"); QStringList lst; lst << tr("Name") << tr("Description"); deviceSelectionTable->setHorizontalHeaderLabels(lst); addButton->setText( tr("&Add") ); removeButton->setText( tr("&Remove") ); changeButton->setText( tr("&Edit") ); grabberPreferences->setTitle( tr("Import device settings") ); prePollLabel->setText( tr("Pre-poll command") ); startDaemonLabel->setText( tr("Start daemon") ); stopDaemonLabel->setText( tr("Stop daemon") ); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/importtab.h000066400000000000000000000063111234321124500255720ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef IMPORTTAB_H #define IMPORTTAB_H #include "src/foundation/preferencestool.h" #include #include #include #include #include #include #include #include #include using namespace std; /** * The import tab in the preferences menu. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ImportTab : public QWidget { Q_OBJECT public: /** * Sets up the import tab. * @param parent the parent of the widget. */ ImportTab( QWidget *parent = 0 ); /** * Sets up the gui for the tab and connects the buttons. */ void makeGUI(); /** * Initializes the table and fills it with starting values. */ void initializeImportValues(); /** * Applies the settings in the import tab. */ void apply(); void retranslateStrings(); protected: void resizeEvent(QResizeEvent *event); private slots: void addImportProgram(); void removeImportProgram(); void contentsChanged(int row, int column); void activeCellChanged(int row, int column); void changeSettings(); void closeChangeBox(); void updatePrePollString(const QString &txt); void updateStartDaemonString(const QString &txt); void updatestopDaemonString(const QString &txt); private: vectorprePollStrings; vectorstartDaemonStrings; vectorstopDaemonStrings; QTableWidget *deviceSelectionTable; QPushButton *addButton; QPushButton *removeButton; QPushButton *changeButton; QPushButton *closeChangeBoxButton; QLineEdit *prePollEdit; QLineEdit *startDaemonEdit; QLineEdit *stopDaemonEdit; QGroupBox *grabberPreferences; QLabel *prePollLabel; QLabel *startDaemonLabel; QLabel *stopDaemonLabel; QTableWidgetItem *checkTableItem; QTextEdit *informationText; }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/licence.h000066400000000000000000000461171234321124500252030ustar00rootroot00000000000000QString licence = "(c) 2005-2008, Fredrik Berg Kjlstad and Bjrn Erik Nilsen\n" "\n" "This program is distributed under the terms of the GPL v2.\n" "\n" " GNU GENERAL PUBLIC LICENSE\n" " Version 2, June 1991\n" "\n" " Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n" " 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" " Everyone is permitted to copy and distribute verbatim copies\n" " of this license document, but changing it is not allowed.\n" "" " Preamble\n" "\n" " The licenses for most software are designed to take away your\n" "freedom to share and change it. By contrast, the GNU General Public\n" "License is intended to guarantee your freedom to share and change free\n" "software--to make sure the software is free for all its users. This\n" "General Public License applies to most of the Free Software\n" "Foundation's software and to any other program whose authors commit to\n" "using it. (Some other Free Software Foundation software is covered by\n" "the GNU Library General Public License instead.) You can apply it to\n" "your programs, too.\n" "\n" " When we speak of free software, we are referring to freedom, not\n" "price. Our General Public Licenses are designed to make sure that you\n" "have the freedom to distribute copies of free software (and charge for\n" "this service if you wish), that you receive source code or can get it\n" "if you want it, that you can change the software or use pieces of it\n" "in new free programs; and that you know you can do these things.\n" "\n" " To protect your rights, we need to make restrictions that forbid\n" "anyone to deny you these rights or to ask you to surrender the rights.\n" "These restrictions translate to certain responsibilities for you if you\n" "distribute copies of the software, or if you modify it.\n" "\n" " For example, if you distribute copies of such a program, whether\n" "gratis or for a fee, you must give the recipients all the rights that\n" "you have. You must make sure that they, too, receive or can get the\n" "source code. And you must show them these terms so they know their\n" "rights.\n" "\n" " We protect your rights with two steps: (1) copyright the software, and\n" "(2) offer you this license which gives you legal permission to copy,\n" "distribute and/or modify the software.\n" "\n" " Also, for each author's protection and ours, we want to make certain\n" "that everyone understands that there is no warranty for this free\n" "software. If the software is modified by someone else and passed on, we\n" "want its recipients to know that what they have is not the original, so\n" "that any problems introduced by others will not reflect on the original\n" "authors' reputations.\n" "\n" " Finally, any free program is threatened constantly by software\n" "patents. We wish to avoid the danger that redistributors of a free\n" "program will individually obtain patent licenses, in effect making the\n" "program proprietary. To prevent this, we have made it clear that any\n" "patent must be licensed for everyone's free use or not licensed at all.\n" "\n" " The precise terms and conditions for copying, distribution and\n" "modification follow.\n" "\n" " GNU GENERAL PUBLIC LICENSE\n" " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n" "\n" " 0. This License applies to any program or other work which contains\n" "a notice placed by the copyright holder saying it may be distributed\n" "under the terms of this General Public License. The \"Program\", below,\n" "refers to any such program or work, and a \"work based on the Program\"\n" "means either the Program or any derivative work under copyright law:\n" "that is to say, a work containing the Program or a portion of it,\n" "either verbatim or with modifications and/or translated into another\n" "language. (Hereinafter, translation is included without limitation in\n" "the term \"modification\".) Each licensee is addressed as \"you\".\n" "\n" "Activities other than copying, distribution and modification are not\n" "covered by this License; they are outside its scope. The act of\n" "running the Program is not restricted, and the output from the Program\n" "is covered only if its contents constitute a work based on the\n" "Program (independent of having been made by running the Program).\n" "Whether that is true depends on what the Program does.\n" "\n" " 1. You may copy and distribute verbatim copies of the Program's\n" "source code as you receive it, in any medium, provided that you\n" "conspicuously and appropriately publish on each copy an appropriate\n" "copyright notice and disclaimer of warranty; keep intact all the\n" "notices that refer to this License and to the absence of any warranty;\n" "and give any other recipients of the Program a copy of this License\n" "along with the Program.\n" "\n" "You may charge a fee for the physical act of transferring a copy, and\n" "you may at your option offer warranty protection in exchange for a fee.\n" "\n" " 2. You may modify your copy or copies of the Program or any portion\n" "of it, thus forming a work based on the Program, and copy and\n" "distribute such modifications or work under the terms of Section 1\n" "above, provided that you also meet all of these conditions:\n" "\n" " a) You must cause the modified files to carry prominent notices\n" " stating that you changed the files and the date of any change.\n" "\n" " b) You must cause any work that you distribute or publish, that in\n" " whole or in part contains or is derived from the Program or any\n" " part thereof, to be licensed as a whole at no charge to all third\n" " parties under the terms of this License.\n" "\n" " c) If the modified program normally reads commands interactively\n" " when run, you must cause it, when started running for such\n" " interactive use in the most ordinary way, to print or display an\n" " announcement including an appropriate copyright notice and a\n" " notice that there is no warranty (or else, saying that you provide\n" " a warranty) and that users may redistribute the program under\n" " these conditions, and telling the user how to view a copy of this\n" " License. (Exception: if the Program itself is interactive but\n" " does not normally print such an announcement, your work based on\n" " the Program is not required to print an announcement.)\n" "\n" "These requirements apply to the modified work as a whole. If\n" "identifiable sections of that work are not derived from the Program,\n" "and can be reasonably considered independent and separate works in\n" "themselves, then this License, and its terms, do not apply to those\n" "sections when you distribute them as separate works. But when you\n" "distribute the same sections as part of a whole which is a work based\n" "on the Program, the distribution of the whole must be on the terms of\n" "this License, whose permissions for other licensees extend to the\n" "entire whole, and thus to each and every part regardless of who wrote it.\n" "\n" "Thus, it is not the intent of this section to claim rights or contest\n" "your rights to work written entirely by you; rather, the intent is to\n" "exercise the right to control the distribution of derivative or\n" "collective works based on the Program.\n" "\n" "In addition, mere aggregation of another work not based on the Program\n" "with the Program (or with a work based on the Program) on a volume of\n" "a storage or distribution medium does not bring the other work under\n" "the scope of this License.\n" "\n" " 3. You may copy and distribute the Program (or a work based on it,\n" "under Section 2) in object code or executable form under the terms of\n" "Sections 1 and 2 above provided that you also do one of the following:\n" "\n" " a) Accompany it with the complete corresponding machine-readable\n" " source code, which must be distributed under the terms of Sections\n" " 1 and 2 above on a medium customarily used for software interchange; or,\n" "\n" " b) Accompany it with a written offer, valid for at least three\n" " years, to give any third party, for a charge no more than your\n" " cost of physically performing source distribution, a complete\n" " machine-readable copy of the corresponding source code, to be\n" " distributed under the terms of Sections 1 and 2 above on a medium\n" " customarily used for software interchange; or,\n" "\n" " c) Accompany it with the information you received as to the offer\n" " to distribute corresponding source code. (This alternative is\n" " allowed only for noncommercial distribution and only if you\n" " received the program in object code or executable form with such\n" " an offer, in accord with Subsection b above.)\n" "\n" "The source code for a work means the preferred form of the work for\n" "making modifications to it. For an executable work, complete source\n" "code means all the source code for all modules it contains, plus any\n" "associated interface definition files, plus the scripts used to\n" "control compilation and installation of the executable. However, as a\n" "special exception, the source code distributed need not include\n" "anything that is normally distributed (in either source or binary\n" "form) with the major components (compiler, kernel, and so on) of the\n" "operating system on which the executable runs, unless that component\n" "itself accompanies the executable.\n" "\n" "If distribution of executable or object code is made by offering\n" "access to copy from a designated place, then offering equivalent\n" "access to copy the source code from the same place counts as\n" "distribution of the source code, even though third parties are not\n" "compelled to copy the source along with the object code.\n" "\n" " 4. You may not copy, modify, sublicense, or distribute the Program\n" "except as expressly provided under this License. Any attempt\n" "otherwise to copy, modify, sublicense or distribute the Program is\n" "void, and will automatically terminate your rights under this License.\n" "However, parties who have received copies, or rights, from you under\n" "this License will not have their licenses terminated so long as such\n" "parties remain in full compliance.\n" "\n" " 5. You are not required to accept this License, since you have not\n" "signed it. However, nothing else grants you permission to modify or\n" "distribute the Program or its derivative works. These actions are\n" "prohibited by law if you do not accept this License. Therefore, by\n" "modifying or distributing the Program (or any work based on the\n" "Program), you indicate your acceptance of this License to do so, and\n" "all its terms and conditions for copying, distributing or modifying\n" "the Program or works based on it.\n" "\n" " 6. Each time you redistribute the Program (or any work based on the\n" "Program), the recipient automatically receives a license from the\n" "original licensor to copy, distribute or modify the Program subject to\n" "these terms and conditions. You may not impose any further\n" "restrictions on the recipients' exercise of the rights granted herein.\n" "You are not responsible for enforcing compliance by third parties to\n" "this License.\n" "\n" " 7. If, as a consequence of a court judgment or allegation of patent\n" "infringement or for any other reason (not limited to patent issues),\n" "conditions are imposed on you (whether by court order, agreement or\n" "otherwise) that contradict the conditions of this License, they do not\n" "excuse you from the conditions of this License. If you cannot\n" "distribute so as to satisfy simultaneously your obligations under this\n" "License and any other pertinent obligations, then as a consequence you\n" "may not distribute the Program at all. For example, if a patent\n" "license would not permit royalty-free redistribution of the Program by\n" "all those who receive copies directly or indirectly through you, then\n" "the only way you could satisfy both it and this License would be to\n" "refrain entirely from distribution of the Program.\n" "\n" "If any portion of this section is held invalid or unenforceable under\n" "any particular circumstance, the balance of the section is intended to\n" "apply and the section as a whole is intended to apply in other\n" "circumstances.\n" "\n" "It is not the purpose of this section to induce you to infringe any\n" "patents or other property right claims or to contest validity of any\n" "such claims; this section has the sole purpose of protecting the\n" "integrity of the free software distribution system, which is\n" "implemented by public license practices. Many people have made\n" "generous contributions to the wide range of software distributed\n" "through that system in reliance on consistent application of that\n" "system; it is up to the author/donor to decide if he or she is willing\n" "to distribute software through any other system and a licensee cannot\n" "impose that choice.\n" "\n" "This section is intended to make thoroughly clear what is believed to\n" "be a consequence of the rest of this License.\n" "\n" " 8. If the distribution and/or use of the Program is restricted in\n" "certain countries either by patents or by copyrighted interfaces, the\n" "original copyright holder who places the Program under this License\n" "may add an explicit geographical distribution limitation excluding\n" "those countries, so that distribution is permitted only in or among\n" "countries not thus excluded. In such case, this License incorporates\n" "the limitation as if written in the body of this License.\n" "\n" " 9. The Free Software Foundation may publish revised and/or new versions\n" "of the General Public License from time to time. Such new versions will\n" "be similar in spirit to the present version, but may differ in detail to\n" "address new problems or concerns.\n" "\n" "Each version is given a distinguishing version number. If the Program\n" "specifies a version number of this License which applies to it and \"any\n" "later version\", you have the option of following the terms and conditions\n" "either of that version or of any later version published by the Free\n" "Software Foundation. If the Program does not specify a version number of\n" "this License, you may choose any version ever published by the Free Software\n" "Foundation.\n" "\n" " 10. If you wish to incorporate parts of the Program into other free\n" "programs whose distribution conditions are different, write to the author\n" "to ask for permission. For software which is copyrighted by the Free\n" "Software Foundation, write to the Free Software Foundation; we sometimes\n" "make exceptions for this. Our decision will be guided by the two goals\n" "of preserving the free status of all derivatives of our free software and\n" "of promoting the sharing and reuse of software generally.\n" "\n" " NO WARRANTY\n" "\n" " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n" "FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n" "OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n" "PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n" "OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n" "MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n" "TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n" "PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n" "REPAIR OR CORRECTION.\n" "\n" " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n" "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n" "REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n" "INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n" "OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n" "TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n" "YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n" "PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n" "POSSIBILITY OF SUCH DAMAGES.\n" "\n" " END OF TERMS AND CONDITIONS\n" "\n" " How to Apply These Terms to Your New Programs\n" "\n" " If you develop a new program, and you want it to be of the greatest\n" "possible use to the public, the best way to achieve this is to make it\n" "free software which everyone can redistribute and change under these terms.\n" "\n" " To do so, attach the following notices to the program. It is safest\n" "to attach them to the start of each source file to most effectively\n" "convey the exclusion of warranty; and each file should have at least\n" "the \"copyright\" line and a pointer to where the full notice is found.\n" "\n" " \n" " Copyright (C) \n" "\n" " This program is free software; you can redistribute it and/or modify\n" " it under the terms of the GNU General Public License as published by\n" " the Free Software Foundation; either version 2 of the License, or\n" " (at your option) any later version.\n" "\n" " This program is distributed in the hope that it will be useful,\n" " but WITHOUT ANY WARRANTY; without even the implied warranty of\n" " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" " GNU General Public License for more details.\n" "\n" " You should have received a copy of the GNU General Public License\n" " along with this program; if not, write to the Free Software\n" " Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" "\n" "\n" "Also add information on how to contact you by electronic and paper mail.\n" "\n" "If the program is interactive, make it output a short notice like this\n" "when it starts in an interactive mode:\n" "\n" " Gnomovision version 69, Copyright (C) year name of author\n" " Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n" " This is free software, and you are welcome to redistribute it\n" " under certain conditions; type `show c' for details.\n" "\n" "The hypothetical commands `show w' and `show c' should show the appropriate\n" "parts of the General Public License. Of course, the commands you use may\n" "be called something other than `show w' and `show c'; they could even be\n" "mouse-clicks or menu items--whatever suits your program.\n" "\n" "You should also get your employer (if you work as a programmer) or your\n" "school, if any, to sign a \"copyright disclaimer\" for the program, if\n" "necessary. Here is a sample; alter the names:\n" "\n" " Yoyodyne, Inc., hereby disclaims all copyright interest in the program\n" " `Gnomovision' (which makes passes at compilers) written by James Hacker.\n" "\n" " , 1 April 1989\n" " Ty Coon, President of Vice\n" "\n" "This General Public License does not permit incorporating your program into\n" "proprietary programs. If your program is a subroutine library, you may\n" "consider it more useful to permit linking proprietary applications with the\n" "library. If this is what you want to do, use the GNU Library General\n" "Public License instead of this License.\n" ; stopmotion-0.8.0/src/presentation/frontends/qtfrontend/mainwindowgui.cpp000066400000000000000000001105221234321124500270050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "mainwindowgui.h" #include "src/presentation/frontends/qtfrontend/framebar/framebar.h" #include "src/presentation/frontends/qtfrontend/frameview.h" #include "src/presentation/frontends/qtfrontend/flexiblespinbox.h" #include "src/application/camerahandler.h" #include "src/application/editmenuhandler.h" #include "src/application/runanimationhandler.h" #include "src/application/modelhandler.h" #include "src/application/languagehandler.h" #include "src/application/soundhandler.h" #include "src/presentation/frontends/qtfrontend/framepreferencesmenu.h" #include "src/presentation/frontends/qtfrontend/preferencesmenu.h" #include "src/presentation/frontends/qtfrontend/toolsmenu.h" #include "src/domain/domainfacade.h" #include "src/foundation/preferencestool.h" #include "src/technical/video/videoencoder.h" #include "src/presentation/frontends/qtfrontend/toolsmenu.h" #include "src/presentation/frontends/qtfrontend/helpwindow.h" #include "src/presentation/frontends/qtfrontend/aboutdialog.h" #include "src/presentation/frontends/qtfrontend/editobserver.h" #include "graphics/icons/windowicon.xpm" #include "graphics/icons/configureicon.xpm" #include "graphics/icons/undoicon.xpm" #include "graphics/icons/redoicon.xpm" #include "graphics/icons/cuticon.xpm" #include "graphics/icons/copyicon.xpm" #include "graphics/icons/pasteicon.xpm" #include "graphics/icons/filenewicon.xpm" #include "graphics/icons/fileopenicon.xpm" #include "graphics/icons/filesaveicon.xpm" #include "graphics/icons/filesaveasicon.xpm" #include "graphics/icons/quiticon.xpm" #include "graphics/icons/whatsthisicon.xpm" #include "graphics/icons/close.xpm" #include "graphics/icons/videoexport.xpm" #include "graphics/icons/languages.xpm" #include #include #include #include #include using namespace std; using namespace Qt; MainWindowGUI::MainWindowGUI(QApplication *stApp) : stApp(stApp), centerWidget(0), centerWidgetLayout(0), bottomWidget(0), bottomWidgetLayout(0), workArea(0), workAreaLayout(0), frameBar(0), frameView(0), gotoMenuWidget(0), gotoMenuWidgetLayout(0), fileWatcher(0), editObserver(0), newAct(0), openAct(0), mostRecentAct(0), secondMostRecentAct(0), thirdMostRecentAct(0), saveAct(0), saveAsAct(0), videoAct(0), cinerellaAct(0), quitAct(0), undoAct(0), redoAct(0), cutAct(0), copyAct(0), pasteAct(0), gotoFrameAct(0), configureAct(0), whatsthisAct(0), aboutAct(0), helpAct(0), fileMenu(0), exportMenu(0), mostRecentMenu(0), editMenu(0), settingsMenu(0), languagesMenu(0), helpMenu(0), toolsMenu(0), framePreferencesMenu(0), preferencesMenu(0), gotoMenuCloseButton(0), numberDisplay(0), gotoSpinner(0), gotoFrameLabel(0), modelHandler(0), soundHandler(0), cameraHandler(0), editMenuHandler(0), languageHandler(0), runAnimationHandler(0), lastVisitedDir(getenv("PWD")) { centerWidget = new QWidget; centerWidget->setObjectName("CenterWidget"); centerWidgetLayout = new QVBoxLayout; centerWidgetLayout->setSpacing(5); centerWidgetLayout->setMargin(0); frameBar = new FrameBar; centerWidgetLayout->addWidget(frameBar); createHandlers(stApp); createAccelerators(); bottomWidget = new QWidget; bottomWidget->setObjectName("BottomWidget"); centerWidgetLayout->addWidget(bottomWidget); bottomWidgetLayout = new QVBoxLayout; bottomWidgetLayout->setSpacing(0); bottomWidgetLayout->setMargin(0); makePreferencesMenu(bottomWidgetLayout); //Initializes and sets up the workarea consisting of the toolsmenu and the frameview. workArea = new QWidget; workArea->setObjectName("WorkArea"); bottomWidgetLayout->addWidget(workArea); bottomWidget->setLayout(bottomWidgetLayout); workAreaLayout = new QHBoxLayout; workAreaLayout->setObjectName("WorkAreaLayout"); workAreaLayout->setSpacing(5); workAreaLayout->setMargin(0); makeToolsMenu(workAreaLayout); makeViews(workAreaLayout); workArea->setLayout(workAreaLayout); connect(runAnimationHandler, SIGNAL(playFrame(int,int)), frameView, SLOT(updatePlayFrame(int,int))); connect(frameBar, SIGNAL(newActiveFrame(int,int)), runAnimationHandler, SLOT(stopAnimation())); makeGotoMenu(centerWidgetLayout); centerWidget->setLayout(centerWidgetLayout); setCentralWidget(centerWidget); makeStatusBar(); //Initializes and sets up the menu system. createActions(); createMenus(); //These slots will activate/deactivate menu options based on the changes in the model. connect( frameBar, SIGNAL(modelSizeChanged(int)), this, SLOT(modelSizeChanged(int))); connect( frameBar, SIGNAL(newActiveFrame(int, int)), this, SLOT(updateNewActiveFrame(int, int))); // update paste menu item depending on what's on the clipboard connect(QApplication::clipboard(), SIGNAL(dataChanged()), this, SLOT(updatePasteEnabled())); setupDirectoryMonitoring(); //Mainwindow preferences. setWindowIcon( QPixmap(windowicon) ); setContentsMargins(5, 0, 5, 0); setAcceptDrops(true); statusBar()->showMessage(tr("Ready to rumble ;-)"), 2000); statusBar()->setSizeGripEnabled(false); //Sets all the text in the program. retranslateStrings(); DomainFacade* facade = DomainFacade::getFacade(); setTitle(facade->canUndo()); facade->setUndoRedoObserver(this); /* Add another logo here QLabel *l = new QLabel(this); l->setMaximumSize(150, menuBar()->height() - 5); l->setMinimumSize(150, menuBar()->height() - 5); l->setScaledContents(true); l->setPixmap(stopmotion_logo); l->move(this->width()-150, 0); l->show(); */ } MainWindowGUI::~MainWindowGUI() { delete editObserver; } void MainWindowGUI::createHandlers(QApplication *stApp) { languageHandler = new LanguageHandler( this, stApp ); connect( languageHandler, SIGNAL(languageChanged()), this, SLOT(retranslateStrings()) ); runAnimationHandler = new RunAnimationHandler(this, statusBar(), frameBar); connect(runAnimationHandler, SIGNAL(stopped(int, int, int)), frameBar, SLOT(setSelection(int, int, int))); modelHandler = new ModelHandler( this, this->statusBar(), frameBar, &lastVisitedDir ); connect( modelHandler, SIGNAL(modelChanged()), this, SLOT(activateMenuOptions()) ); cameraHandler = new CameraHandler( this, this->statusBar(), modelHandler ); editMenuHandler = new EditMenuHandler( this, this->statusBar(), frameBar ); connect( editMenuHandler, SIGNAL(addFrames(const QStringList &)), modelHandler, SLOT(addFrames(const QStringList &)) ); connect(editMenuHandler, SIGNAL(removeFrames()), modelHandler, SLOT(removeFrames())); connect(editMenuHandler, SIGNAL(undoOrRedo()), this, SLOT(activateMenuOptions())); soundHandler = new SoundHandler( this, this->statusBar(), frameBar, this->lastVisitedDir.toLocal8Bit() ); } void MainWindowGUI::setupDirectoryMonitoring() { fileWatcher = new QFileSystemWatcher(this); editObserver = new EditObserver(fileWatcher); connect(fileWatcher, SIGNAL(fileChanged(const QString&)), frameBar, SLOT(fileChanged(const QString&))); connect(fileWatcher, SIGNAL(fileChanged(const QString&)), frameView, SLOT(fileChanged(const QString&))); DomainFacade::getFacade()->attach(editObserver); } void MainWindowGUI::createAccelerators() { QShortcut *nextFrameAccel = new QShortcut(QKeySequence(Qt::Key_L), this); connect(nextFrameAccel, SIGNAL(activated()), frameBar, SLOT(selectNextFrame())); QShortcut *nextFrameAccel2 = new QShortcut(QKeySequence(Qt::Key_Right), this); connect(nextFrameAccel2, SIGNAL(activated()), frameBar, SLOT(selectNextFrame())); QShortcut *nextFrameSelectionAccel = new QShortcut( QKeySequence(Qt::ShiftModifier + Qt::Key_L), this); connect(nextFrameSelectionAccel, SIGNAL(activated()), frameBar, SLOT(moveSelectionToNextFrame())); QShortcut *nextFrameSelectionAccel2 = new QShortcut( QKeySequence(Qt::ShiftModifier + Qt::Key_Right), this); connect(nextFrameSelectionAccel2, SIGNAL(activated()), frameBar, SLOT(moveSelectionToNextFrame())); QShortcut *previousFrameAccel = new QShortcut(QKeySequence(Qt::Key_J), this); connect(previousFrameAccel, SIGNAL(activated()), frameBar, SLOT(selectPreviousFrame())); QShortcut *previousFrameAccel2 = new QShortcut(QKeySequence(Qt::Key_Left), this ); connect(previousFrameAccel2, SIGNAL(activated()), frameBar, SLOT(selectPreviousFrame())); QShortcut *previousFrameSelectionAccel = new QShortcut( QKeySequence(Qt::ShiftModifier + Qt::Key_J), this); connect(previousFrameSelectionAccel, SIGNAL(activated()), frameBar, SLOT(moveSelectionToPreviousFrame())); QShortcut *previousFrameSelectionAccel2 = new QShortcut( QKeySequence(Qt::ShiftModifier + Qt::Key_Left), this); connect(previousFrameSelectionAccel2, SIGNAL(activated()), frameBar, SLOT(moveSelectionToPreviousFrame())); QShortcut *nextSceneAccel = new QShortcut(QKeySequence(Qt::Key_O), this); connect(nextSceneAccel, SIGNAL(activated()), frameBar, SLOT(selectNextScene())); QShortcut *prevSceneAccel = new QShortcut(QKeySequence(Qt::Key_I), this); connect(prevSceneAccel, SIGNAL(activated()), frameBar, SLOT(selectPreviousScene())); QShortcut *toggleCameraAccel = new QShortcut(QKeySequence(Qt::Key_C), this); connect(toggleCameraAccel, SIGNAL(activated()), cameraHandler, SLOT(toggleCamera())); QShortcut *captureAccel = new QShortcut(QKeySequence(Qt::Key_Space), this); connect(captureAccel, SIGNAL(activated()), cameraHandler, SLOT(captureFrame())); QShortcut *addFrameAccel = new QShortcut(QKeySequence(Qt::Key_F), this); connect(addFrameAccel, SIGNAL(activated()), modelHandler, SLOT(chooseFrame())); QShortcut *newSceneAccel = new QShortcut(QKeySequence(Qt::ControlModifier + Qt::Key_E), this); connect(newSceneAccel, SIGNAL(activated()), modelHandler, SLOT(newScene())); QShortcut *removeFramesAccel = new QShortcut(QKeySequence(Qt::Key_Delete), this); connect(removeFramesAccel, SIGNAL(activated()), modelHandler, SLOT(removeFrames())); QShortcut *removeSceneAccel = new QShortcut(QKeySequence(Qt::ShiftModifier + Qt::Key_Delete), this); connect(removeSceneAccel, SIGNAL(activated()), modelHandler, SLOT(removeScene())); } void MainWindowGUI::createActions() { //File menu newAct = new QAction(this); newAct->setIcon(QIcon(filenewicon)); newAct->setShortcut(ControlModifier+Key_N); connect(newAct, SIGNAL(triggered()), this, SLOT(newProject())); openAct = new QAction(this); openAct->setIcon(QIcon(fileopenicon)); openAct->setShortcut(ControlModifier+Key_O); connect(openAct, SIGNAL(triggered()), this, SLOT(openProject())); mostRecentAct = new QAction(this); mostRecentAct->setIcon(QIcon(windowicon)); connect(mostRecentAct, SIGNAL(triggered()), this, SLOT(openMostRecent())); secondMostRecentAct = new QAction(this); secondMostRecentAct->setIcon(QIcon(windowicon)); connect(secondMostRecentAct, SIGNAL(triggered()), this, SLOT(openSecondMostRecent())); thirdMostRecentAct = new QAction(this); thirdMostRecentAct->setIcon(QIcon(windowicon)); connect(thirdMostRecentAct, SIGNAL(triggered()), this, SLOT(openThirdMostRecent())); saveAct = new QAction(this); saveAct->setIcon(QIcon(filesaveasicon)); saveAct->setShortcut(ControlModifier+Key_S); connect(saveAct, SIGNAL(triggered()), this, SLOT(saveProject())); saveAsAct = new QAction(this); saveAsAct->setIcon(QIcon(filesaveicon)); saveAsAct->setShortcut(ControlModifier+ShiftModifier+Key_S); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveProjectAs())); videoAct = new QAction(this); videoAct->setShortcut(ControlModifier+ALT+Key_V); videoAct->setIcon(QIcon(videoexport)); connect(videoAct, SIGNAL(triggered()), this, SLOT(exportToVideo())); cinerellaAct = new QAction(this); cinerellaAct->setShortcut(ControlModifier+ALT+Key_C); cinerellaAct->setEnabled(false); connect(cinerellaAct, SIGNAL(triggered()), this, SLOT(exportToCinerella())); quitAct = new QAction(this); quitAct->setIcon(QIcon(quiticon)); quitAct->setShortcut(ControlModifier+Key_Q); connect(quitAct, SIGNAL(triggered()), stApp, SLOT(quit())); //Edit menu undoAct = new QAction(this); undoAct->setIcon(QIcon(undoicon)); undoAct->setShortcut(ControlModifier+Key_Z); connect(undoAct, SIGNAL(triggered()), editMenuHandler, SLOT(undo())); redoAct = new QAction(this); redoAct->setIcon(QIcon(redoicon)); redoAct->setShortcut(ControlModifier+ShiftModifier+Key_Z); connect(redoAct, SIGNAL(triggered()), editMenuHandler, SLOT(redo())); cutAct = new QAction(this); cutAct->setIcon(QIcon(cuticon)); cutAct->setShortcut(ControlModifier+Key_X); connect(cutAct, SIGNAL(triggered()), editMenuHandler, SLOT(cut())); copyAct = new QAction(this); copyAct->setIcon(QIcon(copyicon)); copyAct->setShortcut(ControlModifier+Key_C); connect(copyAct, SIGNAL(triggered()), editMenuHandler, SLOT(copy())); pasteAct = new QAction(this); pasteAct->setIcon(QIcon(pasteicon)); pasteAct->setShortcut(ControlModifier+Key_V); connect(pasteAct, SIGNAL(triggered()), editMenuHandler, SLOT(paste())); gotoFrameAct = new QAction(this); gotoFrameAct->setShortcut(ControlModifier+Key_G); connect(gotoFrameAct, SIGNAL(triggered()), gotoMenuWidget, SLOT(show())); configureAct = new QAction(this); configureAct->setIcon(QIcon(configureicon)); configureAct->setShortcut(ControlModifier+Key_P); connect(configureAct, SIGNAL(triggered()), this, SLOT(showPreferencesMenu())); //Help menu whatsthisAct = new QAction(this); whatsthisAct->setIcon(QIcon(whatsthisicon)); whatsthisAct->setShortcut(ShiftModifier+Key_F1); connect(whatsthisAct, SIGNAL(triggered()), this, SLOT(whatsThis())); helpAct = new QAction(this); helpAct->setShortcut(Key_F1); connect(helpAct, SIGNAL(triggered()), this, SLOT(showHelpDialog())); aboutAct = new QAction(this); aboutAct->setIcon(QIcon(windowicon)); connect(aboutAct, SIGNAL(triggered()), this, SLOT(showAboutDialog())); } void MainWindowGUI::createMenus() { fileMenu = menuBar()->addMenu(tr("&File")); exportMenu = fileMenu->addMenu(tr("&Export")); mostRecentMenu = fileMenu->addMenu(tr("Open &Recent")); editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(undoAct); editMenu->addAction(redoAct); editMenu->addSeparator(); editMenu->addAction(cutAct); editMenu->addAction(copyAct); editMenu->addAction(pasteAct); editMenu->addSeparator(); editMenu->addAction(gotoFrameAct); undoAct->setEnabled(false); redoAct->setEnabled(false); cutAct->setEnabled(false); copyAct->setEnabled(false); updatePasteEnabled(); gotoFrameAct->setEnabled(false); settingsMenu = menuBar()->addMenu(tr("&Settings")); languagesMenu = languageHandler->createLanguagesMenu(settingsMenu); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(whatsthisAct); helpMenu->addAction(helpAct); helpMenu->addSeparator(); helpMenu->addAction(aboutAct); } void MainWindowGUI::makeToolsMenu(QHBoxLayout *layout) { toolsMenu = new ToolsMenu(runAnimationHandler, modelHandler, cameraHandler, frameBar); layout->addWidget(toolsMenu); connect(frameBar, SIGNAL(modelSizeChanged(int)), toolsMenu, SLOT(fixNavigationButtons(int))); connect(cameraHandler, SIGNAL(cameraStateChanged(bool)), toolsMenu, SLOT(cameraOn(bool))); } void MainWindowGUI::makePreferencesMenu(QVBoxLayout *layout) { framePreferencesMenu = new FramePreferencesMenu(0, soundHandler, frameBar); layout->addWidget(framePreferencesMenu); frameBar->setPreferencesMenu(framePreferencesMenu); framePreferencesMenu->hide(); preferencesMenu = new PreferencesMenu(this); preferencesMenu->hide(); } void MainWindowGUI::makeGotoMenu(QVBoxLayout *layout) { gotoMenuWidget = new QWidget; gotoMenuWidgetLayout = new QHBoxLayout; gotoMenuWidgetLayout->setSpacing(5); gotoMenuWidgetLayout->setMargin(0); gotoFrameLabel = new QLabel; gotoSpinner = new FlexibleSpinBox; gotoSpinner->setMaximumWidth(60); gotoSpinner->setRange(1, 1); connect(frameBar, SIGNAL(newActiveFrame(int,int)), gotoSpinner, SLOT(setValue(int))); connect(frameBar, SIGNAL(modelSizeChanged(int)), gotoSpinner, SLOT(setMaximumValue(int))); connect(frameBar, SIGNAL(newMaximumValue(int)), gotoSpinner, SLOT(setMaximumValue(int))); connect(gotoSpinner, SIGNAL(spinBoxTriggered(int)), editMenuHandler, SLOT(gotoFrame(int))); connect(gotoSpinner, SIGNAL(spinBoxCanceled()),editMenuHandler, SLOT(closeGotoMenu())); gotoMenuCloseButton = new QPushButton; gotoMenuCloseButton->setIcon(QPixmap(closeicon)); gotoMenuCloseButton->setFlat(true); gotoMenuCloseButton->setMinimumSize(16, 16); gotoMenuCloseButton->setMaximumSize(16, 16); connect(gotoMenuCloseButton, SIGNAL(clicked()), gotoMenuWidget, SLOT(hide())); gotoMenuWidgetLayout->addWidget(gotoFrameLabel); gotoMenuWidgetLayout->addWidget(gotoSpinner); gotoMenuWidgetLayout->addStretch(); gotoMenuWidgetLayout->addWidget(gotoMenuCloseButton); gotoMenuWidget->setLayout(gotoMenuWidgetLayout); layout->addWidget(gotoMenuWidget); gotoMenuWidget->hide(); editMenuHandler->setGotoMenu(gotoMenuWidget); } void MainWindowGUI::makeStatusBar() { numberDisplay = new QLabel; numberDisplay->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); numberDisplay->setMargin(0); connect(frameBar, SIGNAL(newActiveFrame(const QString &)), numberDisplay, SLOT(setText(const QString &))); this->statusBar()->addPermanentWidget(numberDisplay); } void MainWindowGUI::makeViews(QHBoxLayout *layout) { frameView = new FrameView; frameView->setObjectName("FrameView"); frameView->setMinimumSize(400, 300); frameView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); layout->addWidget(frameView); connect( frameView, SIGNAL(cameraReady()), cameraHandler, SLOT(switchToVideoView())); connect(cameraHandler, SIGNAL(capturedFrame()), this, SLOT(activateMenuOptions())); cameraHandler->setFrameView(frameView); connect(frameBar, SIGNAL(newActiveFrame(int,int)), frameView, SLOT(updateNewActiveFrame(int,int))); connect(stApp, SIGNAL(aboutToQuit()), frameView, SLOT(off())); } void MainWindowGUI::retranslateStrings() { Logger::get().logDebug("Retranslating strings"); //The actions caption texts newAct->setText(tr("&New")); openAct->setText(tr("&Open")); saveAct->setText(tr("&Save")); saveAsAct->setText(tr("Save &As")); videoAct->setText(tr("Video")); cinerellaAct->setText(tr("Cinelerra")); quitAct->setText(tr("&Quit")); undoAct->setText(tr("&Undo")); redoAct->setText(tr("Re&do")); cutAct->setText(tr("Cu&t")); copyAct->setText(tr("&Copy")); pasteAct->setText(tr("&Paste")); gotoFrameAct->setText(tr("&Go to frame")); configureAct->setText(tr("&Configure Stopmotion")); whatsthisAct->setText(tr("What's &This")); helpAct->setText(tr("&Help")); aboutAct->setText(tr("&About")); //Other widgets numberDisplay->setText(tr("Frame number: ") + QString("%1").arg(frameBar->getActiveFrame() + 1)); gotoFrameLabel->setText(tr("Go to frame:")); //Tooltip and whatsthis texts retranslateHelpText(); //The menus menuBar()->clear(); menuBar()->addMenu(fileMenu); fileMenu->clear(); fileMenu->setTitle(tr("&File")); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addMenu(mostRecentMenu); createMostRecentMenu(); fileMenu->addSeparator(); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addMenu(exportMenu); exportMenu->clear(); exportMenu->setTitle(tr("&Export")); exportMenu->addAction(videoAct); exportMenu->addAction(cinerellaAct); fileMenu->addSeparator(); fileMenu->addAction(quitAct); menuBar()->addMenu(editMenu); menuBar()->addMenu(settingsMenu); settingsMenu->clear(); settingsMenu->setTitle(tr("&Settings")); languagesMenu->setIcon(QIcon(languages)); settingsMenu->addMenu(languagesMenu); settingsMenu->addAction(configureAct); editMenu->setTitle(tr("&Edit")); helpMenu->setTitle(tr("&Help")); menuBar()->addMenu(helpMenu); //The submenus toolsMenu->retranslateStrings(); framePreferencesMenu->retranslateStrings(); preferencesMenu->retranslateStrings(); } void MainWindowGUI::retranslateHelpText() { QString infoText; //File menu infoText = tr("

New

" "

Creates a new project.

"); newAct->setWhatsThis(infoText); //The prepend part is a trick to keep the accelerator in the tooltip infoText = newAct->toolTip().prepend(tr("New project")); newAct->setToolTip(infoText); infoText = tr("

Open

" "

Opens a Stopmotion project file.

"); openAct->setWhatsThis(infoText); infoText = openAct->toolTip().prepend(tr("Open project")); openAct->setToolTip(infoText); infoText = tr("

Save

" "

Saves the current animation as a Stopmotion " "project file.
If this project has been saved before it will " "automatically be saved to the previously selected file.

"); saveAct->setWhatsThis(infoText); infoText = saveAct->toolTip().prepend(tr("Save project")); saveAct->setToolTip(infoText); infoText = tr("

Save As

" "

Saves the current animation as a Stopmotion " "project file.

"); saveAsAct->setWhatsThis(infoText); infoText = saveAsAct->toolTip().prepend(tr("Save project As")); saveAsAct->setToolTip(infoText); infoText = tr("

Video

" "

Exports the current project as video.

" "You will be given a wizard to guide you."); videoAct->setWhatsThis(infoText); videoAct->setToolTip(infoText); infoText = tr("

Cinerella

" "

Exports the current animation as a Cinerella project.

" "You will be given a wizard to guide you."); cinerellaAct->setWhatsThis(infoText); cinerellaAct->setToolTip(infoText); infoText = tr("

Quit

" "

Quits the program.

"); quitAct->setWhatsThis(infoText); infoText = quitAct->toolTip().prepend(tr("Quit")); quitAct->setToolTip(infoText); //Edit menu infoText = tr("

Undo

" "

Undoes your last operation. You can press undo " "several time to undo earlier operations.

"); undoAct->setWhatsThis(infoText); infoText = undoAct->toolTip().prepend(tr("Undo")); undoAct->setToolTip(infoText); infoText = tr("

Redo

" "

Redoes your last operation. You can press redo " "several times to redo several operations.

"); redoAct->setWhatsThis(infoText); infoText = redoAct->toolTip().prepend(tr("Redo")); redoAct->setToolTip(infoText); infoText = tr("

Cut

" "

Cuts the selected frames out of the animation and adds them " "to the clipboard so that you can paste them in somewhere else.

"); cutAct->setWhatsThis(infoText); infoText = cutAct->toolTip().prepend(tr("Cut")); cutAct->setToolTip(infoText); infoText = tr("

Copy

" "

Copies the selected frames to the clipboard. You can " "then paste them in another place.

"); copyAct->setWhatsThis(infoText); infoText = copyAct->toolTip().prepend(tr("Copy")); copyAct->setToolTip(infoText); infoText = tr("

Paste

" "

Pastes the frames which are currently in the clipboard " "into the selected location.

You can copy/cut images from another " "programs and then use this option to paste them into this animation.

"); pasteAct->setWhatsThis(infoText); infoText = pasteAct->toolTip().prepend(tr("Paste")); pasteAct->setToolTip(infoText); infoText = tr("

Go to frame

" "

This will bring up a popup-menu at the bottom where you can choose " "a frame you want to go to.

"); gotoFrameAct->setWhatsThis(infoText); infoText = gotoFrameAct->toolTip().prepend(tr("Go to frame")); gotoFrameAct->setToolTip(infoText); infoText = tr("

Configure Stopmotion

" "

This will opens a window where you can configure " "Stopmotion with various input and output devices.

"); configureAct->setWhatsThis(infoText); infoText = configureAct->toolTip().prepend(tr("Configure Stopmotion")); configureAct->setToolTip(infoText); //Help menu infoText = tr("

What's This

" "

This will give you a WhatsThis mouse cursor which can be used to " "bring up helpful information like this.

"); whatsthisAct->setWhatsThis(infoText); infoText = whatsthisAct->toolTip().prepend(tr("What's This")); whatsthisAct->setToolTip(infoText); infoText = tr("

Help

" "

This button will bring up a dialog with the Stopmotion manual

"); helpAct->setWhatsThis(infoText); infoText = aboutAct->toolTip().prepend(tr("Help")); helpAct->setToolTip(infoText); infoText = tr("

About

" "

This will display a small information box where you can read " "general information as well as the names of the developers " "behind this excellent piece of software.

"); aboutAct->setWhatsThis(infoText); infoText = aboutAct->toolTip().prepend(tr("About")); aboutAct->setToolTip(infoText); //Other widgets infoText = tr("

Frame number

This area displays the number" "of the currently selected frame

"); numberDisplay->setToolTip(infoText ); numberDisplay->setWhatsThis(infoText ); //Various menues infoText = tr("

FrameView

In this area you can see the " "selected frame. You can also play " "animations in this window by pressing the " "Play button.

"); frameView->setWhatsThis(infoText ); infoText = tr("

Go to frame menu

" "

Here you can specify a framenumber and the program will jump " "to the specified frame

"); gotoMenuWidget->setWhatsThis(infoText ); infoText = tr("

Frame preferences menu

" "

In this menu you can set preferences for the " "selected frame/frames, such as subtitles, " "sound effects, etc.

"); framePreferencesMenu->setWhatsThis(infoText ); infoText = tr("

Tool menu

" "

This is the tool menu where most of the buttons and widgets " "you will need when working on stop motion animations are located.

"); toolsMenu->setWhatsThis(infoText ); infoText = tr("

FrameBar

" "

In this area you can see the frames and scenes " "in the animations and build the animation " "by moving the them around.

You can " "switch to the next and the previous frame " "using the arrow buttons or x " "and z

"); frameBar->setWhatsThis(infoText ); } MainWindowGUI::SaveDialogResult MainWindowGUI::saveIfNecessary() { bool b = DomainFacade::getFacade()->isUnsavedChanges(); if (b) { int save = QMessageBox::question(this, tr("Unsaved changes"), tr("There are unsaved changes. Do you want to save?"), tr("&Save"), tr("Do&n't save"), tr("Abort"), 0, 2); if (save == 2) { return saveDialogCancel; } else if (save == 0) { if (saveProject()) return saveDialogSave; // User requested a save but cancelled the "Save As" dialog. // This counts as a cancel. return saveDialogCancel; } } return saveDialogDiscard; } void MainWindowGUI::newProject() { if (saveDialogCancel != saveIfNecessary()) { DomainFacade::getFacade()->newProject(); // It would be better if this was a signal emission, but it seems that // connect(this, ...) is problematic for some reason. frameView->workspaceCleared(); saveAct->setEnabled(false); setTitle(false); DomainFacade::getFacade()->clearHistory(); modelSizeChanged(0); toolsMenu->fixNavigationButtons(0); } } void MainWindowGUI::openProject() { if (saveDialogCancel != saveIfNecessary()) { QString file = QFileDialog:: getOpenFileName(this, tr("Choose project file"), lastVisitedDir, "Stopmotion (*.sto)"); if ( !file.isNull() ) { doOpenProject( file.toLocal8Bit().constData() ); } } } void MainWindowGUI::updateNewActiveFrame(int, int frame) { if (frame < 0) { cutAct->setEnabled(false); copyAct->setEnabled(false); } else { cutAct->setEnabled(true); copyAct->setEnabled(true); } } void MainWindowGUI::updatePasteEnabled() { const QMimeData *mimeData = QApplication::clipboard()->mimeData(); pasteAct->setEnabled(mimeData->hasUrls()); } void MainWindowGUI::doOpenProject(const char* projectFile) { assert(projectFile != NULL); DomainFacade::getFacade()->openProject(projectFile); frameView->workspaceCleared(); saveAsAct->setEnabled(true); saveAct->setEnabled(false); setTitle(false); updateMostRecentMenu(); int size = DomainFacade::getFacade()->getModelSize(); if (size > 0) { activateMenuOptions(); modelSizeChanged(size); toolsMenu->fixNavigationButtons(size); } } void MainWindowGUI::openProject( const char * projectFile ) { if (saveDialogCancel != saveIfNecessary()) { doOpenProject(projectFile); } } void MainWindowGUI::openMostRecent() { Preference prop("mostRecent", ""); openProject(prop.get()); } void MainWindowGUI::openSecondMostRecent() { Preference prop("secondMostRecent", ""); openProject(prop.get()); } void MainWindowGUI::openThirdMostRecent() { Preference prop("thirdMostRecent", ""); openProject(prop.get()); } bool MainWindowGUI::saveProjectAs() { QString file = QFileDialog::getSaveFileName(this, tr("Save As"), lastVisitedDir, "Stopmotion (*.sto)"); if ( file.isNull() ) return false; DomainFacade::getFacade()->saveProject(file.toLocal8Bit()); saveAct->setEnabled(false); setTitle(false); updateMostRecentMenu(); return false; } bool MainWindowGUI::saveProject() { const char *file = DomainFacade::getFacade()->getProjectFile(); if (file) { DomainFacade::getFacade()->saveProject(file); return true; } return saveProjectAs(); } void MainWindowGUI::exportToVideo() { PreferencesTool *prefs = PreferencesTool::get(); int active = prefs->getPreference("activeEncoder", -1); if ( active == -1 ) { int ret = QMessageBox::warning(this, tr("Warning"), tr("Cannot find any registered encoder to be used for\n" "video export. This can be setted in the preferences\n" "menu. Export to video will not be possible until you\n" "have setted an encoder to use. Do you want to set it now?"), tr("&Yes"), tr("&No"), // button 0, button 1, ... QString::null, 0, 1 ); if (ret == 0) { showPreferencesMenu(); } } else { bool isCanceled = false; char tmp[PATH_MAX]; VideoEncoder enc; sprintf(tmp, "startEncoder%d", active); Preference start(tmp, ""); enc.setStartCommand(start.get()); sprintf(tmp, "stopEncoder%d", active); Preference stop(tmp, ""); enc.setStopCommand(stop.get()); sprintf(tmp, "outputFile%d", active); Preference output(tmp); if (output.get()) { enc.setOutputFile(output.get()); } else { QString file = QFileDialog:: getSaveFileName(this, tr("Export to video file"), lastVisitedDir); if ( file.isEmpty() ) { isCanceled = true; } else { enc.setOutputFile( file.toLocal8Bit().constData() ); } } if ( enc.isValid() && isCanceled == false ) { DomainFacade::getFacade()->exportToVideo(&enc); } else if (!isCanceled){ int ret = QMessageBox::warning(this, tr("Warning"), tr("The registered encoder is not valid. Do you want\n" "to check your settings in the preferences menu?"), tr("&Yes"), tr("&No"), // button 0, button 1, ... QString::null, 0, 1 ); if (ret == 0) { showPreferencesMenu(); } } } } void MainWindowGUI::exportToCinerella() { QString file = QFileDialog:: getSaveFileName(this, tr("Export to file"), lastVisitedDir, "Cinerella (*.XXX)"); if ( !file.isNull() ) { DomainFacade::getFacade()->exportToCinerella( file.toLocal8Bit().constData() ); } } void MainWindowGUI::whatsThis() { QWhatsThis::enterWhatsThisMode(); } void MainWindowGUI::dragEnterEvent ( QDragEnterEvent * event) { Logger::get().logDebug("Drag entering application"); if ( event->mimeData()->hasUrls() ) { event->accept(); } else { event->ignore(); } } void MainWindowGUI::dropEvent(QDropEvent *event) { Logger::get().logDebug("Drop inside the application"); if ( event->mimeData()->hasUrls() ) { QStringList fileNames; QList urls = event->mimeData()->urls(); int numFrames = urls.size(); for (int i = 0; i < numFrames; ++i) { fileNames.append(urls[i].toLocalFile()); modelHandler->addFrames(fileNames); } } } /** * @todo change so that CTRL+A instead of just A selects all the frames. */ void MainWindowGUI::keyPressEvent( QKeyEvent *k ) { switch ( k->key() ) { case Key_Shift: { frameBar->setSelecting(true); break; } case Key_A: { DomainFacade* facade = DomainFacade::getFacade(); int scene = frameBar->getActiveScene(); if(0 <= scene) { int sceneSize = facade->getSceneSize(scene); if( sceneSize > 1) { frameBar->updateNewActiveFrame(scene, 0); frameBar->setSelection(sceneSize - 1); } } break; } default: { k->ignore(); break; } } } void MainWindowGUI::updateCanUndo(bool newCanUndo) { undoAct->setEnabled(newCanUndo); saveAct->setEnabled(newCanUndo); setTitle(newCanUndo); } void MainWindowGUI::updateCanRedo(bool newCanRedo) { redoAct->setEnabled(newCanRedo); } void MainWindowGUI::keyReleaseEvent ( QKeyEvent * k ) { switch ( k->key() ) { case Key_Shift: { frameBar->setSelecting(false); break; } } } void MainWindowGUI::setTitle(bool modified) { std::string title; if (modified) title = "* "; const char* name = DomainFacade::getFacade()->getProjectFile(); if (name) { const char* lastDot = strrchr(name, '.'); const char* lastSlash = strrchr(name, '/'); title.append(lastSlash? lastSlash + 1 : name, lastDot? lastDot : name + strlen(name)); } else { title.append("Stopmotion"); } setWindowTitle(title.c_str()); } void MainWindowGUI::showAboutDialog() { AboutDialog *aboutDialog = new AboutDialog(this); aboutDialog->show(); } void MainWindowGUI::showHelpDialog() { HelpWindow *help = new HelpWindow(this); if ( QApplication::desktop()->width() > 400 && QApplication::desktop()->height() > 500 ) { help->move(40, 40); help->show(); } else { help->showMaximized(); } } void MainWindowGUI::showPreferencesMenu() { preferencesMenu->display(); } void MainWindowGUI::mousePressEvent( QMouseEvent * ) { gotoMenuWidget->hide(); } void MainWindowGUI::modelSizeChanged( int modelSize ) { if (modelSize == 0) { gotoFrameAct->setEnabled(false); } else { gotoFrameAct->setEnabled(true); saveAsAct->setEnabled(true); } } void MainWindowGUI::activateMenuOptions() { DomainFacade* facade = DomainFacade::getFacade(); bool canUndo = facade->canUndo(); undoAct->setEnabled(canUndo); redoAct->setEnabled(facade->canRedo()); setTitle(canUndo); } void MainWindowGUI::createMostRecentMenu() { mostRecentMenu->clear(); mostRecentMenu->setTitle(tr("Open &Recent")); PreferencesTool* pref = PreferencesTool::get(); Preference first("mostRecent", ""); if (first.get() && access(first.get(), R_OK) == 0) { mostRecentAct->setVisible(true); mostRecentAct->setText(QString::fromLocal8Bit(first.get())); } else { mostRecentAct->setVisible(false); } Preference second("secondMostRecent", ""); if (second.get() && access(second.get(), R_OK) == 0) { secondMostRecentAct->setVisible(true); secondMostRecentAct->setText(QString::fromLocal8Bit(second.get())); } else { secondMostRecentAct->setVisible(false); } Preference third("thirdMostRecent", ""); if (third.get() && access(third.get(), R_OK) == 0) { thirdMostRecentAct->setVisible(true); thirdMostRecentAct->setText(QString::fromLocal8Bit(third.get())); } else { thirdMostRecentAct->setVisible(false); } mostRecentMenu->addAction(mostRecentAct); mostRecentMenu->addAction(secondMostRecentAct); mostRecentMenu->addAction(thirdMostRecentAct); } void MainWindowGUI::updateMostRecentMenu() { DomainFacade::getFacade()->setMostRecentProject(); createMostRecentMenu(); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/mainwindowgui.h000066400000000000000000000226101234321124500264520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef QTGUI_H #define QTGUI_H #include "src/domain/undo/undoredoobserver.h" #include #include class FrameBar; class FrameView; class FlexibleSpinBox; class CameraHandler; class EditMenuHandler; class RunAnimationHandler; class ModelHandler; class SoundHandler; class MenuFrame; class FramePreferencesMenu; class PreferencesMenu; class ToolsMenu; class LanguageHandler; class EditObserver; class QApplication; class QKeyEvent; class QMouseEvent; class QDragEnterEvent; class QDropEvent; class QAction; class QMenu; class QLabel; class QVBoxLayout; class QHBoxLayout; class QPushButton; class QFileSystemWatcher; /** *The main window class for the stopmotion application. *This class sets up the main GUI and connects the buttons. * *@author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class MainWindowGUI : public QMainWindow, public UndoRedoObserver { Q_OBJECT public: enum {SAVE, SAVE_AS, UNDO, REDO, CUT, COPY, PASTE, GOTO}; /** * Sets up the program main GUI and connect the widgets and handlers. * @param stApp the application class for changing translator * on runtime. */ MainWindowGUI(QApplication *stApp); /** * Cleans up after the mainwindowgui. */ ~MainWindowGUI(); /** * Overloaded mouse listener. Closes the embedded menues when the user * clicks inside the main window. * @param e information about the event. */ void mousePressEvent ( QMouseEvent * e ); /** * Overloaded event listener which recieves information when a keyboard key is * pressed. * @param k information about the key event. */ void keyPressEvent( QKeyEvent *k ); void updateCanUndo(bool newCanUndo); void updateCanRedo(bool newCanRedo); private: QApplication *stApp; QWidget *centerWidget; QVBoxLayout *centerWidgetLayout; QWidget *bottomWidget; QVBoxLayout *bottomWidgetLayout; QWidget *workArea; QHBoxLayout *workAreaLayout; FrameBar *frameBar; FrameView *frameView; QWidget *gotoMenuWidget; QHBoxLayout *gotoMenuWidgetLayout; QFileSystemWatcher *fileWatcher; EditObserver *editObserver; //Actions QAction *newAct; QAction *openAct; QAction *mostRecentAct; QAction *secondMostRecentAct; QAction *thirdMostRecentAct; QAction *saveAct; QAction *saveAsAct; QAction *videoAct; QAction *cinerellaAct; QAction *quitAct; QAction *undoAct; QAction *redoAct; QAction *cutAct; QAction *copyAct; QAction *pasteAct; QAction *gotoFrameAct; QAction *configureAct; QAction *whatsthisAct; QAction *aboutAct; QAction *helpAct; //Menus QMenu *fileMenu; QMenu *exportMenu; QMenu *mostRecentMenu; QMenu *editMenu; QMenu *settingsMenu; QMenu *languagesMenu; QMenu *helpMenu; ToolsMenu *toolsMenu; FramePreferencesMenu *framePreferencesMenu; PreferencesMenu *preferencesMenu; //MenuFrame *gotoMenu; QPushButton *gotoMenuCloseButton; //Widgets QLabel *numberDisplay; FlexibleSpinBox *gotoSpinner; QLabel *gotoFrameLabel; //Handlers ModelHandler *modelHandler; SoundHandler *soundHandler; CameraHandler *cameraHandler; EditMenuHandler *editMenuHandler; LanguageHandler *languageHandler; RunAnimationHandler *runAnimationHandler; QString lastVisitedDir; enum SaveDialogResult { saveDialogSave, saveDialogDiscard, saveDialogCancel }; /** * Creates the handlers for handling user requests. * @param stApp the application class for changing translator * on runtime. */ void createHandlers(QApplication *stApp); /** * Begins monitoring the workspace directory for interesting changes. */ void setupDirectoryMonitoring(); /** * Creates key accelerators (keyboard shortcuts) * * More can be found in the function ToolsMenu::createAccelerators(). */ void createAccelerators(); /** * Creates the actions from which the menus are created. */ void createActions(); /** * Creates and sets up the menu and the toolbar. */ void createMenus(); /** * Creates the preferences menu. * @param parent */ void makePreferencesMenu(QVBoxLayout *layout); /** *Creates and sets up the frameview. *@param parent the widget the frameview will be inserted into. */ void makeViews(QHBoxLayout *layout); /** *Creates and sets up the toolsmenu. *@param parent the widget the toolsmenu will be inserted into. */ void makeToolsMenu(QHBoxLayout *layout); /** * Creates and sets up the menu for going to a specified framenumber. * @param parent the widget the gotomenu will be inserted into. */ void makeGotoMenu(QVBoxLayout *layout); /** * Sets up the statusbar with custom widgets. */ void makeStatusBar(); /** *Overloaded event listener for when when a drag enters the application. *@param event information about the dragEnterEvent */ void dragEnterEvent ( QDragEnterEvent * event); /** *Overloaded event listener for when a drop event occur in the application. *@param event information about the dropEvent */ void dropEvent(QDropEvent *event); /** * Overloaded event listener which recieves information when a keyboard key is * released * @param k information about the key event. */ void keyReleaseEvent ( QKeyEvent * k ); /** * Retranslates the tooltip and whatsthis text. * * This function is called from retranslateStrings. */ void retranslateHelpText(); /** * Updates the most recent menu. */ void updateMostRecentMenu(); /** * Sets the title to the project name and an indicator for whether the * project is saved or not. * @param modified Whether or not the project is different from the most * recently saved project. */ void setTitle(bool modified); /** * If the project has unsaved changes, asks the user if the project should * be saved. If so, saves it. * @return The user's response. {@ref SaveDialogDiscard} is returned if * there were found to be no changes. */ SaveDialogResult saveIfNecessary(); void doOpenProject(const char* projectFile); public slots: /** * Opens a saved project. * @param projectFile the project to open */ void openProject(const char *projectFile); private slots: /** * Retranslates the strings. * * This function is called after a new translator has been installed so that * the program strings are retranslated to the new language. */ void retranslateStrings(); /** * Creates a new project. */ void newProject(); /** * Opens a project. */ void openProject(); /** * Opens a project. */ void openMostRecent(); void openSecondMostRecent(); void openThirdMostRecent(); /** * Saves the project to the last saved file. * @return {@c false} if a filename was required but the user cancelled; * in this case the project was not saved. */ bool saveProject(); /** * Saves the project to a given filename from the user. * @return {@c false} if the user cancelled; in this case the project was * not saved. */ bool saveProjectAs(); /** * Brings up an about dialog with information about the application. */ void showAboutDialog(); /** * Brings up an help dialog with the stopmotion user manual. */ void showHelpDialog(); /** * Brings up a preferences menu where the user can set preferences for the * application. */ void showPreferencesMenu(); /** * Exports the current project to a video file choosen by the user. It uses the * registered video encoder -- if registered -- to export. */ void exportToVideo(); /** * Exports the current project to a valid Cinerella project. */ void exportToCinerella(); void whatsThis(); /** * Notification that the framebar's active frame has changed. */ void updateNewActiveFrame(int scene, int frame); /** * Notification that the clipboard contents have changed. */ void updatePasteEnabled(); void createMostRecentMenu(); public slots: /** * This slot is notified when the size of the model changes so that menuframe * menu options can be adjusted (activated/deactivated, etc). * @param modelSize the new size of the model. */ void modelSizeChanged( int modelSize ); /** * Sets different buttons such as undo, save as and copy to be enabled. */ void activateMenuOptions(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/menuframe.cpp000066400000000000000000000043421234321124500261050ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "menuframe.h" #include "mainwindowgui.h" #include MenuFrame::MenuFrame(QWidget * parent, const char * name) : QFrame(parent) { focusSpinBox = NULL; focusLineEdit = NULL; setObjectName(name); } void MenuFrame::mousePressEvent( QMouseEvent * ) { } void MenuFrame::setFocusWidget( QSpinBox * focusSpinBox ) { this->focusSpinBox = focusSpinBox; } void MenuFrame::setFocusWidget( QLineEdit * focusLineEdit ) { this->focusLineEdit = focusLineEdit; } void MenuFrame::open( ) { if (focusSpinBox != 0) { focusSpinBox->setFocus(); focusSpinBox->selectAll(); } else if (focusLineEdit != 0) { focusLineEdit->setFocus(); focusLineEdit->selectAll(); } this->show(); } void MenuFrame::close( QWidget * newFocusWidget ) { this->hide(); newFocusWidget->setFocus(); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/menuframe.h000066400000000000000000000071721234321124500255560ustar00rootroot00000000000000 /*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MENUFRAME_H #define MENUFRAME_H #include #include #include #include /** * A customized GUI menu class for embedded menues which shouldn't be visible * at all times. The menues are hidden and pops up at various places in the * gui interface. * * This class allow you to create preferences/etc. menues without resorting to * the modal cover-the-gui menues. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class MenuFrame : public QFrame { Q_OBJECT public: /** * Creates and sets up the menu frame. * * @param parent the parent widget. * @param name the name of the menu. */ MenuFrame(QWidget * parent = 0, const char * name = 0); /** * Sets the focus widget to the QSpinBox: focusSpinBox. * * NB: One should only use use one of the two setFocusWidget functions. If both * are used the spinbox will be used. (A bit hacky but saves me from creating * a custom(/messy!) class hierarchy and gives me time to go out and have * a few beers tonight). * * @param focusSpinBox the focuswidget of this menu. */ void setFocusWidget(QSpinBox * focusSpinBox = 0); /** * Sets the focus widget to the QLineEdit: focusSpinBox. * * NB: One should only use use one of the two setFocusWidget functions. If both * are used the spinbox will be used. (A bit hacky but saves me from creating * a custom(/messy!) class hierarchy and gives me time to go out and have * a few beers tonight). * * @param focusLineEdit the focuswidget of this menu. */ void setFocusWidget(QLineEdit * focusLineEdit = 0); protected: /** * Overloaded function to intercept when the user press the mouse inside * the menu. (So that the mainwindow doesn't get the event). * @param e information about the event. */ void mousePressEvent( QMouseEvent * e); private: QSpinBox *focusSpinBox; QLineEdit *focusLineEdit; public slots: /** * Opens the menu. */ virtual void open(); /** * Closes the menu and turns the focus to the newFocusWidget. * @param newFocusWidget the widget who will recieve the focus after this menu * closes. */ virtual void close(QWidget * newFocusWidget); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/preferencesmenu.cpp000066400000000000000000000075421234321124500273210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "preferencesmenu.h" #include "src/foundation/preferencestool.h" #include "flexiblelineedit.h" #include "importtab.h" #include "exporttab.h" #include "devicetab.h" #include PreferencesMenu::PreferencesMenu(QWidget *parent) : QDialog(parent, Qt::Dialog) { importVideoTab = 0; exportVideoTab = 0; videoDeviceTab = 0; tabWidget = new QTabWidget; applyButton = new QPushButton(tr("Apply"), this); applyButton->setDefault(true); connect(applyButton, SIGNAL(clicked()), this, SLOT(apply())); closeButton = new QPushButton(tr("Close"), this); closeButton->setDefault(true); connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(1); buttonLayout->addWidget(applyButton); buttonLayout->addWidget(closeButton); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setWindowTitle(tr("Preferences Menu")); setMaximumWidth(800); setMinimumWidth(620); setModal(false); makeVideoDeviceTab(); makeVideoImportTab(); makeVideoExportTab(); } void PreferencesMenu::makeVideoImportTab() { importVideoTab = new ImportTab; importVideoTab->initializeImportValues(); importVideoTab->setMinimumHeight(400); tabWidget->addTab(importVideoTab, tr("Video &Import")); } void PreferencesMenu::makeVideoExportTab() { exportVideoTab = new ExportTab; exportVideoTab->initialize(); exportVideoTab->setMinimumHeight(460); tabWidget->addTab(exportVideoTab, tr("Video &Export")); } void PreferencesMenu::makeVideoDeviceTab() { videoDeviceTab = new DeviceTab; videoDeviceTab->initialize(); videoDeviceTab->setMinimumHeight(300); tabWidget->addTab(videoDeviceTab, tr("Video &Device")); } void PreferencesMenu::apply() { setFocus(); videoDeviceTab->apply(); importVideoTab->apply(); exportVideoTab->apply(); PreferencesTool::get()->flushPreferences(); } void PreferencesMenu::display() { videoDeviceTab->initialize(); this->show(); } void PreferencesMenu::retranslateStrings() { applyButton->setText(tr("Apply")); closeButton->setText(tr("Close")); setWindowTitle(tr("Preferences Menu")); tabWidget->setTabText(0, tr("Video &Device")); tabWidget->setTabText(1, tr("Video &Import")); tabWidget->setTabText(2, tr("Video &Export")); importVideoTab->retranslateStrings(); exportVideoTab->retranslateStrings(); videoDeviceTab->retranslateStrings(); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/preferencesmenu.h000066400000000000000000000043461234321124500267650ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PREFERENCESMENU_H #define PREFERENCESMENU_H #include #include #include class ImportTab; class ExportTab; class DeviceTab; /** * The import and export preferences menu. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class PreferencesMenu : public QDialog { Q_OBJECT public: /** * Sets up the filepreview-label. * @param parent the parent of the widget. */ PreferencesMenu(QWidget *parent = 0); void display(); void retranslateStrings(); private: ImportTab *importVideoTab; ExportTab *exportVideoTab; DeviceTab *videoDeviceTab; QTabWidget *tabWidget; QPushButton *applyButton; QPushButton *closeButton; void makeVideoImportTab(); void makeVideoExportTab(); void makeVideoDeviceTab(); private slots: void apply(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/qtfrontend.cpp000066400000000000000000000310601234321124500263070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "qtfrontend.h" #include "src/application/externalcommand.h" #include "src/presentation/frontends/qtfrontend/mainwindowgui.h" #include "src/foundation/preferencestool.h" #include "src/foundation/logger.h" #include "src/technical/util.h" #include "src/domain/animation/workspacefile.h" #include #include #include #include #include #include #include #include #include #include #include QtFrontend::QtFrontend(int &argc, char **argv) { stApp = new QApplication(argc, argv); #if QT_VERSION == 0x040400 stApp->setAttribute(Qt::AA_NativeWindows); #endif // Need to call this here to get the locale for the language // which is used by the translator created in mainWindowGUI initializePreferences(); mw = new MainWindowGUI(stApp); mw->setWindowTitle("Stopmotion"); mw->showMaximized(); progressDialog = 0; progressBar = 0; infoText = 0; timer = 0; } QtFrontend::~QtFrontend() { delete mw; mw = 0; delete stApp; stApp = 0; } int QtFrontend::run(int, char **) { stApp->connect( stApp, SIGNAL(lastWindowClosed()), stApp, SLOT(quit()) ); return stApp->exec(); } void QtFrontend::showProgress(ProgressMessage message, int numOperations) { QString msg = tr("Please wait..."); switch (message) { case connectingCamera: msg = tr("Connecting camera..."); break; case importingFramesFromDisk: msg = tr("Importing frames from disk"); break; case exporting: msg = tr("Exporting..."); break; case restoringProject: msg = tr("Restoring project..."); break; case savingScenesToDisk: msg = tr("Saving scenes to disk..."); break; } if (numOperations > 0) { progressDialog = new QProgressDialog(msg, tr("Cancel"), 0, numOperations, mw); progressDialog->show(); } else { progressBar = new QProgressBar; progressBar->setFixedWidth(150); infoText = new QLabel(msg); mw->statusBar()->addWidget(infoText); mw->statusBar()->addWidget(progressBar); timer = new QTimer(); connect( timer, SIGNAL( timeout() ), this, SLOT( updateProgressBar() ) ); timer->start(10); } } void QtFrontend::hideProgress() { if (progressDialog) { progressDialog->hide(); delete progressDialog; progressDialog = NULL; } else if (progressBar) { timer->stop(); progressBar->hide(); mw->statusBar()->removeWidget(progressBar); mw->statusBar()->removeWidget(infoText); delete progressBar; progressBar = NULL; delete infoText; infoText = NULL; delete timer; timer = NULL; } } void QtFrontend::updateProgress(int numOperationsDone) { if (progressDialog) { progressDialog->setValue(numOperationsDone); } } void QtFrontend::setProgressInfo(const char *infoText) { if (progressDialog) { progressDialog->setLabelText(infoText); } } bool QtFrontend::isOperationAborted() { if (progressDialog) { return progressDialog->wasCanceled(); } return false; } void QtFrontend::processEvents() { stApp->processEvents(); } void QtFrontend::updateProgressBar() { int p = progressBar->value(); progressBar->setValue(++p); } void QtFrontend::reportError(const char *message, int id) { id = id != 0 && id != 1 ? 0 : id; if (id == 0) { QMessageBox::warning(mw, tr("Warning"), message, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); } else { QMessageBox::critical(mw, tr("Fatal"), message, QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); } } void QtFrontend::initializePreferences() { Logger::get().logDebug("Loading preferencestool"); PreferencesTool *prefs = PreferencesTool::get(); WorkspaceFile preferencesFile(WorkspaceFile::preferencesFile); WorkspaceFile oldPrefsFile(WorkspaceFile::preferencesFileOld); // Has to check this before calling setPreferencesFile(...) because // the function creates the file if it doesn't exist. int prefsFileExists = access(preferencesFile.path(), R_OK); if (prefsFileExists != -1) { Util::copyFile(oldPrefsFile.path(), preferencesFile.path()); } // If file doesn't exist or has wrong version number if ( !prefs->setPreferencesFile(preferencesFile.path(), "0.8") ) { // File doesn't exist if (prefsFileExists == -1) { setDefaultPreferences(prefs); } // Has wrong version number else { int useNewPrefsFile = askQuestion(Frontend::useNewerPreferences); // Use new preferences if (useNewPrefsFile == 0) { // 0 = yes setDefaultPreferences(prefs); } // Use old preferences else { rename(oldPrefsFile.path(), preferencesFile.path()); prefs->setPreferencesFile(preferencesFile.path(), prefs->getOldVersion()); // Update version prefs->setVersion("0.8"); // Do necessary updates on the old prefs file: updateOldPreferences(prefs); } } } } void QtFrontend::setDefaultPreferences(PreferencesTool *prefs) { assert(prefs != NULL); Logger::get().logDebug("Setting default preferences"); // Default import options ------------------------------------------------ prefs->setPreference("numberofimports", 5); prefs->setPreference("activedevice", 1); // Default import option 1 prefs->setPreference("importname0", tr("vgrabbj").toUtf8().constData()); prefs->setPreference("importdescription0", tr("The simplest setting. Fairly slow").toUtf8().constData()); prefs->setPreference("importprepoll0", "vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -i vga"); prefs->setPreference("importstartdaemon0", ""); prefs->setPreference("importstopdaemon0", ""); // Default import option 2 prefs->setPreference("importname1", tr("vgrabbj VGA daemon").toUtf8().constData()); prefs->setPreference("importdescription1", tr("Starts vgrabbj as a daemon. Pretty fast.").toUtf8().constData()); prefs->setPreference("importprepoll1", ""); prefs->setPreference("importstartdaemon1", "vgrabbj -f $IMAGEFILE -d $VIDEODEVICE -b -D 0 -i vga -L250"); prefs->setPreference("importstopdaemon1", "kill -9 $(pidof vgrabbj)"); // Default import option 3 prefs->setPreference("importname2", tr("uvccapture").toUtf8().constData()); prefs->setPreference("importdescription2", tr("Grabbing from V4L2 devices").toUtf8().constData()); prefs->setPreference("importprepoll2", "uvccapture -d$VIDEODEVICE -x640 -y480 -o$IMAGEFILE"); prefs->setPreference("importstartdaemon2", ""); prefs->setPreference("importstopdaemon2", ""); // Default import option 4 prefs->setPreference("importname3", tr("videodog singleshot").toUtf8().constData()); prefs->setPreference("importdescription3", tr("Videodog.").toUtf8().constData()); prefs->setPreference("importprepoll3", "videodog -x 640 -y 480 -w 3 -d $VIDEODEVICE -j -f $IMAGEFILE"); prefs->setPreference("importstartdaemon3", ""); prefs->setPreference("importstopdaemon3", ""); // Default import option 5 prefs->setPreference("importname4", tr("dvgrab").toUtf8().constData()); prefs->setPreference("importdescription4", tr("Grabbing from DV-cam.").toUtf8().constData()); prefs->setPreference("importprepoll4", ""); prefs->setPreference("importstartdaemon4", "dvgrab --format jpeg --jpeg-overwrite --jpeg-temp dvtemp.jpeg " "--every 25 $IMAGEFILE &"); prefs->setPreference("importstopdaemon4", "kill -9 $(pidof dvgrab)"); // ----------------------------------------------------------------------- // Default export options ------------------------------------------------ prefs->setPreference("numEncoders", 4); prefs->setPreference("activeEncoder", 3); // Default export option 1 prefs->setPreference("encoderName0", "mencoder"); prefs->setPreference("encoderDescription0", tr("Exports from jpeg images to mpeg1 video").toUtf8().constData()); prefs->setPreference("startEncoder0", "mencoder \"mf://$IMAGEPATH/*.jpg\" -mf w=640:h=480:fps=12:type=jpg " "-ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o \"$VIDEOFILE\""); prefs->setPreference("stopEncoder0", ""); // Default export option 2 prefs->setPreference("encoderName1", "mencoder"); prefs->setPreference("encoderDescription1", tr("Exports from jpeg images to mpeg2 video").toUtf8().constData()); prefs->setPreference("startEncoder1", "mencoder \"mf://$IMAGEPATH/*.jpg\" -mf w=640:h=480:fps=12:type=jpg " "-ovc lavc -lavcopts vcodec=mpeg2video -oac copy -o \"$VIDEOFILE\""); prefs->setPreference("stopEncoder1", ""); // Default export option 3 prefs->setPreference("encoderName2", "mencoder"); prefs->setPreference("encoderDescription2", tr("Exports from jpeg images to mpeg4 video").toUtf8().constData()); prefs->setPreference("startEncoder2", "mencoder -ovc lavc -lavcopts vcodec=msmpeg4v2:vpass=1:$opt -mf type=jpg:fps=12 " "-o \"$VIDEOFILE\" \"mf://$IMAGEPATH/*.jpg\""); prefs->setPreference("stopEncoder2", ""); // Default export option 4 prefs->setPreference("encoderName3", "avconv"); prefs->setPreference("encoderDescription3", tr("Exports from jpeg images to mpeg4 video").toUtf8().constData()); prefs->setPreference("startEncoder3", "avconv -r 12 -b 1800 -i \"$IMAGEPATH/%06d.jpg\" \"$VIDEOFILE\""); prefs->setPreference("stopEncoder3", ""); //------------------------------------------------------------------------- } void QtFrontend::updateOldPreferences(PreferencesTool *prefs) { // Replace all occurences of '(DEFAULTPATH)' with '$IMAGEFILE' (version 0.3 and 0.4) // Replace all occurences of '/dev/xxx' with $VIDEODEVICE (version < 0.7) int numImports = prefs->getPreference("numberofimports", 1); for (int i = 0; i < numImports; ++i) { Preference startPref(QString("importstartdeamon%1") .arg(i).toUtf8().constData(), ""); std::string start(startPref.get()); int index = start.find("(DEFAULTPATH)"); if (index != -1) { start.replace(index, strlen("(DEFAULTPATH)"), std::string("$IMAGEFILE")); } QString s(start.c_str()); s.replace( QRegExp("/dev/(v4l/){0,1}video[0-9]{0,1}"), QString("$VIDEODEVICE") ); prefs->setPreference( QString("importstartdeamon%1") .arg(i).toUtf8().constData(), s.toUtf8().constData()); Preference prepollPref(QString("importprepoll%1") .arg(i).toUtf8().constData(), ""); std::string prepoll(prepollPref.get()); index = prepoll.find("(DEFAULTPATH)"); if (index != -1) { prepoll.replace(index, strlen("(DEFAULTPATH)"), std::string("$IMAGEFILE")); } QString ss(prepoll.c_str()); ss.replace( QRegExp("/dev/(v4l/){0,1}video[0-9]{0,1}"), QString("$VIDEODEVICE") ); prefs->setPreference( QString("importprepoll%1").arg(i).toUtf8().constData(), ss.toUtf8().constData()); } } int QtFrontend::askQuestion(Question question) { QString text; switch (question) { case useNewerPreferences: text = tr( "A newer version of the preferences file with few more default\n" "values exists. Do you want to use this one? (Your old preferences\n " "will be saved in ~/.stopmotion/preferences.xml.OLD)"); break; } int ret = QMessageBox::question(0, tr("Question"), text, QMessageBox::Yes, QMessageBox::No, QMessageBox::NoButton); return ret == QMessageBox::Yes? 0 : 1; } int QtFrontend::runExternalCommand(const char *command) { ExternalCommand *ec = new ExternalCommand; ec->show(); ec->run( QString::fromLocal8Bit(command) ); return 0; } void QtFrontend::setUndoRedoEnabled() { mw->activateMenuOptions(); } void QtFrontend::openProject(const char* file) { mw->openProject(file); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/qtfrontend.h000066400000000000000000000065211234321124500257600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef QTFRONTEND_H #define QTFRONTEND_H #include "src/presentation/frontends/frontend.h" #include class PreferencesTool; class QApplication; class MainWindowGUI; class QProgressDialog; class QProgressBar; class QLabel; class QTimer; /** * Frontend for using the program through a GUI developed with the QT library. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class QtFrontend : public QObject, public Frontend { Q_OBJECT public: /** * Initializing the frontend. * @param argc the argc argument from the environment through main * @param argv argv the argv arguments from the environment through main */ QtFrontend(int &argc, char **argv); /** * Deallocates allocated memory and sets the pointers to NULL. */ virtual ~QtFrontend(); /** * The run function for starting the application. * @param argc the argc argument from the environment through main. * @param argv the argv arguments from the environment through main. * @return the return status on exit */ int run(int argc, char **argv); void showProgress(ProgressMessage message, int numOperations); void hideProgress(); void updateProgress(int numOperationsDone); void setProgressInfo(const char *infoText); bool isOperationAborted(); void processEvents(); void reportError(const char *message, int id); int askQuestion(Question question); int runExternalCommand(const char *command); /** * Set the Undo and Redo actions to be enabled or disabled according to the * state of the command history. */ void setUndoRedoEnabled(); void openProject(const char* file); protected slots: void updateProgressBar(); private: QApplication *stApp; MainWindowGUI *mw; QProgressDialog *progressDialog; QProgressBar *progressBar; QLabel *infoText; QTimer *timer; void initializePreferences(); void setDefaultPreferences(PreferencesTool *prefs); void updateOldPreferences(PreferencesTool *prefs); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/toolsmenu.cpp000066400000000000000000000426251234321124500261610ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "toolsmenu.h" #include "ui_toolsmenu.h" #include "src/foundation/preferencestool.h" #include "graphics/icons/play.xpm" #include "graphics/icons/fastforward.xpm" #include "graphics/icons/rewind.xpm" #include "graphics/icons/steptoend.xpm" #include "graphics/icons/steptobeginning.xpm" #include "graphics/icons/stop.xpm" #include "graphics/icons/pause.xpm" #include "graphics/icons/loop.xpm" #include "graphics/icons/capture.xpm" #include "graphics/icons/cameraon.xpm" #include "graphics/icons/addframeicon.xpm" #include "graphics/icons/removeframeicon.xpm" #include "graphics/icons/newscene.xpm" #include "graphics/icons/removescene.xpm" #include "graphics/icons/gimp.xpm" #include "src/application/runanimationhandler.h" #include "src/application/modelhandler.h" #include "src/application/camerahandler.h" #include "src/domain/domainfacade.h" #include "src/presentation/frontends/qtfrontend/framebar/framebar.h" #include #include #include #include #include #include #include #include ToolsMenu::ToolsMenu(RunAnimationHandler *runAnimationHandler, ModelHandler *modelHandler, CameraHandler *cameraHandler, FrameBar *frameBar, QWidget *parent) : QWidget(parent), ui(0), runAnimationHandler(runAnimationHandler), modelHandler(modelHandler), cameraHandler(cameraHandler), frameBar(frameBar) { ui = new Ui::Form; ui->setupUi(this); loopAccel = 0; playAccel = 0; mixAccel = 0; diffAccel = 0; playbackAccel = 0; captureTimer = new QTimer(this); connect( captureTimer, SIGNAL( timeout() ), cameraHandler, SLOT(captureFrame())); setupUi(); createAccelerators(); } ToolsMenu::~ToolsMenu() { delete captureTimer; } void ToolsMenu::setupUi() { ui->addFramesButton->setIcon( QPixmap(addframeicon) ); ui->addFramesButton->setFocusPolicy( Qt::NoFocus ); connect(ui->addFramesButton, SIGNAL(clicked()), modelHandler, SLOT(chooseFrame())); ui->removeFramesButton->setIcon( QPixmap(removeframeicon) ); ui->removeFramesButton->setFocusPolicy( Qt::NoFocus ); connect(ui->removeFramesButton, SIGNAL(clicked()), modelHandler, SLOT(removeFrames())); runAnimationHandler->setRemoveFramesButton(ui->removeFramesButton); modelHandler->setRemoveFramesButton(ui->removeFramesButton); ui->addSceneButton->setIcon( QPixmap(newscene) ); ui->addSceneButton->setFocusPolicy( Qt::NoFocus ); connect(ui->addSceneButton, SIGNAL(clicked()), modelHandler, SLOT(newScene())); ui->removeSceneButton->setIcon( QPixmap(removescene) ); ui->removeSceneButton->setFocusPolicy( Qt::NoFocus ); connect(ui->removeSceneButton, SIGNAL(clicked()), modelHandler, SLOT(removeScene())); ui->cameraButton->setIcon( QPixmap(cameraon) ); ui->cameraButton->setFocusPolicy( Qt::NoFocus ); cameraHandler->setCameraButton(ui->cameraButton); connect( ui->cameraButton, SIGNAL(clicked()), cameraHandler, SLOT(toggleCamera()) ); ui->captureGroup->hide(); connect( cameraHandler, SIGNAL(cameraStateChanged(bool)), this, SLOT(activateCaptureGroup(bool)) ); ui->captureButton->setIcon( QPixmap(captureicon) ); ui->captureButton->setFocusPolicy( Qt::NoFocus ); connect(ui->captureButton, SIGNAL(clicked()), cameraHandler, SLOT(captureFrame())); ui->viewChooseCombo->setFocusPolicy( Qt::NoFocus ); connect(ui->viewChooseCombo, SIGNAL(activated (int)),this, SLOT(changeViewingMode(int))); ui->unitChooseCombo->setFocusPolicy( Qt::NoFocus ); ui->unitChooseCombo->setEnabled(false); connect(ui->unitChooseCombo, SIGNAL(activated (int)),this, SLOT(changeUnitMode(int))); ui->mixSlider->setMinimum(0); ui->mixSlider->setMaximum(5); ui->mixSlider->setPageStep(1); ui->mixSlider->setValue(2); ui->mixSlider->setTickPosition(QSlider::TicksBelow); ui->mixSlider->setFocusPolicy( Qt::NoFocus ); connect( ui->mixSlider, SIGNAL(valueChanged(int)), cameraHandler, SLOT(setMixCount(int)) ); connect( ui->mixSlider, SIGNAL(valueChanged(int)), this, SLOT(updateSliderValue(int)) ); ui->speedChooser->setMinimum(1); ui->speedChooser->setMaximum(30); ui->speedChooser->setValue(1); ui->speedChooser->setFocusPolicy( Qt::NoFocus ); ui->speedChooser->setValue(PreferencesTool::get()->getPreference("fps", 10)); connect( ui->speedChooser, SIGNAL(valueChanged(int)), runAnimationHandler, SLOT(setSpeed(int))); connect( ui->speedChooser, SIGNAL( valueChanged(int) ), cameraHandler, SLOT(setPlaybackSpeed(int)) ); ui->playButton->setIcon( QPixmap(playicon)); ui->playButton->setFocusPolicy( Qt::NoFocus ); runAnimationHandler->setPlayButton(ui->playButton); connect(ui->playButton, SIGNAL(clicked()), runAnimationHandler, SLOT(runAnimation())); ui->playButton->setEnabled(false); ui->nextFrameButton->setIcon( QPixmap(fastforwardicon) ); ui->nextFrameButton->setFocusPolicy( Qt::NoFocus ); ui->nextFrameButton->setAutoRepeat(true); connect( ui->nextFrameButton, SIGNAL(clicked()), frameBar, SLOT(selectNextFrame()) ); ui->nextFrameButton->setEnabled(false); ui->previousFrameButton->setIcon( QIcon(QPixmap(rewindicon)) ); ui->previousFrameButton->setFocusPolicy( Qt::NoFocus ); ui->previousFrameButton->setAutoRepeat(true); connect( ui->previousFrameButton, SIGNAL(clicked()), frameBar, SLOT(selectPreviousFrame()) ); ui->previousFrameButton->setEnabled(false); ui->toEndButton->setIcon( QIcon(QPixmap(steptoendicon)) ); ui->toEndButton->setFocusPolicy( Qt::NoFocus ); connect( ui->toEndButton, SIGNAL(clicked()), frameBar, SLOT(selectNextScene()) ); ui->toEndButton->setEnabled(false); ui->toBeginningButton->setIcon( QIcon(QPixmap(steptobeginningicon)) ); ui->toBeginningButton->setFocusPolicy( Qt::NoFocus ); connect( ui->toBeginningButton, SIGNAL(clicked()), frameBar, SLOT(selectPreviousScene()) ); ui->toBeginningButton->setEnabled(false); ui->stopButton->setIcon( QIcon(QPixmap(stopicon)) ); ui->stopButton->setFocusPolicy( Qt::NoFocus ); connect( ui->stopButton, SIGNAL(clicked()), runAnimationHandler, SLOT(stopAnimation())); ui->stopButton->setEnabled(false); ui->pauseButton->setIcon( QIcon(QPixmap(pauseicon)) ); ui->pauseButton->setFocusPolicy( Qt::NoFocus ); ui->pauseButton->setEnabled(false); runAnimationHandler->setPauseButton(ui->pauseButton); connect(ui->pauseButton, SIGNAL(clicked()), runAnimationHandler, SLOT(pauseAnimation())); ui->loopButton->setIcon( QIcon(QPixmap(loopicon)) ); ui->loopButton->setFocusPolicy( Qt::NoFocus ); runAnimationHandler->setLoopButton(ui->loopButton); connect( ui->loopButton, SIGNAL(clicked()), runAnimationHandler, SLOT(toggleLooping()) ); ui->loopButton->setEnabled(false); //Launcher for the Gimp. ui->launchGimp->setIcon(QIcon(QPixmap(gimpicon))); ui->launchGimp->setFocusPolicy(Qt::NoFocus); connect(ui->launchGimp, SIGNAL(clicked()), modelHandler, SLOT(editCurrentFrame())); } void ToolsMenu::createAccelerators() { loopAccel = new QShortcut(QKeySequence(Qt::ControlModifier + Qt::Key_L), this); connect(loopAccel, SIGNAL(activated()), ui->loopButton, SLOT(toggle())); playAccel = new QShortcut(QKeySequence(Qt::Key_K), this); connect(playAccel, SIGNAL(activated()), runAnimationHandler, SLOT(toggleRunning())); mixAccel = new QShortcut(QKeySequence(Qt::Key_1), this); connect(mixAccel, SIGNAL(activated()), this, SLOT(setMixingMode())); diffAccel = new QShortcut(QKeySequence(Qt::Key_2), this); connect(diffAccel, SIGNAL(activated()), this, SLOT(setDiffingMode())); playbackAccel = new QShortcut(QKeySequence(Qt::Key_3), this); connect(playbackAccel, SIGNAL(activated()), this, SLOT(setPlaybackMode())); } void ToolsMenu::activateCaptureGroup(bool activate) { if (activate) { ui->captureGroup->show(); } else { ui->captureGroup->hide(); } } void ToolsMenu::retranslateStrings() { ui->speedChooserCaption->setText( tr("FPS chooser") ); ui->mixSliderCaption->setText( tr("Number of images:") ); ui->viewChooseCombo->clear(); ui->viewChooseCombo->addItem( tr("Mix") ); ui->viewChooseCombo->addItem( tr("Diff") ); ui->viewChooseCombo->addItem( tr("Playback") ); ui->viewChooseCombo->addItem( tr("Auto") ); ui->unitChooseCombo->clear(); ui->unitChooseCombo->addItem("Off"); ui->unitChooseCombo->addItem( tr("Per second") ); ui->unitChooseCombo->addItem( tr("Per minute") ); ui->unitChooseCombo->addItem( tr("Per hour") ); ui->unitChooseCombo->setCurrentIndex(0); //Tooltip and whatsthis text QString infoText = tr("

Add Frames (CTRL+F)

" "

Click on this button to add frames to the " "animation.

"); ui->addFramesButton->setToolTip(infoText); ui->addFramesButton->setWhatsThis(infoText); infoText = tr("

Remove Selection (Delete)

" "

Click this button to remove the selected frames " "from the animation.

"); ui->removeFramesButton->setToolTip(infoText); ui->removeFramesButton->setWhatsThis(infoText); infoText = tr("

New Scene (CTRL+E)

" "

Click this button to create a new scene " "to the animation.

"); ui->addSceneButton->setToolTip(infoText); ui->addSceneButton->setWhatsThis(infoText); infoText = tr("

Remove Scene (SHIFT+Delete)

" "

Click this button to remove the selected scene " "from the animation.

"); ui->removeSceneButton->setToolTip(infoText); ui->removeSceneButton->setWhatsThis(infoText); infoText = tr("

Toggle camera on/off (C)

" "

Click this button to toggle the camera on and off

"); ui->cameraButton->setToolTip(infoText); ui->cameraButton->setWhatsThis(infoText ); infoText = tr("

Launch Gimp

" "

Click this button to open the active frame in Gimp

" "

Note that you can also drag images from the frame bar and drop them on Gimp

"); ui->launchGimp->setToolTip(infoText); ui->launchGimp->setWhatsThis(infoText ); infoText = tr("

Capture Frame (Space)

" "

Click on this button to capture a frame from the " "camera an put it in the animation

This can also be " "done by pressing the Space key

"); ui->captureButton->setWhatsThis(infoText); ui->captureButton->setToolTip(infoText); infoText = tr("

Number of images

" "

By changing the value in this slidebar you can specify how many images " "backwards in the animation which should be mixed on top of the camera or " "if you are in playback mode: how many images to play.

" "

By mixing the previous image(s) onto the camera you can more easily see " "how the next shot will be in relation to the other, therby making a smoother " "stop motion animation!

"); ui->mixSliderCaption->setWhatsThis(infoText ); ui->mixSlider->setWhatsThis(infoText); infoText = tr("

FPS chooser

" "

By changing the value in this " "chooser you set which speed the " "animation in the FrameView " "should run at.

" "

To start an animation press the " "Run Animation button.

"); ui->speedChooserCaption->setWhatsThis(infoText ); ui->speedChooser->setWhatsThis(infoText); infoText = tr("

Play animation (K, P)

"); ui->playButton->setToolTip(infoText); infoText = tr("

Stop animation (K, P)

"); ui->stopButton->setToolTip(infoText); infoText = tr("

Previous frame (J, Left)

"); ui->previousFrameButton->setToolTip(infoText); infoText = tr("

Next frame (L, Right)

"); ui->nextFrameButton->setToolTip(infoText); infoText = tr("

Previous scene (I)

"); ui->toBeginningButton->setToolTip(infoText); infoText = tr("

Next scene (O)

"); ui->toEndButton->setToolTip(infoText); infoText = tr("

Loop animation (CTRL+L)

With this button you can set whether " "you want the animation to play to the end, or to loop indefinetly.

"); ui->loopButton->setToolTip(infoText); } void ToolsMenu::updateSliderValue(int sliderValue) { if ( captureTimer->isActive() && sliderValue != 0) { int factor = 0; int index = ui->unitChooseCombo->currentIndex(); switch (index) { case 1: factor = 1000; break; case 2: factor = 60000; break; case 3: factor = 3600000; break; } captureTimer->setInterval(factor / sliderValue); } } void ToolsMenu::setMixingMode() { changeViewingMode(0); } void ToolsMenu::setDiffingMode() { changeViewingMode(1); } void ToolsMenu::setPlaybackMode() { changeViewingMode(2); } void ToolsMenu::changeViewingMode(int index) { if ( cameraHandler->setViewMode(index) ) { ui->viewChooseCombo->setCurrentIndex(index); ui->unitChooseCombo->setCurrentIndex(0); switch (index) { case 0: { ui->mixSlider->setValue(PreferencesTool::get()->getPreference("mixcount", 2)); ui->mixSlider->setMaximum(5); ui->mixSlider->setEnabled(true); ui->mixSliderCaption->setEnabled(true); ui->unitChooseCombo->setEnabled(false); captureTimer->stop(); break; } case 2: { ui->mixSlider->setMaximum(50); ui->mixSlider->setValue(PreferencesTool::get()->getPreference("playbackcount", 5)); ui->mixSliderCaption->setEnabled(true); ui->mixSlider->setEnabled(true); ui->unitChooseCombo->setEnabled(false); captureTimer->stop(); break; } case 3: { ui->mixSlider->setMaximum(10); ui->mixSlider->setValue(1); ui->mixSliderCaption->setEnabled(true); ui->mixSlider->setEnabled(true); ui->unitChooseCombo->setEnabled(true); break; } default: { ui->mixSlider->setEnabled(false); ui->mixSliderCaption->setEnabled(false); ui->unitChooseCombo->setEnabled(false); captureTimer->stop(); break; } } } else { QMessageBox::warning(this, tr("Notice"), tr( "Playback only currently works when running the grabber \n" "as a daemon. Go to the preferences menu (CTRL+P) to switch \n" "to running the image grabbing as a daemon."), QMessageBox::Ok, QMessageBox::NoButton, QMessageBox::NoButton); ui->viewChooseCombo->setCurrentIndex(0); cameraHandler->setViewMode(0); } } void ToolsMenu::changeUnitMode(int index) { int sliderValue = ui->mixSlider->value(); if (sliderValue == 0 || index == 0) { if (captureTimer->isActive()) { captureTimer->stop(); } return; } int factor = 0; switch (index) { case 1: factor = 1000; break; case 2: factor = 60000; break; case 3: factor = 3600000; break; default: if ( captureTimer->isActive() ) { captureTimer->stop(); } break; } if ( captureTimer->isActive() == false) { // Grab the first frame manually cameraHandler->captureFrame(); // then grab at the given interval captureTimer->start(factor / sliderValue); } else { captureTimer->setInterval(factor / sliderValue); } } void ToolsMenu::fixNavigationButtons(int modelSize) { //Not <=1 because it is signed with a meaning for -1. if (modelSize == 0 || modelSize == 1) { if (ui->previousFrameButton->isEnabled()) { ui->previousFrameButton->setEnabled(false); ui->nextFrameButton->setEnabled(false); ui->playButton->setEnabled(false); ui->loopButton->setEnabled(false); ui->pauseButton->setEnabled(false); ui->stopButton->setEnabled(false); ui->toEndButton->setEnabled(false); ui->toBeginningButton->setEnabled(false); } } else if (modelSize >= 2) { if ( !ui->previousFrameButton->isEnabled() && !cameraHandler->isCameraRunning() ) { ui->previousFrameButton->setEnabled(true); ui->nextFrameButton->setEnabled(true); ui->playButton->setEnabled(true); ui->loopButton->setEnabled(true); ui->pauseButton->setEnabled(true); ui->stopButton->setEnabled(true); ui->toEndButton->setEnabled(true); ui->toBeginningButton->setEnabled(true); } } } void ToolsMenu::cameraOn(bool isOn) { if (isOn) { ui->playButton->setEnabled(false); ui->loopButton->setEnabled(false); ui->pauseButton->setEnabled(false); ui->stopButton->setEnabled(false); ui->launchGimp->setEnabled(false); runAnimationHandler->stopAnimation(); changeViewingMode(0); ui->viewChooseCombo->setCurrentIndex(0); } else { ui->playButton->setEnabled(true); ui->loopButton->setEnabled(true); ui->pauseButton->setEnabled(true); ui->stopButton->setEnabled(true); ui->launchGimp->setEnabled(true); if ( captureTimer->isActive() ) { captureTimer->stop(); } } fixNavigationButtons(DomainFacade::getFacade()->getModelSize()); } stopmotion-0.8.0/src/presentation/frontends/qtfrontend/toolsmenu.h000066400000000000000000000104351234321124500256200ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TOOLSMENU_H #define TOOLSMENU_H #include class QShortcut; class QTimer; class QWidget; class RunAnimationHandler; class ModelHandler; class CameraHandler; class FrameBar; class Ui_Form; /** * The tools menu on the left side in the application. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ToolsMenu : public QWidget { Q_OBJECT public: /** * Sets up the toolsmenu. * @param parent the parent of the widget. */ ToolsMenu( RunAnimationHandler *runAnimationHandler, ModelHandler *modelHandler, CameraHandler *cameraHandler, FrameBar *frameBar, QWidget *parent = 0 ); ~ToolsMenu(); /** * Retranslates the strings. * This function is called after a new translator has been installed so that * the program strings are retranslated to the new language. */ void retranslateStrings(); public slots: /** * Activates or deactivates the captureGroup * @param activate true if the group should be activated. */ void activateCaptureGroup(bool activate); /** * This slot is notified when the size of the model changes so that menuframe * menu options can be adjusted (activated/deactivated, etc). * @param modelSize the new size of the model. */ void fixNavigationButtons(int modelSize); private: Ui_Form* ui; RunAnimationHandler *runAnimationHandler; ModelHandler *modelHandler; CameraHandler *cameraHandler; FrameBar *frameBar; QShortcut *loopAccel; QShortcut *playAccel; QShortcut *mixAccel; QShortcut *diffAccel; QShortcut *playbackAccel; QTimer *captureTimer; /** * Creates connections, adds icons to the buttons and sets * different properities. */ void setupUi(); /** * Creates key accelerators (keyboard shortcuts) * More can be found in the function MainWindowGUI::createAccelerators(). */ void createAccelerators(); private slots: /** * Slot for notified the toolsmenu when the viewing mode changes, so that widgets * can be updated. * @param index the new viewing mode. */ void changeViewingMode(int index); /** * Slot for notified the toolsmenu when the unit mode changes. * @param index the new unit mode. */ void changeUnitMode(int index); /** * Slot for updating the slider value when running in automatic mode. * @param value the new slider value. */ void updateSliderValue(int value); /** * Slot for setting the camera mode to mixing. * Used by the shortcut key. */ void setMixingMode(); /** * Slot for setting the camera mode to Diffing. * Used by the shortcut key. */ void setDiffingMode(); /** * Slot for setting the camera mode to Playback. * Used by the shortcut key. */ void setPlaybackMode(); /** * Slot for being notified when the camera is turned on so that * it disable of some buttons. * @param isOn true if the camera is turned on. */ void cameraOn(bool isOn); signals: void viewingModeChanged(); }; #endif stopmotion-0.8.0/src/presentation/frontends/qtfrontend/toolsmenu.ui000066400000000000000000000237051234321124500260120ustar00rootroot00000000000000 Form 0 0 179 634 0 0 179 430 179 16777215 Form 2 0 2 0 32 32 32 32 2 0 32 32 32 32 Qt::Vertical 20 40 0 0 6 9 0 6 0 0 0 0 24 24 Qt::Horizontal 32 32 0 0 6 9 0 6 0 0 0 0 0 0 0 0 0 0 true 0 0 true 0 0 0 0 6 0 Qt::Horizontal 40 20 32 32 stopmotion-0.8.0/src/presentation/frontends/selection.h000066400000000000000000000042761234321124500234020ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SELECTION_H_ #define SELECTION_H_ /** * Interface for retrieving selection. */ class Selection { public: virtual ~Selection() {} /** * Returns true if the user is currently selecting several thumbviews. * @return true if the user is currently selecting several thumbviews. */ virtual bool isSelecting() const = 0; /** * Returns The frame number of the anchor of the selection. * @return The anchor of the current selection, or returns the same value * as {@ref getActiveFrame} if there is no selection. */ virtual int getSelectionAnchor() const = 0; /** * Returns the current active frame. */ virtual int getActiveFrame() const = 0; /** * Returns the current active scene. */ virtual int getActiveScene() const = 0; }; #endif stopmotion-0.8.0/src/presentation/imagecache.cpp000066400000000000000000000042451234321124500220100ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "imagecache.h" #include "loadcache.h" #include struct SurfaceLoader { typedef SDL_Surface value_t; static value_t* load(const char*); static void free(value_t*); }; SurfaceLoader::value_t* SurfaceLoader::load(const char* path) { return IMG_Load(path); } void SurfaceLoader::free(SurfaceLoader::value_t* s) { SDL_FreeSurface(s); } ImageCache::ImageCache(int cacheSize) : delegate(0) { delegate = new LoadCache(cacheSize); } ImageCache::~ImageCache() { delete delegate; } SDL_Surface* ImageCache::get(const char* path) { if (!path) return 0; return delegate->get(path); } void ImageCache::drop(const char* path) { delegate->drop(path); } void ImageCache::clear() { delegate->clear(); } stopmotion-0.8.0/src/presentation/imagecache.h000066400000000000000000000041651234321124500214560ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef IMAGECACHE_H_ #define IMAGECACHE_H_ class SDL_Surface; struct SurfaceLoader; template class LoadCache; class ImageCache { LoadCache* delegate; public: /** * Constructs an image cache. * @param cacheSize The number of images that the cache should hold. */ ImageCache(int cacheSize); ~ImageCache(); /** * Pulls the named image into the cache, if necessary, and returns it. * @param path The path of the file. */ SDL_Surface* get(const char* path); /** * Removes the named image from the cache, if it is present. * @param path The path of the file. */ void drop(const char* path); /** * Clears the cache. */ void clear(); }; #endif stopmotion-0.8.0/src/presentation/loadcache.h000066400000000000000000000153711234321124500213140ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef LOADCACHE_H_ #define LOADCACHE_H_ #include #include /** * Type parameter {@c T} has the following members: * {@c T::value_t} Type of value loaded. * {@code{.cpp} T::value_t* T::load(const char* path) @endcode} Load the file. * {@code{.cpp} T::free(T::value_t*) @endcode} Free the value. */ template class LoadCache { public: /** * Constructs an image cache. * @param cacheSize The number of images that the cache should hold. */ LoadCache(int cacheSize); ~LoadCache(); /** * Pulls the named image into the cache, if necessary, and returns it. * @param path The path of the file. */ typename T::value_t* get(const char* path); /** * Removes the named image from the cache, if it is present. * @param path The path of the file. */ void drop(const char* path); /** * Clears the cache. */ void clear(); private: class Item { std::string n; typename T::value_t* v; Item* next; Item(const Item&); Item& operator=(const Item&); public: Item(); ~Item(); /** * Clear the path and value (so both will return null). * Any previously returned path and value is destroyed. */ void clear(); /** * @return Ownership is not returned. */ const char* path() const; /** * @return Ownership is not returned. */ typename T::value_t* value() const; /** * Sets the path and value. * @param path A copy is taken, so ownership is not passed and the * lifetime of the original is immaterial. * @param value Ownership is passed. */ void set(const char* path, typename T::value_t* value); /** * Find the item in a list and move it to the front, if it exists. * @param [in] path The path to find. * @param [in,out] head Pointer to the head of the list. On exit, * this will point to the found element (if found). * @return The found element, or NULL if no such element. */ static Item* find(const char* path, Item*& head); /** * Find the item in a list and move it to freeHead front, if it exists. * If not, move the last element to {@c free} and clear it. * @param [in] path The path to find. * @param [in,out] head Pointer to the head of the list. On exit, * this will point to the found element (if found). * @param [in,out] freeHead Pointer to pointer to the head of the list * to receive a cleared element if not found. If NULL acts the same as * {@ref find} (i.e. does not move the last element on failure to find) * @return The found element, or NULL if no such element. */ static Item* findOrFree(const char* path, Item*& head, Item** freeHead); /** * Move the head of one list to another. * @param [in,out] to The head of the list to receive the element. * On return, this will hold the transferred element. * @param [in,out] from The head of the list that needs its head * removed. On return this will point to the second element in the * list, or be NULL if there is none. * @note if to and from are the same, this function has no effect. */ static void move(Item*& to, Item*& from); }; Item* buffer; Item* cacheHead; Item* freeHead; }; template LoadCache::LoadCache(int cacheSize) : buffer(0), cacheHead(0), freeHead(0) { buffer = new Item[cacheSize < 1? 1 : cacheSize]; // construct the free list for (int i = 0; i != cacheSize; ++i) { Item* p = buffer + i; Item::move(freeHead, p); } } template LoadCache::~LoadCache() { clear(); delete[] buffer; } template typename T::value_t* LoadCache::get(const char* path) { Item* p = Item::findOrFree(path, cacheHead, &freeHead); if (p) return p->value(); typename T::value_t* value = T::load(path); freeHead->set(path, value); Item::move(cacheHead, freeHead); return cacheHead->value(); } template void LoadCache::drop(const char* path) { Item* p = Item::find(path, cacheHead); if (p) { cacheHead->clear(); Item::move(freeHead, cacheHead); } } template void LoadCache::clear() { while (cacheHead) { cacheHead->clear(); Item::move(freeHead, cacheHead); } } template LoadCache::Item::Item() : v(0), next(0) { } template LoadCache::Item::~Item() { clear(); } template void LoadCache::Item::clear() { n.clear(); T::free(v); v = 0; } template const char* LoadCache::Item::path() const { return n.c_str(); } template typename T::value_t* LoadCache::Item::value() const { return v; } template void LoadCache::Item::set(const char* path, typename T::value_t* value) { clear(); n = path; v = value; } template typename LoadCache::Item* LoadCache::Item::find( const char* path, Item*& head) { return findOrFree(path, head, 0); } template typename LoadCache::Item* LoadCache::Item::findOrFree( const char* path, Item*& head, Item** freeHead) { Item** pp = &head; Item** pLast = 0; while (*pp) { if (0 == strcmp((*pp)->n.c_str(), path)) { move(head, *pp); return head; } pLast = pp; pp = &(*pp)->next; } if (freeHead && !*freeHead && pLast) { move(*freeHead, *pLast); } return 0; } template void LoadCache::Item::move(Item*& to, Item*& from) { if (from && from != to) { Item* moving = from; from = moving->next; moving->next = to; to = moving; } } #endif /* LOADCACHE_H_ */ stopmotion-0.8.0/src/presentation/observer.h000066400000000000000000000121301234321124500212260ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2013 by Linuxstopmotion contributors. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OBSERVER_H #define OBSERVER_H #include "src/config.h" #include "src/domain/animation/frame.h" #include "src/presentation/frontends/frontend.h" #include using namespace std; /** * The observer interface. Any object wanting to be notified when something * changes in the animationmodel has to implement from this class. * * The observers implemented with this class also has to be attached to the * animationmodel. * * The observer is implemented with strong use of the push model. Although this * decreases the flexibility we gain alot in efficiency which is more * important to us. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class Observer { public: virtual ~Observer() {} /** * Abstract function for receiving notification about new frames added to the model. * * @param frames the frames which has been added to the model. * @param scene The scene to which the frames have been added. * @param index The frame number within the scene to which the frames have * been added. * @param frontend the GUI frontend which is used to displaying progress on timeconsuming operations */ virtual void updateAdd(int scene, int index, int numFrames) = 0; /** * Abstract function for receiving notification about frames removed from the model. * @param fromFrame the first frame of those removed * @param toFrame the last frame of those removed */ virtual void updateRemove(int scene, int fromFrame, int toFrame) = 0; /** * Abstract function for receiving notification when frames are moved in the model. * @param fromScene The scene that the frames were moved from. * @param fromFrame Index of the first selected frame within {@a fromScene} * @param count The number of frames moved. * @param toScene The scene to which the frames were moved. * @param toFrame The position within scene {@a toScene} that the frames * were moved to. */ virtual void updateMove(int fromScene, int fromFrame, int count, int toScene, int toFrame) = 0; /** * Abstract function for receiving notification when the model is erased. */ virtual void updateClear() = 0; /** * Abstract function for receiving notification when a new scene is * created at location index. * @param index The location at which the new scene is created. */ virtual void updateNewScene(int index) = 0; /** * Abstract function for receiving notification when a scene is removed from * the model. * @param sceneNumber the scene which has been removed from the model. */ virtual void updateRemoveScene(int sceneNumber) = 0; /** * Abstract function for receiving notification when a scene in the animation * has been moved. * @param sceneNumber the scene that has been moved. * @param movePosition the position the scene has been moved to. */ virtual void updateMoveScene(int sceneNumber, int movePosition) = 0; /** * Abstract function for receiving notification when the disk representation of the * animation is changed by other programs. * @param sceneNumber The scene to which the changed frame belongs. * @param frameNumber The index of the frame that has been changed. */ virtual void updateAnimationChanged(int activeScene, int frameNumber) = 0; /** * Abstract function for receiving notifications when the number, order or * names of the sounds attached to a frame change. * @param sceneNumber The scene to which the frame belongs. * @param frameNumber The frame within scene number @a sceneNumber to which * the changed sounds belong. */ virtual void updateSoundChanged(int sceneNumber, int frameNumber) = 0; /** * Resynchronizes the observer with the state of the animation. This is * called whenever the animation is called with out-of-range arguments. */ virtual void resync() = 0; }; #endif stopmotion-0.8.0/src/technical/000077500000000000000000000000001234321124500164505ustar00rootroot00000000000000stopmotion-0.8.0/src/technical/audio/000077500000000000000000000000001234321124500175515ustar00rootroot00000000000000stopmotion-0.8.0/src/technical/audio/audiodriver.h000066400000000000000000000054341234321124500222450ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef AUDIODRIVER_H #define AUDIODRIVER_H #include "audioformat.h" /** * Interface to be used by the implemented sound drivers. They * will be responsible for initializing of the sound device and flushing * PCM data to this device. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class AudioDriver { public: virtual ~AudioDriver() {}; /** * Abstract function for playing PCM data. The registered audio format * takes care of decoding to raw PCM. This function will not free the * CPU until the playing is finished. Use the playInThread function if * you want to play the sound in a separate thread. */ virtual void play() = 0; /** * Abstract function for playing PCM data. It works excactly like the play * function except that it plays in a separate thread. */ virtual void playInThread() = 0; /** * Abstract function for adding a audio file which later on can be played * with the play or playInThread functions. * @param audioFile the audio file to be played */ virtual void addAudioFile(AudioFormat *audioFile) = 0; /** * Abstract function for initializing the registered audio device. * @return true on success, false otherwise */ virtual bool initialize() = 0; /** * Abstract function for freeing the audio device so that other programs * can use it. */ virtual void shutdown() = 0; }; #endif stopmotion-0.8.0/src/technical/audio/audioformat.cpp000066400000000000000000000034711234321124500225740ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "audioformat.h" AudioFormat::~AudioFormat() { } CouldNotOpenFileException::CouldNotOpenFileException() { } const char* CouldNotOpenFileException::what() const throw () { return "Could not open file"; } InvalidAudioFormatException::InvalidAudioFormatException() { } const char* InvalidAudioFormatException::what() const throw () { return "Unrecognized audio format"; } stopmotion-0.8.0/src/technical/audio/audioformat.h000066400000000000000000000057111234321124500222400ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef AUDIOFORMAT_H #define AUDIOFORMAT_H #include class CouldNotOpenFileException : public std::exception { public: CouldNotOpenFileException(); const char* what() const throw(); }; class InvalidAudioFormatException : public std::exception { public: InvalidAudioFormatException(); const char* what() const throw(); }; /** * Interface to be used by the implemented audio formats. They * will be responsible for decoding from their own format to raw PCM. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class AudioFormat { public: virtual ~AudioFormat(); /** * Abstract function for opening the file registered with setFilename. * @return 0 on success, -1 on failure */ virtual int open() = 0; /** * Abstract function for closing the file registered with setFilename. * @return 0 on success, -1 on failure */ virtual int close() = 0; /** * Abstract function for filling the buffer with raw PCM data. It * fills the buffer with up to 'numBytes' bytes. * @param audioBuffer the buffer to be filled * @param numBytes number of bytes available in the buffer * @return number of bytes written to buffer */ virtual int fillBuffer(char *audioBuffer, int numBytes) = 0; /** * Abstract function for retrieving the sound path. * @return the sound path */ virtual const char* getSoundPath() const = 0; /** * Retrieves the basename of the sound file. * @return The filename with extension and without any path. */ virtual const char* getBasename() const = 0; }; #endif stopmotion-0.8.0/src/technical/audio/oggvorbis.cpp000066400000000000000000000067171234321124500222710ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "oggvorbis.h" #include "src/foundation/logger.h" #include #include #include #include OggVorbis::OggVorbis() { oggFile = NULL; } OggVorbis::~OggVorbis() { if (oggFile != NULL) { ov_clear(oggFile); free(oggFile); oggFile = NULL; } } void OggVorbis::setFilename(WorkspaceFile& file) { assert(file.path() != NULL); // Opens the file and tests for vorbis-ness FILE *f = fopen(file.path(), "r"); if (f) { if (oggFile != NULL) { free(oggFile); oggFile = NULL; } oggFile = (OggVorbis_File*)malloc( sizeof(OggVorbis_File) ); if (oggFile == NULL) { // logFatal terminates the application Logger::get().logFatal("Cannot allocate, out of memory!"); } if ( ov_test(f, oggFile, NULL, 0) < 0 ) { Logger::get().logDebug("Not a valid oggfile"); fclose(f); free(oggFile); oggFile = NULL; throw InvalidAudioFormatException(); } // This also closes the file stream (f) ov_clear(oggFile); free(oggFile); oggFile = NULL; this->filename.swap(file); } else { Logger::get().logDebug("Cannot open file for reading"); throw CouldNotOpenFileException(); } } int OggVorbis::open() { FILE *f = fopen(filename.path(), "r"); if (f) { oggFile = (OggVorbis_File*)malloc( sizeof(OggVorbis_File) ); if (oggFile == NULL) { // logFatal terminates the application Logger::get().logFatal("Cannot allocate, out of memory!"); } if ( ov_open(f, oggFile, NULL, 0) == 0 ) { return 0; } fclose(f); free(oggFile); oggFile = NULL; } return -1; } int OggVorbis::close() { if (oggFile) { ov_clear(oggFile); free(oggFile); oggFile = NULL; return 0; } return -1; } int OggVorbis::fillBuffer(char *audioBuffer, int numBytes) { assert(audioBuffer != NULL); if (oggFile) { int crap; int ret = ov_read(oggFile, audioBuffer, numBytes, 0, 2, 1, &crap); return ret; } return 0; } const char* OggVorbis::getSoundPath() const { return filename.path(); } const char* OggVorbis::getBasename() const { return filename.basename(); } stopmotion-0.8.0/src/technical/audio/oggvorbis.h000066400000000000000000000061501234321124500217250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OGGVORBIS_H #define OGGVORBIS_H #include "audioformat.h" #include #include "src/domain/animation/workspacefile.h" /** * Class for decoding of oggvorbis data to raw PCM data. * * @author Bjoern Erik Nilsen & Fredrik B. Kjoelstad */ class OggVorbis : public AudioFormat { public: /** * Initializes the member pointers to NULL. */ OggVorbis(); ~OggVorbis(); /** * Function for registering the given filename to be an ogg file. This * function checks that the file can be opened and that it is a valid * ogg file. * @param file the filename to register */ void setFilename(WorkspaceFile& file); /** * Function for opening the file registered with setFilename. * @return 0 on success, -1 on failure */ int open(); /** * Function for closing the file registered with setFilename. * @return 0 on success, -1 on failure */ int close(); /** * Function to fill the buffer with PCM data. It fills the * buffer with up to 'numBytes' bytes. * @param audioBuffer the buffer to be filled * @param numBytes number of bytes available in the buffer * @return number of bytes written to buffer */ int fillBuffer(char *audioBuffer, int numBytes); /** * Function for retrieving the sound path. * @return the sound path */ const char* getSoundPath() const; /** * Retrieves the basename of the sound file. * @return The filename with extension and without any path. */ const char* getBasename() const; private: /** The ogg representation of the file registered in this class. */ OggVorbis_File *oggFile; /** The filename registred in this class. Hopefully a valid ogg file. */ WorkspaceFile filename; }; #endif stopmotion-0.8.0/src/technical/audio/ossdriver.cpp000066400000000000000000000115361234321124500223030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "ossdriver.h" #include "src/foundation/logger.h" #include #if defined(__linux__) #include #endif #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) #include #endif #include #include #include #include #include // Help function for starting a new thread extern "C" void* startupThread(void *arg) { OSSDriver *tmp = (OSSDriver*)arg; tmp->play(); pthread_exit(0); } OSSDriver::OSSDriver(const char *device) { assert(device != NULL); audioFD = -1; stopPlaying = 1; audioDevice = new char[strlen(device) + 1]; strcpy(audioDevice, device); } OSSDriver::~OSSDriver() { delete [] audioDevice; audioDevice = NULL; if (audioFD != -1) { close(audioFD); } } void OSSDriver::play() { if (audioFD != -1 && audioFD != EBUSY) { AudioFormat *tmp = audioFiles.back(); if ( tmp->open() != -1 ) { // How many bytes can be written to the buffer int avail = sizeof(audioBuffer); // Fill the buffer with up to 'avail' bytes int written = tmp->fillBuffer(audioBuffer, avail); // While the ``producer'' has written more than zero // bytes to the buffer while (written > 0 && stopPlaying == 0) { // Flush it to the device write(audioFD, audioBuffer, written); // and fill again written = tmp->fillBuffer(audioBuffer, avail); } tmp->close(); } } } void OSSDriver::addAudioFile(AudioFormat *audioFile) { audioFiles.push_back(audioFile); } void OSSDriver::playInThread() { pthread_t audioThread; pthread_create(&audioThread, NULL, startupThread, this); audioThreads.push_back(audioThread); } bool OSSDriver::initialize() { Logger::get().logDebug("Tries to initialize the sound device"); // Opens the device write only and sets the flag to non-blocking. // This means that the call imidiately returns with a return value audioFD = open(audioDevice, O_WRONLY | O_NONBLOCK, 0); if (audioFD == -1 || audioFD == EBUSY) { fprintf(stderr, "Cannot open device %s: %s\n", audioDevice, strerror(errno)); return false; } // Turns on blocking (disables the non-blocking flag) fcntl(audioFD, F_SETFL,0); // Storing the request and its argument int initValues[2][4] = { {SNDCTL_DSP_RESET, SNDCTL_DSP_SETFMT, SOUND_PCM_WRITE_CHANNELS, SOUND_PCM_WRITE_RATE}, {1, AFMT_S16_LE, 2, 44100} }; for (int i = 0; i < 4; ++i) { // Initializes the audio device if ( !setIoctl(initValues[0][i], initValues[1][i]) ) { close(audioFD); audioFD = -1; return false; } } stopPlaying = 0; return true; } bool OSSDriver::setIoctl(int request, int param) { int p = param; int ret = ioctl(audioFD, request, &p); if (ret == -1) { fprintf(stderr, "Initializing failed: %s\n", strerror(errno)); return false; } else if (p != param) { printf("Device has not support for requested argument %d\n", param); return false; } return true; } void OSSDriver::shutdown() { if (audioFD != -1) { Logger::get().logDebug("Shutdowns the audio device"); stopPlaying = 1; // Wait for the threads to terminate unsigned int numElem = audioThreads.size(); for (unsigned int i = 0; i < numElem; ++i) { pthread_join(audioThreads[i], NULL); } audioThreads.clear(); numElem = audioFiles.size(); for (unsigned int i = 0; i < numElem; ++i) { // Just to ensure that the file is closed audioFiles[i]->close(); } audioFiles.clear(); close(audioFD); audioFD = -1; } } stopmotion-0.8.0/src/technical/audio/ossdriver.h000066400000000000000000000071451234321124500217510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OSSDRIVER_H #define OSSDRIVER_H #include "audiodriver.h" #include #include #include /** * OSS audio driver. This takes care of initializing the registered audio * device with differents parameters. The device will then by ready to * to play sound if the initializing was successfull. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class OSSDriver : public AudioDriver { public: /** * Registers the given device. * @param device the device to be used */ OSSDriver(const char *device); ~OSSDriver(); /** * Function for playing PCM data. The registered audio format * takes care of decoding to raw PCM. This function will not free the * CPU until the playing is finished. Use the playInThread function if * you want to play the sound in a separate thread. */ void play(); /** * Function for playing PCM data. It works excactly like the play * function except that it plays in a separate thread. */ void playInThread(); /** * Function for adding a audio file which later on can be played * with the play or playInThread functions. * @param audioFile the audio file to be played */ void addAudioFile(AudioFormat *audioFile); /** * Function for initializing the registered audio device. * @return true on success, false otherwise */ bool initialize(); /** * Function for freeing the audio device so that other programs can use it. */ void shutdown(); private: /** Descriptor to the audio device. */ int audioFD; /** 0 = play, 1 = stop */ int stopPlaying; /** Pointer to the registered audio device. */ char *audioDevice; /** Buffer to be used on playing. This will be filled by the AudioFormat object. */ char audioBuffer[4096]; /** Contains all of the sounds to be played. */ std::vector audioFiles; /** Contains indentifications to the threads. */ std::vector audioThreads; /** * Does a ioctl call with the given parameters. It checks if the call * was successfully done. * @param request the request * @param param parameter to the request * @return true on success, false otherwise */ bool setIoctl(int request, int param); }; #endif stopmotion-0.8.0/src/technical/grabber/000077500000000000000000000000001234321124500200545ustar00rootroot00000000000000stopmotion-0.8.0/src/technical/grabber/commandlinegrabber.cpp000066400000000000000000000070051234321124500243750ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/technical/grabber/commandlinegrabber.h" #include "src/technical/util.h" #include #include #include #include #include #include using namespace std; CommandLineGrabber::CommandLineGrabber(const char* filePath, bool isProcess) : ImageGrabber(filePath, isProcess) { isInitSuccess = false; this->prePoll = ""; this->startProcess = ""; this->stopProcess = ""; } bool CommandLineGrabber::setPrePollCommand(const char *command) { // This happens if the user doesn't uses pre poll if ( strcmp(command, "") == 0) { return true; } prePoll = parseCommand(command); if (prePoll != "") { return true; } return false; } bool CommandLineGrabber::setStartCommand(const char *command) { // This happens if the user doesn't uses start command if ( strcmp(command, "") == 0) { return true; } startProcess = parseCommand(command); if (startProcess != "") { return true; } return false; } bool CommandLineGrabber::setStopCommand(const char *command) { stopProcess = parseCommand(command); return true; } bool CommandLineGrabber::init() { if (isProcess) { if (startProcess != "") { Logger::get().logDebug("Attemting to start process"); system(startProcess.c_str()); } else { return false; } } return true; } bool CommandLineGrabber::tearDown() { Logger::get().logDebug("Attemting to shutt down process"); if (stopProcess != "") { system( stopProcess.c_str() ); return true; } return false; } bool CommandLineGrabber::grab() { if ( prePoll.empty() || system(prePoll.c_str()) != 0 ) { isInitSuccess = false; return false; } return true; } string CommandLineGrabber::parseCommand(const char * command) { string tmp = command; int spaceIdx = tmp.find(" ", 0); std::string commandName = tmp.substr(0, spaceIdx); std::string path; if (Util::checkCommand(&path, commandName.c_str())) { tmp.replace(0, spaceIdx, path); int index = tmp.find("$IMAGEFILE"); if (index != -1) { tmp.replace(index, strlen("$IMAGEFILE"), string(filePath)); } return tmp; } return ""; } stopmotion-0.8.0/src/technical/grabber/commandlinegrabber.h000066400000000000000000000061111234321124500240370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef COMMANDLINEGRABBER_H #define COMMANDLINEGRABBER_H #include "src/config.h" #include "imagegrabber.h" #include using std::string; /** * Abstract class for the different video grabbers used by the VideoView * widgets. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class CommandLineGrabber : public ImageGrabber { public: /** * Initializes the member variables. * @param filePath path to the output file grabbed from a device * @param prePoll the pre-poll command to be run before grabbing * @param startProcess command line for starting the process * @param stopProcess command line for stopping the process * @param isProcess true if the process is running in daemon mode, false otherwise */ /*CommandLineGrabber(char* filePath, const char* prePoll, const char* startProcess, const char* stopProcess, bool isProcess = false);*/ CommandLineGrabber(const char* filePath, bool isProcess = false); ~CommandLineGrabber() {}; bool setPrePollCommand(const char *command); bool setStartCommand(const char *command); bool setStopCommand(const char *command); /** * Starts the grabber if it is marked to be run in daemon mode. * @return true on success, false otherwise */ bool init(); /** * Grabs one picture from the device. * @return true on success, false otherwise */ bool grab(); /** * Shut downs the grabber process either if it is run in daemon * mode or "single grab" mode. * @return true on success, false otherwise */ bool tearDown(); private: string prePoll; string startProcess; string stopProcess; bool isInitSuccess; string parseCommand(const char* command); }; #endif stopmotion-0.8.0/src/technical/grabber/imagegrabber.cpp000066400000000000000000000032101234321124500231630ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "imagegrabber.h" ImageGrabber::ImageGrabber(const char* filePath, bool isProcess) : filePath(filePath), isProcess(isProcess) { } bool ImageGrabber::isGrabberProcess() { return isProcess; } stopmotion-0.8.0/src/technical/grabber/imagegrabber.h000066400000000000000000000053311234321124500226360ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef IMAGEGRABBER_H #define IMAGEGRABBER_H /** * Abstract class for the different video grabbers used by the SDLVideoView * widget. * * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class ImageGrabber { public: /** * Constructs and initializes the object. * @param filePath path to the output file grabbed from a device * @param isProcess true if the process is running in daemon mode, false otherwise */ ImageGrabber(const char* filePath, bool isProcess = false); virtual ~ImageGrabber() {}; /** * Checks if the process is running in daemon mode. * @return true if it runs in daemon mode, false otherwise */ bool isGrabberProcess(); virtual bool setPrePollCommand(const char *command) = 0; virtual bool setStartCommand(const char *command) = 0; virtual bool setStopCommand(const char *command) = 0; /** * Abstract function for initializing the grabber. * @return true on success, false otherwise */ virtual bool init() = 0; /** * Abstract function for shutting down the grabber. * @return true on success, false otherwise */ virtual bool tearDown() = 0; /** * Abstract function for grabbing an image. * @return true on success, false otherwise */ virtual bool grab() = 0; protected: const char* filePath; bool isProcess; }; #endif stopmotion-0.8.0/src/technical/libng/000077500000000000000000000000001234321124500175435ustar00rootroot00000000000000stopmotion-0.8.0/src/technical/libng/devices.c000066400000000000000000000033071234321124500213340ustar00rootroot00000000000000#include #include #include #include #include #include #include "devices.h" /* * default devices names */ #if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) struct ng_device_config ng_dev = { video: "/dev/bktr0", radio: NULL, vbi: "/dev/vbi0", dsp: "/dev/dsp", mixer: "/dev/mixer", video_scan: { "/dev/bktr0", "/dev/bktr1", "/dev/cxm0", "/dev/cxm1", NULL }, mixer_scan: { "/dev/mixer", "/dev/mixer1", "/dev/mixer2", "/dev/mixer3", NULL } }; #endif #if defined(__linux__) struct ng_device_config ng_dev = { video: "/dev/video0", /* thank you redhat breaking * /dev/video as symbolic link to the * default video device ... */ radio: "/dev/radio", vbi: "/dev/vbi", dsp: "/dev/dsp", mixer: "/dev/mixer", video_scan: { "/dev/video0", "/dev/video1", "/dev/video2", "/dev/video3", NULL }, mixer_scan: { "/dev/mixer", "/dev/mixer1", "/dev/mixer2", "/dev/mixer3", NULL } }; struct ng_device_config ng_dev_devfs = { video: "/dev/v4l/video0", radio: "/dev/v4l/radio0", vbi: "/dev/v4l/vbi0", dsp: "/dev/sound/dsp", mixer: "/dev/sound/mixer", video_scan: { "/dev/v4l/video0", "/dev/v4l/video1", "/dev/v4l/video2", "/dev/v4l/video3", NULL }, mixer_scan: { "/dev/sound/mixer", "/dev/sound/mixer1", "/dev/sound/mixer2", "/dev/sound/mixer3", NULL } }; #endif void ng_device_init(void) { #if defined(__linux__) struct stat st; if (-1 == lstat("/dev/.devfsd",&st)) return; if (!S_ISCHR(st.st_mode)) return; ng_dev = ng_dev_devfs; #endif } stopmotion-0.8.0/src/technical/libng/devices.h000066400000000000000000000005501234321124500213360ustar00rootroot00000000000000#ifndef DEVICES_H #define DEVICES_H #ifdef __cplusplus extern "C" { #endif struct ng_device_config { char *video; char *radio; char *vbi; char *dsp; char *mixer; char *video_scan[32]; char *mixer_scan[32]; }; extern struct ng_device_config ng_dev; void ng_device_init(void); #ifdef __cplusplus } #endif #endif /* DEVICES_H */ stopmotion-0.8.0/src/technical/libng/grab-ng.c000066400000000000000000000343161234321124500212330ustar00rootroot00000000000000/* * next generation[tm] xawtv capture interfaces * * (c) 2001 Gerd Knorr * */ #define NG_PRIVATE #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef RTLD_NOW # define RTLD_NOW RTLD_LAZY #endif #include "grab-ng.h" #ifndef NO_DEBUG int ng_debug = 1; #else int ng_debug = 0; #endif int ng_chromakey = 0x00ff00ff; int ng_jpeg_quality = 75; int ng_ratio_x = 4; int ng_ratio_y = 3; const char *ng_v4l_conf = "v4l-conf"; /* --------------------------------------------------------------------- */ const unsigned int ng_vfmt_to_depth[] = { 0, /* unused */ 8, /* RGB8 */ 8, /* GRAY8 */ 16, /* RGB15 LE */ 16, /* RGB16 LE */ 16, /* RGB15 BE */ 16, /* RGB16 BE */ 24, /* BGR24 */ 32, /* BGR32 */ 24, /* RGB24 */ 32, /* RGB32 */ 16, /* LUT2 */ 32, /* LUT4 */ 16, /* YUYV */ 16, /* YUV422P */ 12, /* YUV420P */ 0, /* MJPEG */ 0, /* JPEG */ 16, /* UYVY */ }; const char* ng_vfmt_to_desc[] = { "none", "8 bit PseudoColor (dithering)", "8 bit StaticGray", "15 bit TrueColor (LE)", "16 bit TrueColor (LE)", "15 bit TrueColor (BE)", "16 bit TrueColor (BE)", "24 bit TrueColor (LE: bgr)", "32 bit TrueColor (LE: bgr-)", "24 bit TrueColor (BE: rgb)", "32 bit TrueColor (BE: -rgb)", "16 bit TrueColor (lut)", "32 bit TrueColor (lut)", "16 bit YUV 4:2:2 (packed, YUYV)", "16 bit YUV 4:2:2 (planar)", "12 bit YUV 4:2:0 (planar)", "MJPEG (AVI)", "JPEG (JFIF)", "16 bit YUV 4:2:2 (packed, UYVY)", }; const char* ng_attr_to_desc[] = { "none", "norm", "input", "volume", "mute", "audio mode", "color", "bright", "hue", "contrast", }; /* --------------------------------------------------------------------- */ void ng_init_video_buf(struct ng_video_buf *buf) { memset(buf,0,sizeof(*buf)); pthread_mutex_init(&buf->lock,NULL); pthread_cond_init(&buf->cond,NULL); } void ng_release_video_buf(struct ng_video_buf *buf) { int release; pthread_mutex_lock(&buf->lock); buf->refcount--; release = (buf->refcount == 0); pthread_mutex_unlock(&buf->lock); if (release && NULL != buf->release) buf->release(buf); } void ng_wakeup_video_buf(struct ng_video_buf *buf) { pthread_cond_signal(&buf->cond); } void ng_waiton_video_buf(struct ng_video_buf *buf) { pthread_mutex_lock(&buf->lock); while (buf->refcount) pthread_cond_wait(&buf->cond, &buf->lock); pthread_mutex_unlock(&buf->lock); } static void ng_free_video_buf(struct ng_video_buf *buf) { free(buf->data); free(buf); } struct ng_video_buf* ng_malloc_video_buf(struct ng_video_fmt *fmt, int size) { struct ng_video_buf *buf; buf = malloc(sizeof(*buf)); if (NULL == buf) return NULL; ng_init_video_buf(buf); buf->fmt = *fmt; buf->size = size; buf->data = malloc(size); if (NULL == buf->data) { free(buf); return NULL; } buf->refcount = 1; buf->release = ng_free_video_buf; return buf; } struct ng_attribute* ng_attr_byid(struct ng_attribute *attrs, int id) { if (NULL == attrs) return NULL; for (;;) { if (NULL == attrs->name) return NULL; if (attrs->id == id) return attrs; attrs++; } } struct ng_attribute* ng_attr_byname(struct ng_attribute *attrs, char *name) { if (NULL == attrs) return NULL; for (;;) { if (NULL == attrs->name) return NULL; if (0 == strcasecmp(attrs->name,name)) return attrs; attrs++; } } const char* ng_attr_getstr(struct ng_attribute *attr, int value) { int i; if (NULL == attr) return NULL; if (attr->type != ATTR_TYPE_CHOICE) return NULL; for (i = 0; attr->choices[i].str != NULL; i++) if (attr->choices[i].nr == value) return attr->choices[i].str; return NULL; } int ng_attr_getint(struct ng_attribute *attr, char *value) { int i,val; if (NULL == attr) return -1; if (attr->type != ATTR_TYPE_CHOICE) return -1; for (i = 0; attr->choices[i].str != NULL; i++) { if (0 == strcasecmp(attr->choices[i].str,value)) return attr->choices[i].nr; } if (isdigit(value[0])) { /* Hmm. String not found, but starts with a digit. Check if this is a valid number ... */ val = atoi(value); for (i = 0; attr->choices[i].str != NULL; i++) if (val == attr->choices[i].nr) return attr->choices[i].nr; } return -1; } void ng_attr_listchoices(struct ng_attribute *attr) { int i; fprintf(stderr,"valid choices for \"%s\": ",attr->name); for (i = 0; attr->choices[i].str != NULL; i++) fprintf(stderr,"%s\"%s\"", i ? ", " : "", attr->choices[i].str); fprintf(stderr,"\n"); } int ng_attr_int2percent(struct ng_attribute *attr, int value) { int range,percent; range = attr->max - attr->min; percent = (value - attr->min) * 100 / range; if (percent < 0) percent = 0; if (percent > 100) percent = 100; return percent; } int ng_attr_percent2int(struct ng_attribute *attr, int percent) { int range,value; range = attr->max - attr->min; value = percent * range / 100 + attr->min; if (value < attr->min) value = attr->min; if (value > attr->max) value = attr->max; return value; } int ng_attr_parse_int(struct ng_attribute *attr, char *str) { int value,n; if (0 == sscanf(str,"%d%n",&value,&n)) /* parse error */ return attr->defval; if (str[n] == '%') value = ng_attr_percent2int(attr,value); if (value < attr->min) value = attr->min; if (value > attr->max) value = attr->max; return value; } /* --------------------------------------------------------------------- */ void ng_ratio_fixup(int *width, int *height, int *xoff, int *yoff) { int h = *height; int w = *width; if (0 == ng_ratio_x || 0 == ng_ratio_y) return; if (w * ng_ratio_y < h * ng_ratio_x) { *height = *width * ng_ratio_y / ng_ratio_x; if (yoff) *yoff += (h-*height)/2; } else if (w * ng_ratio_y > h * ng_ratio_x) { *width = *height * ng_ratio_x / ng_ratio_y; if (yoff) *xoff += (w-*width)/2; } } void ng_ratio_fixup2(int *width, int *height, int *xoff, int *yoff, int ratio_x, int ratio_y, int up) { int h = *height; int w = *width; if (0 == ratio_x || 0 == ratio_y) return; if ((!up && w * ratio_y < h * ratio_x) || (up && w * ratio_y > h * ratio_x)) { *height = *width * ratio_y / ratio_x; if (yoff) *yoff += (h-*height)/2; } else if ((!up && w * ratio_y > h * ratio_x) || (up && w * ratio_y < h * ratio_x)) { *width = *height * ratio_x / ratio_y; if (yoff) *xoff += (w-*width)/2; } } /* --------------------------------------------------------------------- */ LIST_HEAD(ng_conv); LIST_HEAD(ng_filters); LIST_HEAD(ng_vid_drivers); static int ng_check_magic(int magic, char *plugname, char *type) { if (magic != NG_PLUGIN_MAGIC) { fprintf(stderr, "ERROR: plugin magic mismatch [xawtv=%d,%s=%d]\n", NG_PLUGIN_MAGIC,plugname,magic); return -1; } #if 0 if (ng_debug) fprintf(stderr,"plugins: %s registered by %s\n",type,plugname); #endif return 0; } int ng_conv_register(int magic, char *plugname, struct ng_video_conv *list, int count) { int n; if (0 != ng_check_magic(magic,plugname,"video converters")) return -1; for (n = 0; n < count; n++) list_add_tail(&(list[n].list),&ng_conv); return 0; } int ng_filter_register(int magic, char *plugname, struct ng_filter *filter) { if (0 != ng_check_magic(magic,plugname,"filter")) return -1; list_add_tail(&filter->list,&ng_filters); return 0; } int ng_vid_driver_register(int magic, char *plugname, struct ng_vid_driver *driver) { if (0 != ng_check_magic(magic,plugname,"video drv")) return -1; list_add_tail(&driver->list,&ng_vid_drivers); return 0; } struct ng_video_conv* ng_conv_find_to(unsigned int out, int *i) { struct list_head *item; struct ng_video_conv *ret; int j = 0; list_for_each(item,&ng_conv) { if (j < *i) { j++; continue; } ret = list_entry(item, struct ng_video_conv, list); #if 0 fprintf(stderr,"\tconv to: %-28s => %s\n", ng_vfmt_to_desc[ret->fmtid_in], ng_vfmt_to_desc[ret->fmtid_out]); #endif if (ret->fmtid_out == out) { (*i)++; return ret; } (*i)++; j++; } return NULL; } struct ng_video_conv* ng_conv_find_from(unsigned int in, int *i) { struct list_head *item; struct ng_video_conv *ret; int j = 0; list_for_each(item,&ng_conv) { if (j < *i) { j++; continue; } ret = list_entry(item, struct ng_video_conv, list); #if 0 fprintf(stderr,"\tconv from: %-28s => %s\n", ng_vfmt_to_desc[ret->fmtid_in], ng_vfmt_to_desc[ret->fmtid_out]); #endif if (ret->fmtid_in == in) { (*i)++; return ret; } } return NULL; } struct ng_video_conv* ng_conv_find_match(unsigned int in, unsigned int out) { struct list_head *item; struct ng_video_conv *ret = NULL; list_for_each(item,&ng_conv) { ret = list_entry(item, struct ng_video_conv, list); if (ret->fmtid_in == in && ret->fmtid_out == out) return ret; } return NULL; } /* --------------------------------------------------------------------- */ const struct ng_vid_driver* ng_vid_open(char *device, char *driver, struct ng_video_fmt *screen, void *base, void **handle) { struct list_head *item; struct ng_vid_driver *drv; #ifdef __linux__ if (NULL != screen) { switch (system(ng_v4l_conf)) { case -1: /* can't run */ fprintf(stderr,"could'nt start v4l-conf\n"); break; case 0: /* ok */ break; default: /* non-zero return */ fprintf(stderr,"v4l-conf had some trouble, " "trying to continue anyway\n"); break; } } #endif /* check all grabber drivers */ list_for_each(item,&ng_vid_drivers) { drv = list_entry(item, struct ng_vid_driver, list); if (driver && 0 != strcasecmp(driver, drv->name)) continue; if (ng_debug) fprintf(stderr,"vid-open: trying: %s... \n", drv->name); if (NULL != (*handle = drv->open(device))) break; if (ng_debug) fprintf(stderr,"vid-open: failed: %s\n",drv->name); } if (item == &ng_vid_drivers) return NULL; if (ng_debug) fprintf(stderr,"vid-open: ok: %s\n",drv->name); if (NULL != screen && drv->capabilities(*handle) & CAN_OVERLAY) drv->setupfb(*handle,screen,base); return drv; } int64_t ng_tofday_to_timestamp(struct timeval *tv) { long long ts; ts = tv->tv_sec; ts *= 1000000; ts += tv->tv_usec; ts *= 1000; return ts; } int64_t ng_get_timestamp() { struct timeval tv; gettimeofday(&tv,NULL); return ng_tofday_to_timestamp(&tv); } struct ng_video_buf* ng_filter_single(struct ng_filter *filter, struct ng_video_buf *in) { struct ng_video_buf *out = in; void *handle; if (NULL != filter && filter->fmts & (1 << in->fmt.fmtid)) { handle = filter->init(&in->fmt); out = filter->frame(handle,in); filter->fini(handle); } return out; } /* --------------------------------------------------------------------- */ static void clip_dump(char *state, struct OVERLAY_CLIP *oc, int count) { int i; fprintf(stderr,"clip: %s - %d clips\n",state,count); for (i = 0; i < count; i++) fprintf(stderr,"clip: %d: %dx%d+%d+%d\n",i, oc[i].x2 - oc[i].x1, oc[i].y2 - oc[i].y1, oc[i].x1, oc[i].y1); } static void clip_drop(struct OVERLAY_CLIP *oc, int n, int *count) { (*count)--; memmove(oc+n, oc+n+1, sizeof(struct OVERLAY_CLIP) * (*count-n)); } void ng_check_clipping(int width, int height, int xadjust, int yadjust, struct OVERLAY_CLIP *oc, int *count) { int i,j; if (ng_debug > 1) { fprintf(stderr,"clip: win=%dx%d xa=%d ya=%d\n", width,height,xadjust,yadjust); clip_dump("init",oc,*count); } for (i = 0; i < *count; i++) { /* fixup coordinates */ oc[i].x1 += xadjust; oc[i].x2 += xadjust; oc[i].y1 += yadjust; oc[i].y2 += yadjust; } if (ng_debug > 1) clip_dump("fixup adjust",oc,*count); for (i = 0; i < *count; i++) { /* fixup borders */ if (oc[i].x1 < 0) oc[i].x1 = 0; if (oc[i].x2 < 0) oc[i].x2 = 0; if (oc[i].x1 > width) oc[i].x1 = width; if (oc[i].x2 > width) oc[i].x2 = width; if (oc[i].y1 < 0) oc[i].y1 = 0; if (oc[i].y2 < 0) oc[i].y2 = 0; if (oc[i].y1 > height) oc[i].y1 = height; if (oc[i].y2 > height) oc[i].y2 = height; } if (ng_debug > 1) clip_dump("fixup range",oc,*count); /* drop zero-sized clips */ for (i = 0; i < *count;) { if (oc[i].x1 == oc[i].x2 || oc[i].y1 == oc[i].y2) { clip_drop(oc,i,count); continue; } i++; } if (ng_debug > 1) clip_dump("zerosize done",oc,*count); /* try to merge clips */ restart_merge: for (j = *count - 1; j >= 0; j--) { for (i = 0; i < *count; i++) { if (i == j) continue; if (oc[i].x1 == oc[j].x1 && oc[i].x2 == oc[j].x2 && oc[i].y1 <= oc[j].y1 && oc[i].y2 >= oc[j].y1) { if (ng_debug > 1) fprintf(stderr,"clip: merge y %d,%d\n",i,j); if (oc[i].y2 < oc[j].y2) oc[i].y2 = oc[j].y2; clip_drop(oc,j,count); if (ng_debug > 1) clip_dump("merge y done",oc,*count); goto restart_merge; } if (oc[i].y1 == oc[j].y1 && oc[i].y2 == oc[j].y2 && oc[i].x1 <= oc[j].x1 && oc[i].x2 >= oc[j].x1) { if (ng_debug > 1) fprintf(stderr,"clip: merge x %d,%d\n",i,j); if (oc[i].x2 < oc[j].x2) oc[i].x2 = oc[j].x2; clip_drop(oc,j,count); if (ng_debug > 1) clip_dump("merge x done",oc,*count); goto restart_merge; } } } if (ng_debug) clip_dump("final",oc,*count); } /* --------------------------------------------------------------------- */ void ng_init(void) { static int once = 0; if (once++ > 0) { fprintf(stderr,"panic: ng_init called twice\n"); exit(1); } ng_device_init(); ng_plugin_v4l_init(); ng_plugin_v4l2_init(); } stopmotion-0.8.0/src/technical/libng/grab-ng.h000066400000000000000000000305431234321124500212360ustar00rootroot00000000000000/* * next generation[tm] xawtv capture interfaces * * (c) 2001-03 Gerd Knorr * */ #ifndef GRAB_NG_H #define GRAB_NG_H #include #include #include "devices.h" #include "list.h" #ifdef __cplusplus extern "C" { #endif extern int ng_debug; extern int ng_chromakey; extern int ng_jpeg_quality; extern int ng_ratio_x; extern int ng_ratio_y; extern const char *ng_v4l_conf; #define BUG_ON(condition,message) if (condition) {\ fprintf(stderr,"BUG: %s [%s:%d]\n",\ message,__FILE__,__LINE__);\ exit(1);} #if __STDC_VERSION__ < 199901 # define restrict //# define bool int #endif #define UNSET (-1U) #define DIMOF(array) (sizeof(array)/sizeof(array[0])) #define SDIMOF(array) ((signed int)(sizeof(array)/sizeof(array[0]))) #define GETELEM(array,index,default) \ (index < sizeof(array)/sizeof(array[0]) ? array[index] : default) /* --------------------------------------------------------------------- */ /* defines */ #define VIDEO_NONE 0 #define VIDEO_RGB08 1 /* bt848 dithered */ #define VIDEO_GRAY 2 #define VIDEO_RGB15_LE 3 /* 15 bpp little endian */ #define VIDEO_RGB16_LE 4 /* 16 bpp little endian */ #define VIDEO_RGB15_BE 5 /* 15 bpp big endian */ #define VIDEO_RGB16_BE 6 /* 16 bpp big endian */ #define VIDEO_BGR24 7 /* bgrbgrbgrbgr (LE) */ #define VIDEO_BGR32 8 /* bgr-bgr-bgr- (LE) */ #define VIDEO_RGB24 9 /* rgbrgbrgbrgb (BE) */ #define VIDEO_RGB32 10 /* -rgb-rgb-rgb (BE) */ #define VIDEO_LUT2 11 /* lookup-table 2 byte depth */ #define VIDEO_LUT4 12 /* lookup-table 4 byte depth */ #define VIDEO_YUYV 13 /* 4:2:2 */ #define VIDEO_YUV422P 14 /* YUV 4:2:2 (planar) */ #define VIDEO_YUV420P 15 /* YUV 4:2:0 (planar) */ #define VIDEO_MJPEG 16 /* MJPEG (AVI) */ #define VIDEO_JPEG 17 /* JPEG (JFIF) */ #define VIDEO_UYVY 18 /* 4:2:2 */ #define VIDEO_FMT_COUNT 19 #if BYTE_ORDER == BIG_ENDIAN # define VIDEO_RGB15_NATIVE VIDEO_RGB15_BE # define VIDEO_RGB16_NATIVE VIDEO_RGB16_BE #endif #if BYTE_ORDER == LITTLE_ENDIAN # define VIDEO_RGB15_NATIVE VIDEO_RGB15_LE # define VIDEO_RGB16_NATIVE VIDEO_RGB16_LE #endif #define ATTR_TYPE_INTEGER 1 /* range 0 - 65535 */ #define ATTR_TYPE_CHOICE 2 /* multiple choice */ #define ATTR_TYPE_BOOL 3 /* yes/no */ #define ATTR_ID_NORM 1 #define ATTR_ID_INPUT 2 #define ATTR_ID_VOLUME 3 #define ATTR_ID_MUTE 4 #define ATTR_ID_AUDIO_MODE 5 #define ATTR_ID_COLOR 6 #define ATTR_ID_BRIGHT 7 #define ATTR_ID_HUE 8 #define ATTR_ID_CONTRAST 9 #define ATTR_ID_COUNT 10 #define CAN_OVERLAY 1 #define CAN_CAPTURE 2 #define CAN_TUNE 4 #define NEEDS_CHROMAKEY 8 /* --------------------------------------------------------------------- */ extern const unsigned int ng_vfmt_to_depth[VIDEO_FMT_COUNT]; extern const char* ng_vfmt_to_desc[VIDEO_FMT_COUNT]; extern const char* ng_attr_to_desc[ATTR_ID_COUNT]; extern void ng_plugin_v4l2_init(void); extern void ng_plugin_v4l_init(void); /* --------------------------------------------------------------------- */ struct STRTAB { long nr; const char *str; }; struct OVERLAY_CLIP { int x1,x2,y1,y2; }; /* --------------------------------------------------------------------- */ /* video data structures */ struct ng_video_fmt { unsigned int fmtid; /* VIDEO_* */ unsigned int width; unsigned int height; unsigned int bytesperline; /* zero for compressed formats */ }; struct ng_video_buf { struct ng_video_fmt fmt; size_t size; unsigned char *data; /* meta info for frame */ struct { int64_t ts; /* time stamp */ int seq; int twice; } info; /* * the lock is for the reference counter. * if the reference counter goes down to zero release() * should be called. priv is for the owner of the * buffer (can be used by the release callback) */ pthread_mutex_t lock; pthread_cond_t cond; int refcount; void (*release)(struct ng_video_buf *buf); void *priv; }; void ng_init_video_buf(struct ng_video_buf *buf); void ng_release_video_buf(struct ng_video_buf *buf); struct ng_video_buf* ng_malloc_video_buf(struct ng_video_fmt *fmt, int size); void ng_wakeup_video_buf(struct ng_video_buf *buf); void ng_waiton_video_buf(struct ng_video_buf *buf); /* --------------------------------------------------------------------- */ /* attributes */ struct ng_attribute { int id; const char *name; int type; int defval; struct STRTAB *choices; /* ATTR_TYPE_CHOICE */ int min,max; /* ATTR_TYPE_INTEGER */ int points; /* ATTR_TYPE_INTEGER -- fixed point */ const void *priv; void *handle; int (*read)(struct ng_attribute*); void (*write)(struct ng_attribute*, int val); }; struct ng_attribute* ng_attr_byid(struct ng_attribute *attrs, int id); struct ng_attribute* ng_attr_byname(struct ng_attribute *attrs, char *name); const char* ng_attr_getstr(struct ng_attribute *attr, int value); int ng_attr_getint(struct ng_attribute *attr, char *value); void ng_attr_listchoices(struct ng_attribute *attr); int ng_attr_int2percent(struct ng_attribute *attr, int value); int ng_attr_percent2int(struct ng_attribute *attr, int percent); int ng_attr_parse_int(struct ng_attribute *attr, char *str); /* --------------------------------------------------------------------- */ void ng_ratio_fixup(int *width, int *height, int *xoff, int *yoff); void ng_ratio_fixup2(int *width, int *height, int *xoff, int *yoff, int ratio_x, int ratio_y, int up); /* --------------------------------------------------------------------- */ /* device informations */ struct ng_devinfo { char device[32]; char name[64]; int flags; }; /* --------------------------------------------------------------------- */ /* capture/overlay interface driver */ struct ng_vid_driver { const char *name; /* open/close */ void* (*open)(char *device); int (*close)(void *handle); /* attributes */ char* (*get_devname)(void *handle); int (*capabilities)(void *handle); struct ng_attribute* (*list_attrs)(void *handle); /* overlay */ int (*setupfb)(void *handle, struct ng_video_fmt *fmt, void *base); int (*overlay)(void *handle, struct ng_video_fmt *fmt, int x, int y, struct OVERLAY_CLIP *oc, int count, int aspect); /* capture */ int (*setformat)(void *handle, struct ng_video_fmt *fmt); int (*startvideo)(void *handle, int fps, unsigned int buffers); void (*stopvideo)(void *handle); struct ng_video_buf* (*nextframe)(void *handle); /* video frame */ struct ng_video_buf* (*getimage)(void *handle); /* single image */ /* tuner */ unsigned long (*getfreq)(void *handle); void (*setfreq)(void *handle, unsigned long freq); int (*is_tuned)(void *handle); struct list_head list; }; /* --------------------------------------------------------------------- */ /* color space converters */ struct ng_video_conv { unsigned int fmtid_in; unsigned int fmtid_out; void* (*init)(struct ng_video_fmt *out, void *priv); void (*frame)(void *handle, struct ng_video_buf *out, struct ng_video_buf *in); void (*fini)(void *handle); void *priv; struct list_head list; }; struct ng_convert_handle { struct ng_video_fmt ifmt; struct ng_video_fmt ofmt; int isize; int osize; struct ng_video_conv *conv; void *chandle; }; struct ng_convert_handle* ng_convert_alloc(struct ng_video_conv *conv, struct ng_video_fmt *i, struct ng_video_fmt *o); void ng_convert_init(struct ng_convert_handle *h); struct ng_video_buf* ng_convert_frame(struct ng_convert_handle *h, struct ng_video_buf *dest, struct ng_video_buf *buf); void ng_convert_fini(struct ng_convert_handle *h); struct ng_video_buf* ng_convert_single(struct ng_convert_handle *h, struct ng_video_buf *in); /* --------------------------------------------------------------------- */ /* filters */ struct ng_filter { char *name; int fmts; struct ng_attribute* attrs; void* (*init)(struct ng_video_fmt *fmt); struct ng_video_buf* (*frame)(void *handle, struct ng_video_buf *in); void (*fini)(void *handle); struct list_head list; }; /* --------------------------------------------------------------------- */ /* must be changed if we break compatibility */ #define NG_PLUGIN_MAGIC 0x20030129 extern struct list_head ng_conv; extern struct list_head ng_filters; extern struct list_head ng_vid_drivers; int ng_conv_register(int magic, char *plugname, struct ng_video_conv *list, int count); int ng_filter_register(int magic, char *plugname, struct ng_filter *filter); int ng_vid_driver_register(int magic, char *plugname, struct ng_vid_driver *driver); struct ng_video_conv* ng_conv_find_to(unsigned int out, int *i); struct ng_video_conv* ng_conv_find_from(unsigned int out, int *i); struct ng_video_conv* ng_conv_find_match(unsigned int in, unsigned int out); const struct ng_vid_driver* ng_vid_open(char *device, char *driver, struct ng_video_fmt *screen, void *base, void **handle); int64_t ng_tofday_to_timestamp(struct timeval *tv); int64_t ng_get_timestamp(void); void ng_check_clipping(int width, int height, int xadjust, int yadjust, struct OVERLAY_CLIP *oc, int *count); struct ng_video_buf* ng_filter_single(struct ng_filter *filter, struct ng_video_buf *in); /* --------------------------------------------------------------------- */ void ng_init(void); void ng_lut_init(unsigned long red_mask, unsigned long green_mask, unsigned long blue_mask, unsigned int fmtid, int swap); void ng_rgb24_to_lut2(unsigned char *dest, unsigned char *src, int p); void ng_rgb24_to_lut4(unsigned char *dest, unsigned char *src, int p); /* --------------------------------------------------------------------- */ /* internal stuff starts here */ #ifdef NG_PRIVATE /* init functions */ //void ng_color_packed_init(void); //void ng_color_yuv2rgb_init(void); //void ng_writefile_init(void); /* for yuv2rgb using lookup tables (color_lut.c, color_yuv2rgb.c) */ unsigned long ng_lut_red[256]; unsigned long ng_lut_green[256]; unsigned long ng_lut_blue[256]; void ng_yuv422_to_lut2(unsigned char *dest, unsigned char *s, int p); void ng_yuv422_to_lut4(unsigned char *dest, unsigned char *s, int p); void ng_yuv420p_to_lut2(void *h, struct ng_video_buf *out, struct ng_video_buf *in); void ng_yuv420p_to_lut4(void *h, struct ng_video_buf *out, struct ng_video_buf *in); void ng_yuv422p_to_lut2(void *h, struct ng_video_buf *out, struct ng_video_buf *in); void ng_yuv422p_to_lut4(void *h, struct ng_video_buf *out, struct ng_video_buf *in); /* color_common.c stuff */ void* ng_packed_init(struct ng_video_fmt *out, void *priv); void ng_packed_frame(void *handle, struct ng_video_buf *out, struct ng_video_buf *in); void* ng_conv_nop_init(struct ng_video_fmt *out, void *priv); void ng_conv_nop_fini(void *handle); #define NG_GENERIC_PACKED \ init: ng_packed_init, \ frame: ng_packed_frame, \ fini: ng_conv_nop_fini #endif /* NG_PRIVATE */ /* --------------------------------------------------------------------- */ /* * Local variables: * compile-command: "(cd ..; make)" * End: */ #ifdef __cplusplus } #endif #endif /* GRAB_NG_H */ stopmotion-0.8.0/src/technical/libng/list.h000066400000000000000000000106241234321124500206720ustar00rootroot00000000000000#ifndef _LIST_H #define _LIST_H 1 #ifdef __cplusplus extern "C" { #endif /* * Simple doubly linked list implementation. * -- shameless stolen from the linux kernel sources * * Some of the internal functions ("__xxx") are useful when * manipulating whole lists rather than single entries, as * sometimes we already know the next/prev entries and we can * generate better code by using them directly rather than * using the generic single-entry routines. */ struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) #define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0) /* * Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static __inline__ void __list_add(struct list_head * new_entry, struct list_head * prev, struct list_head * next) { next->prev = new_entry; new_entry->next = next; new_entry->prev = prev; prev->next = new_entry; } /** * list_add - add a new entry * @new: new entry to be added * @head: list head to add it after * * Insert a new entry after the specified head. * This is good for implementing stacks. */ static __inline__ void list_add(struct list_head *new_entry, struct list_head *head) { __list_add(new_entry, head, head->next); } /** * list_add_tail - add a new entry * @new: new entry to be added * @head: list head to add it before * * Insert a new entry before the specified head. * This is useful for implementing queues. */ static __inline__ void list_add_tail(struct list_head *new_entry, struct list_head *head) { __list_add(new_entry, head->prev, head); } /* * Delete a list entry by making the prev/next entries * point to each other. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static __inline__ void __list_del(struct list_head * prev, struct list_head * next) { next->prev = prev; prev->next = next; } /** * list_del - deletes entry from list. * @entry: the element to delete from the list. * Note: list_empty on entry does not return true after this, the entry is in an undefined state. */ static __inline__ void list_del(struct list_head *entry) { __list_del(entry->prev, entry->next); } /** * list_del_init - deletes entry from list and reinitialize it. * @entry: the element to delete from the list. */ static __inline__ void list_del_init(struct list_head *entry) { __list_del(entry->prev, entry->next); INIT_LIST_HEAD(entry); } /** * list_empty - tests whether a list is empty * @head: the list to test. */ static __inline__ int list_empty(struct list_head *head) { return head->next == head; } /** * list_splice - join two lists * @list: the new list to add. * @head: the place to add it in the first list. */ static __inline__ void list_splice(struct list_head *list, struct list_head *head) { struct list_head *first = list->next; if (first != list) { struct list_head *last = list->prev; struct list_head *at = head->next; first->prev = head; head->next = first; last->next = at; at->prev = last; } } /** * list_entry - get the struct for this entry * @ptr: the &struct list_head pointer. * @type: the type of the struct this is embedded in. * @member: the name of the list_struct within the struct. */ #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) /** * list_for_each - iterate over a list * @pos: the &struct list_head to use as a loop counter. * @head: the head for your list. */ #define list_for_each(pos, head) \ for (pos = (head)->next; pos != (head); pos = pos->next) /** * list_for_each_safe - iterate over a list safe against removal of list entry * @pos: the &struct list_head to use as a loop counter. * @n: another &struct list_head to use as temporary storage * @head: the head for your list. */ #define list_for_each_safe(pos, n, head) \ for (pos = (head)->next, n = pos->next; pos != (head); \ pos = n, n = pos->next) /** * list_for_each_prev - iterate over a list in reverse order * @pos: the &struct list_head to use as a loop counter. * @head: the head for your list. */ #define list_for_each_prev(pos, head) \ for (pos = (head)->prev; pos != (head); pos = pos->prev) #ifdef __cplusplus } #endif #endif /* _LIST_H */ stopmotion-0.8.0/src/technical/libng/plugins/000077500000000000000000000000001234321124500212245ustar00rootroot00000000000000stopmotion-0.8.0/src/technical/libng/plugins/drv0-v4l2.c000066400000000000000000000660651234321124500230450ustar00rootroot00000000000000/* * interface to the v4l2 driver * * (c) 1998-2002 Gerd Knorr * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* XXX glibc */ #include "../videodev2.h" #include "../grab-ng.h" #include "../struct-dump.h" #include "../struct-v4l2.h" /* ---------------------------------------------------------------------- */ /* open+close */ static void* v4l2_open(char *device); static int v4l2_close(void *handle); /* attributes */ static char* v4l2_devname(void *handle); static int v4l2_flags(void *handle); static struct ng_attribute* v4l2_attrs(void *handle); static int v4l2_read_attr(struct ng_attribute*); static void v4l2_write_attr(struct ng_attribute*, int val); /* overlay */ static int v4l2_setupfb(void *handle, struct ng_video_fmt *fmt, void *base); static int v4l2_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y, struct OVERLAY_CLIP *oc, int count, int aspect); /* capture video */ static int v4l2_setformat(void *handle, struct ng_video_fmt *fmt); static int v4l2_startvideo(void *handle, int fps, unsigned int buffers); static void v4l2_stopvideo(void *handle); static struct ng_video_buf* v4l2_nextframe(void *handle); static struct ng_video_buf* v4l2_getimage(void *handle); /* tuner */ static unsigned long v4l2_getfreq(void *handle); static void v4l2_setfreq(void *handle, unsigned long freq); static int v4l2_tuned(void *handle); /* ---------------------------------------------------------------------- */ #define WANTED_BUFFERS 32 #define MAX_INPUT 16 #define MAX_NORM 16 #define MAX_FORMAT 32 #define MAX_CTRL 32 struct v4l2_handle { int fd; /* device descriptions */ int ninputs,nstds,nfmts; struct v4l2_capability cap; struct v4l2_streamparm streamparm; struct v4l2_input inp[MAX_INPUT]; struct v4l2_standard std[MAX_NORM]; struct v4l2_fmtdesc fmt[MAX_FORMAT]; struct v4l2_queryctrl ctl[MAX_CTRL*2]; /* attributes */ int nattr; struct ng_attribute *attr; /* capture */ int fps,first; long long start; struct v4l2_format fmt_v4l2; struct ng_video_fmt fmt_me; struct v4l2_requestbuffers reqbufs; struct v4l2_buffer buf_v4l2[WANTED_BUFFERS]; struct ng_video_buf buf_me[WANTED_BUFFERS]; unsigned int queue,waiton; /* overlay */ struct v4l2_framebuffer ov_fb; struct v4l2_format ov_win; struct v4l2_clip ov_clips[256]; #if 0 enum v4l2_field ov_fields; #endif int ov_error; int ov_enabled; int ov_on; }; /* ---------------------------------------------------------------------- */ struct ng_vid_driver v4l2_driver = { name: "v4l2", open: v4l2_open, close: v4l2_close, get_devname: v4l2_devname, capabilities: v4l2_flags, list_attrs: v4l2_attrs, setupfb: v4l2_setupfb, overlay: v4l2_overlay, setformat: v4l2_setformat, startvideo: v4l2_startvideo, stopvideo: v4l2_stopvideo, nextframe: v4l2_nextframe, getimage: v4l2_getimage, getfreq: v4l2_getfreq, setfreq: v4l2_setfreq, is_tuned: v4l2_tuned, }; static __u32 xawtv_pixelformat[VIDEO_FMT_COUNT] = { [ VIDEO_RGB08 ] = V4L2_PIX_FMT_HI240, [ VIDEO_GRAY ] = V4L2_PIX_FMT_GREY, [ VIDEO_RGB15_LE ] = V4L2_PIX_FMT_RGB555, [ VIDEO_RGB16_LE ] = V4L2_PIX_FMT_RGB565, [ VIDEO_RGB15_BE ] = V4L2_PIX_FMT_RGB555X, [ VIDEO_RGB16_BE ] = V4L2_PIX_FMT_RGB565X, [ VIDEO_BGR24 ] = V4L2_PIX_FMT_BGR24, [ VIDEO_BGR32 ] = V4L2_PIX_FMT_BGR32, [ VIDEO_RGB24 ] = V4L2_PIX_FMT_RGB24, [ VIDEO_YUYV ] = V4L2_PIX_FMT_YUYV, [ VIDEO_UYVY ] = V4L2_PIX_FMT_UYVY, [ VIDEO_YUV422P ] = V4L2_PIX_FMT_YUV422P, [ VIDEO_YUV420P ] = V4L2_PIX_FMT_YUV420, }; static struct STRTAB stereo[] = { { V4L2_TUNER_MODE_MONO, "mono" }, { V4L2_TUNER_MODE_STEREO, "stereo" }, { V4L2_TUNER_MODE_LANG1, "lang1" }, { V4L2_TUNER_MODE_LANG2, "lang2" }, { -1, NULL }, }; /* ---------------------------------------------------------------------- */ /* debug output */ #define PREFIX "ioctl: " static int xioctl(int fd, int cmd, void *arg, int mayfail) { int rc; rc = ioctl(fd,cmd,arg); if (0 == rc && ng_debug < 2) return rc; if (mayfail && errno == mayfail && ng_debug < 2) return rc; print_ioctl(stderr,ioctls_v4l2,PREFIX,cmd,arg); fprintf(stderr,": %s\n",(rc == 0) ? "ok" : strerror(errno)); return rc; } static void print_bufinfo(struct v4l2_buffer *buf) { static char *type[] = { [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "video-cap", [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "video-over", [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "video-out", [V4L2_BUF_TYPE_VBI_CAPTURE] = "vbi-cap", [V4L2_BUF_TYPE_VBI_OUTPUT] = "vbi-out", }; fprintf(stderr,"v4l2: buf %d: %s 0x%x+%d, used %d\n", buf->index, buf->type < sizeof(type)/sizeof(char*) ? type[buf->type] : "unknown", buf->m.offset,buf->length,buf->bytesused); } /* ---------------------------------------------------------------------- */ /* helpers */ static void get_device_capabilities(struct v4l2_handle *h) { int i; for (h->ninputs = 0; h->ninputs < MAX_INPUT; h->ninputs++) { h->inp[h->ninputs].index = h->ninputs; if (-1 == xioctl(h->fd, VIDIOC_ENUMINPUT, &h->inp[h->ninputs], EINVAL)) break; } for (h->nstds = 0; h->nstds < MAX_NORM; h->nstds++) { h->std[h->nstds].index = h->nstds; if (-1 == xioctl(h->fd, VIDIOC_ENUMSTD, &h->std[h->nstds], EINVAL)) break; } for (h->nfmts = 0; h->nfmts < MAX_FORMAT; h->nfmts++) { h->fmt[h->nfmts].index = h->nfmts; h->fmt[h->nfmts].type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == xioctl(h->fd, VIDIOC_ENUM_FMT, &h->fmt[h->nfmts], EINVAL)) break; } h->streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(h->fd,VIDIOC_G_PARM,&h->streamparm); /* controls */ for (i = 0; i < MAX_CTRL; i++) { h->ctl[i].id = V4L2_CID_BASE+i; if (-1 == xioctl(h->fd, VIDIOC_QUERYCTRL, &h->ctl[i], EINVAL) || (h->ctl[i].flags & V4L2_CTRL_FLAG_DISABLED)) h->ctl[i].id = -1; } for (i = 0; i < MAX_CTRL; i++) { h->ctl[i+MAX_CTRL].id = V4L2_CID_PRIVATE_BASE+i; if (-1 == xioctl(h->fd, VIDIOC_QUERYCTRL, &h->ctl[i+MAX_CTRL], EINVAL) || (h->ctl[i+MAX_CTRL].flags & V4L2_CTRL_FLAG_DISABLED)) h->ctl[i+MAX_CTRL].id = -1; } } static struct STRTAB * build_norms(struct v4l2_handle *h) { struct STRTAB *norms; int i; norms = malloc(sizeof(struct STRTAB) * (h->nstds+1)); for (i = 0; i < h->nstds; i++) { norms[i].nr = i; norms[i].str = (const char*)h->std[i].name; } norms[i].nr = -1; norms[i].str = NULL; return norms; } static struct STRTAB * build_inputs(struct v4l2_handle *h) { struct STRTAB *inputs; int i; inputs = malloc(sizeof(struct STRTAB) * (h->ninputs+1)); for (i = 0; i < h->ninputs; i++) { inputs[i].nr = i; inputs[i].str = (const char*)h->inp[i].name; } inputs[i].nr = -1; inputs[i].str = NULL; return inputs; } /* ---------------------------------------------------------------------- */ static struct V4L2_ATTR { unsigned int id; unsigned int v4l2; } v4l2_attr[] = { { ATTR_ID_VOLUME, V4L2_CID_AUDIO_VOLUME }, { ATTR_ID_MUTE, V4L2_CID_AUDIO_MUTE }, { ATTR_ID_COLOR, V4L2_CID_SATURATION }, { ATTR_ID_BRIGHT, V4L2_CID_BRIGHTNESS }, { ATTR_ID_HUE, V4L2_CID_HUE }, { ATTR_ID_CONTRAST, V4L2_CID_CONTRAST }, }; #define NUM_ATTR (sizeof(v4l2_attr)/sizeof(struct V4L2_ATTR)) static struct STRTAB* v4l2_menu(int fd, const struct v4l2_queryctrl *ctl) { struct STRTAB *menu; struct v4l2_querymenu item; int i; menu = malloc(sizeof(struct STRTAB) * (ctl->maximum-ctl->minimum+2)); for (i = ctl->minimum; i <= ctl->maximum; i++) { item.id = ctl->id; item.index = i; if (-1 == xioctl(fd, VIDIOC_QUERYMENU, &item, 0)) { free(menu); return NULL; } menu[i-ctl->minimum].nr = i; menu[i-ctl->minimum].str = (const char*)strdup((const char*)item.name); } menu[i-ctl->minimum].nr = -1; menu[i-ctl->minimum].str = NULL; return menu; } static void v4l2_add_attr(struct v4l2_handle *h, struct v4l2_queryctrl *ctl, int id, struct STRTAB *choices) { static int private_ids = ATTR_ID_COUNT; unsigned int i; h->attr = realloc(h->attr,(h->nattr+2) * sizeof(struct ng_attribute)); memset(h->attr+h->nattr,0,sizeof(struct ng_attribute)*2); if (ctl) { for (i = 0; i < NUM_ATTR; i++) if (v4l2_attr[i].v4l2 == ctl->id) break; if (i != NUM_ATTR) { h->attr[h->nattr].id = v4l2_attr[i].id; } else { h->attr[h->nattr].id = private_ids++; } h->attr[h->nattr].name = (const char*)ctl->name; h->attr[h->nattr].priv = ctl; h->attr[h->nattr].defval = ctl->default_value; switch (ctl->type) { case V4L2_CTRL_TYPE_INTEGER: h->attr[h->nattr].type = ATTR_TYPE_INTEGER; h->attr[h->nattr].defval = ctl->default_value; h->attr[h->nattr].min = ctl->minimum; h->attr[h->nattr].max = ctl->maximum; break; case V4L2_CTRL_TYPE_BOOLEAN: h->attr[h->nattr].type = ATTR_TYPE_BOOL; break; case V4L2_CTRL_TYPE_MENU: h->attr[h->nattr].type = ATTR_TYPE_CHOICE; h->attr[h->nattr].choices = v4l2_menu(h->fd, ctl); break; default: return; } } else { /* for norms + inputs */ h->attr[h->nattr].id = id; if (-1 == h->attr[h->nattr].id) h->attr[h->nattr].id = private_ids++; h->attr[h->nattr].defval = 0; h->attr[h->nattr].type = ATTR_TYPE_CHOICE; h->attr[h->nattr].choices = choices; } if (h->attr[h->nattr].id < ATTR_ID_COUNT) h->attr[h->nattr].name = ng_attr_to_desc[h->attr[h->nattr].id]; h->attr[h->nattr].read = v4l2_read_attr; h->attr[h->nattr].write = v4l2_write_attr; h->attr[h->nattr].handle = h; h->nattr++; } static int v4l2_read_attr(struct ng_attribute *attr) { struct v4l2_handle *h = attr->handle; const struct v4l2_queryctrl *ctl = attr->priv; struct v4l2_control c; struct v4l2_tuner tuner; v4l2_std_id std; int value = 0; int i; if (NULL != ctl) { c.id = ctl->id; xioctl(h->fd,VIDIOC_G_CTRL,&c,0); value = c.value; } else if (attr->id == ATTR_ID_NORM) { value = -1; xioctl(h->fd,VIDIOC_G_STD,&std,0); for (i = 0; i < h->nstds; i++) if (std & h->std[i].id) value = i; } else if (attr->id == ATTR_ID_INPUT) { xioctl(h->fd,VIDIOC_G_INPUT,&value,0); } else if (attr->id == ATTR_ID_AUDIO_MODE) { memset(&tuner,0,sizeof(tuner)); xioctl(h->fd,VIDIOC_G_TUNER,&tuner,0); value = tuner.audmode; #if 1 if (ng_debug) { fprintf(stderr,"v4l2: tuner cap:%s%s%s\n", (tuner.capability&V4L2_TUNER_CAP_STEREO) ? " STEREO" : "", (tuner.capability&V4L2_TUNER_CAP_LANG1) ? " LANG1" : "", (tuner.capability&V4L2_TUNER_CAP_LANG2) ? " LANG2" : ""); fprintf(stderr,"v4l2: tuner rxs:%s%s%s%s\n", (tuner.rxsubchans&V4L2_TUNER_SUB_MONO) ? " MONO" : "", (tuner.rxsubchans&V4L2_TUNER_SUB_STEREO) ? " STEREO" : "", (tuner.rxsubchans&V4L2_TUNER_SUB_LANG1) ? " LANG1" : "", (tuner.rxsubchans&V4L2_TUNER_SUB_LANG2) ? " LANG2" : ""); fprintf(stderr,"v4l2: tuner cur:%s%s%s%s\n", (tuner.audmode==V4L2_TUNER_MODE_MONO) ? " MONO" : "", (tuner.audmode==V4L2_TUNER_MODE_STEREO) ? " STEREO" : "", (tuner.audmode==V4L2_TUNER_MODE_LANG1) ? " LANG1" : "", (tuner.audmode==V4L2_TUNER_MODE_LANG2) ? " LANG2" : ""); } #endif } return value; } static void v4l2_write_attr(struct ng_attribute *attr, int value) { struct v4l2_handle *h = attr->handle; const struct v4l2_queryctrl *ctl = attr->priv; struct v4l2_control c; struct v4l2_tuner tuner; if (NULL != ctl) { c.id = ctl->id; c.value = value; xioctl(h->fd,VIDIOC_S_CTRL,&c,0); } else if (attr->id == ATTR_ID_NORM) { xioctl(h->fd,VIDIOC_S_STD,&h->std[value].id,0); } else if (attr->id == ATTR_ID_INPUT) { xioctl(h->fd,VIDIOC_S_INPUT,&value,0); } else if (attr->id == ATTR_ID_AUDIO_MODE) { memset(&tuner,0,sizeof(tuner)); xioctl(h->fd,VIDIOC_G_TUNER,&tuner,0); tuner.audmode = value; xioctl(h->fd,VIDIOC_S_TUNER,&tuner,0); } } /* ---------------------------------------------------------------------- */ static void* v4l2_open(char *device) { struct v4l2_handle *h; int i; h = malloc(sizeof(*h)); if (NULL == h) return NULL; memset(h,0,sizeof(*h)); if (-1 == (h->fd = open(device, O_RDWR))) { fprintf(stderr,"v4l2: open %s: %s\n",device,strerror(errno)); goto err; } if (-1 == xioctl(h->fd,VIDIOC_QUERYCAP,&h->cap,EINVAL)) goto err; if (ng_debug) fprintf(stderr, "v4l2: open\n"); fcntl(h->fd,F_SETFD,FD_CLOEXEC); if (ng_debug) fprintf(stderr,"v4l2: device info:\n" " %s %d.%d.%d / %s @ %s\n", h->cap.driver, (h->cap.version >> 16) & 0xff, (h->cap.version >> 8) & 0xff, h->cap.version & 0xff, h->cap.card,h->cap.bus_info); get_device_capabilities(h); /* attributes */ v4l2_add_attr(h, NULL, ATTR_ID_NORM, build_norms(h)); v4l2_add_attr(h, NULL, ATTR_ID_INPUT, build_inputs(h)); if (h->cap.capabilities & V4L2_CAP_TUNER) v4l2_add_attr(h, NULL, ATTR_ID_AUDIO_MODE, stereo); for (i = 0; i < MAX_CTRL*2; i++) { if (h->ctl[i].id == UNSET) continue; v4l2_add_attr(h, &h->ctl[i], 0, NULL); } /* capture buffers */ for (i = 0; i < WANTED_BUFFERS; i++) { ng_init_video_buf(h->buf_me+i); h->buf_me[i].release = ng_wakeup_video_buf; } return h; err: if (h->fd != -1) close(h->fd); if (h) free(h); return NULL; } static int v4l2_close(void *handle) { struct v4l2_handle *h = handle; if (ng_debug) fprintf(stderr, "v4l2: close\n"); close(h->fd); if (NULL != h->attr) { free(h->attr); h->attr = NULL; } free(h); h = NULL; return 0; } static char* v4l2_devname(void *handle) { struct v4l2_handle *h = handle; return (char*)h->cap.card; } static int v4l2_flags(void *handle) { struct v4l2_handle *h = handle; int ret = 0; if (h->cap.capabilities & V4L2_CAP_VIDEO_OVERLAY && !h->ov_error) ret |= CAN_OVERLAY; if (h->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ret |= CAN_CAPTURE; if (h->cap.capabilities & V4L2_CAP_TUNER) ret |= CAN_TUNE; return ret; } static struct ng_attribute* v4l2_attrs(void *handle) { struct v4l2_handle *h = handle; return h->attr; } /* ---------------------------------------------------------------------- */ static unsigned long v4l2_getfreq(void *handle) { struct v4l2_handle *h = handle; struct v4l2_frequency f; memset(&f,0,sizeof(f)); xioctl(h->fd, VIDIOC_G_FREQUENCY, &f, 0); return f.frequency; } static void v4l2_setfreq(void *handle, unsigned long freq) { struct v4l2_handle *h = handle; struct v4l2_frequency f; if (ng_debug) fprintf(stderr,"v4l2: freq: %.3f\n",(float)freq/16); memset(&f,0,sizeof(f)); f.type = V4L2_TUNER_ANALOG_TV; f.frequency = freq; xioctl(h->fd, VIDIOC_S_FREQUENCY, &f, 0); } static int v4l2_tuned(void *handle) { struct v4l2_handle *h = handle; struct v4l2_tuner tuner; usleep(10000); memset(&tuner,0,sizeof(tuner)); if (-1 == xioctl(h->fd,VIDIOC_G_TUNER,&tuner,0)) return 0; return tuner.signal ? 1 : 0; } /* ---------------------------------------------------------------------- */ /* overlay */ static int v4l2_setupfb(void *handle, struct ng_video_fmt *fmt, void *base) { struct v4l2_handle *h = handle; if (-1 == xioctl(h->fd, VIDIOC_G_FBUF, &h->ov_fb, 0)) return -1; /* double-check settings */ if (NULL != base && h->ov_fb.base != base) { fprintf(stderr,"v4l2: WARNING: framebuffer base address mismatch\n"); fprintf(stderr,"v4l2: me=%p v4l=%p\n",base,h->ov_fb.base); h->ov_error = 1; return -1; } if (h->ov_fb.fmt.width != fmt->width || h->ov_fb.fmt.height != fmt->height) { fprintf(stderr,"v4l2: WARNING: framebuffer size mismatch\n"); fprintf(stderr,"v4l2: me=%dx%d v4l=%dx%d\n", fmt->width,fmt->height,h->ov_fb.fmt.width,h->ov_fb.fmt.height); h->ov_error = 1; return -1; } if (fmt->bytesperline > 0 && fmt->bytesperline != h->ov_fb.fmt.bytesperline) { fprintf(stderr,"v4l2: WARNING: framebuffer bpl mismatch\n"); fprintf(stderr,"v4l2: me=%d v4l=%d\n", fmt->bytesperline,h->ov_fb.fmt.bytesperline); h->ov_error = 1; return -1; } return 0; } static int v4l2_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y, struct OVERLAY_CLIP *oc, int count, int aspect) { struct v4l2_handle *h = handle; struct v4l2_format win; int rc,i; if (h->ov_error) return -1; if (NULL == fmt) { if (ng_debug) fprintf(stderr,"v4l2: overlay off\n"); if (h->ov_enabled) { h->ov_enabled = 0; h->ov_on = 0; xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0); } return 0; } if (ng_debug) fprintf(stderr,"v4l2: overlay win=%dx%d+%d+%d, %d clips\n", fmt->width,fmt->height,x,y,count); memset(&win,0,sizeof(win)); win.type = V4L2_BUF_TYPE_VIDEO_OVERLAY; win.fmt.win.w.left = x; win.fmt.win.w.top = y; win.fmt.win.w.width = fmt->width; win.fmt.win.w.height = fmt->height; /* check against max. size */ xioctl(h->fd,VIDIOC_TRY_FMT,&win,0); if (win.fmt.win.w.width != (int)fmt->width) win.fmt.win.w.left = x + (fmt->width - win.fmt.win.w.width)/2; if (win.fmt.win.w.height != (int)fmt->height) win.fmt.win.w.top = y + (fmt->height - win.fmt.win.w.height)/2; if (aspect) ng_ratio_fixup(&win.fmt.win.w.width,&win.fmt.win.w.height, &win.fmt.win.w.left,&win.fmt.win.w.top); /* fixups */ ng_check_clipping(win.fmt.win.w.width, win.fmt.win.w.height, x - win.fmt.win.w.left, y - win.fmt.win.w.top, oc, &count); h->ov_win = win; if (h->ov_fb.capability & V4L2_FBUF_CAP_LIST_CLIPPING) { h->ov_win.fmt.win.clips = h->ov_clips; h->ov_win.fmt.win.clipcount = count; for (i = 0; i < count; i++) { h->ov_clips[i].next = (i+1 == count) ? NULL : &h->ov_clips[i+1]; h->ov_clips[i].c.left = oc[i].x1; h->ov_clips[i].c.top = oc[i].y1; h->ov_clips[i].c.width = oc[i].x2-oc[i].x1; h->ov_clips[i].c.height = oc[i].y2-oc[i].y1; } } rc = xioctl(h->fd, VIDIOC_S_FMT, &h->ov_win, 0); h->ov_enabled = (0 == rc) ? 1 : 0; h->ov_on = (0 == rc) ? 1 : 0; xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0); return 0; } /* ---------------------------------------------------------------------- */ /* capture helpers */ static int v4l2_queue_buffer(struct v4l2_handle *h) { int frame = h->queue % h->reqbufs.count; int rc; if (0 != h->buf_me[frame].refcount) { if (0 != h->queue - h->waiton) return -1; fprintf(stderr,"v4l2: waiting for a free buffer\n"); ng_waiton_video_buf(h->buf_me+frame); } rc = xioctl(h->fd,VIDIOC_QBUF,&h->buf_v4l2[frame], 0); if (0 == rc) h->queue++; return rc; } static void v4l2_queue_all(struct v4l2_handle *h) { for (;;) { if (h->queue - h->waiton >= h->reqbufs.count) return; if (0 != v4l2_queue_buffer(h)) return; } } static int v4l2_waiton(struct v4l2_handle *h) { struct v4l2_buffer buf; struct timeval tv; fd_set rdset; /* wait for the next frame */ again: tv.tv_sec = 5; tv.tv_usec = 0; FD_ZERO(&rdset); FD_SET(h->fd, &rdset); switch (select(h->fd + 1, &rdset, NULL, NULL, &tv)) { case -1: if (EINTR == errno) goto again; perror("v4l2: select"); return -1; case 0: fprintf(stderr,"v4l2: oops: select timeout\n"); return -1; } /* get it */ memset(&buf,0,sizeof(buf)); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (-1 == xioctl(h->fd,VIDIOC_DQBUF,&buf, 0)) return -1; h->waiton++; h->buf_v4l2[buf.index] = buf; return buf.index; } static int v4l2_start_streaming(struct v4l2_handle *h, int buffers) { int disable_overlay = 0; unsigned int i; /* setup buffers */ h->reqbufs.count = buffers; h->reqbufs.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; h->reqbufs.memory = V4L2_MEMORY_MMAP; if (-1 == xioctl(h->fd, VIDIOC_REQBUFS, &h->reqbufs, 0)) return -1; for (i = 0; i < h->reqbufs.count; i++) { h->buf_v4l2[i].index = i; h->buf_v4l2[i].type = V4L2_BUF_TYPE_VIDEO_CAPTURE; h->buf_v4l2[i].memory = V4L2_MEMORY_MMAP; if (-1 == xioctl(h->fd, VIDIOC_QUERYBUF, &h->buf_v4l2[i], 0)) return -1; h->buf_me[i].fmt = h->fmt_me; h->buf_me[i].size = h->buf_me[i].fmt.bytesperline * h->buf_me[i].fmt.height; h->buf_me[i].data = mmap(NULL, h->buf_v4l2[i].length, PROT_READ | PROT_WRITE, MAP_SHARED, h->fd, h->buf_v4l2[i].m.offset); if (MAP_FAILED == h->buf_me[i].data) { perror("mmap"); return -1; } if (ng_debug) print_bufinfo(&h->buf_v4l2[i]); } /* queue up all buffers */ v4l2_queue_all(h); try_again: /* turn off preview (if needed) */ if (disable_overlay) { h->ov_on = 0; xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0); if (ng_debug) fprintf(stderr,"v4l2: overlay off (start_streaming)\n"); } /* start capture */ if (-1 == xioctl(h->fd,VIDIOC_STREAMON,&h->fmt_v4l2.type, h->ov_on ? EBUSY : 0)) { if (h->ov_on && errno == EBUSY) { disable_overlay = 1; goto try_again; } return -1; } return 0; } static void v4l2_stop_streaming(struct v4l2_handle *h) { unsigned int i; /* stop capture */ if (-1 == ioctl(h->fd,VIDIOC_STREAMOFF,&h->fmt_v4l2.type)) perror("ioctl VIDIOC_STREAMOFF"); /* free buffers */ for (i = 0; i < h->reqbufs.count; i++) { if (0 != h->buf_me[i].refcount) ng_waiton_video_buf(&h->buf_me[i]); if (ng_debug) print_bufinfo(&h->buf_v4l2[i]); if (-1 == munmap(h->buf_me[i].data,h->buf_me[i].size)) perror("munmap"); } h->queue = 0; h->waiton = 0; /* turn on preview (if needed) */ if (h->ov_on != h->ov_enabled) { h->ov_on = h->ov_enabled; xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0); if (ng_debug) fprintf(stderr,"v4l2: overlay on (stop_streaming)\n"); } } /* ---------------------------------------------------------------------- */ /* capture interface */ /* set capture parameters */ static int v4l2_setformat(void *handle, struct ng_video_fmt *fmt) { struct v4l2_handle *h = handle; h->fmt_v4l2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; h->fmt_v4l2.fmt.pix.pixelformat = xawtv_pixelformat[fmt->fmtid]; h->fmt_v4l2.fmt.pix.width = fmt->width; h->fmt_v4l2.fmt.pix.height = fmt->height; h->fmt_v4l2.fmt.pix.field = V4L2_FIELD_ANY; //h->fmt_v4l2.fmt.pix.field = V4L2_FIELD_ALTERNATE; if (fmt->bytesperline != fmt->width * ng_vfmt_to_depth[fmt->fmtid]/8) h->fmt_v4l2.fmt.pix.bytesperline = fmt->bytesperline; else h->fmt_v4l2.fmt.pix.bytesperline = 0; if (-1 == xioctl(h->fd, VIDIOC_S_FMT, &h->fmt_v4l2, EINVAL)) return -1; if (h->fmt_v4l2.fmt.pix.pixelformat != xawtv_pixelformat[fmt->fmtid]) return -1; fmt->width = h->fmt_v4l2.fmt.pix.width; fmt->height = h->fmt_v4l2.fmt.pix.height; fmt->bytesperline = h->fmt_v4l2.fmt.pix.bytesperline; if (0 == fmt->bytesperline) fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8; h->fmt_me = *fmt; if (ng_debug) fprintf(stderr,"v4l2: new capture params (%dx%d, %c%c%c%c, %d byte)\n", fmt->width,fmt->height, h->fmt_v4l2.fmt.pix.pixelformat & 0xff, (h->fmt_v4l2.fmt.pix.pixelformat >> 8) & 0xff, (h->fmt_v4l2.fmt.pix.pixelformat >> 16) & 0xff, (h->fmt_v4l2.fmt.pix.pixelformat >> 24) & 0xff, h->fmt_v4l2.fmt.pix.sizeimage); return 0; } /* start/stop video */ static int v4l2_startvideo(void *handle, int fps, unsigned int buffers) { struct v4l2_handle *h = handle; if (0 != h->fps) fprintf(stderr,"v4l2_startvideo: oops: fps!=0\n"); h->fps = fps; h->first = 1; h->start = 0; if (h->cap.capabilities & V4L2_CAP_STREAMING) return v4l2_start_streaming(h,buffers); return 0; } static void v4l2_stopvideo(void *handle) { struct v4l2_handle *h = handle; if (0 == h->fps) fprintf(stderr,"v4l2_stopvideo: oops: fps==0\n"); h->fps = 0; if (h->cap.capabilities & V4L2_CAP_STREAMING) v4l2_stop_streaming(h); } /* read images */ static struct ng_video_buf* v4l2_nextframe(void *handle) { struct v4l2_handle *h = handle; struct ng_video_buf *buf = NULL; int rc,size,frame = 0; if (h->cap.capabilities & V4L2_CAP_STREAMING) { v4l2_queue_all(h); frame = v4l2_waiton(h); if (-1 == frame) return NULL; h->buf_me[frame].refcount++; buf = &h->buf_me[frame]; memset(&buf->info,0,sizeof(buf->info)); buf->info.ts = ng_tofday_to_timestamp(&h->buf_v4l2[frame].timestamp); } else { size = h->fmt_me.bytesperline * h->fmt_me.height; buf = ng_malloc_video_buf(&h->fmt_me,size); rc = read(h->fd,buf->data,size); if (rc != size) { if (-1 == rc) { perror("v4l2: read"); } else { fprintf(stderr, "v4l2: read: rc=%d/size=%d\n",rc,size); } ng_release_video_buf(buf); return NULL; } memset(&buf->info,0,sizeof(buf->info)); buf->info.ts = ng_get_timestamp(); } if (h->first) { h->first = 0; h->start = buf->info.ts; if (ng_debug) fprintf(stderr,"v4l2: start ts=%lld\n",h->start); } buf->info.ts -= h->start; return buf; } static struct ng_video_buf* v4l2_getimage(void *handle) { struct v4l2_handle *h = handle; struct ng_video_buf *buf; int size,frame,rc; size = h->fmt_me.bytesperline * h->fmt_me.height; buf = ng_malloc_video_buf(&h->fmt_me,size); if (h->cap.capabilities & V4L2_CAP_READWRITE) { rc = read(h->fd,buf->data,size); if (-1 == rc && EBUSY == errno && h->ov_on) { h->ov_on = 0; xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0); rc = read(h->fd,buf->data,size); h->ov_on = 1; xioctl(h->fd, VIDIOC_OVERLAY, &h->ov_on, 0); } if (rc != size) { if (-1 == rc) { perror("v4l2: read"); } else { fprintf(stderr, "v4l2: read: rc=%d/size=%d\n",rc,size); } ng_release_video_buf(buf); return NULL; } } else { if (-1 == v4l2_start_streaming(h,1)) { v4l2_stop_streaming(h); return NULL; } frame = v4l2_waiton(h); if (-1 == frame) { v4l2_stop_streaming(h); return NULL; } memcpy(buf->data,h->buf_me[0].data,size); v4l2_stop_streaming(h); } return buf; } /* ---------------------------------------------------------------------- */ void ng_plugin_v4l2_init(void) { ng_vid_driver_register(NG_PLUGIN_MAGIC,__FILE__,&v4l2_driver); } stopmotion-0.8.0/src/technical/libng/plugins/drv1-v4l.c000066400000000000000000000746441234321124500227660ustar00rootroot00000000000000/* * interface to the v4l driver * * (c) 1997-2001 Gerd Knorr * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../videodev.h" #include "../grab-ng.h" #include "../struct-dump.h" #include "../struct-v4l.h" #define SYNC_TIMEOUT 5 /* ---------------------------------------------------------------------- */ /* open+close */ static void* v4l_open(char *device); static int v4l_close(void *handle); /* attributes */ static char* v4l_devname(void *handle); static int v4l_flags(void *handle); static struct ng_attribute* v4l_attrs(void *handle); static int v4l_read_attr(struct ng_attribute*); static void v4l_write_attr(struct ng_attribute*, int val); /* overlay */ static int v4l_setupfb(void *handle, struct ng_video_fmt *fmt, void *base); static int v4l_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y, struct OVERLAY_CLIP *oc, int count, int aspect); /* capture video */ static int v4l_setformat(void *handle, struct ng_video_fmt *fmt); static int v4l_startvideo(void *handle, int fps, unsigned int buffers); static void v4l_stopvideo(void *handle); static struct ng_video_buf* v4l_nextframe(void *handle); static struct ng_video_buf* v4l_getimage(void *handle); /* tuner */ static unsigned long v4l_getfreq(void *handle); static void v4l_setfreq(void *handle, unsigned long freq); static int v4l_tuned(void *handle); /* ---------------------------------------------------------------------- */ static const char *device_cap[] = { "capture", "tuner", "teletext", "overlay", "chromakey", "clipping", "frameram", "scales", "monochrome", NULL }; static const char *device_pal[] = { "-", "grey", "hi240", "rgb16", "rgb24", "rgb32", "rgb15", "yuv422", "yuyv", "uyvy", "yuv420", "yuv411", "raw", "yuv422p", "yuv411p", "yuv420p", "yuv410p" }; #define PALETTE(x) ((x < sizeof(device_pal)/sizeof(char*)) ? device_pal[x] : "UNKNOWN") static struct STRTAB stereo[] = { { 0, "auto" }, { VIDEO_SOUND_MONO, "mono" }, { VIDEO_SOUND_STEREO, "stereo" }, { VIDEO_SOUND_LANG1, "lang1" }, { VIDEO_SOUND_LANG2, "lang2" }, { -1, NULL }, }; static struct STRTAB norms_v4l[] = { { VIDEO_MODE_PAL, "PAL" }, { VIDEO_MODE_NTSC, "NTSC" }, { VIDEO_MODE_SECAM, "SECAM" }, { VIDEO_MODE_AUTO, "AUTO" }, { -1, NULL } }; static struct STRTAB norms_bttv[] = { { VIDEO_MODE_PAL, "PAL" }, { VIDEO_MODE_NTSC, "NTSC" }, { VIDEO_MODE_SECAM, "SECAM" }, { 3, "PAL-NC" }, { 4, "PAL-M" }, { 5, "PAL-N" }, { 6, "NTSC-JP" }, { -1, NULL } }; static unsigned short format2palette[VIDEO_FMT_COUNT] = { [ VIDEO_RGB08 ] = VIDEO_PALETTE_HI240, [ VIDEO_GRAY ] = VIDEO_PALETTE_GREY, [ VIDEO_RGB15_LE ] = VIDEO_PALETTE_RGB555, [ VIDEO_RGB16_LE ] = VIDEO_PALETTE_RGB565, [ VIDEO_BGR24 ] = VIDEO_PALETTE_RGB24, [ VIDEO_BGR32 ] = VIDEO_PALETTE_RGB32, [ VIDEO_YUYV ] = VIDEO_PALETTE_YUV422, [ VIDEO_UYVY ] = VIDEO_PALETTE_UYVY, [ VIDEO_YUV422P ] = VIDEO_PALETTE_YUV422P, [ VIDEO_YUV420P ] = VIDEO_PALETTE_YUV420P, }; /* pass 0/1 by reference */ static int one = 1, zero = 0; /* ---------------------------------------------------------------------- */ struct v4l_handle { int fd; /* general informations */ struct video_capability capability; struct video_channel *channels; struct video_tuner tuner; struct video_audio audio; struct video_picture pict; /* attributes */ int nattr; struct ng_attribute *attr; int input; int audio_mode; /* overlay */ struct video_buffer fbuf; struct video_window win; int ov_error; unsigned int ov_fmtid; int ov_enabled; int ov_on; /* capture */ int use_read; struct ng_video_fmt fmt; long long start; int fps; /* capture via read() */ struct ng_video_fmt rd_fmt; struct video_window rd_win; unsigned int rd_fmtid; /* capture to mmap()'ed buffers */ struct video_mbuf mbuf; unsigned char *mmap; unsigned int nbuf; unsigned int queue; unsigned int waiton; int probe[VIDEO_FMT_COUNT]; struct video_mmap *buf_v4l; struct ng_video_buf *buf_me; }; struct ng_vid_driver v4l_driver = { name: "v4l", open: v4l_open, close: v4l_close, get_devname: v4l_devname, capabilities: v4l_flags, list_attrs: v4l_attrs, setupfb: v4l_setupfb, overlay: v4l_overlay, setformat: v4l_setformat, startvideo: v4l_startvideo, stopvideo: v4l_stopvideo, nextframe: v4l_nextframe, getimage: v4l_getimage, getfreq: v4l_getfreq, setfreq: v4l_setfreq, is_tuned: v4l_tuned, }; /* ---------------------------------------------------------------------- */ static int alarms; static void sigalarm(int signal) { alarms++; fprintf(stderr,"v4l: timeout (got SIGALRM), hardware/driver problems?\n"); } static void siginit(void) { struct sigaction act,old; memset(&act,0,sizeof(act)); act.sa_handler = sigalarm; sigemptyset(&act.sa_mask); sigaction(SIGALRM,&act,&old); } /* ---------------------------------------------------------------------- */ #define PREFIX "ioctl: " static int xioctl(int fd, int cmd, void *arg) { int rc; rc = ioctl(fd,cmd,arg); if (0 == rc && ng_debug < 2) return 0; print_ioctl(stderr,ioctls_v4l1,PREFIX,cmd,arg); fprintf(stderr,": %s\n",(rc == 0) ? "ok" : strerror(errno)); return rc; } /* ---------------------------------------------------------------------- */ static void v4l_add_attr(struct v4l_handle *h, int id, int type, int defval, struct STRTAB *choices) { h->attr = realloc(h->attr,(h->nattr+2) * sizeof(struct ng_attribute)); memset(h->attr+h->nattr,0,sizeof(struct ng_attribute)*2); h->attr[h->nattr].id = id; h->attr[h->nattr].type = type; h->attr[h->nattr].defval = defval; h->attr[h->nattr].choices = choices; if (ATTR_TYPE_INTEGER == type) { h->attr[h->nattr].min = 0; h->attr[h->nattr].max = 65535; } if (id < ATTR_ID_COUNT) h->attr[h->nattr].name = ng_attr_to_desc[id]; h->attr[h->nattr].read = v4l_read_attr; h->attr[h->nattr].write = v4l_write_attr; h->attr[h->nattr].handle = h; h->nattr++; } static void* v4l_open(char *device) { struct v4l_handle *h; struct STRTAB *inputs; struct STRTAB *norms; unsigned int i; int rc; h = malloc(sizeof(*h)); if (NULL == h) return NULL; memset(h,0,sizeof(*h)); /* open device */ if (-1 == (h->fd = open(device,O_RDWR))) { fprintf(stderr,"v4l: open %s: %s\n",device,strerror(errno)); goto err; } if (-1 == ioctl(h->fd,VIDIOCGCAP,&h->capability)) goto err; if (ng_debug) fprintf(stderr, "v4l: open: %s (%s)\n",device,h->capability.name); fcntl(h->fd,F_SETFD,FD_CLOEXEC); siginit(); if (ng_debug) { fprintf(stderr," capabilities: "); for (i = 0; device_cap[i] != NULL; i++) if (h->capability.type & (1 << i)) fprintf(stderr," %s",device_cap[i]); fprintf(stderr,"\n"); fprintf(stderr," size : %dx%d => %dx%d\n", h->capability.minwidth,h->capability.minheight, h->capability.maxwidth,h->capability.maxheight); } /* input sources */ if (ng_debug) fprintf(stderr," channels: %d\n",h->capability.channels); h->channels = malloc(sizeof(struct video_channel)*h->capability.channels); memset(h->channels,0,sizeof(struct video_channel)*h->capability.channels); inputs = malloc(sizeof(struct STRTAB)*(h->capability.channels+1)); memset(inputs,0,sizeof(struct STRTAB)*(h->capability.channels+1)); for (i = 0; i < h->capability.channels; i++) { h->channels[i].channel = i; xioctl(h->fd,VIDIOCGCHAN,&(h->channels[i])); inputs[i].nr = i; inputs[i].str = h->channels[i].name; if (ng_debug) fprintf(stderr," %s: %d %s%s %s%s\n", h->channels[i].name, h->channels[i].tuners, (h->channels[i].flags & VIDEO_VC_TUNER) ? "tuner " : "", (h->channels[i].flags & VIDEO_VC_AUDIO) ? "audio " : "", (h->channels[i].type & VIDEO_TYPE_TV) ? "tv " : "", (h->channels[i].type & VIDEO_TYPE_CAMERA) ? "camera " : ""); } inputs[i].nr = -1; inputs[i].str = NULL; v4l_add_attr(h,ATTR_ID_INPUT,ATTR_TYPE_CHOICE,0,inputs); /* audios */ if (ng_debug) fprintf(stderr," audios : %d\n",h->capability.audios); if (h->capability.audios) { h->audio.audio = 0; xioctl(h->fd,VIDIOCGAUDIO,&h->audio); if (ng_debug) { fprintf(stderr," %d (%s): ",i,h->audio.name); if (h->audio.flags & VIDEO_AUDIO_MUTABLE) fprintf(stderr,"muted=%s ", (h->audio.flags&VIDEO_AUDIO_MUTE) ? "yes":"no"); if (h->audio.flags & VIDEO_AUDIO_VOLUME) fprintf(stderr,"volume=%d ",h->audio.volume); if (h->audio.flags & VIDEO_AUDIO_BASS) fprintf(stderr,"bass=%d ",h->audio.bass); if (h->audio.flags & VIDEO_AUDIO_TREBLE) fprintf(stderr,"treble=%d ",h->audio.treble); fprintf(stderr,"\n"); } v4l_add_attr(h,ATTR_ID_MUTE,ATTR_TYPE_BOOL,0,NULL); v4l_add_attr(h,ATTR_ID_AUDIO_MODE,ATTR_TYPE_CHOICE,0,stereo); if (h->audio.flags & VIDEO_AUDIO_VOLUME) v4l_add_attr(h,ATTR_ID_VOLUME,ATTR_TYPE_INTEGER,0,NULL); } /* tv norms / tuner */ norms = malloc(sizeof(norms_v4l)); memcpy(norms,norms_v4l,sizeof(norms_v4l)); if (h->capability.type & VID_TYPE_TUNER) { /* have tuner */ xioctl(h->fd,VIDIOCGTUNER,&h->tuner); if (ng_debug) fprintf(stderr," tuner : %s %lu-%lu", h->tuner.name,h->tuner.rangelow,h->tuner.rangehigh); for (i = 0; norms[i].str != NULL; i++) { if (h->tuner.flags & (1<channels[0], sizeof(struct video_channel)); for (i = 0; norms[i].str != NULL; i++) { vchan.norm = i; if (-1 == xioctl(h->fd,VIDIOCSCHAN,&vchan)) norms[i].nr = -1; else if (ng_debug) fprintf(stderr," %s",norms[i].str); } /* restore settings after probe */ memcpy(&vchan, &h->channels[0], sizeof(struct video_channel)); xioctl(h->fd,VIDIOCSCHAN,&vchan); if (ng_debug) fprintf(stderr,"\n"); } #if 1 #define BTTV_VERSION _IOR('v' , BASE_VIDIOCPRIVATE+6, int) /* dirty hack time / v4l design flaw -- works with bttv only * this adds support for a few less common PAL versions */ if (-1 != (rc = ioctl(h->fd,BTTV_VERSION,&i))) { norms = norms_bttv; if (ng_debug || rc < 0x000700) fprintf(stderr,"v4l: bttv version %d.%d.%d\n", (rc >> 16) & 0xff, (rc >> 8) & 0xff, rc & 0xff); if (rc < 0x000700) fprintf(stderr, "v4l: prehistoric bttv version found, please try to\n" " upgrade the driver before mailing bug reports\n"); } #endif v4l_add_attr(h,ATTR_ID_NORM,ATTR_TYPE_CHOICE,0,norms); /* frame buffer */ xioctl(h->fd,VIDIOCGFBUF,&h->fbuf); if (ng_debug) fprintf(stderr," fbuffer : base=0x%p size=%dx%d depth=%d bpl=%d\n", h->fbuf.base, h->fbuf.width, h->fbuf.height, h->fbuf.depth, h->fbuf.bytesperline); /* picture parameters */ xioctl(h->fd,VIDIOCGPICT,&h->pict); v4l_add_attr(h,ATTR_ID_BRIGHT, ATTR_TYPE_INTEGER,0,NULL); v4l_add_attr(h,ATTR_ID_HUE, ATTR_TYPE_INTEGER,0,NULL); v4l_add_attr(h,ATTR_ID_COLOR, ATTR_TYPE_INTEGER,0,NULL); v4l_add_attr(h,ATTR_ID_CONTRAST,ATTR_TYPE_INTEGER,0,NULL); if (ng_debug) { fprintf(stderr, " picture : brightness=%d hue=%d colour=%d contrast=%d\n", h->pict.brightness, h->pict.hue, h->pict.colour, h->pict.contrast); fprintf(stderr, " picture : whiteness=%d depth=%d palette=%s\n", h->pict.whiteness, h->pict.depth, PALETTE(h->pict.palette)); } if (h->capability.type & VID_TYPE_CAPTURE) { /* map grab buffer */ if (0 == xioctl(h->fd,VIDIOCGMBUF,&h->mbuf)) { if (ng_debug) fprintf(stderr," mbuf: size=%d frames=%d\n", h->mbuf.size,h->mbuf.frames); h->mmap = mmap(0,h->mbuf.size,PROT_READ|PROT_WRITE, MAP_SHARED,h->fd,0); if ((unsigned char*)-1 == h->mmap) perror("mmap"); } else { h->mmap = (unsigned char*)-1; } if ((unsigned char*)-1 != h->mmap) { if (ng_debug) fprintf(stderr," v4l: using mapped buffers for capture\n"); h->use_read = 0; h->nbuf = h->mbuf.frames; h->buf_v4l = malloc(h->nbuf * sizeof(struct video_mmap)); memset(h->buf_v4l,0,h->nbuf * sizeof(struct video_mmap)); h->buf_me = malloc(h->nbuf * sizeof(struct ng_video_buf)); for (i = 0; i < h->nbuf; i++) { ng_init_video_buf(h->buf_me+i); h->buf_me[i].release = ng_wakeup_video_buf; } } else { if (ng_debug) fprintf(stderr," v4l: using read() for capture\n"); h->use_read = 1; } } return h; err: if (h->fd != -1) close(h->fd); free(h); return NULL; } static int v4l_close(void *handle) { struct v4l_handle *h = handle; if (ng_debug) fprintf(stderr, "v4l: close\n"); if ((unsigned char*)-1 != h->mmap) munmap(h->mmap,h->mbuf.size); close(h->fd); if (NULL != h->attr) { free(h->attr); h->attr = NULL; } if (NULL != h->channels) { free(h->channels); h->channels = NULL; } if (NULL != h->buf_v4l) { free(h->buf_v4l); h->buf_v4l = NULL; } if (NULL != h->buf_me) { free(h->buf_me); h->buf_me = NULL; } free(h); h = NULL; return 0; } /* ---------------------------------------------------------------------- */ static char* v4l_devname(void *handle) { struct v4l_handle *h = handle; return h->capability.name; } static int v4l_flags(void *handle) { struct v4l_handle *h = handle; int ret = 0; if (h->capability.type & VID_TYPE_OVERLAY) ret |= CAN_OVERLAY; if (h->capability.type & VID_TYPE_CAPTURE && !h->ov_error) ret |= CAN_CAPTURE; if (h->capability.type & VID_TYPE_TUNER) ret |= CAN_TUNE; if (h->capability.type & VID_TYPE_CHROMAKEY) ret |= NEEDS_CHROMAKEY; return ret; } static struct ng_attribute* v4l_attrs(void *handle) { struct v4l_handle *h = handle; return h->attr; } static int audio_mode_mask2bit(int mode) { if (mode & VIDEO_SOUND_STEREO) return VIDEO_SOUND_STEREO; if (mode & VIDEO_SOUND_LANG1) return VIDEO_SOUND_LANG1; if (mode & VIDEO_SOUND_LANG2) return VIDEO_SOUND_LANG2; if (mode & VIDEO_SOUND_MONO) return VIDEO_SOUND_MONO; return 0; } static int v4l_read_attr(struct ng_attribute *attr) { struct v4l_handle *h = attr->handle; switch (attr->id) { case ATTR_ID_INPUT: return -1; case ATTR_ID_NORM: xioctl(h->fd, VIDIOCGCHAN, &h->channels[h->input]); return h->channels[h->input].norm; case ATTR_ID_MUTE: xioctl(h->fd, VIDIOCGAUDIO, &h->audio); return h->audio.flags & VIDEO_AUDIO_MUTE; case ATTR_ID_VOLUME: xioctl(h->fd, VIDIOCGAUDIO, &h->audio); return h->audio.volume; case ATTR_ID_AUDIO_MODE: xioctl(h->fd, VIDIOCGAUDIO, &h->audio); return audio_mode_mask2bit(h->audio.mode); case ATTR_ID_COLOR: xioctl(h->fd, VIDIOCGPICT, &h->pict); return h->pict.colour; case ATTR_ID_BRIGHT: xioctl(h->fd, VIDIOCGPICT, &h->pict); return h->pict.brightness; case ATTR_ID_HUE: xioctl(h->fd, VIDIOCGPICT, &h->pict); return h->pict.hue; case ATTR_ID_CONTRAST: xioctl(h->fd, VIDIOCGPICT, &h->pict); return h->pict.contrast; } return -1; } static void v4l_write_attr(struct ng_attribute *attr, int val) { struct v4l_handle *h = attr->handle; /* read ... */ switch (attr->id) { case ATTR_ID_INPUT: /* nothing */ break; case ATTR_ID_NORM: xioctl(h->fd, VIDIOCGCHAN, &h->channels[h->input]); break; case ATTR_ID_MUTE: case ATTR_ID_VOLUME: case ATTR_ID_AUDIO_MODE: xioctl(h->fd, VIDIOCGAUDIO, &h->audio); break; case ATTR_ID_COLOR: case ATTR_ID_BRIGHT: case ATTR_ID_HUE: case ATTR_ID_CONTRAST: xioctl(h->fd, VIDIOCGPICT, &h->pict); break; } /* ... modify ... */ switch (attr->id) { case ATTR_ID_INPUT: h->input = val; h->audio_mode = 0; break; case ATTR_ID_NORM: h->channels[h->input].norm = val; h->audio_mode = 0; break; case ATTR_ID_MUTE: if (val) h->audio.flags |= VIDEO_AUDIO_MUTE; else h->audio.flags &= ~VIDEO_AUDIO_MUTE; break; case ATTR_ID_VOLUME: h->audio.volume = val; break; case ATTR_ID_AUDIO_MODE: h->audio_mode = val; break; case ATTR_ID_COLOR: h->pict.colour = val; break; case ATTR_ID_BRIGHT: h->pict.brightness = val; break; case ATTR_ID_HUE: h->pict.hue = val; break; case ATTR_ID_CONTRAST: h->pict.contrast = val; break; } /* have to set that all the time as read and write have slightly different semantics: read == bitmask with all available modes flagged write == one bit set (for the selected mode, zero is autodetect) */ h->audio.mode = h->audio_mode; /* ... write */ switch (attr->id) { case ATTR_ID_INPUT: case ATTR_ID_NORM: xioctl(h->fd, VIDIOCSCHAN, &h->channels[h->input]); break; case ATTR_ID_MUTE: case ATTR_ID_VOLUME: case ATTR_ID_AUDIO_MODE: xioctl(h->fd, VIDIOCSAUDIO, &h->audio); break; case ATTR_ID_COLOR: case ATTR_ID_BRIGHT: case ATTR_ID_HUE: case ATTR_ID_CONTRAST: xioctl(h->fd, VIDIOCSPICT, &h->pict); break; } } static unsigned long v4l_getfreq(void *handle) { struct v4l_handle *h = handle; unsigned long freq; xioctl(h->fd, VIDIOCGFREQ, &freq); return freq; } static void v4l_setfreq(void *handle, unsigned long freq) { struct v4l_handle *h = handle; if (ng_debug) fprintf(stderr,"v4l: freq: %.3f\n",(float)freq/16); xioctl(h->fd, VIDIOCSFREQ, &freq); h->audio_mode = 0; } static int v4l_tuned(void *handle) { struct v4l_handle *h = handle; /* usleep(10000); */ if (-1 == xioctl(h->fd,VIDIOCGTUNER,&h->tuner)) return 0; return h->tuner.signal ? 1 : 0; } /* ---------------------------------------------------------------------- */ /* do overlay */ int v4l_setupfb(void *handle, struct ng_video_fmt *fmt, void *base) { struct v4l_handle *h = handle; /* overlay supported ?? */ if (!(h->capability.type & VID_TYPE_OVERLAY)) { if (ng_debug) fprintf(stderr,"v4l: device has no overlay support\n"); return -1; } /* double-check settings */ if (ng_debug) fprintf(stderr,"v4l: %dx%d, %d bit/pixel, %d byte/scanline\n", h->fbuf.width,h->fbuf.height, h->fbuf.depth,h->fbuf.bytesperline); if ((fmt->bytesperline > 0 && h->fbuf.bytesperline != fmt->bytesperline) || (h->fbuf.width != fmt->width) || (h->fbuf.height != fmt->height)) { fprintf(stderr, "WARNING: v4l and x11 disagree about the screen size\n" "WARNING: Is v4l-conf installed correctly?\n"); h->ov_error = 1; } if (ng_vfmt_to_depth[fmt->fmtid] != ((h->fbuf.depth+7)&0xf8)) { fprintf(stderr, "WARNING: v4l and x11 disagree about the color depth\n" "WARNING: fbuf.depth=%d, x11 depth=%d\n" "WARNING: Is v4l-conf installed correctly?\n", h->fbuf.depth,ng_vfmt_to_depth[fmt->fmtid]); h->ov_error = 1; } if (NULL != base) { /* XXX: minor differences are legal... (matrox problems) */ if ((void*)((unsigned long)h->fbuf.base & 0xfffff000) != (void*)((unsigned long)base & 0xfffff000)) { fprintf(stderr, "WARNING: v4l and dga disagree about the framebuffer base\n" "WARNING: fbuf.base=%p, dga=%p\n" "WARNING: Is v4l-conf installed correctly?\n", h->fbuf.base,base); h->ov_error = 1; } } if (h->ov_error) { fprintf(stderr,"WARNING: overlay mode disabled\n"); return -1; } return 0; } static void v4l_overlay_set(struct v4l_handle *h, int state) { int rc; if (0 == state) { /* off */ if (0 == h->ov_on) return; xioctl(h->fd, VIDIOCCAPTURE, &zero); h->ov_on = 0; } else { /* on */ h->pict.depth = ng_vfmt_to_depth[h->ov_fmtid]; h->pict.palette = GETELEM(format2palette,h->ov_fmtid,0); xioctl(h->fd, VIDIOCSPICT, &h->pict); rc = xioctl(h->fd, VIDIOCSWIN, &h->win); if (0 == rc) { if (0 != h->ov_on) return; xioctl(h->fd, VIDIOCCAPTURE, &one); h->ov_on = 1; } else { /* disable overlay on SWIN failure */ xioctl(h->fd, VIDIOCCAPTURE, &zero); h->ov_on = 0; } } } int v4l_overlay(void *handle, struct ng_video_fmt *fmt, int x, int y, struct OVERLAY_CLIP *oc, int count, int aspect) { struct v4l_handle *h = handle; int i; if (h->ov_error) return -1; if (NULL == fmt) { if (ng_debug) fprintf(stderr,"v4l: overlay off\n"); h->ov_enabled = 0; v4l_overlay_set(h,h->ov_enabled); return 0; } h->win.x = x; h->win.y = y; h->win.width = fmt->width; h->win.height = fmt->height; h->win.flags = 0; h->win.chromakey = 0; /* check against max. size */ xioctl(h->fd,VIDIOCGCAP,&h->capability); if (h->win.width > h->capability.maxwidth) { h->win.width = h->capability.maxwidth; h->win.x += (fmt->width - h->win.width)/2; } if (h->win.height > h->capability.maxheight) { h->win.height = h->capability.maxheight; h->win.y += (fmt->height - h->win.height)/2; } if (aspect) ng_ratio_fixup((int*)&h->win.width, (int*)&h->win.height, (int*)&h->win.x, (int*)&h->win.y); #if 0 /* pass aligned values -- the driver does'nt get it right yet */ h->win.width &= ~3; h->win.height &= ~3; h->win.x &= ~3; if (h->win.x < x) h->win.x += 4; if (h->win.x+h->win.width > x+fmt->width) h->win.width -= 4; #endif /* fixups */ ng_check_clipping(h->win.width, h->win.height, x - h->win.x, y - h->win.y, oc, &count); /* handle clipping */ if (h->win.clips) { free(h->win.clips); h->win.clips = NULL; } h->win.clipcount = 0; if (h->capability.type & VID_TYPE_CLIPPING && count > 0) { h->win.clipcount = count; h->win.clips = malloc(count * sizeof(struct video_clip)); for (i = 0; i < count; i++) { h->win.clips[i].x = oc[i].x1; h->win.clips[i].y = oc[i].y1; h->win.clips[i].width = oc[i].x2-oc[i].x1; h->win.clips[i].height = oc[i].y2-oc[i].y1; } } if (h->capability.type & VID_TYPE_CHROMAKEY) h->win.chromakey = ng_chromakey; h->ov_enabled = 1; h->ov_fmtid = fmt->fmtid; v4l_overlay_set(h,h->ov_enabled); if (ng_debug) fprintf(stderr,"v4l: overlay win=%dx%d+%d+%d, %d clips\n", fmt->width,fmt->height,x,y,count); return 0; } /* ---------------------------------------------------------------------- */ static int mm_queue(struct v4l_handle *h) { int frame = h->queue % h->nbuf; int rc; if (0 != h->buf_me[frame].refcount) { if (0 != h->queue - h->waiton) return -1; fprintf(stderr,"v4l: waiting for a free buffer\n"); ng_waiton_video_buf(h->buf_me+frame); } rc = xioctl(h->fd,VIDIOCMCAPTURE,h->buf_v4l+frame); if (0 == rc) h->queue++; return rc; } static void mm_queue_all(struct v4l_handle *h) { for (;;) { if (h->queue - h->waiton >= h->nbuf) return; if (0 != mm_queue(h)) return; } } static int mm_waiton(struct v4l_handle *h) { int frame = h->waiton % h->nbuf; int rc; if (0 == h->queue - h->waiton) return -1; h->waiton++; alarms=0; alarm(SYNC_TIMEOUT); retry: if (-1 == (rc = xioctl(h->fd,VIDIOCSYNC,h->buf_v4l+frame))) { if (errno == EINTR && !alarms) goto retry; } alarm(0); if (-1 == rc) return -1; return frame; } static void mm_clear(struct v4l_handle *h) { while (h->queue > h->waiton) mm_waiton(h); h->queue = 0; h->waiton = 0; } static int mm_probe(struct v4l_handle *h, unsigned int fmtid) { if (0 != h->probe[fmtid]) goto done; if (ng_debug) fprintf(stderr, "v4l: capture probe %s...\t", ng_vfmt_to_desc[fmtid]); h->buf_v4l[0].frame = 0; h->buf_v4l[0].width = h->capability.minwidth; h->buf_v4l[0].height = h->capability.minheight; h->buf_v4l[0].format = GETELEM(format2palette,fmtid,0); #if 1 /* bug compatibility: bttv up to 0.7.67 reports wrong minwidth */ if (h->buf_v4l[0].width == 32) h->buf_v4l[0].width = 48; #endif if (0 == h->buf_v4l[0].format) goto fail; if (-1 == mm_queue(h)) goto fail; if (-1 == mm_waiton(h)) goto fail; if (ng_debug) fprintf(stderr, "ok\n"); h->probe[fmtid] = 1; goto done; fail: if (ng_debug) fprintf(stderr, "failed\n"); h->probe[fmtid] = 2; done: mm_clear(h); return h->probe[fmtid] == 1; } static int mm_setparams(struct v4l_handle *h, struct ng_video_fmt *fmt) { unsigned int i; /* buffers available ? */ if (h->mbuf.frames < 1) return -1; /* verify parameters */ xioctl(h->fd,VIDIOCGCAP,&h->capability); if (fmt->width > h->capability.maxwidth) fmt->width = h->capability.maxwidth; if (fmt->height > h->capability.maxheight) fmt->height = h->capability.maxheight; fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8; /* check if we can handle the format */ if (!mm_probe(h,fmt->fmtid)) return -1; /* initialize everything */ h->nbuf = h->mbuf.frames; for (i = 0; i < h->nbuf; i++) { h->buf_v4l[i].format = GETELEM(format2palette,fmt->fmtid,0); h->buf_v4l[i].frame = i; h->buf_v4l[i].width = fmt->width; h->buf_v4l[i].height = fmt->height; h->buf_me[i].fmt = *fmt; h->buf_me[i].data = h->mmap + h->mbuf.offsets[i]; h->buf_me[i].size = fmt->height * fmt->bytesperline; } return 0; } /* ---------------------------------------------------------------------- */ static int read_setformat(struct v4l_handle *h, struct ng_video_fmt *fmt) { xioctl(h->fd,VIDIOCGCAP,&h->capability); if (fmt->width > h->capability.maxwidth) fmt->width = h->capability.maxwidth; if (fmt->height > h->capability.maxheight) fmt->height = h->capability.maxheight; fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8; h->rd_win.width = fmt->width; h->rd_win.height = fmt->height; h->rd_fmtid = fmt->fmtid; h->pict.depth = ng_vfmt_to_depth[h->rd_fmtid]; h->pict.palette = GETELEM(format2palette,h->rd_fmtid,0); if (-1 == xioctl(h->fd, VIDIOCSPICT, &h->pict)) return -1; if (-1 == xioctl(h->fd, VIDIOCSWIN, &h->rd_win)) return -1; fmt->width = h->rd_win.width; fmt->height = h->rd_win.height; fmt->bytesperline = fmt->width * ng_vfmt_to_depth[fmt->fmtid] / 8; h->rd_fmt = *fmt; return 0; } static struct ng_video_buf* read_getframe(struct v4l_handle *h) { struct ng_video_buf* buf; int size; h->pict.depth = ng_vfmt_to_depth[h->rd_fmtid]; h->pict.palette = GETELEM(format2palette,h->rd_fmtid,0); xioctl(h->fd, VIDIOCSPICT, &h->pict); xioctl(h->fd, VIDIOCSWIN, &h->rd_win); size = h->rd_fmt.bytesperline * h->rd_fmt.height; buf = ng_malloc_video_buf(&h->rd_fmt, size); if (NULL == buf) return NULL; if (size != read(h->fd,buf->data,size)) { ng_release_video_buf(buf); return NULL; } return buf; } /* ---------------------------------------------------------------------- */ int v4l_setformat(void *handle, struct ng_video_fmt *fmt) { struct v4l_handle *h = handle; int rc; #if 0 /* for debugging color space conversion functions: force xawtv to capture some specific format */ if (fmt->fmtid != VIDEO_YUV420P) return -1; #endif if (ng_debug) fprintf(stderr,"v4l: setformat\n"); if (h->use_read) { v4l_overlay_set(h,0); rc = read_setformat(h,fmt); v4l_overlay_set(h,h->ov_enabled); } else { if (h->queue != h->waiton) fprintf(stderr,"v4l: Huh? setformat: found queued buffers (%d %d)\n", h->queue, h->waiton); mm_clear(h); rc = mm_setparams(h,fmt); } return rc; } int v4l_startvideo(void *handle, int fps, unsigned int buffers) { struct v4l_handle *h = handle; if (ng_debug) fprintf(stderr,"v4l: startvideo\n"); if (0 != h->fps) fprintf(stderr,"v4l: Huh? start: fps != 0\n"); if (!h->use_read) { if (h->nbuf > buffers) h->nbuf = buffers; mm_queue_all(h); } h->start = ng_get_timestamp(); h->fps = fps; return 0; } void v4l_stopvideo(void *handle) { struct v4l_handle *h = handle; if (ng_debug) fprintf(stderr,"v4l: stopvideo\n"); if (0 == h->fps) fprintf(stderr,"v4l: Huh? stop: fps == 0\n"); if (!h->use_read) mm_clear(h); h->fps = 0; } struct ng_video_buf* v4l_nextframe(void *handle) { struct v4l_handle *h = handle; struct ng_video_buf* buf = NULL; int frame = 0; if (ng_debug > 1) fprintf(stderr,"v4l: getimage\n"); if (0 == h->fps) { fprintf(stderr,"v4l: nextframe: fps == 0\n"); return NULL; } if (h->use_read) { if (buf) ng_release_video_buf(buf); v4l_overlay_set(h,0); buf = read_getframe(h); v4l_overlay_set(h,h->ov_enabled); if (NULL == buf) return NULL; memset(&buf->info,0,sizeof(buf->info)); buf->info.ts = ng_get_timestamp() - h->start; return buf; } else { mm_queue_all(h); frame = mm_waiton(h); if (-1 == frame) return NULL; memset(&h->buf_me[frame].info,0,sizeof(h->buf_me[frame].info)); h->buf_me[frame].refcount++; h->buf_me[frame].info.ts = ng_get_timestamp() - h->start; return h->buf_me+frame; } } /* ---------------------------------------------------------------------- */ struct ng_video_buf* v4l_getimage(void *handle) { struct v4l_handle *h = handle; struct ng_video_buf* buf = NULL; int frame; if (ng_debug) fprintf(stderr,"v4l: getimage\n"); if (0 != h->fps) { fprintf(stderr,"v4l: getimage: fps != 0\n"); return NULL; } if (h->use_read) { v4l_overlay_set(h,0); buf = read_getframe(h); v4l_overlay_set(h,h->ov_enabled); return buf; } else { mm_queue(h); frame = mm_waiton(h); if (-1 == frame) return NULL; h->buf_me[frame].refcount++; return h->buf_me+frame; } } /* ---------------------------------------------------------------------- */ void ng_plugin_v4l_init(void) { ng_vid_driver_register(NG_PLUGIN_MAGIC,__FILE__,&v4l_driver); } stopmotion-0.8.0/src/technical/libng/struct-dump.c000066400000000000000000000124621234321124500222030ustar00rootroot00000000000000#include #include #include #include #include #include #include #include "struct-dump.h" /* ---------------------------------------------------------------------- */ struct struct_desc desc_int[] = {{ .type = SINT32, .name = "int", },{ /* end of list */ }}; struct struct_desc desc_long[] = {{ .type = SINT32, .name = "long", },{ /* end of list */ }}; struct struct_desc desc_timeval[] = {{ /* FIXME */ /* end of list */ }}; /* ---------------------------------------------------------------------- */ int print_struct(FILE *fp, struct struct_desc *desc, void *data, char *prefix, int tab) { char name[PATH_MAX]; unsigned char *ptr = data; uint64_t u64; int64_t s64; uint32_t u32; int32_t s32; uint16_t u16; int16_t s16; uint8_t u8; int8_t s8; int al = sizeof(long)-1; /* struct + union + 64bit alignment */ void *p; unsigned int i,j,first; for (i = 0; desc[i].name != NULL; i++) { sprintf(name,"%s%s",prefix,desc[i].name); if (STRUCT == desc[i].type) { strcat(name,"."); ptr = (void*)(((intptr_t)ptr + al) & ~al); print_struct(fp,desc[i].desc, ptr, name, tab); ptr += desc[i].length; if (!tab && desc[i+1].name != NULL) fprintf(fp,";"); continue; } if (UNION == desc[i].type) { u32 = *((uint32_t*)(ptr-4)); ptr = (void*)(((intptr_t)ptr + al) & ~al); for (j = 0; desc[i].u[j].name != NULL; j++) if (desc[i].u[j].value == u32) break; if (desc[i].u[j].name != NULL) { strcat(name,"."); strcat(name,desc[i].u[j].name); strcat(name,"."); print_struct(fp,desc[i].u[j].desc, ptr, name, tab); } return 0; /* FIXME */ } if (tab) fprintf(fp,"\t%-24s: ",name); else fprintf(fp,"%s=",name); switch (desc[i].type) { case STRING: fprintf(fp,"\"%-.*s\"",desc[i].length,ptr); ptr += desc[i].length; break; case PTR: p = *(void**)ptr; fprintf(fp,"%p",p); ptr += sizeof(p); break; case VER: u32 = *((uint32_t*)ptr); fprintf(fp,"%d.%d.%d", (u32 >> 16) & 0xff, (u32 >> 8) & 0xff, u32 & 0xff); ptr += 4; break; case FOURCC: u32 = *((uint32_t*)ptr); fprintf(fp,"0x%08x [%c%c%c%c]", u32, isprint(ptr[0]) ? ptr[0] : '.', isprint(ptr[1]) ? ptr[1] : '.', isprint(ptr[2]) ? ptr[2] : '.', isprint(ptr[3]) ? ptr[3] : '.'); ptr += 4; break; case ENUM16: u16 = *((uint16_t*)ptr); fprintf(fp,"%s", (u16 < desc[i].length && desc[i].enums[u16]) ? desc[i].enums[u16] : "unknown"); ptr += 2; break; case ENUM32: u32 = *((uint32_t*)ptr); fprintf(fp,"%s", (u32 < desc[i].length && desc[i].enums[u32]) ? desc[i].enums[u32] : "unknown"); ptr += 4; break; case BITS16: u16 = *((uint16_t*)ptr); first = 1; fprintf(fp,"0x%x [",u16); for (j = 0; j < 16; j++) { if (0 == (u16 & (1 << j))) continue; fprintf(fp,"%s%s", first ? "" : ",", desc[i].bits[j]); first = 0; } fprintf(fp,"]"); ptr += 2; break; case BITS32: u32 = *((uint32_t*)ptr); first = 1; fprintf(fp,"0x%x [",u32); for (j = 0; j < 32; j++) { if (0 == (u32 & (1 << j))) continue; fprintf(fp,"%s%s", first ? "" : ",", desc[i].bits[j]); first = 0; } fprintf(fp,"]"); ptr += 4; break; case BITS64: ptr = (void*)(((intptr_t)ptr + al) & ~al); u64 = *((uint64_t*)ptr); first = 1; fprintf(fp,"0x%" PRIx64 " [",u64); for (j = 0; j < 64; j++) { if (0 == (u64 & ((int64_t)1 << j))) continue; fprintf(fp,"%s%s", first ? "" : ",", desc[i].bits[j]); first = 0; } fprintf(fp,"]"); ptr += 8; break; case UINT64: ptr = (void*)(((intptr_t)ptr + al) & ~al); u64 = *((uint64_t*)ptr); fprintf(fp,"%" PRIu64,u64); ptr += 8; break; case SINT64: ptr = (void*)(((intptr_t)ptr + al) & ~al); s64 = *((int64_t*)ptr); fprintf(fp,"%" PRId64,s64); ptr += 8; break; case UINT32: u32 = *((uint32_t*)ptr); fprintf(fp,"%u",u32); ptr += 4; break; case SINT32: s32 = *((int32_t*)ptr); fprintf(fp,"%d",s32); ptr += 4; break; case UINT16: u16 = *((uint16_t*)ptr); fprintf(fp,"%u",u16); ptr += 2; break; case SINT16: s16 = *((int16_t*)ptr); fprintf(fp,"%d",s16); ptr += 2; break; case UINT8: u8 = *((uint8_t*)ptr); fprintf(fp,"%u",u8); ptr += 1; break; case SINT8: s8 = *((int8_t*)ptr); fprintf(fp,"%d",s8); ptr += 1; break; case PADDING: ptr += desc[i].length; break; case STRUCT: case UNION: /* shouldn't happen */ fprintf(fp,"FIXME [type=%d]\n",desc[i].type); exit(1); } if (tab) fprintf(fp,"\n"); else if (desc[i+1].name != NULL) fprintf(fp,";"); } return 0; } /* ---------------------------------------------------------------------- */ int print_ioctl(FILE *fp, struct ioctl_desc *ioctls, char *prefix, int cmd, void *ptr) { int index = _IOC_NR(cmd); char *name = ioctls[index].name; struct struct_desc *desc = ioctls[index].desc; fprintf(fp,"%s%s(", prefix, name ? name : "UNKNOWN"); if (desc) { print_struct(fp,desc,ptr,"",0); } else { fprintf(stderr,"???"); } fprintf(fp,")"); return 0; } /* ---------------------------------------------------------------------- */ /* * Local variables: * c-basic-offset: 8 * End: */ stopmotion-0.8.0/src/technical/libng/struct-dump.h000066400000000000000000000022411234321124500222020ustar00rootroot00000000000000#ifndef STRUCT_DUMP_H #define STRUCT_DUMP_H #ifdef __cplusplus extern "C" { #endif enum desc_type { UINT64, SINT64, UINT32, SINT32, UINT16, SINT16, UINT8, SINT8, FOURCC, STRING, PTR, ENUM16, ENUM32, STRUCT, UNION, BITS16, BITS32, BITS64, VER, PADDING, }; struct struct_desc { enum desc_type type; char *name; unsigned int length; char **enums; char **bits; struct struct_desc *desc; struct { unsigned int value; char *name; struct struct_desc *desc; } u[16]; }; struct ioctl_desc { char *name; struct struct_desc *desc; }; /* ---------------------------------------------------------------------- */ extern struct struct_desc desc_int[]; extern struct struct_desc desc_long[]; extern struct struct_desc desc_timeval[]; /* ---------------------------------------------------------------------- */ int print_struct(FILE *fp, struct struct_desc *desc, void *data, char *prefix, int tab); int print_ioctl(FILE *fp, struct ioctl_desc *ioctls, char *prefix, int cmd, void *ptr); #ifdef __cplusplus } #endif #endif /* STRUCT_DUMP_H */ stopmotion-0.8.0/src/technical/libng/struct-v4l.c000066400000000000000000000175751234321124500217550ustar00rootroot00000000000000#include #include #include "videodev.h" #include "struct-dump.h" #include "struct-v4l.h" /* ---------------------------------------------------------------------- */ char *bits_vid_cap[32] = { "CAPTURE", "TUNER", "TELETEXT", "OVERLAY", "CHROMAKEY", "CLIPPING", "FRAMERAM", "SCALES", "MONOCHROME", "SUBCAPTURE", "MPEG_DECODER", "MPEG_ENCODER", "MJPEG_DECODER", "MJPEG_ENCODER", }; char *bits_chan_flags[32] = { "TUNER", "AUDIO", }; char *desc_chan_type[] = { [ VIDEO_TYPE_TV ] = "TV", [ VIDEO_TYPE_CAMERA ] = "CAMERA", }; char *bits_tuner_flags[32] = { "PAL", "NTSC", "SECAM", "LOW", "NORM", "?", "?", "STEREO_ON", "RDS_ON", "MBS_ON", }; char *desc_tuner_mode[] = { [ VIDEO_MODE_PAL ] = "PAL", [ VIDEO_MODE_NTSC ] = "NTSC", [ VIDEO_MODE_SECAM ] = "SECAM", [ VIDEO_MODE_AUTO ] = "AUTO", }; char *desc_pict_palette[] = { [ VIDEO_PALETTE_GREY ] = "GREY", [ VIDEO_PALETTE_HI240 ] = "HI240", [ VIDEO_PALETTE_RGB565 ] = "RGB565", [ VIDEO_PALETTE_RGB24 ] = "RGB24", [ VIDEO_PALETTE_RGB32 ] = "RGB32", [ VIDEO_PALETTE_RGB555 ] = "RGB555", [ VIDEO_PALETTE_YUV422 ] = "YUV422", [ VIDEO_PALETTE_YUYV ] = "YUYV", [ VIDEO_PALETTE_UYVY ] = "UYVY", [ VIDEO_PALETTE_YUV420 ] = "YUV420", [ VIDEO_PALETTE_YUV411 ] = "YUV411", [ VIDEO_PALETTE_RAW ] = "RAW", [ VIDEO_PALETTE_YUV422P ] = "YUV422P", [ VIDEO_PALETTE_YUV411P ] = "YUV411P", [ VIDEO_PALETTE_YUV420P ] = "YUV420P", [ VIDEO_PALETTE_YUV410P ] = "YUV410P", }; char *bits_audio_flags[32] = { "MUTE", "MUTABLE", "VOLUME", "BASS", "TREBLE", "BALANCE", }; char *bits_audio_mode[32] = { "MONO", "STEREO", "LANG1", "LANG2", }; /* ---------------------------------------------------------------------- */ struct struct_desc desc_video_capability[] = {{ .type = STRING, .name = "name", .length = 32, },{ .type = BITS32, .name = "type", .bits = bits_vid_cap, },{ .type = SINT32, .name = "channels", },{ .type = SINT32, .name = "audios", },{ .type = SINT32, .name = "maxwidth", },{ .type = SINT32, .name = "maxheight", },{ .type = SINT32, .name = "minwidth", },{ .type = SINT32, .name = "minheight", },{ /* end of list */ }}; struct struct_desc desc_video_channel[] = {{ .type = SINT32, .name = "channel", },{ .type = STRING, .name = "name", .length = 32, },{ .type = SINT32, .name = "tuners", },{ .type = BITS32, .name = "flags", .bits = bits_chan_flags },{ .type = ENUM16, .name = "type", .enums = desc_chan_type, .length = sizeof(desc_chan_type) / sizeof(char*), },{ .type = UINT16, .name = "norm", },{ /* end of list */ }}; struct struct_desc desc_video_tuner[] = {{ .type = SINT32, .name = "tuner", },{ .type = STRING, .name = "name", .length = 32, },{ .type = UINT32, .name = "rangelow", },{ .type = UINT32, .name = "rangehigh", },{ .type = BITS32, .name = "flags", .bits = bits_tuner_flags, },{ .type = ENUM16, .name = "mode", .enums = desc_tuner_mode, .length = sizeof(desc_tuner_mode) / sizeof(char*), },{ .type = UINT16, .name = "signal", },{ /* end of list */ }}; struct struct_desc desc_video_picture[] = {{ .type = UINT16, .name = "brightness", },{ .type = UINT16, .name = "hue", },{ .type = UINT16, .name = "colour", },{ .type = UINT16, .name = "contrast", },{ .type = UINT16, .name = "whiteness", },{ .type = UINT16, .name = "depth", },{ .type = ENUM16, .name = "palette", .enums = desc_pict_palette, .length = sizeof(desc_pict_palette) / sizeof(char*), },{ /* end of list */ }}; struct struct_desc desc_video_audio[] = {{ .type = SINT32, .name = "audio", },{ .type = UINT16, .name = "volume", },{ .type = UINT16, .name = "bass", },{ .type = UINT16, .name = "treble", },{ .type = PADDING, .length = 2, },{ .type = BITS32, .name = "flags", .bits = bits_audio_flags, },{ .type = STRING, .name = "name", .length = 16, },{ .type = BITS16, .name = "mode", .bits = bits_audio_mode, },{ .type = UINT16, .name = "balance", },{ .type = UINT16, .name = "step", },{ /* end of list */ }}; struct struct_desc desc_video_window[] = {{ .type = UINT32, .name = "x", },{ .type = UINT32, .name = "y", },{ .type = UINT32, .name = "width", },{ .type = UINT32, .name = "height", },{ .type = UINT32, .name = "chromakey", },{ .type = UINT32, .name = "flags", },{ /* end of list */ }}; struct struct_desc desc_video_buffer[] = {{ .type = PTR, .name = "base", },{ .type = SINT32, .name = "height", },{ .type = SINT32, .name = "width", },{ .type = SINT32, .name = "depth", },{ .type = SINT32, .name = "bytesperline", },{ /* end of list */ }}; struct struct_desc desc_video_mmap[] = {{ .type = UINT32, .name = "frame", },{ .type = SINT32, .name = "height", },{ .type = SINT32, .name = "width", },{ .type = UINT32, .name = "format", },{ /* end of list */ }}; struct struct_desc desc_video_mbuf[] = {{ .type = SINT32, .name = "size", },{ .type = SINT32, .name = "frames", },{ .type = SINT32, .name = "offsets", /* FIXME len=32 */ },{ /* end of list */ }}; /* ---------------------------------------------------------------------- */ struct ioctl_desc ioctls_v4l1[256] = { [_IOC_NR(VIDIOCGCAP)] = { .name = "VIDIOCGCAP", .desc = desc_video_capability, }, [_IOC_NR(VIDIOCGCHAN)] = { .name = "VIDIOCGCHAN", .desc = desc_video_channel, }, [_IOC_NR(VIDIOCSCHAN)] = { .name = "VIDIOCSCHAN", .desc = desc_video_channel, }, [_IOC_NR(VIDIOCGTUNER)] = { .name = "VIDIOCGTUNER", .desc = desc_video_tuner, }, [_IOC_NR(VIDIOCSTUNER)] = { .name = "VIDIOCSTUNER", .desc = desc_video_tuner, }, [_IOC_NR(VIDIOCGPICT)] = { .name = "VIDIOCGPICT", .desc = desc_video_picture, }, [_IOC_NR(VIDIOCSPICT)] = { .name = "VIDIOCSPICT", .desc = desc_video_picture, }, [_IOC_NR(VIDIOCCAPTURE)] = { .name = "VIDIOCCAPTURE", .desc = desc_int, }, [_IOC_NR(VIDIOCGWIN)] = { .name = "VIDIOCGWIN", .desc = desc_video_window, }, [_IOC_NR(VIDIOCSWIN)] = { .name = "VIDIOCSWIN", .desc = desc_video_window, }, [_IOC_NR(VIDIOCGFBUF)] = { .name = "VIDIOCGFBUF", .desc = desc_video_buffer, }, [_IOC_NR(VIDIOCSFBUF)] = { .name = "VIDIOCSFBUF", .desc = desc_video_buffer, }, [_IOC_NR(VIDIOCKEY)] = { .name = "VIDIOCKEY", // .desc = desc_video_key, }, [_IOC_NR(VIDIOCGFREQ)] = { .name = "VIDIOCGFREQ", .desc = desc_long, }, [_IOC_NR(VIDIOCSFREQ)] = { .name = "VIDIOCSFREQ", .desc = desc_long, }, [_IOC_NR(VIDIOCGAUDIO)] = { .name = "VIDIOCGAUDIO", .desc = desc_video_audio, }, [_IOC_NR(VIDIOCSAUDIO)] = { .name = "VIDIOCSAUDIO", .desc = desc_video_audio, }, [_IOC_NR(VIDIOCSYNC)] = { .name = "VIDIOCSYNC", .desc = desc_int, }, [_IOC_NR(VIDIOCMCAPTURE)] = { .name = "VIDIOCMCAPTURE", .desc = desc_video_mmap, }, [_IOC_NR(VIDIOCGMBUF)] = { .name = "VIDIOCGMBUF", .desc = desc_video_mbuf, }, [_IOC_NR(VIDIOCGUNIT)] = { .name = "VIDIOCGUNIT", // .desc = desc_video_unit, }, [_IOC_NR(VIDIOCGCAPTURE)] = { .name = "VIDIOCGCAPTURE", // .desc = desc_video_capture, }, [_IOC_NR(VIDIOCSCAPTURE)] = { .name = "VIDIOCSCAPTURE", // .desc = desc_video_capture, }, [_IOC_NR(VIDIOCSPLAYMODE)] = { .name = "VIDIOCSPLAYMODE", // .desc = desc_video_play_mode, }, [_IOC_NR(VIDIOCSWRITEMODE)] = { .name = "VIDIOCSWRITEMODE", .desc = desc_int, }, [_IOC_NR(VIDIOCGPLAYINFO)] = { .name = "VIDIOCGPLAYINFO", // .desc = desc_video_info, }, [_IOC_NR(VIDIOCSMICROCODE)] = { .name = "VIDIOCSMICROCODE", // .desc = desc_video_code, }, [_IOC_NR(VIDIOCGVBIFMT)] = { .name = "VIDIOCGVBIFMT", // .desc = desc_vbi_format, }, [_IOC_NR(VIDIOCSVBIFMT)] = { .name = "VIDIOCSVBIFMT", // .desc = desc_vbi_format, }, }; /* ---------------------------------------------------------------------- */ /* * Local variables: * c-basic-offset: 8 * End: */ stopmotion-0.8.0/src/technical/libng/struct-v4l.h000066400000000000000000000015521234321124500217460ustar00rootroot00000000000000#ifndef STRUCT_V4L_H #define STRUCT_V4L_H #ifdef __cplusplus extern "C" { #endif extern char *bits_vid_cap[32]; extern char *bits_chan_flags[32]; extern char *desc_chan_type[]; extern char *bits_tuner_flags[32]; extern char *desc_tuner_mode[]; extern char *desc_pict_palette[]; extern char *bits_audio_flags[32]; extern char *bits_audio_mode[32]; extern struct struct_desc desc_video_capability[]; extern struct struct_desc desc_video_channel[]; extern struct struct_desc desc_video_tuner[]; extern struct struct_desc desc_video_picture[]; extern struct struct_desc desc_video_audio[]; extern struct struct_desc desc_video_window[]; extern struct struct_desc desc_video_buffer[]; extern struct struct_desc desc_video_mmap[]; extern struct struct_desc desc_video_mbuf[]; extern struct ioctl_desc ioctls_v4l1[256]; #ifdef __cplusplus } #endif #endif /* STRUCT_V4L_H */ stopmotion-0.8.0/src/technical/libng/struct-v4l2.c000066400000000000000000000474571234321124500220410ustar00rootroot00000000000000#include #include #include #include #include "videodev2.h" #include "struct-dump.h" #include "struct-v4l2.h" /* ---------------------------------------------------------------------- */ char *desc_v4l2_field[] = { [V4L2_FIELD_ANY] = "ANY", [V4L2_FIELD_NONE] = "NONE", [V4L2_FIELD_TOP] = "TOP", [V4L2_FIELD_BOTTOM] = "BOTTOM", [V4L2_FIELD_INTERLACED] = "INTERLACED", [V4L2_FIELD_SEQ_TB] = "SEQ_TB", [V4L2_FIELD_SEQ_BT] = "SEQ_BT", [V4L2_FIELD_ALTERNATE] = "ALTERNATE", }; char *desc_v4l2_buf_type[] = { [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "VIDEO_CAPTURE", [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "VIDEO_OUTPUT", [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "VIDEO_OVERLAY", [V4L2_BUF_TYPE_VBI_CAPTURE] = "VBI_CAPTURE", [V4L2_BUF_TYPE_VBI_OUTPUT] = "VBI_OUTPUT", [V4L2_BUF_TYPE_PRIVATE] = "PRIVATE", }; char *desc_v4l2_ctrl_type[] = { [V4L2_CTRL_TYPE_INTEGER] = "INTEGER", [V4L2_CTRL_TYPE_BOOLEAN] = "BOOLEAN", [V4L2_CTRL_TYPE_MENU] = "MENU", [V4L2_CTRL_TYPE_BUTTON] = "BUTTON", }; char *desc_v4l2_tuner_type[] = { [V4L2_TUNER_RADIO] = "RADIO", [V4L2_TUNER_ANALOG_TV] = "ANALOG_TV", }; char *desc_v4l2_memory[] = { [V4L2_MEMORY_MMAP] = "MMAP", [V4L2_MEMORY_USERPTR] = "USERPTR", [V4L2_MEMORY_OVERLAY] = "OVERLAY", }; char *desc_v4l2_colorspace[] = { [V4L2_COLORSPACE_SMPTE170M] = "SMPTE170M", [V4L2_COLORSPACE_SMPTE240M] = "SMPTE240M", [V4L2_COLORSPACE_REC709] = "REC709", [V4L2_COLORSPACE_BT878] = "BT878", [V4L2_COLORSPACE_470_SYSTEM_M] = "470_SYSTEM_M", [V4L2_COLORSPACE_470_SYSTEM_BG] = "470_SYSTEM_BG", [V4L2_COLORSPACE_JPEG] = "JPEG", [V4L2_COLORSPACE_SRGB] = "SRGB", }; char *bits_capabilities[32] = { "VIDEO_CAPTURE", "VIDEO_OUTPUT", "VIDEO_OVERLAY", "", "VBI_CAPTURE", "VBI_OUTPUT", "?","?", "RDS_CAPTURE", "?", "?", "?", "?", "?", "?", "?", "TUNER", "AUDIO", "?", "?", "?", "?", "?", "?", "READWRITE", "ASYNCIO", "STREAMING", "?", }; char *bits_standard[64] = { "PAL_B", "PAL_B1", "PAL_G", "PAL_H", "PAL_I", "PAL_D", "PAL_D1", "PAL_K", "PAL_M", "PAL_N", "PAL_Nc", "PAL_60", "NTSC_M", "NTSC_M_JP", "?", "?", "SECAM_B", "SECAM_D", "SECAM_G", "SECAM_H", "SECAM_K", "SECAM_K1", "SECAM_L", "?" "ATSC_8_VSB", "ATSC_16_VSB", }; char *bits_buf_flags[32] = { "MAPPED", "QUEUED", "DONE", "KEYFRAME", "PFRAME", "BFRAME", "?", "?", "TIMECODE", }; char *bits_fbuf_cap[32] = { "EXTERNOVERLAY", "CHROMAKEY", "LIST_CLIPPING", "BITMAP_CLIPPING", }; char *bits_fbuf_flags[32] = { "PRIMARY", "OVERLAY", "CHROMAKEY", }; char *desc_input_type[32] = { [ V4L2_INPUT_TYPE_TUNER ] = "TUNER", [ V4L2_INPUT_TYPE_CAMERA ] = "CAMERA", }; char *bits_input_status[32] = { "NO_POWER", "NO_SIGNAL", "NO_COLOR", "?", "?","?","?","?", "NO_H_LOCK", "COLOR_KILL", "?", "?", "?","?","?","?", "NO_SYNC", "NO_EQU", "NO_CARRIER", "?", "?","?","?","?", "MACROVISION", "NO_ACCESS", "VTR", "?", "?","?","?","?", }; char *bits_tuner_cap[32] = { "LOW", "NORM", "?", "?", "STEREO", "LANG2", "LANG1", "?", }; char *bits_tuner_rx[32] = { "MONO", "STEREO", "LANG2", "LANG1", }; char *desc_tuner2_mode[] = { [ V4L2_TUNER_MODE_MONO ] = "MONO", [ V4L2_TUNER_MODE_STEREO ] = "STEREO", [ V4L2_TUNER_MODE_LANG2 ] = "LANG2", [ V4L2_TUNER_MODE_LANG1 ] = "LANG1", }; /* ---------------------------------------------------------------------- */ struct struct_desc desc_v4l2_rect[] = {{ .type = SINT32, .name = "left", },{ .type = SINT32, .name = "top", },{ .type = SINT32, .name = "width", },{ .type = SINT32, .name = "height", },{ /* end of list */ }}; struct struct_desc desc_v4l2_fract[] = {{ .type = UINT32, .name = "numerator", },{ .type = UINT32, .name = "denominator", },{ /* end of list */ }}; struct struct_desc desc_v4l2_capability[] = {{ .type = STRING, .name = "driver", .length = 16, },{ .type = STRING, .name = "card", .length = 32, },{ .type = STRING, .name = "bus_info", .length = 32, },{ .type = VER, .name = "version", },{ .type = BITS32, .name = "capabilities", .bits = bits_capabilities, },{ /* end of list */ }}; struct struct_desc desc_v4l2_pix_format[] = {{ .type = UINT32, .name = "width", },{ .type = UINT32, .name = "height", },{ .type = FOURCC, .name = "pixelformat", },{ .type = ENUM32, .name = "field", .enums = desc_v4l2_field, .length = sizeof(desc_v4l2_field) / sizeof(char*), },{ .type = UINT32, .name = "bytesperline", },{ .type = UINT32, .name = "sizeimage", },{ .type = ENUM32, .name = "colorspace", .enums = desc_v4l2_colorspace, .length = sizeof(desc_v4l2_colorspace) / sizeof(char*), },{ .type = UINT32, .name = "priv", },{ /* end of list */ }}; struct struct_desc desc_v4l2_fmtdesc[] = {{ .type = UINT32, .name = "index", },{ .type = ENUM32, .name = "type", .enums = desc_v4l2_buf_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ .type = UINT32, .name = "flags", },{ .type = STRING, .name = "description", .length = 32, },{ .type = FOURCC, .name = "pixelformat", },{ /* end of list */ }}; struct struct_desc desc_v4l2_timecode[] = {{ .type = UINT32, .name = "type", },{ .type = UINT32, .name = "flags", },{ .type = UINT8, .name = "frames", },{ .type = UINT8, .name = "seconds", },{ .type = UINT8, .name = "minutes", },{ .type = UINT8, .name = "hours", },{ .type = STRING, .name = "userbits", .length = 4, },{ /* end of list */ }}; struct struct_desc desc_v4l2_compression[] = {{ .type = UINT32, .name = "quality", },{ .type = UINT32, .name = "keyframerate", },{ .type = UINT32, .name = "pframerate", },{ /* end of list */ }}; struct struct_desc desc_v4l2_jpegcompression[] = {{ .type = SINT32, .name = "quality", },{ .type = SINT32, .name = "APPn", },{ .type = SINT32, .name = "APP_len", },{ .type = STRING, .name = "APP_data", .length = 60, },{ .type = SINT32, .name = "COM_len", },{ .type = STRING, .name = "COM_data", .length = 60, },{ .type = UINT32, .name = "jpeg_markers", },{ /* end of list */ }}; struct struct_desc desc_v4l2_requestbuffers[] = {{ .type = UINT32, .name = "count", },{ .type = ENUM32, .name = "type", .enums = desc_v4l2_buf_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ .type = ENUM32, .name = "memory", .enums = desc_v4l2_memory, .length = sizeof(desc_v4l2_memory) / sizeof(char*), },{ /* end of list */ }}; struct struct_desc desc_v4l2_buffer[] = {{ .type = UINT32, .name = "index", },{ .type = ENUM32, .name = "type", .enums = desc_v4l2_buf_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ .type = UINT32, .name = "bytesused", },{ .type = BITS32, .name = "flags", .bits = bits_buf_flags, },{ .type = ENUM32, .name = "field", .enums = desc_v4l2_field, .length = sizeof(desc_v4l2_field) / sizeof(char*), },{ .type = STRUCT, .name = "timestamp", .desc = desc_timeval, .length = sizeof(struct timeval), },{ .type = STRUCT, .name = "timecode", .desc = desc_v4l2_timecode, .length = sizeof(struct v4l2_timecode), },{ .type = UINT32, .name = "sequence", },{ .type = ENUM32, .name = "memory", .enums = desc_v4l2_memory, .length = sizeof(desc_v4l2_memory) / sizeof(char*), },{ /* FIXME ... */ /* end of list */ }}; struct struct_desc desc_v4l2_framebuffer[] = {{ .type = BITS32, .name = "capability", .bits = bits_fbuf_cap, },{ .type = BITS32, .name = "flags", .bits = bits_fbuf_flags, },{ .type = PTR, .name = "base", },{ .type = STRUCT, .name = "fmt", .desc = desc_v4l2_pix_format, .length = sizeof(struct v4l2_pix_format), },{ /* end of list */ }}; struct struct_desc desc_v4l2_clip[] = {{ .type = STRUCT, .name = "c", .desc = desc_v4l2_rect, .length = sizeof(struct v4l2_rect), },{ /* end of list */ }}; struct struct_desc desc_v4l2_window[] = {{ .type = STRUCT, .name = "w", .desc = desc_v4l2_rect, .length = sizeof(struct v4l2_rect), },{ .type = ENUM32, .name = "field", .enums = desc_v4l2_field, .length = sizeof(desc_v4l2_field) / sizeof(char*), },{ .type = UINT32, .name = "chromakey", },{ .type = PTR, .name = "clips", },{ .type = UINT32, .name = "clipcount", },{ .type = PTR, .name = "bitmap", },{ /* end of list */ }}; struct struct_desc desc_v4l2_captureparm[] = {{ .type = UINT32, .name = "capability", },{ .type = UINT32, .name = "capturemode", },{ .type = STRUCT, .name = "timeperframe", .desc = desc_v4l2_fract, .length = sizeof(struct v4l2_fract), },{ .type = UINT32, .name = "extendedmode", },{ .type = UINT32, .name = "readbuffers", },{ /* end of list */ }}; struct struct_desc desc_v4l2_outputparm[] = {{ .type = UINT32, .name = "capability", },{ .type = UINT32, .name = "outputmode", },{ .type = STRUCT, .name = "timeperframe", .desc = desc_v4l2_fract, .length = sizeof(struct v4l2_fract), },{ .type = UINT32, .name = "extendedmode", },{ .type = UINT32, .name = "writebuffers", },{ /* end of list */ }}; struct struct_desc desc_v4l2_cropcap[] = {{ .type = ENUM32, .name = "type", .enums = desc_v4l2_buf_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ .type = STRUCT, .name = "bounds", .desc = desc_v4l2_rect, .length = sizeof(struct v4l2_rect), },{ .type = STRUCT, .name = "defrect", .desc = desc_v4l2_rect, .length = sizeof(struct v4l2_rect), },{ .type = STRUCT, .name = "pixelaspect", .desc = desc_v4l2_fract, .length = sizeof(struct v4l2_fract), },{ /* end of list */ }}; struct struct_desc desc_v4l2_crop[] = {{ .type = ENUM32, .name = "type", .enums = desc_v4l2_buf_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ .type = STRUCT, .name = "c", .desc = desc_v4l2_rect, .length = sizeof(struct v4l2_rect), },{ /* end of list */ }}; struct struct_desc desc_v4l2_standard[] = {{ .type = UINT32, .name = "index", },{ .type = BITS64, .name = "id", .bits = bits_standard, },{ .type = STRING, .name = "name", .length = 24, },{ .type = STRUCT, .name = "frameperiod", .desc = desc_v4l2_fract, .length = sizeof(struct v4l2_fract), },{ .type = UINT32, .name = "framelines", },{ /* end of list */ }}; struct struct_desc desc_v4l2_input[] = {{ .type = UINT32, .name = "index", },{ .type = STRING, .name = "name", .length = 32, },{ .type = ENUM32, .name = "type", .enums = desc_input_type, .length = sizeof(desc_input_type) / sizeof(char*), },{ .type = UINT32, .name = "audioset", },{ .type = UINT32, .name = "tuner", },{ .type = BITS64, .name = "std", .bits = bits_standard },{ .type = BITS32, .name = "status", .bits = bits_input_status, },{ /* end of list */ }}; struct struct_desc desc_v4l2_output[] = {{ .type = UINT32, .name = "index", },{ .type = STRING, .name = "name", .length = 32, },{ .type = UINT32, .name = "type", },{ .type = UINT32, .name = "audioset", },{ .type = UINT32, .name = "modulator", },{ .type = BITS64, .name = "std", .bits = bits_standard },{ /* end of list */ }}; struct struct_desc desc_v4l2_control[] = {{ .type = UINT32, .name = "id", },{ .type = SINT32, .name = "value", },{ /* end of list */ }}; struct struct_desc desc_v4l2_queryctrl[] = {{ .type = UINT32, .name = "id", },{ .type = ENUM32, .name = "type", .enums = desc_v4l2_ctrl_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ .type = STRING, .name = "name", .length = 32, },{ .type = SINT32, .name = "minimum", },{ .type = SINT32, .name = "maximum", },{ .type = SINT32, .name = "step", },{ .type = SINT32, .name = "default_value", },{ .type = UINT32, .name = "flags", },{ /* end of list */ }}; struct struct_desc desc_v4l2_querymenu[] = {{ .type = UINT32, .name = "id", },{ .type = UINT32, .name = "index", },{ .type = STRING, .name = "name", .length = 32, },{ .type = UINT32, .name = "reserved", },{ /* end of list */ }}; struct struct_desc desc_v4l2_tuner[] = {{ .type = UINT32, .name = "index", },{ .type = STRING, .name = "name", .length = 32, },{ .type = ENUM32, .name = "type", .enums = desc_v4l2_tuner_type, .length = sizeof(desc_v4l2_tuner_type) / sizeof(char*), },{ .type = BITS32, .name = "capability", .bits = bits_tuner_cap, },{ .type = UINT32, .name = "rangelow", },{ .type = UINT32, .name = "rangehigh", },{ .type = BITS32, .name = "rxsubchans", .bits = bits_tuner_rx, },{ .type = ENUM32, .name = "audmode", .enums = desc_tuner2_mode, .length = sizeof(desc_tuner2_mode) / sizeof(char*), },{ .type = SINT32, .name = "signal", },{ .type = SINT32, .name = "afc", },{ /* end of list */ }}; struct struct_desc desc_v4l2_modulator[] = {{ .type = UINT32, .name = "index", },{ .type = STRING, .name = "name", .length = 32, },{ .type = UINT32, .name = "capability", },{ .type = UINT32, .name = "rangelow", },{ .type = UINT32, .name = "rangehigh", },{ .type = UINT32, .name = "txsubchans", },{ /* end of list */ }}; struct struct_desc desc_v4l2_frequency[] = {{ .type = UINT32, .name = "tuner", },{ .type = ENUM32, .name = "type", .enums = desc_v4l2_tuner_type, .length = sizeof(desc_v4l2_tuner_type) / sizeof(char*), },{ .type = UINT32, .name = "frequency", },{ /* end of list */ }}; struct struct_desc desc_v4l2_audio[] = {{ .type = UINT32, .name = "index", },{ .type = STRING, .name = "name", .length = 32, },{ .type = UINT32, .name = "capability", },{ .type = UINT32, .name = "mode", },{ /* end of list */ }}; struct struct_desc desc_v4l2_audioout[] = {{ .type = UINT32, .name = "index", },{ .type = STRING, .name = "name", .length = 32, },{ .type = UINT32, .name = "capability", },{ .type = UINT32, .name = "mode", },{ /* end of list */ }}; struct struct_desc desc_v4l2_vbi_format[] = {{ .type = UINT32, .name = "sampling_rate", },{ .type = UINT32, .name = "offset", },{ .type = UINT32, .name = "samples_per_line", },{ .type = FOURCC, .name = "sample_format", },{ .type = UINT32, .name = "start[0]", },{ .type = UINT32, .name = "start[1]", },{ .type = UINT32, .name = "count[0]", },{ .type = UINT32, .name = "count[1]", },{ .type = UINT32, .name = "flags", },{ /* end of list */ }}; struct struct_desc desc_v4l2_format[] = {{ .type = ENUM32, .name = "type", .enums = desc_v4l2_buf_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ .type = UNION, .name = "fmt", .u = {{ .value = V4L2_BUF_TYPE_VIDEO_CAPTURE, .name = "pix", .desc = desc_v4l2_pix_format, },{ .value = V4L2_BUF_TYPE_VIDEO_OVERLAY, .name = "win", .desc = desc_v4l2_window, },{ .value = V4L2_BUF_TYPE_VBI_CAPTURE, .name = "vbi", .desc = desc_v4l2_vbi_format, },{ /* end of list */ }}, },{ /* end of list */ }}; struct struct_desc desc_v4l2_streamparm[] = {{ .type = ENUM32, .name = "type", .enums = desc_v4l2_buf_type, .length = sizeof(desc_v4l2_buf_type) / sizeof(char*), },{ /* FIXME ... */ /* end of list */ }}; struct struct_desc desc_v4l2_std_id[] = {{ .type = BITS64, .name = "std", .bits = bits_standard, },{ /* end of list */ }}; /* ---------------------------------------------------------------------- */ struct ioctl_desc ioctls_v4l2[256] = { [_IOC_NR(VIDIOC_QUERYCAP)] = { .name = "VIDIOC_QUERYCAP", .desc = desc_v4l2_capability, }, [_IOC_NR(VIDIOC_ENUM_FMT)] = { .name = "VIDIOC_ENUM_FMT", .desc = desc_v4l2_fmtdesc, }, [_IOC_NR(VIDIOC_G_FMT)] = { .name = "VIDIOC_G_FMT", .desc = desc_v4l2_format, }, [_IOC_NR(VIDIOC_S_FMT)] = { .name = "VIDIOC_S_FMT", .desc = desc_v4l2_format, }, #if 0 [_IOC_NR(VIDIOC_G_COMP)] = { .name = "VIDIOC_G_COMP", .desc = desc_v4l2_compression, }, [_IOC_NR(VIDIOC_S_COMP)] = { .name = "VIDIOC_S_COMP", .desc = desc_v4l2_compression, }, #endif [_IOC_NR(VIDIOC_REQBUFS)] = { .name = "VIDIOC_REQBUFS", .desc = desc_v4l2_requestbuffers, }, [_IOC_NR(VIDIOC_QUERYBUF)] = { .name = "VIDIOC_QUERYBUF", .desc = desc_v4l2_buffer, }, [_IOC_NR(VIDIOC_G_FBUF)] = { .name = "VIDIOC_G_FBUF", .desc = desc_v4l2_framebuffer, }, [_IOC_NR(VIDIOC_S_FBUF)] = { .name = "VIDIOC_S_FBUF", .desc = desc_v4l2_framebuffer, }, [_IOC_NR(VIDIOC_OVERLAY)] = { .name = "VIDIOC_OVERLAY", .desc = desc_int, }, [_IOC_NR(VIDIOC_QBUF)] = { .name = "VIDIOC_QBUF", .desc = desc_v4l2_buffer, }, [_IOC_NR(VIDIOC_DQBUF)] = { .name = "VIDIOC_DQBUF", .desc = desc_v4l2_buffer, }, [_IOC_NR(VIDIOC_STREAMON)] = { .name = "VIDIOC_STREAMON", .desc = desc_int, }, [_IOC_NR(VIDIOC_STREAMOFF)] = { .name = "VIDIOC_STREAMOFF", .desc = desc_int, }, [_IOC_NR(VIDIOC_G_PARM)] = { .name = "VIDIOC_G_PARM", .desc = desc_v4l2_streamparm, }, [_IOC_NR(VIDIOC_S_PARM)] = { .name = "VIDIOC_S_PARM", .desc = desc_v4l2_streamparm, }, [_IOC_NR(VIDIOC_G_STD)] = { .name = "VIDIOC_G_STD", .desc = desc_v4l2_std_id, }, [_IOC_NR(VIDIOC_S_STD)] = { .name = "VIDIOC_S_STD", .desc = desc_v4l2_std_id, }, [_IOC_NR(VIDIOC_ENUMSTD)] = { .name = "VIDIOC_ENUMSTD", .desc = desc_v4l2_standard, }, [_IOC_NR(VIDIOC_ENUMINPUT)] = { .name = "VIDIOC_ENUMINPUT", .desc = desc_v4l2_input, }, [_IOC_NR(VIDIOC_G_CTRL)] = { .name = "VIDIOC_G_CTRL", .desc = desc_v4l2_control, }, [_IOC_NR(VIDIOC_S_CTRL)] = { .name = "VIDIOC_S_CTRL", .desc = desc_v4l2_control, }, [_IOC_NR(VIDIOC_G_TUNER)] = { .name = "VIDIOC_G_TUNER", .desc = desc_v4l2_tuner, }, [_IOC_NR(VIDIOC_S_TUNER)] = { .name = "VIDIOC_S_TUNER", .desc = desc_v4l2_tuner, }, [_IOC_NR(VIDIOC_G_AUDIO)] = { .name = "VIDIOC_G_AUDIO", .desc = desc_v4l2_audio, }, [_IOC_NR(VIDIOC_S_AUDIO)] = { .name = "VIDIOC_S_AUDIO", .desc = desc_v4l2_audio, }, [_IOC_NR(VIDIOC_QUERYCTRL)] = { .name = "VIDIOC_QUERYCTRL", .desc = desc_v4l2_queryctrl, }, [_IOC_NR(VIDIOC_QUERYMENU)] = { .name = "VIDIOC_QUERYMENU", .desc = desc_v4l2_querymenu, }, [_IOC_NR(VIDIOC_G_INPUT)] = { .name = "VIDIOC_G_INPUT", .desc = desc_int, }, [_IOC_NR(VIDIOC_S_INPUT)] = { .name = "VIDIOC_S_INPUT", .desc = desc_int, }, [_IOC_NR(VIDIOC_G_OUTPUT)] = { .name = "VIDIOC_G_OUTPUT", .desc = desc_int, }, [_IOC_NR(VIDIOC_S_OUTPUT)] = { .name = "VIDIOC_S_OUTPUT", .desc = desc_int, }, [_IOC_NR(VIDIOC_ENUMOUTPUT)] = { .name = "VIDIOC_ENUMOUTPUT", .desc = desc_v4l2_output, }, [_IOC_NR(VIDIOC_G_AUDOUT)] = { .name = "VIDIOC_G_AUDOUT", .desc = desc_v4l2_audioout, }, [_IOC_NR(VIDIOC_S_AUDOUT)] = { .name = "VIDIOC_S_AUDOUT", .desc = desc_v4l2_audioout, }, [_IOC_NR(VIDIOC_G_MODULATOR)] = { .name = "VIDIOC_G_MODULATOR", .desc = desc_v4l2_modulator, }, [_IOC_NR(VIDIOC_S_MODULATOR)] = { .name = "VIDIOC_S_MODULATOR", .desc = desc_v4l2_modulator, }, [_IOC_NR(VIDIOC_G_FREQUENCY)] = { .name = "VIDIOC_G_FREQUENCY", .desc = desc_v4l2_frequency, }, [_IOC_NR(VIDIOC_S_FREQUENCY)] = { .name = "VIDIOC_S_FREQUENCY", .desc = desc_v4l2_frequency, }, [_IOC_NR(VIDIOC_CROPCAP)] = { .name = "VIDIOC_CROPCAP", .desc = desc_v4l2_cropcap, }, [_IOC_NR(VIDIOC_G_CROP)] = { .name = "VIDIOC_G_CROP", .desc = desc_v4l2_crop, }, [_IOC_NR(VIDIOC_S_CROP)] = { .name = "VIDIOC_S_CROP", .desc = desc_v4l2_crop, }, [_IOC_NR(VIDIOC_G_JPEGCOMP)] = { .name = "VIDIOC_G_JPEGCOMP", .desc = desc_v4l2_jpegcompression, }, [_IOC_NR(VIDIOC_S_JPEGCOMP)] = { .name = "VIDIOC_S_JPEGCOMP", .desc = desc_v4l2_jpegcompression, }, [_IOC_NR(VIDIOC_QUERYSTD)] = { .name = "VIDIOC_QUERYSTD", .desc = desc_v4l2_std_id, }, [_IOC_NR(VIDIOC_TRY_FMT)] = { .name = "VIDIOC_TRY_FMT", .desc = desc_v4l2_format, }, }; /* ---------------------------------------------------------------------- */ /* * Local variables: * c-basic-offset: 8 * End: */ stopmotion-0.8.0/src/technical/libng/struct-v4l2.h000066400000000000000000000042571234321124500220350ustar00rootroot00000000000000#ifndef STRUCT_V4L2_H #define STRUCT_V4L2_H #ifdef __cplusplus extern "C" { #endif extern char *desc_v4l2_field[]; extern char *desc_v4l2_buf_type[]; extern char *desc_v4l2_ctrl_type[]; extern char *desc_v4l2_tuner_type[]; extern char *desc_v4l2_memory[]; extern char *desc_v4l2_colorspace[]; extern char *bits_capabilities[32]; extern char *bits_standard[64]; extern char *bits_buf_flags[32]; extern char *bits_fbuf_cap[32]; extern char *bits_fbuf_flags[32]; extern char *desc_input_type[32]; extern char *bits_input_status[32]; extern char *bits_tuner_cap[32]; extern char *bits_tuner_rx[32]; extern char *desc_tuner2_mode[]; extern struct struct_desc desc_v4l2_rect[]; extern struct struct_desc desc_v4l2_fract[]; extern struct struct_desc desc_v4l2_capability[]; extern struct struct_desc desc_v4l2_pix_format[]; extern struct struct_desc desc_v4l2_fmtdesc[]; extern struct struct_desc desc_v4l2_timecode[]; extern struct struct_desc desc_v4l2_compression[]; extern struct struct_desc desc_v4l2_jpegcompression[]; extern struct struct_desc desc_v4l2_requestbuffers[]; extern struct struct_desc desc_v4l2_buffer[]; extern struct struct_desc desc_v4l2_framebuffer[]; extern struct struct_desc desc_v4l2_clip[]; extern struct struct_desc desc_v4l2_window[]; extern struct struct_desc desc_v4l2_captureparm[]; extern struct struct_desc desc_v4l2_outputparm[]; extern struct struct_desc desc_v4l2_cropcap[]; extern struct struct_desc desc_v4l2_crop[]; extern struct struct_desc desc_v4l2_standard[]; extern struct struct_desc desc_v4l2_input[]; extern struct struct_desc desc_v4l2_output[]; extern struct struct_desc desc_v4l2_control[]; extern struct struct_desc desc_v4l2_queryctrl[]; extern struct struct_desc desc_v4l2_querymenu[]; extern struct struct_desc desc_v4l2_tuner[]; extern struct struct_desc desc_v4l2_modulator[]; extern struct struct_desc desc_v4l2_frequency[]; extern struct struct_desc desc_v4l2_audio[]; extern struct struct_desc desc_v4l2_audioout[]; extern struct struct_desc desc_v4l2_vbi_format[]; extern struct struct_desc desc_v4l2_format[]; extern struct struct_desc desc_v4l2_streamparm[]; extern struct ioctl_desc ioctls_v4l2[256]; #ifdef __cplusplus } #endif #endif /* STRUCT_V4L2_H */ stopmotion-0.8.0/src/technical/libng/videodev.h000066400000000000000000000271621234321124500215310ustar00rootroot00000000000000#ifndef __LINUX_VIDEODEV_H #define __LINUX_VIDEODEV_H #include #ifdef __cplusplus extern "C" { #endif #define VID_TYPE_CAPTURE 1 /* Can capture */ #define VID_TYPE_TUNER 2 /* Can tune */ #define VID_TYPE_TELETEXT 4 /* Does teletext */ #define VID_TYPE_OVERLAY 8 /* Overlay onto frame buffer */ #define VID_TYPE_CHROMAKEY 16 /* Overlay by chromakey */ #define VID_TYPE_CLIPPING 32 /* Can clip */ #define VID_TYPE_FRAMERAM 64 /* Uses the frame buffer memory */ #define VID_TYPE_SCALES 128 /* Scalable */ #define VID_TYPE_MONOCHROME 256 /* Monochrome only */ #define VID_TYPE_SUBCAPTURE 512 /* Can capture subareas of the image */ #define VID_TYPE_MPEG_DECODER 1024 /* Can decode MPEG streams */ #define VID_TYPE_MPEG_ENCODER 2048 /* Can encode MPEG streams */ #define VID_TYPE_MJPEG_DECODER 4096 /* Can decode MJPEG streams */ #define VID_TYPE_MJPEG_ENCODER 8192 /* Can encode MJPEG streams */ struct video_capability { char name[32]; unsigned int type; unsigned int channels; /* Num channels */ unsigned int audios; /* Num audio devices */ unsigned int maxwidth; /* Supported width */ unsigned int maxheight; /* And height */ unsigned int minwidth; /* Supported width */ unsigned int minheight; /* And height */ }; struct video_channel { int channel; char name[32]; int tuners; __u32 flags; #define VIDEO_VC_TUNER 1 /* Channel has a tuner */ #define VIDEO_VC_AUDIO 2 /* Channel has audio */ __u16 type; #define VIDEO_TYPE_TV 1 #define VIDEO_TYPE_CAMERA 2 __u16 norm; /* Norm set by channel */ }; struct video_tuner { int tuner; char name[32]; unsigned long rangelow, rangehigh; /* Tuner range */ __u32 flags; #define VIDEO_TUNER_PAL 1 #define VIDEO_TUNER_NTSC 2 #define VIDEO_TUNER_SECAM 4 #define VIDEO_TUNER_LOW 8 /* Uses KHz not MHz */ #define VIDEO_TUNER_NORM 16 /* Tuner can set norm */ #define VIDEO_TUNER_STEREO_ON 128 /* Tuner is seeing stereo */ #define VIDEO_TUNER_RDS_ON 256 /* Tuner is seeing an RDS datastream */ #define VIDEO_TUNER_MBS_ON 512 /* Tuner is seeing an MBS datastream */ __u16 mode; /* PAL/NTSC/SECAM/OTHER */ #define VIDEO_MODE_PAL 0 #define VIDEO_MODE_NTSC 1 #define VIDEO_MODE_SECAM 2 #define VIDEO_MODE_AUTO 3 __u16 signal; /* Signal strength 16bit scale */ }; struct video_picture { __u16 brightness; __u16 hue; __u16 colour; __u16 contrast; __u16 whiteness; /* Black and white only */ __u16 depth; /* Capture depth */ __u16 palette; /* Palette in use */ #define VIDEO_PALETTE_GREY 1 /* Linear greyscale */ #define VIDEO_PALETTE_HI240 2 /* High 240 cube (BT848) */ #define VIDEO_PALETTE_RGB565 3 /* 565 16 bit RGB */ #define VIDEO_PALETTE_RGB24 4 /* 24bit RGB */ #define VIDEO_PALETTE_RGB32 5 /* 32bit RGB */ #define VIDEO_PALETTE_RGB555 6 /* 555 15bit RGB */ #define VIDEO_PALETTE_YUV422 7 /* YUV422 capture */ #define VIDEO_PALETTE_YUYV 8 #define VIDEO_PALETTE_UYVY 9 /* The great thing about standards is ... */ #define VIDEO_PALETTE_YUV420 10 #define VIDEO_PALETTE_YUV411 11 /* YUV411 capture */ #define VIDEO_PALETTE_RAW 12 /* RAW capture (BT848) */ #define VIDEO_PALETTE_YUV422P 13 /* YUV 4:2:2 Planar */ #define VIDEO_PALETTE_YUV411P 14 /* YUV 4:1:1 Planar */ #define VIDEO_PALETTE_YUV420P 15 /* YUV 4:2:0 Planar */ #define VIDEO_PALETTE_YUV410P 16 /* YUV 4:1:0 Planar */ #define VIDEO_PALETTE_PLANAR 13 /* start of planar entries */ #define VIDEO_PALETTE_COMPONENT 7 /* start of component entries */ }; struct video_audio { int audio; /* Audio channel */ __u16 volume; /* If settable */ __u16 bass, treble; __u32 flags; #define VIDEO_AUDIO_MUTE 1 #define VIDEO_AUDIO_MUTABLE 2 #define VIDEO_AUDIO_VOLUME 4 #define VIDEO_AUDIO_BASS 8 #define VIDEO_AUDIO_TREBLE 16 #define VIDEO_AUDIO_BALANCE 32 char name[16]; #define VIDEO_SOUND_MONO 1 #define VIDEO_SOUND_STEREO 2 #define VIDEO_SOUND_LANG1 4 #define VIDEO_SOUND_LANG2 8 __u16 mode; __u16 balance; /* Stereo balance */ __u16 step; /* Step actual volume uses */ }; struct video_clip { __s32 x,y; __s32 width, height; struct video_clip *next; /* For user use/driver use only */ }; struct video_window { __u32 x,y; /* Position of window */ __u32 width,height; /* Its size */ __u32 chromakey; __u32 flags; struct video_clip *clips; /* Set only */ int clipcount; #define VIDEO_WINDOW_INTERLACE 1 #define VIDEO_WINDOW_CHROMAKEY 16 /* Overlay by chromakey */ #define VIDEO_CLIP_BITMAP -1 /* bitmap is 1024x625, a '1' bit represents a clipped pixel */ #define VIDEO_CLIPMAP_SIZE (128 * 625) }; struct video_capture { __u32 x,y; /* Offsets into image */ __u32 width, height; /* Area to capture */ __u16 decimation; /* Decimation divider */ __u16 flags; /* Flags for capture */ #define VIDEO_CAPTURE_ODD 0 /* Temporal */ #define VIDEO_CAPTURE_EVEN 1 }; struct video_buffer { void *base; unsigned int height,width; unsigned int depth; unsigned int bytesperline; }; struct video_mmap { unsigned int frame; /* Frame (0 - n) for double buffer */ int height,width; unsigned int format; /* should be VIDEO_PALETTE_* */ }; struct video_key { __u8 key[8]; __u32 flags; }; #define VIDEO_MAX_FRAME 32 struct video_mbuf { int size; /* Total memory to map */ int frames; /* Frames */ int offsets[VIDEO_MAX_FRAME]; }; #define VIDEO_NO_UNIT (-1) struct video_unit { int video; /* Video minor */ int vbi; /* VBI minor */ int radio; /* Radio minor */ int audio; /* Audio minor */ int teletext; /* Teletext minor */ }; struct vbi_format { __u32 sampling_rate; /* in Hz */ __u32 samples_per_line; __u32 sample_format; /* VIDEO_PALETTE_RAW only (1 byte) */ __s32 start[2]; /* starting line for each frame */ __u32 count[2]; /* count of lines for each frame */ __u32 flags; #define VBI_UNSYNC 1 /* can distingues between top/bottom field */ #define VBI_INTERLACED 2 /* lines are interlaced */ }; /* video_info is biased towards hardware mpeg encode/decode */ /* but it could apply generically to any hardware compressor/decompressor */ struct video_info { __u32 frame_count; /* frames output since decode/encode began */ __u32 h_size; /* current unscaled horizontal size */ __u32 v_size; /* current unscaled veritcal size */ __u32 smpte_timecode; /* current SMPTE timecode (for current GOP) */ __u32 picture_type; /* current picture type */ __u32 temporal_reference; /* current temporal reference */ __u8 user_data[256]; /* user data last found in compressed stream */ /* user_data[0] contains user data flags, user_data[1] has count */ }; /* generic structure for setting playback modes */ struct video_play_mode { int mode; int p1; int p2; }; /* for loading microcode / fpga programming */ struct video_code { char loadwhat[16]; /* name or tag of file being passed */ int datasize; __u8 *data; }; #define VIDIOCGCAP _IOR('v',1,struct video_capability) /* Get capabilities */ #define VIDIOCGCHAN _IOWR('v',2,struct video_channel) /* Get channel info (sources) */ #define VIDIOCSCHAN _IOW('v',3,struct video_channel) /* Set channel */ #define VIDIOCGTUNER _IOWR('v',4,struct video_tuner) /* Get tuner abilities */ #define VIDIOCSTUNER _IOW('v',5,struct video_tuner) /* Tune the tuner for the current channel */ #define VIDIOCGPICT _IOR('v',6,struct video_picture) /* Get picture properties */ #define VIDIOCSPICT _IOW('v',7,struct video_picture) /* Set picture properties */ #define VIDIOCCAPTURE _IOW('v',8,int) /* Start, end capture */ #define VIDIOCGWIN _IOR('v',9, struct video_window) /* Get the video overlay window */ #define VIDIOCSWIN _IOW('v',10, struct video_window) /* Set the video overlay window - passes clip list for hardware smarts , chromakey etc */ #define VIDIOCGFBUF _IOR('v',11, struct video_buffer) /* Get frame buffer */ #define VIDIOCSFBUF _IOW('v',12, struct video_buffer) /* Set frame buffer - root only */ #define VIDIOCKEY _IOR('v',13, struct video_key) /* Video key event - to dev 255 is to all - cuts capture on all DMA windows with this key (0xFFFFFFFF == all) */ #define VIDIOCGFREQ _IOR('v',14, unsigned long) /* Set tuner */ #define VIDIOCSFREQ _IOW('v',15, unsigned long) /* Set tuner */ #define VIDIOCGAUDIO _IOR('v',16, struct video_audio) /* Get audio info */ #define VIDIOCSAUDIO _IOW('v',17, struct video_audio) /* Audio source, mute etc */ #define VIDIOCSYNC _IOW('v',18, int) /* Sync with mmap grabbing */ #define VIDIOCMCAPTURE _IOW('v',19, struct video_mmap) /* Grab frames */ #define VIDIOCGMBUF _IOR('v',20, struct video_mbuf) /* Memory map buffer info */ #define VIDIOCGUNIT _IOR('v',21, struct video_unit) /* Get attached units */ #define VIDIOCGCAPTURE _IOR('v',22, struct video_capture) /* Get subcapture */ #define VIDIOCSCAPTURE _IOW('v',23, struct video_capture) /* Set subcapture */ #define VIDIOCSPLAYMODE _IOW('v',24, struct video_play_mode) /* Set output video mode/feature */ #define VIDIOCSWRITEMODE _IOW('v',25, int) /* Set write mode */ #define VIDIOCGPLAYINFO _IOR('v',26, struct video_info) /* Get current playback info from hardware */ #define VIDIOCSMICROCODE _IOW('v',27, struct video_code) /* Load microcode into hardware */ #define VIDIOCGVBIFMT _IOR('v',28, struct vbi_format) /* Get VBI information */ #define VIDIOCSVBIFMT _IOW('v',29, struct vbi_format) /* Set VBI information */ #define BASE_VIDIOCPRIVATE 192 /* 192-255 are private */ /* VIDIOCSWRITEMODE */ #define VID_WRITE_MPEG_AUD 0 #define VID_WRITE_MPEG_VID 1 #define VID_WRITE_OSD 2 #define VID_WRITE_TTX 3 #define VID_WRITE_CC 4 #define VID_WRITE_MJPEG 5 /* VIDIOCSPLAYMODE */ #define VID_PLAY_VID_OUT_MODE 0 /* p1: = VIDEO_MODE_PAL, VIDEO_MODE_NTSC, etc ... */ #define VID_PLAY_GENLOCK 1 /* p1: 0 = OFF, 1 = ON */ /* p2: GENLOCK FINE DELAY value */ #define VID_PLAY_NORMAL 2 #define VID_PLAY_PAUSE 3 #define VID_PLAY_SINGLE_FRAME 4 #define VID_PLAY_FAST_FORWARD 5 #define VID_PLAY_SLOW_MOTION 6 #define VID_PLAY_IMMEDIATE_NORMAL 7 #define VID_PLAY_SWITCH_CHANNELS 8 #define VID_PLAY_FREEZE_FRAME 9 #define VID_PLAY_STILL_MODE 10 #define VID_PLAY_MASTER_MODE 11 /* p1: see below */ #define VID_PLAY_MASTER_NONE 1 #define VID_PLAY_MASTER_VIDEO 2 #define VID_PLAY_MASTER_AUDIO 3 #define VID_PLAY_ACTIVE_SCANLINES 12 /* p1 = first active; p2 = last active */ #define VID_PLAY_RESET 13 #define VID_PLAY_END_MARK 14 #define VID_HARDWARE_BT848 1 #define VID_HARDWARE_QCAM_BW 2 #define VID_HARDWARE_PMS 3 #define VID_HARDWARE_QCAM_C 4 #define VID_HARDWARE_PSEUDO 5 #define VID_HARDWARE_SAA5249 6 #define VID_HARDWARE_AZTECH 7 #define VID_HARDWARE_SF16MI 8 #define VID_HARDWARE_RTRACK 9 #define VID_HARDWARE_ZOLTRIX 10 #define VID_HARDWARE_SAA7146 11 #define VID_HARDWARE_VIDEUM 12 /* Reserved for Winnov videum */ #define VID_HARDWARE_RTRACK2 13 #define VID_HARDWARE_PERMEDIA2 14 /* Reserved for Permedia2 */ #define VID_HARDWARE_RIVA128 15 /* Reserved for RIVA 128 */ #define VID_HARDWARE_PLANB 16 /* PowerMac motherboard video-in */ #define VID_HARDWARE_BROADWAY 17 /* Broadway project */ #define VID_HARDWARE_GEMTEK 18 #define VID_HARDWARE_TYPHOON 19 #define VID_HARDWARE_VINO 20 /* SGI Indy Vino */ #define VID_HARDWARE_CADET 21 /* Cadet radio */ #define VID_HARDWARE_TRUST 22 /* Trust FM Radio */ #define VID_HARDWARE_TERRATEC 23 /* TerraTec ActiveRadio */ #define VID_HARDWARE_CPIA 24 #define VID_HARDWARE_ZR36120 25 /* Zoran ZR36120/ZR36125 */ #define VID_HARDWARE_ZR36067 26 /* Zoran ZR36067/36060 */ #define VID_HARDWARE_OV511 27 #define VID_HARDWARE_ZR356700 28 /* Zoran 36700 series */ #define VID_HARDWARE_W9966 29 #define VID_HARDWARE_SE401 30 /* SE401 USB webcams */ #define VID_HARDWARE_PWC 31 /* Philips webcams */ #define VID_HARDWARE_MEYE 32 /* Sony Vaio MotionEye cameras */ #define VID_HARDWARE_CPIA2 33 #define VID_HARDWARE_VICAM 34 #endif /* __LINUX_VIDEODEV_H */ /* * Local variables: * c-basic-offset: 8 * End: */ #ifdef __cplusplus } #endif stopmotion-0.8.0/src/technical/libng/videodev2.h000066400000000000000000000617341234321124500216160ustar00rootroot00000000000000#ifndef __LINUX_VIDEODEV2_H #define __LINUX_VIDEODEV2_H #ifdef __cplusplus extern "C" { #endif /* * Video for Linux Two * * Header file for v4l or V4L2 drivers and applications, for * Linux kernels 2.2.x or 2.4.x. * * See http://www.thedirks.org/v4l2/ for API specs and other * v4l2 documentation. * * Author: Bill Dirks * Justin Schoeman * et al. */ /* * M I S C E L L A N E O U S */ /* Four-character-code (FOURCC) */ #define v4l2_fourcc(a,b,c,d)\ (((__u32)(a)<<0)|((__u32)(b)<<8)|((__u32)(c)<<16)|((__u32)(d)<<24)) /* * E N U M S */ enum v4l2_field { V4L2_FIELD_ANY = 0, /* driver can choose from none, top, bottom, interlaced depending on whatever it thinks is approximate ... */ V4L2_FIELD_NONE = 1, /* this device has no fields ... */ V4L2_FIELD_TOP = 2, /* top field only */ V4L2_FIELD_BOTTOM = 3, /* bottom field only */ V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */ V4L2_FIELD_SEQ_TB = 5, /* both fields sequential into one buffer, top-bottom order */ V4L2_FIELD_SEQ_BT = 6, /* same as above + bottom-top order */ V4L2_FIELD_ALTERNATE = 7, /* both fields alternating into separate buffers */ }; #define V4L2_FIELD_HAS_TOP(field) \ ((field) == V4L2_FIELD_TOP ||\ (field) == V4L2_FIELD_INTERLACED ||\ (field) == V4L2_FIELD_SEQ_TB ||\ (field) == V4L2_FIELD_SEQ_BT) #define V4L2_FIELD_HAS_BOTTOM(field) \ ((field) == V4L2_FIELD_BOTTOM ||\ (field) == V4L2_FIELD_INTERLACED ||\ (field) == V4L2_FIELD_SEQ_TB ||\ (field) == V4L2_FIELD_SEQ_BT) #define V4L2_FIELD_HAS_BOTH(field) \ ((field) == V4L2_FIELD_INTERLACED ||\ (field) == V4L2_FIELD_SEQ_TB ||\ (field) == V4L2_FIELD_SEQ_BT) enum v4l2_buf_type { V4L2_BUF_TYPE_VIDEO_CAPTURE = 1, V4L2_BUF_TYPE_VIDEO_OUTPUT = 2, V4L2_BUF_TYPE_VIDEO_OVERLAY = 3, V4L2_BUF_TYPE_VBI_CAPTURE = 4, V4L2_BUF_TYPE_VBI_OUTPUT = 5, V4L2_BUF_TYPE_PRIVATE = 0x80, }; enum v4l2_ctrl_type { V4L2_CTRL_TYPE_INTEGER = 1, V4L2_CTRL_TYPE_BOOLEAN = 2, V4L2_CTRL_TYPE_MENU = 3, V4L2_CTRL_TYPE_BUTTON = 4, }; enum v4l2_tuner_type { V4L2_TUNER_RADIO = 1, V4L2_TUNER_ANALOG_TV = 2, }; enum v4l2_memory { V4L2_MEMORY_MMAP = 1, V4L2_MEMORY_USERPTR = 2, V4L2_MEMORY_OVERLAY = 3, }; /* see also http://vektor.theorem.ca/graphics/ycbcr/ */ enum v4l2_colorspace { /* ITU-R 601 -- broadcast NTSC/PAL */ V4L2_COLORSPACE_SMPTE170M = 1, /* 1125-Line (US) HDTV */ V4L2_COLORSPACE_SMPTE240M = 2, /* HD and modern captures. */ V4L2_COLORSPACE_REC709 = 3, /* broken BT878 extents (601, luma range 16-253 instead of 16-235) */ V4L2_COLORSPACE_BT878 = 4, /* These should be useful. Assume 601 extents. */ V4L2_COLORSPACE_470_SYSTEM_M = 5, V4L2_COLORSPACE_470_SYSTEM_BG = 6, /* I know there will be cameras that send this. So, this is * unspecified chromaticities and full 0-255 on each of the * Y'CbCr components */ V4L2_COLORSPACE_JPEG = 7, /* For RGB colourspaces, this is probably a good start. */ V4L2_COLORSPACE_SRGB = 8, }; struct v4l2_rect { __s32 left; __s32 top; __s32 width; __s32 height; }; struct v4l2_fract { __u32 numerator; __u32 denominator; }; /* * D R I V E R C A P A B I L I T I E S */ struct v4l2_capability { __u8 driver[16]; /* i.e. "bttv" */ __u8 card[32]; /* i.e. "Hauppauge WinTV" */ __u8 bus_info[32]; /* "PCI:" + pci_dev->slot_name */ __u32 version; /* should use KERNEL_VERSION() */ __u32 capabilities; /* Device capabilities */ __u32 reserved[4]; }; /* Values for 'capabilities' field */ #define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */ #define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */ #define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */ #define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a VBI capture device */ #define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a VBI output device */ #define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */ #define V4L2_CAP_TUNER 0x00010000 /* Has a tuner */ #define V4L2_CAP_AUDIO 0x00020000 /* has audio support */ #define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */ #define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */ #define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */ /* * V I D E O I M A G E F O R M A T */ struct v4l2_pix_format { __u32 width; __u32 height; __u32 pixelformat; enum v4l2_field field; __u32 bytesperline; /* for padding, zero if unused */ __u32 sizeimage; enum v4l2_colorspace colorspace; __u32 priv; /* private data, depends on pixelformat */ }; /* Pixel format FOURCC depth Description */ #define V4L2_PIX_FMT_RGB332 v4l2_fourcc('R','G','B','1') /* 8 RGB-3-3-2 */ #define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R','G','B','O') /* 16 RGB-5-5-5 */ #define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R','G','B','P') /* 16 RGB-5-6-5 */ #define V4L2_PIX_FMT_RGB555X v4l2_fourcc('R','G','B','Q') /* 16 RGB-5-5-5 BE */ #define V4L2_PIX_FMT_RGB565X v4l2_fourcc('R','G','B','R') /* 16 RGB-5-6-5 BE */ #define V4L2_PIX_FMT_BGR24 v4l2_fourcc('B','G','R','3') /* 24 BGR-8-8-8 */ #define V4L2_PIX_FMT_RGB24 v4l2_fourcc('R','G','B','3') /* 24 RGB-8-8-8 */ #define V4L2_PIX_FMT_BGR32 v4l2_fourcc('B','G','R','4') /* 32 BGR-8-8-8-8 */ #define V4L2_PIX_FMT_RGB32 v4l2_fourcc('R','G','B','4') /* 32 RGB-8-8-8-8 */ #define V4L2_PIX_FMT_GREY v4l2_fourcc('G','R','E','Y') /* 8 Greyscale */ #define V4L2_PIX_FMT_YVU410 v4l2_fourcc('Y','V','U','9') /* 9 YVU 4:1:0 */ #define V4L2_PIX_FMT_YVU420 v4l2_fourcc('Y','V','1','2') /* 12 YVU 4:2:0 */ #define V4L2_PIX_FMT_YUYV v4l2_fourcc('Y','U','Y','V') /* 16 YUV 4:2:2 */ #define V4L2_PIX_FMT_UYVY v4l2_fourcc('U','Y','V','Y') /* 16 YUV 4:2:2 */ #define V4L2_PIX_FMT_YUV422P v4l2_fourcc('4','2','2','P') /* 16 YVU422 planar */ #define V4L2_PIX_FMT_YUV411P v4l2_fourcc('4','1','1','P') /* 16 YVU411 planar */ #define V4L2_PIX_FMT_Y41P v4l2_fourcc('Y','4','1','P') /* 12 YUV 4:1:1 */ /* two planes -- one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N','V','1','2') /* 12 Y/CbCr 4:2:0 */ #define V4L2_PIX_FMT_NV21 v4l2_fourcc('N','V','2','1') /* 12 Y/CrCb 4:2:0 */ /* The following formats are not defined in the V4L2 specification */ #define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y','U','V','9') /* 9 YUV 4:1:0 */ #define V4L2_PIX_FMT_YUV420 v4l2_fourcc('Y','U','1','2') /* 12 YUV 4:2:0 */ #define V4L2_PIX_FMT_YYUV v4l2_fourcc('Y','Y','U','V') /* 16 YUV 4:2:2 */ #define V4L2_PIX_FMT_HI240 v4l2_fourcc('H','I','2','4') /* 8 8-bit color */ /* compressed formats */ #define V4L2_PIX_FMT_MJPEG v4l2_fourcc('M','J','P','G') /* Motion-JPEG */ #define V4L2_PIX_FMT_JPEG v4l2_fourcc('J','P','E','G') /* JFIF JPEG */ #define V4L2_PIX_FMT_DV v4l2_fourcc('d','v','s','d') /* 1394 */ #define V4L2_PIX_FMT_MPEG v4l2_fourcc('M','P','E','G') /* MPEG */ /* Vendor-specific formats */ #define V4L2_PIX_FMT_WNVA v4l2_fourcc('W','N','V','A') /* Winnov hw compres */ /* * F O R M A T E N U M E R A T I O N */ struct v4l2_fmtdesc { __u32 index; /* Format number */ enum v4l2_buf_type type; /* buffer type */ __u32 flags; __u8 description[32]; /* Description string */ __u32 pixelformat; /* Format fourcc */ __u32 reserved[4]; }; #define V4L2_FMT_FLAG_COMPRESSED 0x0001 /* * T I M E C O D E */ struct v4l2_timecode { __u32 type; __u32 flags; __u8 frames; __u8 seconds; __u8 minutes; __u8 hours; __u8 userbits[4]; }; /* Type */ #define V4L2_TC_TYPE_24FPS 1 #define V4L2_TC_TYPE_25FPS 2 #define V4L2_TC_TYPE_30FPS 3 #define V4L2_TC_TYPE_50FPS 4 #define V4L2_TC_TYPE_60FPS 5 /* Flags */ #define V4L2_TC_FLAG_DROPFRAME 0x0001 /* "drop-frame" mode */ #define V4L2_TC_FLAG_COLORFRAME 0x0002 #define V4L2_TC_USERBITS_field 0x000C #define V4L2_TC_USERBITS_USERDEFINED 0x0000 #define V4L2_TC_USERBITS_8BITCHARS 0x0008 /* The above is based on SMPTE timecodes */ /* * C O M P R E S S I O N P A R A M E T E R S */ #if 0 /* ### generic compression settings don't work, there is too much * ### codec-specific stuff. Maybe reuse that for MPEG codec settings * ### later ... */ struct v4l2_compression { __u32 quality; __u32 keyframerate; __u32 pframerate; __u32 reserved[5]; }; #endif struct v4l2_jpegcompression { int quality; int APPn; /* Number of APP segment to be written, * must be 0..15 */ int APP_len; /* Length of data in JPEG APPn segment */ char APP_data[60]; /* Data in the JPEG APPn segment. */ int COM_len; /* Length of data in JPEG COM segment */ char COM_data[60]; /* Data in JPEG COM segment */ __u32 jpeg_markers; /* Which markers should go into the JPEG * output. Unless you exactly know what * you do, leave them untouched. * Inluding less markers will make the * resulting code smaller, but there will * be fewer aplications which can read it. * The presence of the APP and COM marker * is influenced by APP_len and COM_len * ONLY, not by this property! */ #define V4L2_JPEG_MARKER_DHT (1<<3) /* Define Huffman Tables */ #define V4L2_JPEG_MARKER_DQT (1<<4) /* Define Quantization Tables */ #define V4L2_JPEG_MARKER_DRI (1<<5) /* Define Restart Interval */ #define V4L2_JPEG_MARKER_COM (1<<6) /* Comment segment */ #define V4L2_JPEG_MARKER_APP (1<<7) /* App segment, driver will * allways use APP0 */ }; /* * M E M O R Y - M A P P I N G B U F F E R S */ struct v4l2_requestbuffers { __u32 count; enum v4l2_buf_type type; enum v4l2_memory memory; __u32 reserved[2]; }; struct v4l2_buffer { __u32 index; enum v4l2_buf_type type; __u32 bytesused; __u32 flags; enum v4l2_field field; struct timeval timestamp; struct v4l2_timecode timecode; __u32 sequence; /* memory location */ enum v4l2_memory memory; union { __u32 offset; unsigned long userptr; } m; __u32 length; __u32 reserved[2]; }; /* Flags for 'flags' field */ #define V4L2_BUF_FLAG_MAPPED 0x0001 /* Buffer is mapped (flag) */ #define V4L2_BUF_FLAG_QUEUED 0x0002 /* Buffer is queued for processing */ #define V4L2_BUF_FLAG_DONE 0x0004 /* Buffer is ready */ #define V4L2_BUF_FLAG_KEYFRAME 0x0008 /* Image is a keyframe (I-frame) */ #define V4L2_BUF_FLAG_PFRAME 0x0010 /* Image is a P-frame */ #define V4L2_BUF_FLAG_BFRAME 0x0020 /* Image is a B-frame */ #define V4L2_BUF_FLAG_TIMECODE 0x0100 /* timecode field is valid */ /* * O V E R L A Y P R E V I E W */ struct v4l2_framebuffer { __u32 capability; __u32 flags; /* FIXME: in theory we should pass something like PCI device + memory * region + offset instead of some physical address */ void* base; struct v4l2_pix_format fmt; }; /* Flags for the 'capability' field. Read only */ #define V4L2_FBUF_CAP_EXTERNOVERLAY 0x0001 #define V4L2_FBUF_CAP_CHROMAKEY 0x0002 #define V4L2_FBUF_CAP_LIST_CLIPPING 0x0004 #define V4L2_FBUF_CAP_BITMAP_CLIPPING 0x0008 /* Flags for the 'flags' field. */ #define V4L2_FBUF_FLAG_PRIMARY 0x0001 #define V4L2_FBUF_FLAG_OVERLAY 0x0002 #define V4L2_FBUF_FLAG_CHROMAKEY 0x0004 struct v4l2_clip { struct v4l2_rect c; struct v4l2_clip *next; }; struct v4l2_window { struct v4l2_rect w; enum v4l2_field field; __u32 chromakey; struct v4l2_clip *clips; __u32 clipcount; void *bitmap; }; /* * C A P T U R E P A R A M E T E R S */ struct v4l2_captureparm { __u32 capability; /* Supported modes */ __u32 capturemode; /* Current mode */ struct v4l2_fract timeperframe; /* Time per frame in .1us units */ __u32 extendedmode; /* Driver-specific extensions */ __u32 readbuffers; /* # of buffers for read */ __u32 reserved[4]; }; /* Flags for 'capability' and 'capturemode' fields */ #define V4L2_MODE_HIGHQUALITY 0x0001 /* High quality imaging mode */ #define V4L2_CAP_TIMEPERFRAME 0x1000 /* timeperframe field is supported */ struct v4l2_outputparm { __u32 capability; /* Supported modes */ __u32 outputmode; /* Current mode */ struct v4l2_fract timeperframe; /* Time per frame in seconds */ __u32 extendedmode; /* Driver-specific extensions */ __u32 writebuffers; /* # of buffers for write */ __u32 reserved[4]; }; /* * I N P U T I M A G E C R O P P I N G */ struct v4l2_cropcap { enum v4l2_buf_type type; struct v4l2_rect bounds; struct v4l2_rect defrect; struct v4l2_fract pixelaspect; }; struct v4l2_crop { enum v4l2_buf_type type; struct v4l2_rect c; }; /* * A N A L O G V I D E O S T A N D A R D */ typedef __u64 v4l2_std_id; /* one bit for each */ #define V4L2_STD_PAL_B ((v4l2_std_id)0x00000001) #define V4L2_STD_PAL_B1 ((v4l2_std_id)0x00000002) #define V4L2_STD_PAL_G ((v4l2_std_id)0x00000004) #define V4L2_STD_PAL_H ((v4l2_std_id)0x00000008) #define V4L2_STD_PAL_I ((v4l2_std_id)0x00000010) #define V4L2_STD_PAL_D ((v4l2_std_id)0x00000020) #define V4L2_STD_PAL_D1 ((v4l2_std_id)0x00000040) #define V4L2_STD_PAL_K ((v4l2_std_id)0x00000080) #define V4L2_STD_PAL_M ((v4l2_std_id)0x00000100) #define V4L2_STD_PAL_N ((v4l2_std_id)0x00000200) #define V4L2_STD_PAL_Nc ((v4l2_std_id)0x00000400) #define V4L2_STD_PAL_60 ((v4l2_std_id)0x00000800) #define V4L2_STD_NTSC_M ((v4l2_std_id)0x00001000) #define V4L2_STD_NTSC_M_JP ((v4l2_std_id)0x00002000) #define V4L2_STD_SECAM_B ((v4l2_std_id)0x00010000) #define V4L2_STD_SECAM_D ((v4l2_std_id)0x00020000) #define V4L2_STD_SECAM_G ((v4l2_std_id)0x00040000) #define V4L2_STD_SECAM_H ((v4l2_std_id)0x00080000) #define V4L2_STD_SECAM_K ((v4l2_std_id)0x00100000) #define V4L2_STD_SECAM_K1 ((v4l2_std_id)0x00200000) #define V4L2_STD_SECAM_L ((v4l2_std_id)0x00400000) /* ATSC/HDTV */ #define V4L2_STD_ATSC_8_VSB ((v4l2_std_id)0x01000000) #define V4L2_STD_ATSC_16_VSB ((v4l2_std_id)0x02000000) /* some common needed stuff */ #define V4L2_STD_PAL_BG (V4L2_STD_PAL_B |\ V4L2_STD_PAL_B1 |\ V4L2_STD_PAL_G) #define V4L2_STD_PAL_DK (V4L2_STD_PAL_D |\ V4L2_STD_PAL_D1 |\ V4L2_STD_PAL_K) #define V4L2_STD_PAL (V4L2_STD_PAL_BG |\ V4L2_STD_PAL_DK |\ V4L2_STD_PAL_H |\ V4L2_STD_PAL_I) #define V4L2_STD_NTSC (V4L2_STD_NTSC_M |\ V4L2_STD_NTSC_M_JP) #define V4L2_STD_SECAM (V4L2_STD_SECAM_B |\ V4L2_STD_SECAM_D |\ V4L2_STD_SECAM_G |\ V4L2_STD_SECAM_H |\ V4L2_STD_SECAM_K |\ V4L2_STD_SECAM_K1 |\ V4L2_STD_SECAM_L) #define V4L2_STD_525_60 (V4L2_STD_PAL_M |\ V4L2_STD_PAL_60 |\ V4L2_STD_NTSC) #define V4L2_STD_625_50 (V4L2_STD_PAL |\ V4L2_STD_PAL_N |\ V4L2_STD_PAL_Nc |\ V4L2_STD_SECAM) #define V4L2_STD_UNKNOWN 0 #define V4L2_STD_ALL (V4L2_STD_525_60 |\ V4L2_STD_625_50) struct v4l2_standard { __u32 index; v4l2_std_id id; __u8 name[24]; struct v4l2_fract frameperiod; /* Frames, not fields */ __u32 framelines; __u32 reserved[4]; }; /* * V I D E O I N P U T S */ struct v4l2_input { __u32 index; /* Which input */ __u8 name[32]; /* Label */ __u32 type; /* Type of input */ __u32 audioset; /* Associated audios (bitfield) */ __u32 tuner; /* Associated tuner */ v4l2_std_id std; __u32 status; __u32 reserved[4]; }; /* Values for the 'type' field */ #define V4L2_INPUT_TYPE_TUNER 1 #define V4L2_INPUT_TYPE_CAMERA 2 /* field 'status' - general */ #define V4L2_IN_ST_NO_POWER 0x00000001 /* Attached device is off */ #define V4L2_IN_ST_NO_SIGNAL 0x00000002 #define V4L2_IN_ST_NO_COLOR 0x00000004 /* field 'status' - analog */ #define V4L2_IN_ST_NO_H_LOCK 0x00000100 /* No horizontal sync lock */ #define V4L2_IN_ST_COLOR_KILL 0x00000200 /* Color killer is active */ /* field 'status' - digital */ #define V4L2_IN_ST_NO_SYNC 0x00010000 /* No synchronization lock */ #define V4L2_IN_ST_NO_EQU 0x00020000 /* No equalizer lock */ #define V4L2_IN_ST_NO_CARRIER 0x00040000 /* Carrier recovery failed */ /* field 'status' - VCR and set-top box */ #define V4L2_IN_ST_MACROVISION 0x01000000 /* Macrovision detected */ #define V4L2_IN_ST_NO_ACCESS 0x02000000 /* Conditional access denied */ #define V4L2_IN_ST_VTR 0x04000000 /* VTR time constant */ /* * V I D E O O U T P U T S */ struct v4l2_output { __u32 index; /* Which output */ __u8 name[32]; /* Label */ __u32 type; /* Type of output */ __u32 audioset; /* Associated audios (bitfield) */ __u32 modulator; /* Associated modulator */ v4l2_std_id std; __u32 reserved[4]; }; /* Values for the 'type' field */ #define V4L2_OUTPUT_TYPE_MODULATOR 1 #define V4L2_OUTPUT_TYPE_ANALOG 2 #define V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY 3 /* * C O N T R O L S */ struct v4l2_control { __u32 id; __s32 value; }; /* Used in the VIDIOC_QUERYCTRL ioctl for querying controls */ struct v4l2_queryctrl { __u32 id; enum v4l2_ctrl_type type; __u8 name[32]; /* Whatever */ __s32 minimum; /* Note signedness */ __s32 maximum; __s32 step; __s32 default_value; __u32 flags; __u32 reserved[2]; }; /* Used in the VIDIOC_QUERYMENU ioctl for querying menu items */ struct v4l2_querymenu { __u32 id; __u32 index; __u8 name[32]; /* Whatever */ __u32 reserved; }; /* Control flags */ #define V4L2_CTRL_FLAG_DISABLED 0x0001 #define V4L2_CTRL_FLAG_GRABBED 0x0002 /* Control IDs defined by V4L2 */ #define V4L2_CID_BASE 0x00980900 /* IDs reserved for driver specific controls */ #define V4L2_CID_PRIVATE_BASE 0x08000000 #define V4L2_CID_BRIGHTNESS (V4L2_CID_BASE+0) #define V4L2_CID_CONTRAST (V4L2_CID_BASE+1) #define V4L2_CID_SATURATION (V4L2_CID_BASE+2) #define V4L2_CID_HUE (V4L2_CID_BASE+3) #define V4L2_CID_AUDIO_VOLUME (V4L2_CID_BASE+5) #define V4L2_CID_AUDIO_BALANCE (V4L2_CID_BASE+6) #define V4L2_CID_AUDIO_BASS (V4L2_CID_BASE+7) #define V4L2_CID_AUDIO_TREBLE (V4L2_CID_BASE+8) #define V4L2_CID_AUDIO_MUTE (V4L2_CID_BASE+9) #define V4L2_CID_AUDIO_LOUDNESS (V4L2_CID_BASE+10) #define V4L2_CID_BLACK_LEVEL (V4L2_CID_BASE+11) #define V4L2_CID_AUTO_WHITE_BALANCE (V4L2_CID_BASE+12) #define V4L2_CID_DO_WHITE_BALANCE (V4L2_CID_BASE+13) #define V4L2_CID_RED_BALANCE (V4L2_CID_BASE+14) #define V4L2_CID_BLUE_BALANCE (V4L2_CID_BASE+15) #define V4L2_CID_GAMMA (V4L2_CID_BASE+16) #define V4L2_CID_WHITENESS (V4L2_CID_GAMMA) /* ? Not sure */ #define V4L2_CID_EXPOSURE (V4L2_CID_BASE+17) #define V4L2_CID_AUTOGAIN (V4L2_CID_BASE+18) #define V4L2_CID_GAIN (V4L2_CID_BASE+19) #define V4L2_CID_HFLIP (V4L2_CID_BASE+20) #define V4L2_CID_VFLIP (V4L2_CID_BASE+21) #define V4L2_CID_HCENTER (V4L2_CID_BASE+22) #define V4L2_CID_VCENTER (V4L2_CID_BASE+23) #define V4L2_CID_LASTP1 (V4L2_CID_BASE+24) /* last CID + 1 */ /* * T U N I N G */ struct v4l2_tuner { __u32 index; __u8 name[32]; enum v4l2_tuner_type type; __u32 capability; __u32 rangelow; __u32 rangehigh; __u32 rxsubchans; __u32 audmode; __s32 signal; __s32 afc; __u32 reserved[4]; }; struct v4l2_modulator { __u32 index; __u8 name[32]; __u32 capability; __u32 rangelow; __u32 rangehigh; __u32 txsubchans; __u32 reserved[4]; }; /* Flags for the 'capability' field */ #define V4L2_TUNER_CAP_LOW 0x0001 #define V4L2_TUNER_CAP_NORM 0x0002 #define V4L2_TUNER_CAP_STEREO 0x0010 #define V4L2_TUNER_CAP_LANG2 0x0020 #define V4L2_TUNER_CAP_SAP 0x0020 #define V4L2_TUNER_CAP_LANG1 0x0040 /* Flags for the 'rxsubchans' field */ #define V4L2_TUNER_SUB_MONO 0x0001 #define V4L2_TUNER_SUB_STEREO 0x0002 #define V4L2_TUNER_SUB_LANG2 0x0004 #define V4L2_TUNER_SUB_SAP 0x0004 #define V4L2_TUNER_SUB_LANG1 0x0008 /* Values for the 'audmode' field */ #define V4L2_TUNER_MODE_MONO 0x0000 #define V4L2_TUNER_MODE_STEREO 0x0001 #define V4L2_TUNER_MODE_LANG2 0x0002 #define V4L2_TUNER_MODE_SAP 0x0002 #define V4L2_TUNER_MODE_LANG1 0x0003 struct v4l2_frequency { __u32 tuner; enum v4l2_tuner_type type; __u32 frequency; __u32 reserved[8]; }; /* * A U D I O */ struct v4l2_audio { __u32 index; __u8 name[32]; __u32 capability; __u32 mode; __u32 reserved[2]; }; /* Flags for the 'capability' field */ #define V4L2_AUDCAP_STEREO 0x00001 #define V4L2_AUDCAP_AVL 0x00002 /* Flags for the 'mode' field */ #define V4L2_AUDMODE_AVL 0x00001 struct v4l2_audioout { __u32 index; __u8 name[32]; __u32 capability; __u32 mode; __u32 reserved[2]; }; /* * D A T A S E R V I C E S ( V B I ) * * Data services API by Michael Schimek */ struct v4l2_vbi_format { __u32 sampling_rate; /* in 1 Hz */ __u32 offset; __u32 samples_per_line; __u32 sample_format; /* V4L2_PIX_FMT_* */ __s32 start[2]; __u32 count[2]; __u32 flags; /* V4L2_VBI_* */ __u32 reserved[2]; /* must be zero */ }; /* VBI flags */ #define V4L2_VBI_UNSYNC (1<< 0) #define V4L2_VBI_INTERLACED (1<< 1) /* * A G G R E G A T E S T R U C T U R E S */ /* Stream data format */ struct v4l2_format { enum v4l2_buf_type type; union { struct v4l2_pix_format pix; // V4L2_BUF_TYPE_VIDEO_CAPTURE struct v4l2_window win; // V4L2_BUF_TYPE_VIDEO_OVERLAY struct v4l2_vbi_format vbi; // V4L2_BUF_TYPE_VBI_CAPTURE __u8 raw_data[200]; // user-defined } fmt; }; /* Stream type-dependent parameters */ struct v4l2_streamparm { enum v4l2_buf_type type; union { struct v4l2_captureparm capture; struct v4l2_outputparm output; __u8 raw_data[200]; /* user-defined */ } parm; }; /* * I O C T L C O D E S F O R V I D E O D E V I C E S * */ #define VIDIOC_QUERYCAP _IOR ('V', 0, struct v4l2_capability) #define VIDIOC_RESERVED _IO ('V', 1) #define VIDIOC_ENUM_FMT _IOWR ('V', 2, struct v4l2_fmtdesc) #define VIDIOC_G_FMT _IOWR ('V', 4, struct v4l2_format) #define VIDIOC_S_FMT _IOWR ('V', 5, struct v4l2_format) #if 0 #define VIDIOC_G_COMP _IOR ('V', 6, struct v4l2_compression) #define VIDIOC_S_COMP _IOW ('V', 7, struct v4l2_compression) #endif #define VIDIOC_REQBUFS _IOWR ('V', 8, struct v4l2_requestbuffers) #define VIDIOC_QUERYBUF _IOWR ('V', 9, struct v4l2_buffer) #define VIDIOC_G_FBUF _IOR ('V', 10, struct v4l2_framebuffer) #define VIDIOC_S_FBUF _IOW ('V', 11, struct v4l2_framebuffer) #define VIDIOC_OVERLAY _IOWR ('V', 14, int) #define VIDIOC_QBUF _IOWR ('V', 15, struct v4l2_buffer) #define VIDIOC_DQBUF _IOWR ('V', 17, struct v4l2_buffer) #define VIDIOC_STREAMON _IOW ('V', 18, int) #define VIDIOC_STREAMOFF _IOW ('V', 19, int) #define VIDIOC_G_PARM _IOWR ('V', 21, struct v4l2_streamparm) #define VIDIOC_S_PARM _IOW ('V', 22, struct v4l2_streamparm) #define VIDIOC_G_STD _IOR ('V', 23, v4l2_std_id) #define VIDIOC_S_STD _IOW ('V', 24, v4l2_std_id) #define VIDIOC_ENUMSTD _IOWR ('V', 25, struct v4l2_standard) #define VIDIOC_ENUMINPUT _IOWR ('V', 26, struct v4l2_input) #define VIDIOC_G_CTRL _IOWR ('V', 27, struct v4l2_control) #define VIDIOC_S_CTRL _IOW ('V', 28, struct v4l2_control) #define VIDIOC_G_TUNER _IOWR ('V', 29, struct v4l2_tuner) #define VIDIOC_S_TUNER _IOW ('V', 30, struct v4l2_tuner) #define VIDIOC_G_AUDIO _IOWR ('V', 33, struct v4l2_audio) #define VIDIOC_S_AUDIO _IOW ('V', 34, struct v4l2_audio) #define VIDIOC_QUERYCTRL _IOWR ('V', 36, struct v4l2_queryctrl) #define VIDIOC_QUERYMENU _IOWR ('V', 37, struct v4l2_querymenu) #define VIDIOC_G_INPUT _IOR ('V', 38, int) #define VIDIOC_S_INPUT _IOWR ('V', 39, int) #define VIDIOC_G_OUTPUT _IOR ('V', 46, int) #define VIDIOC_S_OUTPUT _IOWR ('V', 47, int) #define VIDIOC_ENUMOUTPUT _IOWR ('V', 48, struct v4l2_output) #define VIDIOC_G_AUDOUT _IOWR ('V', 49, struct v4l2_audioout) #define VIDIOC_S_AUDOUT _IOW ('V', 50, struct v4l2_audioout) #define VIDIOC_G_MODULATOR _IOWR ('V', 54, struct v4l2_modulator) #define VIDIOC_S_MODULATOR _IOW ('V', 55, struct v4l2_modulator) #define VIDIOC_G_FREQUENCY _IOWR ('V', 56, struct v4l2_frequency) #define VIDIOC_S_FREQUENCY _IOW ('V', 57, struct v4l2_frequency) #define VIDIOC_CROPCAP _IOR ('V', 58, struct v4l2_cropcap) #define VIDIOC_G_CROP _IOWR ('V', 59, struct v4l2_crop) #define VIDIOC_S_CROP _IOW ('V', 60, struct v4l2_crop) #define VIDIOC_G_JPEGCOMP _IOR ('V', 61, struct v4l2_jpegcompression) #define VIDIOC_S_JPEGCOMP _IOW ('V', 62, struct v4l2_jpegcompression) #define VIDIOC_QUERYSTD _IOR ('V', 63, v4l2_std_id) #define VIDIOC_TRY_FMT _IOWR ('V', 64, struct v4l2_format) #define BASE_VIDIOC_PRIVATE 192 /* 192-255 are private */ #endif /* __LINUX_VIDEODEV2_H */ /* * Local variables: * c-basic-offset: 8 * End: */ #ifdef __cplusplus } #endif stopmotion-0.8.0/src/technical/projectserializer.cpp000066400000000000000000000351511234321124500227210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "projectserializer.h" #include "src/foundation/logger.h" #include "src/domain/filenamevisitor.h" #include "src/domain/animation/scene.h" #include "src/domain/animation/frame.h" #include "src/domain/animation/sound.h" #include "src/domain/animation/animationimpl.h" #include "src/domain/animation/workspacefile.h" #include "src/technical/audio/audioformat.h" #include "src/technical/util.h" #include #include #include #include #include #include #include #include // for older libtars #define UNCONST(s) const_cast(s) FileException::FileException(const char* functionName, int errorno) { snprintf(buffer, sizeof(buffer), "%s(): %s", functionName, strerror(errorno)); } const char* FileException::what() const throw() { return buffer; } class ProjectFileCreationException : public FileException { public: ProjectFileCreationException(const char* functionName, int errorno) : FileException(functionName, errorno) { } }; class ProjectFileReadException : public FileException { public: ProjectFileReadException(const char* functionName, int errorno) : FileException(functionName, errorno) { } }; ProjectSerializer::ProjectSerializer() : projectFile(0) { LIBXML_TEST_VERSION; } ProjectSerializer::~ProjectSerializer() { resetProjectFile(); } class TarFileRead { TAR* tar; public: TarFileRead(const char* filename) { if (tar_open(&tar, UNCONST(filename), 0, O_RDONLY, 0, 0 | 0) == -1) { throw ProjectFileReadException("tar_open", errno); } } ~TarFileRead() { } bool next() { int ret = th_read(tar); if (ret == 0) return true; if (ret < 0) throw ProjectFileReadException("th_read", errno); return false; } const char *regularFileFilename() const { return TH_ISREG(tar)? th_get_pathname(tar) : 0; } void extract(std::string& filename) { filename.c_str(); if (tar_extract_regfile(tar, &filename[0]) < 0) { throw ProjectFileReadException("th_extract_regfile", errno); } } void finish() { if (tar_close(tar) < 0) throw ProjectFileReadException("tar_close", errno); tar = 0; } }; class StoFileRead { TarFileRead tar; static bool isProjectFile(const char* filename) { if (filename) { const char* slash1 = strchr(filename, '/'); if (slash1) { ++slash1; if (!strchr(slash1, '/')) { const char* dot = strrchr(slash1, '.'); if (dot && strcmp(dot, ".dat") == 0) { return true; } } } } return false; } // returns the basename portion of the argument if it is an image or sound, // null otherwise static const char* imageOrSoundFile(const char* filename) { static const char images[] = "images"; static const char sounds[] = "sounds"; if (filename) { const char* slash1 = strchr(filename, '/'); if (slash1) { ++slash1; const char* slash2 = strchr(slash1, '/'); if (slash2) { std::ptrdiff_t dirLen = slash2 - slash1; ++slash2; if ((strncmp(images, slash1, dirLen) == 0 || strncmp(sounds, slash1, dirLen)) && strchr(slash2, '/') == 0) { return slash2; } } } } return 0; } public: StoFileRead(const char* filename) : tar(filename) { } ~StoFileRead() { } void unpack() { while (tar.next()) { const char* fn = tar.regularFileFilename(); const char* base = imageOrSoundFile(fn); if (base) { // image or sound WorkspaceFile wf(base); std::string path = wf.path(); tar.extract(path); } else if (isProjectFile(fn)) { WorkspaceFile dat(WorkspaceFile::currentModelFile); std::string path = dat.path(); tar.extract(path); } else if (fn) { Logger::get().logWarning( "Did not know what to do with tarred file %s", fn); } } } void finish() { tar.finish(); } }; void readSto(const char* filename) { StoFileRead sto(filename); sto.unpack(); sto.finish(); } // appends .sto to filename if appropriate to make a project filename void ProjectSerializer::setProjectFile(const char *filename) { static const char appendix[] = ".sto"; const size_t len = strlen(filename); char* newProjectFile = new char[len + sizeof(appendix)]; strcpy(newProjectFile, filename); const char *dotPtr = strrchr(filename, '.'); if (dotPtr == NULL || strcmp(dotPtr, ".sto") != 0) { strcat(newProjectFile, ".sto"); } delete[] projectFile; projectFile = newProjectFile; } bool ProjectSerializer::openDat(std::vector& out, const char* filename) { xmlDocPtr doc = xmlReadFile(filename, NULL, 0); if (!doc) { Logger::get().logWarning("Couldn't load XML file"); return false; } xmlNodePtr rootNode = xmlDocGetRootElement(doc); out.clear(); getAttributes(rootNode, out); xmlFreeDoc(doc); xmlCleanupParser(); return true; } std::vector ProjectSerializer::openSto(const char *filename) { assert(filename != NULL); setProjectFile(filename); readSto(projectFile); WorkspaceFile dat(WorkspaceFile::currentModelFile); std::vector sVect; openDat(sVect, dat.path()); return sVect; } class UniqueVisitor: public FileNameVisitor { std::set visited; FileNameVisitor* del; public: UniqueVisitor(FileNameVisitor* delegate) : del(delegate) { } ~UniqueVisitor() { } void visitImage(const char* path) { std::string p(path); if (visited.find(p) == visited.end()) { visited.insert(p); del->visitImage(path); } } void visitSound(const char* path) { std::string p(path); if (visited.find(p) == visited.end()) { visited.insert(p); del->visitSound(path); } } }; std::string getProjectName(const char* filename) { const char* nameBegin = strrchr(filename, '/'); nameBegin = !nameBegin? filename : nameBegin + 1; const char* nameEnd = strrchr(filename, '.'); if (!nameEnd || nameEnd < nameBegin) nameEnd = filename + strlen(filename); return std::string(nameBegin, nameEnd); } class TarPath { std::string path; std::string::size_type length; public: TarPath(const std::string& rootDir, const char* ext) : path(rootDir), length(0) { path.append(ext); length = path.length(); } /** * Returns the argument prefixed with the rootDir and ext supplied * to the constructor. The result is valid until the next call of getPath * or this object is destroyed. */ const char* getPath(const char* fname) { path.resize(length); path.append(fname); return path.c_str(); } }; class TarFileWrite { TAR* tar; public: TarFileWrite(const char* tarFilename) { if (-1== tar_open(&tar, UNCONST(tarFilename), NULL, O_WRONLY | O_CREAT | O_TRUNC, 0644, 0)) { throw ProjectFileCreationException("tar_open", errno); } } ~TarFileWrite() { } void add(const char* realPath, const char* storedPath) { if (-1 == tar_append_file(tar, UNCONST(realPath), UNCONST(storedPath))) { throw ProjectFileCreationException("tar_append_file", errno); } } void eof() { if (tar_close(tar) < 0) { throw ProjectFileCreationException("tar_close", errno); } tar = 0; } }; class StoFileWrite { TarFileWrite tar; std::string name; TarPath imagePath; TarPath soundPath; std::set alreadyPacked; public: StoFileWrite(const char* stoFilename) : tar(stoFilename), name(getProjectName(stoFilename)), imagePath(name, "/images/"), soundPath(name, "/sounds/") { } void addProjectFile(const char* projectFilename) { std::string projectFileName = name; projectFileName.append("/"); projectFileName.append(name); projectFileName.append(".dat"); tar.add(projectFilename, projectFileName.c_str()); } void addImage(const char* realName, const char* baseName) { std::string bn(baseName); if (alreadyPacked.insert(bn).second) tar.add(realName, imagePath.getPath(baseName)); } void addSound(const char* realName, const char* baseName) { std::string bn(baseName); if (alreadyPacked.insert(bn).second) tar.add(realName, soundPath.getPath(baseName)); } void finish() { tar.eof(); } }; void writeSto(const char* filename, const char* xmlProjectFile, const AnimationImpl& anim) { StoFileWrite sto(filename); sto.addProjectFile(xmlProjectFile); int sceneCount = anim.sceneCount(); for (int i = 0; i != sceneCount; ++i) { const Scene* scene = anim.getScene(i); int frameCount = scene->getSize(); for (int j = 0; j != frameCount; ++j) { const Frame* frame = scene->getFrame(j); sto.addImage(frame->getImagePath(), frame->getBasename()); int soundCount = frame->soundCount(); for (int k = 0; k != soundCount; ++k) { const AudioFormat* audio = frame->getSound(k)->getAudio(); sto.addSound(audio->getSoundPath(), audio->getBasename()); } } } sto.finish(); } /** * Save the current file, putting the current state into the new model file. * The caller is responsible for clearing the command log and then renaming * the new model file to be the current model file. * @param filename The filename to save. * @param anim The animation to save. * @param frontend The UI for reporting progress and errors. */ void ProjectSerializer::save(const char *filename, const AnimationImpl& anim, Frontend *frontend) { assert(filename != NULL); assert(frontend != NULL); setProjectFile(filename); xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); xmlCreateIntSubset(doc, BAD_CAST "smil", BAD_CAST "-//W3C//DTD SMIL 2.0//EN", BAD_CAST "http://www.w3.org/2001/SMIL20/SMIL20.dtd"); xmlNodePtr rootNode = xmlNewNode(NULL, BAD_CAST "smil"); xmlNewProp(rootNode, BAD_CAST "xmlns", BAD_CAST "http://www.w3.org/2001/SMIL20/Language"); xmlNewProp(rootNode, BAD_CAST "xml:lang", BAD_CAST "en"); xmlNewProp(rootNode, BAD_CAST "title", BAD_CAST "Stopmotion"); xmlDocSetRootElement(doc, rootNode); setAttributes(rootNode, anim, frontend); WorkspaceFile newDat(WorkspaceFile::newModelFile); saveDOMToFile(doc, newDat.path()); xmlFreeDoc(doc); xmlCleanupParser(); // Write out new.dat file. The recovery system will ignore it until... writeSto(projectFile, newDat.path(), anim); int numElem = anim.sceneCount(); frontend->updateProgress(numElem); frontend->hideProgress(); } void ProjectSerializer::setAttributes(xmlNodePtr rootNode, const AnimationImpl& anim, Frontend *frontend) { xmlNodePtr node = NULL; const Frame *frame = NULL; const AudioFormat *sound = NULL; xmlNodePtr scenes = xmlNewChild(rootNode, NULL, BAD_CAST "scenes", NULL); int numScenes = anim.sceneCount(); frontend->showProgress(Frontend::savingScenesToDisk, numScenes); for (int i = 0; i < numScenes; ++i) { frontend->updateProgress(i); // Scenes node = xmlNewChild(scenes, NULL, BAD_CAST "seq", NULL); // Images xmlNodePtr images = xmlNewChild(node, NULL, BAD_CAST "images", NULL); const Scene* scene = anim.getScene(i); int numFrames = scene->getSize(); for (int j = 0; j < numFrames; ++j) { frame = scene->getFrame(j); const char *filename = frame->getBasename(); node = xmlNewChild(images, NULL, BAD_CAST "img", NULL); xmlNewProp(node, BAD_CAST "src", BAD_CAST filename); // Sounds int numSounds = frame->soundCount(); if (numSounds > 0) { xmlNodePtr sounds = xmlNewChild(node, NULL, BAD_CAST "sounds", NULL); for (int k = 0; k < numSounds; ++k) { sound = frame->getSound(k)->getAudio(); filename = sound->getBasename(); node = xmlNewChild(sounds, NULL, BAD_CAST "audio", NULL); xmlNewProp(node, BAD_CAST "src", BAD_CAST filename); xmlNewProp(node, BAD_CAST "alt", BAD_CAST frame->getSoundName(i)); } } } } } void ProjectSerializer::getAttributes(xmlNodePtr node, std::vector& sVect) { xmlNodePtr currNode = NULL; for (currNode = node; currNode; currNode = currNode->next) { if (currNode->type == XML_ELEMENT_NODE) { char *nodeName = (char*) currNode->name; // We either have a image node or a sound node if (strcmp(nodeName, "img") == 0 || strcmp(nodeName, "audio") == 0) { char *filename = (char*) xmlGetProp(currNode, BAD_CAST "src"); if (filename != NULL) { // The node is a image node if (strcmp(nodeName, "img") == 0) { WorkspaceFile wf(filename); Frame *f = new Frame(wf); Scene *s = sVect.back(); s->addSavedFrame(f); } // The node is a sound node else { Scene *s = sVect.back(); int frameNum = s->getSize() - 1; WorkspaceFile wf(filename); int soundNum = s->soundCount(frameNum); s->newSound(frameNum, wf); char *soundName = (char*) xmlGetProp(currNode, BAD_CAST "alt"); if (soundName != NULL) { s->setSoundName(frameNum, soundNum, soundName); xmlFree((xmlChar*) soundName); } } xmlFree((xmlChar*) filename); } } // The node is a scene node else if (strcmp((char*) currNode->name, "seq") == 0) { Scene *s = new Scene(); sVect.push_back(s); } } getAttributes(currNode->children, sVect); } } void ProjectSerializer::saveDOMToFile(xmlDocPtr doc, const char* filename) { int ret = xmlSaveFormatFile(filename, doc, 1); if (ret == -1) { throw ProjectFileCreationException("xmlSaveFormatFile", errno); } } const char* ProjectSerializer::getProjectFile() { return projectFile; } void ProjectSerializer::resetProjectFile(const char* filename) { char* copy = 0; if (filename) { size_t len = strlen(filename); copy = new char[len + 1]; strncpy(copy, filename, len + 1); } delete[] projectFile; projectFile = copy; } void ProjectSerializer::resetProjectFile() { resetProjectFile(0); } stopmotion-0.8.0/src/technical/projectserializer.h000066400000000000000000000075411234321124500223700ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PROJECTSERIALIZER_H #define PROJECTSERIALIZER_H #include #include class AnimationImpl; class Scene; class Frontend; class FileException : public std::exception { char buffer[100]; public: FileException(const char* functionName, int errorno); const char* what() const throw(); }; /** * Class for serializing the project. */ class ProjectSerializer { public: ProjectSerializer(); ~ProjectSerializer(); /** * Opens the project's model ({@c .dat}) file. * @param [out] out A vector to be filled with the scenes stored in the * project file, if the function is successful. * @param filename The model file. * @return {@c true} if successful, {@c false} otherwise. */ static bool openDat(std::vector& out, const char* filename); /** * Creates necessary project paths and opens the project ({@c .sto}) file. * @param filename The project file * @return A vector containing the scenes stored in the project file. */ std::vector openSto(const char *filename); /** * Saves the files in a tarball with the name {@a filename} plus the * {@c .sto} extension. * @param filename the project file to store the files within * @param scenes the scenes to be saved * @param frontend the frontend to display progress to */ void save(const char *filename, const AnimationImpl& scenes, Frontend *frontend); /** * Retrieves the project file. * @return the project path if it exist, NULL otherwise. Ownership is not * returned. */ const char* getProjectFile(); /** * After this call (and until a subsequent call to {@ref save} or * {@ref openSto}) {@ref getProjectFile} will return a null pointer. */ void resetProjectFile(); /** * After this call (and until a subsequent call to {@ref save} or * {@ref openSto}) {@ref getProjectFile} will return a string equal to * {@a filename}. * @param filename The new file name to set. Ownership is not passed. A * copy is taken, so the contents of the string need not be preserved. If * null is passed, {@ref getProjectFile} will subsequently return null. */ void resetProjectFile(const char* filename); private: char* projectFile; void setAttributes(xmlNodePtr rootNode, const AnimationImpl& anim, Frontend *frontend); static void getAttributes(xmlNodePtr node, std::vector& scenes); void saveDOMToFile(xmlDocPtr doc, const char* filename); void setProjectFile(const char *filename); }; #endif stopmotion-0.8.0/src/technical/stringiterator.cpp000066400000000000000000000027751234321124500222470ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "stringiterator.h" StringIterator::~StringIterator() { } stopmotion-0.8.0/src/technical/stringiterator.h000066400000000000000000000045341234321124500217070ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef STRINGITERATOR_H_ #define STRINGITERATOR_H_ class StringIterator { public: virtual ~StringIterator(); /** * The total number of elements in the iteration. After this call the * iteration may be at the start of the iteration or where you left it. */ virtual int count() = 0; /** * Have we reached the end of the iteration? * @return {@c false} if {@ref next} can be called. */ virtual bool atEnd() const = 0; /** * The current value. Behaviour is undefined if {@ref atEnd} returned * {@c false} (or would have done if called). * @return The string. Ownership is not passed. The returned memory is not * guaranteed to exist beyond the next call to {@ref next}. */ virtual const char* get() const = 0; /** * Move to the next value. Behaviour is undefined if {@ref atEnd} returned * {@c false} (or would have done if called). */ virtual void next() = 0; }; #endif /* STRINGITERATOR_H_ */ stopmotion-0.8.0/src/technical/util.cpp000066400000000000000000000201121234321124500201250ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/technical/util.h" #include "src/technical/libng/grab-ng.h" #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; FileLinkException::FileLinkException(const char* message) { snprintf(msg, sizeof(msg) - 1, "link error: %s", message); msg[sizeof(msg) - 1] = '\0'; } const char* FileLinkException::what() const throw() { return msg; } DirectoryCreationException::DirectoryCreationException(const char* path) { snprintf(buffer, sizeof(buffer), "Failed to create directory (%s)", path); } const char* DirectoryCreationException::what() const throw() { return buffer; } namespace { void handleFileLinkError() { switch(errno) { case EACCES: // do not have permissions to write (maybe wrong file system type) case EXDEV: // cannot link across file systems case EMLINK: // too many links already // ...worth trying a different method. return; case EEXIST: throw FileLinkException("File already exists"); case ENOENT: throw FileLinkException("File does not exist to be linked to"); case ENOSPC: throw FileLinkException("Out of disk space"); case EPERM: throw FileLinkException("Permission denied"); case EROFS: throw FileLinkException("Cannot write to a read-only file system"); case EIO: throw FileLinkException("I/O error"); default: throw FileLinkException("unknown error"); } } int removeFileOrDirectory(const char *path, const struct stat *, int flag, struct FTW *info) { switch (flag) { case FTW_D: if (info->level != info->base) { if (0 != rmdir(path)) return FTW_STOP; } break; default: if (0 != unlink(path)) return FTW_STOP; break; } return FTW_CONTINUE; } const char* endOfArgument(const char* in) { enum CharClass { normalChar, backslashChar, squoteChar, dquoteChar, space }; enum State { normal, backslash, squote, dquote, dqbackslash, end } state = normal; /* transition[state][charClass] */ static const State transition[5][5] = { { normal, backslash, squote, dquote, end }, // normal { normal, normal, normal, normal, normal }, // backslash { squote, squote, normal, squote, squote }, // squote { dquote, dqbackslash, dquote, normal, dquote }, // dquote { dquote, dquote, dquote, dquote, dquote } // dqbackslash }; char c = *in; while (c != '\0' && state != end) { CharClass cc = c == '\\'? backslashChar : c == '\''? squoteChar : c == '"'? dquoteChar : c == ' '? space : normalChar; state = transition[state][cc]; ++in; c = *in; } return in; } } bool Util::checkCommand(std::string* pathOut, const char* command) { assert(command != 0); std::string which("which "); const char* commandEnd = endOfArgument(command); which.append(command, commandEnd); FILE *fp = popen(which.c_str(), "r"); __gnu_cxx::stdio_filebuf buf(fp, ios::in); istream bufStream(&buf); std::string dummy; if (!pathOut) pathOut = &dummy; *pathOut = ""; std::getline(bufStream, *pathOut); while (bufStream.good()) { std::getline(bufStream, dummy); } bool bad = bufStream.bad(); int status = pclose(fp); int exitStatus = WEXITSTATUS(status); return !bad && exitStatus < 2; } const vector Util::getGrabberDevices() { // Ensures ng_init() is called once static int count = 0; if (count++ == 0) { ng_init(); } vector devices; const struct ng_vid_driver *driver = 0; void *handle = 0; struct stat st; int fh = -1; int flags = -1; for (int i = 0; ng_dev.video_scan[i] != 0; ++i) { if (lstat(ng_dev.video_scan[i], &st) == -1) { if (errno == ENOENT) { continue; } #ifndef NO_DEBUG fprintf(stderr,"%s: %s\n",ng_dev.video_scan[i],strerror(errno)); #endif continue; } fh = open(ng_dev.video_scan[i], O_RDWR); if (fh == -1) { if (ENODEV == errno) { continue; } #ifndef NO_DEBUG fprintf(stderr,"%s: %s\n",ng_dev.video_scan[i],strerror(errno)); #endif continue; } close(fh); driver = ng_vid_open(ng_dev.video_scan[i], 0, 0, 0, &handle); if (driver == 0) { #ifndef NO_DEBUG fprintf(stderr,"%s: initialization failed\n",ng_dev.video_scan[i]); #endif continue; } flags = driver->capabilities(handle); if (flags & CAN_CAPTURE) { GrabberDevice d; d.device = ng_dev.video_scan[i]; if (driver->get_devname) { d.name = driver->get_devname(handle); } d.type = driver->name; devices.push_back(d); } driver->close(handle); } vector(devices).swap(devices); return devices; } bool Util::copyFile(const char *destFileName, const char *srcFileName) { assert(destFileName != 0); assert(srcFileName != 0); FILE *src = fopen(srcFileName, "rb"); if (!src) { fprintf(stderr, "Failed to open '%s' for reading: %s\n", srcFileName, strerror(errno)); return false; } FILE *dest = fopen(destFileName, "wb"); if (!dest) { fprintf(stderr, "Failed to open '%s' for writing: %s\n", destFileName, strerror(errno)); fclose (src); return false; } char buf[4096]; size_t bytesRead; while ((bytesRead = fread(buf, 1, sizeof(buf), src)) > 0) { if (fwrite(buf, 1, bytesRead, dest) != bytesRead) { fprintf (stderr, "Error while writing '%s': %s\n", destFileName, strerror(errno)); break; } } if (bytesRead == 0 && ferror(src)) fprintf(stderr, "Error while reading from file '%s': %s\n", srcFileName, strerror(errno)); fclose(src); fclose(dest); return true; } void Util::linkOrCopyFile(const char* newName, const char* oldName) { if (-1 == link(oldName, newName)) { handleFileLinkError(); if (-1 == symlink(oldName, newName)) { handleFileLinkError(); if (!Util::copyFile(newName, oldName)) throw FileLinkException("Could not copy file"); } } } bool Util::removeDirectoryContents(const char* path) { static const int maxDescripotorsToConsume = 8; return FTW_STOP != nftw(path, removeFileOrDirectory, maxDescripotorsToConsume, FTW_PHYS | FTW_DEPTH | FTW_ACTIONRETVAL); } void Util::ensurePathExists(const char* path) { if (0 == access(path, F_OK)) return; std::string copy(path); copy.c_str(); // ensure terminating '\0' char* parent = ©[0]; char* end = strrchr(parent, '/'); if (end && end[1] == '\0') { // there is a trailing '/', so let's remove it and try again. *end = '\0'; end = strrchr(parent, '/'); } if (end) { *end = '\0'; ensurePathExists(parent); if (mkdir(path, 0755) < 0) throw DirectoryCreationException(path); } else { throw DirectoryCreationException(path); } } stopmotion-0.8.0/src/technical/util.h000066400000000000000000000045151234321124500176030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef UTIL_H #define UTIL_H #include #include #include struct GrabberDevice { std::string device; std::string name; std::string type; }; class FileLinkException : public std::exception { char msg[100]; public: FileLinkException(const char* message); const char* what() const throw(); }; class DirectoryCreationException : public std::exception { char buffer[1024]; public: DirectoryCreationException(const char* path); const char* what() const throw(); }; class Util { public: static bool checkCommand(std::string* pathOut, const char* command); static const std::vector getGrabberDevices(); static bool copyFile(const char *destFileName, const char *srcFileName); static void linkOrCopyFile(const char *newName, const char* oldName); static bool removeDirectoryContents(const char* path); static void ensurePathExists(const char* path); }; #endif stopmotion-0.8.0/src/technical/video/000077500000000000000000000000001234321124500175565ustar00rootroot00000000000000stopmotion-0.8.0/src/technical/video/videoencoder.cpp000066400000000000000000000053111234321124500227300ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "src/technical/video/videoencoder.h" #include "src/technical/util.h" #include #include VideoEncoder::VideoEncoder() { startCommand = NULL; stopCommand = NULL; outputFile = NULL; } VideoEncoder::~ VideoEncoder() { delete [] startCommand; startCommand = NULL; delete [] stopCommand; stopCommand = NULL; delete [] outputFile; outputFile = NULL; } const char* VideoEncoder::getStartCommand() { return startCommand; } const char* VideoEncoder::getStopCommand() { return stopCommand; } const char * VideoEncoder::getOutputFile() { return outputFile; } void VideoEncoder::setStartCommand(const char* command) { if (startCommand) { delete [] startCommand; startCommand = NULL; } startCommand = new char[strlen(command) + 1]; strcpy(startCommand, command); } void VideoEncoder::setStopCommand(const char* command) { if (stopCommand) { delete [] stopCommand; stopCommand = NULL; } stopCommand = new char[strlen(command) + 1]; strcpy(stopCommand, command); } void VideoEncoder::setOutputFile(const char* file) { if (outputFile) { delete [] outputFile; outputFile = NULL; } outputFile = new char[strlen(file) + 1]; strcpy(outputFile, file); } bool VideoEncoder::isValid() { return Util::checkCommand(0, startCommand); } stopmotion-0.8.0/src/technical/video/videoencoder.h000066400000000000000000000060551234321124500224030ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2008 by Bjoern Erik Nilsen & Fredrik Berg Kjoelstad* * bjoern.nilsen@bjoernen.com & fredrikbk@hotmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef VIDEOENCODER_H #define VIDEOENCODER_H /** * Class for gathering information needed to export a stopmotion project to * a video file. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class VideoEncoder { public: VideoEncoder(); ~VideoEncoder(); /** * Gets the command line registered by the user in the preferences menu. * This is the command which should be used to start the encoder. * @return the start command */ const char* getStartCommand(); /** * Gets the command line registerd by the user in the preferences menu. * This is the command which should be used to stop the encoder. * @return the stop command */ const char* getStopCommand(); /** * Gets the output file generated by the encoder. * @return the output file */ const char* getOutputFile(); /** * Sets the start command to be used for starting the encoder and generate * a video file. * @param command the start command to be used for generating the video file */ void setStartCommand(const char* command); /** * Sets the stop command to be used for stopping the encoder. * @param command the stop command to be used in case the user want to * cancel the export */ void setStopCommand(const char* command); /** * Sets the file which should be genereated by the encoder. */ void setOutputFile(const char* file); /** * Checks if the registered encoder is a valid one. Checks if the encoder can * be excuted, the output file is a valid file etc. * @return true if valid, false otherwise */ bool isValid(); private: char *startCommand; char *stopCommand; char *outputFile; }; #endif stopmotion-0.8.0/src/technical/video/videofactory.cpp000066400000000000000000000073001234321124500227600ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "videofactory.h" #include "src/domain/animation/animationimpl.h" #include "src/presentation/frontends/frontend.h" #include "src/technical/util.h" #include "src/technical/video/videoencoder.h" #include "src/domain/filenamevisitor.h" #include "src/foundation/logger.h" #include "src/application/externalcommandwithtemporarydirectory.h" #include #include #include #include #include #include #include #include #include #include using namespace std; VideoFactory::VideoFactory(const AnimationImpl *animation, Frontend *frontend) : anim(animation), frontend(frontend) { } VideoFactory::~VideoFactory() { } class FileCopier : public FileNameVisitor { int index; const char* dir; public: FileCopier(const char* dirPath) : index(0), dir(dirPath) { } ~FileCopier() { } void visitImage(const char* p) { std::ostringstream ss; ss << dir << "/" << std::setw(6) << std::setfill('0') << index; std::string path = ss.str(); const char* ext = strrchr(p, '.'); if (ext) path.append(ext); Util::linkOrCopyFile(path.c_str(), p); ++index; } void visitSound(const char*) { } }; const char* VideoFactory::createVideoFile(VideoEncoder *encoder) { string startCommand = encoder->getStartCommand(); std::auto_ptr ec( new ExternalCommandWithTemporaryDirectory()); const char* tmpDir = ec->getTemporaryDirectoryPath(); if ( !startCommand.empty() ) { int index = startCommand.find("$IMAGEPATH"); if (index != -1) { startCommand.replace(index, strlen("$IMAGEPATH"), tmpDir); } index = startCommand.find("$VIDEOFILE"); if (index != -1) { if ( encoder->getOutputFile() ) { string outputFile = encoder->getOutputFile(); startCommand.replace(index, strlen("$VIDEOFILE"), outputFile); } else { return NULL; } } index = startCommand.find("$opt"); if (index != -1) { startCommand.replace(index, strlen("$opt"), ""); } Logger::get().logDebug("Copying frames into temporary directory %s", tmpDir); FileCopier copier(tmpDir); anim->accept(copier); sync(); ec->show(); ec->run(QString::fromLocal8Bit(startCommand.c_str())); ec.release(); return encoder->getOutputFile(); } return NULL; } stopmotion-0.8.0/src/technical/video/videofactory.h000066400000000000000000000045071234321124500224330ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2005-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef VIDEOFACTORY_H #define VIDEOFACTORY_H class Frontend; class VideoEncoder; class AnimationImpl; /** * Class for exporting a stopmotion project ccntaining images and sounds to * to a video file. * @author Bjoern Erik Nilsen & Fredrik Berg Kjoelstad */ class VideoFactory { public: /** * Objects of this class make a video file. * @param animation The animation to be turned into a video * @param frontend The frontend to display information to */ VideoFactory(const AnimationImpl *animation, Frontend *frontend); ~VideoFactory(); /** * Creates the video file based on the passed encoder. The encoder holds * information needed to complete the export. * @param encoder the encoder to be used for video export * @return path to the created video file */ const char* createVideoFile(VideoEncoder *encoder); private: const AnimationImpl *anim; Frontend *frontend; }; #endif stopmotion-0.8.0/src/test/000077500000000000000000000000001234321124500154755ustar00rootroot00000000000000stopmotion-0.8.0/src/test/.gitignore000066400000000000000000000000201234321124500174550ustar00rootroot00000000000000/test.gdb-index stopmotion-0.8.0/src/test/hash.cpp000066400000000000000000000053131234321124500171260ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "hash.h" #include Hash::Hash() { h = 5381; } void Hash::add(uint64_t n) { h = h * 33 + n; } void Hash::addS(int64_t n) { add(static_cast(n)); } void Hash::add(const char* string) { Hash s; while (*string) { s.add(static_cast(*string)); ++string; } add(s); } void Hash::add(Hash h) { add(h.h); } void Hash::add(FILE* fh) { Hash s; long fpos = ftell(fh); fseek(fh, 0, SEEK_SET); char buffer[256]; size_t r = 0; while (0 < (r = fread(buffer, 1, sizeof(buffer), fh))) { for (size_t i = 0; i != r; ++i) s.add(buffer[i]); } if (r == 0) { if (ferror(fh)) throw std::ios_base::failure("error reading file for hash"); } fseek(fh, fpos, SEEK_SET); add(s); } bool Hash::equals(const Hash& other) const { return h == other.h; } void Hash::appendTo(std::string& out) { out.reserve(out.length() + 16); for (int i = 60; i != 0; i -= 4) { int digit = (h >> i) & 0xF; if (digit < 10) out.append(1, '0' + digit); else out.append(1, 'A' - 10 + digit); } } bool operator==(const Hash& a, const Hash& b) { return a.equals(b); } bool operator!=(const Hash& a, const Hash& b) { return !a.equals(b); } Hash::Hash(const Hash& other) : h(other.h) { } Hash& Hash::operator=(const Hash& other) { h = other.h; return *this; } stopmotion-0.8.0/src/test/hash.h000066400000000000000000000055421234321124500165770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef HASH_H_ #define HASH_H_ #include #include #include class Executor; /** * Very simple hashing function by Professor Daniel J Bernstein. * @par * Use this to calculate hashes for @ref ModelTestHelper::HashModel. * @note * If your model has some sort of hierarchical structure, don't just add all * the leaf parts to the hash as this will fail to hash the structure. Instead, * hash each part and combine these parts into the whole's hash. For each * part's hash, hash each sub-part and combine the hashes together into the * part's hash. Using hashes recursively in this way will allow the structure * as well as its contents to be hashed. */ class Hash { uint64_t h; public: Hash(); Hash(const Hash&); Hash& operator=(const Hash&); void add(uint64_t n); void addS(int64_t n); void add(const char* string); void add(Hash h) /** * Add the contents of a file to the hash. * @param fh The file handle to the file (which must be open for reading). * The seek position will be reset afterwards if there is no error reading. */; void add(FILE* fh); bool equals(const Hash& other) const; /** * Appends the 16-character hex representation of the value of this hash to * the string. * @param out The string to be appended. */ void appendTo(std::string& out); }; bool operator==(const Hash& a, const Hash& b); bool operator!=(const Hash& a, const Hash& b); #endif /* HASH_H_ */ stopmotion-0.8.0/src/test/oomteststub.cpp000066400000000000000000000057301234321124500205760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "oomtestutil.h" namespace { typedef void setMallocsUntilFailure_t(int); typedef long mallocsSoFar_t(void); typedef void init_t(void); typedef void setMockFileSystem_t(MockableFileSystem*); init_t* init; setMallocsUntilFailure_t* smuf; mallocsSoFar_t* msf; setMockFileSystem_t* smfs; } MockableFileSystem::~MockableFileSystem() { } int loadOomTestUtil() { // Using dlopen might cause a malloc, which would not work when we have not // yet wired up the real malloc by calling Init, so we have to use // RTLD_DEFAULT. // RTLD_DEFAULT searches all the libraries in the order that they were // loaded in order to find the requested symbol. RTLD_NEXT begins the // search with the library after the one we are calling from. // RTLD_NEXT and RTLD_DEFAULT are only available with the GNU dl library; // standard C dl libraries do not have this functionality. if (!init) init = (init_t*)dlsym(RTLD_DEFAULT, "init"); if (!smuf) smuf = (setMallocsUntilFailure_t*)dlsym(RTLD_DEFAULT, "realSetMallocsUntilFailure"); if (!msf) msf = (mallocsSoFar_t*)dlsym(RTLD_DEFAULT, "realMallocsSoFar"); if (!smfs) smfs = (setMockFileSystem_t*)dlsym(RTLD_DEFAULT, "realSetMockFileSystem"); if (!init || !smuf || !msf || !smfs) return 0; init(); return 1; } void setMallocsUntilFailure(int successes) { if (smuf) smuf(successes); } void cancelAnyMallocFailure() { if (smuf) smuf(-1); } long mallocsSoFar() { if (msf) return msf(); return 0; } void setMockFileSystem(MockableFileSystem* mfs) { if (smfs) smfs(mfs); } stopmotion-0.8.0/src/test/oomtestutil.cpp000066400000000000000000000212641234321124500205760ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include "oomtestutil.h" // make malloc_t a type alias for the type of the malloc function. Now we can // declare a pointer to a malloc function with something like: // malloc_t* mallocFnPtr; typedef void* malloc_t (size_t); extern "C" { malloc_t malloc; void init(); void realSetMallocsUntilFailure(int); long realMallocsSoFar(); void realSetMockFileSystem(MockableFileSystem* mfs); FILE* fopen(const char* filename, const char* mode); FILE* freopen(const char* filename, const char* mode, FILE* fh); int fclose(FILE* fh); int fflush(FILE* fh); size_t fread(void *out, size_t s, size_t n, FILE *fh); size_t fwrite(const void *in, size_t s, size_t n, FILE *fh); int access(const char *name, int type); int ferror(FILE* fh); int unlink(const char *name); int ov_test(FILE *, OggVorbis_File *, const char *, long); int ov_clear(OggVorbis_File *vf); int ov_open(FILE *f,OggVorbis_File *vf,const char *initial, long ibytes); long ov_read(OggVorbis_File *vf,char *buffer,int length, int bigendianp,int word,int sgned,int *bitstream); char *getenv(const char *name); } // Which future malloc should return 0 instead of attempting to allocate memory long mallocsUntilFailure; long mallocCount; // Pointer to the original libc malloc function, set up by Init(). malloc_t* realMalloc; // Pointer to the facade of the file system, set up by Init(). MockableFileSystem* realFs; // Pointer to the mock file system if requested, or the facade to the real file // system if not. MockableFileSystem* requiredFs; MockableFileSystem::~MockableFileSystem() { } class RealFileSystem : public MockableFileSystem { typedef FILE* fopen_t(const char*, const char*); typedef FILE* freopen_t(const char*, const char*, FILE*); typedef int fclose_t(FILE*); typedef int fflush_t(FILE*); typedef size_t fread_t(void *, size_t, size_t, FILE*); typedef size_t fwrite_t(const void*, size_t, size_t, FILE*); typedef int access_t(const char*, int); typedef int ferror_t(FILE*); typedef int unlink_t(const char *); typedef int ov_test_t(FILE *, OggVorbis_File *, const char *, long); typedef int ov_clear_t(OggVorbis_File *); typedef int ov_open_t(FILE *, OggVorbis_File *, const char *, long); typedef long ov_read_t(OggVorbis_File *, char *, int, int, int, int ,int *); typedef char *getenv_t(const char *name); fopen_t* rfopen; freopen_t* rfreopen; fclose_t* rfclose; fflush_t* rfflush; fread_t* rfread; fwrite_t* rfwrite; access_t* raccess; ferror_t* rferror; unlink_t* runlink; ov_test_t* rov_test; ov_clear_t* rov_clear; ov_open_t* rov_open; ov_read_t* rov_read; getenv_t* rgetenv; public: RealFileSystem() : rfopen(0), rfreopen(0), rfclose(0), rfflush(0), rfread(0), rfwrite(0), raccess(0), rferror(0), rov_test(0), rov_clear(0), rov_open(0), rov_read(0), rgetenv(0) { rfopen = (fopen_t*)dlsym(RTLD_NEXT, "fopen"); assert(rfopen); rfreopen = (freopen_t*)dlsym(RTLD_NEXT, "freopen"); assert(rfreopen); rfclose = (fclose_t*)dlsym(RTLD_NEXT, "fclose"); assert(rfclose); rfflush = (fflush_t*)dlsym(RTLD_NEXT, "fflush"); assert(rfflush); rfread = (fread_t*)dlsym(RTLD_NEXT, "fread"); assert(rfread); rfwrite = (fwrite_t*)dlsym(RTLD_NEXT, "fwrite"); assert(rfwrite); raccess = (access_t*)dlsym(RTLD_NEXT, "access"); assert(raccess); rferror = (ferror_t*)dlsym(RTLD_NEXT, "ferror"); assert(rferror); runlink = (unlink_t*)dlsym(RTLD_NEXT, "unlink"); assert(runlink); rov_test = (ov_test_t*)dlsym(RTLD_NEXT, "ov_test"); assert(rov_test); rov_clear = (ov_clear_t*)dlsym(RTLD_NEXT, "ov_clear"); assert(rov_clear); rov_open = (ov_open_t*)dlsym(RTLD_NEXT, "ov_open"); assert(rov_open); rov_read = (ov_read_t*)dlsym(RTLD_NEXT, "ov_read"); assert(rov_read); rgetenv = (getenv_t*)dlsym(RTLD_NEXT, "getenv"); assert(rgetenv); } ~RealFileSystem() { } void setDelegate(MockableFileSystem*) { } FILE* fopen(const char* filename, const char* mode) { return rfopen(filename, mode); } FILE* freopen(const char* filename, const char* mode, FILE* fh) { return rfreopen(filename, mode, fh); } int fclose(FILE* fh) { return rfclose(fh); } int fflush(FILE* fh) { return rfflush(fh); } size_t fread(void *out, size_t s, size_t n, FILE *fh) { return rfread(out, s, n, fh); } size_t fwrite(const void *in, size_t s, size_t n, FILE *fh) { return rfwrite(in, s, n, fh); } int access(const char *name, int type) { return raccess(name, type); } int ferror(FILE* fh) { return rferror(fh); } int unlink(const char *name) { return runlink(name); } int ov_test(FILE *f, OggVorbis_File *vf, const char *initial, long ibytes) { return rov_test(f, vf, initial, ibytes); } int ov_clear(OggVorbis_File *vf) { return rov_clear(vf); } int ov_open(FILE *f,OggVorbis_File *vf,const char *initial, long ibytes) { return rov_open(f, vf, initial, ibytes); } long ov_read(OggVorbis_File *vf,char *buffer,int length, int bigendianp,int word,int sgned,int *bitstream) { return rov_read(vf, buffer, length, bigendianp, word, sgned, bitstream); } char *getenv(const char *name) { return rgetenv(name); } }; // Initialization function sets up the pointer to the original malloc function. void init() { if (!realMalloc) { realMalloc = (malloc_t*)dlsym(RTLD_NEXT, "malloc"); assert(realMalloc); } if (!realFs) { realFs = new RealFileSystem(); assert(realFs); requiredFs = realFs; } } // Our malloc does its own processing, then calls the libc malloc, if // applicable. void* malloc(size_t bytes) { __sync_add_and_fetch(&mallocCount, 1); if (0 < mallocsUntilFailure && 0 == __sync_sub_and_fetch(&mallocsUntilFailure, 1)) return 0; if (!realMalloc) init(); return realMalloc(bytes); } void realSetMallocsUntilFailure(int successes) { mallocsUntilFailure = successes + 1; } long realMallocsSoFar() { return mallocCount; } void realSetMockFileSystem(MockableFileSystem* mfs) { if (mfs) { mfs->setDelegate(realFs); requiredFs = mfs; } else { requiredFs = realFs; } } FILE* fopen(const char* filename, const char* mode) { return requiredFs->fopen(filename, mode); } FILE* freopen(const char* filename, const char* mode, FILE* fh) { return requiredFs->freopen(filename, mode, fh); } int fclose(FILE* fh) { return requiredFs->fclose(fh); } int fflush(FILE* fh) { return requiredFs->fflush(fh); } size_t fread(void *out, size_t s, size_t n, FILE *fh) { return requiredFs->fread(out, s, n, fh); } size_t fwrite(const void *in, size_t s, size_t n, FILE *fh) { return requiredFs->fwrite(in, s, n, fh); } int access(const char *name, int type) { return requiredFs->access(name, type); } int ferror(FILE* fh) { return requiredFs->ferror(fh); } int unlink(const char *name) { return requiredFs->unlink(name); } int ov_test(FILE *f, OggVorbis_File *vf, const char *initial, long ibytes) { return requiredFs->ov_test(f, vf, initial, ibytes); } int ov_clear(OggVorbis_File *vf) { return requiredFs->ov_clear(vf); } int ov_open(FILE *f,OggVorbis_File *vf,const char *initial, long ibytes) { return requiredFs->ov_open(f, vf, initial, ibytes); } long ov_read(OggVorbis_File *vf,char *buffer,int length, int bigendianp,int word,int sgned,int *bitstream) { return requiredFs->ov_read(vf, buffer, length, bigendianp, word, sgned, bitstream); } char *getenv(const char *name) { if (!requiredFs) init(); return requiredFs->getenv(name); } stopmotion-0.8.0/src/test/oomtestutil.h000066400000000000000000000075541234321124500202510ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OOMTESTUTIL_H_ #define OOMTESTUTIL_H_ // sadly, can't simply forward-declare FILE #include struct OggVorbis_File; /** * Interface class for mock file systems, and the facade for the real file * system. */ class MockableFileSystem { public: virtual ~MockableFileSystem(); virtual void setDelegate(MockableFileSystem* mfs) = 0; virtual FILE* fopen(const char* filename, const char* mode) = 0; virtual FILE* freopen(const char* filename, const char* mode, FILE* fh) = 0; virtual int fclose(FILE*) = 0; virtual int fflush(FILE*) = 0; virtual size_t fread (void *out, size_t blockSize, size_t blockCount, FILE *fh) = 0; virtual size_t fwrite (const void *in, size_t blockSize, size_t blockCount, FILE *fh) = 0; virtual int access (const char *name, int type) = 0; virtual int ferror(FILE*) = 0; virtual int unlink(const char *name) = 0; // unfortunately, ov_test segfaults if memory allocation fails. Until this // is fixed, we need to mock ov_test virtual int ov_test(FILE *f, OggVorbis_File *vf, const char *initial, long ibytes) = 0; virtual int ov_clear(OggVorbis_File *vf) = 0; virtual int ov_open(FILE *f,OggVorbis_File *vf,const char *initial, long ibytes) = 0; virtual long ov_read(OggVorbis_File *vf,char *buffer,int length, int bigendianp,int word,int sgned,int *bitstream) = 0; virtual char* getenv(const char *name) = 0; }; extern "C" { /** * Installs the SetMallocsUntilFailure function. * Returns 1 on success, 0 on failure. * @ref SetMallocsUntilFailure will not work unless this function has been * called and has returned 1. */ int loadOomTestUtil(); /** * Sets the number of successful memory allocations until one will fail. * Will not work unless @ref LoadOomTestUtil has been called and returned 1. */ void setMallocsUntilFailure(int successes); /** * Sets that there will be no artificial memory allocation failures. */ void cancelAnyMallocFailure(); /** * Returns a counter of the number of (successful or unsuccessful) calls to * @c malloc so far. Will not work unless @ref LoadOomTestUtil has been called * and returned 1. */ long mallocsSoFar(); /** * Sets the mock file system object. * @param mfs The object to use as the mock file system. {@c setDelegate} will * be called on {@a mfs} with an object representing the real versions of these * functions which can be used as a delegate. */ void setMockFileSystem(MockableFileSystem* mfs); } #endif stopmotion-0.8.0/src/test/oomtestutil.mak000066400000000000000000000013111234321124500205530ustar00rootroot00000000000000SLIB=oomtestutil.so STUB=oomteststub.o ALL_PRODUCTS=$(SLIB) $(STUB) all: $(ALL_PRODUCTS) clean: rm $(ALL_PRODUCTS) # -ldl sets the dl library as a dependency of oomtestutil.so. This library # contains dlsym(). # Utility library must be in a -shared object for LD_PRELOAD to be able to # load it at all. $(SLIB): oomtestutil.cpp g++ -D_GNU_SOURCE -g -fPIC -shared -o $@ $< -ldl # We shall produce an object file that must be linked into any executable that # wants to use our OOM testing utility. The executable must also be linked with # -ldl. Object files do not allow us to specify dependencies, so using -ldl # here does not help. $(STUB): oomteststub.cpp oomtestutil.h g++ -D_GNU_SOURCE -g -c -o $@ $< stopmotion-0.8.0/src/test/resources/000077500000000000000000000000001234321124500175075ustar00rootroot00000000000000stopmotion-0.8.0/src/test/resources/click.ogg000066400000000000000000000077511234321124500213040ustar00rootroot00000000000000OggS.IvorbisDwOggSzX==vorbis-Xiph.Org libVorbis I 20101101 (Schaufenugget)vorbis)BCV1L ŀАU`$)fI)(yHI)0c1c1c 4d( Ij9g'r9iN8 Q9 &cnkn)% Y@H!RH!b!b!r!r * 2 L2餓N:騣:(B -JL1Vc]|s9s9s BCV BdB!R)r 2ȀАU GI˱$O,Q53ESTMUUUUu]Wvevuv}Y[}Y[؅]aaaa}}} 4d #9)"9d ")Ifjihm˲,˲ iiiiiiifYeYeYeYeYeYeYeYeYeYeYeYeY@h*@@qq$ER$r, Y@R,r4Gs4s{sB8s9s9sАUA6q HEiȤݣ$h r GR TI) 4d!RH!RH!R!b) *2,2,2밳:0C KMXckZiJ)RJ) YdAF!R!r)BCVU}SvteׅYn]8u}amXeY9~Xet]_XmVY_}xu]n̺ mc}Yf_w:㩪+ , Ƴ, *±,j°ڶ1ܾn,pk1Qu|_x tu]yf]utG8~@!+8$dY(Y(躢hiiiZgi),iiZfhk)˦jʲi캲mlۢiʲil,ۮ꺤Yyijgjʲiyjzh(j,[g試'j*˦ڲilmmim-jۮ,ۺ/iijg癦il+[(扦j,ʖ癪'ꉞk*˦jڪil-*ˮmʲnljjʲl˾ʪ)˦ڲi-۲˲iʲim.˲mlhm-*۲-,ۺʮo-p0l+ۺo2}DӔeS5mTUYvee}4m[UU[6MնeY}Yma4M6UUMմmYmaeveٷe[uוu_}e溲˲p p0 a1R9Q9 dA!9!92 RZ !Rk8ؠ)8@!+TX癢jڲcI'H牢im['牢ih뺺.뺲+릪ʮ,ª+˲m°ʲl۶oܺ‘.1 G @6pR4XhJ 0!B!RJ!0`B(4dE'C)RJ)RJ)RJ)RJ)RJ)RH)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)R pz0 HQJ)Ɯ1cI()b9RRi-9!RmsRZ13礤[9RRkVk5ZZ5לs͹k9לs1לs9s9s48ذ:IX`!+Ts9R9"s9!T9tBs9!9B!s: BBA!J(!B!:!B!B!RJ!B P`@ #R΄AA AQ3 BL9љbNj3S9tjA^2  (B1A U DDH.\]BBX@ 88'ST ""8>*,.02468:<@OggS5+4) \Yg(+@HNw3V92ozTayv)U)цՕIgr$M?gG'Q~DO?2tI?/O[R:#sy$Df|s1|% v{sB8s9s9sАUA6q HEiȤݣ$h r GR TI) 4d!RH!RH!R!b) *2,2,2밳:0C KMXckZiJ)RJ) YdAF!R!r)BCVU}SvteׅYn]8u}amXeY9~Xet]_XmVY_}xu]n̺ mc}Yf_w:㩪+ , Ƴ, *±,j°ڶ1ܾn,pk1Qu|_x tu]yf]utG8~@!+8$dY(Y(躢hiiiZgi),iiZfhk)˦jʲi캲mlۢiʲil,ۮ꺤Yyijgjʲiyjzh(j,[g試'j*˦ڲilmmim-jۮ,ۺ/iijg癦il+[(扦j,ʖ癪'ꉞk*˦jڪil-*ˮmʲnljjʲl˾ʪ)˦ڲi-۲˲iʲim.˲mlhm-*۲-,ۺʮo-p0l+ۺo2}DӔeS5mTUYvee}4m[UU[6MնeY}Yma4M6UUMմmYmaeveٷe[uוu_}e溲˲p p0 a1R9Q9 dA!9!92 RZ !Rk8ؠ)8@!+TX癢jڲcI'H牢im['牢ih뺺.뺲+릪ʮ,ª+˲m°ʲl۶oܺ‘.1 G @6pR4XhJ 0!B!RJ!0`B(4dE'C)RJ)RJ)RJ)RJ)RJ)RH)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)R pz0 HQJ)Ɯ1cI()b9RRi-9!RmsRZ13礤[9RRkVk5ZZ5לs͹k9לs1לs9s9s48ذ:IX`!+Ts9R9"s9!T9tBs9!9B!s: BBA!J(!B!:!B!B!RJ!B P`@ #R΄AA AQ3 BL9љbNj3S9tjA^2  (B1A U DDH.\]BBX@ 88'ST ""8>*,.02468:<@OggS{sB8s9s9sАUA6q HEiȤݣ$h r GR TI) 4d!RH!RH!R!b) *2,2,2밳:0C KMXckZiJ)RJ) YdAF!R!r)BCVU}SvteׅYn]8u}amXeY9~Xet]_XmVY_}xu]n̺ mc}Yf_w:㩪+ , Ƴ, *±,j°ڶ1ܾn,pk1Qu|_x tu]yf]utG8~@!+8$dY(Y(躢hiiiZgi),iiZfhk)˦jʲi캲mlۢiʲil,ۮ꺤Yyijgjʲiyjzh(j,[g試'j*˦ڲilmmim-jۮ,ۺ/iijg癦il+[(扦j,ʖ癪'ꉞk*˦jڪil-*ˮmʲnljjʲl˾ʪ)˦ڲi-۲˲iʲim.˲mlhm-*۲-,ۺʮo-p0l+ۺo2}DӔeS5mTUYvee}4m[UU[6MնeY}Yma4M6UUMմmYmaeveٷe[uוu_}e溲˲p p0 a1R9Q9 dA!9!92 RZ !Rk8ؠ)8@!+TX癢jڲcI'H牢im['牢ih뺺.뺲+릪ʮ,ª+˲m°ʲl۶oܺ‘.1 G @6pR4XhJ 0!B!RJ!0`B(4dE'C)RJ)RJ)RJ)RJ)RJ)RH)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJRJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)RJ)R pz0 HQJ)Ɯ1cI()b9RRi-9!RmsRZ13礤[9RRkVk5ZZ5לs͹k9לs1לs9s9s48ذ:IX`!+Ts9R9"s9!T9tBs9!9B!s: BBA!J(!B!:!B!B!RJ!B P`@ #R΄AA AQ3 BL9љbNj3S9tjA^2  (B1A U DDH.\]BBX@ 88'ST ""8>*,.02468:<@OggSx˗p!=a1s9$ s}+ndcT?Ctv ۛ6 [&y-xބu mX_W<7ׁ Upۛn.Pstopmotion-0.8.0/src/test/resources/sound3.ogg000066400000000000000000000102031234321124500214140ustar00rootroot00000000000000OggS@TqvorbisDwOggS@@ (L=vorbis-Xiph.Org libVorbis I 20101101 (Schaufenugget)vorbis)BCV1L ŀАU`$)fI)(yHI)0c1c1c 4d( Ij9g'r9iN8 Q9 &cnkn)% Y@H!RH!b!b!r!r * 2 L2餓N:騣:(B -JL1Vc]|s9s9s BCV BdB!R)r 2ȀАU GI˱$O,Q53ESTMUUUUu]Wvevuv}Y[}Y[؅]aaaa}}} 4d #9)"9d ")Ifjihm˲,˲ iiiiiiifYeYeYeYeYeYeYeYeYeYeYeYeY@h*@@qq$ER$r, Y@R,r4Gs4s namespace { const char* TestPath1 = "1"; const char* TestPath2 = "2"; const char* TestPath3 = "3"; const char* TestPath4 = "4"; } const char* TestLoader::lastFreed; const char* TestLoader::lastLoaded; int TestLoader::freeCount; TestCache::TestCache() : cache(0) { cache = new LoadCache(3); } TestCache::~TestCache() { delete cache; } void TestCache::gettingTwiceReturnsSameInstance() { cache->clear(); TestLoader::lastLoaded = 0; const char* r = cache->get(TestPath1); QVERIFY2(TestLoader::lastLoaded == TestPath1, "Did not load"); QVERIFY2(r == TestPath1, "Did not get the correct value"); TestLoader::lastLoaded = 0; r = cache->get(TestPath1); QVERIFY2(TestLoader::lastLoaded == 0, "Loaded item that should have been cache-resident"); QVERIFY2(r == TestPath1, "Did not get the correct value"); } void TestCache::leastRecentlyUsedIsFreed() { cache->clear(); cache->get(TestPath1); cache->get(TestPath2); cache->get(TestPath3); TestLoader::lastFreed = 0; cache->get(TestPath4); QVERIFY2(TestLoader::lastFreed == TestPath1, "Least Recently Used not freed"); TestLoader::lastFreed = 0; cache->get(TestPath2); QVERIFY2(TestLoader::lastFreed == 0, "Freed when requested item should have been cache-resident"); TestLoader::lastFreed = 0; cache->get(TestPath1); QVERIFY2(TestLoader::lastFreed == TestPath3, "Least Recently Used not freed"); } void TestCache::clearFrees() { cache->clear(); cache->get(TestPath1); cache->get(TestPath2); cache->get(TestPath3); TestLoader::freeCount = 0; cache->clear(); QCOMPARE(TestLoader::freeCount, 3); cache->get(TestPath2); TestLoader::lastFreed = 0; TestLoader::freeCount = 0; cache->clear(); QCOMPARE(TestLoader::freeCount, 1); QVERIFY2(TestLoader::lastFreed == TestPath2, "clear() did not free resident item"); } void TestCache::dropFrees() { cache->clear(); cache->get(TestPath1); cache->get(TestPath2); cache->get(TestPath3); TestLoader::lastFreed = 0; TestLoader::freeCount = 0; cache->drop(TestPath2); QCOMPARE(TestLoader::freeCount, 1); QVERIFY2(TestLoader::lastFreed == TestPath2, "drop() did not free the correct item"); TestLoader::lastFreed = 0; TestLoader::freeCount = 0; cache->drop(TestPath2); QCOMPARE(TestLoader::freeCount, 0); } void TestCache::droppedItemMustBeReloaded() { cache->clear(); cache->get(TestPath1); cache->get(TestPath2); cache->get(TestPath3); cache->drop(TestPath2); TestLoader::lastLoaded = 0; const char* r = cache->get(TestPath2); QVERIFY2(TestLoader::lastLoaded == TestPath2, "Did not load previously dropped item"); QVERIFY2(r == TestPath2, "Did not get the correct value"); } stopmotion-0.8.0/src/test/tcache.h000066400000000000000000000041121234321124500170730ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TCACHE_H_ #define TCACHE_H_ #include struct TestLoader { typedef const char value_t; static value_t* lastFreed; static value_t* lastLoaded; static int freeCount; static value_t* load(const char* p) { lastLoaded = p; return p; } static void free(value_t* p) { lastFreed = p; ++freeCount; } }; template class LoadCache; class TestCache : public QObject { Q_OBJECT LoadCache* cache; public: TestCache(); ~TestCache(); private slots: void gettingTwiceReturnsSameInstance(); void leastRecentlyUsedIsFreed(); void clearFrees(); void dropFrees(); void droppedItemMustBeReloaded(); }; #endif stopmotion-0.8.0/src/test/test.pro000066400000000000000000000104131234321124500171750ustar00rootroot00000000000000TEMPLATE = app QT += core CONFIG += qtestlib debug HEADERS += ../domain/undo/filelogger.h \ ../domain/undo/command.h \ ../domain/undo/commandlogger.h \ ../domain/undo/executor.h \ ../domain/undo/addallcommands.h \ ../presentation/loadcache.h \ ../domain/undo/commandadd.h \ ../domain/undo/commandmove.h \ ../domain/undo/commandremove.h \ ../domain/undo/commandsetimage.h \ ../domain/undo/commandaddsound.h \ ../domain/undo/commandrenamesound.h \ ../domain/undo/commandremovesound.h \ ../domain/undo/commandaddscene.h \ ../domain/undo/commandmovescene.h \ ../domain/undo/commandremovescene.h \ ../domain/undo/addallcommands.h\ ../domain/animation/scene.h \ ../domain/animation/frame.h \ ../domain/animation/sound.h \ ../domain/animation/animation.h \ ../domain/animation/animationimpl.h \ ../domain/animation/scenevector.h \ ../domain/animation/workspacefile.h \ ../technical/audio/oggvorbis.h \ ../technical/util.h \ ../technical/stringiterator.h \ ../technical/libng/grab-ng.h \ ../technical/libng/struct-v4l.h \ ../technical/libng/struct-v4l2.h \ ../technical/libng/devices.h \ ../technical/libng/struct-dump.h \ ../technical/video/videofactory.h \ ../technical/video/videoencoder.h \ ../technical/audio/ossdriver.h \ ../technical/projectserializer.h \ ../domain/observernotifier.h \ ../application/externalcommandwithtemporarydirectory.h \ ../application/externalcommand.h \ ../foundation/logger.h HEADERS += texecutor.h \ tcache.h \ oomtestutil.h \ testundo.h \ hash.h \ tstopmotionundo.h SOURCES += ../domain/undo/filelogger.cpp \ ../domain/undo/command.cpp \ ../domain/undo/commandlogger.cpp \ ../domain/undo/executor.cpp \ ../domain/undo/addallcommands.cpp \ ../domain/undo/random.cpp \ ../domain/undo/commandadd.cpp \ ../domain/undo/commandmove.cpp \ ../domain/undo/commandremove.cpp \ ../domain/undo/commandsetimage.cpp \ ../domain/undo/commandaddsound.cpp \ ../domain/undo/commandrenamesound.cpp \ ../domain/undo/commandremovesound.cpp \ ../domain/undo/commandaddscene.cpp \ ../domain/undo/commandmovescene.cpp \ ../domain/undo/commandremovescene.cpp \ ../domain/animation/scene.cpp \ ../domain/animation/frame.cpp \ ../domain/animation/sound.cpp \ ../domain/animation/animation.cpp \ ../domain/animation/animationimpl.cpp \ ../domain/animation/scenevector.cpp \ ../domain/animation/workspacefile.cpp \ ../technical/audio/oggvorbis.cpp \ ../technical/audio/audioformat.cpp \ ../technical/util.cpp \ ../technical/stringiterator.cpp \ ../technical/libng/grab-ng.c \ ../technical/libng/struct-v4l.c \ ../technical/libng/struct-v4l2.c \ ../technical/libng/plugins/drv0-v4l2.c \ ../technical/libng/plugins/drv1-v4l.c \ ../technical/libng/devices.c \ ../technical/libng/struct-dump.c \ ../technical/video/videofactory.cpp \ ../technical/video/videoencoder.cpp \ ../technical/audio/ossdriver.cpp \ ../technical/projectserializer.cpp \ ../domain/observernotifier.cpp \ ../application/externalcommandwithtemporarydirectory.cpp \ ../application/externalcommand.cpp \ ../foundation/logger.cpp SOURCES += \ tmain.cpp \ texecutor.cpp \ tcache.cpp \ testundo.cpp \ hash.cpp \ tstopmotionundo.cpp FORMS += RESOURCES += INCLUDEPATH += ../.. \ $$system(xml2-config --cflags | sed -e 's/-I//g') oomteststub.target = oomteststub.o oomteststub.commands = make -f oomtestutil.mak oomteststub.o oomteststub.depends = oomteststub.cpp oomtestutil.h oomtestutil.target = oomtestutil.so oomtestutil.commands = make -f oomtestutil.mak oomtestutil.so oomtestutil.depends = oomtestutil.cpp QMAKE_EXTRA_TARGETS += oomtestutil oomteststub test QMAKE_CLEAN += oomteststub.o oomtestutil.so PRE_TARGETDEPS = oomteststub.o LIBS += oomteststub.o -ldl \ $$system(sdl-config --libs) \ $$system(xml2-config --libs) \ -lSDL_image -ltar -lvorbisfile -lX11 DESTDIR=. release:OBJECTS_DIR=build/release release:TARGET = test debug:OBJECTS_DIR=build/debug debug:TARGET = test-d MOC_DIR = build RCC_DIR = build UI_DIR = build test.target=test test.commands=LD_PRELOAD=./oomtestutil.so ./test-d test.depends=oomtestutil.so test-d stopmotion-0.8.0/src/test/testundo.cpp000066400000000000000000000372111234321124500200520ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "testundo.h" #include "oomtestutil.h" #include "src/domain/undo/executor.h" #include "src/domain/undo/commandlogger.h" #include "src/domain/undo/filelogger.h" #include "src/domain/undo/random.h" #include #include #include #include #include class StringLoggerWrapper: public CommandLogger { CommandLogger* delegate; std::string* out; public: StringLoggerWrapper(std::string* output) : delegate(0), out(output) { } /** * Create a logger that writes to a std::string and also passes writes * along to @a wrapped. * @param wrapped Ownership is not passed. * @param output The string to be logged to. Ownership is not passed. */ StringLoggerWrapper(std::string* output, CommandLogger* wrapped) : delegate(wrapped), out(output) { } StringLoggerWrapper(const StringLoggerWrapper&); // unimplemented StringLoggerWrapper& operator=(const StringLoggerWrapper&); // unimplemented ~StringLoggerWrapper() { } void setOutputString(std::string* output) { out = output; } void writeCommand(const char* command) { if (out) { out->append(command); out->append(1, '\n'); } if (delegate) delegate->writeCommand(command); } void commandComplete() { if (delegate) delegate->commandComplete(); } void undoComplete() { out->append("--undo---\n"); if (delegate) delegate->undoComplete(); } void redoComplete() { out->append("--redo---\n"); if (delegate) delegate->redoComplete(); } void setDelegate(CommandLogger* newLogger) { delegate = newLogger; } }; ModelTestHelper::~ModelTestHelper() { } // runs a part of the test measuring the mallocs and logging the activity class ExecutorStep { static int failures; long mallocCount; ExecutorStep* previous; std::string log[2]; StringLoggerWrapper stringLogger; RandomSource final; void setup(Executor& e, CommandLogger* logger, int whichLog) { cancelAnyMallocFailure(); log[whichLog].clear(); stringLogger.setOutputString(&log[whichLog]); stringLogger.setDelegate(logger); e.setCommandLogger(&stringLogger); } int activeLog; void finishRun(long mallocsAtStart, RandomSource& rng) { long end = mallocsSoFar(); mallocCount = end - mallocsAtStart; final = rng; } /** * Runs the step. Sets malloc count and log. */ void run(Executor& e, RandomSource& rng, int whichLog) { activeLog = whichLog; if (previous) previous->run(e, rng, whichLog); setup(e, logger(), whichLog); long start = mallocsSoFar(); try { doStep(e, rng); } catch(...) { finishRun(start, rng); throw; } finishRun(start, rng); } public: int getCurrentlyActiveLog() const { return activeLog; } ExecutorStep* getPrevious() const { return previous; } RandomSource finalRng() const { return final; } static int failureCount() { return failures; } ExecutorStep(ExecutorStep* following) : mallocCount(0), previous(following), stringLogger(&log[0]), activeLog(0) { } virtual ~ExecutorStep() { } virtual const char* name() const = 0; virtual void doStep(Executor& e, RandomSource& rng) = 0; virtual CommandLogger* logger() { return 0; } virtual void cleanup() { } virtual void appendCommandLog(std::string& out, int which) const { out.append(log[which]); } void getLog(std::string& out, int which) const { if (previous) previous->getLog(out, which); out.append(";\n"); out.append(name()); out.append(": "); appendCommandLog(out, which); } long getMallocCount() const { return mallocCount; } /** * Runs this series of steps and {@a other} and tests the results against * one another. {@a other} is run first. */ void runAndCheck(const char* name, ExecutorStep& other, Executor& executor, ModelTestHelper& helper, RandomSource rng, int testNum) { RandomSource r2 = rng; try { other.run(executor, rng, 0); } catch (std::exception& e) { other.cleanup(); std::string log; other.getLog(log, 0); std::ostringstream ss; ss << "Failed to run 'other' step in test '" << name << "' on iteration " << testNum << "\nSuccessful log:" << log; std::string s = ss.str(); QFAIL(s.c_str()); } other.cleanup(); Hash h = helper.hashModel(executor); try { run(executor, r2, 1); } catch (std::exception& e) { cleanup(); std::string logS1; other.getLog(logS1, 0); std::string logS2; getLog(logS2, 0); std::ostringstream ss; ss << "Failed to run 'this' step in test '" << name << "' on iteration " << testNum << "\nOther log:" << logS1 << "\nSuccessful portion of 'this' log:" << logS2; std::string s = ss.str(); QFAIL(s.c_str()); } cleanup(); Hash h2 = helper.hashModel(executor); if (h != h2) { ++failures; std::string logS1; other.getLog(logS1, 0); std::string logS2; getLog(logS2, 1); std::ostringstream ss; ss << "Failed test '" << name << "' on iteration " << testNum << "\nTesting:" << logS1 << "\nAgainst:" << logS2; std::string s = ss.str(); QFAIL(s.c_str()); } } }; int ExecutorStep::failures = 0; /** * Can only be run successfully if the delegate has already been run. */ class FailingStep : public ExecutorStep { ExecutorStep* del; std::string nameString; bool fail; int totalFails; int noMallocsToFailCount; public: FailingStep(ExecutorStep* delegate) : ExecutorStep(delegate? delegate->getPrevious() : 0), del(delegate), nameString("failing "), fail(false), totalFails(0), noMallocsToFailCount(0) { nameString.append(del->name()); nameString.c_str(); } const char* name() const { return nameString.c_str(); } CommandLogger* logger() { return del->logger(); } bool failed() const { return fail; } int failedCount() const { return totalFails; } int noMallocsCount() const { return noMallocsToFailCount; } void doStep(Executor& e, RandomSource& rng) { fail = false; long mallocCount = del->getMallocCount(); if (mallocCount < 1) { del->doStep(e, rng); ++noMallocsToFailCount; return; } int muf = rng.getUniform(mallocCount - 1); setMallocsUntilFailure(muf); try { del->doStep(e, rng); } catch(...) { fail = true; ++totalFails; } cancelAnyMallocFailure(); } void cleanup() { del->cleanup(); } }; class ExecutorInit : public ExecutorStep { ModelTestHelper& mth; public: ExecutorInit(ModelTestHelper& helper) : ExecutorStep(0), mth(helper) { } const char* name() const { return "initialize"; } void doStep(Executor& e, RandomSource&) { mth.resetModel(e); } }; class ExecutorConstruct : public ExecutorStep { public: ExecutorConstruct(ExecutorStep* following) : ExecutorStep(following) { } const char* name() const { return "constructive commands"; } void doStep(Executor& e, RandomSource& rng) { e.executeRandomConstructiveCommands(rng); } }; class ClearHistory : public ExecutorStep { public: ClearHistory(ExecutorStep* following) : ExecutorStep(following) { } const char* name() const { return "clear history"; } void doStep(Executor& e, RandomSource&) { e.clearHistory(); } }; class ExecutorDo : public ExecutorStep { int min; int max; FileCommandLogger fLogger; const char* logFName; FILE* fh; public: ExecutorDo(ExecutorStep* following, const char* logFileName) : ExecutorStep(following), min(1), max(40), logFName(logFileName), fh(0) { } void setMinimumAndMaximumCommands(int minimum, int maximum) { min = minimum; max = maximum; } const char* name() const { return "random commands"; } void doStep(Executor& e, RandomSource& rng) { fh = fopen(logFName, "w"); assert(fh); fLogger.setLogFile(fh); int cc; e.executeRandomCommands(cc, rng, min, max); } void cleanup() { fLogger.setLogFile(0); fh = 0; } CommandLogger* logger() { return fLogger.getLogger(); } }; class ExecutorDoesAndRandomUndoesAndRedoes : public ExecutorStep { FileCommandLogger fLogger; const char* logFName; FILE* fh; public: ExecutorDoesAndRandomUndoesAndRedoes(ExecutorStep* following, const char* logFileName) : ExecutorStep(following), logFName(logFileName), fh(0) { } const char* name() const { return "random undoes and redoes"; } void doStep(Executor& e, RandomSource& rng) { fh = fopen(logFName, "w"); assert(fh); fLogger.setLogFile(fh); int commandCount = 0; e.executeRandomCommands(commandCount, rng, 1, 20); int maxUndoes = rng.getUniform(commandCount); for (int j = 0; j != maxUndoes; ++j) { e.undo(); } int redoCount = rng.getUniform(maxUndoes); for (int i = 0; i != redoCount; ++i) { e.redo(); } e.executeRandomCommands(commandCount, rng, 1, 3); } void cleanup() { fLogger.setLogFile(0); fh = 0; } CommandLogger* logger() { return fLogger.getLogger(); } }; class ExecutorUndoAll : public ExecutorStep { public: ExecutorUndoAll(ExecutorStep* following) : ExecutorStep(following) { } const char* name() const { return "undo all"; } void doStep(Executor& e, RandomSource&) { while (e.canUndo()) { e.undo(); } } }; class ExecutorRedoAll : public ExecutorStep { public: ExecutorRedoAll(ExecutorStep* following) : ExecutorStep(following) { } const char* name() const { return "redo all"; } void doStep(Executor& e, RandomSource&) { while (e.canRedo()) { e.redo(); } } }; class ExecutorReplay : public ExecutorStep { const char* logFName; FILE* fh; enum { lineBufferSize = 1024 }; char lineBuffer[lineBufferSize]; std::string replayed[2]; public: ExecutorReplay(ExecutorStep* following, const char* logFileName) : ExecutorStep(following), logFName(logFileName), fh(0) { } const char* name() const { return "replay"; } void appendCommandLog(std::string& out, int which) const { out.append(replayed[which]); } void doStep(Executor& e, RandomSource&) { int whichLog = getCurrentlyActiveLog(); replayed[whichLog].clear(); fh = fopen(logFName, "r"); assert(fh); while (fgets(lineBuffer, lineBufferSize, fh)) { e.executeFromLog(lineBuffer); replayed[whichLog].append(lineBuffer); } } void cleanup() { if (fh) { fclose(fh); fh = 0; } } }; // Use this if you want FailingStep to refer to a pair of steps. class TwoSteps : public ExecutorStep { ExecutorStep& s1; ExecutorStep& s2; std::string nameStr; public: // The steps that first and second are following are ignored here. TwoSteps(ExecutorStep& first, ExecutorStep& second, ExecutorStep* following) : ExecutorStep(following), s1(first), s2(second), nameStr(s1.name()) { nameStr.append(" then "); nameStr.append(s2.name()); nameStr.c_str(); } const char* name() const { return nameStr.c_str(); } void doStep(Executor& e, RandomSource& rng) { s1.doStep(e, rng); s2.doStep(e, rng); } }; // Do then replay // Do then replay then undo // Do then replay then undo then redo // Do then replay then OOM[undo then redo] then undo // Do then replay then OOM[undo then redo] then redo // OOM[do] then replay // Also need: Do then undo some then redo some (checkpoint) then replay void testUndo(Executor& e, ModelTestHelper& helper) { FileCommandLogger fileLogger; static const char tmpDirTemplate[] = "/tmp/lsmXXXXXX"; char tmpDirName[sizeof(tmpDirTemplate)]; strncpy(tmpDirName, tmpDirTemplate, sizeof(tmpDirTemplate)); mkdtemp(tmpDirName); std::string tmpFileName(tmpDirName); tmpFileName += "/command.log"; // the tree of possible execution paths that we are going to check: // (1) Do = replay ExecutorInit init(helper); ExecutorConstruct construct(&init); ClearHistory clearHistory(&construct); ExecutorDo doStuff(&clearHistory, tmpFileName.c_str()); ExecutorReplay replay(&clearHistory, tmpFileName.c_str()); // (2) Do, undo = replay, undo ExecutorUndoAll undoToConstruct(&doStuff); ExecutorUndoAll undoAfterReplay(&replay); // (3) Do = replay, undo, redo ExecutorRedoAll redoAgain(&undoToConstruct); // (4) Construct = Do, replay, OOM[undo then redo], undo TwoSteps undoThenRedo(undoToConstruct, redoAgain, &undoToConstruct); FailingStep failToUndoThenRedo(&undoThenRedo); ExecutorUndoAll undoAfterFail(&failToUndoThenRedo); // (5) Do = replay, OOM[undo then redo], redo ExecutorRedoAll redoAfterFail(&failToUndoThenRedo); // (6) OOM[Do] = replay FailingStep failToDo(&doStuff); // (7) Do, undo some, redo some, do = replay ExecutorDoesAndRandomUndoesAndRedoes doesUndoesRedoes(&construct, tmpFileName.c_str()); // (8) OOM[Do, undo some, redo some, do] = replay FailingStep failingDur(&doesUndoesRedoes); const int commandCount = e.commandCount(); const int testCount = 4 * commandCount * commandCount; const int firstPhaseEnds = testCount / 2; const int secondPhaseEnds = (testCount * 3) / 4; bool oomLoaded = loadOomTestUtil(); QVERIFY2(oomLoaded, "Oom Test Util not loaded!"); std::string logString; RandomSource rng; StringLoggerWrapper stringLogger(&logString); // Now we will check pairs of steps in the tree against each other to check // that they produce identical results. for (int i = 0; i != testCount; ++i) { int minCommands = 1; int maxCommands = 40; if (i < secondPhaseEnds) { if (i < firstPhaseEnds) { maxCommands = 1; } else { minCommands = maxCommands = 2; } } doStuff.setMinimumAndMaximumCommands(minCommands, maxCommands); // (1) replay.runAndCheck("replay", doStuff, e, helper, rng, i); // (2) undoAfterReplay.runAndCheck("undo after replay", undoToConstruct, e, helper, rng, i); // (3) redoAgain.runAndCheck("redo after replay and undo", doStuff, e, helper, rng, i); // (4) undoAfterFail.runAndCheck("undo after fail", construct, e, helper, rng, i); // (5) redoAfterFail.runAndCheck("redo after fail", doStuff, e, helper, rng, i); // (6) replay.runAndCheck("replays failing sequence correctly", failToDo, e, helper, rng, i); // (7) replay.runAndCheck("replays sequence of does, undoes and redoes correctly", doesUndoesRedoes, e, helper, rng, i); // (8) replay.runAndCheck("replays failing sequence of does, undoes and redoes correctly", failingDur, e, helper, rng, i); rng = redoAgain.finalRng(); } cancelAnyMallocFailure(); QVERIFY2(0 == unlink(tmpFileName.c_str()), "Could not delete test command log file"); QVERIFY2(0 == rmdir(tmpDirName), "Could not delete test directory"); QVERIFY2(testCount / 2 < failToUndoThenRedo.failedCount() || testCount < failToUndoThenRedo.noMallocsCount(), "failToUndoThenRedo didn't fail very often"); QVERIFY2(testCount / 2 < failToDo.failedCount(), "failToDo didn't fail very often"); } stopmotion-0.8.0/src/test/testundo.h000066400000000000000000000054071234321124500175210ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TESTUNDO_H_ #define TESTUNDO_H_ #include "hash.h" class Executor; /** * Provides a way for test code to check the state of the model that is being * updated by commands in an Executor. */ class ModelTestHelper { public: virtual ~ModelTestHelper() = 0; /** * Resets the model owned by an Executor to an empty state. * @param [in,out] e The executor whose model must be reset. */ virtual void resetModel(Executor& e) = 0; /** * Returns a hash of the model. The hash of a model should be different * to the hash of similar models, so that hashes comparing equal very * probably means that the models are the same. * @param [in] The exector that owns the model to be hashed. */ virtual Hash hashModel(const Executor& e) = 0; }; /** * Tests that the commands in the executor {@a e} obey the following rules: * - Two identical commands executed on identical models must produce * identical models. * - The execution of a string of commands followed by their inverses (in * reverse order) must leave the model in an identical state. * - Under test conditions, only an out-of-memory exception may escape a * command's execution. * - If an exception escapes a command's execution, it must not have affected * the model at all. */ void testUndo(Executor& e, ModelTestHelper& helper); #endif /* TESTUNDO_H_ */ stopmotion-0.8.0/src/test/texecutor.cpp000066400000000000000000000243001234321124500202220ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "texecutor.h" #include #include #include #include #include #include #include #include #include #include "src/domain/undo/executor.h" #include "src/domain/undo/command.h" #include "src/domain/undo/commandlogger.h" #include "src/domain/undo/filelogger.h" #include "src/domain/undo/random.h" #include "testundo.h" #include "oomtestutil.h" static const int32_t no_num = std::numeric_limits::min(); class TestException : public std::exception { const char* msg; public: TestException(const char* message) : msg(message) { } const char* what() const throw() { return msg; } }; /** * Test factory for commands that test parsing. When executed, they write a * string of their contents to a list of strings. */ class EmptyTestCommandFactory : public CommandFactory { std::string name; typedef TestCommandFactory::output_t output_t; output_t& output; public: EmptyTestCommandFactory(const char* nameForCommand, output_t& executionOutput) : name(nameForCommand), output(executionOutput) { } class EtCommand : public Command { public: std::string name; output_t& output; std::string s1; int32_t i1; int32_t i2; EtCommand(std::string commandName, output_t& out) : name(commandName), output(out), s1(""), i1(no_num), i2(no_num) { } Command* execute() { std::stringstream ss; ss << name << ",i:" << i1 << ",s:" << s1 << ",i:" << i2; output.push_back(ss.str()); return createNullCommand(); } bool operator==(const EtCommand& other) const { return name == other.name && s1 == other.s1 && i1 == other.i1 && i2 == other.i2; } bool operator!=(const EtCommand& other) const { return !(*this == other); } }; ~EmptyTestCommandFactory() { } Command* create(Parameters& ps) { EtCommand* e = new EtCommand(name, output); e->i1 = ps.getInteger(-RAND_MAX/2, RAND_MAX/2); ps.getString(e->s1, 0); e->i2 = ps.getInteger(-RAND_MAX/2, RAND_MAX/2); return e; } void Fail(const char* s) { QFAIL(s); } }; /** * Re-executes the command that is logged. */ class CloneLogger : public CommandLogger { Executor* ex; std::string command; bool alreadyIn; class AlreadyIn { bool& r; public: AlreadyIn(bool& a) : r(a) { r = true; } ~AlreadyIn() { r = false; } }; public: CloneLogger() : ex(0), alreadyIn(false) { } ~CloneLogger() { } /** @param e Ownership is not passed. */ void SetExecutor(Executor* e) { ex = e; } void writeCommand(const char* lineToLog) { command = lineToLog; } void commandComplete() { if (!alreadyIn) { // Make sure we don't recursively call ourselves AlreadyIn a(alreadyIn); // Some tests are not logging; don't try to execute "!" if (!command.empty()) { command.append(1, '!'); ex->executeFromLog(command.c_str()); } } } void undoComplete() { assert(false); } void redoComplete() { assert(false); } }; TestCommandFactory::TestCommandFactory() : ce(0), cl(0), str(0), strNext(0), strAllocLen(0) { cl = new CloneLogger(); ce = makeExecutor(); ce->setCommandLogger(cl); cl->SetExecutor(ce); std::auto_ptr et( new EmptyTestCommandFactory("et", executionOutput)); std::auto_ptr sec( new EmptyTestCommandFactory("sec", executionOutput)); ce->addCommand("et", et); ce->addCommand("sec", sec); } TestCommandFactory::~TestCommandFactory() { delete ce; delete[] str; } void TestCommandFactory::AddCharToRandomString(char c) { if (strNext == str + strAllocLen) { int32_t newLen = strAllocLen == 0? 64 : strAllocLen * 2; char* newStr = new char[newLen]; strncpy(newStr, str, strAllocLen); delete[] str; strNext = newStr + (strNext - str); str = newStr; strAllocLen = newLen; } *strNext = c; ++strNext; } const char* TestCommandFactory::RandomString() { strNext = str; int type = rand() % 4; while (type != 0) { switch (type) { case 1: AddCharToRandomString('0' + (rand() % 10)); break; case 2: AddCharToRandomString('a' + (rand() % 26)); break; default: AddCharToRandomString('A' + (rand() % 26)); break; } type = rand() % 4; } AddCharToRandomString('\0'); return str; } void TestCommandFactory::emptyCommandReplayerThrows() { try { ce->execute("fakeCommand"); } catch (UnknownCommandException& e) { return; } QFAIL("Empty CommandReplayer did not throw " "CommandFactoryNoSuchCommandException"); } void TestCommandFactory::canParseFromLog() { executionOutput.clear(); ce->executeFromLog("et -5 \"hello world!\" 412345!"); QCOMPARE(executionOutput.begin()->c_str(), "et,i:-5,s:hello world!,i:412345"); } int32_t randomInt() { return rand() - RAND_MAX/2; } void TestCommandFactory::parsingDescriptionIsCloning() { char description[512]; const size_t desLen = sizeof(description)/sizeof(description[0]) - 1; description[desLen] = '\0'; executionOutput.clear(); for (int i = 0; i != 100; ++i) { const char* commandName = rand() % 2 == 0? "et" : "sec"; int32_t i1 = randomInt(); int32_t i2 = randomInt(); std::string s1 = RandomString(); ce->execute(commandName, i1, s1.c_str(), i2); output_t::iterator eo1 = executionOutput.begin(); output_t::iterator eo2 = eo1; ++eo2; QCOMPARE(eo1->c_str(), eo2->c_str()); } } namespace { const char alphanumeric[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; } class AddCharFactory : public CommandFactory { std::string* model; public: class AddChar : public Command { std::string* m; char c; int32_t p; public: AddChar(std::string& model, int32_t character, int32_t position) : m(&model), c(character), p(position) { } Command* execute(); }; AddCharFactory(std::string* m) : model(m) { } Command* create(Parameters& ps) { int32_t i = ps.getInteger(0, sizeof(alphanumeric) - 1); int32_t character = alphanumeric[i]; int32_t position = ps.getInteger(0, model->length()); return new AddChar(*model, character, position); } }; class DelCharFactory : public CommandFactory { std::string* model; public: class DelChar : public Command { std::string* m; int32_t p; public: DelChar(std::string& model, int32_t position) : m(&model), p(position) { } Command* execute(); }; DelCharFactory(std::string* m) : model(m) { } Command* create(Parameters& ps) { int32_t len = model->length(); if (len == 0) return 0; int32_t position = ps.getInteger(0, len - 1); return new DelChar(*model, position); } }; Command* AddCharFactory::AddChar::execute() { if (p < 0 || static_cast(m->length()) < p) throw TestException("AddCharFactory parameters out-of-range"); // insert might throw, so use an auto_ptr to avoid leaks. std::auto_ptr inv(new DelCharFactory::DelChar(*m, p)); std::string::iterator i = m->begin(); i += p; m->insert(i, c); delete this; return inv.release(); } Command* DelCharFactory::DelChar::execute() { if (m->size() == 0) { return createNullCommand(); } char removedChar = (*m)[p]; Command* inv = new AddCharFactory::AddChar(*m, removedChar, p); m->erase(p, 1); delete this; return inv; } class StringModelTestHelper : public ModelTestHelper { // not owned std::string* s; public: StringModelTestHelper(std::string& model) : s(&model) { } ~StringModelTestHelper() { } void resetModel(Executor&) { s->clear(); } Hash hashModel(const Executor&) { Hash h; h.add(s->c_str()); return h; } }; class AddDelTestBed { enum { lineBufferSize = 512 }; char lineBuffer[lineBufferSize]; std::string finalString; std::string originalString; std::string expected; std::auto_ptr af; std::auto_ptr df; std::auto_ptr logger; std::auto_ptr ex; FILE* logFile; StringModelTestHelper helper; public: AddDelTestBed() : af(new AddCharFactory(&finalString)), df(new DelCharFactory(&finalString)), logger(new FileCommandLogger), ex(makeExecutor()), logFile(0), helper(finalString) { ex->setCommandLogger(logger->getLogger()); ex->addCommand("add", af, true); ex->addCommand("del", df); lineBuffer[lineBufferSize - 1] = '\0'; } void init(const char* initialString) { finalString = initialString; originalString = finalString; logFile = tmpfile(); // ownership of logFile is passed here logger->setLogFile(logFile); ex->clearHistory(); } void testUndo() { ::testUndo(*ex, helper); } }; void TestCommandFactory::testUndo() { AddDelTestBed test; test.testUndo(); } void TestCommandFactory::replayIsRobust() { loadOomTestUtil(); setMallocsUntilFailure(0); QVERIFY2(0 == malloc(1), "SetMallocsUntilFailure(0) not working"); setMallocsUntilFailure(1); void* shouldSucceed = malloc(1); QVERIFY2(shouldSucceed, "SetMallocsUntilFailure not allowing mallocs at all"); free(shouldSucceed); QVERIFY2(0 == malloc(1), "SetMallocsUntilFailure(1) not working"); } stopmotion-0.8.0/src/test/texecutor.h000066400000000000000000000041751234321124500176770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TEXECUTOR_H_ #define TEXECUTOR_H_ #include #include #include #include class Executor; class CloneLogger; class TestCommandFactory : public QObject { Q_OBJECT Executor* ce; CloneLogger* cl; char* str; // output from RandomString char* strNext; int32_t strAllocLen; public: typedef std::list output_t; private: output_t executionOutput; void AddCharToRandomString(char); public: TestCommandFactory(); ~TestCommandFactory(); const char* RandomString(); private slots: void emptyCommandReplayerThrows(); void canParseFromLog(); void parsingDescriptionIsCloning(); void testUndo(); void replayIsRobust(); }; #endif /* TEXECUTOR_H_ */ stopmotion-0.8.0/src/test/tmain.cpp000066400000000000000000000036321234321124500173150ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "texecutor.h" #include "tcache.h" #include "tstopmotionundo.h" int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); int overall = 0; TestCommandFactory t1; overall = QTest::qExec(&t1, argc, argv); TestCache t2; overall += QTest::qExec(&t2, argc, argv); TestStopmotionUndo t3; overall += QTest::qExec(&t3, argc, argv); if (overall == 0) printf("Success!\n"); else printf("Failed: %d\n", overall); return overall; } stopmotion-0.8.0/src/test/tstopmotionundo.cpp000066400000000000000000000335711234321124500214770ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013-2014 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "tstopmotionundo.h" #include "testundo.h" #include "oomtestutil.h" #include "hash.h" #include "src/domain/undo/addallcommands.h" #include "src/domain/undo/executor.h" #include "src/domain/animation/animation.h" #include "src/domain/animation/scenevector.h" #include "src/domain/animation/scene.h" #include "src/domain/animation/frame.h" #include "src/domain/animation/sound.h" #include "src/technical/audio/audioformat.h" #include "src/presentation/frontends/frontend.h" #include "src/technical/stringiterator.h" #include #include #include #include #include class RealOggEmptyJpg : public MockableFileSystem { MockableFileSystem* delegate; FILE* fake; int fakeReads; public: RealOggEmptyJpg() : delegate(0), fake(reinterpret_cast(1)), fakeReads(0) { } ~RealOggEmptyJpg() { } bool hasExtension(const char* filename, const char* extension) { const char* dot = strrchr(filename, '.'); return dot && strcmp(dot, extension) == 0; } bool isSound(const char* filename) { return hasExtension(filename, ".ogg"); } bool isImage(const char* filename) { return hasExtension(filename, ".jpg"); } void setDelegate(MockableFileSystem* mfs) { delegate = mfs; } FILE* openFake(const char* filename, const char* mode) { if (isImage(filename)) { fakeReads = 0; return fake; } else if (isSound(filename)) { if (strstr(mode, "w") == 0) return delegate->fopen("resources/click.ogg", mode); return fake; } return 0; } FILE* fopen(const char* filename, const char* mode) { FILE* r = openFake(filename, mode); if (r) return r; return delegate->fopen(filename, mode); } FILE* freopen(const char* filename, const char* mode, FILE* fh) { if (fh == fake) { if (filename) return fopen(filename, mode); fakeReads = 0; return fake; } return delegate->freopen(filename, mode, fh); } int fclose(FILE* fh) { if (fh == fake) return 0; return delegate->fclose(fh); } int fflush(FILE* fh) { if (fh == fake) return 0; return delegate->fflush(fh); } size_t fread (void *out, size_t blockSize, size_t blockCount, FILE *fh) { if (fh == fake) { if (0 < fakeReads) return 0; ++fakeReads; return blockCount; } return delegate->fread(out, blockSize, blockCount, fh); } size_t fwrite (const void *in, size_t blockSize, size_t blockCount, FILE *fh) { if (fh == fake) return blockCount; return delegate->fwrite(in, blockSize, blockCount, fh); } int access (const char *name, int /*type*/) { // always assume files within the workspace do not exist // (as access is only called to find empty slots to use in the // workspace) but files requested outside of the workspace exist return strstr(name, ".stopmotion/")? -1 : 0; } int ferror(FILE*) { return 0; } int unlink(const char *name) { static const char tmpPrefix[] = "/tmp/"; // really delete any files in /tmp if (0 == strncmp(name, tmpPrefix, sizeof(tmpPrefix) - 1)) delegate->unlink(name); return 0; } int ov_test(FILE *, OggVorbis_File *, const char *, long) { return 0; } int ov_clear(OggVorbis_File *) { return 0; } int ov_open(FILE *,OggVorbis_File *,const char *, long) { return 0; } long ov_read(OggVorbis_File *,char *,int, int, int, int, int *) { return 0; } char *getenv(const char *name) { return delegate->getenv(name); } }; class TestHome : public MockableFileSystem { MockableFileSystem* delegate; char* fakeHome; public: TestHome() : delegate(0), fakeHome(0) { } ~TestHome() { } void setDelegate(MockableFileSystem* mfs) { delegate = mfs; char* home = delegate->getenv("HOME"); if (home) { static const char appendix[] = "/.stopmotion/test"; unsigned int len = strlen(home); fakeHome = (char*) malloc(len + sizeof(appendix)); if (fakeHome) { strncpy(fakeHome, home, len); strncpy(fakeHome + len, appendix, sizeof(appendix)); } } } FILE* fopen(const char* filename, const char* mode) { return delegate->fopen(filename, mode); } FILE* freopen(const char* filename, const char* mode, FILE* fh) { return delegate->freopen(filename, mode, fh); } int fclose(FILE* fh) { return delegate->fclose(fh); } int fflush(FILE* fh) { return delegate->fflush(fh); } size_t fread (void *out, size_t blockSize, size_t blockCount, FILE *fh) { return delegate->fread(out, blockSize, blockCount, fh); } size_t fwrite (const void *in, size_t blockSize, size_t blockCount, FILE *fh) { return delegate->fwrite(in, blockSize, blockCount, fh); } int access (const char *name, int type) { return delegate->access(name, type); } int ferror(FILE* fh) { return delegate->ferror(fh); } int unlink(const char *name) { return delegate->unlink(name); } int ov_test(FILE *f, OggVorbis_File *vf, const char *initial, long ibytes) { return delegate->ov_test(f, vf, initial, ibytes); } int ov_clear(OggVorbis_File *vf) { return delegate->ov_clear(vf); } int ov_open(FILE *f, OggVorbis_File *vf, const char *initial, long ibytes) { return delegate->ov_open(f, vf, initial, ibytes); } long ov_read(OggVorbis_File *vf,char *buffer, int length, int bigendianp, int word, int sgned, int *bitstream) { return delegate->ov_read(vf, buffer, length, bigendianp, word, sgned, bitstream); } char *getenv(const char *name) { if (0 == strcmp(name, "HOME")) { return fakeHome; } return delegate->getenv(name); } }; void getHashes(std::vector& out, const char* filenameTemplate) { std::string filenameStr(filenameTemplate); char* filename = &filenameStr[0]; char* digitPtr = strchr(filename, '?'); for (int i = 0; i != 10; ++i) { *digitPtr = '0' + i; if (0 != access(filename, F_OK)) return; out.resize(i + 1); Hash h; FILE* f = fopen(filename, "r"); h.add(f); fclose(f); out[i] = h; } } class MockFrontend : public Frontend { public: ~MockFrontend() { } int run(int, char **) { return 0; } void showProgress(ProgressMessage, int) { } void hideProgress() { } void updateProgress(int) { } bool isOperationAborted() { return false; } void processEvents() { } void reportError(const char *, int) { } int askQuestion(Question) { return true; } int runExternalCommand(const char *) { return 0; } }; TestStopmotionUndo::TestStopmotionUndo() : anim(0), mockFrontend(0), sv(0), ex(0), mfs(0), animTester(0) { sv = new SceneVector(); ex = makeAnimationCommandExecutor(*sv); mfs = new RealOggEmptyJpg(); testEnvFs = new TestHome(); mockFrontend = new MockFrontend(); loadOomTestUtil(); } TestStopmotionUndo::~TestStopmotionUndo() { setMockFileSystem(0); delete mockFrontend; } class SceneVectorTestHelper : public ModelTestHelper { SceneVector& sv; public: SceneVectorTestHelper(SceneVector& s) : sv(s) { } ~SceneVectorTestHelper() { } void resetModel(Executor&) { sv.clear(); } Hash hashModel(const Executor&) { Hash h; // soundCount is kept as a separate variable so we hash this as well // so that we can be sure that it is kept in sync with the actual // number of sounds. h.add(sv.soundCount()); int sceneCount = sv.sceneCount(); for (int s = 0; s != sceneCount; ++s) { const Scene *scene = sv.getScene(s); int frameCount = scene->getSize(); for (int f = 0; f != frameCount; ++f) { const Frame* frame = scene->getFrame(f); h.add(frame->getImagePath()); int soundCount = frame->soundCount(); for (int snd = 0; snd != soundCount; ++snd) { const Sound* sound = frame->getSound(snd); h.add(sound->getName()); h.add(sound->getAudio()->getSoundPath()); } } } return h; } }; void TestStopmotionUndo::stopmotionCommandsInvertCorrectly() { SceneVectorTestHelper helper(*sv); setMockFileSystem(mfs); testUndo(*ex, helper); setMockFileSystem(0); } class AnimTester { const Animation* anim; std::vector imageHashes; std::vector soundHashes; int scene; int frame; int sound; int soundCount; bool seenFrame; void frameEnd() { QCOMPARE(sound, anim->soundCount(scene, frame)); sound = 0; ++frame; } void sceneEnd() { if (seenFrame) { frameEnd(); seenFrame = false; } QCOMPARE(frame, anim->frameCount(scene)); frame = 0; ++scene; } void testFrame(int n) { seenFrame = true; const char* path = anim->getImagePath(scene, frame); FILE* fh = fopen(path, "r"); if (!fh) { char msg[500]; snprintf(msg, sizeof(msg), "Failed to open file %s", path); QFAIL(msg); } Hash h; h.add(fh); fclose(fh); QCOMPARE(imageHashes[n], h); } void testSound(int n) { const char* path = anim->getSoundPath(scene, frame, sound - 1); FILE* fh = fopen(path, "r"); Hash h; h.add(fh); fclose(fh); QCOMPARE(soundHashes[n], h); } public: AnimTester(const Animation* a) : anim(a), scene(0), frame(0), sound(0), soundCount(0), seenFrame(false) { getHashes(imageHashes, "resources/frame?.jpg"); getHashes(soundHashes, "resources/sound?.ogg"); } ~AnimTester() { } void test(const char* expected) { scene = 0; frame = 0; sound = 0; soundCount = 0; seenFrame = false; for (; *expected; ++expected) { switch (*expected) { case ';': sceneEnd(); break; case ',': frameEnd(); break; case '/': ++sound; break; default: int n = *expected - '0'; QVERIFY(0 <= n && n <= 9); if (sound == 0) { testFrame(n); } else { testSound(n); ++soundCount; } break; } } sceneEnd(); QCOMPARE(soundCount, anim->soundCount()); } }; class StringContainer : public StringIterator { typedef std::vector vect_t; vect_t v; vect_t::size_type i; public: StringContainer() : i(0) { } ~StringContainer() { } int count() { return static_cast(v.size()) - i; } bool atEnd() const { return v.size() == i; } const char* get() const { return v[i]; } void next() { ++i; } void add(const char* s) { v.insert(v.end(), s); } }; void TestStopmotionUndo::setUpAnim() { setMockFileSystem(testEnvFs); WorkspaceFile::clear(); delete anim; anim = 0; delete animTester; animTester = 0; anim = new Animation(); anim->registerFrontend(mockFrontend); animTester = new AnimTester(anim); anim->newScene(0); anim->newScene(1); anim->newScene(2); StringContainer frames0; frames0.add("resources/frame0.jpg"); frames0.add("resources/frame1.jpg"); anim->addFrames(0, 0, frames0); StringContainer frames1; frames1.add("resources/frame2.jpg"); anim->addFrames(1, 0, frames1); StringContainer frames2; frames2.add("resources/frame3.jpg"); frames2.add("resources/frame4.jpg"); anim->addFrames(2, 0, frames2); anim->addSound(2, 0, "resources/sound0.ogg"); anim->addSound(2, 1, "resources/sound1.ogg"); } void TestStopmotionUndo::addFrames() { setUpAnim(); StringContainer newFrames; newFrames.add("resources/frame5.jpg"); newFrames.add("resources/frame6.jpg"); anim->addFrames(0, 1, newFrames); animTester->test("0,5,6,1;2;3/0,4/1"); } void TestStopmotionUndo::removeFrames() { setUpAnim(); anim->removeFrames(0, 0, 1); animTester->test("1;2;3/0,4/1"); anim->removeFrames(2, 1, 1); animTester->test("1;2;3/0"); } void TestStopmotionUndo::moveFrames() { setUpAnim(); anim->moveFrames(2, 0, 2, 0, 1); animTester->test("0,3/0,4/1,1;2;"); } void TestStopmotionUndo::setImagePath() { setUpAnim(); std::string oldPath = anim->getImagePath(2, 1); anim->setImagePath(2, 1, "resources/frame5.jpg"); QVERIFY(oldPath != anim->getImagePath(2, 1)); animTester->test("0,1;2;3/0,5/1"); } void TestStopmotionUndo::duplicateImage() { setUpAnim(); std::string oldPath = anim->getImagePath(2, 1); anim->duplicateImage(2, 1); QVERIFY(oldPath != anim->getImagePath(2, 1)); animTester->test("0,1;2;3/0,4/1"); } void TestStopmotionUndo::addSound() { setUpAnim(); anim->addSound(2, 0, "resources/sound2.ogg"); animTester->test("0,1;2;3/0/2,4/1"); } void TestStopmotionUndo::removeSound() { setUpAnim(); anim->addSound(2, 0, "resources/sound2.ogg"); anim->removeSound(2, 0, 0); animTester->test("0,1;2;3/2,4/1"); anim->removeSound(2, 0, 0); animTester->test("0,1;2;3,4/1"); } void TestStopmotionUndo::setSoundName() { setUpAnim(); anim->setSoundName(2, 0, 0, "tommy"); animTester->test("0,1;2;3/0,4/1"); QCOMPARE(anim->getSoundName(2, 0, 0), "tommy"); } void TestStopmotionUndo::newScene() { setUpAnim(); anim->newScene(1); animTester->test("0,1;;2;3/0,4/1"); } void TestStopmotionUndo::removeScene() { setUpAnim(); anim->removeScene(1); animTester->test("0,1;3/0,4/1"); anim->removeScene(1); animTester->test("0,1"); } void TestStopmotionUndo::moveScene() { setUpAnim(); anim->moveScene(2, 0); animTester->test("3/0,4/1;0,1;2"); } stopmotion-0.8.0/src/test/tstopmotionundo.h000066400000000000000000000043341234321124500211370ustar00rootroot00000000000000/*************************************************************************** * Copyright (C) 2013 by Linuxstopmotion contributors; * * see the AUTHORS file for details. * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TSTOPMOTIONUNDO_H_ #define TSTOPMOTIONUNDO_H_ #include class Animation; class Executor; class SceneVector; class RealOggEmptyJpg; class TestHome; class AnimTester; class MockFrontend; class TestStopmotionUndo : public QObject { Q_OBJECT Animation* anim; MockFrontend* mockFrontend; SceneVector* sv; Executor* ex; RealOggEmptyJpg* mfs; TestHome* testEnvFs; AnimTester* animTester; void setUpAnim(); public: TestStopmotionUndo(); ~TestStopmotionUndo(); private slots: void newScene(); void removeScene(); void moveScene(); void addFrames(); void removeFrames(); void moveFrames(); void setImagePath(); void duplicateImage(); void addSound(); void removeSound(); void setSoundName(); void stopmotionCommandsInvertCorrectly(); }; #endif /* TSTOPMOTIONUNDO_H_ */ stopmotion-0.8.0/stopmotion.1000066400000000000000000000042211234321124500162230ustar00rootroot00000000000000.\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH STOPMOTION 1 "May 25th, 2006" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME stopmotion \- a program for creating stop-motion animations .SH SYNOPSIS .B stopmotion [\-\-nonGUI .B ] .I file .br .SH DESCRIPTION This manual page briefly introduces the program and documents the commands available when running in non GUI mode. .PP .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBstopmotion\fP is a program for creating stop-motions animations from couple of images. You can use your favourite video device for grabbing the images as long you have a program capable of doing it. You just sets stopmotion to use the program. It's also possible to do the same with video export. Stopmotion has a set of tools which helps you creating the movements smooth and precise. .SH OPTIONS Stopmotion follows the usual GNU command line syntax, with long options starting with two dashes (`\-\-'). This part of the program is under construction and not yet fully usable. A summary of options is included below. .TP .B \-a DIR, \-\-addFrames=DIR Creates a new project containing the images located in DIR (e.g. /foo/bar) .SH SEE ALSO The full documentation for stopmotion is maintained as a docbook manual. Visit the projects website for the complete manual. (http://stopmotion.bjoernen.com) .br .SH AUTHORS stopmotion is written by Bjoern Erik Nilsen and Fredrik Berg Kjoelstad. .SH REPORTING BUGS Report bugs to . .PP This manual page was written by Bjoern Erik Nilsen . stopmotion-0.8.0/stopmotion.desktop000066400000000000000000000004511234321124500175350ustar00rootroot00000000000000[Desktop Entry] Name=Stopmotion Icon=stopmotion Comment=Program to create stop-motion animations Exec=stopmotion Terminal=false Type=Application Categories=AudioVideo;Video;AudioVideoEditing;KDE;Qt; Keywords=Animation;Stop Motion Animation;Stop Frame Animation; MimeType=application/x-stopmotion; stopmotion-0.8.0/stopmotion.mime000066400000000000000000000002171234321124500170130ustar00rootroot00000000000000application/x-stopmotion; /usr/bin/stopmotion -caption "Animation Creator" %s; nametemplate=%s.sto; test=test "$DISPLAY" != ""; priority=9 stopmotion-0.8.0/stopmotion.pro000066400000000000000000000323071234321124500166710ustar00rootroot00000000000000CONFIG += debug_and_release CONFIG += warn_off HEADERS += src/domain/undo/filelogger.h \ src/config.h \ src/domain/domainfacade.h \ src/domain/filenamevisitor.h \ src/domain/observernotifier.h \ src/foundation/logger.h \ src/presentation/observer.h \ src/domain/animation/animation.h \ src/domain/animation/animationimpl.h \ src/domain/animation/frame.h \ src/domain/animation/sound.h \ src/presentation/loadcache.h \ src/presentation/imagecache.h \ src/presentation/frontends/nonguifrontend/nonguifrontend.h \ src/presentation/frontends/qtfrontend/mainwindowgui.h \ src/presentation/frontends/qtfrontend/qtfrontend.h \ src/application/runanimationhandler.h \ src/domain/undo/commandmove.h \ src/domain/undo/commandremove.h \ src/domain/undo/commandsetimage.h \ src/domain/undo/commandaddsound.h \ src/domain/undo/commandrenamesound.h \ src/domain/undo/commandremovesound.h \ src/domain/undo/commandaddscene.h \ src/domain/undo/commandmovescene.h \ src/domain/undo/commandremovescene.h \ src/domain/animation/workspacefile.h \ src/application/camerahandler.h \ src/presentation/frontends/qtfrontend/frameview.h \ src/presentation/frontends/qtfrontend/flexiblespinbox.h \ src/presentation/frontends/qtfrontend/menuframe.h \ src/presentation/frontends/qtfrontend/flexiblelineedit.h \ src/presentation/frontends/frontend.h \ graphics/stopmotion.xpm \ graphics/stopmotion_logo.xpm \ graphics/icons/addframeicon.xpm \ graphics/icons/cameraoff.xpm \ graphics/icons/cameraon.xpm \ graphics/icons/capture.xpm \ graphics/icons/clapper.xpm \ graphics/icons/closescene.xpm \ graphics/icons/close.xpm \ graphics/icons/configureicon.xpm \ graphics/icons/copyicon.xpm \ graphics/icons/cuticon.xpm \ graphics/icons/fastforward.xpm \ graphics/icons/filenewicon.xpm \ graphics/icons/fileopenicon.xpm \ graphics/icons/filesaveasicon.xpm \ graphics/icons/filesaveicon.xpm \ graphics/icons/home.xpm \ graphics/icons/languages.xpm \ graphics/icons/loop.xpm \ graphics/icons/newscene.xpm \ graphics/icons/nextframe.xpm \ graphics/icons/note.xpm \ graphics/icons/openscene.xpm \ graphics/icons/pasteicon.xpm \ graphics/icons/pause.xpm \ graphics/icons/play.xpm \ graphics/icons/previousframe.xpm \ graphics/icons/quiticon.xpm \ graphics/icons/redoicon.xpm \ graphics/icons/removeframeicon.xpm \ graphics/icons/removescene.xpm \ graphics/icons/rewind.xpm \ graphics/icons/steptobeginning.xpm \ graphics/icons/steptoend.xpm \ graphics/icons/stop.xpm \ graphics/icons/undoicon.xpm \ graphics/icons/videoexport.xpm \ graphics/icons/whatsthisicon.xpm \ graphics/icons/windowicon.xpm \ graphics/icons/gimp.xpm \ src/application/soundhandler.h \ src/presentation/frontends/qtfrontend/framepreferencesmenu.h \ src/application/editmenuhandler.h \ src/domain/animation/scene.h \ src/domain/animation/scenevector.h \ src/technical/projectserializer.h \ src/presentation/frontends/qtfrontend/licence.h \ src/technical/audio/audiodriver.h \ src/technical/audio/audioformat.h \ src/technical/audio/ossdriver.h \ src/technical/audio/oggvorbis.h \ src/technical/grabber/imagegrabber.h \ src/technical/grabber/commandlinegrabber.h \ src/presentation/frontends/selection.h \ src/presentation/frontends/qtfrontend/imagegrabthread.h \ src/presentation/frontends/qtfrontend/preferencesmenu.h \ src/foundation/preferencestool.h \ src/application/modelhandler.h \ src/presentation/frontends/qtfrontend/toolsmenu.h \ src/application/languagehandler.h \ src/technical/video/videofactory.h \ src/technical/video/videoencoder.h \ src/presentation/frontends/qtfrontend/importtab.h \ src/presentation/frontends/qtfrontend/framebar/framebar.h \ src/presentation/frontends/qtfrontend/framebar/framethumbview.h \ src/presentation/frontends/qtfrontend/framebar/filenamesfromurlsiterator.h \ src/presentation/frontends/qtfrontend/framebar/scenearrowbutton.h \ src/presentation/frontends/qtfrontend/framebar/scenethumbview.h \ src/presentation/frontends/qtfrontend/framebar/thumbview.h \ src/presentation/frontends/qtfrontend/framebar/thumbdragger.h \ src/presentation/frontends/qtfrontend/exporttab.h \ src/presentation/frontends/qtfrontend/helpwindow.h \ src/presentation/frontends/qtfrontend/editobserver.h \ src/technical/util.h \ src/technical/stringiterator.h \ src/application/externalcommand.h \ src/application/externalcommandwithtemporarydirectory.h \ src/presentation/frontends/qtfrontend/aboutdialog.h \ src/technical/libng/devices.h \ src/technical/libng/grab-ng.h \ src/technical/libng/list.h \ src/technical/libng/struct-dump.h \ src/technical/libng/struct-v4l2.h \ src/technical/libng/struct-v4l.h \ src/technical/libng/videodev2.h \ src/technical/libng/videodev.h \ src/presentation/frontends/qtfrontend/devicetab.h \ src/domain/undo/command.h \ src/domain/undo/undoredoobserver.h \ src/domain/undo/commandlogger.h \ src/domain/undo/addallcommands.h \ src/domain/undo/executor.h FORMS += src/presentation/frontends/qtfrontend/helpbrowser.ui \ src/presentation/frontends/qtfrontend/toolsmenu.ui SOURCES += src/config.cpp \ src/main.cpp \ src/domain/domainfacade.cpp \ src/domain/observernotifier.cpp \ src/foundation/logger.cpp \ src/domain/animation/animation.cpp \ src/domain/animation/animationimpl.cpp \ src/domain/animation/frame.cpp \ src/domain/animation/sound.cpp \ src/domain/animation/scenevector.cpp \ src/presentation/imagecache.cpp \ src/presentation/frontends/nonguifrontend/nonguifrontend.cpp \ src/presentation/frontends/qtfrontend/mainwindowgui.cpp \ src/presentation/frontends/qtfrontend/qtfrontend.cpp \ src/application/runanimationhandler.cpp \ src/domain/undo/commandadd.cpp \ src/domain/undo/commandmove.cpp \ src/domain/undo/commandremove.cpp \ src/domain/undo/commandsetimage.cpp \ src/domain/undo/commandaddsound.cpp \ src/domain/undo/commandrenamesound.cpp \ src/domain/undo/commandremovesound.cpp \ src/domain/undo/commandaddscene.cpp \ src/domain/undo/commandmovescene.cpp \ src/domain/undo/commandremovescene.cpp \ src/domain/undo/filelogger.cpp \ src/domain/animation/workspacefile.cpp \ src/application/camerahandler.cpp \ src/presentation/frontends/qtfrontend/frameview.cpp \ src/presentation/frontends/qtfrontend/flexiblespinbox.cpp \ src/presentation/frontends/qtfrontend/menuframe.cpp \ src/presentation/frontends/qtfrontend/flexiblelineedit.cpp \ src/application/soundhandler.cpp \ src/presentation/frontends/qtfrontend/framepreferencesmenu.cpp \ src/application/editmenuhandler.cpp \ src/domain/animation/scene.cpp \ src/technical/projectserializer.cpp \ src/technical/audio/ossdriver.cpp \ src/technical/audio/oggvorbis.cpp \ src/technical/audio/audioformat.cpp \ src/technical/grabber/imagegrabber.cpp \ src/technical/grabber/commandlinegrabber.cpp \ src/presentation/frontends/qtfrontend/imagegrabthread.cpp \ src/presentation/frontends/qtfrontend/preferencesmenu.cpp \ src/foundation/preferencestool.cpp \ src/application/modelhandler.cpp \ src/presentation/frontends/qtfrontend/toolsmenu.cpp \ src/application/languagehandler.cpp \ src/technical/video/videofactory.cpp \ src/technical/video/videoencoder.cpp \ src/presentation/frontends/qtfrontend/importtab.cpp \ src/presentation/frontends/qtfrontend/framebar/framebar.cpp \ src/presentation/frontends/qtfrontend/framebar/framethumbview.cpp \ src/presentation/frontends/qtfrontend/framebar/filenamesfromurlsiterator.cpp \ src/presentation/frontends/qtfrontend/framebar/scenearrowbutton.cpp \ src/presentation/frontends/qtfrontend/framebar/scenethumbview.cpp \ src/presentation/frontends/qtfrontend/framebar/thumbview.cpp \ src/presentation/frontends/qtfrontend/framebar/thumbdragger.cpp \ src/presentation/frontends/qtfrontend/exporttab.cpp \ src/presentation/frontends/qtfrontend/helpwindow.cpp \ src/presentation/frontends/qtfrontend/editobserver.cpp \ src/technical/util.cpp \ src/technical/stringiterator.cpp \ src/application/externalcommand.cpp \ src/application/externalcommandwithtemporarydirectory.cpp \ src/presentation/frontends/qtfrontend/aboutdialog.cpp \ src/technical/libng/devices.c \ src/technical/libng/grab-ng.c \ src/technical/libng/struct-dump.c \ src/technical/libng/struct-v4l2.c \ src/technical/libng/struct-v4l.c \ src/technical/libng/plugins/drv0-v4l2.c \ src/technical/libng/plugins/drv1-v4l.c \ src/presentation/frontends/qtfrontend/devicetab.cpp \ src/domain/undo/command.cpp \ src/domain/undo/undoredoobserver.cpp \ src/domain/undo/commandlogger.cpp \ src/domain/undo/executor.cpp \ src/domain/undo/addallcommands.cpp \ src/domain/undo/random.cpp TRANSLATIONS += translations/stopmotion_no_nb.ts \ translations/stopmotion_no_nn.ts \ translations/stopmotion_no_se.ts \ translations/stopmotion_de.ts \ translations/stopmotion_sv.ts \ translations/stopmotion_fr.ts \ translations/stopmotion_br.ts \ translations/stopmotion_dk.ts \ translations/stopmotion_fi.ts \ translations/stopmotion_gr.ts \ translations/stopmotion_he.ts \ translations/stopmotion_ru.ts \ translations/stopmotion_es.ts \ translations/stopmotion_kl.ts \ translations/stopmotion_cz.ts \ translations/stopmotion_sl.ts \ translations/stopmotion_pt.ts \ translations/stopmotion_it.ts \ translations/stopmotion_tr.ts \ translations/stopmotion_zh_TW.ts \ translations/stopmotion_ar.ts DEPENDPATH += src \ src/domain \ src/foundation \ src/presentation \ src/domain/animation \ src/presentation/frontends/nonguifrontend \ src/presentation/frontends/qtfrontend INCLUDEPATH += . \ src \ src/presentation/frontends/qtfrontend \ src/presentation/frontends/nonguifrontend \ src/foundation \ src/domain \ src/domain/animation \ src/presentation LIBS += -lSDL_image -ltar -lvorbisfile -lX11 DISTFILES += src/config.cpp.in \ graphics/stopmotion.png \ stopmotion.pro.in \ stopmotion.desktop \ stopmotion.mime \ stopmotion.1 \ configure \ AUTHORS \ README \ COPYING \ $$system(ls -1 manual/*.html) \ $$system(ls -1 manual/graphic/*.png) \ $$system(ls -1 manual/icons/*.png) \ $$system(ls -1 manual/screenshots/*.png) \ $$system(ls -1 translations/*.ts | sed -e 's/translations\\(.*\\)\\.ts$/build\\1\\.qm/') DISTFILES -= stopmotion.pro \ src/config.cpp \ stopmotion-d CONFIG += link_pkgconfig isEmpty(PREFIX) { PREFIX = /usr/local } PKGCONFIG += sdl SDL_image vorbisfile libxml-2.0 DEFINES += PREFIX_PATH=\"\\\"$${PREFIX}\\\"\" TEMPLATE = app DESTDIR=. CONFIG(release,debug|release) { TARGET=stopmotion OBJECTS_DIR=build/release DEFINES+= NO_DEBUG } CONFIG(debug,debug|release) { TARGET=stopmotion-d OBJECTS_DIR=build/debug } MOC_DIR = build RCC_DIR = build UI_DIR = build target.path = $${PREFIX}/bin translations.path = $${PREFIX}/share/stopmotion/translations translations.files = build/*.qm htmldoc.path = $${PREFIX}/share/doc/stopmotion/html htmldoc.files = manual/*.html htmldoc.extra = $(INSTALL_DIR) manual/graphic $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html; htmldoc.extra += $(INSTALL_DIR) manual/icons $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html; htmldoc.extra += $(INSTALL_DIR) manual/screenshots $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html; icon.path = $${PREFIX}/share/icons icon.files = graphics/stopmotion.svg desktop.path = $${PREFIX}/share/applications desktop.files = stopmotion.desktop # Dummy target to fix permissions. dummy.path = $${PREFIX}/bin dummy.extra += chmod 644 $(INSTALL_ROOT)/$${PREFIX}/share/stopmotion/translations/*.qm $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html/*.html \ $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html/graphic/* $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html/icons/* \ $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html/screenshots/*; dummy.extra += chmod 755 $(INSTALL_ROOT)/$${PREFIX}/share/stopmotion/translations $(INSTALL_ROOT)/$${PREFIX}/bin/$(QMAKE_TARGET) \ $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html/graphic \ $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html/icons \ $(INSTALL_ROOT)/$${PREFIX}/share/doc/stopmotion/html/screenshots; INSTALLS += target translations htmldoc icon desktop dummy QMAKE_STRIP=: # Build translations QMAKE_EXTRA_COMPILERS += lrelease lrelease.input = TRANSLATIONS lrelease.output = ${QMAKE_FILE_BASE}.qm lrelease.commands = $$[QT_INSTALL_BINS]/lrelease ${QMAKE_FILE_IN} -qm build/${QMAKE_FILE_BASE}.qm lrelease.CONFIG += no_link target_predeps # Build and run tests with make test QMAKE_EXTRA_TARGETS += test test.commands = cd src/test && qmake && make test stopmotion-0.8.0/translations/000077500000000000000000000000001234321124500164505ustar00rootroot00000000000000stopmotion-0.8.0/translations/stopmotion_ar.ts000066400000000000000000002104171234321124500217220ustar00rootroot00000000000000 AboutDialog &About &حول Main developers المطورون الرئيسيون A&uthors المؤلفون Translation ترجمات Czech التشيكية Slovenian السلوفينية French الفرنسية Logo الشعار Coordinating المنسقون Testing المختبرون &Thanks To &شكرا لكل من &Licence Agreement اتفاقية التر&خيص OK موافق About حول This is the Stopmotion application for creating stop motion animations. هذه برمجية Stopmotion لعمل تحريك بتقنية إيقاف الحركة German الألمانية Portuguese البرتغالية Spanish الإسبانية Swedish السويدية Contributors المساهمون DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. فيما يلي يمكن تعيين النبيطة التي يلتقط stopmotion منها الصور و يعرض الفيديو. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. يمكن التعيين من بين النبائط المتحسسة تلقائيا المسرودة فيما يلي أو إضافة نبيطة بنفسك. لا ينصح باستخدام النبائط غير المتحسسة تلقائيا إلا إن كنت مستخدما متمرسا. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. النبيطة التي اخترتها معرّفة بالاسم <b>$VIDEODEVICE</b> تحت مستوردات الفيديو. Name الاسم Description الوصف &Add &أضف &Remove أ&زِل &Edit &حرّر Video device settings إعدادات نبيطة الفيديو Video Device ($VIDEODEVICE): نبيطة الفيديو ($VIDEODEVICE): device النبيطة ExportTab Name الاسم Description الوصف &Add &أضف &Remove &أزِل &Edit &حرر Encoder settings إعدادات الترميز Do you want to be asked for an output file everytime you choose to export? أتريد تعيين ملف الإخراج قبل كل تصدير؟ Yes نعم No لا Set default output file: عيّن ملف الإخراج المبدئي: Browse تصفّح Start encoder: شغّل المُرمِّز: Stop encoder: أوقف المُرمِّز: Choose output file عيّن ملف الإخراج Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. فيما يلي يمكن تعيين أي البرمجيات/الصيرورات ينبغي استخدامها لترميز المشروع الحالي إلى ملف فيديو. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. ينبغي استخدام <b>$IMAGEPATH</b> للدلالة على مسار الصور، و <b>$VIDEOFILE</b> للدلالة على مسار ملف الفيديو. Example with mencoder (jpeg images to mpeg4 video): مثال باستخدام mencoder (من صور بصيغة jpeg إلى فيديو بصيغة mpeg4): ExternalCommand Input to program: مُدخل إلى البرمجية: Submit أودِع Close أغلِق Output from external command أخرج عبر برمجية خارجية Result النتيجة Failed! فشلت العملية! Successfull! تمّت العملية بنجاح! Form Form استمارة FrameBar Frame number: رقم الإطار: FramePreferencesMenu Add &sound أضف &صوتا &Remove Sound أ&زل الصوت Change name غيّر الاسم Sounds: الأصوات: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>أضِف صوتا</h4> <p>باستخدام هذا الزر تمكن <em>إضافة أصوات</em> إلى الإطار الذي تختاره.</p> <p>الصوت سيبدأ إصداره مع ظهور هذا الإطار مستمرا حتى إنتهاءه.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>أزل الصوت</h4> <p>يمكن باستخدام هذا الزر أن <em>تزيل</em> الصوت عن هذا الإطار.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>غيّر الاسم</h4> <p>باستخدام هذا الزر يمكن تغيير اسم الصوت المُعيَّن <BR>لا تأثير لتغيير الاسم سوى تسهيل العمل.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4><h4>الأصوات</h4> <p>هذه القائمة تظهر كل الأصوات المرتبطة بهذا الإطار.</p><p>سيبدأ تشغيل الصوت مع ظهور هذا الإطار وسيستمر حتى إنتهاءه.</p> FrameView Warning تنبيه Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. فشل التقاط الصورة، قد يحدث هذا إن كنت تحاول الالتقاط من نبيطة غير صحيحة. تأكد من إعدادات الالتقاط في قائمة التفضيلات. You have to define an image grabber to use. This can be set in the preferences menu. ينبغي عليك تعيين لاقط للصور لاستخدام هذه الوظيفة. يمكن تعيين اللاقط في قائمة التفضيلات. Pre poll command does not exists You do not have the given grabber installed on your system اللاقط المعيّن ليس متصلا بهذا النظام المغتنم المعين غير مثبت على هذا النظام. No video device selected in the preferences menu. لا نبائط فيديو مُعيّنة في قائمة التفضيلات. ImportTab Name الاسم Description الوصف &Add أ&ضف &Remove أ&زل &Edit &حرّر Import device settings اسّتورد إعدادات النبيطة Pre-poll command أمر ما قبل الالتقاط Start deamon شغّل الجنيّ Stop deamon أوقف الجنيّ Below you can set which program/process Stopmotion should use for grabbing images from the selected device. أدناه يمكنك تحديد أي البرمجيات/الصيرورات على stopmotion استخدامها لالتقاط الصور من النبيطة المُعيّنة. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. ينبغي عليك دوما إستخدام <b>$VIDEODEVICE</b> للدلالة على نبيطة الفيديو و <b>$IMAGEFILE</b> للدلالة على ملف الصورة. LanguageHandler English العربية &Translation &ترجمات MainWindow Stopmotion Help Browser متصفح مساعدة Stopmotion Backward السابق Forward اللاحق Close أغلِق MainWindowGUI Ready to rumble ;-) جاهز للانطلاق ;-) &New &جديد &Open ا&فتح <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>افتح</h4> <p>ملف مشروع stopmotion.</p> &Save ا&حفظ Save &As ا&حفظ باسم &Quit أ&نهِ <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>أنهِ</h4> <p>البرمجية.</p> &File &ملف &Undo &تراجع <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>تراجع</h4> <p>عن آخر عملية أجريتها. يمكن ضغط <em>تراجع</em> أكثر من مرة للتراجع عن عمليات سابقة.</p> Re&do أعِد <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>أعِد</h4> <p> إجراء آخر عملية أجريتها. يمكن الضغط على أعِد أكثر من مرة لإعادة أكثر من إجراء تراجعت عنه.</p> Cu&t ق&ص <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>قصّCut</h4> <p>الأطر المعيّنة من التحريك إلى الحافظة لإمكان لصقها لاحقا في مكان آخر.</p> &Copy ان&سخ <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>انسخ</h4> <p>الأطر المُعيَّنة من التحريك إلى الحافظة ﻹمكان لصقها لاحقا في مكان آخر</p> &Paste أ&لصِق <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>ألصِق</h4> <p>الأطر من الحافظة إلى الموضع المُعيَّن.</p> <p>يمكن نسخ/قص الصور من برمجية أخرى ثم استخدام هذا الخيار للصقها في التحريك.</p> &Go to frame انتقل إلى الإ&طار <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>انتقل إلى الإطار</h4> <p> الذي تختاره من قائمة الإطارات الموجودة.</p> &Edit &حرّر &Settings إ&عدادات What's &This ما &هذا <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>ما هذا</h4> <p>يظهر مؤشر "ما هذا؟" الذي يظهر معلومات مفيدة كهذه.</p> &About ح&ول <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>حول</h4><p>يعرض صندوق معلومات صغير فيه معلومات عن البرمجية و أسماء المبرمجين و المترجمين و المساهمين في تطويرها</p> &Help مساع&دة <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>شريط الإطارات</h4> <p> في هذه المساحة ترى الإطارات و المشاهد في التحريكات و تبني التحريك بنقلها و ترتيبها.</p><p>يمكنك الانتقال إلى الالإطار اللاحق و السابق باستخدام <b>أزرار الأسهم</b> أو <b>x</b> و <b>z</b>. <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>قائمة الأدوات</h4><p>هذه قائمة الأدوات حيث معظم الأزرار و التحكمات التي تستخدمها في العمل على تحريك</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>قائمة تفضيلات الإطار</h4> <p>من هذه القائمة يمكن تعيين تفضيلات الإطارات المُعيَّنة، مثل <b>نص الترجمة</b> و <b>المؤثرات الصوتية</b>، إلخ.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>قائمة الانتقال إلى إطار</h4> <p>بتعيين رقم إطار هنا فإنك تنتقل للعمل عليه</p> Go to frame: انتقل إلى الإطار: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>رقم الإطار</h4><p>تظهر هذه المنطقة رقم الإطار المُعيَّن</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>منظور الإطارات</h4><p>هنا ترى الإطار المُعيّن، يمكنك تشغيل التحريك في هذه النافذة بضغط زرّ <b>شغِّل</b></p> Unsaved changes تغييرات غير محفوظة There are unsaved changes. Do you want to save? توجد تغييرات غير محفوظة. أتودّ حفظها؟ &Yes &نعم &No &لا Video فيديو &Export صَدّر <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>جديد</h4> <p>ينشئ مشروعا <em>جديدا</em> .</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automaticly be saved to the previously selected file.</p> <h4>احفظ</h4> <p><em>يحفظ</em> التحريك الحالي كملف مشروع تحريك. <BR>إن كان المشروع قد حُفظ مسبقا فسيتم تحديثه في ذات الملف الذي حفظ فيه مسبقا.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>>احفظ باسم</h4> <p><em>يحفظ</em>التحريك الحالي كملف مشروع تحريك جديد.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>فيديو</h4> <p>يصدّر المشروع الحالي <em>كفيديو</em>.</p>سيظهر مرشد ليدلك. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>صدّر التحريك الحالي كمشروع <em>Cinerella</em> .</p>سيظهر لك مرشد ليدلك. Cinelerra Cinelerra &Configure Stopmotion إعدادات stopmotion Open &Recent افتح الأخيرة New project مشروع جديد Open project افتح مشروعا Save project احفظ المشروع Save project As احفظ المشروع باسم Quit أنهِ Undo تراجع Redo أعِد Cut قُصّ Copy انسخ Paste ألصِق Go to frame انتقل إلى إطار <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>اضبط Stopmotion</h4><p>يفتح هذا نافذة يمكن فيها ضبط Stopmotion للعمل مع نبائط إدخال و إخراج متعددة</p> Configure Stopmotion إعدادات stopmotion What's This ما هذا About حول Warning تنبيه Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? تعذّر إيجاد أي مرمّز لاستخدامه لتصدير الفيديو. يمكن ذبط ذلك في قائمة التفضيلات. تصدير فيديو لن يكون ممكنا حتى تعيين مرمّز . هل تود تعيينه الآن؟ Export to video file صَدّر إلى ملف فيديو The registered encoder is not valid. Do you want to check your settings in the preferences menu? مُرمِّزُ الفيديو المسجّل غير صحيح. أتريد التحقق من التضبيطات في قائمة الإعدادات؟ Export to file صَدّر إلى ملف <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>مساعدة</h4> <p>يظهر هذا الزر مربعا فيه دليل استخدام stopmotion</p> Help مساعدة Frame number: رقم الإطار: Choose project file اختر ملف المشروع Save As احفظ باسم ModelHandler Choose frames to add عيّن إطارًا لإضافته Removed the selected frame أزِل الإطار المُعيّن Warning تنبيه You do not have Gimp installed on your system گِمب ليس مُنصّبا على هذا النظام There is no active frame to open ليس هناك إطار فاعل لفتحه The active frame is corrupt الإطار المُعيّن معطوب Failed to start Gimp! فشل تشغيل گِمب! PreferencesMenu Video &Import ا&ستورد فيديو Video &Export &صَدّر فيديو Apply طبّق Close أغلِق Preferences Menu قائمة التفضيلات Video &Device نبي&طة الفيديو QtFrontend Warning تنبيه Fatal خطأ فادح Cancel ألغِ vgrabbj VGA singleshot تشغيل vgrabbj للقطة VGA ,واحدة vgrabbj VGA deamon Starts vgrabbj as a deamon. Pretty fast. يشغّل vgrabbj كجنيّ. سريع للغاية. Question سؤال The simplest setting. Fairly slow الإعدادات الأبسط. بطيئة إلى حد ما Exports from jpeg images to mpeg1 video يصدر من صور jpeg إلى فيديو mpeg1 A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) توجد نسخة جديدة من ملف الإعدادات تحوي بضع قيم مبدئية جديدة، أتريد استخدامها؟ (النسخة القديمة ستُحفظ في ~/stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video تصدير من صور jpeg إلى فيديو mpeg2 Exports from jpeg images to mpeg4 video تصدير من صور jpeg إلى فيديو mpeg4 dvgrab Grabbing from DV-cam. (EXPERIMENTAL) يجري الالتقاط من كاميرا DV (تجريبي) videodog singleshot استخدام videodog للقطة واحدة Videodog. Grabbing from DV-cam. يجري الالتقاط من كاميرا DV. RunAnimationHandler Running animation يجري عرض التحريك SoundHandler Sounds (*.ogg) أصوات (*.ogg) Sound name اسم الصوت Enter the name of the sound: أدخل اسما للصوت: Choose sound file اختر ملف صوت ToolsMenu FPS chooser منتقي عدد الأطر في الثانية <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>اختيار عدد الأطر في الثانية</h4> <p>بتغيير القيمة في واجهة الاختيار فإنك تعيّن سرعة التحريك في <b>إطار العرض</b> .</p> <p>لبدء تشغيل التحريك اضغط زر <b>شغّل التحريك</b> .</p> Number of images: عدد الصور: Mix امزج Diff الفرق Playback شغّل <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>أضف أطرا (CTRL+F)</h4> <p>اضغط هذا الزر <em>لإضافة</em> أطر إلى هذا التحريك.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>أزل الاختيار (Delete)</h4> <p>اضغط هذا الزر <em>لإزالة</em> الإطارات المُعيّنة من التحريك.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>أضف مشهدًا (CTRL+E)</h4> <p>اضغط هذا الزر <em>لإنشاء</em> <em>مشهد]</em> جديدٍ في هذا التحريك.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>أزِل مشهدًا (SHIFT+Delete)</h4> <p>اضغط هذا الزر <em>لإزالة</em> المشهد المُعيّن من هذا التحريك.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>راوِح حالة تغيل الكاميرا (C)</h4><p>اضغط هذا الزر لمراوحة حالة الكامرة ما بين التشغيل و الإيقاف</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>إلتقط إطارًا (Space)</h4> <p>اضغط هذا الزرّ <em>لالتقاط</em> صورة من الكاميرا و إدراجها في التحريك</p> <p> يمكن فعل ذلك كذلك بضغط <b>مفتاح المسافة</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> عدد الصور<h4><p>بتغيير قيمة هذا المنزلق يمكنك تعيين عدد الصور رجوعا في التحريك التي ينبغي مزجها مع الكامرا أو إن كنت في طور العرض فإنه يعيّن عدد الصور التي تُعرض.</p><p>بمزج الصور السابقة بما يظهر في الكامرا يمكنك بيسر مشاهدة ما ستبدو عليه اللقطة التالية بالنسبة إلى سابقتها و بذلك تصنع تحريكا أسلس!</p> <h4>Play animation (K, P)</h4> <h4>شغّل التحريك (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>أوقف التحريك (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>الإطار السابق (J, شمال)</h4> <h4>Next frame (L, Right)</h4> <h4>الإطار اللاحق (L, يمين)</h4> <h4>Previous scene (I)</h4> <h4>المشهد السابق (I)</h4> <h4>Next scene (O)</h4> <h4>المشهد اللاحق (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>كرّر التحريك (CTRL+L)</h4> <p>بهذا الزر يمكنك اختيار ما إن كنت تريد تشغيل التحريك مرة أم تريد تكراره بلا توقف.</p> Notice ملاحظة Playback only currently works when running the grabber as a deamon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a deamon. حاليا يعمل العرض و حسب أثناء تشغيل اللاقط في طور الجنيّ. يمكنك تشغيل لاقط الصور في طور الجنيّ من قائمة التفضيلات (CTRL+P) Auto تلقائيا Pr sec في الثانية Pr min في الدقيقة Pr hr في الساعة <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> <h4>شغّل گِمب</h4> <p>اضغط هذا الزر لفتح الإطار المعروض في برمجية تحرير الصور گِمب</p> <p>لاحظ أنه يمكن كذلك سحب الصور من شريط الصور إلى گِمب مباشرة</p> stopmotion-0.8.0/translations/stopmotion_br.ts000066400000000000000000001624541234321124500217320ustar00rootroot00000000000000 AboutDialog &About Main developers A&uthors Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Licence Agreement OK About This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Description &Add &Remove &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab Name Description &Add &Remove &Edit Encoder settings Do you want to be asked for an output file everytime you choose to export? Yes No Set default output file: Browse Start encoder: Stop encoder: Choose output file Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! Form Form FrameBar Frame number: FramePreferencesMenu Add &sound &Remove Sound Change name Sounds: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> FrameView Warning Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. You have to define an image grabber to use. This can be set in the preferences menu. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. ImportTab Name Description &Add &Remove &Edit Import device settings Pre-poll command Start daemon Stop daemon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) English &Translation MainWindow Stopmotion Help Browser Backward Forward Close MainWindowGUI Ready to rumble ;-) &New &Open <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> &Save Save &As &Quit <h4>Quit</h4> <p><em>Quits</em> the program.</p> &File &Undo <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> Re&do <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> Cu&t <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> &Copy <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> &Paste <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> &Go to frame <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> &Edit &Settings What's &This <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> &About <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> &Help <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> Go to frame: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> Unsaved changes There are unsaved changes. Do you want to save? &Yes &No Video &Export <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. Cinelerra &Configure Stopmotion Open &Recent New project Open project Save project Save project As Quit Undo Redo Cut Copy Paste Go to frame <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> Configure Stopmotion What's This About Warning Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Export to video file The registered encoder is not valid. Do you want to check your settings in the preferences menu? Export to file <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> Help Frame number: Choose project file Save As ModelHandler Choose frames to add Removed the selected frame Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Export Apply Close Preferences Menu Video &Device QtFrontend Warning Fatal Cancel vgrabbj VGA singleshot vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Question The simplest setting. Fairly slow Exports from jpeg images to mpeg1 video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exports from jpeg images to mpeg4 video dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation SoundHandler Sounds (*.ogg) Sound name Enter the name of the sound: Choose sound file ToolsMenu FPS chooser <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> Number of images: Mix Diff Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Next scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_cz.ts000066400000000000000000002202141234321124500217300ustar00rootroot00000000000000 AboutDialog &About O programu Main developers A&uthors Autoři Translation Czech Slovenian French Logo Coordinating Testing &Thanks To Poděkování &Licence Agreement Licenční podmínky OK About O programu This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Název Description Popis &Add Přid&at &Remove &Smazat &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab <p>Below you can set which program/process stopmotion should use for encoding the currently active project to a video file.</p><p>You can use $IMAGEPATH to represent the image path (absolute path to the directory where the images can be found). You should always use <b>$VIDEOFILE</b> to represent the output file (the videofile generated by the encoder) in the <b>command line</b>. This is independent of how you decides to select it (select it for each export or have a default file).<br></p><p> Example with mencoder (converting jpg to mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> <p>Zde můžete nastavit jaký program/proces má stopmotion používat pro kódování právě aktivního projektu do video souboru.</p> Můžete použít <b>$IMAGEPATH</b> pro nastavení absolutní cesty k adresáři s obrázky. Vždy byste měli nastavit <b>$VIDEOFILE</b> pro nastavení výstupního souboru (video soubor generovaný enkodérem) v <b>příkazové řádce</b>. Toto nastaveníje nezávislé na tom, jestli vybíráte pokaždé výstupní soubor nebo máte výchozí soubor pro export.<br></p><p> Příklad s mencoderem (konverze jpg do mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> Active Aktivní Name Název Description Popis &Add Přid&at &Remove &Smazat &Edit &Editovat Encoder settings Nastavení enkodéru Do you want to be asked for an output file everytime you choose to export? Chcete pokaždé při exportu zvolit výstupní soubor? Yes Ano No Ne Set default output file: Výchozí výstupní soubor: Browse Procházet Start encoder: Spustit enkodér: Stop encoder: Zastavit enkodér: Choose output file Výstupní soubor Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! FileDialog Go to home directory Domovský adresář (~) Form Form FrameBar Frame number: FramePreferencesMenu Add &sound Přidat &zvuk &Remove Sound S&mazat zvuk Change name Přejmenovat Sounds: Zvuky: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Přidat zvuk</h4><p>Tímto tlačítkem můžete <em>přidat zvuky</em> k právě vybranému rámu. <p>Zvuk se začne přehrávat ve chvíli zobrazení tohoto rámu.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Smazat zvuk</h4><p>Tímto tlačítkem můžete <em>odebrat</em> vybraný zvuk z tohoto rámu.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Přejmenovat</h4> <p>Tímto tlačítkem můžete změnit název vybraného zvuku. <br>Nebude to mít žádný vliv na práci programu, ale pokud zvolíte vhodný název, bude se vám lépe pracovat s animací.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Zvuky</h4><p>V tomto seznamu jsou všechny zvuky přidané k tomuto rámu.</p><p>Zvuk se začne přehrávat ve chvíli zobrazení tohoto rámu.</p> FrameView Warning Varování Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Grabování selhalo. To se může stát když zkoušíte grabovat z neplatného zařízení. Prosím zkontrolujte nastavení grabberu v menu Nastavení. You have to define an image grabber to use. This can be set in the preferences menu. Musíte vybrat (v menu Nastavení) grabovací program, který chcete používat. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. HelpWindow &New Window &Nové okno &Open File &Otevřít soubor &Print &Tisk &Close &Zavřít &Backward &Zpět &Forward &Dopředu &Home &Domů Add Bookmark Přidat záložku &File &Soubor &Go &Jít History Historie Bookmarks Záložky Backward Zpět Forward Dopředu Home Domů ImportTab <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> </p> <p>Zde můžete nastavit jaký program/proces (grabber) má stopmotion používat pro zachytávání videa z webkamery a jeho zobrazování.<br><br></p> Active Aktivní Name Název Description Popis &Add Přid&at &Remove &Smazat &Edit &Editovat Import device settings Importovat nastavení zařízení Pre-poll command Pre-poll příkaz Start daemon Spustit démona Stop daemon Zastavit démona Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English Czech English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Čeština &Translation MainWindow Stopmotion Help Browser Backward Zpět Forward Dopředu Close MainWindowGUI Ready to rumble ;-) Připravenej ;-) &New &Nový &Open &Otevřít &Save &Uložit Save &As Uložit j&ako Video Video Cinelerra Cinelerra &Quit &Konec &Undo &Zpět Re&do &Znovu Cu&t V&yjmout &Copy &Kopírovat &Paste &Vložit &Go to frame &Jít na rám &Configure Stopmotion &Nastavení Stopmotion What's &This Co to je? &Help Nápověda &About O programu Frame number: 0 Číslo rámu: 0 Go to frame: Jít na rám: &File Soubor Open &Recent Nedávno otevřené &Export Exportovat &Edit Editovat &Settings Nastavení &Languages Jazyky <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Nový</h4><p>Vytvoří nový projekt</p> New project Nový projekt <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Otevřit</h4><p>Otevře existující projekt</p> Open project Otevřít projekt <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Uložit</h4><p>Uloží animaci do projektu Stopmotion. <br> Pokud byl tento projekt už dříve uložen, bude původní soubor automaticky přepsán novým.</p> Save project Uložit projekt <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Uložit jako</h4><p>Uloží animaci do projektu Stopmotion.</p> Save project As Uložit projekt jako.... <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4><p>Export projektu do video souboru s pomocí průvodce.</p> <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4><p>Exportuje animaci do projektu programu Cinelerra (s pomocí průvosce)</p> <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Konec</h4><p>Ukončí program</p> Quit Konec <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Zpět</h4><p>Vrátí zpět poslední operaci. Může být použito několikrát po sobě.</p> Undo Zpět <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Znovu</h4><p>Provede znovu poslední operaci.</p> Redo Znovu <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Vyjmout</h4> <p>Odstraní vybrané rámy z animace a vloží je schránky, takže je můžete použít někde jinde.</p> Cut Vyjmout <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopírovat</h4> <p>Zkopíruje vybrané rámy do schránky pro použití jinde.</p> Copy Kopírovat <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Vložit</h4> <p><Vloží di animace rámy ze schránky.</p> Paste Vložit <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Jít na rám</h4> <p>V okně, které se objeví dole, můžete určit číslo rámu, na který se chcete přesunout.</p> Go to frame Jít na rám <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Nastavení Stopmotion</h4> <p>Otevře okno, kde můžete konfigurovat vstup/výstup.</p> Configure Stopmotion Nastavení Stopmotion <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Co to je</h4> <p>Po najetí kurzorem na vybraný prvek se objeví informace (jako je tahle).</p> What's This Co to je <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Nápověda</h4> <p>Manuál k programu Stopmotion.</p> Help Nápověda <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>O programu</h4> <p>Zobrazí malé informační okno, kde si můžete přečíst různé informace jako třeba jména autorů tohoto programu.</p> About O programu <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Číslo rámu</h4><p>Zde se zobrazuje číslo (pořadí) právě vybraného rámu.</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>FrameView</h4><p>Tady vidíte právě vybraný rám. Také se zde po kliknutí na tlačítko <b>Přehrát</b> přehrává animace.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Jít na rám</h4> <p>Zde můžete zadat číslo rámu, na který se má program přesunout.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Nastavení rámu</h4> <p>V tomto menu můžete nastavit pro vybraný rám (nebo více rámů) věci jako <b>titulky</b>, <b>zvuky</b> atp.</p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Nástroje</h4> <p>V tomto menu je většina toho, co budete potřebovat při práci s animací.</p> <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>FrameBar</h4> <p>V této oblasti vidíte rámy a scény vaší animace. Animaci můžete měnit posunem rámů.</p><p>Pohyb mezi rámy je možný pomocí <b>kurzorových kláves (šipky)</b> a také písmen <b>z</b> a <b>x</b></p> Unsaved changes Neuložené změny There are unsaved changes. Do you want to save? V animaci jsou neuložené změny. Chcete soubor uložit? &Yes Ano &No Ne Save File Uložit soubor Warning Varování Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Nemůžu najít žádný enkodér pro export videa. Můžete ho nastavit v menu "Nastavení". Dokud tam žádný nenastavíte, nebude export videa možný. Chcete ho nyní nastavit? Export to video file Export do video souboru The registered encoder is not valid. Do you want to check your settings in the preferences menu? Enkodér je neplatný. Chcete zobrazit nastavení? Export to file Export do souboru <p>This is the stopmotion application for creating stopmotion animations.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p>Tohle je program Stopmotion pro vytváření "stopmotion" animací..</p><p>(c) 2005, Fredrik Berg Kjølstad a Bjørn Erik Nilsen</p> <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> <p><b>Hlavní vývojáři</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> A&uthors Autoři <p><b>Coordinating</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br></p> <p><b>Spolupráce</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testování</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Překlad</b><br>Jiří Helebrant &lt;helb@skatekralovice.com&gt;</p> &Thanks To Poděkování &Licence Agreement Licenční podmínky Stopmotion User Manual Manuál Frame number: Choose project file Save As ModelHandler Choose frames to add Vyberte rámy, které se mají přidat Removed the selected frame Smazat označený rám Warning Varování You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Import videa Video &Export Export videa Apply Close Preferences Menu Video &Device QtFrontend Cancel Storno Progress Průběh Warning Varování Fatal Chyba vgrabbj VGA singleshot vgrabbj VGA singleshot The simplest setting. Fairly slow Nejjednodušší nastavení. Poměrně pomalé... vgrabbj VGA daemon vgrabbj VGA démon Starts vgrabbj as a daemon. Pretty fast. Startuje vgrabbj jako démona. Poměrně rychlé.... Exports from jpeg images to mpeg1 video Exportuje z obrázků (jpeg) do videa (mpeg1) mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> Question Otázka &Yes &Ano &No &Ne A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exportuje z obrázků (jpeg) do videa (mpeg2) Exports from jpeg images to mpeg4 video Exportuje z obrázků (jpeg) do videa (mpeg4) dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation Přehrávání animace SoundHandler Sounds (*.ogg) Zvuky (*.ogg) Sound name Název zvuku Enter the name of the sound: Vložte název pro zvuk: Choose sound file ToolsMenu FPS chooser Výběr FPS Number of images: Počet obrázků: Mix Mix Diff Rozdíl Playback Přehrávání <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Přidat rámy</h4> <p>Kliknutím na toto tlačítko můžete přidat rámy do vaší animace.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Smazat výběr</h4> <p>Odstraní vybrané rámy z animace.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Nová scéna</h4> <p>Přidá novou scénu do vaší animace.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Smazat scénu</h4> <p>Odstraní vybranou scénu z animace.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Zapnout/vypnout kameru</h4> <p>Zapne nebo vypne vstup z kamery.</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Zachytit rám</h4> <p>Kliknutí na toto tlačítko přidá obraz z kamery do animace.</p> <p>Mnohem rychleji to jde <b>mezerníkem</b>.</p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Počet obrázků</h4> <p>Změnou hodnoty můžete nastavit kolik obrázků (směrem zpět) v animaci má být přidáno na kameru nebo kolik se jich má přehrát (při přehrávání)</p> <p>Přidání obrázku (nebo obrázků) na kameru můžete snadněji vidět vztah dalšího rámu k ostatním a vytvořit tak plynulejší animaci!</p> <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Výběr FPS</h4> <p>Zde můžete nastavit rychlost animace ve FrameViewu (ve snímcích za sekundu)</p> <h4>Play animation (K, P)</h4> <h4>Přehrát animaci</h4> <h4>Stop animation (K, P)</h4> <h4>Zastavit animaci</h4> <h4>Previous frame (J, Left)</h4> <h4>Předchozí rám</h4> <h4>Next frame (L, Right)</h4> <h4>Další rám</h4> <h4>Previous scene (I)</h4> <h4>Přechozí scéna</h4> <h4>Next scene (O)</h4> <h4>Další scéna</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Přehrávat dokola</h4><p>Můžete určit, jestli se má animace přehrát jen jednou nebo stále opakovat dokola.</p> Notice Poznámka Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Přehrávání nyní funguje pouze když grabber běží jako démon. Toho můžete docílit v menu "Nastavení". Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_de.ts000066400000000000000000001771651234321124500217240ustar00rootroot00000000000000 AboutDialog &About Ü&ber Main developers Hauptentwickler A&uthors A&utoren Translation Übersetzung Czech Tschechich Slovenian Slowenisch French Französisch Logo Logo Coordinating Koordination Testing Testen &Thanks To &Dank an &Licence Agreement &Lizenzabkommen OK OK About Info This is the Stopmotion application for creating stop motion animations. Dies ist das Stopmotion Programm um Stopmotion-Animationsfilme zu erstellen. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Unten können sie das Gerät einstellen, welches für Video Ein- und Ausgabe genutzt werden soll. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Wählen sie eines der automatisch erkannten Geräte oder fügen sie ein Gerät hinzu, welches nicht automatisch erkannt wurde. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Das gewählte Gerät wurde als <b>$VIDEODEVICE</b> unter Video Import erkannt. Name Name Description Beschreibung &Add &Hinzufügen &Remove &Entfernen &Edit &Bearbeiten Video device settings Video Geräteeinstellung Video Device ($VIDEODEVICE): Video Gerät ($VIDEODEVICE):(sp) device Gerät ExportTab Name Name Description Beschreibung &Add &Hinzufügen &Remove &Entfernen &Edit &Bearbeiten Encoder settings Encoder Einstellungen Do you want to be asked for an output file everytime you choose to export? Möchten sie jedesmal nach einem Dateinamen gefragt werden, wenn sie Export wählen ? Yes Ja No Nein Set default output file: Wählen sie die Standard Ausgabe-Dateinamen: Browse DurchsuchenBlättern Start encoder: Encoder starten: Stop encoder: Encoder stoppen: Choose output file Wählen sie die Ausgabe-Datei Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Unten können sie auswählen, welches Programm benutzt werden soll, um das aktuelle Projekt zu einer Videodatei zu encodieren. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Sie sollten immer <b>$IMAGEPATH</b> und <b>$VIDEOFILE</b> benutzen um den Bilder-Ordner und die Videodatei zu bestimmen. Example with mencoder (jpeg images to mpeg4 video): mencoder-Beispiel (jpeg images to mpeg4 video): ExternalCommand Input to program: Eingabe zum Programm: Submit Abschicken Close Schließen Output from external command Ausgabe von exterenem Kommando Result Ergebnis Failed! Fehlgeschlagen! Successfull! Erfolgreich! Form Form Formular FrameBar Frame number: Bildnummer: FramePreferencesMenu Add &sound &Ton hinzufügen &Remove Sound Ton &entfernen Change name Namen ändern Sounds: Töne: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Ton hinzufügen</h4> <p>Mit diesem Knopf können sie <em>Töne zum gewählten Bild hinzufügen</em>.</p> <p>Der Ton beginnt, wenn das Bild erscheint und endet auch mit dem Ende des Bildes.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Ton entfernen</h4> <p>Mit diesem Knopf können sie den gewälten Ton von diesem Bild <em>entfernen</em>.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Namen ändern</h4> <p>Mit diesem Knopf können sie den Namen des gewählten Tons ändern.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Töne</h4> <p>Diese Liste zeigt alle Töne die zu diesem Bild gehören.</p> FrameView Warning Warnung Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Grabbing fehlgeschlagen. Bitte überprüfen sie ihre Grabber-Einstellungen im Einstellungen-Menü. You have to define an image grabber to use. This can be set in the preferences menu. Sie müsen im Einstellungs-Menü einen Videograbber auswählen. Pre poll command does not exists Pre poll Komando existiert nicht You do not have the given grabber installed on your system Der eingestellete Videograbber ist auf ihrem System nicht installiert No video device selected in the preferences menu. Sie haben kein Video-Gerät im Einstellungs-Menü gewählt. ImportTab Name Description Beschreibung &Add &Hinzufügen &Remove &Entfernen &Edit &Bearbeiten Import device settings Geräte-Einstellungen importieren Pre-poll command Start daemon Hintergrungprozess starten Stop daemon Hintergrungprozess stoppen Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Unten können sie das Programm einstellen, welches für Videograbbing genutzt werden soll. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Sie sollten immer <b>$VIDEODEVICE</b> und <b>$IMAGEFILE</b> benutzen um das Video-Gerät und die Bilddatei zu bestimmen. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Deutsch English Deutsch &Translation &Übersetzung MainWindow Stopmotion Help Browser Stopmotion Hilfe-Browser Backward Zurück Forward Vor Close Schließen MainWindowGUI Ready to rumble ;-) Los geht's ! &New &Neu &Open &Öffnen <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Öffnen</h4> <p><em>öffnet</em> eine Stopmotion Projektdatei.</p> &Save &Speichern Save &As Speichern &als &Quit &Beenden <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Beenden</h4> <p><em>Beendet</em> das Program.</p> &File &Datei &Undo &Rückgängig <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Rückgängig</h4> <p>Macht eine oder mehrerer Aktionen rückgängig</p> Re&do &Wiederherstellen <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Wiederherstellen</h4> <p>Die letzte Operation wird wiederhergestellt. Sie können dies mehrmals tun.</p> Cu&t &Ausschneiden <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Ausschneiden</h4> <p>Schneidet die gewählten Bilder aus und verschibt sie in die Zwischenablage. Anschliessend kann man sie an anderer Stelle wieder einfügen.</p> &Copy &Kopieren <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopieren</h4> <p><em>Kopiert</em> die gewählten Bilder in die Zwischenablage . Danach können sie diese Bilder an einer anderen Stelle einfügen.</p> &Paste &Einfügen <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Einfügen</h4> <p>Fügt Bilder aus der Zwischenablage an der gewählten Position ein</p> <p>Sie können auch Bilder aus anderen Programmen kopieren/ausschneiden und sie hiermit hier einfügen</p> &Go to frame &Springe zu Bild <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Springe zu </h4> <p>Hier können sie zu einem bestimmten Bild springen.</p> &Edit &Bearbeiten &Settings &Einstellungen What's &This &Was ist das? <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>was ist das ?</h4> <p>Der Mauszeiger ändert sich und zeigt hilfreiche Informationen uber das angeklickte Objekt.</p> &About &Info <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Info</h4> &Help &Hilfe <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Bildleiste</h4> <p>In diesem Bereich sehen sie Bilder und Szenen der Animation. Sie diese hin und herschieben.</p><p>Mit den <b>Pfeiltasten</b> oder <b>x</b> und <b>z</b> navigieren sie ein Bild vor oder zurück</p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Werkzeugleiste</h4> <p>Dies ist die Werkzeugleiste, wo sich die wichtigsten Knöpfe befinden, die man zum erstellen und bearbeiten einer Animation benötigt.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Bildeigenschaften Menu</h4> <p>In diesem Menu können sie die Eigenschaften des gewälten Bildes/ der geählten Bilder, z.B. <b>Untertitel</b> und <b>Toneffekte</b> einstellen</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Springe zu Bild Menu </h4> <p>Hier können sie zu einem bestimmten Bild springen.</p> Go to frame: Springe zu Bild: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Bildnummer</h4><p>Dieser Bereich zeigt die Nummer des ausgewählten Bildes</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Bildanzeige</h4><p> In diesem Bereich sehen sie das gewählte Bild. Hier laufen auch die Animationen ab, wenn sie <b>Start</b> drücken.</p> Unsaved changes Nicht gespeicherte Änderungen There are unsaved changes. Do you want to save? Es gibt ungespeicherte Änderungen. Möchten sie speichern? &Yes &Ja &No &Nein Video Video &Export E&xportieren <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Neu</h4> <p>Erzeugt ein <em>neues</em> Project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Speichern</h4> <p>Speichert die aktuelle Animation als Stopmotion Projektdatei. </p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Speichern als</h4> <p>Speichert die aktuelle Animation als Stopmotion Projekt.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Exportiert das aktuelle Projekt als <em>Videodatei</em>.</p>Ein Assistent wird sie dabei unterstützen. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exportiert die aktuelle Animation als ein <em>Cinerella</em> Projekt.</p>Ein Assistent wird sie führen. Cinelerra Cinelerra &Configure Stopmotion Stopmotion &kofigurieren Open &Recent &Zuletzt geöffnete Dateien New project Neues Projekt Open project Projekt öffnen Save project Projekt speichern Save project As Projekt speichern als Quit Beenden Undo Rückgängig Redo Wiederherstellen Cut Ausschneiden Copy Kopieren Paste Einfügen Go to frame Springe zu Bild <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Stopmotion konfigurieren</h4> <p>Dies öffnet ein Fenster in dem sie Stopmotion und verscheidene Ein und Ausgabegeräte <em>konfigurieren</em> können</p> Configure Stopmotion Stopmotion kofigurieren What's This Was ist das? About Info Warning Warnung Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Für den Video-Export konnte kein Encoder gefunden werden. Sie können dies im Einstellungs-Menü ändern. Video-Export wird erst möglich, wenn sie einen Encoder eingestellt haben. Wollen sie dies nun tun ? Export to video file In Videodatei exportieren The registered encoder is not valid. Do you want to check your settings in the preferences menu? Der gewählte Encoder ist nicht gültig. Möchten sie die Einstellungen überprüfen ? Export to file In Datei exportieren <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Hilfe</h4> <p>Dieser Knopf führt sie zum Stopmotion Handbuch</p> Help Hilfe Frame number: Bildnummer: Choose project file Wählen sie eine Projekt-Datei Save As Speichern als ModelHandler Choose frames to add Wählen sie Bilder zum hinzufügen Removed the selected frame Das gewählte Bild wurde entfernt Warning Warnung You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Import Video &Export Video &Export Apply Anwenden Close Schließen Preferences Menu Einstellungen Video &Device Video &Gerät QtFrontend Warning Warnung Fatal Fatal Cancel Abbrechen vgrabbj VGA singleshot vgrabbj VGA Einzelbild vgrabbj VGA daemon vgrabbj VGA Hintergrungprozess Starts vgrabbj as a daemon. Pretty fast. startet vgrabbj als Hintergrungprozess. Ziemlich schnell. Question Frage The simplest setting. Fairly slow Die einfachste Einstellung. Ziemlich langsam. Exports from jpeg images to mpeg1 video Von jpeg-Bildern nach mpeg1-Video exportieren A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Es gibt eine neue Version der Einstellungsdatei mit ein paar zusätzlichen Werten. Möchten sie diese nutzen ? (Ihre alten Einstellungen werden in ~/.stopmotion/preferences.xml.OLD gespeichert.) Exports from jpeg images to mpeg2 video Von jpeg-Bildern nach mpeg2-Video exportieren Exports from jpeg images to mpeg4 video Von jpeg-Bildern nach mpeg4-Video exportieren dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Von DV-Kamera grabben. (EXPERIMENTAL) videodog singleshot videodog Einzelbild Videodog. Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation Animation abspielen SoundHandler Sounds (*.ogg) Töne (*.ogg) Sound name Ton Name Enter the name of the sound: Geben sie einen Namen für diesen Ton ein: Choose sound file Wählen sie eine Tondatei ToolsMenu FPS chooser Bilder pro Sekunde <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Bilder pro Sekunde</h4> <p>Hiermit können sie die Geschwindigkeit einstellen, mi der die Animation im <b>Bildbetrachter</b> abläuft.</p> <p>Um die Animation zu starten, drücken sie den <b>Start</b> Knopf.</p> Number of images: Anzahl der Bilder: Mix Mischen Diff Unterschied Playback Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Bilder hinzufügen</h4> <p>Drücken sie diesen Knopf wenn sie der Animation Bilder hinzufügen wollen.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Auswahl entfernen (Entf)</h4> <p>Drücken sie diesen Knopf um die gewählten Bilder aus der Animation zu entfernen.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Neue Szene</h4> <p>Drücken sie diesen Knopf um der Animation eine neue Szene hinzuzufügen</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Szene entfernen (SHIFT+Entf)</h4> <p>Mit diesem Knopf können sie die gewählte Szene aus der Animation entfernen.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Kamera ein/aus (K)</h4> <p>Hiermit können sie die Kamera ein- und ausschalten</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Bild aufnehmen (Leertaste)</h4> <p>Mit diesem Knopf können sie einzelne Bilder aufnehmen und der Animation hizufügen. Das geht auch in dem sie die <b>Leertaste</b> drücken</p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Anzahl der Bilder</h4> <p>Mit diesem Regler können sie einstellen, wieviele Vorgänger-Bilder der Animation im Kamerabild eingeblendet werden sollten. Im playback-Modus: wie viele Bilder abgespielt werden. </p> <p>Dadurch können sie besser sehen wie das nächste Bild im Verhältnis zu den vorhergehenden Bildern sein wird. Dies ermöglicht gleichmässige Bewegungsabläufe.</p> <h4>Play animation (K, P)</h4> <h4>Animation abspielen</h4> <h4>Stop animation (K, P)</h4> <h4>Animation anhalten</h4> <h4>Previous frame (J, Left)</h4> <h4>ein Bild zurück</h4> <h4>Next frame (L, Right)</h4> <h4>ein Bild vor</h4> <h4>Previous scene (I)</h4> <h4>Vorherige Szene (I)</h4> <h4>Next scene (O)</h4> <h4>Nächste Szene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Endlosschleife (CTRL+L)</h4> <p>Mit diesem Knopf können sie wählen, ob die Animation nur einmal oder in einer Endlosschleife abgespielt werden soll.</p> Notice Hinweis Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Der Playback-Modus funktioniert nur, wenn der Grabber als Hintergrundprozess läuft. Bitte ändern sie dies im Einstellungs-Menü. Auto Auto Pr sec Pr sec Pr min Pr min Pr hr Pr std <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_dk.ts000066400000000000000000001624541234321124500217250ustar00rootroot00000000000000 AboutDialog &About Main developers A&uthors Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Licence Agreement OK About This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Description &Add &Remove &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab Name Description &Add &Remove &Edit Encoder settings Do you want to be asked for an output file everytime you choose to export? Yes No Set default output file: Browse Start encoder: Stop encoder: Choose output file Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! Form Form FrameBar Frame number: FramePreferencesMenu Add &sound &Remove Sound Change name Sounds: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> FrameView Warning Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. You have to define an image grabber to use. This can be set in the preferences menu. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. ImportTab Name Description &Add &Remove &Edit Import device settings Pre-poll command Start daemon Stop daemon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) English &Translation MainWindow Stopmotion Help Browser Backward Forward Close MainWindowGUI Ready to rumble ;-) &New &Open <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> &Save Save &As &Quit <h4>Quit</h4> <p><em>Quits</em> the program.</p> &File &Undo <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> Re&do <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> Cu&t <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> &Copy <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> &Paste <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> &Go to frame <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> &Edit &Settings What's &This <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> &About <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> &Help <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> Go to frame: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> Unsaved changes There are unsaved changes. Do you want to save? &Yes &No Video &Export <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. Cinelerra &Configure Stopmotion Open &Recent New project Open project Save project Save project As Quit Undo Redo Cut Copy Paste Go to frame <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> Configure Stopmotion What's This About Warning Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Export to video file The registered encoder is not valid. Do you want to check your settings in the preferences menu? Export to file <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> Help Frame number: Choose project file Save As ModelHandler Choose frames to add Removed the selected frame Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Export Apply Close Preferences Menu Video &Device QtFrontend Warning Fatal Cancel vgrabbj VGA singleshot vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Question The simplest setting. Fairly slow Exports from jpeg images to mpeg1 video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exports from jpeg images to mpeg4 video dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation SoundHandler Sounds (*.ogg) Sound name Enter the name of the sound: Choose sound file ToolsMenu FPS chooser <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> Number of images: Mix Diff Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Next scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_es.ts000066400000000000000000002030051234321124500217220ustar00rootroot00000000000000 AboutDialog &About &Acerca de Main developers Desarrolladores principales A&uthors A&utores Translation Traducción Czech Checo Slovenian Esloveno French Francés Logo Logo Coordinating Coordinación Testing Pruebas &Thanks To &Agradecemos a &Licence Agreement &Licencia OK Aceptar About Acerca de This is the Stopmotion application for creating stop motion animations. Esta es la aplicación Stopmotion, para crear animaciones de stop motion. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Debajo puede determinar cuál dispositivo empleará Stopmotion para capturar imágenes y mostrar vídeo. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Puede seleccionar uno de los dispositivos autodetectados desde abajo, o añadir dispositivos manualmente. No se recomienda el uso de dispositivos que no han sido detectados automáticamente, pero si Ud. es un usuario con experiencia siéntase libre de hacerlo. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. El dispositivo seleccionado se reconoce como <b>$VIDEODEVICE</b> cuando se importa vídeo. Name Nombre Description Descripción &Add &Añadir &Remove &Quitar &Edit &Editar Video device settings Preferencias del dispositivo de vídeo Video Device ($VIDEODEVICE): Dispositivo de vídeo ($VIDEODEVICE): device dispositivo ExportTab Name Nombre Description Descripción &Add &Añadir &Remove &Quitar &Edit &Editar Encoder settings Preferencias del codificador Do you want to be asked for an output file everytime you choose to export? ¿Desea que se le pregunte por el archivo de salida cada vez que exporte? Yes No No Set default output file: Archivo de salida predeterminado: Browse Navegar Start encoder: Iniciar codificador: Stop encoder: Detener codificador: Choose output file Seleccionar archivo de salida Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Debajo puede determinar qué programa/proceso empleará Stopmotion para codificar el proyecto activo a un archivo de vídeo. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Siempre debería usar <b>$IMAGEPATH</b> y <b>$VIDEOFILE</b> para representar la ruta a las imágenes y el archivo de vídeo, respectivamente. Example with mencoder (jpeg images to mpeg4 video): Ejemplo con mencoder (imágenes jpeg a vídeo mpeg4): ExternalCommand Input to program: Entrada al programa: Submit Publicar Close Cerrar Output from external command Salida de un comando externo Result Resultado Failed! ¡Operación fallida! Successfull! ¡Operación exitosa! Form Form Form FrameBar Frame number: Cuadro número: FramePreferencesMenu Add &sound Añadir &sonido &Remove Sound &Quitar sonido Change name Cambiar nombre Sounds: Sonidos: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Añadir sonido</h4> <p>Con este botón puede <em>añadir sonidos</em> al cuadro seleccionado.</p> <p>El sonido comenzará a reproducirse cuando se muestre este cuadro, hasta que llegue al final.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Quitar sonido</h4> <p>Con este botón puede <em>quitar</em> el sonido seleccionado de este cuadro.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Cambiar nombre</h4> <p>Con este botón puede cambiar el nombre del sonido seleccionado. <BR>El nombre del sonido sólo tiene el objetivo de hacer más fácil el trabajo de animación.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Sonidos</h4> <p>Esta lista muestra todos los sonidos conectados con este cuadro.</p><p>Estos sonidos se empezarán a reproducir cuando se muestre este cuadro, y hasta que finalicen.</p> FrameView Warning Advertencia Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. La captura ha fallado. Esto pudo haber sucedido si Ud. intentó capturar desde un dispositivo inválido. Por favor chequee los ajustes del capturador en el menú de preferencias. You have to define an image grabber to use. This can be set in the preferences menu. Debe definir un capturador de imágenes a emplear. Éste se puede determinar en el menú de preferencias. Pre poll command does not exists El comando de preconsulta no existe You do not have the given grabber installed on your system El capturador que ha proporcionado no se encuentra instalado en su sistema No video device selected in the preferences menu. No se ha seleccionado ningún dispositivo de vídeo en el menú de preferencias. ImportTab Name Nombre Description Descripción &Add &Añadir &Remove &Quitar &Edit &Editar Import device settings Importar los ajustes del dispositivo Pre-poll command Comando de preconsulta Start daemon Iniciar demonio Stop daemon Detener demonio Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Debajo puede determinar qué programa/proceso empleará Stopmotion para capturar imágenes desde el dispositivo seleccionado. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Siempre debería usar <b>$VIDEODEVICE</b> y <b>$IMAGEFILE</b> para representar el dispositiovo de vídeo y el archivo de imagen, respectivamente. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Español English Inglés &Translation &Traducción MainWindow Stopmotion Help Browser Navegador de la ayuda de Stopmotion Backward Hacia atrás Forward Hacia adelante Close Cerrar MainWindowGUI Ready to rumble ;-) Listo para luchar :) &New &Nuevo &Open &Abrir <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Abrir</h4> <p><em>Abre</em> un archivo de proyecto de Stopmotion.</p> &Save &Guardar Save &As Guardar &como &Quit &Salir <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Salir</h4> <p><em>Finaliza</em> el programa.</p> &File &Archivo &Undo Des&hacer <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Deshacer</h4> <p><em>Revierte</em> la última operación. Puede deshacer varias veces para revertir las operaciones anteriores.</p> Re&do &Rehacer <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Rehacer</h4> <p><em>Rehace</em> la última operación. Puede presionar este botón varias veces para rehacer varias operaciones.</p> Cu&t Cor&tar <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Cortar</h4> <p><em>Corta</em> los cuadros seleccionados de la animación, y los añade a la papelera para que puedan pegarse en otro lugar.</p> &Copy &Copiar <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Copiar</h4> <p><em>Copia</em> los cuadros seleccionados a la papelera. Luego puede pegarlos en otro lugar.</p> &Paste &Pegar <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Pegar</h4> <p><em>Pega</em> los cuadros que se encuentran en la papelera a la locación seleccionada.</p> <p>Puede copiar/cortar imágenes desde otros programas y luego usar esta opción para pegarlas en la animación.</p> &Go to frame &Ir al cuadro <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Ir al cuadro</h4> <p>Esto hace aparecer un menú debajo, en el que puede escoger el cuadro al que desee <em>ir</em>.</p> &Edit &Editar &Settings &Preferencias What's &This Qué es es&to <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Qué es esto</h4> <p>Esto le proporciona un cursor de ratón QuéEsEsto, el que puede ser empleado para obtener información importante, como esta.</p> &About &Acerca de <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Acerca de</h4> <p>Esto muestra una ventana en la que se puede leer información general, así como los nombres de los desarrolladores que hay detrás de esta excelente pieza de software.</p> &Help &Ayuda <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Barra de cuadros</h4> <p>En este área puede ver los cuadros y las escenas que hay en las animaciones, y construir la animación moviéndolos de un lado a otro.</p><p>Puede cambiar al cuadro siguiente y al anterior empleando las <b>teclas con flechas</b> o las teclas <b>x</b> y <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Menú de herramientas</h4> <p>Este es el menú de herramientas, en el que se encuentran la mayor parte de los botones y elementos que necesita al trbajar en animaciones de stop motion.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Menú de preferencias del cuadro</h4> <p>En este menú puede determinar preferencias para el cuadro o los cuadros seleccionados, tales como <b>subtítulos</b> y <b>efectos de sonido</b>.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Menú Ir al cuadro</h4> <p>Aquí puede especificar un número de cuadro, y el programa saltará al mismo</p> Go to frame: Ir al cuadro: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Número de cuadro</h4><p>Este área muestra el número del cuadro seleccionado actualmente.</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Vista del cuadro</h4><p> En este área puede ver el cuadro seleccionado. Además puede reproducir animaciones en esta ventana presionando el botón <b>Reproducir</b>.</p> Unsaved changes Cambios no guardados There are unsaved changes. Do you want to save? Hay cambios no guardados. ¿Desea guardarlos? &Yes &Sí &No &No Video Vídeo &Export &Exportar <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Nuevo</h4> <p>Crea un proyecto <em>nuevo</em>.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Guardar</h4> <p><em>Guarda</em> la animación actual como un archivo de proyecto de Stopmotion. <BR>Si este proyecto ya se ha guardado con anterioridad, se vuelve a guardar automáticamente en el archivo previamente seleccionado.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Guardar como</h4> <p><em>Guarda</em> la animación actual como un archivo de proyecto de Stopmotion.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Vídeo</h4> <p>Exporta el proyecto actual como <em>vídeo</em>.</p>Se le proporciona un asistente para guiarlo. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exporta la animación actual como un proyecto de <em>Cinerella</em>.</p>Se le proporciona un asistente para guiarlo. Cinelerra Cinelerra &Configure Stopmotion &Configurar Stopmotion Open &Recent Abrir &reciente New project Proyecto nuevo Open project Abrir proyecto Save project Guardar proyecto Save project As Guardar proyecto como Quit Salir Undo Deshacer Redo Rehacer Cut Cortar Copy Copiar Paste Pegar Go to frame Ir al cuadro <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Configurar Stopmotion</h4> <p>Esto abre una ventana en donde puede <em>configurar</em> Stopmotion con varios dispositivos de entrada y salida.</p> Configure Stopmotion Configurar Stopmotion What's This Qué es esto About Acerca de Warning Advertencia Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? No se puede hallar ningún codificador registrado para emplearlo al exportar vídeo. Éstos se pueden determinar en el menú de preferencias. No le será posible exportar a vídeo hasta que no tenga determinado un codificador para usar. ¿Desea determianrlo ahora? Export to video file Exportar a un archivo de vídeo The registered encoder is not valid. Do you want to check your settings in the preferences menu? El codificador registrado no es válido. ¿Podría chequear sus ajustes en el menú de preferencias? Export to file Exportar al archivo <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Ayuda</h4> <p>Este botón hace aparecer un diálogo que contiene el manual de Stopmotion</p> Help Ayuda Frame number: Cuadro número: Choose project file Seleccionar archivo de proyecto Save As Guardar como ModelHandler Choose frames to add Seleccione los cuadros a añadir Removed the selected frame El cuadro seleccionado se ha quitado Warning Advertencia You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import &Importar vídeo Video &Export &Exportar vídeo Apply Aplicar Close Cerrar Preferences Menu Menú de preferencias Video &Device &Dispositivo de vídeo QtFrontend Warning Advertencia Fatal Fatal Cancel Cancelar vgrabbj VGA singleshot vgrabbj VGA singleshot vgrabbj VGA daemon demonio vgrabbj VGA Starts vgrabbj as a daemon. Pretty fast. Inicia vgrabbj como un demonio. Es bastante rápido. Question Pregunta The simplest setting. Fairly slow El ajuste más simple. Es bastante lento Exports from jpeg images to mpeg1 video Exporta desde imágenes jpeg a vídeo mpeg1 A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Existe una versión más nueva del archivo de preferencias, que tiene algunos valores predeterminados más. ¿Desea emplearlo? (sus antiguas preferencias se conservarán en ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exporta desde imágenes jpeg images a vídeo mpeg2 Exports from jpeg images to mpeg4 video Exporta desde imágenes jpeg a vídeo mpeg4 dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Capturando desde una DV-cam. (EXPERIMENTAL) videodog singleshot videodog singleshot Videodog. Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation Reproduciendo la animación SoundHandler Sounds (*.ogg) Sonidos (*.ogg) Sound name Nombre del sonido Enter the name of the sound: Ingrese el nombre del sonido: Choose sound file Seleccionar el archivo de sonido ToolsMenu FPS chooser Selector de FPS <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Selector de FPS</h4> <p>Al cambiar el valor se determina la velocidad a la que se reproduce la animación en el <b>visor de cuadros</b>.</p> <p>Para reproducir la animación presione el botón <b>Reproducir animación</b>.</p> Number of images: Cantidad de imágenes: Mix Mezcla Diff Diferencia Playback Previsualizar <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Añadir cuadros (CTRL+F)</h4> <p>Haga clic sobre este botón para <em>añadir</em> cuadros a la animación </p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Quitar la selección (Delete)</h4> <p>Al hacer clic sobre este botón <em>se quitan</em> los cuadros seleccionados de la animación.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Escena nueva (CTRL+E)</h4> <p>Al hacer clic sobre este botón <em>se crea</em> una <em>escena</em> nueva en la animación.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Quitar la escena(CTRL+E)</h4> <p>Al hacer clic sobre este botón <em>se quita</em> la escena seleccionada de la animación.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Encender/apagar la cámara (C)</h4> <p>Al hacer clic sobre este botón se cambia la cámara entre encendida y apagada</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Capturar un cuadro (Barra espaciadora)</h4> <p>Al hacer clic sobre este botón <em>se captura</em> un cuadro desde la cámara y se coloca en la animación</p> <p>Esto también puede hacerse presionando la <b>barra espaciadora</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Cantidad de imágenes</h4> <p>Al cambiar este valor en la barra deslizadora se puede especificar cuántas imágenes anteriores de la animación se mezclan sobre la imagen que da la cámara, o si se encuentra en el modo de previsualización: cuántas imágenes reproducir.</p> <p>Al mezclar las imágenes anteriores con la imagen de la cámara se ve fácilmente la relación que hay entre ellas, haciendo posible lograr movimientos más suaves</p> <h4>Play animation (K, P)</h4> <h4>Reproducir la animación (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Detener la animación (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Cuadro anterior (J, Izquierda)</h4> <h4>Next frame (L, Right)</h4> <h4>Cuadro siguiente (L, Derecha)</h4> <h4>Previous scene (I)</h4> <h4>Escena anterior (I)</h4> <h4>Next scene (O)</h4> <h4>Escena siguiente (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Bucle de animación (CTRL+L)</h4> <p>Con este botón puede determinar si la animación se reproduce una vez hasta el final, o si se reproduce una y otra vez indefinidamente.</p> Notice Nótese Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Actualmente, la previsualización sólo está disponible mientras se emplea el capturador como un demonio. Vaya al menú de preferencias (CTRL+P) para hacer que el capturador de la imagen corra como un demonio. Auto Auto Pr sec Pr sec Pr min Pr min Pr hr Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_fi.ts000066400000000000000000001624541234321124500217250ustar00rootroot00000000000000 AboutDialog &About Main developers A&uthors Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Licence Agreement OK About This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Description &Add &Remove &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab Name Description &Add &Remove &Edit Encoder settings Do you want to be asked for an output file everytime you choose to export? Yes No Set default output file: Browse Start encoder: Stop encoder: Choose output file Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! Form Form FrameBar Frame number: FramePreferencesMenu Add &sound &Remove Sound Change name Sounds: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> FrameView Warning Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. You have to define an image grabber to use. This can be set in the preferences menu. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. ImportTab Name Description &Add &Remove &Edit Import device settings Pre-poll command Start daemon Stop daemon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) English &Translation MainWindow Stopmotion Help Browser Backward Forward Close MainWindowGUI Ready to rumble ;-) &New &Open <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> &Save Save &As &Quit <h4>Quit</h4> <p><em>Quits</em> the program.</p> &File &Undo <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> Re&do <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> Cu&t <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> &Copy <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> &Paste <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> &Go to frame <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> &Edit &Settings What's &This <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> &About <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> &Help <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> Go to frame: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> Unsaved changes There are unsaved changes. Do you want to save? &Yes &No Video &Export <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. Cinelerra &Configure Stopmotion Open &Recent New project Open project Save project Save project As Quit Undo Redo Cut Copy Paste Go to frame <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> Configure Stopmotion What's This About Warning Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Export to video file The registered encoder is not valid. Do you want to check your settings in the preferences menu? Export to file <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> Help Frame number: Choose project file Save As ModelHandler Choose frames to add Removed the selected frame Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Export Apply Close Preferences Menu Video &Device QtFrontend Warning Fatal Cancel vgrabbj VGA singleshot vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Question The simplest setting. Fairly slow Exports from jpeg images to mpeg1 video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exports from jpeg images to mpeg4 video dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation SoundHandler Sounds (*.ogg) Sound name Enter the name of the sound: Choose sound file ToolsMenu FPS chooser <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> Number of images: Mix Diff Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Next scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_fr.ts000066400000000000000000002250561234321124500217340ustar00rootroot00000000000000 AboutDialog &About A &propos Main developers A&uthors A&uteurs Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Remerciements à &Licence Agreement Accord de &license OK About A propos This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Nom Description Description &Add &Ajouter &Remove &Supprimer &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab Active Activé Name Nom Description Description &Add &Ajouter &Remove &Supprimer &Edit &Modifier Encoder settings Paramètres de l'encodeur Do you want to be asked for an output file everytime you choose to export? Voulez-vous choisir le fichier destination à chaque export ? Yes Oui No Non Set default output file: Définir le fichier destination par défaut : Browse Parcourir Start encoder: Lancer l'encodeur : Stop encoder: Arrêter l'encodeur : Choose output file Choisir le fichier destination <p>Below you can set which program/process stopmotion should use for encoding the currently active project to a video file.</p><p>You can use $IMAGEPATH to represent the image path (absolute path to the directory where the images can be found). You should always use <b>$VIDEOFILE</b> to represent the output file (the videofile generated by the encoder) in the <b>command line</b>. This is independent of how you decides to select it (select it for each export or have a default file).<br></p><p> Example with mencoder (converting jpg to mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> <p>Vous pouvez sélectionner ci-dessous quel programme / processus stopmotion doit utiliser pour encoder le projet en cours en un fichier vidéo.</p><p>Dans la ligne de commande, vous pouvez utiliser des variables.<b>$IMAGEPATH</b> représente le chemin vers les images (chemin absolu vers le dossier contenant les images). <b>$VIDEOFILE</b> représente le fichier destination (le fichier vidéo généré par l'encodeur). Ceci est indépendant du fait de sélectionner le fichier à chaque export ou d'utiliser un fichier par défaut.<br></p><p>Exemple avec mencoder (conversion de jpg vers mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! FileDialog Go to home directory Aller au dossier personnel Form Form FrameBar Frame number: FramePreferencesMenu Add &sound Ajouter un &son &Remove Sound Supp&rimer un son Change name Changer le nom Sounds: Sons : <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Ajouter un son</h4> <p>Avec ce bouton, vous pouvez <em>ajouter un son</em> à l'image sélectionnée.</p><p>Le son va être joué quand cette image apparait, et jusqu'à ce qu'il soit terminé.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Supprimer un son</h4> <p>Avec ce bouton, vous pouvez <em>supprimer</em> le son sélectionné de l'image.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Changer le nom</h4> <p>Avec ce bouton, vous pouvez changer le nom du son sélectionné. <BR>Le nom du son n'a aucun autre effet que de faciliter le travail avec l'animation.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Sons</h4> <p>Ceci affiche une une liste de tous les sons associés à cette image.</p><p>Les sons sont joués quand cette image apparait et jusqu'à ce ce qu'ils soient terminés.</p> FrameView Warning Attention Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. La capture a échoué. Ceci peut arriver si vous essayez de capturer à partir d'un périphérique non valide. Veuillez vérifier les paramètres de capture dans la fenêtre de préférences. You have to define an image grabber to use. This can be set in the preferences menu. Vous devez définir un périphérique de capture. Ceci peut être fait dans la fenêtre de préférences. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. HelpWindow &New Window &Nouvelle fenêtre &Open File &Ouvrir un fichier &Print Im&primer &Close &Fermer &Backward Pa&ge précédente &Forward P&age suivante &Home Table des mati&ères Add Bookmark Ajouter un signet &File &Fichier &Go Al&ler History Historique Bookmarks Signets Backward Page précédente Forward Page suivante ImportTab <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> </p> <p>Vous pouvez ci-dessous définir quel programme / processus stopmotion doit utiliser pour capturer des images (à partir d'une caméra par exemple) et afficher la vidéo.<br> <br> </p> Active Activé Name Nom Description Description &Add &Ajouter &Remove &Supprimer &Edit &Modifier Import device settings Paramètres d'import Pre-poll command Commande à effectuer avant la capture Start daemon Lancer le démon Stop daemon Arrêter le démon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Français English Français &Translation MainWindow Stopmotion Help Browser Backward Page précédente Forward Page suivante Close MainWindowGUI Ready to rumble ;-) Prêt à vrombir ;-) &New &Nouveau &Open &Ouvrir <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Ouvrir</h4> <p><em>Ouvre</em> un projet Stopmotion.</p> &Save &Enregistrer Save &As Enregistrer &sous &Quit &Quitter <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Quitter</h4> <p><em>Quitte</em> le programme Stopmotion.</p> &File &Fichier &Undo Annu&ler <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Annuler</h4> <p><em>Annule</em> la dernière action. Vous pouvez presser Annuler plusieurs fois pour annuler plusieurs actions.</p> Re&do Re&faire <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Refaire</h4> <p><em>Refait</em> la dernière action annulée. Vous pouvez presser Refaire plusieurs fois pour refaire plusieurs actions.</p> Cu&t Co&uper <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Couper</h4> <p><em>Coupe</em> les images sélectionnées de l'animation et les ajoute au presse-papier pour que vous puissiez les coller ailleurs.</p> &Copy Cop&ier <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Copier</h4> <p><em>Copie</em> les images sélectionnées dans le presse-papier. Vous pouvez alors les coller où vous le souhaitez.</p> &Paste C&oller <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Coller</h4> <p><em>Colle</em> les images stockées dans le presse-papier à l'emplacement sélectionné.</p> <p>Vous pouvez copier / coller des images depuis d'autres programmes et utiliser cette option pour les coller dans cette animation.</p> &Go to frame &Aller à l'image <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Aller à l'image</h4> <p>Ceci affiche un menu contextuel où vous pouvez choisir une image où vous souhaitez <em>aller</em>.</p> &Edit &Édition &Languages &Langages &Settings &Paramètres What's &This &Qu'est-ce que c'est <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Qu'est-ce que c'est</h4> <p>Ceci affiche un curseur de souris spécial qui peut être utilisé pour afficher des informations utiles comme celle-ci.</p> &About A &propos <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>A propos</h4> <p>Ceci affiche une petite fenêtre d'information où vous pouvez lire des informations générales aussi bien que les noms des développeurs qui ont créé cet excellent logiciel.</p> &Help &Aide <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Barre d'images</h4> <p>Dans cette zone, vous pouvez voir les images et les scènes de l'animation et les déplacer.</p><p>Vous pouvez passer à l'image suivante ou précédente en utilisant les <b>touches fléchées/b> ou <b>x</b> et <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Barre d'outils</h4> <p>La barre d'outils contient la plupart des boutons dont vous aurez besoin pour travailler sur les animations stopmotion.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Barre de préférences des images</h4> <p>Dans cette zone, vous pouvez définir des préférences pour l'image ou les images séléctionnées, telles que des <b>sous-titres</b>, des <b>effets sonores</b>, etc.</p>u</h4> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Barre Aller à l'image</h4> <p>Ici vous pouvez spécifier un numéro d'image et le programme sélectionnera l'image correspondante</p> Go to frame: Aller à l'image : Frame number: 0 Image numéro : 0 <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Numéro d'image</h4><p>Cette zone affiche le numéro de l'image actuellement sélectionnée</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Cadre de prévisualisation</h4><p> Dans cette zone, vous pouvez voir l'image sélectionnée. Vous pouvez aussi voir les animations en pressant le bouton <b>Lecture</b>.</p> Unsaved changes Modifications non enregistrées There are unsaved changes. Do you want to save? Il y a des modifications non enregistrées. Voulez-vous enregistrer ? &Yes &Oui &No &Non Save File Enregistrer le fichier <p>This is the stopmotion application for creating stopmotion animations.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p>Ceci est l'application stopmotion pour créer des animations stopmotion.</p><p>(c) 2005,2006, Fredrik Berg Kjølstad et Bjørn Erik Nilsen</p> A&uthors A&uteurs &Thanks To &Remerciements à &Licence Agreement Accord de &license Video Vidéo &Export &Exporter <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Nouveau</h4> <p>Crée un <em>nouveau</em> projet.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Enregistrer</h4> <p><em>Enregistre</em> l'animation courante sous forme de fichier projet Stopmotion. <BR>Si ce projet a été enregistré précédemment, il sera enregistré automatiquement dans le même fichier (écrasement).</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Enregistrer sous</h4> <p><em>Enregistre</em> l'animation courante sous forme de fichier projet Stopmotion.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Vidéo</h4> <p>Exporte le projet courant vers un fichier <em>vidéo</em>.</p>Vous aurez un assistant pour vous guider. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exporte l'animation courante en tant que projet <em>Cinerella</em>.</p>Vous aurez un assistant pour vous guider. Cinelerra Cinelerra &Configure Stopmotion &Configurer Stopmotion Open &Recent &Récemment ouvert(s) New project Nouveau projet Open project Ouvrir un projet Save project Enregistrer le projet Save project As Enregistrer le projet sous Quit Quitter Undo Annuler Redo Refaire Cut Couper Copy Copier Paste Coller Go to frame Aller à l'image <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Configurer Stopmotion</h4> <p>Ceci ouvre une fenêtre où vous pouvez <em>configurer</em> Stopmotion ainsi que les périphériques d'entrée et de sortie.</p> Configure Stopmotion Configurer Stopmotion What's This Qu'est-ce que c'est About A propos Warning Attention Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Aucun encodeur n'est sélectionné pour l'export vidéo. Ceci peut être paramétré dans la fenêtre de préférences. L'export vidéo ne sera pas possible tant que vous n'aurez pas choisi un encodeur. Voulez-vous le faire tout de suite ? Export to video file Exporter vers un fichier vidéo The registered encoder is not valid. Do you want to check your settings in the preferences menu? L'encodeur enregistré n'est pas valide. Voulez-vous vérifier vos paramètres dans la fenêtre de préférences ? Export to file Exporter vers un fichier <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Aide</h4> <p>Ce bouton affiche le manuel utilisateur de Stopmotion</p> Help Aide <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> <p><b>Développeurs principaux</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> Stopmotion User Manual Manuel utilisateur de Stopmotion <p><b>Coordinating</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br>Gorazd Bizjak and Matej Lavreni &lt;info@zapstudio.net&gt; (Slovenian)<br></p> <p><b>Coordination</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Tests</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Traductions</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Tchèque)<br>Gorazd Bizjak and Matej Lavreni &lt;info@zapstudio.net&gt; (Slovène)<br>Guillaume Bedot &lt;littletux@zarb.org&gt; (Français)</p> Frame number: Choose project file Save As ModelHandler Choose frames to add Choisir les images à ajouter Removed the selected frame L'image sélectionnée a été supprimée Warning Attention You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import &Importer une vidéo Video &Export &Exporter une vidéo Apply Close Preferences Menu Video &Device QtFrontend Warning Attention Fatal Fatal Cancel Annuler Progress Progression vgrabbj VGA singleshot Capture VGA unique (vgrabbj) vgrabbj VGA daemon Démon de capture VGA (vgrabbj) Starts vgrabbj as a daemon. Pretty fast. Lance vgrabbj comme un démon. Plutôt rapide. Question Question &Yes &Oui &No &Non The simplest setting. Fairly slow Le paramétrage le plus simple. Assez lent Exports from jpeg images to mpeg1 video Exporter des images jpeg vers une vidéo mpeg1 A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Une nouvelle version du fichier de préférences, plus complet existe. Voulez-vous utiliser ce fichier ? ( Votre précédent fichier de préférences sera sauvegardé sous ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exporter des images jpeg vers une vidéo mpeg2 Exports from jpeg images to mpeg4 video Exporter des images jpeg vers une vidéo mpeg4 dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation Affichage de l'animation en cours SoundHandler Sounds (*.ogg) Sons (*.ogg) Sound name Nom du son Enter the name of the sound: Entrez le nom du son : Choose sound file ToolsMenu FPS chooser IPS (images par seconde) <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>IPS (images par seconde)</h4> <p>En modifiant cette valeur, vous changez la vitesse de l'animation dans le <b>Cadre de prévisualisation</b>.</p> <p>Pour lire l'an animation pressez le bouton <b>Lecture de l'animation</b>.</p> Number of images: Nombre d'images : Mix Mixer Diff Playback Lecture <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Ajouter des images (CTRL+F)</h4> <p>Cliquez sur ce bouton pour <em>ajouter</em> des images à l'animation.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Supprimer la Sélection (Suppr)</h4> <p>Cliquez sur ce bouton pour <em>supprimer</em> les images sélectionnées de l'animation.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Nouvelle Scène (CTRL+E)</h4> <p>Cliquez sur ce bouton pour <em>créer</em> une nouvelle <em>scène</em> dans l'animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Supprimer une Scène (MAJ+Suppr)</h4> <p>Cliquez sur ce bouton pour <em>supprimer</em> la scène sélectionnée de l'animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Activer/arrêter la caméra (C)</h4> <p>Cliquez sur ce bouton pour activer la caméra ou l'arrêter</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Capturer une Image (Espace)</h4> <p>Cliquez sur ce bouton pour <em>capturer</em> une image depuis la caméra et l'insérer dans l'animation</p> <p> Pour ce faire, vous pouvez aussi utiliser le raccourci clavier : la <b>touche Espace</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Lecture de l'animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Arrêt de l'animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Image pécédente (J, Gauche)</h4> <h4>Next frame (L, Right)</h4> <h4>Image suivante (L, Droite)</h4> <h4>Previous scene (I)</h4> <h4>Scène précédente (I)</h4> <h4>Next scene (O)</h4> <h4>Scène suivante (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Lecture de l'animation en boucle (CTRL+L)</h4> <p>Avec ce bouton vous pouvez choisir de lire l'animation en boucle infinie plutôt que de la lire une seule fois jusqu'à fin.</p> Notice Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Auto Auto Pr sec Par sec Pr min Par min Pr hr Par heure <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_gr.ts000066400000000000000000001624541234321124500217370ustar00rootroot00000000000000 AboutDialog &About Main developers A&uthors Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Licence Agreement OK About This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Description &Add &Remove &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab Name Description &Add &Remove &Edit Encoder settings Do you want to be asked for an output file everytime you choose to export? Yes No Set default output file: Browse Start encoder: Stop encoder: Choose output file Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! Form Form FrameBar Frame number: FramePreferencesMenu Add &sound &Remove Sound Change name Sounds: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> FrameView Warning Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. You have to define an image grabber to use. This can be set in the preferences menu. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. ImportTab Name Description &Add &Remove &Edit Import device settings Pre-poll command Start daemon Stop daemon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) English &Translation MainWindow Stopmotion Help Browser Backward Forward Close MainWindowGUI Ready to rumble ;-) &New &Open <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> &Save Save &As &Quit <h4>Quit</h4> <p><em>Quits</em> the program.</p> &File &Undo <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> Re&do <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> Cu&t <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> &Copy <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> &Paste <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> &Go to frame <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> &Edit &Settings What's &This <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> &About <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> &Help <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> Go to frame: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> Unsaved changes There are unsaved changes. Do you want to save? &Yes &No Video &Export <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. Cinelerra &Configure Stopmotion Open &Recent New project Open project Save project Save project As Quit Undo Redo Cut Copy Paste Go to frame <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> Configure Stopmotion What's This About Warning Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Export to video file The registered encoder is not valid. Do you want to check your settings in the preferences menu? Export to file <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> Help Frame number: Choose project file Save As ModelHandler Choose frames to add Removed the selected frame Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Export Apply Close Preferences Menu Video &Device QtFrontend Warning Fatal Cancel vgrabbj VGA singleshot vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Question The simplest setting. Fairly slow Exports from jpeg images to mpeg1 video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exports from jpeg images to mpeg4 video dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation SoundHandler Sounds (*.ogg) Sound name Enter the name of the sound: Choose sound file ToolsMenu FPS chooser <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> Number of images: Mix Diff Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Next scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_he.ts000066400000000000000000002120571234321124500217160ustar00rootroot00000000000000 AboutDialog &About &אודות Main developers מפתחים ראשיים A&uthors יו&צרים Translation תרגום Czech צ'כית Slovenian סלובנית French צרפתית Logo לוגו Coordinating תיאום Testing בדיקה &Thanks To &תודות נוספות &Licence Agreement ה&סכם הרישוי OK אישור About אודות This is the Stopmotion application for creating stop motion animations. זהו יישום ה־Stopmotion ליצירת סרטוני הנפשות עצר. German גרמנית Portuguese פורטוגזית Spanish ספרדית Swedish שבדית Contributors תורמים DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. להלן תוכל להגדיר את התקן לכידת הנפשת העצר בו שישמש את Stopmotion ללכידת תמונות ולהצגת וידאו. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. תוכל לבחור מההתקנים שזוהו אוטומטית או שתוכל להוסיף התקנים בעצמך. לא מומלץ להשתמש בהתקנים שאינם מזוהים באופן אוטומטי, אך הרגש חופשי לעשות זאת בעצמך אם אתה משתמש מתקדם. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. ההתקן הנבחר מזוהה כ־<b>$VIDEODEVICE</b> תחת ייבוא וידאו. Name שם Description תיאור &Add ה&וספה &Remove ה&סרה &Edit ע&ריכה Video device settings הגדרות התקן הוידאו Video Device ($VIDEODEVICE): התקן וידאו ($VIDEODEVICE): device התקן ExportTab Name שם Description תיאור &Add ה&וספה &Remove ה&סרה &Edit ע&ריכה Encoder settings הגדרות המצפין Do you want to be asked for an output file everytime you choose to export? האם ברצונך להשאל לשם קובץ הפלט בכל פעם שתבחר לייצא? Yes כן No לא Set default output file: בחר את קובץ הפלט כברירת המחדל: Browse עיון Start encoder: התחלת המצפין: Stop encoder: עצירת המצפין: Choose output file בחר את קובץ הפלט Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. להלן ניתן להגדיר באילו תוכנית/תהליך על Stopmotion לעשות שימוש לצורך הצפנת המיזם הנוכחי לקובץ וידאו. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. עליך להשתמש תמיד ב־<b>$IMAGEPATH</b> וב־<b>$VIDEOFILE</b> לייצוג נתיב התמונה וקובץ הוידאו, בהתאמה. Example with mencoder (jpeg images to mpeg4 video): דוגמה עם mencoder (תמונות jpen לווידאו mpeg4): ExternalCommand Input to program: קלט לתוכנה: Submit שליחה Close סגירה Output from external command פלט מפקודה חיצונית Result תוצאה Failed! כשל! Successfull! הצלחה! Form Form טופס FrameBar Frame number: מספר השקופית: FramePreferencesMenu Add &sound ה&וספת צליל &Remove Sound ה&סרת צליל Change name שינוי השם Sounds: צלילים: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>הוספת צליל</h4> <p>באמצעות לחצן זה תוכל <em>להוסיף צלילים</em> לשקופית הנוכחית.</p> <p>הצליל יתחיל לנגן עם הופעת שקופית זו ויפסק עם סיומו.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>הסרת צליל</h4> <p>באמצעות לחצן זה תוכל <em>להסיר</em> את הצליל הנבחר משקופית זו.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>שינוי השם</h4> <p>באמצעות לחצן זה תוכל לשנות את שם הצליל הנבחר. <BR>לשם הצליל אין השפעה מלבד הקלה על העבודה עם ההנפשה.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>צלילים</h4> <p>רשימה זו מציגה את כל הצלילים הקשורים בשקופית זו.</p><p>הצלילים יתחילו לנגן עם הופעת שקופית זו והם יעצרו עם סיומם.</p> FrameView Warning אזהרה Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. הלכידה נכשלה. תקלה זו קורית במידה שניסית ללכוד מהתקן לא תקני. אנא בדוק את הגדרות הלוכד שלך בתפריט ההעדפות. You have to define an image grabber to use. This can be set in the preferences menu. תוכל להגדיר את לוכד התמונות לשימוש. ניתן להגדיר זאת בתפריט ההעדפות. Pre poll command does not exists פקודת תשאול הקדם אינה קיימת You do not have the given grabber installed on your system הלוכד הנתון אינו מותקן במערכת שלך No video device selected in the preferences menu. לא נבחר התקן וידאו בתפריט ההעדפות. ImportTab Name שם Description תיאור &Add ה&וספה &Remove ה&סרה &Edit ע&ריכה Import device settings הגדרות התקן הקלט Pre-poll command פקודת קדם תשאול Start daemon הפעלת תהליך הרקע Stop daemon עצירת תהליך הרקע Below you can set which program/process Stopmotion should use for grabbing images from the selected device. להלן תוכל להגדיר את התקן לכידת הנפשת העצר בו שישמש את Stopmotion ללכידת תמונות ולהצגת וידאו. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. עליך להשתמש תמיד ב־<b>$IMAGEPATH</b> וב־<b>$VIDEOFILE</b> לייצוג נתיב התמונה וקובץ הוידאו, בהתאמה. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) עברית English אנגלית &Translation &תרגום MainWindow Stopmotion Help Browser סייר העזרה של Stopmotion Backward אחורה Forward קדימה Close סגירה MainWindowGUI Ready to rumble ;-) מוכן ומזומן ;-) &New &חדש &Open &פתיחה <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>פתיחה</h4> <p><em>פתיחת</em> קובץ מיזם של Stopmotion.</p> &Save &שמירה Save &As שמירה &בשם &Quit י&ציאה <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>יציאה</h4> <p><em>יציאה</em> מהתוכנית.</p> &File &קובץ &Undo &ביטול <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>ביטול</h4> <p><em>ביטול</em> הפעולה האחרונה שלך. תוכל ללחוץ על ביטול כמה פעמים כדי לבטל פעולות קודמות.</p> Re&do ביצוע &חוזר <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>ביצוע חוזר</h4> <p><em>מבצע שוב</em>את הפעולה האחרונה שלך. תוכל ללחוץ על ביצוע חוזר מספר פעמים כדי לבצע שוב כמה פעולות.</p> Cu&t &גזור <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>גזור</h4> <p><em>גזירת</em> השקופיות הנבחרות אל מחוץ להנפשת והוספתן ללוח הגזירים כך שניתן יהיה להדביק אותן במקום אחר.</p> &Copy ה&עתק <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>העתק</h4> <p><em>העתקת</em> השקופיות הנבחרות ללוח הגזירים. תוכל להדביק אותם במקום אחר.</p> &Paste ה&דבק <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>הדבק</h4> <p><em>הדבקת</em> השקופיות הנמצאות בלוח הגזירים אל המיקום הנבחר.</p> <p>תוכל להעתיק/לגזור תמונות מתוכניות אחרות ואז להשתמש באפשרות כדי להדביק אותם אל הנפשה זו.</p> &Go to frame &מעבר לשקופית <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>מעבר לשקופית</h4> <p>פעולה זו תקפיץ תפריט בתחתית בו תוכל לבחור את השקופית אליה תרצה <em>להגיע</em>.</p> &Edit ע&ריכה &Settings ה&גדרות What's &This מה &זה <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>מה זה</h4> <p>פעולה זו תחליף את סמן העכבר בסמן "מה זה" בו ניתן להשתמש כדי להציג מידע נוסף כמו מידע זה.</p> &About &אודות <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>אודות</h4> <p>פעולה זו תציג תיבת מידע קטנה בה תוכל לקרוא מידע כללי כמו לדוגמה שמות המפתחים האחראים על יצירת תוכנה נפלאה זו.</p> &Help ע&זרה <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>סרגל השקופיות</h4> <p>באזור זה תוכל לצפות בשקופיות ובסצנות שבהנפשות ולבנות את ההנפשה על ידי הזזתם סביב.</p><p>תוכל לעבור קדימה ואחורה בין השקופיות באמצעות <b>מקשי החצים</b> או על ידי <b>x</b> ו־<b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>סרגל הכלים</h4> <p>זהו תפריט הכלים בו נמצאים רב הלחצנים והיישומונים להם תזדקק בעת עבודה על סרטוני הנפשות עצר.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>תפריט העדפות השקופיות</h4> <p>בתפריט זה תוכל להגדיר העדפות עבור השקופית/ות הנבחרת/ות, כגון <b>כתוביות</b> ,<b>אפקטים קוליים</b> ועוד.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>תפריט המעבר לשקופית</h4> <p>כאן תוכל להגדיר את מספר השקופית והתוכנית תקפוץ לשקופית הנתונה</p> Go to frame: מעבר לשקופית: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>מספר השקופית</h4><p>אזור זה מציג את מספר השקופית הנוכחית שנבחרה.</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>תצוגת שקופיות</h4><p> באזור זה תוכל לצפות בשקופית שנבחרה. כמו כן תוכל לנגן הנפשות בחלון זה על ידי לחיצה על הלחצן <b>נגינה</b>.</p> Unsaved changes שינויים שאינם שמורים There are unsaved changes. Do you want to save? ישנם שינויים שלא נשמרו. האם ברצונך לשמור? &Yes &כן &No &לא Video וידאו &Export יי&צוא <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>חדש</h4> <p>יצירת מיזם <em>חדש</em>.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>שמירה</h4> <p><em>שמירת</em> ההנפשה הנוכחית כקובץ מיזם של Stopmotion. <BR>אם מיזם זה כבר נשמר בעבר הוא ישמור אוטומטית לקובץ שנבחר בעבר.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>שמירה בשם</h4> <p><em>שמירת</em> ההנפשה הנוכחית כקובץ מיזם של Stopmotion.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>וידאו</h4> <p>מייצא את המיזם הנוכחי כ<em>וידאו</em>.</p>בפניך יופיע אשף שינחה אותך. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>צינרלה</h4> <p>ייצוא ההנפשה הנוכחית כמיזם <em>צינרלה</em>.</p>בפניך יופיע אשף שידריך אותך. Cinelerra צינרלה &Configure Stopmotion ה&גדרת Stopmotion Open &Recent ש&נפתחו לאחרונה New project מיזם חדש Open project פתיחת מיזם Save project שמירת מיזם Save project As שמירת מיזם בשם Quit יציאה Undo ביטול Redo ביצוע חוזר Cut גזור Copy העתק Paste הדבק Go to frame מעבר לשקופית <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>הגדרת Stopmotion</h4> <p>פעולה זו תפתח חלון בו תוכל <em>להגדיר</em> את Stopmotion עם התקני פלט וקלט שונים.</p> Configure Stopmotion הגדרת Stopmotion What's This מה זה About אודות Warning אזהרה Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? לא ניתן למצוא מפענחים מותקנים לשימוש לצורך ייצוא וידאו. ניתן להגדיר זאת בתפריט ההעדפות. לא ניתן יהיה לייצא את הוידאו עד שתגדיר את המצפין לשימוש. האם ברצונך להגדיר אותו כעת? Export to video file ייצוא לקובץ וידאו The registered encoder is not valid. Do you want to check your settings in the preferences menu? המצפין המוגדר אינו תקני. האם ברצונך לבדוק את הגדרותיך בתפריט ההעדפות? Export to file ייצוא לקובץ <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>עזרה</h4> <p>לחצן זה יעלה דו־שיח עם המדריך לשימוש ב־Stopmotion</p> Help עזרה Frame number: מספר השקופית: Choose project file בחירת קובץ מיזם Save As שמירה בשם ModelHandler Choose frames to add בחר שקופיות להוספה Removed the selected frame השקופית שנבחרה הוסרה Warning אזהרה You do not have Gimp installed on your system הגימפ אינו מותקן במערכת שלך There is no active frame to open אין שקופית פעילה לפתיחה The active frame is corrupt השקופית הפעילה פגומה Failed to start Gimp! כשל בהפעלת הגימפ! PreferencesMenu Video &Import ייב&וא וידאו Video &Export יי&צוא וידאו Apply החל Close סגירה Preferences Menu תפריט ההעדפות Video &Device ה&תקן וידאו QtFrontend Warning אזהרה Fatal קריטי Cancel ביטול vgrabbj VGA singleshot vgrabbj VGA singleshot vgrabbj VGA daemon vgrabbj תהליך רקע VGA Starts vgrabbj as a daemon. Pretty fast. הפעלת vgrabbj כתהליך רקע. די מהיר. Question שאלה The simplest setting. Fairly slow ההגדרה הפשוטה ביותר. איטי למדי Exports from jpeg images to mpeg1 video מייצא מתמונות jpeg לווידאו מסוג mpeg1 A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) גרסה חדשה של קובץ ההעדפות עם עוד כמה ערכי ברירת מחדל קיימת. האם ברצונך להשתמש בגרסה זה? (קובץ ההעדפות הישן שלך ישמר תחת ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video מייצא מתמונות jpeg לווידאו מסוג mpeg2 Exports from jpeg images to mpeg4 video מייצא מתמונות jpeg לווידאו מסוג mpeg4 dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) לכידה ממצלמת וידאו דיגיטלית. (נסיוני) videodog singleshot videodog singleshot Videodog. Videodog. Grabbing from DV-cam. לכידה ממצלמת וידאו דיגיטלית. RunAnimationHandler Running animation ההנפשה רצה SoundHandler Sounds (*.ogg) צלילים (*.ogg) Sound name שם הצליל Enter the name of the sound: הזן את שם הצליל: Choose sound file בחר את קובץ הצליל ToolsMenu FPS chooser בוחר ה־FPS <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>בוחר ה־FPS</h4> <p>על ידי שינוי הערך בבוחר זה תוגדר מהירות ההנפשה של <b>תצוגת השקופיות</b>.</p> <p>כדי להתחיל את ההנפשה לחץ על <b>הרצת ההנפשה</b>.</p> Number of images: מספר התמונות: Mix ערבול Diff הבדל Playback השמעת רקע <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>הוספת שקופיות (CTRL+F)</h4> <p>לחץ על לחצן זה כדי <em>להוסיף</em> שקופיות להנפשה </p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>הסרת הבחירה (Delete)</h4> <p>לחץ על לחצן זה כדי <em>להסיר</em> את השקופיות הנבחרות מההנפשה.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>סצנה חדשה (CTRL+E)</h4> <p>לחצן על לחצן זה כדי <em>ליצור</em> <em>סצנה</em> חדשה בהנפשה.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>הסרת סצנה (CTRL+E)</h4> <p>לחץ על לחצן זה כדי <em>להסיר</em> את הסצנה הנבחרת מההנפשה.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>הפעלת/כיבוי המצלמה (C)</h4> <p>לחץ על לחצן זה כדי להפעיל ולכבות את המצלמה</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>לכידת שקופית (רווח)</h4> <p>לחץ על לחצן זה כדי <em>ללכוד</em> כדי ללכוד שקופית מהמצלמה ולשים אותה בהנפשה</p> <p>ניתן לעשות זאת על ידי לחיצה על הלחצן <b>רווח</b> שבמקלדת</p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>מספר התמונות</h4> <p>על ידי שינוי ערך זה בסרגל הגלילה תוכל להגדיר כמה תמונות לחזור אחורה בהנפשה להצגה על גבי הצילום מהמצלמה או שאם אתה במצב נגינה: כמה תמונות להציג.</p> <p>על ידי ערבול התמונה/ות הקודמת/ות אל תוך תצוגת המצלמה תוכל בקלות יתרה לראות כיצד תצא התמונה הבאה ביחס לאחרות, ובך ליצור הנפשת עצר חלקה יותר!</p> <h4>Play animation (K, P)</h4> <h4>נגינת ההנפשה (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>עצירת ההנפשה (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>השקופית הקודמת (J, שמאלה)</h4> <h4>Next frame (L, Right)</h4> <h4>השקופית הבאה (L, ימינה)</h4> <h4>Previous scene (I)</h4> <h4>הסצנה הקודמת (I)</h4> <h4>Next scene (O)</h4> <h4>הסצנה הבאה (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>נגינת ההנפשה במחזוריות (CTRL+ L)</h4> <p>באמצעות לחצן זה תוכל להגדיר האם ברצונך לנגן את ההנפשה עד סופה, או לנגן אותה במחזוריות.</p> Notice הודעה Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. הנגינה נתמכת נכון לעכשיו רק עם הרצת מנגנון הלכידה ברקע. גש אל תפריט ההעדפות (CTRL+P) כדי להחליף להפעלת לכידת התמונות כתהליך רקע. Auto אוטומטי Pr sec שניה קודמת Pr min דקה קודמת Pr hr שעה קודמת <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> <h4>טעינת הגימפ</h4> <p>לחץ על לחצן זה כדי לפתוח את השקופית הפעילה בגימפ</p> <p>שים לב שניתן גם לגרור תמונות מסרגל השקופיות ולשחרר אותן בגימפ</p> stopmotion-0.8.0/translations/stopmotion_it.ts000066400000000000000000002027351234321124500217400ustar00rootroot00000000000000 AboutDialog &About &A proposito di Main developers Sviluppatori principali A&uthors A&utori Translation Traduzione Czech Ceco Slovenian Sloveno French Francese Logo Logo Coordinating Coordinamento Testing Prova &Thanks To &Ringraziamenti &Licence Agreement &Licenza OK OK About A proposito di This is the Stopmotion application for creating stop motion animations. Questo è il programma Stopmotion per creare animazioni in stop motion German Tedesco Portuguese Portoghese Spanish Spagnolo Swedish Svedese Contributors Contribuenti allo sviluppo DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Di seguito puoi selezionare quale dispositivo Stopmotion dovrebbe usare per acquisire le immagini e per mostrare il video You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Puoi selezionare l'autorivelamento del dispositivo di seguito o aggiungere da solo un dispositivo. Non è raccomandato usare dispositivi che non siano stati trovati automaticamente, ma sei libero di farlo se sei un utente esperto. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Il dispositivo selezionato è riconosciuto come <b>$VIDEODEVICE</b> sotto Video Import. Name Nome Description Descrizione &Add &Aggiungere &Remove &Rimuovere &Edit &Modificare Video device settings Preferenze del dispositivo Video Video Device ($VIDEODEVICE): Dispositivo Video ($VIDEODEVICE): device dispositivo ExportTab Name Nome Description Descrizione &Add &Aggiungere &Remove &Rimuovere &Edit &Modificare Encoder settings Preferenze di codifica Do you want to be asked for an output file everytime you choose to export? Desideri essere informato da un messaggio ogni volta che scegli di esportare? Yes No No Set default output file: Seleziona il file di uscita predefinito: Browse Sfoglia Start encoder: Inizia la codifica: Stop encoder: Ferma la codifica: Choose output file Scegliere il file di uscita Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Di seguito puoi selezionare quale programma Stopmotion dovrebbe utilizzare per codificare il progetto attivo corrente in un file video. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Dovresti sempre usare <b>$IMAGEPATH</b> e <b>$VIDEOFILE</b> per indicare rispettivamente il percorso dell'immagine e del file video. Example with mencoder (jpeg images to mpeg4 video): Esempio con mencoder (da immagini jpeg a video mpeg4): ExternalCommand Input to program: Input del programma: Submit Pubblica Close Chiudi Output from external command Output del comando esterno Result Risultato Failed! Operazione fallita! Successfull! Operazione riuscita! Form Form Form FrameBar Frame number: Numero di frame: FramePreferencesMenu Add &sound Aggiungi &suono &Remove Sound &Rimuovi suono Change name Cambia nome Sounds: Suoni: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Aggiungi suono</h4> <p>Con questo pulsante puoi <em>aggiungere suoni </em> al frame selezionato.</p> <p>La riproduzione sonora comincerà quando questo frame è mostrato e durerà fino al completamento.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Rimuovi suono</h4> <p>Con questo pulsante puoi <em>rimuovere</em> il suono selezionato da questo frame.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Cambia nome</h4> <p>Con questo pulsante puoi cambiare il nome del suono selezionato. <BR>Il nome assegnato al suono non ha altri effetti se non quelli di rendere il lavoro con l'animazione più semplice.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Suoni</h4> <p>Questa lista mostra tutti i suoni connessi con il frame attuale.</p><p>Questi suoni saranno riprodotti quando il frame è mostrato e continueranno fino al completamento.</p> FrameView Warning Attenzione Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. La cattura è fallita. Questo può succedere se tu tenti di catturare da un dispositivo non valido. Per favore controlla le impostazioni di cattura dal menu delle preferenze. You have to define an image grabber to use. This can be set in the preferences menu. Devi definire il dispositivo da usare per catturare immagini. Questo può essere impostato nel menu delle preferenze. Pre poll command does not exists Il comando di confronto non esiste You do not have the given grabber installed on your system Il dispositivo di cattura immagini indicato non è installato sul tuo sistema No video device selected in the preferences menu. Nessun dispositivo video selezionato nel menu delle preferenze. ImportTab Name Nome Description Descrizione &Add &Aggiungere &Remove &Rimuovere &Edit &Modificare Import device settings Importa le impostazioni del dispositivo Pre-poll command Comando di confronto Start daemon Avvia demone Stop daemon Ferma demone Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Di seguito puoi selezionare il programma che Stopmotion dovrebbe usare per acquisire immagini dal dispositivo selezionato. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Dovresti sempre usare <b>$VIDEODEVICE</b> e <b>$IMAGEFILE</b> per indicare rispettivamente il dispositivo video e il file di immagine. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Italiano English Inglese &Translation &Traduzione MainWindow Stopmotion Help Browser Browser di aiuto di Stopmotion Backward Torna indietro Forward Vai avanti Close Chiudi MainWindowGUI Ready to rumble ;-) Pronto per cominciare :-) &New &Nuovo &Open &Apri <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Apri</h4> <p><em>Apri</em> un progetto di Stopmotion.</p> &Save &Salva Save &As Salva &come &Quit &Esci <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Esci</h4> <p><em>Esci</em> dal programma.</p> &File &File &Undo &Annulla <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Annulla</h4> <p><em>Annulla</em> l'ultima operazione. Puoi premere annulla diverse volte per annullare le operazioni iniziali.</p> Re&do &Annulla modifica <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Ripristina</h4> <p><em>Ripristina</em> l'ultima operazione. Puoi premere ripristina diverse volte per ripristinare molte operazioni.</p> Cu&t T&aglia <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Taglia</h4> <p><em>Taglia</em> i frame selezionati e aggiungili agli appunti in modo che tu possa incollarli da un'altra parte.</p> &Copy &Copia <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Copia</h4> <p><em>Copia</em> i frame selezionati negli appunti. Potrai quindi incollarli in un altro posto</p> &Paste &Incolla <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Incolla</h4> <p><em>Incolla</em> i frame che al momento si trovano negli appunti nel luogo selezionato.</p> <p>Puoi copiare/tagliare immagini da altri programmi e poi usare questa opzione per incollarle in questa animazione.</p> &Go to frame &Vai al frame <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Vai al frame</h4> <p>Questa operazione aprirà un popup in fondo alla zona dove puoi scegliere un frame che desideri raggiungere.</p> &Edit &Modificare &Settings &Impostazioni What's &This Cos'è &questo <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Cos'è questo</h4> <p>L'opzione darà al cursore del mouse la possibilità di aiutarti con informazioni come questa .</p> &About &A proposito di <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>A proposito di</h4> <p>Questo mostrerà una piccola casella informativa nella quale puoi leggere informazioni generiche come il nome degli sviluppatori che hanno lavorato a questo eccellente programma.</p> &Help &Aiuto <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Barra del Frame</h4> <p>In questa area puoi visualizzare i frame le scene dell'animazione e costruire l'animazione muovendoti intorno.</p><p>Puoi cambiare il frame successivo e quello precedente usando i<b> pulsanti freccia</b> o <b>x</b> e <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Menu degli strumenti</h4> <p>Questo è il menu degli strumenti dove si trovano la maggior parte dei pulsanti e degli elementi che ti serviranno per lavorare sulle animazioni in stop motion.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Menu delle preferenze del frame</h4> <p>In questo menu puoi determinare le preferenze per il frame/frames selezionati, come <b>sottotitoli</b>, <b>effetti sonori</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Vai al menu frame</h4> <p>Qui puoi specificare il numero del frame e il programma che salterà al frame indicato</p> Go to frame: Vai al frame: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Numero del frame</h4><p>Quest'area mostra il numero del frame attualmente selezionato.</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Vista del frame</h4><p> In quest'area puoi vedere il frame selezionato. Puoi anche rirpodurre le animazioni in questa finestra premendo il pulsante di <b>Riproduzione</b>.</p> Unsaved changes Non salvare cambiamenti There are unsaved changes. Do you want to save? Ci sono cambiamenti non salvati. Vuoi salvarli? &Yes &Sì &No &No Video Video &Export &Esporta <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Nuovo</h4> <p>Crea un <em>nuovo</em> progetto.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Salva</h4> <p><em>Salva</em> l'animazione corrente come progetto Stopmotion. <BR>Se il progetto è stato già salvato verrà automaticamente salvato nel file precedentemente indicato.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Salva come</h4> <p><em>Salva</em> l'animazione corrente come progetto Stopmotion.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Esporta il progetto corrente come <em>video</em>.</p>Sarai guidato dall'assistente. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4> <p>Esporta la corrente animazione come progetto<em>Cinelerra</em>.</p>Sarai guidato dall'assistente. Cinelerra Cinelerra &Configure Stopmotion &Configura Stopmotion Open &Recent Apri &recente New project Nuovo progetto Open project Apri progetto Save project Salva progetto Save project As Salva progetto come Quit Esci Undo Annulla Redo Ripeti Cut Taglia Copy Copia Paste Incolla Go to frame Vai al frame <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Configura Stopmotion</h4> <p>Questo aprirà una finestra nella quale puoi <em>configurare</em> Stopmotion con diversi dispositivi di ingresso e uscita.</p> Configure Stopmotion Configura Stopmotion What's This Cos'è questo About A proposito di Warning Attenzione Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Non è possibile trovare alcun codificatore per esportare il video. Questo può essere indicato nel menu delle preferenze. L'esportazione del video non sarà possibile fin quando non verrà indicato il codificatore da usare. Vuoi selezionarlo ora? Export to video file Esporta al file video The registered encoder is not valid. Do you want to check your settings in the preferences menu? IL codificatore registrato non è valido. Vuoi controllare le impostazioni nel menu delle preferenze? Export to file Esporta al file <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Aiuto</h4> <p>Questo pulsante aprirà una finestra di dialogo con il manuale di Stopmotion</p> Help Aiuto Frame number: Numero del frame: Choose project file Seleziona un progetto Save As Salva come ModelHandler Choose frames to add Seleziona i frame da aggiungere Removed the selected frame Rimuovi i frame selezionati Warning Attenzione You do not have Gimp installed on your system Il programma The Gimp non è attualmente installato nel sistema There is no active frame to open Non c'è anclun frame attivo da aprire The active frame is corrupt Il frame attivo è danneggiato Failed to start Gimp! Impossibile avviare The Gimp! PreferencesMenu Video &Import Importa &video Video &Export Esporta &video Apply Applica Close Chiudi Preferences Menu Menu delle preferenze Video &Device Dispositivo &video QtFrontend Warning Attenzione Fatal Errore fatale Cancel Cancella vgrabbj VGA singleshot vgrabbj VGA singleshot vgrabbj VGA daemon demone vgrabbj VGA Starts vgrabbj as a daemon. Pretty fast. Avvia vgrabbj come demone. Molto veloce. Question Chiedi The simplest setting. Fairly slow L'impostazione più semplice. Piuttosto lenta Exports from jpeg images to mpeg1 video Esporta da immagini jpeg a video mpeg1 A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Esiste una nuova versione del file di preferenze con maggiori caratteristiche predefinite. Vuoi usarla? (Le vecchie preferenze saranno salvate in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Esporta da immagini jpeg a video mpeg2 Exports from jpeg images to mpeg4 video Esporta da immagini jpeg a video mpeg4 dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Cattura da una DV-cam. (SPERIMENTALE) videodog singleshot videodog singleshot Videodog. Videodog. Grabbing from DV-cam. Cattura da DV-cam. RunAnimationHandler Running animation Riproduci l'animazione SoundHandler Sounds (*.ogg) Suoni (*.ogg) Sound name Nome del suono Enter the name of the sound: Inserisci il nome del suono: Choose sound file Scegli il file del suono ToolsMenu FPS chooser Scegli FPS <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Seleziona FPS</h4> <p>Cambiando il valore puoi determinare a quale velocità l'animazione contenuta nel <b>visualizzatore</b> dovrebbe andare.</p> <p>Per avviare l'animazione premi <b>Avvia animazione</b>.</p> Number of images: Numero di immagini: Mix Mix Diff Differenza Playback Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Aggiungi frame (CTRL+F)</h4> <p>Clicca su questo pulsante per <em>aggiungere</em> frame alla animazione </p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Rimuovi selezione (Cancella)</h4> <p>Premendo questo pulsante <em>rimuovi</em> i frame selezionati dall'animazione.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Nuova scena (CTRL+E)</h4> <p>Premi questo pulsante per <em>creare</em> una <em>scena</em> nuova per l'animazione.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Rimuovi la scena(CTRL+E)</h4> <p>Premi questo pulsante per <em>rimuovere</em> la scena selezionata dall'animazione.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Verifica on/off della camera (C)</h4> <p>Premi questo pulsante per verificare on/off della camera</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Cattura frame (Barra spaziatrice)</h4> <p>Premi questo pulsante per <em>catturare</em> un frame dalla camera e inserirlo nell'animazione</p> <p>Questo può essere fatto anche premendo la <b>Barra spaziatrice</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Numero di immagini</h4> <p>Cambiando questo valore nella barra di selezione puoi specificare di quante immagini riavvolgere l'animazione che dovrebbe essere mixata con la camere o con la modalità playback: quante immagini avviare .</p> <p>Mixando le immagini precedenti nella camera puoi pià facilmente vedere come lo scatto successivo starà in relazione alle altre, e quindi produrre una animazione in stop motion più fluida!</p> <h4>Play animation (K, P)</h4> <h4>Riprodurre animazione (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Fermare l'animazione (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Frame precedente (J, Sinistra)</h4> <h4>Next frame (L, Right)</h4> <h4>Frame successivo (L, Destra)</h4> <h4>Previous scene (I)</h4> <h4>Scena precedente (I)</h4> <h4>Next scene (O)</h4> <h4>Scena successiva (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Loop dell'animazione (CTRL+L)</h4> <p>Con questo pulsante puoi indicare se desideri che l'animazione venga riprodotta fino alla fine, oppure indefinitamente.</p> Notice Note Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Playback funziona attualmente solo quando la cattura è impostata come demone. Vai al menu delle preferenze (CTRL+P) per selezionare la cattura come demone. Auto Auto Pr sec Pr sec Pr min Pr min Pr hr Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> <h4>Avvia The Gimp</h4> <p> Click su questo tasto per aprire il frame corrente con The Gimp</p> <p>Ricorda che puoi anche trascinare le immagini dalla barra dei frame sulla finestra di The Gimp</p> stopmotion-0.8.0/translations/stopmotion_kl.ts000066400000000000000000001624541234321124500217350ustar00rootroot00000000000000 AboutDialog &About Main developers A&uthors Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Licence Agreement OK About This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Description &Add &Remove &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab Name Description &Add &Remove &Edit Encoder settings Do you want to be asked for an output file everytime you choose to export? Yes No Set default output file: Browse Start encoder: Stop encoder: Choose output file Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! Form Form FrameBar Frame number: FramePreferencesMenu Add &sound &Remove Sound Change name Sounds: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> FrameView Warning Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. You have to define an image grabber to use. This can be set in the preferences menu. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. ImportTab Name Description &Add &Remove &Edit Import device settings Pre-poll command Start daemon Stop daemon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) English &Translation MainWindow Stopmotion Help Browser Backward Forward Close MainWindowGUI Ready to rumble ;-) &New &Open <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> &Save Save &As &Quit <h4>Quit</h4> <p><em>Quits</em> the program.</p> &File &Undo <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> Re&do <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> Cu&t <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> &Copy <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> &Paste <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> &Go to frame <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> &Edit &Settings What's &This <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> &About <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> &Help <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> Go to frame: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> Unsaved changes There are unsaved changes. Do you want to save? &Yes &No Video &Export <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. Cinelerra &Configure Stopmotion Open &Recent New project Open project Save project Save project As Quit Undo Redo Cut Copy Paste Go to frame <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> Configure Stopmotion What's This About Warning Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Export to video file The registered encoder is not valid. Do you want to check your settings in the preferences menu? Export to file <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> Help Frame number: Choose project file Save As ModelHandler Choose frames to add Removed the selected frame Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Export Apply Close Preferences Menu Video &Device QtFrontend Warning Fatal Cancel vgrabbj VGA singleshot vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Question The simplest setting. Fairly slow Exports from jpeg images to mpeg1 video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exports from jpeg images to mpeg4 video dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation SoundHandler Sounds (*.ogg) Sound name Enter the name of the sound: Choose sound file ToolsMenu FPS chooser <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> Number of images: Mix Diff Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Next scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_no_nb.ts000066400000000000000000002462461234321124500224240ustar00rootroot00000000000000 @default You do not have the necessary permissions to run Stopmotion. Du har ikke de riktige rettighetene til å kjøre Stopmotion. AboutDialog &About &Om Main developers Hovedutviklere A&uthors &Forfattere Translation Oversettelse Czech Tsjekkisk Slovenian Slovensk French Fransk Logo Logo Coordinating Koordinering Testing Testing &Thanks To &Takk til &Licence Agreement &Lisensavtale OK OK About Om This is the Stopmotion application for creating stop motion animations. Dette er Stopmotion - et program for å lage stillbildeanimasjoner. German Portuguese Spanish Swedish Contributors CameraHandler Camera &off &Kamera av Camera &on &Kamera på DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Her kan velge hva slags enhet Stopmotion skal hente bilder fra. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Du kan velge en automatisk gjenkjent enhet, eller du kan legge til egne. Sistnevnte er imidlertid ikke å foretrekke, men du må gjerne gjøre det hvis du er en avansert bruker og vet hva du gjør. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Den valgte enheten representerer <b>$VIDEODEVICE</b> under innstillingene for 'Videoimport'. Name Navn Description Beskrivelse &Add &Legg til &Remove &Fjern &Edit &Rediger Video device settings Innstillinger for videoenhet Video Device ($VIDEODEVICE): Videoenhet ($VIDOEDEVICE): Autodetected Automatisk gjenkjent device enhet ExportTab Active Aktiv Name Navn Description Beskrivelse &Add &Legg til &Remove &Fjern &Edit &Rediger Encoder settings Instillinger for enkoder Do you want to be asked for an output file everytime you choose to export? Ønsker du å angi videofil hver gang du eksporterer? Yes Ja No Nei Set default output file: Sett standard videofil: Browse Bla gjennom Start encoder: Start enkoder: Stop encoder: Stopp enkoder: Choose output file Velg videofil <p>Below you can set which program/process stopmotion should use for encoding the currently active project to a video file.</p><p>You can use $IMAGEPATH to represent the image path (absolute path to the directory where the images can be found). You should always use <b>$VIDEOFILE</b> to represent the output file (the videofile generated by the encoder) in the <b>command line</b>. This is independent of how you decides to select it (select it for each export or have a default file).<br></p><p> Example with mencoder (converting jpg to mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> <p>Under kan du sette hva slags program/prosess stopmotion skal bruke til generering av video.</p><p>$IMAGEPATH kan brukes til å representere katalogen hvor bildene er plassert. <b>$VIDEOFILE</b> må alltid brukes for å representere videofilen, enten du velger å bli spurt om videofil for hver gang du eksporterer eller har satt en standardfil.<br></p><p> Eksempel med mencoder (konverterer jpg til mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Her kan du velge hva slags program Stopmotion skal bruke til å sette sammen bildene til en film. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Du bør alltid bruke <b>$IMAGEPATH</b> og <b>$VIDEOFILE</b> til å representere henholdsvis bildekatalogen og video-filen. Example with mencoder (jpeg images to mpeg4 video): Eksempel med mencoder (jpeg-bilder til mpeg4-video): ExternalCommand Input to program: Input til program: Submit Send Close Lukk Output from external command Output fra ekstern kommando Result Resultat Failed! Feilet! Successfull! Suksess! FileDialog Go to home directory Gå til hjemmekatalog Form Form Form FrameBar Frame number: Bildenummer: FramePreferencesMenu Add &sound Legg til &lyd &Remove Sound &Fjern lyd Change name Skift navn Sounds: Lyder: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Legg til lyd</h4><p>Denne knappen kan brukes til å <em>legge til lyder</em> til det valgte bildet.</p><p>Lyden vil starte å spille i det bildet vises, og vil spille inntil den er ferdig.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Fjern lyd</h4><p>Denne knappen kan brukes til å <em>fjerne</em> den valgte lyden fra dette bildet.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Skift navn</h4><p>Denne knappen kan brukes til å skifte navn på den valgte lyden. <BR>Navnet har ingen effekt ut over at det blir enklere å holde styr på de forskjellige lydene.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Lyder</h4><p>Denne listen viser alle lydene som er tilknyttet dette bildet.</p><p>Lydene vil starte å spille når bildet vises, og spiller inntil de er ferdige.</p> FrameView Warning Advarsel Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Bildefangst feilet. Dette kan skje hvis du prøver å fange bilde fra en ugyldig enhet. Vennligst sjekk at preferansene er riktige. You have to define an image grabber to use. This can be set in the preferences menu. Du må velge et program som kan fange bilder. Dette kan settes i preferanse-menyen. Pre poll command does not exists Forhåndskommando eksisterer ikke You do not have the given grabber installed on your system Programmet du har satt til å fange bilder eksisterer ikke på ditt system No video device selected in the preferences menu. Ingen videoenheter er valgt i preferansemenyen. HelpWindow &New Window &Nytt vindu &Open File &Åpne fil &Print &Print &Close &Lukk &Backward &Bakover &Forward &Fremover &Home &Hjem Add Bookmark Legg til bokmerke &File &Fil &Go &Gå History Historie Bookmarks Bokmerker Backward Bakover Forward Fremover Home Hjem ImportTab <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> </p> <p>Under kan du sette hva slags program/prosess stopmotion skal bruke til å fange bilder med.<br><br> </p> Active Aktiv Name Navn Description Beskrivelse &Add &Legg til &Remove &Fjern &Edit &Rediger Import device settings Innstillinger for input-enhet Pre-poll command Forhåndskommando Start daemon Start nisse Stop daemon Stopp nisse Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Her kan du sette hva slags program Stopmotion skal bruke til å fange bilder fra den valgte videoenheten. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Du bør alltid bruke <b>$VIDEODEVICE</b> og <b>$IMAGEFILE</b> til å representere henholdsvis videoenheten og bildefilen. LanguageHandler &English &Engelsk <h4>English</h4> <p>Select this menu options to get the <em>English</em> translation of the application.</p> <h4>Engelsk</h4> <p>Dette menyvalget vil gi deg den engelske oversettingen av programmet.</p> &Norwegian &Norsk <h4>Norwegian</h4> <p>Select this menu options to get the <em>Norwegian</em> translation of the application.</p> <h4>Norsk</h4> <p>Dette menyvalget vil gi deg den norske oversettingen av programmet.</p> English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Norsk English &Translation &Språk MainWindow Stopmotion Help Browser Stopmotion hjelpevindu Backward Bakover Forward Fremover Close Lukk MainWindowGUI Ready to rumble ;-) Klar til dyst ;-) &New &Ny &Open &Åpne &Save &Lagre Save &As Lagre &som Add &Frames Legg til &bilde &Quit &Avslutt &File &Fil &Undo &Angre Re&do &Gjør om Cu&t Klipp &ut &Copy &Kopier &Paste &Lim inn &Go to frame &Gå til bilde Prefere&nces &Preferanser &Edit &Rediger What's &This H&va er dette &About &Om &Help &Hjelp <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Bildeinnstillinger</h4> <p>I denne menyen kan du sette innstillinger for den valgte frame slik som <b>undertekst</b>, <b>lydeffekter</b>, etc. </p> Add sound Legg til lyd Remove Sound Fjern lyd Change name Skift navn Sounds: Lyder: <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Gå til bilde-menyen</h4> <p>I denne menyen kan du angi nummeret til et bilde som programmet skal gå til.</p> Go to frame: Gå til frame: Frame number: 0 Frame: 0 <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Bildenummer</h4> <p>Dette feltet viser nummeret på det valgte bildet.</p> Unsaved changes Ulagrede forandringer There are unsaved changes. Do you want to save? Det er forandringer som ikke har blitt lagret. Ønsker du å lagre dem nå? &Yes &Ja &No &Nei <p>This is the stopmotion application for creating stopmotion animations.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p>Dette er Stopmotion-applikasjonen til å lage stop motion-animasjoner. </p> <p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> Save File Lagre fil &Thanks To &Takk til &Licence Agreement &Lisensavtale <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Åpne</h4> <p><em>Åpner</em> en Stopmotion prosjektfil. </p> <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Angre</h4> <p><em>Angrer</em> den siste operasjonen. Du kan trykke på angre flere ganger for å angre tidligere operasjoner. </p> <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Gjenta</h4> <p><em>Gjentar</em> den siste operasjonen. Du kan trykke på gjenta flere ganger for gjenta flere operasjoner. </p> <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Klipp</h4><p><em>Klipper</em> ut de valgte bildene til klippebrettet, slik at du kan lime dem inn et annet sted. </p> <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopier</h4><p><em>Kopierer</em> de valgte bildene til klippebrettet. Disse kan du lime inn et annet sted.</p> <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Lim inn</h4> <p><em>Limer inn</em> bildene fra klippebrettet til den valgte plassen.</p><p>Du kan kopiere/klippe bilder fra andre programmer for deretter å lime dem inn i animasjonen din.</p> <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Hva er dette</h4><p> Denne vil gi deg et spørsmålstegn som musepeker. Denne kan du bruke til å finne nyttig informasjon slik som her. </p> <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Om</h4><p>Denne gir deg et lite vindu hvor du kan lese om generell informasjon om denne applikasjonen.</p> <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Bilder</h4><p>Her kan du se alle bildene og scenene som animasjonen din består av. Disse kan du flytte rundt med musa.</p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Verktøymeny</h4> <p>Her finner du mesteparten av verktøyene du trenger når du lager animasjonen.</p> Add &sound Legg til &lyd <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Bildevisning</h4><p> I dette vinduet ser du bildet som til enhver tid er markert.</p> A&uthors &Forfattere <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Avslutt</h4> <p><em>Avsutter</em> programmet.</p> <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Gå til bilde</h4> <p> Denne vil sprette opp en liten meny helt nederst hvor du kan velge et bildenummer du ønsker å gå til.</p> &English &Engelsk <h4>English</h4> <p>Select this menu options to get the <em>English</em> translation of the application.</p> <h4>Engelsk</h4> <p>Dette menyvalget vil gi deg den engelske oversettingen av programmet.</p> &Norwegian &Norsk <h4>Norwegian</h4> <p>Select this menu options to get the <em>Norwegian</em> translation of the application.</p> <h4>Norsk</h4> <p>Dette menyvalget vil gi deg den norske oversettingen av programmet.</p> &Languages &Språk &Settings I&nnstillinger Disable sound Skru av lyd Video Video &Export &Eksport <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Ny</h4> <p> Oppretter et <em>nytt</em> prosjekt.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Lagre</h4><p><em>Lagrer</em> nåværende animasjon som en Stopmotion prosjektfil. <BR> Hvis prosjektet allerede er lagret til fil, vil det automatisk lagre til denne filen. </p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Lagre som</h4><p><em>Lagrer</em> nåværende animasjon som en Stopmotion prosjektfil.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4><p>Eksporterer nåværende prosjekt til <em>video</em>.</p> Instillinger for dette setter du i preferansenmenyen. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4><p>Eksporterer nåværende animasjon til et <em>Cinelerra</em>-prosjekt.</p> Ikke støttet for øyeblikket. Cinelerra Cinelerra &Configure Stopmotion &Konfigurer Stopmotion Open &Recent Åpne &siste New project Nytt prosjekt Open project Åpne prosjekt Save project Lagre prosjekt Save project As Lagre prosjekt som Quit Avslutt Undo Angre Redo Gjenta Cut Klipp Copy Kopier Paste Lim inn Go to frame Gå til bildenummer <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Konfigurer Stopmotion</h4> <p>Du vil få opp et vindu hvor du kan <em>konfigurere</em> Stopmotion med ulike inn- og utenheter.</p> Configure Stopmotion Konfigurer Stopmotion What's This Hva er dette About Om Warning Advarsel Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Ingen registrerte enkodere for eksport til video. Dette kan settes i preferansemenyen. Eksport til video vil ikke være mulig før du har satt en gyldig enkoder. Ønsker du å sette dette nå? Export to video file Eksporter til videofil The registered encoder is not valid. Do you want to check your settings in the preferences menu? Den registrerte enkoderen er ikke gyldig. Ønsker du å sjekke innstillingene i preferansemenyen? Export to file Eksporter til fil <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Hjelp</h4><p>Denne knappen viser et vindu med brukermanualen.</p> Help Hjelp <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> <p><b>Utviklere</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> Stopmotion User Manual Stopmotion brukermanual <p><b>Coordinating</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br></p> <p><b>Koordinering</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Oversetting</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Tsjekkisk)<br></p> Frame number: Bildenummer: Choose project file Velg prosjektfil Save As Lagre som ModelHandler Choose frames to add Velg frames å legge til Removed the selected frame Fjernet den valgte frame Warning Advarsel You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu <p>Below you can set which program/process stopmotion should use for grabing images from the webcam, and displaying video.<br> <br> You can also add new programs, just make sure the image is saved with the path and filename <b>.stopmotion/capturedfile.png</b> </p> <p>Nedenfor kan du angi hvilket program/prosess som Stopmotion skal bruke for å ta bilder fra webkameraer, etc. <br><br>Du kan også legge til nye programmer. Bare sørg for at bildet blir lagret med stien og filnavnet <b>$HOME/.stopmotion/capturedfile.png</b> </p> &Add &Legg til Video &Import Video&import <p>Video Export</p> <p>Video eksport</p> Video &Export Video&eksport Active Aktiv Command line option Kommandolinje-opsjon <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> You can also add new programs, just make sure the command line is written with file path being <b>&lt;DEFAULTPATH&gt;</b></p> <p>Nedenfor kan du angi hvilket program/prosess som Stopmotion skal bruke for å ta bilder fra webkameraer, etc. <br><br>Du kan også legge til nye programmer. Bare sørg for at kommandolinjen blir skrevet med filstien: <b>&lt;DEFAULTPATH&gt;</b></p> &Remove &Fjern Apply Lagre Close Lukk Preferences Menu Preferansemeny Video &Device &Videoenhet QtFrontend Warning Advarsel Fatal Fatal feil Cancel Avbryt Progress Progresjon vgrabbj VGA singleshot vgrabbj VGA singleshot vgrabbj VGA daemon vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Starter vgrabbj som en nisse. Veldig kjapt. Question Spørsmål &Yes &Ja &No &Nei The simplest setting. Fairly slow Den enkleste opsjonen. Veldig treig Exports from jpeg images to mpeg1 video Eksporterer fra jpeg-bilder til mpeg1-video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) En nyere versjon av preferansefilen med flere standardvalg eksisterer. Ønsker du å bruke denne fremfor den gamle? (Den gamle vil bli lagret som ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Eksporterer fra jpeg-bilder til mpeg2-video Exports from jpeg images to mpeg4 video Eksporterer fra jpeg-bilder til mpeg4-video dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Fanger bilder fra DV-kamera. (EKSPERIMENTELL) videodog singleshot videodog enkeltbilde Videodog. Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation Kjører animasjonen SoundHandler Sounds (*.ogg) Lyder (*.ogg) Sound name Navn på lyd Enter the name of the sound: Angi navn på lyden: Choose sound file Velg lydfil ToolsMenu &Add Frames &Legg til bilder <h4>Add Frames</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Legg til bilder</h4> <p>Med denne knappen kan du <em>legge til</em> bilder i animasjonen.</p> &Remove Selection &Fjern valgte <h4>Remove Selection</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Fjern valgte bilder</h4> <p>Trykk på denne knappen for å <em>fjerne</em> de valgte bildene fra animasjonen.</p> New &Scene Ny &scene <h4>New Scene</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Ny Scene</h4> <p>Med denne knappen kan du lage en ny <em>scene/em> som legges til animasjonen</p> Re&move Scene &Fjern scene Camera &on &Kamera på <h4>Toggle camera on/off</h4> <p>Click this button to toggle the camera on and off</p> <h4>Skru kamerae av/på</h4> <p>Med denne knappen kan du skru kameraet av og på</p> &Capture Frame &Ta bilde <h4>Capture Frame</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <h4>Ta bilde</h4> <p>Trykk på denne knappen for å ta et bilde fra kameraet ditt og legge det til animasjonen</p> Number of mixes: Antall bilder mikset på: FPS chooser FPS-velger <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>FPS-velger</h4> <p>Ved å forandre verdien i dette feltet kan du bestemme hastigheten (i bilder per sekund) animasjonen skal kjøre i.</p> Mix Miks Diff Forskjell Number of images: Antall bilder: Playback Avspilling <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Legg til bilder (CTRL+F)</h4><p>Trykk på denne knappen for å <em>legge til</em> bilder til animasjonen.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Fjern valgte bilder</h4><p>Trykk på denne knappen for å <em>fjerne</em> de valgte bildene fra animasjonen.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Ny scene (CTRL+E)</h4> <p>Trykk på denne knappen for å <em>legge til en ny scene</em>.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Fjern scener (SHIFT+Delete)</h4><p>Trykk på denne knappen for å <em>fjerne</em> de valgte scenene fra animasjonen. </p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Skru av/på kamera</h4> <p>Trykk på denne knappen for å skru av og på kameraet</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Ta et bilde (Space)</h4><p>Trykk på denne knappen for å <em>ta et bilde</em> og legge det til i animasjonen.</p> <p>Dette kan også gjøres ved å trykke på <b>space-tasten</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antall bilder</h4><p>Her kan du sette hvor mange tidligere bilder som skal brukes i den gitte modusen (enten playback eller miks).</p> <h4>Play animation (K, P)</h4> <h4>Spill av animasjon (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Stopp animasjon (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Forrige bilde (J, venstre)</h4> <h4>Next frame (L, Right)</h4> <h4>Neste bilde (L, høyre) </h4> <h4>Previous scene (I)</h4> <h4>Forrige scene (l)</h4> <h4>Next scene (O)</h4> <h4>Neste scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Spill av kontinuerlig (begynn på starten igjen når animasjonen er ferdig, CTRL+L)</h4><p>Her kan du velge om du ønsker å spille av animasjonen kontinuerlig, eller om den skal stoppe når den er ferdig.</p> Notice Notis Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Playback fungerer kun når du gjører bildefangst-programmet som en nisse. Gå til preferansemenyen (CTRL+P ) for å sette at programmet skal kjøres som en nisse. Auto Auto Pr sec Pr sek Pr min Pr min Pr hr Pr time <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_no_nn.ts000066400000000000000000002462411234321124500224330ustar00rootroot00000000000000 @default You do not have the necessary permissions to run Stopmotion. Du har ikke de riktige rettighetene til å kjøre Stopmotion. AboutDialog &About &Om Main developers Hovedutviklere A&uthors &Forfattere Translation Oversettelse Czech Tsjekkisk Slovenian Slovensk French Fransk Logo Logo Coordinating Koordinering Testing Testing &Thanks To &Takk til &Licence Agreement &Lisensavtale OK OK About Om This is the Stopmotion application for creating stop motion animations. Dette er Stopmotion - et program for å lage stillbildeanimasjoner. German Portuguese Spanish Swedish Contributors CameraHandler Camera &off &Kamera av Camera &on &Kamera på DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Her kan velge hva slags enhet Stopmotion skal hente bilder fra. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Du kan velge en automatisk gjenkjent enhet, eller du kan legge til egne. Sistnevnte er imidlertid ikke å foretrekke, men du må gjerne gjøre det hvis du er en avansert bruker og vet hva du gjør. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Den valgte enheten representerer <b>$VIDEODEVICE</b> under innstillingene for 'Videoimport'. Name Navn Description Beskrivelse &Add &Legg til &Remove &Fjern &Edit &Rediger Video device settings Innstillinger for videoenhet Video Device ($VIDEODEVICE): Videoenhet ($VIDOEDEVICE): Autodetected Automatisk gjenkjent device enhet ExportTab Active Aktiv Name Navn Description Beskrivelse &Add &Legg til &Remove &Fjern &Edit &Rediger Encoder settings Instillinger for enkoder Do you want to be asked for an output file everytime you choose to export? Ønsker du å angi videofil hver gang du eksporterer? Yes Ja No Nei Set default output file: Sett standard videofil: Browse Bla gjennom Start encoder: Start enkoder: Stop encoder: Stopp enkoder: Choose output file Velg videofil <p>Below you can set which program/process stopmotion should use for encoding the currently active project to a video file.</p><p>You can use $IMAGEPATH to represent the image path (absolute path to the directory where the images can be found). You should always use <b>$VIDEOFILE</b> to represent the output file (the videofile generated by the encoder) in the <b>command line</b>. This is independent of how you decides to select it (select it for each export or have a default file).<br></p><p> Example with mencoder (converting jpg to mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> <p>Under kan du sette hva slags program/prosess stopmotion skal bruke til generering av video.</p><p>$IMAGEPATH kan brukes til å representere katalogen hvor bildene er plassert. <b>$VIDEOFILE</b> må alltid brukes for å representere videofilen, enten du velger å bli spurt om videofil for hver gang du eksporterer eller har satt en standardfil.<br></p><p> Eksempel med mencoder (konverterer jpg til mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Her kan du velge hva slags program Stopmotion skal bruke til å sette sammen bildene til en film. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Du bør alltid bruke <b>$IMAGEPATH</b> og <b>$VIDEOFILE</b> til å representere henholdsvis bildekatalogen og video-filen. Example with mencoder (jpeg images to mpeg4 video): Eksempel med mencoder (jpeg-bilder til mpeg4-video): ExternalCommand Input to program: Input til program: Submit Send Close Lukk Output from external command Output fra ekstern kommando Result Resultat Failed! Feilet! Successfull! Suksess! FileDialog Go to home directory Gå til hjemmekatalog Form Form Form FrameBar Frame number: Bildenummer: FramePreferencesMenu Add &sound Legg til &lyd &Remove Sound &Fjern lyd Change name Skift navn Sounds: Lyder: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Legg til lyd</h4><p>Denne knappen kan brukes til å <em>legge til lyder</em> til det valgte bildet.</p><p>Lyden vil starte å spille i det bildet vises, og vil spille inntil den er ferdig.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Fjern lyd</h4><p>Denne knappen kan brukes til å <em>fjerne</em> den valgte lyden fra dette bildet.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Skift navn</h4><p>Denne knappen kan brukes til å skifte navn på den valgte lyden. <BR>Navnet har ingen effekt ut over at det blir enklere å holde styr på de forskjellige lydene.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Lyder</h4><p>Denne listen viser alle lydene som er tilknyttet dette bildet.</p><p>Lydene vil starte å spille når bildet vises, og spiller inntil de er ferdige.</p> FrameView Warning Advarsel Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Bildefangst feilet. Dette kan skje hvis du prøver å fange bilde fra en ugyldig enhet. Vennligst sjekk at preferansene er riktige. You have to define an image grabber to use. This can be set in the preferences menu. Du må velge et program som kan fange bilder. Dette kan settes i preferanse-menyen. Pre poll command does not exists Forhåndskommando eksisterer ikke You do not have the given grabber installed on your system Programmet du har satt til å fange bilder eksisterer ikke på ditt system No video device selected in the preferences menu. Ingen videoenheter er valgt i preferansemenyen. HelpWindow &New Window &Nytt vindu &Open File &Åpne fil &Print &Print &Close &Lukk &Backward &Bakover &Forward &Fremover &Home &Hjem Add Bookmark Legg til bokmerke &File &Fil &Go &Gå History Historie Bookmarks Bokmerker Backward Bakover Forward Fremover Home Hjem ImportTab <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> </p> <p>Under kan du sette hva slags program/prosess stopmotion skal bruke til å fange bilder med.<br><br> </p> Active Aktiv Name Navn Description Beskrivelse &Add &Legg til &Remove &Fjern &Edit &Rediger Import device settings Innstillinger for input-enhet Pre-poll command Forhåndskommando Start daemon Start nisse Stop daemon Stopp nisse Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Her kan du sette hva slags program Stopmotion skal bruke til å fange bilder fra den valgte videoenheten. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Du bør alltid bruke <b>$VIDEODEVICE</b> og <b>$IMAGEFILE</b> til å representere henholdsvis videoenheten og bildefilen. LanguageHandler &English &Engelsk <h4>English</h4> <p>Select this menu options to get the <em>English</em> translation of the application.</p> <h4>Engelsk</h4> <p>Dette menyvalget vil gi deg den engelske oversettingen av programmet.</p> &Norwegian &Norsk <h4>Norwegian</h4> <p>Select this menu options to get the <em>Norwegian</em> translation of the application.</p> <h4>Norsk</h4> <p>Dette menyvalget vil gi deg den norske oversettingen av programmet.</p> English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) English &Translation &Språk MainWindow Stopmotion Help Browser Stopmotion hjelpevindu Backward Bakover Forward Fremover Close Lukk MainWindowGUI Ready to rumble ;-) Klar til dyst ;-) &New &Ny &Open &Åpne &Save &Lagre Save &As Lagre &som Add &Frames Legg til &bilde &Quit &Avslutt &File &Fil &Undo &Angre Re&do &Gjør om Cu&t Klipp &ut &Copy &Kopier &Paste &Lim inn &Go to frame &Gå til bilde Prefere&nces &Preferanser &Edit &Rediger What's &This H&va er dette &About &Om &Help &Hjelp <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Bildeinnstillinger</h4> <p>I denne menyen kan du sette innstillinger for den valgte frame slik som <b>undertekst</b>, <b>lydeffekter</b>, etc. </p> Add sound Legg til lyd Remove Sound Fjern lyd Change name Skift navn Sounds: Lyder: <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Gå til bilde-menyen</h4> <p>I denne menyen kan du angi nummeret til et bilde som programmet skal gå til.</p> Go to frame: Gå til frame: Frame number: 0 Frame: 0 <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Bildenummer</h4> <p>Dette feltet viser nummeret på det valgte bildet.</p> Unsaved changes Ulagrede forandringer There are unsaved changes. Do you want to save? Det er forandringer som ikke har blitt lagret. Ønsker du å lagre dem nå? &Yes &Ja &No &Nei <p>This is the stopmotion application for creating stopmotion animations.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p>Dette er Stopmotion-applikasjonen til å lage stop motion-animasjoner. </p> <p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> Save File Lagre fil &Thanks To &Takk til &Licence Agreement &Lisensavtale <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Åpne</h4> <p><em>Åpner</em> en Stopmotion prosjektfil. </p> <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Angre</h4> <p><em>Angrer</em> den siste operasjonen. Du kan trykke på angre flere ganger for å angre tidligere operasjoner. </p> <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Gjenta</h4> <p><em>Gjentar</em> den siste operasjonen. Du kan trykke på gjenta flere ganger for gjenta flere operasjoner. </p> <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Klipp</h4><p><em>Klipper</em> ut de valgte bildene til klippebrettet, slik at du kan lime dem inn et annet sted. </p> <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopier</h4><p><em>Kopierer</em> de valgte bildene til klippebrettet. Disse kan du lime inn et annet sted.</p> <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Lim inn</h4> <p><em>Limer inn</em> bildene fra klippebrettet til den valgte plassen.</p><p>Du kan kopiere/klippe bilder fra andre programmer for deretter å lime dem inn i animasjonen din.</p> <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Hva er dette</h4><p> Denne vil gi deg et spørsmålstegn som musepeker. Denne kan du bruke til å finne nyttig informasjon slik som her. </p> <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Om</h4><p>Denne gir deg et lite vindu hvor du kan lese om generell informasjon om denne applikasjonen.</p> <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Bilder</h4><p>Her kan du se alle bildene og scenene som animasjonen din består av. Disse kan du flytte rundt med musa.</p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Verktøymeny</h4> <p>Her finner du mesteparten av verktøyene du trenger når du lager animasjonen.</p> Add &sound Legg til &lyd <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Bildevisning</h4><p> I dette vinduet ser du bildet som til enhver tid er markert.</p> A&uthors &Forfattere <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Avslutt</h4> <p><em>Avsutter</em> programmet.</p> <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Gå til bilde</h4> <p> Denne vil sprette opp en liten meny helt nederst hvor du kan velge et bildenummer du ønsker å gå til.</p> &English &Engelsk <h4>English</h4> <p>Select this menu options to get the <em>English</em> translation of the application.</p> <h4>Engelsk</h4> <p>Dette menyvalget vil gi deg den engelske oversettingen av programmet.</p> &Norwegian &Norsk <h4>Norwegian</h4> <p>Select this menu options to get the <em>Norwegian</em> translation of the application.</p> <h4>Norsk</h4> <p>Dette menyvalget vil gi deg den norske oversettingen av programmet.</p> &Languages &Språk &Settings I&nnstillinger Disable sound Skru av lyd Video Video &Export &Eksport <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Ny</h4> <p> Oppretter et <em>nytt</em> prosjekt.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Lagre</h4><p><em>Lagrer</em> nåværende animasjon som en Stopmotion prosjektfil. <BR> Hvis prosjektet allerede er lagret til fil, vil det automatisk lagre til denne filen. </p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Lagre som</h4><p><em>Lagrer</em> nåværende animasjon som en Stopmotion prosjektfil.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4><p>Eksporterer nåværende prosjekt til <em>video</em>.</p> Instillinger for dette setter du i preferansenmenyen. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4><p>Eksporterer nåværende animasjon til et <em>Cinelerra</em>-prosjekt.</p> Ikke støttet for øyeblikket. Cinelerra Cinelerra &Configure Stopmotion &Konfigurer Stopmotion Open &Recent Åpne &siste New project Nytt prosjekt Open project Åpne prosjekt Save project Lagre prosjekt Save project As Lagre prosjekt som Quit Avslutt Undo Angre Redo Gjenta Cut Klipp Copy Kopier Paste Lim inn Go to frame Gå til bildenummer <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Konfigurer Stopmotion</h4> <p>Du vil få opp et vindu hvor du kan <em>konfigurere</em> Stopmotion med ulike inn- og utenheter.</p> Configure Stopmotion Konfigurer Stopmotion What's This Hva er dette About Om Warning Advarsel Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Ingen registrerte enkodere for eksport til video. Dette kan settes i preferansemenyen. Eksport til video vil ikke være mulig før du har satt en gyldig enkoder. Ønsker du å sette dette nå? Export to video file Eksporter til videofil The registered encoder is not valid. Do you want to check your settings in the preferences menu? Den registrerte enkoderen er ikke gyldig. Ønsker du å sjekke innstillingene i preferansemenyen? Export to file Eksporter til fil <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Hjelp</h4><p>Denne knappen viser et vindu med brukermanualen.</p> Help Hjelp <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> <p><b>Utviklere</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> Stopmotion User Manual Stopmotion brukermanual <p><b>Coordinating</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br></p> <p><b>Koordinering</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Oversetting</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Tsjekkisk)<br></p> Frame number: Bildenummer: Choose project file Velg prosjektfil Save As Lagre som ModelHandler Choose frames to add Velg frames å legge til Removed the selected frame Fjernet den valgte frame Warning Advarsel You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu <p>Below you can set which program/process stopmotion should use for grabing images from the webcam, and displaying video.<br> <br> You can also add new programs, just make sure the image is saved with the path and filename <b>.stopmotion/capturedfile.png</b> </p> <p>Nedenfor kan du angi hvilket program/prosess som Stopmotion skal bruke for å ta bilder fra webkameraer, etc. <br><br>Du kan også legge til nye programmer. Bare sørg for at bildet blir lagret med stien og filnavnet <b>$HOME/.stopmotion/capturedfile.png</b> </p> &Add &Legg til Video &Import Video&import <p>Video Export</p> <p>Video eksport</p> Video &Export Video&eksport Active Aktiv Command line option Kommandolinje-opsjon <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> You can also add new programs, just make sure the command line is written with file path being <b>&lt;DEFAULTPATH&gt;</b></p> <p>Nedenfor kan du angi hvilket program/prosess som Stopmotion skal bruke for å ta bilder fra webkameraer, etc. <br><br>Du kan også legge til nye programmer. Bare sørg for at kommandolinjen blir skrevet med filstien: <b>&lt;DEFAULTPATH&gt;</b></p> &Remove &Fjern Apply Lagre Close Lukk Preferences Menu Preferansemeny Video &Device &Videoenhet QtFrontend Warning Advarsel Fatal Fatal feil Cancel Avbryt Progress Progresjon vgrabbj VGA singleshot vgrabbj VGA singleshot vgrabbj VGA daemon vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Starter vgrabbj som en nisse. Veldig kjapt. Question Spørsmål &Yes &Ja &No &Nei The simplest setting. Fairly slow Den enkleste opsjonen. Veldig treig Exports from jpeg images to mpeg1 video Eksporterer fra jpeg-bilder til mpeg1-video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) En nyere versjon av preferansefilen med flere standardvalg eksisterer. Ønsker du å bruke denne fremfor den gamle? (Den gamle vil bli lagret som ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Eksporterer fra jpeg-bilder til mpeg2-video Exports from jpeg images to mpeg4 video Eksporterer fra jpeg-bilder til mpeg4-video dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Fanger bilder fra DV-kamera. (EKSPERIMENTELL) videodog singleshot videodog enkeltbilde Videodog. Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation Kjører animasjonen SoundHandler Sounds (*.ogg) Lyder (*.ogg) Sound name Navn på lyd Enter the name of the sound: Angi navn på lyden: Choose sound file Velg lydfil ToolsMenu &Add Frames &Legg til bilder <h4>Add Frames</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Legg til bilder</h4> <p>Med denne knappen kan du <em>legge til</em> bilder i animasjonen.</p> &Remove Selection &Fjern valgte <h4>Remove Selection</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Fjern valgte bilder</h4> <p>Trykk på denne knappen for å <em>fjerne</em> de valgte bildene fra animasjonen.</p> New &Scene Ny &scene <h4>New Scene</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Ny Scene</h4> <p>Med denne knappen kan du lage en ny <em>scene/em> som legges til animasjonen</p> Re&move Scene &Fjern scene Camera &on &Kamera på <h4>Toggle camera on/off</h4> <p>Click this button to toggle the camera on and off</p> <h4>Skru kamerae av/på</h4> <p>Med denne knappen kan du skru kameraet av og på</p> &Capture Frame &Ta bilde <h4>Capture Frame</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <h4>Ta bilde</h4> <p>Trykk på denne knappen for å ta et bilde fra kameraet ditt og legge det til animasjonen</p> Number of mixes: Antall bilder mikset på: FPS chooser FPS-velger <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>FPS-velger</h4> <p>Ved å forandre verdien i dette feltet kan du bestemme hastigheten (i bilder per sekund) animasjonen skal kjøre i.</p> Mix Miks Diff Forskjell Number of images: Antall bilder: Playback Avspilling <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Legg til bilder (CTRL+F)</h4><p>Trykk på denne knappen for å <em>legge til</em> bilder til animasjonen.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Fjern valgte bilder</h4><p>Trykk på denne knappen for å <em>fjerne</em> de valgte bildene fra animasjonen.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Ny scene (CTRL+E)</h4> <p>Trykk på denne knappen for å <em>legge til en ny scene</em>.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Fjern scener (SHIFT+Delete)</h4><p>Trykk på denne knappen for å <em>fjerne</em> de valgte scenene fra animasjonen. </p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Skru av/på kamera</h4> <p>Trykk på denne knappen for å skru av og på kameraet</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Ta et bilde (Space)</h4><p>Trykk på denne knappen for å <em>ta et bilde</em> og legge det til i animasjonen.</p> <p>Dette kan også gjøres ved å trykke på <b>space-tasten</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antall bilder</h4><p>Her kan du sette hvor mange tidligere bilder som skal brukes i den gitte modusen (enten playback eller miks).</p> <h4>Play animation (K, P)</h4> <h4>Spill av animasjon (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Stopp animasjon (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Forrige bilde (J, venstre)</h4> <h4>Next frame (L, Right)</h4> <h4>Neste bilde (L, høyre) </h4> <h4>Previous scene (I)</h4> <h4>Forrige scene (l)</h4> <h4>Next scene (O)</h4> <h4>Neste scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Spill av kontinuerlig (begynn på starten igjen når animasjonen er ferdig, CTRL+L)</h4><p>Her kan du velge om du ønsker å spille av animasjonen kontinuerlig, eller om den skal stoppe når den er ferdig.</p> Notice Notis Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Playback fungerer kun når du gjører bildefangst-programmet som en nisse. Gå til preferansemenyen (CTRL+P ) for å sette at programmet skal kjøres som en nisse. Auto Auto Pr sec Pr sek Pr min Pr min Pr hr Pr time <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_no_se.ts000066400000000000000000001624541234321124500224320ustar00rootroot00000000000000 AboutDialog &About Main developers A&uthors Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Licence Agreement OK About This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Description &Add &Remove &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab Name Description &Add &Remove &Edit Encoder settings Do you want to be asked for an output file everytime you choose to export? Yes No Set default output file: Browse Start encoder: Stop encoder: Choose output file Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! Form Form FrameBar Frame number: FramePreferencesMenu Add &sound &Remove Sound Change name Sounds: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> FrameView Warning Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. You have to define an image grabber to use. This can be set in the preferences menu. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. ImportTab Name Description &Add &Remove &Edit Import device settings Pre-poll command Start daemon Stop daemon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) English &Translation MainWindow Stopmotion Help Browser Backward Forward Close MainWindowGUI Ready to rumble ;-) &New &Open <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> &Save Save &As &Quit <h4>Quit</h4> <p><em>Quits</em> the program.</p> &File &Undo <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> Re&do <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> Cu&t <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> &Copy <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> &Paste <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> &Go to frame <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> &Edit &Settings What's &This <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> &About <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> &Help <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> Go to frame: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> Unsaved changes There are unsaved changes. Do you want to save? &Yes &No Video &Export <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. Cinelerra &Configure Stopmotion Open &Recent New project Open project Save project Save project As Quit Undo Redo Cut Copy Paste Go to frame <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> Configure Stopmotion What's This About Warning Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Export to video file The registered encoder is not valid. Do you want to check your settings in the preferences menu? Export to file <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> Help Frame number: Choose project file Save As ModelHandler Choose frames to add Removed the selected frame Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Export Apply Close Preferences Menu Video &Device QtFrontend Warning Fatal Cancel vgrabbj VGA singleshot vgrabbj VGA daemon Starts vgrabbj as a daemon. Pretty fast. Question The simplest setting. Fairly slow Exports from jpeg images to mpeg1 video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exports from jpeg images to mpeg4 video dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation SoundHandler Sounds (*.ogg) Sound name Enter the name of the sound: Choose sound file ToolsMenu FPS chooser <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> Number of images: Mix Diff Playback <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Next scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_pt.ts000066400000000000000000002007441234321124500217450ustar00rootroot00000000000000 AboutDialog This is the Stopmotion application for creating stop motion animations. Isto é o programa Stopmotion para criar filmes imagem por imagem. &About &Acerca de Main developers Programadores principais A&uthors A&utores Translation Tradução Czech Checo Slovenian Eslovèno French Francês Logo Logo Coordinating Coordenação Testing Testes &Thanks To Agradecimen&tos A &Licence Agreement &Licença OK OK About Acerca de German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Abaixo pode definir qual dispositivo Stopmotion deveria utilizar para gravar imagens e mostrar vídeo. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Pode escolher a partir dos dispositivos detectados automáticamente ou adicionar-los por si mesmo. Não é aconselhado utilizar dispositivos que não são detectados automáticamente, mas pode fazer-lo se for um perito. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. O dispositivo escolhido é reconhecido como <b>$VIDEODEVICE</b> no importe de Vídeo. Name Nome Description Descrição &Add &Adicionar &Remove &Remover &Edit &Editar Video device settings Configuração do dispositivo Vídeo Video Device ($VIDEODEVICE): Dispositivo Vídeo ($VIDEODEVICE): device dispositivo ExportTab Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Abaixo pode escolher qual programa/processo Stopmotion deve utilizar para codificar o projecto activo num ficheiro vídeo. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Deveria sempre utilizar <b>$IMAGEPATH</b> e <b>$VIDEOFILE</b> para representar respectivamente o caminho das imagens e do ficheiro vídeo. Example with mencoder (jpeg images to mpeg4 video): Exemplo com mencoder (imagens jpeg para vídeo mpeg4): Name Nome Description Descrição &Add &Adicionar &Remove &Remover &Edit &Editar Encoder settings Configuração do codificador Do you want to be asked for an output file everytime you choose to export? Deseja que lhe seja pedido o ficheiro de saída cada vêz que exporta? Yes Sim No Não Set default output file: Definir o ficheiro de saída por omissão: Browse Navegar Start encoder: Lançar o codificador: Stop encoder: Parar o codificador: Choose output file Escolher o ficheiro de saída ExternalCommand Input to program: Enviado ao programa: Submit Enviar Close Fechar Output from external command Resultado do programa externo Result Resultado Failed! Falhou! Successfull! Conseguiu! Form Form Formulário FrameBar Frame number: Imagem número: FramePreferencesMenu Add &sound Adicionar &som &Remove Sound &Remover Som Change name Mudar o nome Sounds: Sons: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Adicionar som</h4> <p>Com este botão pode <em>adicionar sons</em> à imagem seleccionada.</p> <p>O som vai começar de ser tocado quando esta imagem será mostrada e continuará até ao seu fim.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Remover som</h4> <p>Com este botão pode <em>remover</em> o som seleccionado desta imagem.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Mudar o nome</h4> <p>Com este botão pode mudar o nome do som seleccionado. <BR>O nome dum som não serve para nada mais que facilitar o trabalho na animação.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Sons</h4> <p>Esta lista mostra todos os sons ligados a esta imagem.</p><p>Os sons vão começar de ser tocados quando esta imagem será mostrada e continuarão até ao fim.</p> FrameView Warning Aviso No video device selected in the preferences menu. Nenhum dispositivo de vídeo seleccionado no menu preferências. Pre poll command does not exists O commando de pré-captura não existe You do not have the given grabber installed on your system Você não tem o gravador indicado instalado no seu sistema Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. A gravação falhou. Isto pode acontecer se tentou gravar a partir dum dispositivo inválido. Por favor verifique a sua configuração nas preferências. You have to define an image grabber to use. This can be set in the preferences menu. Deve indicar um gravador de imagens a utilizar. Isto pode ser feito nas preferências. ImportTab Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Abaixo pode indicar qual programa ou processo o Stopmotion deveria utilizar para gravar imagens a partir do dispositivo seleccionado. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Deveria sempre utilizar <b>$VIDEODEVICE</b> e <b>$IMAGEFILE</b> para representar respectivamente o dispositivo de vídeo e o ficheiro imagem. Name Nome Description Descrição &Add &Adicionar &Remove &Remover &Edit &Editar Import device settings Configuração do dispositivo de importação Pre-poll command Commando de pré-captura Start daemon Iniciar o demónio Stop daemon Parar o demónio LanguageHandler English Inglês &Translation &Tradução English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Português MainWindow Stopmotion Help Browser Navegador de Ajuda do Stopmotion Backward Recuar Forward Avançar Close Fechar MainWindowGUI Ready to rumble ;-) Pronto ;-) &File &Ficheiro &Export &Exportar Open &Recent &Recentemente Abertos &Edit &Editar &Settings &Configurar &Help &Ajuda &New &Novo &Open &Abrir &Save &Gravar Save &As Gravar Co&mo Video Vídeo Cinelerra Cinelerra &Quit &Saír &Undo &Desfazer Re&do Re&fazer Cu&t Cor&tar &Copy &Copiar &Paste Co&lar &Go to frame &Ir á imagem &Configure Stopmotion &Configurar Stopmotion What's &This O que é is&to &About &Acerca de Frame number: Imagem número: Go to frame: Ir á imagem: <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Novo</h4> <p>Cria um <em>novo</em> projecto.</p> New project Novo projecto <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Abrir</h4> <p><em>Abre</em> um fichiero de projecto Stopmotion.</p> Open project Abrir projecto <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Gravar</h4> <p><em>Grava</em> a animação actual como um ficheiro projecto Stopmotion. <BR>Se este projecto já foi gravado antes vai ser automáticamento gravado no ficheiro já seleccionado.</p> Save project Gravar projecto <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Gravar Como</h4> <p><em>Grava</em> a animação actual como um ficheiro projecto Stopmotion.</p> Save project As Gravar o prejecto Como <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Vídeo</h4> <p>Exporta o projecto actual num <em>vídeo</em>.</p>Vai obter um assistente para ser guiado. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinelerra</h4> <p>Exporta o projecto actual num projecto <em>Cinelerra</em>.</p>Vai obter um assistente para ser guiado. <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Saír</h4> <p><em>Pára</em> o programa.</p> Quit Saír <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Desfazer</h4> <p><em>Desfaz</em> a sua última operação. Pode carregar várias vezes para desfazer as operações anteriores.</p> Undo Desfazer <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Refazer</h4> <p><em>Repete</em> a sua última operação. Pode carregar várias vezes para repetir mais operações.</p> Redo Refazer <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Cortar</h4> <p><em>Retira</em> as imagens seleccionadas da animação e adiciona-las à área de transferência para poderem ser coladas noutro sítio.</p> Cut Cortar <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Copiar</h4> <p><em>Copia</em> as imagens seleccionadas para a área de transferência. Poderão ser coladas noutro sítio.</p> Copy Copiar <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Colar</h4> <p><em>Cola</em> as imagens que estão na área de transferência no sítio seleccionado.</p> <p>Pode copiar ou cortar imagens noutros programas e utilizar esta opção para as colar nesta animação.</p> Paste Colar <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Ir à imagem</h4> <p>Isto vai dar-lhe um menu em baixo do qual poderá escolher a imagem a que deseja <em>aceder</em>.</p> Go to frame Ir à imagem <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Configurar Stopmotion</h4> <p>Isto vai abrir uma janela onde poderá <em>configurar</em> Stopmotion com vários dispositivos de gravação.</p> Configure Stopmotion Configurar Stopmotion <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> What's This O Que é Isto <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Ajuda</h4> <p>Este botão vai dar-lhe o manual do Stopmotion</p> Help Ajuda <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Acerca de</h4> <p>Isto vai mostrar-lhe uma pequena informação geral assim como os nomes dos programadores que fizeram este excelente programa.</p> About Acerca de <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Quantia de imagens</h4><p>Esta zona indica quantas imagens estão seleccionadas</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Visualizador de imagens</h4><p> Nesta área pode ver a imagem seleccionada. Pode também ler a animação nesta janela carregando no botão <b>Ler</b>.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Menu Ir à imagem</h4> <p>Aqui pode indicar um número de imagem e o programa a saltar até ela</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Menu de preferências de imagens</h4> <p>Aqui pode configurar as suas preferências para as imagens seleccionadas, como por exemplo os <b>subtitúlos</b>, os <b>efeitos de sons</b>, etc.</p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Menu Ferramentas</h4> <p>Aqui estão os botões e ferramentas que precisará quandovai trabalhar em animações imagem por imagem.</p> <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Barra das Imagens</h4> <p>Aqui pode ver as imagens e cenas da animação, e construir a animação movendo-las.</p><p>Pode passar à imagem anterior ou seguinte carregando nas <b>telcas flechas</b> ou em <b>x</b> e <b>z</b></p> Unsaved changes Modificações não gravadas There are unsaved changes. Do you want to save? Há modificações que não foram gravadas. Deseja gravar-las? &Yes &Sim &No &Não Choose project file Escolha o ficheiro de projecto Save As Gravar Como Warning Aviso Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Não consigo encontrar um codificador para exportar o vídeo. Isto pode ser configurado nas preferências. Não vai ser possível exportar até que você indique o codificador a utilizar. Deseja configurar-lo agora? Export to video file Exportar num ficheiro vídeo The registered encoder is not valid. Do you want to check your settings in the preferences menu? O codificador registado não é válido. Deseja verificar a sua configurçao nas preferências? Export to file Exportar num ficheiro ModelHandler Choose frames to add Escolha as imagens a adicionar Removed the selected frame Retirar a imagem selecionada Warning Aviso You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Apply Aplicar Close Fechar Preferences Menu Menu Preferências Video &Import &Importe de Vídeo Video &Export &Exporte de Vídeo Video &Device &Dispositivo de Vídeo QtFrontend Cancel Anular Warning Aviso Fatal Fatal A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Uma nova versão do ficheiro de preferências com mais valores por omissão existe. Deseja utilizar-la? (O seu ficheiro anterior será guardado em ~/.stopmotion/preferences.xml.OLD) vgrabbj VGA singleshot vgrabbj VGA imagem única The simplest setting. Fairly slow A configuração mais simples. Bastante Lenta vgrabbj VGA daemon vgrabbj VGA em demónio Starts vgrabbj as a daemon. Pretty fast. Lança vgrabbj como um demónio. Bastante rápido. dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Gravação a partir duma câmara DV. (EXPERIMENTAL) videodog singleshot videodog imagem única Videodog. Videodog. Exports from jpeg images to mpeg1 video Exporta a partir de imagens jpeg num vídeo mpeg1 Exports from jpeg images to mpeg2 video Exporta a partir de imagens jpeg num vídeo mpeg2 Exports from jpeg images to mpeg4 video Exporta a partir de imagens jpeg num vídeo mpeg4 Question Pergunta Grabbing from DV-cam. RunAnimationHandler Running animation A ler a animação SoundHandler Choose sound file Escolha o ficheiro de som Sounds (*.ogg) Sons (*.ogg) Sound name Nome do som Enter the name of the sound: Escreva o nome do som: ToolsMenu FPS chooser IPS (imagens por segundo) Number of images: Número de imagens: Mix Misturar Diff Diferença Playback Leitura Auto Auto Pr sec Pr sec Pr min Pr min Pr hr Pr hr <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Adicionar Imagens (CTRL+F)</h4> <p>Carregue neste botão para <em>adicionar</em> imagens á animação.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Retirar Selecção (Apagar)</h4> <p>Carregue neste botão para <em>retirar</em> as imagens seleccionadas á animação.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Nova Scena (CTRL+E)</h4> <p>Carregue neste botão para <em>criar</em> uma nova <em>scena</em> na animação.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Retirar a Cena (SHIFT + Apagar)</h4> <p>Carregue neste botão para <em>retirar</em> a cena seleccionada á animação.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Interruptor da câmara (C)</h4> <p>Carregue neste botão para ligar ou desligar a câmara</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Capturar Imagem (Espaço)</h4> <p>Carregue neste botão para <em>capturar</em> uma imagem a partir da câmara e inserir-la na animação</p> <p> Isto também pode ser feito carregando na <b>tecla Espaço</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Número de imagens</h4> <p>Mudando este valor pode indicar quantas imagens anteriores da animação deve ser misturadas acima da câmara, ou se estiver em leitura : quantas imagens ler. </p> <p>Misturando as imagens anteriores podera mais fácilmente ver a relação entre as imagens, obtendo uma animação mais regular!</p> <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Escolhedor de IPS</h4> <p>Mudando este valor pode definir a que velocidade a animação deveria ser lida no <b>Visualizador</b>.</p> <p>Para ler a animação carregue no botão <b>Ler a Animação</b>.</p> <h4>Play animation (K, P)</h4> <h4>Ler a animação (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Parar a animação (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Imagem precedente (J, Esquerda)</h4> <h4>Next frame (L, Right)</h4> <h4>Imagem seguinte (L, Direita)</h4> <h4>Previous scene (I)</h4> <h4>Cena precedente (I)</h4> <h4>Next scene (O)</h4> <h4>Cena seguinte (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Repetir a animação (CTRL+L)</h4> <p>Com este botão pode escolher se quer que a animação seja lida até ao fim, ou repetida indefinidamente.</p> Notice Nota Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. A leitura funciona por enquanto sómente quando o gravador funciona como demónio. Vá ao menu preferências (CTRL+P) para configurar a gravação de imagens como demónio. <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_ru.ts000066400000000000000000002203541234321124500217470ustar00rootroot00000000000000 AboutDialog &About &О программе Main developers Основные разработчики A&uthors А&вторы Translation Переводчики Czech Чешский Slovenian Словенский French Французский Logo Логотип Coordinating Координация Testing Тестирование &Thanks To &Благодарности &Licence Agreement &Лицензионное соглашение OK Ок About О программе This is the Stopmotion application for creating stop motion animations. Это приложение Stopmotion. Оно помогает создавать stop-motion анимацию. German Немецкий Portuguese Португальский Spanish Испанский Swedish Шведский Contributors Контрибьюторы DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Ниже вы можете указать, какое устройство Stopmotion должен использовать для захвата изображений. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Вы можете выбрать из устройств, обнаруженных автоматически или добавить устройства самостоятельно. Если вы не очень опытный пользователь, не рекомендуется использовать устройства, которые не удалось обнаружить автоматически. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Выбранное устройство будет обозначено как макрос <b>$VIDEODEVICE</b> на вкладке Импорт Видео. Name Имя Description Описание &Add &Добавить &Remove &Удалить &Edit &Изменить Video device settings Настройки устройства захвата Video Device ($VIDEODEVICE): Видеоустройство ($VIDEODEVICE): device устройство ExportTab Name Имя Description Описание &Add &Добавить &Remove &Удалить &Edit &Изменить Encoder settings Настройки кодировщика Do you want to be asked for an output file everytime you choose to export? Запрашивать имя файла каждый раз, когда вы будете экспортировать? Yes Да No Нет Set default output file: Имя файла для вывода по умолчанию: Browse Просмотр Start encoder: Запуск кодировщика: Stop encoder: Остановка кодировщика: Choose output file Выберите файл для вывода Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Ниже вы можете указать, какую программу или процесс Stopmotion должен использовать для перекодирования текущего проекта в видеофайл. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Вы всегда должны использовать макросы <b>$IMAGEPATH</b> и <b>$VIDEOFILE</b> соответственно для обозначения пути к файлам изображений и видеофайла. Example with mencoder (jpeg images to mpeg4 video): Пример использования утилиты mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Аргументы для передачи программе: Submit Отправить Close Закрыть Output from external command Вывод внешней программы Result Результат Failed! Неудача! Successfull! Удачно! Form Form Form FrameBar Frame number: Кадр номер: FramePreferencesMenu Add &sound Добавить &звук &Remove Sound &Убрать звук Change name Изменить имя Sounds: Звуки: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Добавить звук</h4> <p>Этой кнопкой вы можете <em>добавить звук</em> в выбранный кадр.</p> <p>Звук начнёт воспроизводиться в момент начала кадра и будет проигрываться до его завершения.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Убрать звук</h4> <p>Этой кнопкой вы можете <em>удалить</em> выбранный звук из этого кадра.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Переименовать</h4> <p>Этой кнопкой вы можете переименовать выбранный звук. <BR>Название звука не несёт никакой функциональной нагрузки, оно лишь упрощает работу с анимацией.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Звуки</h4> <p>В этом списке указаны все звуки, связанные с этим кадром.</p><p>Звуки начначинают воспроизводиться в момент начала кадра и проигрываются от начала до конца.</p> FrameView Warning Внимание Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Захват кадра не удался. Такое может случиться, если для захвата используется неправильное устройство. Пожалуйста, проверьте параметры устройства захвата в меню настроек. You have to define an image grabber to use. This can be set in the preferences menu. Вы должны определить устройство для захвата изображений. Это можно сделать в меню настроек. Pre poll command does not exists Не задана команда предварительного просмотра You do not have the given grabber installed on your system Данное устройство захвата не установлено в вашем компьютере No video device selected in the preferences menu. Не выбрано устройство захвата в меню настроек. ImportTab Name Имя Description Описание &Add &Добавить &Remove &Удалить &Edit &Изменить Import device settings Настройки видеозахвата Pre-poll command Команда предварительного просмотра Start deamon Запуск процесса Stop deamon Остановка процесса Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Ниже вы можете указать, какую программу или процеес Stopmotion должен использовать для захвата кадров с помощью заданного устройства. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Вы всегда должны использовать макросы <b>$VIDEODEVICE</b> и <b>$IMAGEFILE</b> соответственно для обозначения устройства захвата и файла захваченного изображения. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Русский English Английский &Translation &Перевод MainWindow Stopmotion Help Browser Справка программы Stopmotion Backward Назад Forward Вперёд Close Закрыть MainWindowGUI Ready to rumble ;-) Всегда готов ;-) &New &Новый &Open &Открыть <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Открыть</h4> <p><em>Открывает</em> файл проекта Stopmotion.</p> &Save &Сохранить Save &As Сохранить &Как &Quit &Выход <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Выход</h4> <p><em>Выход</em> из программы.</p> &File &Файл &Undo О&тменить <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Отменить</h4> <p><em>Отменяет</em> последнее действие. Вы можете нажать Отменить несколько раз, чтобы отменить сделанные ранее действия.</p> Re&do &Повторить <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Повторить</h4> <p><em>Повторяет</em> последнее действие. Вы можете нажать Повторить несколько раз, чтобы повторить операцию несколько раз.</p> Cu&t &Вырезать <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Вырезать</h4> <p><em>Вырезает</em> выбранные кадры из анимации и помещает их в буфер обмена, чтобы вы могли их вставить в другом месте.</p> &Copy &Копировать <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Копировать</h4> <p><em>Копирует</em> tвыделенные кадры в буфер обмена. После этого вы можете вставить их в другом месте.</p> &Paste &Вставить <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Вставить</h4> <p><em>Вставляет</em> кадры из буфера обмена в выбранное место.</p> <p>Вы можете скопировать/вырезать избражения из других мест или программ и использовать эту функцию для для их вставки в вашу анимацию.</p> &Go to frame &Перейти к кадру <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Перейти к кадру</h4> <p>Открывает меню в нижней части окна. Там вы можете выбрать кадр, к которому вы хотите <em>перейти</em>.</p> &Edit &Изменить &Settings &Настройки What's &This &Что это? <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Что это?</h4> <p>Превращает ваш курсор в значок "Что это?". Указав курсором на интересующий вас элемент, вы получите информацию о нём.</p> &About &О программе <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>О программе</h4> <p>Будет показано небольшое окно, содержащее общую информацию об этом прекрасном приложении, а так же имена людей, принимавших участие в его создании.</p> &Help &Справка <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Монтажный стол</h4> <p>В этой области вы может видеть кадры и сцены вашей анимации. Перемещая их, создавайте свои видео.</p><p>Вы можете переключаться между предыдущим и следующим кадром с помощью <b>клавиш со стрелками</b> или <b>x</b> и <b>z</b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Меню инструментов</h4> <p>Это меню инструментов, где находится большинство кнопок и виджетов, которые вам нужны, когда вы занимаетесть покадровой анимацией.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Меню свойств кадра</h4> <p>В этом меню вы можете установить такие свойства выбранного кадра (или нескольких кадров), как <b>субтитры</b>, <b>звуковые эффекты</b> и т.д.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Меню перехода к кадру</h4> <p>Здесь вы можете указать номер кадра и программа перейдёт к нему</p> Go to frame: Переход к кадру: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Номер кадра</h4><p>Здесь отображается номер текущего выбранного кадра</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Панель кадра</h4><p> В этой области отображается выбранный кадр. Также, при нажатии кнопки <b>Воспроизведение</b> здесь воспроизводится ваша анимация.</p> Unsaved changes Несохранённые изменения There are unsaved changes. Do you want to save? Изменения не были сохранены. Вы хотите сохранить их? &Yes &Да &No &Нет Video Видео &Export &Экспорт <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Новый</h4> <p>Создаёт <em>новый</em> проект.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automaticly be saved to the previously selected file.</p> <h4>Сохранить</h4> <p><em>Сохраняет</em>текущую анимацию в виде файла проекта Stopmotion. <BR>Если этот проект уже был однажды сохранён, он будет заново записан в тот же файл.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Сохранить как</h4> <p><em>Сохраняет</em> текущую анимацию в виде файла проекта Stopmotion. Вы можете указать новое имя для файла.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Видео</h4> <p>Экспортирует текущий проект в <em>видеофайл</em>.</p>Мастер экспорта поможет вам с этой задачей. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Экспортирует текущую анимацию в виде файла проекта <em>Cinerella</em>.</p>Мастер экспорта поможет вам с этой задачей. Cinelerra Cinerella &Configure Stopmotion &Настроить Stopmotion Open &Recent &Последние файлы New project Новый проект Open project Открыть проект Save project Сохранить проект Save project As Сохранить проект как Quit Выход Undo Отменить Redo Повторить Cut Вырезать Copy Копировать Paste Вставить Go to frame Перейти к кадру <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Настроить Stopmotion</h4> <p>Открывает окно, где вы можете <em>настроить</em> Stopmotion для использования различных устройств ввода и вывода.</p> Configure Stopmotion Настроить Stopmotion What's This Что это? About О программе Warning Внимание Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Не могу найти ни одного кодировщика для экспорта видео.Они могут быть установлены в меню настроек. Экспорт в видеофайл не будет возможен до тех пор, пока вы не настроите кодировщика. Хотите настроить его прямо сейчас? Export to video file Экспорт в видеофайл The registered encoder is not valid. Do you want to check your settings in the preferences menu? Кодировщик настроен некорректно. Хотите проверить его параметры? Export to file Экспорт в файл <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Справка</h4> <p>Эта кнопка открывает окно справки Stopmotion</p> Help Справка Frame number: Кадр номер: Choose project file Выберите файл проекта Save As Сохранить как ModelHandler Choose frames to add Выберите кадры для добавления Removed the selected frame Выбранный кадр был удалён Warning Внимание You do not have Gimp installed on your system Gimp не установлен на вашем компьютере There is no active frame to open Не выбран активный кадр, не могу открыть The active frame is corrupt Активный кадр повреждён Failed to start Gimp! Не удалось запустить Gimp! PreferencesMenu Video &Import &Импорт видео Video &Export &Экспорт Видео Apply Применить Close Закрыть Preferences Menu Меню настроек Video &Device Устройство захвата QtFrontend Warning Внимание Fatal Фатальная ошибка Cancel Отмена vgrabbj VGA singleshot vgrabbj VGA singleshot vgrabbj VGA deamon vgrabbj VGA deamon Starts vgrabbj as a deamon. Pretty fast. Запускает vgrabbj в виде сервиса. Довольно быстро.. Question Вопрос The simplest setting. Fairly slow Самая простая настройка. Довольно медлленно Exports from jpeg images to mpeg1 video Экспортирует изображения jpeg в видео mpeg1 A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Существует более новая версия файла конфигурации с несколькими новыми значениями по умолчанию. Хотите его использовать? (Ваш старый файл конфигурации будет сохранён с именем ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Экспортирует изображения jpeg в видео mpeg2 Exports from jpeg images to mpeg4 video Экспортирует изображения jpeg в видео mpeg4 dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Захват с DV-камеры. (ЭКСПЕРИМЕНТ) videodog singleshot videodog - один кадр Videodog. Videodog. Grabbing from DV-cam. Захват с DV-камеры. RunAnimationHandler Running animation Проигрываем анимацию SoundHandler Sounds (*.ogg) Файлы звука (*.ogg) Sound name Имя звука Enter the name of the sound: Введите имя звука: Choose sound file Выберите файл звука ToolsMenu FPS chooser Выбор FPS <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Выбор FPS</h4> <p>Изменяя это значение, вы устанавливаете, с какой скоростью должно воспроизводиться видео в <b>Панели кадра</b>.</p> <p>Чтобы начать воспроизведение нажмите на кнопку <b>Воспроизведение</b>.</p> Number of images: Количество изображений: Mix Смешать Diff Разница Playback Воспризведение <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Добавить кадры (CTRL+F)</h4> <p>Нажмите эту кнопку, чтобы <em>добавить</em> кадры в анимацию.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Удалить кадры (Delete)</h4> <p>Нажмите эту кнопку, чтобы <em>удалить</em> выбранные кадры из анимации.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Новая сцена (CTRL+E)</h4> <p>Нажмите эту кнопку, чтобы <em>создать</em> новую <em>сцену</em> в анимации.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Удалить сцену (SHIFT+Delete)</h4> <p>Нажмите эту кнопку, чтобы<em>удалить</em> выбранную сцену из анимации.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Включает/выключает камеру (C)</h4> <p>Нажмите эту кнопку, чтобы включить/выключить камеру</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Захват кадра (Пробел)</h4> <p>Нажмите эту кнопку, чтобы <em>захватить</em> кадр с камеры и вставить его в анимацию</p> <p> То же самое можно сделать, нажав на клавишу <b>Пробел</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Количество изображений</h4> <p>Изменяя значение этого ползунка, вы указываете, сколько предыдущихкадров будет наложено на изображение с камеры или, если вы находитесь в режиме воспроизведения,сколько кадров будет проиграно. </p> <p>Накладывая предыдущие кадры на изображение с камеры, вы более чётко видите, как каждый последующий кадр соотносится с предыдущими, что позволяет вам создавать более плавную анимацию!</p> <h4>Play animation (K, P)</h4> <h4>Воспроизведение (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Остановить (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Предыдущий кадр (J, стрелка влево)</h4> <h4>Next frame (L, Right)</h4> <h4>Следующий кадр (L, стрелка вправо)</h4> <h4>Previous scene (I)</h4> <h4>Предыдущая сцена (I)</h4> <h4>Next scene (O)</h4> <h4>Следующая сцена (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Закольцевать (CTRL+L)</h4> <p>Эта кнопка определяет, будет ли анимация воспроизведена один раз от начала до конца, либо будет восроизводиться бесконечно в цикле.</p> Notice Замечание Playback only currently works when running the grabber as a deamon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a deamon. Сейчас режим воспроизведения работает только в случае, если кадры захватываются при помощи процесса. Перейдите в меню настроек (CTRL+P), чтобы сконфигурировать захват кадров при помощи процесса. Auto Автоматически Pr sec В секунду Pr min В минуту Pr hr В час <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> <h4>Запустить Gimp</h4> <p>Нажмите эту кнопку, чтобы открыть текущий кадр в Gimp.</p> <p>Также вы можете перетаскивать кадры с монтажного стола в окно Gimp</p> stopmotion-0.8.0/translations/stopmotion_sl.ts000066400000000000000000002271561234321124500217460ustar00rootroot00000000000000 AboutDialog &About Main developers A&uthors &Avtorji Translation Czech Slovenian French Logo Coordinating Testing &Thanks To &Zahvale gredo &Licence Agreement &Licenčna pogodba OK About This is the Stopmotion application for creating stop motion animations. German Portuguese Spanish Swedish Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Name Description &Add &Remove &Edit Video device settings Video Device ($VIDEODEVICE): device ExportTab <p>Below you can set which program/process stopmotion should use for encoding the currently active project to a video file.</p><p>You can use $IMAGEPATH to represent the image path (absolute path to the directory where the images can be found). You should always use <b>$VIDEOFILE</b> to represent the output file (the videofile generated by the encoder) in the <b>command line</b>. This is independent of how you decides to select it (select it for each export or have a default file).<br></p><p> Example with mencoder (converting jpg to mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> <p>Spodaj lahko nastavite katere programe/procese naj stopmotion uporablja za kodiranje trenutno aktivnega projekta v video datoteko.</p><p>Lahko uporabite $IMAGEPATH kot pot do slikovne datoteke (absolutna pot do datoteke kjer so shranjene slike). Vedno uporabite <b>$VIDEOFILE</b> kot pot do izvožene datoteke (video datoteka ki jo proizvede koder) v <b>ukazni vrstici</b>. Active Aktivno Name Ime Description Opis &Add &Dodaj &Remove &Odstrani &Edit &Uredi Encoder settings Nastavitve kodirnika Do you want to be asked for an output file everytime you choose to export? Želite biti vprašani o izhodni datoteki vsakič, ko se odločite za izvažanje? Yes Da No Ne Set default output file: Nastavi defoltno izvozno datoteko: Browse Brskaj Start encoder: Zaženi kodirnik: Stop encoder: Zaustavi kodirnik: Choose output file Izberi datoteko za izvoz Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Example with mencoder (jpeg images to mpeg4 video): ExternalCommand Input to program: Submit Close Output from external command Result Failed! Successfull! FileDialog Go to home directory Pojdi v domači direktorij Form Form FrameBar Frame number: FramePreferencesMenu Add &sound Dodaj &zvok &Remove Sound &Odstrani zvok Change name Spremeni ime Sounds: Zvoki: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Dodaj zvok</h4> <p>S tem gumbom lahko <em>dodajate zvoke</em> izbranim okvirčkom.</p> <p>Zvok bo začel igrati, ko se pojavi ta sličica in odigral vso svojo dolžino.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Odstrani zvok</h4> <p>S tem gumbom lahko <em>odstranite</em> izbrane zvoke s te sličice.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Spremeni ime</h4> <p>S tem gumbom lahko spremenite ime izbranega zvoka. <BR>Ime zvoka le olajša delo z animacijo.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Zvoki</h4> <p>Ta seznam prikazuje vse zvoke povezane s to sličico.</p><p>Zvok se bo začel predvajati ko se bo pokazala ta sličica.</p> FrameView Warning Opozorilo Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Zajemanje ni uspelo. To se lahko zgodi če poskušate(new line) zajemati iz neveljavne naprave. Prosim preverite(new line) nastavitve zajemalnika v meniju za nastavitve. You have to define an image grabber to use. This can be set in the preferences menu. Definirati morate napravo za zajemanje.(new line) To lahko storite v nastavitvenem meniju. Pre poll command does not exists You do not have the given grabber installed on your system No video device selected in the preferences menu. HelpWindow &New Window &Novo okno &Open File &Odpri datoteko &Print &Natisni &Close &Zapri &Backward &Nazaj &Forward &Naprej &Home &Domov Add Bookmark Dodaj med zaznamke &File &Datoteka &Go &Pojdi History Zgodovina Bookmarks Zaznamki Backward Nazaj Forward Naprej Home Domov ImportTab <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> </p> <p>Spodaj lahko nastavite kateri program/proces naj stopmotion uporabi za zajemanje slik in prikaz videa<br> <br> </p> Active Aktivno Name Ime Description Opis &Add &Dodaj &Remove &Odstrani &Edit &Uredi Import device settings Nastavitve uvozne naprave Pre-poll command Ukaz za zajemanje Start daemon Začni daemon Stop daemon Ustavi daemon Below you can set which program/process Stopmotion should use for grabbing images from the selected device. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. LanguageHandler English Angleško English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Slovensko &Translation MainWindow Stopmotion Help Browser Backward Nazaj Forward Naprej Close MainWindowGUI Ready to rumble ;-) Pripravjen na špas ;-) &New &Novo &Open &Odpri &Save &Shrani Save &As Shrani &kot Video Video Cinelerra Cinelerra &Quit &Izhod &Undo &Razveljavi Re&do &Uveljavi Cu&t &Izreži &Copy &Kopiraj &Paste &Prilepi &Go to frame &Pojdi na sličico &Configure Stopmotion &Nastavi Stopmotion What's &This Kaj &je &to &Help &Pomoč &About &O Frame number: 0 Številka sličice: 0 Go to frame: Pojdi na sličico: &File &Datoteka Open &Recent Odpri &Nedavno &Export &Izvozi &Edit &Uredi &Settings &Nastavitve &Languages &Jeziki <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Novo</h4> <p>Ustvari <em>nov</em> projekt.</p> New project Nov projekt <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Odpri</h4> <p><em>Odpre</em> obstoječi Stopmotion projekt.</p> Open project Odpri projekt <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Shrani</h4> <p><em>Shrani</em> trenutno izbrano animacijo kot Stopmotion projekt. <BR>Če je bil ta projekt že prej shranjen bo avtomatsko shranjen v prejšnjo datoteko.</p> Save project Shrani projekt <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Shrani kot</h4> <p><em>Shrani</em> .</p>trenutno izbrano animacijo kot Stopmotion projekt.</p> Save project As Shrani projekt kot <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Izvozi trenutno izbrani projekt kot <em>video</em>.</p>Pri tem vas bo vodil čarovnik. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Izvozi trenutno izbrano animacijo kot <em>Cinerella</em> projekt.</p>Pri tem vas bo vodil čarovnik. <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Izhod</h4> <p><em>Zapre</em> program.</p> Quit Izhod <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Razveljavi</h4> <p><em>Razveljavi</em> vaše zadnje dejanje. Z večkratnim pritiskanjem razveljavite razveljavite več prejšnjih dejanj.</p> Undo Razveljavi <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Uveljavi</h4> <p><em>Uveljavi</em> razveljavljeno dejanje. Z večkratnim pritiskanjem uveljavite več razveljavljenih dejanj.</p> Redo Uveljavi <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Izreži</h4> <p><em>Izreže</em> izbrane sličice iz animacije in jih doda v odlagališče da jih lahko prilepite drugam.</p> Cut Izreži <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopiraj</h4> <p><em>Skopira</em> izbrane sličice iz animacije in jih doda v odlagališče da jih lahko prilepite drugam.</p> Copy Kopiraj <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Prilepi</h4> <p><em>Prilepi</em> sličice, ki so trenutno v odladališču v izbrano mesto.</p> <p>Lahko kopirate ali izrežete sličice iz drugih programov in jih z uporabo tega ukaza prilepite v trenutno izbrano animacijo.</p> Paste Prilepi <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Pojdi na sličico</h4> <p>Spodaj se bo odprl se bo popup-meni kamor boste vpisali sličico na katero želite skočiti.</p> Go to frame Pojdi na sličico <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Nastavi Stopmotion</h4> <p>Odplo se vam bo okno v katerem lahko <em>nastavite</em> Stopmotion z različnimi vhodnimi in izhodnimi napravami.</p> Configure Stopmotion <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Kaj je to</h4> <p>S tem omogočite KajJeTo kurzor, ki vam lahko izda kak koristen nasvet kot na primer tale.</p> What's This Kaj je to <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Pomoč</h4> <p>S tem gumbom lahko pridete do priročnika za Stopmotion</p> Help Pomoč <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>O</h4> <p>Odpre novo okno, kjer si lahko preberete splošne podatke in imena razvijalcev tega enkratnega programa.</p> About O <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Številka sličice</h4><p>Tu lahko vidite na kateri sličici se trenutno nahajate.</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Ogledno okno</h4><p> Tu si lahko ogledate izbrano sličico. V tem oknu lahko tudi predvajate animacije s pritiskom na gumb <b>Predvajaj</b>.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Pojdi na sličico</h4> <p>Tu lahko dolocite številko sličice na katero naj program preskoči</p>(sp) <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Nastavitve sličice</h4> <p>V tem meniju lahko spreminjate nastavitve za izbrano sličico/sličice, kot so <b>podnapisi</b>, <b>zvočni efekti</b>, itd.</p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Orodni meni</h4> <p>To je meni kjer je lociranih večino gumbov in funkcij, ki jih potrebujete pri delu s stop motion animacijami.</p> <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Sličična letev</h4> <p>Tu lahko vidite sličice in scene v projektu in z njihovim razporejanjem lahko naredite animacijo.</p><p>Lahko preklapljate med prejšnjimi in sledečimi sličicami s pritiskanjem na <b>puščične tipke</b> ali <b>x</b> in <b>z</b>tipke.</p>(sp) Unsaved changes Neshranjene spremembe There are unsaved changes. Do you want to save? Vse spremembe niso bile shranjene. Jih želite shraniti? &Yes &Da &No &Ne Save File Shrani datoteko Warning Opozorilo Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Ne najdem nobenega registriranega kodirnika za(new line) izvoz videa. To lahko nastavite v nastavitvenem(new line) meniju. Izvoz videa ne bo mogoč dokrer ne nastavite(new line) kateri kodirnik naj se uporablja. Ga želite nastaviti sedaj? Export to video file Izvozi kot video datoteko The registered encoder is not valid. Do you want to check your settings in the preferences menu? Registrirani kodirnik ni veljaven. Ali želite(new line) preveriti vaše nastavitve v nastavitvenem meniju? Export to file Izvozi kot datoteko <p>This is the stopmotion application for creating stopmotion animations.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p>To je program stopmotion namenjen ustvarjanju stopmotion animacij.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> <p><b>Glavna razvijalca</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> A&uthors &Avtorji <p><b>Coordinating</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br></p> <p><b>Koordinacija</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testiranje</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Prevodi</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br>Gorazd Bizjak and Matej Lavrenčič&lt;info@zapstudio.net&gt; (Slovenian)<br></p> &Thanks To &Zahvale gredo &Licence Agreement &Licenčna pogodba Stopmotion User Manual Stopmotion uporabniški priročnik Frame number: Choose project file Save As ModelHandler Choose frames to add Izberi sličice, ki naj se dodajo Removed the selected frame Odstrani izbrane sličice Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import Video &Uvoz Video &Export Video &Izvoz Apply Close Preferences Menu Video &Device QtFrontend Cancel Prekliči Progress Napredek Warning Opozorilo Fatal Usodno A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Novejša inačica nastavitvene datoteke z malo več defoltnih nastavitev(new line) je izšla. Bi jo radi uporabljali? (Vaše stare nastavitve(new line) bodo shranjene v ~/.stopmotion/preferences.xml.OLD) vgrabbj VGA singleshot vgrabbj VGA z enim posnetkom The simplest setting. Fairly slow Najbolj preprosta nastavitev. Deluje počasi vgrabbj VGA daemon vgrabbj VGA prikriti proces Starts vgrabbj as a daemon. Pretty fast. Zažene vgrabbj kot prikriti proces. Deluje hitro. Exports from jpeg images to mpeg1 video Izvozi iz jpeg slik v mpeg1 video Exports from jpeg images to mpeg2 video Izvozi iz jpeg slik v mpeg2 video Exports from jpeg images to mpeg4 video Izvozi iz jpeg slik v mpeg4 video Question Vprašanje &Yes &Da &No &Ne dvgrab Grabbing from DV-cam. (EXPERIMENTAL) videodog singleshot Videodog. Grabbing from DV-cam. RunAnimationHandler Running animation Animacija v teku SoundHandler Sounds (*.ogg) Zvoki (*.ogg) Sound name Ime zvoka Enter the name of the sound: Vpiši ime zvoka: Choose sound file ToolsMenu FPS chooser Izberi FPS Number of images: Število slik: Mix Zmešaj Diff Razlika Playback Predvajaj <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Dodaj Sličice (CTRL+F)</h4> <p>Pritisni na ta gumb da <em>dodaš</em> sličice tej animaciji.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Zbriši izbrano (Delete)</h4> <p>Pritisnite na ta gumb če želite <em>zbrisati</em> izbrane sličice iz te animacije.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Nova Scena (CTRL+E)</h4> <p>Pritisnite ta gumb, če želite <em>ustvariti</em> novo <em>sceno</em> v tej animaciji.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Odstrani sceno (SHIFT+Delete)</h4> <p>Pritisnite na ta gumb da <em>odstranite</em> izbrane scene iz te animation.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Preklopi kamero vklop/izklop (C)</h4> <p>Pritisnite na ta gumb da bi vklopili ali izklopili kamero</p>(sp) <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Zajemi sličico (Space)</h4> <p>Pritisnite sem za <em>zajemanje</em> iz kamere v animacijo</p> <p> To lahko storite tudi s priniskom na <b>preslednico</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Število slik</h4> <p>S spreminjanjem te vrednosti določite koliko slik nazaj v animaciji naj bo vidnih preko slike iz kamere in če ste v predvajalnem načinu; koliko sličic naj se predvaja. </p> <p>Z gledanjem prejšnjih slik preko slike iz kamere lažje vidite kakšna bo naslednja sličica v odnosu na prejšnjo in s tem naredite gibanje v animaciji bolj gladko.</p> <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>izbiralec hitrosti predvajanja</h4> <p>S spreminjanjem te vrednosti lahko določite hitrost predvajanja v <b>Predvajalnem oknu</b>.</p> <p>Za predvajanje animacije pritisnite gumb <b>Predvajaj animacijo</b>.</p> <h4>Play animation (K, P)</h4> <h4>Predvajaj animacijo (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Ustavi animacijo (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Prejšnja sličica (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Naslednja sličica (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Prejšnja scena (I)</h4> <h4>Next scene (O)</h4> <h4>Naslednja scena (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Obvestilo Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Prodvajanje trenutno deluje le ko je (new line) as a daemon. Go to the preferences menu (CTRL+P) to switch (new line) to running the image grabbing as a daemon. Auto Pr sec Pr min Pr hr <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_sv.ts000066400000000000000000002222151234321124500217470ustar00rootroot00000000000000 AboutDialog This is the Stopmotion application for creating stop motion animations. Detta är programmet Stopmotion som du kan använda för att skapa stopmotion-animeringar. &About &Om Main developers Huvudutvecklare A&uthors Upphovsm&än Translation Översättning Czech Tjeckiska Slovenian Slovenska French Franska Logo Logotyp Coordinating Koordinering Testing Testning &Thanks To &Tack till &Licence Agreement &Licensvillkor OK OK About Om German Tyska Portuguese Portugisiska Spanish Spanska Swedish Svenska Contributors Bidragsgivare DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Nedan kan du ställa in vilken enhet som Stopmotion ska använda för att fånga bilder och visa video. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Du kan välja från de automatiskt detekterade enheterna nedan eller lägga till enheter själv. Det rekommenderas inte att använda enheter som inte är automatiskt detekterade men gör det gärna om du är en erfaren användare. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Den valda enheten är känd som <b>$VIDEODEVICE</b> under Video-import. Name Namn Description Beskrivning &Add &Lägg till &Remove &Ta bort &Edit &Redigera Video device settings Inställningar för videoenhet Video Device ($VIDEODEVICE): Videoenhet ($VIDEODEVICE): device enhet ExportTab Active Aktivera Name Namn Description Beskrivning &Add &Lägg till &Remove &Ta bort &Edit &Redigera Encoder settings Kodarinställningar Do you want to be asked for an output file everytime you choose to export? Vill du bli frågad om ett filnamn varje gång du väljer att exportera? Yes Ja No Nej Set default output file: Välj standardfilnamn: Browse Bläddra Start encoder: Starta kodare: Stop encoder: Stoppa kodare: Choose output file Välj filnamn <p>Below you can set which program/process stopmotion should use for encoding the currently active project to a video file.</p><p>You can use $IMAGEPATH to represent the image path (absolute path to the directory where the images can be found). You should always use <b>$VIDEOFILE</b> to represent the output file (the videofile generated by the encoder) in the <b>command line</b>. This is independent of how you decides to select it (select it for each export or have a default file).<br></p><p> Example with mencoder (converting jpg to mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> <p>Nedan kan du ställa in vilket program stopmotion bör använda för att koda det aktuella projektet till en videofil.</p><p>Du kan använda $IMAGEPATH för att bestämma bildsökvägen (den absoluta sökvägen till mappen där bilderna kan hittas). Du bör alltid använda <b>$VIDEOFILE</b> för att bestämma destinationsfilen (videofilen som genererats av kodaren) i <b>kommand prompten</b>. Detta är oberoende av hur du bestämmer dig för att välja det (välja det för varje export eller att ha en standardfil).<br></p><p> Exempel med mencoder (konvertera jpg till mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Nedan kan du ställa in vilket program/process som Stopmotion ska använda för att koda det aktiva projektet till en videofil. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Du bör alltid använda <b>$IMAGEPATH</b> och <b>$VIDEOFILE</b> för att representera bildsökvägen och videofilen, respektive. Example with mencoder (jpeg images to mpeg4 video): Exempel med mencoder (jpeg-bilder till mpeg4-video): ExternalCommand Input to program: Indata för program: Submit Skicka Close Stäng Output from external command Utdata från externt kommando Result Resultat Failed! Misslyckades! Successfull! Lyckades! FileDialog Go to home directory Gå till hem mappen Form Form Formulär FrameBar Frame number: Bildrutenummer: FramePreferencesMenu Add &sound Lägg till &ljud &Remove Sound &Ta bort ljud Change name Byt namn Sounds: Ljud: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Lägg till ljud</h4><p>Med den här knappen kan du <em>lägga till ljud</em> till den valda bildrutan.</p><p>Ljudet kommer börja spelas när den här bildrutan visas och spelas till den är slut.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Ta bort ljud</h4><p>Med den här knappen kan du <em>ta bort</em>det valda ljudet från bildrutan.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>Byt namn</h4><p>Med den här knappen kan du byta namnet på det valda ljudet.<BR>Namnet på ljudet har ingen annan effekt än att göra det lättare att jobba med animationen.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Ljud</h4> <p>Den här listan visar alla ljud med kopplingar till den här bildrutan.</p><p>Ljuden kommer att börja spelas när den här bildrutan visas och spelas tills de är färdiga.</p> FrameView Warning Varning Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Fångst misslyckades. Detta kan hända om du försöker hämta från en ogiltig enhet. Kontrollera dina fångstinställningar i inställningsmenyn. You have to define an image grabber to use. This can be set in the preferences menu. Du måste definiera en bildfångare att använda. Detta kan ställas in i inställningsmenyn. No video device selected in the preferences menu. Ingen videoenhet har valts i inställningsmenyn. Pre poll command does not exists Pre poll-kommandot finns inte You do not have the given grabber installed on your system Du har inte den angivna fångaren installerad på ditt system HelpWindow &New Window &Nytt Fönster &Open File &Öppna Fil &Print &Skriv ut &Close &Stäng &Backward &Bakåt &Forward &Framåt &Home &Hem Add Bookmark Lägg till bokmärke &File &Fil &Go &Gå History Historia Bookmarks Bokmärken Backward Bakåt Forward Framåt Home Hem ImportTab <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> </p> <p>Nedan kan du välja vilket program/process stopmotion ska använda för att hämta bilder från webkameran och visa videon.<br><br></p> Active Aktiv Name Namn Description Beskrivning &Add &Lägg till &Remove &Ta bort &Edit &Redigera Import device settings Importera enhetsinställningar Pre-poll command Pre poll-kommando Start deamon Starta bakgrundsprocess Stop deamon Stoppa bakgrundsprocess Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Nedan kan du ställa in vilket program/process som Stopmotion ska använda för att fånga bilder från vald enhet. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Du bör alltid använda <b>$VIDEODEVICE</b> och <b>$IMAGEFILE</b> för att representera videoenheten och bildfilen, respektive. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Svenska English Engelska &Translation &Översättning MainWindow Stopmotion Help Browser Hjälpvisare för Stopmotion Backward Bakåt Forward Framåt Close Stäng MainWindowGUI Ready to rumble ;-) Redo att köra igång ;-) &New &Ny &Open &Öppna <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Öppna</h4><p><em>Öppnar</em> en projektfil för Stopmotion.</p> &Save &Spara Save &As Spara so&m &Quit &Avsluta <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Avsluta</h4><p><em>Avslutar</em> programmet.</p> &File &Arkiv &Undo &Ångra <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Ångra</h4><p><em>Ångrar</em> din senaste handling. Du kan trycka på ångraknappen flera gånger för att ångra tidigare handlingar.</p> Re&do &Gör om <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Gör om</h4> <p><em>Gör om</em> din senaste handling. Du kan trycka på göromknappen flera gånger Cu&t &Klipp ut <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Klipp ut</h4> <p><em>Klipper ut</em> de valda bildrutorna ur animationen och lägger till dem till klippbordet så att du kan klistra in dem någon annanstans.</p> &Copy K&opiera <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopiera</h4> <p><em>Kopierar</em> de valda bildrutorna till klippbordet. Du kan sedan klistra in dem någon annanstans.</p> &Paste K&listra in <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Klistra in</h4> <p><em>Klistra in</em> bildrutorna i klippbordet i den valda positionen.</p> <p>Du kan kopiera/klippa bilder från andra program och sedan använda det här valet för att klistra in den i den här animationen.</p> &Go to frame &Hoppa till bildruta <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Hoppa till bildruta</h4> <p>Det här kommer öppna en popupmeny på botten av skärmen där du kan välja en bildruta du vill <em>hoppa till</em>.</p> &Edit &Redigera &Languages &Språk &Settings &Inställningar What's &This &Vad är det här <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Vad är det här</h4> <p>Detta kommer ge dig en Vadärdethär muspekare som kan användas till att visa hjälpsam information som det här.</p> &About &Om <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Om</h4> <p>Den här kommer visa en liten informationsruta där du kan läsa generell information såväl som namnen på utvecklarna bakom det här utmärkta programmet.</p> &Help H&jälp <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>Bildrutsfältet</h4> <p>I det här fältet kan du se bildrutorna och scenerna i animationen och bygga animationen genom att flytta runt dem.</p><p>Du kan byta till nästa och förra bildruta genom att använda <b>piltangenterna</b> eller <b>x</b> och <b></b></p> <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Verktygsmenyn</h4> <p>Det här är verktygsmenyn, här finns de flesta knappar och verktyg du kommer behöva när du arbetar med animationer.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>BIldrutornas inställningsmeny</h4> <p>I den här menyn kan du ställa in inställningarna för de valda bildrutorna, t.ex. <b>undertexter</b>, <b>ljudeffekter</b>, etc.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Gå till bildrutamenyn</h4> <p>Här kan du skriva in ett bildrutenummer och programmet kommer att hoppa till den valda bildrutan</p> Go to frame: Gå till bildruta: Frame number: 0 Bildruta nummer: 0 <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Bildruta nummer</h4><p>Här visas den valda bildrutans nummer</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Bildrutevy</h4><p> Här kan du se den valda bildrutan. Du kan också spela upp animationen i det här fönstret genom att trycka på <b>Spela</b> knappen.</p> Unsaved changes Osparade ändringar There are unsaved changes. Do you want to save? Det finns osparade ändringar. Vill du spara? &Yes &Ja &No &Nej Save File Spara Fil <p>This is the stopmotion application for creating stopmotion animations.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p>Det här är animationsprogrammet för att skapa animationer.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> A&uthors &Utvecklare &Thanks To &Tack till &Licence Agreement &Licensbestämmelser Video VIdeo &Export &Exportera <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Ny</h> <p>Skapar ett <em>nytt</em> projekt.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automaticly be saved to the previously selected file.</p> <h4>Spara</h4> <p><em>Sparar</em>animationen som Stopmotionprojektfil. <BR>Om det här projektet har sparats förut kommer det automatiskt sparas till den tidigare valda filen.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Spara som</h4> <p><em>Sparar</em> den valda animationen som Stopmotionprojektfil.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Exporterar det aktuella projektet som <em>video</em>.</p>Du kommer att få en guide till hjälp. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Exporterar den aktuella animationen som </em>Cinerella</em> projekt.</p>Du kommer att få en guide som hjälp. Cinelerra Cinelerra &Configure Stopmotion &Konfigurera Stopmotion Open &Recent Öppna &tidigare New project Nytt projekt Open project Öppna projekt Save project Spara projekt Save project As Spara projekt som Quit Avsluta Undo Ångra Redo Gör om Cut Klipp ut Copy Kopiera Paste Klistra in Go to frame Gå till bildruta <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Konfigurera Stopmotion</h4> <p>Öppnar ett fönster där du kan <em>konfigurera</em> Stopmotion med olika in- och utgångsenheter.</p> Configure Stopmotion Konfigurera Stopmotion What's This Vad är det här About Om Warning Varning Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Kan inte hitta någon registrerad kodare för att exportera video. Detta kan ställas ni i inställningar menyn. Det kommer inte att gå att exportera till video förräns du ställt in vilken kodare du vill använda. Vill du ställa in det nu? Export to video file Exportera till videofil The registered encoder is not valid. Do you want to check your settings in the preferences menu? Den registrerade kodaren fungerar inte. Vill du kontrollera inställningarna i inställngsmenyn? Export to file Exportera till fil <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Hjälp</h4> <p>Den här knappen visar ruta med Stopmotions bruksanvisning</p> Help Hjälp <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> <p><b>Utvecklare</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> Stopmotion User Manual Stopmotion Användar Manual <p><b>Coordinating</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br></p> <p><b>Koordninering</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br></p> Frame number: Bildrutenummer: Choose project file Välj projektfil Save As Spara som ModelHandler Choose frames to add Välj bildrutor att lägga till Removed the selected frame Tog bort de valda bildrutorna Warning Varning You do not have Gimp installed on your system Du har inte Gimp installerat på ditt system There is no active frame to open Det finns ingen aktiv bildruta att öppna The active frame is corrupt Den aktiva bildrutan är skadad Failed to start Gimp! Misslyckades med att starta Gimp! PreferencesMenu Video &Import Video&import Video &Export Video&export Apply Verkställ Close Stäng Preferences Menu Inställningsmeny Video &Device Videoen&het QtFrontend Warning Varning Fatal Ödesdigert Cancel Avbryt Progress Process vgrabbj VGA singleshot vgrabbj VGA-enkelbild vgrabbj VGA deamon vgrabbj VGA-damon Starts vgrabbj as a deamon. Pretty fast. Startar vgrabbj som bakgrundsprocess. Ganska snabb. Question Fråga &Yes &Ja &No &Nej The simplest setting. Fairly slow Den enklaste inställningen. Relativt långsam Exports from jpeg images to mpeg1 video Exporterar från jpeg-bilder till mpeg1-video A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) En nyare version av inställningsfilen med ett par fler standardvärden finns. Vill du använda den? (Dina gamla inställningar kommer sparas i ~/.stopmotion/preferences.xml.OLD) Exports from jpeg images to mpeg2 video Exporterar från jpeg-bilder till mpeg2-video Exports from jpeg images to mpeg4 video Exporterar från jpeg-bilder till mpeg4-video dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) Fågnar från DV-kamera. (EXPERIMENTIELL) videodog singleshot videodog-enkelbild Videodog. Videodog. Grabbing from DV-cam. Fångar från DV-kamera. RunAnimationHandler Running animation Spelande animation SoundHandler Sounds (*.ogg) Ljud (*.ogg) Sound name Ljudnamn Enter the name of the sound: Skriv in namnet på ljudet: Choose sound file Välj ljudfil ToolsMenu FPS chooser Välj bilder/s <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>Välj bilder/s</h4> <p>Genom att ändra värdet här väljer du vilken fart animationen i <b>bildrutevyn</b> kommer att spelas upp i.</p> <p>För att starta animationen klicka på knappen <b>Spela animation</b>.</p> Number of images: Antal bilder: Mix Mix Diff Diff Playback Spela upp <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Lägg till bildrutor (CTRL+F)</h4> <p>Klicka på den här knappen för att <em>lägga till</em> bildrutor till animationen.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Ta bort markering (Delete)</h4> <p>Klicka på den här knappen för att <em>ta bort</em> de valda bildrutorna från animationen.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Ny scen (CTRL+E)</h4> <p>Klicka på den här knappen för att <em>skapa</em> en ny <em>scen</em> i animationen.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Ta bort scen (SHIFT+Delete)</h4> <p>Klicka på den här knappen för att <em>ta bort</em> den valda scenen från animationen.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Slå av/på kameran (C)</h4> <p>Klicka på den här knappen för att slå av och på kameran</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Fånga bildruta (blanksteg)</h4> <p>Klicka på den här knappen för att <em>fånga</em> en bildruta från kameran och lägga till den till animationen</p> <p> Du kan även trycka på <b>blanksteg</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Antal bilder</h4> <p>Genom att ändra värdet i den här barometern kan du specificera hur många bilder bakåt i animationen som ska mixas med kameran eller om du är i uppspelningsläge: hur många bilder som ska spelas.</p> <p>Genom att mixa tidigare bilder med kameran kan du enklare se hur nästa bild kommer att bli i relation till de andra, därmed skapa en finare animation!</p> <h4>Play animation (K, P)</h4> <h4>Spela animation (K,P)</h4> <h4>Stop animation (K, P)</h4> <h4>Stoppa animation (K,P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Föregående bildruta (J, Vänsterpil)</h4> <h4>Next frame (L, Right)</h4> <h4>Nästa bildruta (L, Högerpil)</h4> <h4>Previous scene (I)</h4> <h4>Föregående scen (I)</h4> <h4>Next scene (O)</h4> <h4>Nästa scen (0)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>Loopa animation (CTRL+L)</h4> <p>Med denna kanpp kan du ställa in om du vill att animationen ska spelas till slutet eller loopas i oändlighet.</p> Notice Observera Playback only currently works when running the grabber as a deamon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a deamon. Uppspelning fungerar för tillfället bara när hämtaren körs som bakgrundsprocess. Gå till inställningsmenyn (CTRL+P) för att byta till att köra bildhämtningen som bakgrundsprocess. Auto Auto Pr sec Per sec Pr min Per min Pr hr Per timme <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> <h4>Starta Gimp</h4> <p>Klicka på denna knapp för att öppna den aktiva bildrutan i Gimp</p> <p>Observera att du även kan dra bilder från bildruteraden och släppa dem på Gimp</p> stopmotion-0.8.0/translations/stopmotion_tr.ts000066400000000000000000001757661234321124500217660ustar00rootroot00000000000000 AboutDialog &About H&akkında Main developers Sorumlu geliştiriciler A&uthors &Yazarlar Translation Çeviri Czech Çekçe Slovenian Slovence French Fransızca Logo Logo Coordinating Koordinasyon Testing Testçiler &Thanks To &Teşekkürler &Licence Agreement &Lisans OK Tamam About Hakkında This is the Stopmotion application for creating stop motion animations. Stopmotion uygulaması stop motion (durdurma tekniği) ile animasyon yapmakta kullanılır. German Almanca Portuguese Portekizce Spanish İspanyolca Swedish İsveççe Contributors DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. Aşağıda Stopmotion için görüntü yakalama ve video oynatma araçlarını seçebilirsiniz. You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. Aşağıda bulunmuş aygıtlardan seçebilir ya da kendiniz yeni ekleyebilirsiniz. Deneyimli değilseniz sistem tarafından bulunmamış bir aygıt kullanmaMAnız önerilir, ama seçim sizin. The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. Seçilen aygıt Video İçeri Aktar bölümünde <b>$VIDEODEVICE</b> olarak görülüyor. Name İsim Description Tanım &Add &Ekle &Remove Çı&kar &Edit &Düzenle Video device settings Video aygıt ayarları Video Device ($VIDEODEVICE): Video Aygıt ($VIDEODEVICE):(sp) device aygıt ExportTab Name İsim Description Tanım &Add &Ekle &Remove Çı&kar &Edit &Düzenle Encoder settings Kodlayıcı ayarları Do you want to be asked for an output file everytime you choose to export? Dışarı aktar seçeneğini her kullanışınızda hangi dosyaya yazacağınızın sorulmasını ister misiniz? Yes Evet No Hayır Set default output file: Öntanımlı çıktı dosyası: Browse Tara Start encoder: Kodlamaya başla: Stop encoder: Kodlamayı durdur: Choose output file Çıktı dosyasını seç Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. Aşağıda şu an çalıştığınız projenin video olarak kaydedilmesi için hangi programın kullanılmasını istediğinizi belirleyebilirsiniz. You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. Resimlerin yeri ve video dosyası için her zaman bir <b>$IMAGEPATH</b> ve <b>$VIDEOFILE</b> belirlemelisiniz. Example with mencoder (jpeg images to mpeg4 video): mencoder için örnek (jpeg images to mpeg4 video): ExternalCommand Input to program: Programa girdi: Submit Gönder Close Kapat Output from external command Çalıştırılan komutun çıktısı Result Sonuç Failed! Olmadı! Successfull! Tamamdır! Form Form Form FrameBar Frame number: Kare sayısı:(sp) FramePreferencesMenu Add &sound &Ses ekle &Remove Sound S&esi kaldır Change name İsmi değiştir Sounds: Sesler: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>Ses ekle</h4> <p>Bu düğme ile seçili kare için<em>ses ekleyebilirsiniz</em>.</p> <p>Kare göründüğünde çalmaya başlayacaktır.</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>Sesi çıkar</h4> <p>Bu düğme ile seçili karede çalan <em>sesi kapatırsınız</em>.</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>İsmi değiştir</h4> <p>Bu düğmeyle seçili ses dosyasının ismini değiştirebilirsiniz. <BR>Sizin çalışırken dosyaları ayırt etmeniz dışında bir önemi yoktur.</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>Sesler</h4> <p>Bu liste kareye bağlı tüm sesleri gösterir.</p><p>Sesler, karenin görünmesiyle birlikte sonuna dek çalar.</p> FrameView Warning Dikkat Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. Yakalama başarısız. Bu durum, çalışmayan bir aygıttan görüntü yakalamayı denediyseniz olmuş olabilir. Seçenekler menüsünü kontrol edin. You have to define an image grabber to use. This can be set in the preferences menu. Görüntü yakalama aygıtı belirlemelisiniz. Seçenekler menüsünden yapabilirsiniz. Pre poll command does not exists You do not have the given grabber installed on your system Seçilen yakalama aygıtı sistemde bulunamıyor. No video device selected in the preferences menu. Seçenekler menüsünde video aygıtı belirlenmemiş. ImportTab Name İsim Description Tanım &Add &Ekle &Remove &Kaldır &Edit &Düzenle Import device settings Aygıt ayarlarını içeri aktar Pre-poll command Start daemon Servisi başlat Stop daemon Servisi durdur Below you can set which program/process Stopmotion should use for grabbing images from the selected device. Seçilen aygıttan görüntü aktarmak için kullanılacak programı aşağıdan seçebilirsiniz. You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. Resim dosyaları ve video aygıtı için her zaman bir <b>$IMAGEFILE</b> ve <b>$VIDEODEVICE</b> belirlemelisiniz. LanguageHandler English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) Türkçe English Turkish &Translation Çe&viri MainWindow Stopmotion Help Browser Stopmotion Yardım Dosyaları Backward Geri Forward İleri Close Kapat MainWindowGUI Ready to rumble ;-) Seyreyle gümbürtüyü ;-) &New &Yeni &Open &Aç <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>Aç</h4> <p>Bir Stopmotion proje dosyasını <em>açar</em>.</p> &Save Kay&det Save &As &Farklı kaydet &Quit Çı&kış <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>Çıkış</h4><p> Programı <em>kapatır</em>.</p> &File &Dosya &Undo &Geri al <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>Geri al</h4> <p>En son yaptığınız hareketi <em>geri alır</em>. Daha önceki bir pozisyona dönmek için bir çok kere basabilirsiniz.</p> Re&do &Yenile <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>Yenile</h4> <p>Son yaptığınız hareketi <em> tekrar eder</em>. Hareketi tekrarlamak için bir çok kere basabilirsiniz.</p> Cu&t Ke&s <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>Kes</h4> <p>Seçili kareleri animasyondan <em>keser</em> ve panoda saklar böylece bir başka projeye yapıştırabilirsiniz.</p> &Copy &Kopyala <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>Kopyala</h4> <p>Seçilen kareleri panoya <em>kopyalar</em>. Böylece başka projelerde de kullanabilirsiniz.</p> &Paste &Yapıştır <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>Yapıştır</h4> <p>Panoda bulunan kareleri, seçili kareye <em>yapıştırır</em>. </p><p>Resimleri kes/kopyala yöntemiyle başka programlardan panoya atıp, bu komutla animasyona ekleyebilirsiniz.</p> &Go to frame &Ka&reye git <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>Kareye git</h4> <p>Bir pencere açarak gitmek istediğiniz kare numarasını sorar.</p> &Edit Dü&zenle &Settings &Seçenekler What's &This &Bu nedir <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>Bu nedir?</h4> <p>Size soru işareti şeklinde bir imleç vererek bu metin gibi ufak açıklamalar için tıklamanızı sağlar.</p> &About &Hakkında <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>Hakkında</h4> Bu programı yaratan ekip hakkında bilgi ve programa ilişkin ayrıntıları okumanızı sağlayan bir bilgi ekranıdır. &Help &Yardım <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>ÇerçeveAlanı</h4> <p>Bu alanda, animasyondaki kare ve sahneleri görerek, yerlerini değiştirerek kurgu yapma imkanı bulursunuz.</p><p> Önceki ya da sonraki kareye <b>yön tuşları</b> ya da <b>x</b> ve <b>z</b> ile geçebilirsiniz.</p>(sp) <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>Araç menüsü</h4> <p>Bu menü animasyon yaparken ihtiyaç duyacağını çoğu düğme ve aracı bulabileceğiniz alandır.</p> <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>Kare seçenekleri menüsü</h4> <p>Bu menüde seçili kare/lerin <b>altyazı</b>, <b> ses efektleri</b> gibi özelliklerini düzenleyebilirsiniz.</p> <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>Kareye git menüsü</h4> <p>sıra numarası ile kare seçmenizi sağlar.</p> Go to frame: Kareye git: <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>Kare sırası</h4><p>Bu alanda seçili karenin sıra numarasını görebilirsiniz.</p> <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>Kare izleme</h4><p> Bu alanda seçili kareyi görebilirsiniz. Aynı zamanda <b>Başlat</b> düğmesiyle oynatabilirsiniz.</p> Unsaved changes Kaydedilmeyen değişiklikler There are unsaved changes. Do you want to save? Kaydedilmemiş değişiklikler var, kaydetmek ister misiniz? &Yes &Evet &No &Hayır Video Video &Export &Dışarı aktar <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>Yeni</h4> <p><em>Yeni</em> bir proje açar.</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automatically be saved to the previously selected file.</p> <h4>Kaydet</h4> <p>Animasyonu Stopmotion dosyası olarak kaydeder. Daha önce kaydedilmişse, önceki dosyanın üzerine yazar.</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>Farklı kaydet</h4> <p>Animasyonu yeni bir isimle Stopmotion projesi olarak kaydeder.</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>Video</h4> <p>Bir sihirbaz yardımıyla, aktif projeyi <em>video</em> olarak dışarı aktarır. <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4> <p>Çalışılan projeyi <em>Cinerella</em> projesi olarak kaydetmek için bir sihirbaz açar. Cinelerra Cinelerra &Configure Stopmotion Stopmotion &yapılandırma Open &Recent Son &açılanlar New project Yeni proje Open project Proje aç Save project Projeyi kaydet Save project As Projeyi farklı kaydet Quit Çıkış Undo Geri al Redo Tekrar et Cut Kes Copy Kopyala Paste Yapıştır Go to frame Kareye git <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>Stopmotion yapılandırma</h4> <p>Stopmotion için yakalama/aktarma aygıtlarını ve programlarını seçebileceğiniz bir <em>yapılandırma</em> penceresi açar.</p> Configure Stopmotion Stopmotion Yapılandır What's This Nedir? About Hakkında Warning Uyarı Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? Dışarı video aktarmak için seçili kodlayıcı bulunamadı. Seçenekler bölümünde bu konuda bir bilgi girilene kadar video aktarma yapılması mümkün olmayacak. Şimdi belirlemek ister misiniz? Export to video file Video dosyasına aktar The registered encoder is not valid. Do you want to check your settings in the preferences menu? Seçili kodlayıcı geçersiz. Seçenekler menüsünü kontrol etmek ister misiniz? Export to file Dosyaya aktar <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>Yardım</h4> <p>Bu düğme size Stopmotion el kitabını açar</p> Help Yardım Frame number: Kare sırası: Choose project file Proje dosyasını seç Save As Farklı kaydet ModelHandler Choose frames to add Eklenecek kareleri seçin Removed the selected frame Seçili kareyi çıkar Warning You do not have Gimp installed on your system There is no active frame to open The active frame is corrupt Failed to start Gimp! PreferencesMenu Video &Import İçeri Video Akt&ar Video &Export Dışarı Video Akta&r Apply Uygula Close Kapat Preferences Menu Seçenek menüsü Video &Device Video Ay&gıtı QtFrontend Warning Dikkat Fatal Kritik Cancel İptal vgrabbj VGA singleshot vgrabbj VGA tek çekim vgrabbj VGA daemon vgrabbj VGA servis Starts vgrabbj as a daemon. Pretty fast. vgrabbj servis olarak başlat. Hız kazandırır. Question Soru The simplest setting. Fairly slow Basit yapılandırma. Oldukça yavaştır. Exports from jpeg images to mpeg1 video jpeg görüntüleri mpeg1 video dosyasına aktarır. A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) Seçenekler dosyasının ön tanımlı bir kaç yeni değeri olan yeni bir kopyası bulundu. Bunu kullanmak ister misiniz? (Eski dosya ~/.stopmotion/preferences.xml.OLD olarak korunacak.) Exports from jpeg images to mpeg2 video jpeg görüntüleri mpeg2 video dosyasına aktarır Exports from jpeg images to mpeg4 video jpeg görüntüleri mpeg4 video dosyasına aktarır dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) DV-cam'den aktarır. (Deneme aşamasında) videodog singleshot videodog tekçekim Videodog. Videodog. Grabbing from DV-cam. DV-cam'den aktarıyor. RunAnimationHandler Running animation Animasyonu oynat SoundHandler Sounds (*.ogg) Sesler (*.ogg) Sound name Ses dosyası adı Enter the name of the sound: Ses dosyas için isim belirle: Choose sound file Ses dosyasını seç ToolsMenu FPS chooser FPS (kare/saniye) seçimi <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>FPS seçimi</h4> <p>Bu değer ile, animasyonun <b>KareGöster</b> ekranında oynayacağı hızı belirliyorsunuz.</p> Animasyonu oynatmak için <b>Oynat</b> düğmesine basın.</p> Number of images: Görüntü sayısı: Mix Karıştır Diff Fark Playback Oynat <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>Kare Ekle (CTRL+F)</h4> <p>Bu düğmeyle animasyona kare <em>ekleyebilirsiniz</em>.</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>Seçimi sil (Sil/Del)</h4> Bu düğmeyle seçili kareleri animasyondan <em>çıkarırsınız</em>.</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>Yeni Sahne (CTRL+E)</h4> <p>Bu düğmeyle yeni bir <em>sahne yaratırsınız</em>.</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>Sahneyi sil (Shift + Del /Sil) </h4> <p> Seçili sahneyi animasyondan silmek için bu düğmeyi kullanabilirsiniz.</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>Kamerayı aç/kapa (C)</h4> <p>Kamerayı açıp/kapamak için bu düğmeyi kullanabilirsiniz.</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>Play animation (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>Next frame (L, Right)</h4> <h4>Previous scene (I)</h4> <h4>Next scene (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> Notice Uyarı Playback only currently works when running the grabber as a daemon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a daemon. Şu anda, oynatma özeliği sadece yakalayıcıyı servis olarak çalıştırdığınızda kullanabilirsiniz. Seçenekler menüsüne (CTRL-P) gidip görüntü yakalamayı servis olarak açabilirsiniz. Auto Otomatik Pr sec Pr sn Pr min Pr dk Pr hr Pr saat <h4>Launch Gimp</h4> <p>Click this button to open the active frame in Gimp</p> <p>Note that you can also drag images from the frame bar and drop them on Gimp</p> stopmotion-0.8.0/translations/stopmotion_zh_TW.ts000066400000000000000000001733441234321124500223620ustar00rootroot00000000000000 @default You do not have the necessary permissions to run Stopmotion. 您沒有運行 Stopmotion 所必要的權限。 AboutDialog &About 關於(&A) Main developers 主要開發人員 Contributors 貢獻人員 A&uthors 作者(&U) Translation 翻譯 Czech 捷克語 Slovenian 斯洛維尼亞語 French 法語 Logo 圖標 Coordinating 協調 Testing 測試 &Thanks To 感謝(&T) &Licence Agreement 授權合約(&L) OK 確定 About 關於 This is the Stopmotion application for creating stop motion animations. 此為用於建立定格動畫的 Stopmotion 應用程式。 German 德語 Portuguese 葡萄牙語 Spanish 西班牙語 Swedish 瑞典語 Traditional Chinese 傳統字漢語 CameraHandler Camera &off 關閉相機(&O) Camera &on 開啟相機(&O) DeviceTab Below you can set which device Stopmotion should use for grabbing images and displaying video. 以下您可以設定 Stopmotion 應該使用何項裝置去抓取圖像和顯示視訊。 You can select from the auto-detected devices below or add devices yourself. It is not recommended to use devices which is not auto-detected, but feel free to do it if you are an advanced user. 您可以從下列自動偵測的裝置選取,或是自行加入裝置。並不建議使用未被自動偵測到的裝置,但是如果您是進階使用者就儘管去做。 The selected device is recognized as <b>$VIDEODEVICE</b> under Video Import. 所選的裝置被辨識為視訊匯入之下的 <b>$VIDEODEVICE</b>。 Name 名稱 Description 描述 &Add 加入(&A) &Remove 移除(&R) &Edit 編輯(&E) Video device settings 視訊裝置設定值 Video Device ($VIDEODEVICE): 視訊裝置 ($VIDEODEVICE): Autodetected 自動偵測到 device 裝置 ExportTab Active 當前 Name 名稱 Description 描述 &Add 加入(&A) &Remove 移除(&R) &Edit 編輯(&E) Encoder settings 編碼器設定值 Do you want to be asked for an output file everytime you choose to export? 您想要每次選擇匯出時,都向您詢問輸出檔案名稱嗎? Yes No Set default output file: 設定預設輸出檔案: Browse 瀏覽 Start encoder: 啟動編碼器: Stop encoder: 停止編碼器: Choose output file 選擇輸出檔案 <p>Below you can set which program/process stopmotion should use for encoding the currently active project to a video file.</p><p>You can use $IMAGEPATH to represent the image path (absolute path to the directory where the images can be found). You should always use <b>$VIDEOFILE</b> to represent the output file (the videofile generated by the encoder) in the <b>command line</b>. This is independent of how you decides to select it (select it for each export or have a default file).<br></p><p> Example with mencoder (converting jpg to mpeg1): <br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> <p>以下您可以設定 stopmotion 應該使用何項程式/程序,將當前專案編碼為視訊檔案。</p><p>您可以使用 $IMAGEPATH 去表述圖像路徑 (可以找到圖像的目錄位置絕對路徑)。您應該固定使用<b>$VIDEOFILE</b>在<b>命令列</b>中去表述輸出檔案 (由編碼器產生的視訊檔案)。這跟您決定要如何選取它是無關的 (對於每個匯出都選取或是有預設檔案)。<br></p><p>以 mencoder 為例 (轉換 jpg 到 mpeg1):<br>mencoder mf://$IMAGEPATH/*.jpg -mf w=640:h=480:fps=12:type=jpg -ovc lavc -lavcopts vcodec=mpeg1video -oac copy -o $VIDEOFILE <br> Below you can set which program/process Stopmotion should use for encoding the currently active project to a video file. 以下您可以設定 stopmotion 應該使用何項程式/程序,將當前專案編碼為視訊檔案。 You should always use <b>$IMAGEPATH</b> and <b>$VIDEOFILE</b> to represent the image path and the video file, respectively. 您應該固定使用 <b>$IMAGEPATH</b> 和 <b>$VIDEOFILE</b> 以分別表述圖像路徑和視訊檔案。 Example with mencoder (jpeg images to mpeg4 video): 以 mencoder 為例 (jpeg 圖像轉 mpeg4 視訊): ExternalCommand Input to program: 輸入到程式: Submit 提交 Close 關閉 Output from external command 從外部命令輸出 Result 結果 Failed! 失敗! Successfull! 成功! FileDialog Go to home directory 前往個人目錄 Form Form 表單 FrameBar Frame number: 圖框編號: FramePreferencesMenu Add &sound 加入聲音(&S) &Remove Sound 移除聲音(&R) Change name 變更名稱 Sounds: 聲音: <h4>Add sound</h4> <p>With this button you can <em>add sounds</em> to the selected frame.</p> <p>The sound will begin playing when this frame is shown and play until it is done.</p> <h4>加入聲音</h4><p>利用這個按鈕您可以<em>加入聲音</em>到所選的圖框。</p><p>此圖框顯示時,聲音將開始播放直到完成。</p> <h4>Remove sound</h4> <p>With this button you can <em>remove</em> the selected sound from this frame.</p> <h4>移除聲音</h4><p>利用這個按鈕您可以從此圖框<em>移除</em>所選的聲音。</p> <h4>Change name</h4> <p>With this button you can change the name of the selected sound. <BR>The name of the sound has no other effect than making it easier work with the animation.</p> <h4>變更名稱</h4><p>利用這個按鈕您可以變更所選聲音的名稱。<BR>聲音的名稱除了讓動畫較容易製作之外,不具有其他效果。</p> <h4>Sounds</h4> <p>This lists shows all the sounds connected to this frame.</p><p>The sounds will begin playing when this frame is shown and play until they are done.</p> <h4>所有聲音</h4><p>這份清單顯示所有連接到此圖框的聲音。</p><p>此圖框顯示時,聲音將開始播放直到完成。</p> FrameView Warning 警告 Grabbing failed. This may happen if you try to grab from an invalid device. Please check your grabber settings in the preferences menu. 抓取失敗。如果您嘗試從無效的 裝置抓取,就有可能會發生。請檢查 您在偏好設定選單中的抓取器設定值。 You have to define an image grabber to use. This can be set in the preferences menu. 您必須定義想要使用的圖像抓取器。 這可以在偏好設定選單中設定。 Pre poll command does not exists 輪詢前命令不存在 You do not have the given grabber installed on your system 您沒有在系統中安裝給定的抓取器 No video device selected in the preferences menu. 在偏好設定選單中沒有所選的視訊裝置。 HelpWindow &New Window 開新視窗(&N) &Open File 開啟檔案(&O) &Print 列印(&P) &Close 關閉(&C) &Backward 後退(&B) &Forward 前進(&F) &Home 個人資料夾(&H) Add Bookmark 加入書籤 &File 檔案(&F) &Go 前往(&G) History 歷史 Bookmarks 書籤 Backward 後退 Forward 前進 Home 個人資料夾 ImportTab <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> </p> <p>以下您可以設定 stopmotion 從網路攝影機抓取圖像,以及顯示視訊所應使用的程式/程序。<br><br></p> Active 當前 Name 名稱 Description 描述 &Add 加入(&A) &Remove 移除(&R) &Edit 編輯(&E) Import device settings 匯入裝置設定值 Pre-poll command 輪詢前命令 Start deamon 開始守護程式 Stop deamon 停止守護程式 Below you can set which program/process Stopmotion should use for grabbing images from the selected device. 以下您可以設定 Stopmotion 從所選裝置抓取圖像所應使用的程式/程序。 You should always use <b>$VIDEODEVICE</b> and <b>$IMAGEFILE</b> to represent the video device and the image file, respectively. 您應該固定使用<b>$VIDEODEVICE</b> 和 <b>$IMAGEFILE</b>以分別表述視訊裝置和圖像檔案。 LanguageHandler &English 英語(&E) <h4>English</h4> <p>Select this menu options to get the <em>English</em> translation of the application.</p> <h4>英語</h4><p>選取此功能表選項以獲得應用軟體的<em>英語</em>翻譯。</p> &Norwegian 挪威語(&N) <h4>Norwegian</h4> <p>Select this menu options to get the <em>Norwegian</em> translation of the application.</p> <h4>挪威語</h4><p>選取此功能表選項以獲得應用軟體的<em>挪威語</em>翻譯。</p> English This should be translated to the name of the language you are translating to, in that language. Example: English = Deutsch (Deutsch is "German" in German) 傳統字漢語 &Translation 翻譯(&T) MainWindow Stopmotion Help Browser Stopmotion 說明瀏覽器 Backward 後退 Forward 前進 Close 關閉 MainWindowGUI Ready to rumble ;-) 蓄勢待發 ;-) &New 新增(&N) &Open 開啟(&O) &Save 儲存(&S) Save &As 另存新檔(&A) Add &Frames 加入圖框(&F) &Quit 離開(&Q) &File 檔案(&F) &Undo 復原(&U) Re&do 重做(&D) Cu&t 剪下(&T) &Copy 複製(&C) &Paste 貼上(&P) &Go to frame 前往圖框(&G) Prefere&nces 偏好設定(&N) &Edit 編輯(&E) What's &This 這是什麼(&T) &About 關於(&A) &Help 求助(&H) <h4>Frame preferences menu</h4> <p>In this menu you can set preferences for the selected frame/frames, such as <b>subtitles</b>, <b>sound effects</b>, etc.</p> <h4>圖框偏好設定選單</h4><p>在此選單中您可以設定用於所選圖框的偏好內容,像是<b>子標題</b>、<b>聲音效果</b>…等等。</p> Add sound 加入聲音 Remove Sound 移除聲音 Change name 變更名稱 Sounds: 聲音: <h4>Go to frame menu</h4> <p>Here you can specify a framenumber and the program will jump to the specified frame</p> <h4>前往圖框功能表</h4><p>在此您可以指定 framenumber 和程式將跳到指定的圖框</p> Go to frame: 前往圖框: Frame number: 0 圖框編號:0 <h4>Frame number</h4><p>This area displays the numberof the currently selected frame</p> <h4>圖框編號</h4><p>此區域顯示目前所選圖框的編號</p> Unsaved changes 未儲存的變更 There are unsaved changes. Do you want to save? 有些未儲存的變更。您要儲存嗎? &Yes 是(&Y) &No 否(&N) <p>This is the stopmotion application for creating stopmotion animations.</p><p>(c) 2005, Fredrik Berg Kjølstad and Bjørn Erik Nilsen</p> <p>此為用來建立定格動畫的 Stopmotion 應用程式。</p><p>(c) 2005, Fredrik Berg Kjølstad 和 Bjørn Erik Nilsen</p> Save File 儲存檔案 &Thanks To 感謝(&T) &Licence Agreement 授權同意書(&L) <h4>Open</h4> <p><em>Opens</em> a Stopmotion project file.</p> <h4>開啟</h4><p><em>開啟</em>一個 Stopmotion 專案檔。</p> <h4>Undo</h4> <p><em>Undoes</em> your last operation. You can press undo several time to undo earlier operations.</p> <h4>復原</h4><p><em>復原</em>您的最後一項操作。您可以按下復原多次以回到較早的操作。</p> <h4>Redo</h4> <p><em>Redoes</em> your last operation. You can press redo several times to redo several operations.</p> <h4>重做</h4><p><em>重做</em>您的最後一項操作。您可以按下重做多次以重做多項操作.</p> <h4>Cut</h4> <p><em>Cuts</em> the selected frames out of the animation and adds them to the clipboard so that you can paste them in somewhere else.</p> <h4>剪下</h4><p><em>剪下</em>所選的圖框,將它們從動畫中加到剪貼簿,這樣您就可以把它們貼在其他地方。</p> <h4>Copy</h4> <p><em>Copies</em> the selected frames to the clipboard. You can then paste them in another place.</p> <h4>複製</h4><p><em>複製</em>所選的圖框到剪貼簿。然後您可以把它們貼到另一個位置。</p> <h4>Paste</h4> <p><em>Pastes</em> the frames which are currently in the clipboard into the selected location.</p> <p>You can copy/cut images from another programs and then use this option to paste them into this animation.</p> <h4>貼上</h4><p><em>貼上</em>目前在剪貼簿中的圖框到所選的位置.</p><p>您可以從另外的程式複製/剪下圖像,然後利用這個選項將它們貼入這個動畫。</p> <h4>What's This</h4> <p>This will give you a WhatsThis mouse cursor which can be used to bring up helpful information like this.</p> <h4>這是什麼</h4><p>這將提供您「這是什麼」滑鼠游標,它可以用來帶出如同此項的有用資訊。</p> <h4>About</h4> <p>This will display a small information box where you can read general information as well as the names of the developers behind this excellent piece of software.</p> <h4>關於</h4><p>這將顯示小型資訊框,其中您可以讀到一般資訊,以及這個優秀軟體幕後的開發人員名稱。</p> <h4>FrameBar</h4> <p>In this area you can see the frames and scenes in the animations and build the animation by moving the them around.</p><p>You can switch to the next and the previous frame using the <b>arrow buttons</b> or <b>x</b> and <b>z</b></p> <h4>圖框列</h4><p>在此區域中您可以參看動畫中的圖框和場景,並藉由在它們周圍移動來組建動畫。</p><p>您可以利用<b>箭號按鈕</b>或<b>x</b>和<b>z</b></p>去切換到下一張和上一張圖框。 <h4>Tool menu</h4> <p>This is the tool menu where most of the buttons and widgets you will need when working on stop motion animations are located.</p> <h4>工具選單</h4><p>這是包含大部分所需按鈕和視窗元件的工具選單位置,操作定格動畫時將會需要它。</p> Add &sound 加入聲音(&S) <h4>FrameView</h4><p> In this area you can see the selected frame. You can also play animations in this window by pressing the <b>Play</b> button.</p> <h4>圖框檢視</h4><p>在此區域中您可以參看所選的圖框。您也可以藉由按下<b>播放</b>按鈕在此視窗中播放動畫。</p> A&uthors 作者(&U) <h4>Quit</h4> <p><em>Quits</em> the program.</p> <h4>離開</h4><p><em>離開</em>程式.</p> <h4>Go to frame</h4> <p>This will bring up a popup-menu at the bottom where you can choose a frame you want to <em>go to</em>.</p> <h4>前往圖框</h4><p>這將於底部位置帶出快顯功能表,您可以選擇您想要<em>前往</em>.</p>的圖框。 &English 英語(&E) <h4>English</h4> <p>Select this menu options to get the <em>English</em> translation of the application.</p> <h4>英語</h4><p>選取此功能表選項以取得應用程式的<em>英語</em>翻譯。</p> &Norwegian 挪威語(&N) <h4>Norwegian</h4> <p>Select this menu options to get the <em>Norwegian</em> translation of the application.</p> <h4>挪威語</h4><p>選取此功能表選項以取得應用程式的<em>挪威語</em>翻譯。</p> &Languages 語言集(&L) &Settings 設定值(&S) Disable sound 停用聲音 Video 視訊 &Export 匯出(&E) <h4>New</h4> <p>Creates a <em>new</em> project.</p> <h4>新增</h4><p>建立<em>新的</em>專案。</p> <h4>Save</h4> <p><em>Saves</em> the current animation as a Stopmotion project file. <BR>If this project has been saved before it will automaticly be saved to the previously selected file.</p> <h4>儲存</h4><p><em>儲存</em>目前動畫為 Stopmotion 專案檔。<BR>如果此專案之前已儲存,它將自動儲存到之前所選的檔案。</p> <h4>Save As</h4> <p><em>Saves</em> the current animation as a Stopmotion project file.</p> <h4>另存新檔</h4><p><em>儲存</em>目前動畫為 Stopmotion 專案檔。</p> <h4>Video</h4> <p>Exports the current project as <em>video</em>.</p>You will be given a wizard to guide you. <h4>視訊</h4><p>匯出目前專案為<em>視訊</em>.</p>將會提供指導您的精靈程式。 <h4>Cinerella</h4> <p>Exports the current animation as a <em>Cinerella</em> project.</p>You will be given a wizard to guide you. <h4>Cinerella</h4><p>匯出目前動畫為<em>Cinerella</em>專案。</p>將會提供精靈程式來指導您。 Cinelerra Cinelerra &Configure Stopmotion 配置 Stopmotion(&C) Open &Recent 開啟最近檔案(&R) New project 新專案 Open project 開啟專案 Save project 儲存專案 Save project As 專案另存為 Quit 離開 Undo 復原 Redo 重做 Cut 剪下 Copy 複製 Paste 貼上 Go to frame 前往圖框 <h4>Configure Stopmotion</h4> <p>This will opens a window where you can <em>configure</em> Stopmotion with various input and output devices.</p> <h4>配置 Stopmotion</h4><p>這將開啟一個視窗,您可以將 Stopmotion 與各種輸入和輸出裝置<em>配置</em>。</p> Configure Stopmotion 配置 Stopmotion What's This 這是什麼 About 關於 Warning 警告 Cannot find any registered encoder to be used for video export. This can be setted in the preferences menu. Export to video will not be possible until you have setted an encoder to use. Do you want to set it now? 無法找到任何已註冊的編碼器以用於 視訊匯出。這可以在偏好選單中設定。 直到您已經設定要用的編碼器之前, 將不可能匯出為視訊。您要現在設定它嗎? Export to video file 匯出至視訊檔案 The registered encoder is not valid. Do you want to check your settings in the preferences menu? 已註冊的編碼器無效。您想要檢查 您在偏好設定選單中的設定值嗎? Export to file 匯出至檔案 <h4>Help</h4> <p>This button will bring up a dialog with the Stopmotion manual</p> <h4>說明</h4><p>這個按鈕將會帶出對話框與 Stopmotion 手冊</p> Help 求助 <p><b>Main developers</b><br>Fredrik Berg Kjølstad &lt;fredrikbk@hotmail.com&gt;<br>Bjørn Erik Nilsen &lt;bjoern.nilsen@bjoernen.com&gt;</p> <p><b>主要開發人員</b><br>Fredrik Berg Kjølstad &lt; fredrikbk@hotmail.com &gt;<br>Bjørn Erik Nilsen &lt; bjoern.nilsen@bjoernen.com &gt;</p> Stopmotion User Manual Stopmotion 使用手冊 <p><b>Coordinating</b><br>Herman Robak &lt;herman@skolelinux.no&gt;<br>Øyvind Kolås &lt;pippin@gimp.org&gt;</p><p><b>Testing</b><br>Tore Sinding Bekkedal &lt;toresbe@ifi.uio.no&gt;<br>Finn Arne Johansen &lt;faj@bzz.no&gt;<br>Halvor Borgen &lt;halvor.borgen@hig.no&gt;<br>Bjørn Are Hansen &lt;post@bahansen.net&gt;<br>John Steinar Bildøy &lt;johnsbil@haldenfriskole.no&gt;<br>Ole-Anders Andreassen &lt;ole-anders.andreassen@sunndal.kommune.no&gt;<br></p><p><b>Translation</b><br>George Helebrant &lt;helb@skatekralovice.com&gt; (Czech)<br></p> <p><b>協調者</b><br>Herman Robak &lt; herman@skolelinux.no &gt;<br>Øyvind Kolås &lt; pippin@gimp.org &gt;</p><p><b>測試者</b><br>Tore Sinding Bekkedal &lt; toresbe@ifi.uio.no &gt;<br>Finn Arne Johansen &lt; faj@bzz.no &gt;<br>Halvor Borgen &lt; halvor.borgen@hig.no &gt;<br>Bjørn Are Hansen &lt; post@bahansen.net &gt;<br>John Steinar Bildøy &lt; johnsbil@haldenfriskole.no &gt;<br>Ole-Anders Andreassen &lt; ole-anders.andreassen@sunndal.kommune.no &gt;<br></p><p><b>翻譯者</b><br>George Helebrant &lt; helb@skatekralovice.com &gt; (捷克語)<br></p> Frame number: 圖框編號: Choose project file 選擇專案檔 Save As 另存新檔 ModelHandler Choose frames to add 選擇圖框以加入 Removed the selected frame 移除所選圖框 PreferencesMenu <p>Below you can set which program/process stopmotion should use for grabing images from the webcam, and displaying video.<br> <br> You can also add new programs, just make sure the image is saved with the path and filename <b>.stopmotion/capturedfile.png</b> </p> <p>以下您可以設定 stopmotion 從網路攝影機抓取圖像,以及顯示視訊時應該使用的程式/程序。<br><br>您也可以加入新的程式,只要確知圖像的儲存路徑和檔名為<b>.stopmotion/capturedfile.png</b></p> &Add 加入(&A) Video &Import 視訊匯入(&I) <p>Video Export</p> <p>視訊匯出</p> Video &Export 視訊匯出(&E) Active 當前 Command line option 命令列選項 <p>Below you can set which program/process stopmotion should use for grabbing images from the webcam, and displaying video.<br> <br> You can also add new programs, just make sure the command line is written with file path being <b>&lt;DEFAULTPATH&gt;</b></p> <p>以下您可以設定 stopmotion 從網路攝影機抓取圖像,以及顯示視訊時應該使用的程式/程序。<br><br>您也可以加入新的程式,只要確知命令列的寫入路徑為<b>&lt; DEFAULTPATH &gt;</b></p> &Remove 移除(&R) Apply 套用 Close 關閉 Preferences Menu 偏好設定選單 Video &Device 視訊裝置(&D) QtFrontend Warning 警告 Fatal 嚴重 Cancel 取消 Progress 進度 vgrabbj VGA singleshot vgrabbj VGA 單次拍照 vgrabbj VGA deamon vgrabbj VGA 守護程式 Starts vgrabbj as a deamon. Pretty fast. 啟動 vgrabbj 為守護程式。相當快速。 Question 問題 &Yes 是(&Y) &No 否(&N) The simplest setting. Fairly slow 最簡單的設定。相當慢 Exports from jpeg images to mpeg1 video 從 jpeg 圖像匯出到 mpeg1 視訊 A newer version of the preferences file with few more default values exists. Do you want to use this one? (Your old preferences will be saved in ~/.stopmotion/preferences.xml.OLD) 存在較新版本的偏好設定檔與多一點 預設值。您要使用這一個嗎?(您舊的偏好設定將會 儲存在 ~/.stopmotion/preferences.xml.OLD 中) Exports from jpeg images to mpeg2 video 從 jpeg 圖像匯出到 mpeg2 視訊 Exports from jpeg images to mpeg4 video 從 jpeg 圖像匯出到 mpeg4 視訊 dvgrab dvgrab Grabbing from DV-cam. (EXPERIMENTAL) 從 DV 攝影機抓取。(實驗性質) videodog singleshot videodog 單次拍照 Videodog. Videodog。 Grabbing from DV-cam. 從 DV 攝影機抓取。 RunAnimationHandler Running animation 動畫執行中 SoundHandler Sounds (*.ogg) 聲音 (*.ogg) Sound name 聲音名稱 Enter the name of the sound: 輸入聲音的名稱: Choose sound file 選擇聲音檔案 ToolsMenu &Add Frames 加入圖框(&A) <h4>Add Frames</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>加入圖框</h4><p>按一下這個按鈕以<em>加入</em>圖框到動畫。</p> &Remove Selection 移除選擇(&R) <h4>Remove Selection</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>移除選擇</h4><p>按一下這個按鈕以從動畫<em>移除</em>所選圖框。</p> New &Scene 新增場景(&S) <h4>New Scene</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>新增場景</h4><p>按一下這個按鈕以<em>建立</em>新的動畫<em>場景</em>。</p> Re&move Scene 移除場景(&M) Camera &on 開啟相機(&O) <h4>Toggle camera on/off</h4> <p>Click this button to toggle the camera on and off</p> <h4>切換相機開/關</h4><p>按一下這個按鈕以切換相機的開啟和關閉</p> &Capture Frame 擷取圖框(&C) <h4>Capture Frame</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <h4>擷取圖框</h4><p>按一下這個按鈕以從相機<em>擷取</em>圖框,並將它置於動畫之中</p> Number of mixes: 混合數量: FPS chooser FPS 選擇器 <h4>FPS chooser</h4> <p>By changing the value in this chooser you set which speed the animation in the <b>FrameView</b> should run at.</p> <p>To start an animation press the <b>Run Animation</b> button.</p> <h4>FPS 選擇器</h4><p>藉由變更這個選擇器的值,您設定<b>圖框檢視</b>中的動畫應該運行於何種速度。</p><p>要啟動動畫就按下<b>運行動畫</b>按鈕。</p> Mix 混合 Diff 差異 Number of images: 圖像數量: Playback 播放控制 <h4>Add Frames (CTRL+F)</h4> <p>Click on this button to <em>add</em> frames to the animation.</p> <h4>加入圖框 (Ctrl+F)</h4><p>按一下這個按鈕以<em>加入</em>圖框到動畫。</p> <h4>Remove Selection (Delete)</h4> <p>Click this button to <em>remove</em> the selected frames from the animation.</p> <h4>移除選擇 (Del)</h4><p>按一下這個按鈕以從動畫<em>移除</em>所選圖框。</p> <h4>New Scene (CTRL+E)</h4> <p>Click this button to <em>create</em> a new <em>scene</em> to the animation.</p> <h4>新增場景 (Ctrl+E)</h4><p>按一下這個按鈕以<em>建立</em>新的動畫<em>場景</em>。</p> <h4>Remove Scene (SHIFT+Delete)</h4> <p>Click this button to <em>remove</em> the selected scene from the animation.</p> <h4>移除場景 (Shift+Del)</h4><p>按一下這個按鈕以從動畫<em>移除</em>所選場景。</p> <h4>Toggle camera on/off (C)</h4> <p>Click this button to toggle the camera on and off</p> <h4>切換相機開/關 (C)</h4><p>按一下這個按鈕以切換相機的開啟和關閉。</p> <h4>Capture Frame (Space)</h4> <p>Click on this button to <em>capture</em> a frame from the camera an put it in the animation</p> <p> This can also be done by pressing the <b>Space key</b></p> <h4>擷取圖框 (空格)</h4><p>按一下這個按鈕以從相機<em>擷取</em>圖框,並將它置於動畫之中</p><p>這也可以藉由按下<b>空格鍵</b></p>來完成 <h4>Number of images</h4> <p>By changing the value in this slidebar you can specify how many images backwards in the animation which should be mixed on top of the camera or if you are in playback mode: how many images to play. </p> <p>By mixing the previous image(s) onto the camera you can more easily see how the next shot will be in relation to the other, therby making a smoother stop motion animation!</p> <h4>圖像數量</h4><p>藉由變更滑動桿中的值,您可以指定在動畫中從後算起有多少圖像,它們應該於相機頂部混合,或者如果您位於播放控制模式:有多少圖像將要播放。</p><p>藉由混合前一個圖像到相機上,您可以更容易看到下一個鏡頭與其他鏡頭是如何關聯,以便製作較平滑的定格動畫 !</p> <h4>Play animation (K, P)</h4> <h4>播放動畫 (K, P)</h4> <h4>Stop animation (K, P)</h4> <h4>停止動畫 (K, P)</h4> <h4>Previous frame (J, Left)</h4> <h4>上一圖框 (J, 左)</h4> <h4>Next frame (L, Right)</h4> <h4>下一圖框 (L, 右)</h4> <h4>Previous scene (I)</h4> <h4>上一場景 (I)</h4> <h4>Next scene (O)</h4> <h4>下一場景 (O)</h4> <h4>Loop animation (CTRL+L)</h4> <p>With this button you can set whether you want the animation to play to the end, or to loop indefinetly.</p> <h4>循環動畫 (Ctrl+L)</h4><p>利用這個按鈕您可以設定是否您想要播放動畫到結束,或者是永久循環。</p> Notice 通知 Playback only currently works when running the grabber as a deamon. Go to the preferences menu (CTRL+P) to switch to running the image grabbing as a deamon. 目前播放控制只在以抓取器做為 守護程式執行時才有作用。前往偏好設定選單 (Ctrl+P) 以切換圖像抓取做為守護程式執行。 Auto 自動 Pr sec 每秒 Pr min 每分鐘 Pr hr 每小時