luvcview-0.2.6/0000755000175000017500000000000011245455154012705 5ustar aurel32aurel32luvcview-0.2.6/COPYING0000644000175000017500000004310311074760576013750 0ustar aurel32aurel32 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser General Public License instead of this License. luvcview-0.2.6/button.h0000644000175000017500000036475010764151556014414 0ustar aurel32aurel32/******************************************************************************* # uvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # *******************************************************************************/ #define BUTTWIDTH 640 #define BUTTHEIGHT 32 unsigned char *YUYVbuttOrg = NULL; // Don't be afraid that is just the ressource for the gui an embedded jpeg file :) static unsigned char bouttons[]={ 0xff,0xd8,0xff,0xdb,0x00,0x43,0x00,0x05,0x03,0x04,0x04,0x04,0x03,0x05,0x04,0x04,0x04,0x05,0x05,0x05, 0x06,0x07,0x0c,0x08,0x07,0x07,0x07,0x07,0x0f,0x0b,0x0b,0x09,0x0c,0x11,0x0f,0x12,0x12,0x11,0x0f,0x11, 0x11,0x13,0x16,0x1c,0x17,0x13,0x14,0x1a,0x15,0x11,0x11,0x18,0x21,0x18,0x1a,0x1d,0x1d,0x1f,0x1f,0x1f, 0x13,0x17,0x22,0x24,0x22,0x1e,0x24,0x1c,0x1e,0x1f,0x1e,0xff,0xdb,0x00,0x43,0x01,0x05,0x05,0x05,0x07, 0x06,0x07,0x0e,0x08,0x08,0x0e,0x1e,0x14,0x11,0x14,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, 0xff,0xc0,0x00,0x11,0x08,0x00,0x20,0x02,0x80,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11,0x01,0xff, 0xc4,0x00,0x1c,0x00,0x00,0x02,0x03,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x05,0x06,0x03,0x04,0x07,0x02,0x01,0x00,0x08,0xff,0xc4,0x00,0x4e,0x10,0x00,0x01,0x04,0x02,0x00,0x05, 0x02,0x03,0x05,0x04,0x04,0x09,0x07,0x0d,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x11,0x00,0x07,0x12, 0x13,0x21,0x22,0x31,0x14,0x23,0x41,0x15,0x16,0x32,0x51,0x61,0x08,0x17,0x52,0x71,0x33,0x42,0x62,0xd4, 0x18,0x24,0x34,0x35,0x55,0x81,0x82,0x91,0xd2,0x36,0x37,0x94,0xa4,0xb1,0xb3,0xc1,0x43,0x44,0x45,0x56, 0x76,0x93,0x96,0xa1,0xa3,0xb4,0xd1,0xd3,0xd5,0xff,0xc4,0x00,0x19,0x01,0x00,0x03,0x01,0x01,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x04,0x05,0x01,0x00,0xff,0xc4,0x00,0x30, 0x11,0x00,0x02,0x01,0x03,0x03,0x02,0x05,0x03,0x02,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x11, 0x00,0x03,0x04,0x05,0x12,0x21,0x31,0xb1,0x13,0x14,0x41,0x51,0x71,0x81,0xa1,0xc1,0x61,0x91,0x06,0x15, 0x22,0x32,0x42,0xd1,0xf0,0x72,0xff,0xda,0x00,0x0c,0x03,0x01,0x00,0x02,0x11,0x03,0x11,0x00,0x3f,0x00, 0x71,0xe4,0x5d,0x9d,0x75,0x47,0x2d,0xec,0x26,0xda,0xce,0x8d,0x06,0x22,0x6c,0xd4,0x16,0xec,0x87,0xd2, 0xd2,0x01,0x2d,0xb5,0xa0,0x54,0xa2,0x07,0xbe,0xb8,0x3f,0x06,0xeb,0x26,0xcb,0x5c,0x0d,0x60,0xd8,0xf2, 0x8c,0x55,0x80,0x45,0xc5,0xd2,0x55,0x16,0x2e,0x88,0x04,0x29,0xb6,0x88,0x0f,0x3d,0xee,0x47,0xe1,0x40, 0xf1,0xf8,0xbc,0xf0,0xb1,0xc8,0xfa,0x7a,0x7b,0x9c,0x1a,0x53,0x17,0x15,0x30,0x2c,0x5a,0x6e,0xc5,0xc2, 0x84,0xca,0x8e,0x87,0x52,0x92,0x5b,0x67,0x67,0x4a,0x07,0xf2,0x1e,0xdc,0x75,0x91,0xd3,0xf2,0xc3,0x19, 0x8f,0x16,0x4d,0x8d,0x06,0x33,0x25,0x33,0x16,0xcb,0x30,0xd9,0x6a,0x8e,0x3b,0x8e,0x49,0x52,0x9b,0x59, 0x40,0x05,0x29,0x09,0x0a,0x71,0x49,0x24,0x2d,0x5d,0x2d,0xe9,0x3a,0x01,0x3e,0x55,0xc7,0x75,0xc1,0x64, 0xea,0x4f,0xbc,0x12,0xd3,0xc0,0xf4,0xa5,0xe8,0xfb,0xc6,0x1a,0x41,0x81,0x15,0xa5,0x57,0x72,0x99,0xb7, 0x5a,0x5c,0x8c,0xab,0x2d,0xc8,0xed,0xac,0x1d,0x47,0x4f,0x54,0x3b,0x17,0x6b,0xa3,0xb1,0xe4,0x9d,0x36, 0xd3,0x0b,0x48,0xf1,0xbf,0x75,0x95,0xa8,0xe8,0x6c,0x9d,0x70,0x2e,0xc7,0x11,0xe6,0x06,0x26,0xd9,0x76, 0xa2,0x73,0x39,0x8d,0x42,0x3f,0xf3,0x69,0xeb,0x44,0x6b,0x16,0x93,0xe9,0x1a,0x4b,0xc0,0x06,0xde,0xd0, 0x0a,0x3a,0x70,0x25,0x44,0x9f,0x2e,0x1e,0x00,0xc5,0xe4,0xdb,0x97,0x0a,0x4c,0xb5,0x61,0xdc,0xbf,0xc6, 0x59,0x42,0x8a,0x99,0x8d,0x26,0x8d,0x13,0xdf,0x57,0x82,0x36,0xef,0x69,0xc6,0x9b,0x49,0xd1,0xfc,0x00, 0xba,0x37,0xe7,0xab,0x60,0x68,0x5e,0x43,0xcb,0xfa,0xfc,0x16,0xbd,0x53,0x32,0x5c,0x0b,0x0b,0xb1,0xa2, 0x8d,0xd2,0x5e,0xb6,0xad,0xa9,0x69,0x0e,0x30,0xd8,0xd0,0x25,0xd6,0x1e,0x52,0x95,0xf9,0xfa,0xd0,0xb7, 0x54,0x7f,0x83,0xf3,0x9c,0xdc,0xb3,0x71,0x7c,0x38,0x93,0xed,0x03,0xed,0x55,0x82,0xca,0x64,0x35,0x38, 0x62,0xd9,0x7d,0x3d,0xad,0x90,0xaa,0x59,0x93,0x59,0x70,0x91,0xb5,0xd6,0x59,0x34,0x63,0xc9,0x1e,0x09, 0xda,0x52,0x7c,0x38,0x00,0x04,0xf5,0x36,0x54,0x9f,0xd7,0x85,0x2e,0x43,0x4b,0x8b,0x07,0x97,0x96,0x53, 0x26,0xc9,0x66,0x34,0x66,0xa7,0xb8,0xa7,0x1e,0x79,0xc0,0x84,0x20,0x76,0x9b,0xd9,0x2a,0x24,0x00,0x3f, 0x53,0xc1,0x6c,0x33,0x16,0xe5,0xec,0xa8,0x30,0xac,0xa0,0xd1,0xe3,0x72,0x11,0x25,0xa6,0xcb,0x2b,0x45, 0x4b,0x2c,0x95,0x6d,0xbe,0xe0,0x3d,0x05,0x01,0x41,0x4a,0x42,0x92,0xb2,0x0f,0xd3,0xc8,0x00,0x78,0xe0, 0x0f,0x24,0x2a,0x2a,0x6e,0x70,0x09,0x91,0xee,0x2b,0x20,0xd8,0xb2,0x8b,0x35,0xa9,0x2d,0xcb,0x61,0x2e, 0xa5,0x27,0xb4,0xd8,0xea,0xd2,0x81,0x1e,0xde,0x37,0xfa,0xf1,0x46,0x22,0xdb,0x5d,0x3a,0xf0,0x59,0xdb, 0x23,0xbd,0x22,0xf9,0x63,0x95,0x6c,0x9f,0x63,0xf8,0xa6,0x7a,0xfb,0xac,0x87,0x2e,0x78,0x31,0x81,0x53, 0x25,0xe8,0xaa,0xf2,0x6e,0xed,0x52,0xb6,0x61,0x6b,0xf8,0x9a,0x40,0xd3,0x92,0x3e,0xbe,0x52,0x12,0x9f, 0xed,0xf0,0xcd,0x13,0x94,0xf0,0x9c,0x80,0xef,0xdb,0x99,0x5e,0x53,0x61,0x68,0xe8,0x1d,0x53,0xa3,0xd9, 0xbb,0x0d,0x2d,0xab,0x40,0x0e,0xdc,0x76,0x54,0x1a,0x03,0xf4,0x5a,0x56,0x4f,0xf5,0x8a,0xb7,0xc6,0x63, 0xcc,0x76,0xf9,0x43,0x81,0x55,0xb7,0x61,0x7f,0x87,0x51,0x0e,0xfa,0x8a,0x23,0xb0,0xc5,0x2b,0x2b,0x5b, 0xca,0x48,0xdf,0x48,0xf4,0x84,0x83,0xad,0x79,0x51,0x03,0xc7,0xd7,0x8c,0xaf,0x05,0xbc,0x77,0x98,0xd9, 0xb1,0xa8,0xc3,0xf9,0x4d,0x80,0x46,0x82,0x90,0x16,0xea,0xa5,0x55,0x34,0xf3,0xac,0x35,0xec,0x5c,0x3e, 0xb6,0x82,0xbf,0x3e,0x94,0x8d,0xfd,0x36,0x78,0xe6,0x9b,0x82,0x72,0x2d,0x35,0xcb,0x4b,0x0a,0xbd,0x49, 0x81,0xf7,0xaa,0x32,0x6e,0x15,0x30,0xcd,0x15,0xfa,0x16,0xda,0x26,0x79,0x87,0x3b,0xd5,0x65,0x1b,0xef, 0x75,0x2e,0xf4,0x99,0xd0,0x1b,0x4a,0x2c,0x1a,0x1e,0x7c,0xbb,0x1f,0xc2,0x1d,0xfd,0x4b,0x44,0x1f,0x1e, 0x1b,0xe3,0xab,0x3b,0xba,0x7c,0x8b,0x96,0x39,0x14,0xba,0xa9,0xad,0xca,0x69,0x35,0xef,0x87,0x12,0x9f, 0x0e,0x34,0xb0,0xd9,0x3d,0x2e,0x20,0x80,0xa4,0x28,0x78,0xd8,0x50,0x07,0x84,0x39,0xf5,0x78,0x8e,0x23, 0x3a,0x24,0x1c,0xf7,0x97,0xb8,0x8c,0x66,0xa6,0xbe,0x23,0xc1,0xb6,0xae,0xab,0x69,0x71,0xa4,0xb8,0x4f, 0x84,0xa9,0x95,0x24,0xba,0xca,0x8f,0x8f,0x1a,0x5a,0x7f,0xb7,0xc3,0xdd,0xc6,0x39,0x8e,0xd3,0xe0,0xb9, 0x1b,0xd4,0xf4,0x15,0x35,0xce,0x1a,0xa9,0x09,0x2b,0x89,0x11,0xb6,0x8e,0xbb,0x67,0xd3,0xb4,0x81,0xc2, 0x31,0xac,0xda,0x4c,0xd4,0x30,0x43,0x48,0xf8,0x3c,0xd0,0xdc,0x66,0x6b,0x0f,0xfd,0x53,0xc7,0xe2,0xa9, 0xf2,0xba,0x4c,0x2a,0xde,0x4d,0x55,0x4e,0x9b,0x25,0x88,0x91,0xd0,0x24,0x38,0xf3,0xef,0x38,0x1b,0x42, 0x47,0x7d,0x63,0x65,0x4a,0xf0,0x06,0x87,0xd7,0x8e,0xa1,0x5d,0xe4,0x59,0x63,0x9d,0x9c,0x0e,0x90,0x3d, 0x18,0xff,0x00,0xe9,0x9b,0x60,0xa6,0x21,0x81,0xfc,0x4d,0xa0,0x7c,0xc9,0x1f,0xec,0x84,0xa7,0xdb,0x4b, 0x3f,0x5a,0xfc,0xba,0xa5,0xa6,0xba,0xe4,0xf6,0x3e,0xcd,0xcd,0x4c,0x0b,0x26,0x90,0x64,0x14,0xa2,0x5c, 0x74,0x3a,0x94,0x92,0xfb,0x83,0x60,0x2c,0x6b,0xdb,0x80,0x9c,0xc0,0x8b,0xca,0x5c,0x22,0x0b,0x32,0xee, 0xf0,0xca,0x02,0xb9,0x4e,0x16,0xa2,0xb0,0xcd,0x2b,0x2e,0x2d,0xf5,0x8f,0x25,0x23,0xd0,0x00,0xf0,0x7e, 0xaa,0x03,0xc7,0xbf,0x1c,0xd4,0x85,0x93,0xa8,0x38,0xb8,0x09,0x69,0x31,0xfb,0xd7,0xb1,0x59,0x86,0x22, 0x99,0x81,0x03,0xb5,0x68,0xf1,0x39,0x43,0x1d,0xf8,0x2f,0x1c,0x8b,0x2f,0xca,0x2c,0x6c,0xdf,0x4e,0x8c, 0xa8,0xb6,0x8f,0x40,0x6d,0x83,0xf4,0xed,0x32,0xca,0xc2,0x06,0xb7,0xfd,0x7e,0xb3,0xfa,0x9e,0x02,0x5b, 0xd5,0xf3,0x03,0x0e,0x5a,0x9d,0x75,0x94,0xe6,0xd4,0xc8,0xd9,0x4b,0xb1,0x52,0xd4,0x6b,0x46,0x87,0xa8, 0xe9,0x4d,0xe9,0x2c,0xbf,0xee,0x94,0x8e,0x82,0xd1,0x00,0x13,0xd2,0xa3,0xc7,0xe7,0xfb,0x4b,0x77,0x9e, 0x98,0x5c,0xa9,0xe5,0x67,0x2e,0xa1,0x44,0x20,0x04,0x31,0x3a,0xa4,0xbe,0xf8,0x3f,0x9a,0x94,0xda,0x52, 0x9d,0x9f,0x1e,0x06,0xc0,0xfe,0x23,0xc1,0x5a,0x0c,0xab,0x01,0xae,0x8e,0xda,0x39,0x83,0xcb,0x6c,0x56, 0x00,0x3e,0x3e,0xd3,0xaf,0xa8,0x43,0x91,0x89,0xf5,0x9d,0x2d,0xb2,0xd9,0x71,0x3e,0x02,0x07,0xa7,0xb9, 0xb2,0x49,0x21,0x00,0x10,0x1f,0x7f,0x1e,0xd7,0x84,0x0b,0x43,0x7e,0x80,0x89,0x14,0xab,0x59,0x20,0xdc, 0xda,0x0f,0x35,0xbf,0xe1,0xb7,0xf4,0x59,0x27,0x7d,0xba,0xc9,0xc8,0x90,0xa6,0x4f,0x6a,0x54,0x75,0x21, 0x4c,0xbe,0xc7,0x92,0x9d,0x38,0xd2,0x80,0x71,0xb2,0x7a,0x55,0xae,0xa4,0x82,0x40,0xd8,0xd8,0xe1,0x17, 0x91,0x73,0xa1,0xd6,0xf2,0xce,0xc6,0x75,0x84,0xb8,0xf0,0xe2,0xb5,0x66,0xb2,0xe3,0xcf,0xba,0x96,0xd0, 0x81,0xda,0x68,0x6c,0xa9,0x5e,0x91,0xfc,0xcf,0x0e,0xf8,0xa6,0x25,0x8a,0x54,0xda,0xb5,0x32,0xab,0x18, 0xa6,0x81,0x25,0x04,0x84,0x3d,0x1e,0x0b,0x4d,0x2d,0x3b,0x1d,0x27,0x45,0x29,0x07,0x64,0x1d,0x1f,0xe7, 0xc2,0x07,0x25,0x29,0x29,0x6e,0xf9,0x77,0x21,0x9b,0xaa,0x8a,0xfb,0x26,0xdb,0xb5,0x70,0xb6,0x99,0x71, 0x90,0xe8,0x49,0x2d,0x35,0xb2,0x02,0x81,0xd7,0xd3,0x8e,0xe1,0x78,0x63,0x4e,0xbc,0x14,0x9d,0xb2,0x3e, 0x7d,0x6b,0xb9,0x12,0x73,0x13,0xe0,0xfe,0x29,0x96,0xba,0xd7,0x27,0xcc,0x1d,0x4b,0x58,0x2d,0x2a,0x5b, 0x84,0xad,0x13,0x75,0x72,0xda,0xd9,0x8c,0x53,0xb0,0x7a,0x9a,0x67,0x61,0xe7,0xbc,0x6c,0x6f,0xe5,0xa7, 0x60,0x10,0xa2,0x3d,0xd9,0x22,0xf2,0x8a,0x2b,0x95,0xae,0x7d,0xad,0x99,0x65,0xb3,0x2e,0x1d,0xe9,0x51, 0xb0,0x66,0xcd,0xc8,0xa9,0x6d,0x49,0x00,0x0e,0x88,0xcd,0x90,0xc0,0x1e,0x07,0xa5,0x48,0x57,0xd7,0x64, 0x92,0x49,0x5c,0x3c,0xbe,0xc0,0xb7,0xe7,0x08,0xc6,0x7f,0x9f,0xd9,0x4c,0x7f,0xc0,0x78,0xcf,0xf2,0x1b, 0x0e,0x58,0x30,0xd3,0x8d,0xe3,0x1c,0xb9,0xc7,0xb2,0x77,0xda,0x52,0x50,0xe3,0xf1,0xab,0xe3,0xb7,0x01, 0x92,0xa2,0x81,0xa5,0x48,0x28,0x29,0x51,0xd2,0xc9,0xe9,0x6c,0x38,0x76,0x92,0x08,0x4e,0xf6,0x33,0xf0, 0xee,0x5a,0xe8,0x8a,0x7e,0x62,0xac,0xbc,0x8e,0x79,0x26,0xb4,0x6b,0x28,0xb9,0xe6,0x1c,0xa0,0x6d,0xa1, 0x0c,0xb6,0xa3,0x7a,0x4c,0xfa,0xe6,0x83,0x73,0x9a,0x4f,0xe6,0xf4,0x61,0xa0,0xe6,0x81,0x24,0xa9,0xaf, 0x27,0x5f,0xd1,0xf9,0xdf,0x1e,0x4f,0xbe,0xa7,0xc8,0x79,0x79,0x90,0x4d,0xa7,0x9e,0xcc,0xd6,0x85,0x74, 0x94,0x38,0x13,0xb4,0xad,0xa5,0x76,0x49,0xe8,0x5a,0x0f,0xa9,0x0a,0x00,0x8f,0x4a,0x80,0x23,0xea,0x07, 0x0a,0x98,0x77,0x2a,0xa1,0x32,0xfa,0xec,0x72,0xca,0xdc,0x4e,0x5b,0xce,0x8d,0x0a,0xda,0xec,0x7e,0x2b, 0x50,0xe3,0x9d,0x0d,0x80,0xa5,0xb6,0x5d,0x59,0xd8,0x27,0x6a,0x50,0x1e,0x4f,0x8f,0x6d,0x32,0xda,0x62, 0xf8,0xcd,0x2e,0x23,0x90,0xc9,0xa6,0xc7,0x6a,0x2b,0x5f,0x35,0x32,0x50,0x5d,0x89,0x09,0xb6,0x94,0x52, 0x5b,0x24,0xa7,0x68,0x4f,0xb7,0x81,0xf5,0xfa,0x0e,0x0f,0x1d,0xac,0x1c,0xc4,0xdb,0xfd,0xdb,0x87,0x4e, 0x9d,0x68,0x2f,0x2b,0xf8,0x0e,0x1b,0x9e,0x0f,0x6a,0xe7,0x95,0x13,0x60,0x54,0xf2,0x5a,0xbe,0xc2,0xc6, 0x5c,0x68,0x31,0x92,0xe3,0xe5,0xd7,0xe4,0x3a,0x1b,0x6d,0x3b,0x78,0xa4,0x6d,0x4a,0xd0,0x1e,0x74,0x3f, 0x5f,0x6f,0xaf,0x15,0xab,0x72,0x0c,0xab,0x37,0x29,0x1c,0xb9,0xc7,0x37,0x5c,0xb2,0x93,0xf7,0x82,0xf5, 0x0b,0x8d,0x08,0xa4,0xf4,0x1d,0xb2,0xd6,0x83,0xaf,0x92,0x3b,0x89,0xd8,0xe9,0x48,0x50,0x1e,0x48,0x3c, 0x77,0xcb,0x0a,0x4a,0x5b,0xae,0x50,0x53,0x22,0xe2,0xa6,0xbe,0xc5,0x0d,0xb9,0x23,0xa0,0x4b,0x8e,0x87, 0x42,0x36,0xea,0xb7,0xa0,0xa0,0x75,0xbd,0x0f,0x6f,0xcb,0xfd,0x47,0x21,0xe7,0x14,0xff,0x00,0xb9,0x16, 0x78,0xf4,0x65,0x72,0xab,0x96,0xad,0xfd,0xaa,0xf3,0x88,0x29,0xec,0x09,0x5b,0xe9,0x53,0x43,0x5b,0xec, 0xb3,0xd0,0x47,0x73,0xf2,0x5f,0xbf,0xd3,0x5a,0x55,0xd9,0xb8,0xd6,0xaf,0x6a,0x0e,0xa4,0x4b,0x49,0xeb, 0x11,0x53,0x63,0x3b,0x26,0x2a,0x91,0xec,0x3f,0x15,0xbf,0x43,0xe4,0xd2,0x1c,0xa9,0x7c,0x5f,0x73,0x03, 0x32,0x9d,0x77,0x21,0x4d,0xad,0x76,0x51,0x2c,0x0c,0x24,0x32,0xa4,0x6b,0xc3,0x51,0x91,0xf2,0x12,0x95, 0x04,0x80,0xa0,0xa4,0xaf,0x7b,0x3e,0x76,0x77,0xc0,0x39,0xb1,0xf9,0x9b,0x83,0x94,0xa7,0x20,0xab,0xfb, 0xf1,0x4e,0x08,0x1f,0x6a,0xd1,0xc6,0xed,0xce,0x46,0xfa,0x13,0xb7,0xa1,0x6c,0xf5,0x6d,0x4a,0x3e,0x59, 0x2a,0xd2,0x50,0x54,0x52,0x38,0x4c,0x14,0xb1,0x35,0xff,0x00,0x34,0x1c,0xbb,0xfa,0x0f,0xf2,0x91,0xfd, 0xc7,0xf5,0xe1,0x2a,0x9e,0xd1,0x16,0x1c,0xe6,0x97,0x83,0xa3,0x95,0x1c,0xb6,0x01,0x96,0x7b,0x81,0xa3, 0x18,0x02,0x3e,0x52,0x1c,0xfe,0x9f,0xb2,0x77,0xf8,0xbd,0xbb,0x23,0xf2,0xfa,0x6c,0xf2,0xe6,0x28,0xb8, 0x87,0x7a,0xc8,0x51,0x3e,0x9f,0x6e,0x69,0xa8,0xfb,0x58,0x6d,0x6e,0x4d,0x6e,0xcb,0xc9,0x28,0xb2,0x8e, 0x57,0x64,0x16,0x38,0xfd,0xa4,0x6b,0x08,0xea,0xab,0x91,0xd4,0x5a,0x3e,0xa4,0x7c,0xa5,0x78,0x52,0x4e, 0x94,0x83,0xfa,0x28,0x6f,0x47,0x85,0xfc,0x27,0x26,0xa0,0xc5,0xb9,0x3d,0x47,0x32,0xfa,0xcd,0x98,0x4d, 0xac,0xbe,0x1b,0x4a,0xc9,0x52,0xdd,0x3f,0x10,0xb1,0xa4,0x36,0x9f,0x5a,0xcf,0x91,0xb0,0x90,0x48,0xdf, 0xf3,0xe0,0xd3,0xf8,0xe5,0x3d,0x5f,0x2e,0xef,0x64,0xc7,0xc6,0x68,0xea,0x27,0x1a,0x89,0x21,0xc1,0x5c, 0xca,0x4a,0x46,0xdb,0x5e,0xc0,0x70,0x21,0x04,0x8f,0xf6,0x47,0xf2,0xf1,0xc2,0xa6,0x0f,0x07,0x12,0x7b, 0x04,0xc6,0xd8,0xb4,0xc3,0xa1,0xdf,0xda,0x4d,0x44,0xa5,0xb4,0xd2,0xa0,0xc7,0x75,0xd5,0x36,0xd3,0xea, 0x0a,0x59,0x53,0xa4,0x00,0x91,0xd6,0x84,0xf9,0x3e,0xea,0x00,0x6f,0x82,0x54,0x43,0xa5,0xb0,0x13,0xb7, 0x70,0xf9,0xe8,0x69,0x24,0xb7,0x9d,0x5f,0x78,0x3d,0xc5,0x1f,0x80,0xc7,0x34,0x33,0x9f,0x34,0x75,0x83, 0x04,0xa7,0x58,0x3a,0xb3,0xba,0x60,0x3b,0x60,0xbf,0x71,0xb6,0xa1,0x82,0x02,0x34,0xa4,0xe8,0xf7,0x54, 0x36,0x95,0x05,0x00,0x7d,0xb8,0x61,0x95,0xc9,0x94,0x26,0xa5,0x91,0x47,0x9f,0xe6,0x70,0x6e,0x98,0x2e, 0x2d,0x36,0x52,0xac,0x55,0x31,0x0f,0x29,0x7b,0xd0,0x76,0x32,0xf4,0xca,0x92,0x90,0x74,0x12,0x84,0xa3, 0x5a,0x1e,0x76,0x37,0xc2,0xbb,0x75,0xbc,0x99,0xed,0xb6,0x2c,0x71,0xbc,0x2e,0xa6,0x52,0xba,0x52,0xa8, 0x76,0x10,0x62,0x31,0x21,0xb5,0x28,0xe8,0x25,0x48,0x50,0xde,0xc9,0xd6,0xb5,0xb0,0xad,0x82,0x09,0x04, 0x13,0xda,0x6b,0x79,0x1c,0xa2,0x52,0x98,0x1c,0xba,0x25,0x3a,0xd8,0x0c,0xc3,0xf1,0xb2,0x75,0xfe,0xf2, 0x95,0x01,0xfc,0x8f,0xe5,0xc6,0x55,0xab,0xc9,0x68,0x6d,0x55,0xab,0x5a,0xdb,0x31,0x99,0xae,0xec,0x2f, 0x33,0x1c,0x25,0xc5,0x7e,0xf0,0x71,0xb0,0xf5,0x6b,0x7b,0x3f,0x78,0x28,0x90,0xe3,0xf1,0x52,0x9f,0x51, 0xdb,0xcc,0x79,0x79,0x80,0x12,0x94,0x82,0x7d,0x69,0x24,0xfb,0x81,0xc5,0xae,0x6c,0x4e,0xae,0xb7,0xe4, 0x94,0xfb,0x0a,0xb9,0x8c,0x4d,0x8c,0xa5,0xb1,0xd0,0xf3,0x2e,0x05,0xa4,0xfc,0xd4,0x8d,0x6c,0x78,0xd8, 0xf6,0xe3,0xda,0x4c,0x63,0x94,0x97,0x68,0x53,0xb4,0x98,0xf6,0x11,0x64,0x86,0xfa,0x54,0xa5,0x44,0x85, 0x15,0xe0,0x90,0xad,0xf4,0x92,0x52,0x0f,0xbe,0x8e,0xbf,0x91,0xe2,0x1e,0x6b,0x53,0x54,0xd4,0x72,0x92, 0xed,0xba,0x9a,0xa8,0x30,0x10,0x5c,0x8d,0xd4,0x98,0xb1,0xd0,0xd0,0x3f,0x35,0x3e,0xfd,0x20,0x71,0x6e, 0x92,0xd6,0xfc,0xf2,0x15,0x58,0x24,0x8e,0xf5,0x3e,0x68,0x71,0x8c,0xc0,0x99,0xe0,0xd6,0x23,0x92,0x67, 0x37,0xf8,0xcd,0x7d,0x1e,0x3f,0x43,0x21,0xb8,0x28,0xb8,0x47,0x72,0x4c,0xa4,0xb7,0xd4,0xfa,0x4a,0x5a, 0x69,0x3a,0x41,0x56,0xd2,0x06,0xbd,0xcf,0x4e,0xff,0x00,0x22,0x3d,0xf8,0x33,0xca,0xaf,0xb5,0xb3,0xab, 0x89,0xf8,0xe3,0x56,0xb3,0x6b,0xe6,0xd6,0x32,0x97,0x5d,0x9a,0xe5,0xbd,0xa3,0xe8,0x90,0x93,0xe0,0x00, 0xd0,0x98,0x8e,0x83,0xfa,0xf5,0x91,0xf9,0x01,0xf4,0x77,0xc2,0x70,0xac,0x6b,0x31,0xc1,0xda,0x6e,0xfa, 0xb5,0x0f,0xb8,0xd7,0x40,0x6a,0x42,0x14,0x5b,0x7d,0xaf,0x92,0xdf,0xe1,0x71,0x24,0x28,0x7e,0x7a,0xf6, 0xfc,0xf7,0xed,0xc5,0x53,0xfb,0x3a,0xe1,0xea,0x61,0x2c,0x2e,0xea,0xf9,0x6d,0xa4,0xec,0x25,0x49,0x84, 0x40,0x3f,0x9f,0xf9,0x3f,0xbf,0x1a,0x79,0x5a,0x85,0x8b,0x59,0x0e,0xa4,0x41,0xdc,0x79,0x89,0xe7,0xde, 0x82,0xcd,0x9b,0x8d,0x65,0x0a,0xfb,0x0e,0xd4,0x53,0xf7,0x55,0x92,0xeb,0x7f,0x7e,0x95,0xec,0x3f,0xaf, 0x6d,0xff,0x00,0xf4,0xf8,0x15,0x98,0xe1,0x77,0x78,0x96,0x2d,0x61,0x93,0x4d,0xca,0xa4,0x59,0x47,0xae, 0x6f,0xba,0xe4,0x46,0x66,0xda,0xc7,0x5b,0xa3,0xf2,0x0e,0x1b,0x05,0x84,0x9f,0xd4,0xa1,0x5f,0xcb,0x8e, 0x3f,0xc1,0xbb,0x08,0xff,0x00,0x49,0xdc,0xff,0x00,0xee,0xa1,0x7f,0x76,0xe2,0x58,0xbf,0xb3,0xb6,0x21, 0x12,0x4a,0x24,0xc4,0xbb,0xbe,0x8e,0xfb,0x67,0xa9,0x0e,0xb4,0x98,0x49,0x5a,0x4f,0xe6,0x08,0x8f,0xb0, 0x78,0x40,0xd5,0x6d,0x03,0xcb,0x12,0x3e,0x28,0xfc,0xb5,0xcf,0xf8,0xd2,0xdd,0xc5,0xf6,0x49,0x83,0xd5, 0x62,0xd9,0x04,0x0b,0x97,0xe6,0x35,0x91,0xcd,0x65,0xb7,0x2b,0xe6,0xba,0xec,0x96,0x59,0x6d,0xcd,0x0f, 0x0b,0x75,0xc5,0xbb,0xd6,0x3f,0x34,0xad,0x28,0x3e,0xfd,0x1c,0x62,0x99,0x05,0x3c,0x09,0x33,0x58,0x8a, 0xeb,0x6f,0x25,0x93,0x35,0xc8,0xca,0xed,0x2b,0xd4,0x1a,0x4a,0x5a,0x29,0x03,0x7e,0x36,0x3a,0xd4,0x77, 0xe4,0xfb,0x7b,0xf8,0xd7,0xeb,0x2a,0x3e,0x52,0xe2,0xb5,0x6a,0xef,0x4a,0x32,0xee,0x56,0x87,0x0b,0xcd, 0x22,0xc4,0xb6,0xa6,0x5b,0x5f,0xd5,0x61,0x96,0xd0,0x86,0x8a,0xff,0x00,0xb6,0xa4,0x95,0x7e,0xbc,0x66, 0xdc,0xb5,0xe5,0x75,0x5e,0x65,0x5f,0x26,0xd2,0xca,0xc6,0x7c,0x40,0xcd,0x8c,0x8e,0x81,0x15,0x49,0x4a, 0xc9,0x29,0x67,0xa5,0x5d,0x4a,0x0a,0x1e,0x3a,0x17,0xf4,0xd9,0xea,0x1e,0x40,0x1e,0x46,0xde,0xa5,0x67, 0x73,0x38,0x1c,0x71,0x3c,0x75,0xe7,0x8f,0xda,0xba,0xd6,0x2e,0xc4,0x4d,0x2b,0xe3,0xdc,0x99,0xc7,0x2d, 0x72,0xe6,0xf0,0xf6,0x98,0x8e,0xd4,0x93,0x5e,0x99,0xe9,0xb2,0x79,0xb7,0xd6,0x3a,0x0f,0xb3,0x65,0x94, 0xbc,0x9d,0xa8,0x6c,0x6d,0x41,0x7a,0xfe,0xc8,0xfa,0x36,0xff,0x00,0x82,0xc5,0x77,0xb9,0xb7,0xa7,0xf1, 0xe3,0xfc,0xd5,0x27,0xfb,0xe7,0x0f,0x3f,0xb9,0x8c,0x70,0xd7,0x0a,0xe5,0x5b,0x5d,0x2e,0x18,0x5f,0x73, 0xb0,0xa3,0x1c,0xa0,0xaf,0xf8,0xca,0x7b,0x3a,0xea,0xfd,0x78,0xaa,0x9e,0x44,0x61,0xc0,0x68,0xc9,0xb0, 0x3f,0xa9,0x66,0x27,0xff,0x00,0xa3,0x87,0x1d,0x5e,0xcc,0x7f,0x4b,0x11,0xf4,0x9a,0x0f,0x29,0x73,0xd4, 0x52,0x1d,0xff,0x00,0xec,0xdb,0x55,0x45,0x41,0x3e,0xf2,0x44,0xda,0xd9,0xac,0xc1,0x61,0x4f,0xae,0x3b, 0x50,0x24,0x34,0xb7,0x42,0x46,0xca,0x42,0xcc,0xa5,0x74,0x93,0xf9,0xf4,0x9f,0xe4,0x78,0xcd,0x72,0xbc, 0x02,0x9e,0x9b,0x1f,0xa8,0xcb,0x6b,0x5a,0x54,0x43,0x60,0x90,0xe3,0x51,0x50,0x56,0x43,0x28,0x23,0xf0, 0xa9,0x4a,0x24,0xad,0x5f,0xda,0xd2,0x07,0xf6,0x78,0xfd,0x17,0x1f,0x91,0xf8,0x9c,0x77,0xd0,0xfc,0x79, 0xb6,0x6c,0xbc,0xd9,0x0a,0x43,0x8d,0xa2,0x2a,0x54,0x82,0x3e,0xa0,0x86,0x76,0x0f,0xea,0x38,0x8f,0x20, 0xe4,0x85,0x15,0xb4,0x79,0x01,0x59,0x05,0xea,0x1f,0x75,0x25,0x41,0x65,0x6d,0x74,0x29,0xdd,0x78,0x71, 0xc4,0xa5,0xb4,0xf7,0x0e,0xfd,0xc9,0x20,0x9f,0xcc,0x78,0x21,0x96,0x75,0x6b,0x25,0x80,0x66,0x27,0xe9, 0x42,0xd8,0xb7,0x36,0xf4,0xa1,0xff,0x00,0xb3,0x6b,0xac,0xc7,0xaf,0xca,0xa4,0x48,0x75,0x0d,0x34,0xd2, 0x63,0x2d,0x6e,0x2d,0x41,0x21,0x09,0x1d,0xe2,0x54,0x49,0xf0,0x00,0xd6,0xc9,0xfd,0x38,0x60,0x19,0x9d, 0x8e,0x4d,0x39,0xca,0xee,0x5a,0xe3,0xef,0x64,0x8e,0xa1,0xc2,0xdb,0xb6,0x8e,0xa8,0xb1,0x57,0x19,0x41, 0x5a,0x25,0x4f,0x9d,0xf7,0x4a,0x76,0x95,0x74,0x34,0x15,0xd4,0x93,0xb1,0xec,0x78,0x58,0xfd,0x9e,0xeb, 0x6b,0xad,0x20,0xe4,0xb1,0x2c,0xe0,0x43,0x9f,0x1f,0xbb,0x10,0xf6,0xa4,0x30,0x97,0x10,0x48,0xef,0xe8, 0xf4,0xab,0x63,0x8a,0x33,0x73,0x6e,0x40,0x40,0xcc,0x2e,0xe8,0x2e,0x31,0x5a,0x18,0x42,0xa9,0xc4,0xb1, 0xf1,0x4b,0xc7,0xbb,0x82,0x4b,0xfb,0x5a,0x5e,0x42,0x52,0x86,0x49,0x09,0x46,0x92,0x3a,0x94,0x47,0x51, 0x51,0xd0,0x20,0x05,0x2a,0x5d,0x7c,0x23,0xe7,0x12,0x54,0x98,0x03,0xb0,0xa1,0xd3,0x64,0x63,0x8e,0x7d, 0x4f,0x7a,0xd5,0xe8,0xf9,0x4b,0x69,0x34,0xbb,0x3f,0x3c,0xcd,0x6e,0x2c,0x27,0xbc,0xc2,0x90,0x88,0x94, 0xb2,0x9d,0xae,0x83,0x0f,0xa8,0x24,0xfa,0x03,0x6a,0x0e,0x3a,0xa4,0xa8,0x2c,0x05,0xb8,0xad,0x10,0xaf, 0x28,0x1c,0x0a,0x95,0x8a,0x73,0x2b,0x09,0xd1,0xa9,0x98,0x9c,0xfa,0x8d,0x3a,0x02,0x3c,0xc5,0xa5,0x8b, 0x56,0x13,0xe9,0x4f,0x87,0x7f,0xa3,0x93,0xa4,0x85,0x92,0x14,0x10,0xb5,0x15,0x6b,0x7c,0x67,0xe3,0x39, 0xfd,0x99,0x00,0xd0,0xad,0xc6,0xbf,0xf8,0x51,0xdf,0xee,0xff,0x00,0xa0,0xe2,0x9e,0x43,0xcc,0x3f,0xd9, 0xd2,0x05,0x52,0xa5,0x56,0xe3,0x18,0xf5,0xb4,0x94,0x2d,0xb0,0x21,0xb5,0x8d,0x96,0x96,0xb4,0x15,0xa5, 0x2e,0x14,0xa9,0xc6,0x02,0x7a,0x92,0x9d,0xa8,0x24,0xa8,0x03,0xd2,0x07,0x50,0xde,0xf8,0xce,0x37,0x15, 0x86,0xc2,0x86,0xac,0x08,0x41,0x9d,0xd5,0xb2,0x72,0xf7,0x31,0xa4,0xc9,0x25,0x3b,0x0e,0x3a,0xe4,0xc2, 0xb4,0x64,0x0f,0x89,0xaa,0xb0,0x69,0x51,0xa6,0x47,0x3d,0x20,0xe9,0x6d,0x2f,0xcf,0x8e,0xa1,0xea,0x4f, 0x52,0x7c,0x8f,0x3c,0x26,0x72,0x1e,0x64,0x2a,0xde,0x58,0x58,0xcf,0xb1,0x97,0x1e,0x1c,0x56,0xad,0x16, 0x5c,0x7d,0xf7,0x52,0xdb,0x69,0x1d,0xb6,0x40,0xda,0x94,0x40,0x1e,0xff,0x00,0x53,0xf5,0xe1,0xd3,0x09, 0xc7,0x30,0x65,0xb3,0x5f,0x75,0x8e,0xe3,0x54,0x4c,0x33,0x29,0x84,0x49,0x8c,0xfb,0x15,0xad,0xb2,0xa2, 0x85,0x23,0xa9,0x0a,0xd7,0x4a,0x54,0x9d,0x8d,0x1f,0xa1,0x03,0xc1,0x03,0x84,0x6e,0x45,0xd2,0xd3,0xdc, 0xf2,0xf5,0xf6,0xae,0x2a,0xab,0xec,0x50,0x8b,0x57,0xba,0x51,0x2a,0x32,0x1d,0x09,0xdb,0x4c,0xef,0x5d, 0x40,0xeb,0x7f,0xf8,0x71,0x76,0x28,0xb6,0x34,0xeb,0xa1,0x41,0x02,0x47,0xe6,0xa2,0xbe,0x1b,0xce,0x24, 0x99,0x30,0x7f,0x14,0x42,0x26,0x4d,0x94,0xe6,0x6a,0xed,0x72,0xcf,0x1a,0xf8,0xb8,0x84,0x6b,0xed,0xeb, 0x94,0xae,0x2d,0x70,0xf0,0x7c,0xa1,0x24,0x77,0x5f,0xf2,0x95,0x24,0xf4,0x8d,0x25,0x5a,0xf3,0xa2,0x38, 0x67,0x81,0xc9,0xa5,0xc8,0xae,0x9a,0x72,0x7c,0xfb,0x2c,0xb2,0xb6,0x94,0x90,0x9f,0x8c,0x81,0x39,0x75, 0xcd,0x45,0xd1,0x51,0x05,0x96,0x1a,0x57,0x40,0x3d,0x25,0x20,0x97,0x3b,0x9b,0x29,0xdf,0x8f,0x6e,0x20, 0x57,0x2e,0xb9,0x7c,0xaf,0xc5,0x82,0xe2,0xe7,0xf9,0xd4,0xb1,0xff,0x00,0x0f,0x19,0xa6,0x7c,0x8a,0x9c, 0x7b,0x99,0xd8,0xe6,0x31,0x57,0xc9,0x6c,0x62,0xc2,0x05,0xa9,0x74,0x29,0xc5,0x43,0x84,0x97,0xa5,0xf6, 0xd1,0xdc,0x5f,0x63,0x6a,0x09,0x47,0x6c,0x69,0x5f,0x34,0x00,0xb3,0xe9,0x4f,0x48,0xf5,0xf1,0x97,0x8f, 0x76,0xd2,0xf0,0x8b,0xf7,0xab,0xee,0x23,0x9f,0x5a,0x78,0xb1,0xaf,0xe6,0x76,0x11,0xd6,0xb9,0x71,0x13, 0xcc,0x0a,0x44,0x6d,0x7f,0x11,0x01,0xa4,0xb1,0x68,0xd2,0x3d,0x4a,0x3d,0x4c,0x6f,0xb6,0xff,0x00,0xf5, 0x12,0x3b,0x65,0x2a,0xf1,0xb2,0x38,0xb4,0xac,0xa2,0x8b,0x27,0xe5,0xd6,0x52,0xba,0x89,0xc1,0xf7,0x18, 0xae,0x94,0x89,0x11,0xdc,0x0a,0x6d,0xf6,0x14,0x1b,0x50,0x21,0xc6,0x96,0x02,0xd0,0x76,0x92,0x3d,0x40, 0x6c,0x83,0xad,0xf1,0x67,0xf7,0x75,0xcb,0xef,0xfd,0x45,0xc5,0xff,0x00,0x2f,0xf3,0x4b,0x1f,0xf0,0xf1, 0x0e,0x41,0x8b,0xe3,0x54,0xf8,0x85,0xf3,0xb5,0x18,0xed,0x3d,0x7b,0x82,0xae,0x56,0x97,0x1a,0x13,0x6d, 0x11,0xf2,0x57,0xf5,0x4a,0x47,0x0e,0xc2,0x7b,0x6f,0x92,0x8c,0x16,0x0c,0x8e,0xf4,0xac,0x84,0x75,0xb0, 0xe0,0xb7,0x10,0x68,0x57,0x2f,0xae,0x6a,0x71,0xfe,0x4a,0x54,0xd9,0xdd,0x58,0x47,0xaf,0x88,0x8f,0x88, 0x0a,0x75,0xe7,0x02,0x41,0x3d,0xe7,0x4e,0x92,0x09,0xda,0x94,0x74,0x74,0x91,0xb2,0x75,0xe0,0x6f,0x8f, 0xab,0xec,0x73,0xdc,0xe5,0x63,0xee,0x45,0x00,0xa5,0xa7,0x70,0xeb,0xed,0xfb,0xe6,0x94,0xd8,0x5a,0x0e, 0xbd,0x51,0xa2,0xf8,0x71,0xcd,0xa5,0x41,0x48,0x5a,0xca,0x12,0x74,0x41,0x3c,0x7b,0xcb,0x1c,0x77,0x1f, 0xbb,0xe5,0x75,0x02,0xee,0x68,0xaa,0xec,0x96,0x84,0x3e,0x94,0xaa,0x5c,0x46,0xdd,0x29,0x1f,0x10,0xe1, 0xd7,0xa8,0x1f,0xae,0xf8,0x2a,0xbc,0x0b,0x96,0xc9,0x94,0xdc,0x45,0xe1,0x78,0x92,0x64,0x38,0x85,0x38, 0x86,0x8d,0x64,0x70,0xb5,0xa1,0x25,0x21,0x4a,0x03,0xa3,0x64,0x02,0xb4,0x02,0x7e,0x9d,0x43,0xf3,0x1c, 0x33,0x54,0x36,0x97,0x35,0xcb,0x2c,0x99,0x3d,0xe8,0x70,0x83,0x1c,0x65,0x00,0xfa,0x0e,0xd5,0x76,0x3f, 0x26,0x42,0xa9,0x08,0x97,0x9e,0xe6,0x6e,0xdf,0x29,0xe4,0xc8,0x55,0xaa,0x2c,0x54,0xd2,0x03,0x80,0x27, 0x69,0x4c,0x54,0x9e,0xc0,0x68,0xa8,0x13,0xd0,0x52,0xa3,0xa5,0x11,0xd6,0x78,0x01,0x35,0x5c,0xc7,0xc2, 0x14,0x1b,0xca,0x29,0x7e,0xf5,0xd4,0x36,0x42,0x7e,0xda,0xa1,0x60,0x89,0x08,0x4f,0xa5,0x21,0x4f,0x43, 0xd9,0x56,0xf6,0x56,0xa2,0xa6,0x89,0x00,0x0f,0x09,0xe2,0xcb,0xb8,0x97,0x29,0x9a,0xba,0x66,0x99,0xfc, 0x6b,0x09,0x6e,0xce,0x43,0x65,0xc6,0x61,0xae,0x0c,0x50,0xfb,0x89,0x1d,0x5e,0xa4,0xa0,0x8e,0xa2,0x3d, 0x2a,0xf2,0x07,0xf5,0x4f,0xe4,0x78,0x5b,0xc7,0xb9,0x7f,0x45,0x4b,0x92,0xca,0x8b,0x95,0xe3,0xb8,0xbd, 0x8c,0x7b,0xa9,0xcf,0x0a,0x62,0xd5,0x2c,0x44,0xb7,0x11,0x29,0x2e,0xb8,0x88,0xca,0x09,0x69,0x2b,0x2b, 0x2c,0x27,0xaf,0xb8,0xa2,0xa0,0x4a,0x14,0x9f,0x49,0x4a,0x54,0xf4,0xcf,0x7a,0xd5,0xc5,0x86,0x59,0xa7, 0xad,0xab,0x8a,0x64,0x35,0x18,0xcf,0x6f,0xa9,0x72,0x5e,0x47,0x5c,0xd9,0xd1,0xd8,0xc7,0x9f,0x19,0x5f, 0x0e,0x7a,0xda,0x5f,0x94,0x12,0xfb,0x67,0x4a,0x49,0xf5,0x24,0xf9,0x07,0xa5,0x40,0x11,0xbf,0x6e,0x0b, 0x56,0x5c,0x53,0xe3,0xdc,0xa8,0xa1,0xb2,0xb8,0xb0,0x8f,0x5f,0x0d,0x35,0xcd,0x75,0x38,0xfb,0x81,0x21, 0x4a,0xed,0x6f,0x49,0x04,0xed,0x4a,0x3a,0x3a,0x48,0xd9,0x3a,0xf0,0x37,0xc0,0xae,0x68,0x63,0xf4,0x54, 0xfc,0xae,0xbe,0x55,0x45,0x1d,0x6d,0x79,0x28,0x60,0x13,0x16,0x23,0x6d,0x1f,0xf2,0x86,0xbf,0x84,0x0e, 0x26,0x54,0x1c,0x5d,0xbe,0x53,0x57,0x5f,0xe4,0xd8,0xf4,0x0b,0x66,0x2b,0x31,0xf4,0xc9,0x58,0x7a,0x0b, 0x4f,0x39,0xdb,0x6d,0xae,0xe2,0x92,0x9e,0xbf,0x07,0xd8,0xeb,0x64,0x7f,0x3e,0x35,0xd8,0x2b,0x69,0x4b, 0xd6,0x37,0x1e,0xc2,0xa1,0x50,0xde,0x79,0xb9,0xff,0x00,0x11,0xde,0xab,0xd7,0xcf,0xcf,0x33,0x97,0x00, 0xc2,0x28,0x05,0x35,0x3b,0x87,0x5f,0x6f,0xdf,0x34,0xa6,0xc2,0xd0,0x75,0xea,0x8d,0x17,0xc3,0x8e,0x6d, 0x2a,0x0a,0x42,0xd6,0x50,0x93,0xa2,0x09,0xe1,0x8a,0x37,0x26,0x52,0x69,0x08,0x97,0x9f,0x66,0x6e,0xdf, 0x29,0xe4,0xc8,0x55,0xaa,0x2c,0x54,0xd2,0x03,0x80,0x27,0x69,0x4c,0x54,0x9e,0xc0,0x68,0xa8,0x13,0xd0, 0x52,0xa3,0xa5,0x11,0xd6,0x78,0x51,0x5d,0x5f,0x2e,0x99,0xb4,0x87,0x5b,0x67,0xca,0x6a,0xba,0xd9,0x13, 0x12,0x56,0xcf,0xc4,0xd7,0x56,0x84,0xa9,0x21,0xf8,0xec,0x1f,0x52,0x56,0x46,0xfa,0xa5,0x37,0xa4,0xfb, 0xab,0x4a,0x09,0x05,0x5d,0x29,0x54,0xc6,0xb7,0x93,0x2a,0xbd,0x4d,0x43,0x78,0xde,0x16,0xeb,0xdf,0x0c, 0xfc,0x87,0x5d,0x6e,0x0c,0x45,0x37,0x1c,0x32,0xe3,0x2d,0xa9,0x2e,0x1f,0xea,0xa8,0xa9,0xf4,0xe8,0x11, 0xf4,0x57,0xb6,0x86,0xf2,0x6d,0x5d,0x4b,0x62,0x15,0x4d,0x5c,0xf6,0xd9,0x8f,0x5a,0xb3,0x35,0x7c,0xc6, 0xc2,0x14,0x1b,0xca,0x29,0x7e,0xf5,0xd4,0x36,0x42,0x7e,0xda,0xa1,0x60,0x89,0x08,0x4f,0xa5,0x21,0x4f, 0x43,0xd9,0x56,0xf6,0x56,0xa2,0xa6,0x89,0x00,0x0f,0x09,0xe0,0xc4,0xeb,0xea,0x4c,0x97,0x94,0x99,0x05, 0x8d,0x25,0x8c,0x79,0xf1,0x4d,0x63,0xc7,0xa9,0xa5,0xf9,0x41,0xed,0x93,0xa5,0x24,0xfa,0x92,0x7c,0x83, 0xd2,0xa0,0x08,0xdf,0xb7,0x02,0x19,0xa1,0xe4,0xcb,0xd3,0xd3,0x5e,0xcd,0x36,0x02,0xe4,0xc5,0x2d,0x4d, 0xa6,0x3a,0x23,0x44,0x2e,0x15,0x24,0x80,0xa4,0xf4,0x81,0xbd,0x82,0x40,0x23,0xe9,0xb1,0xc1,0xab,0xec, 0x7e,0x86,0xa3,0x01,0xc9,0x95,0x51,0x47,0x59,0x5e,0xaf,0xb2,0xdf,0x04,0xc5,0x88,0xdb,0x47,0x5d,0xb5, 0x7f,0x08,0x07,0x87,0xe0,0xb5,0xa3,0x94,0x84,0x2c,0x19,0x1d,0xe9,0x39,0x0a,0xcb,0x65,0x81,0x3c,0x41, 0xa0,0x3c,0xbe,0xb9,0xa9,0xc7,0xf9,0x29,0x51,0x67,0x75,0x61,0x1e,0xbe,0x22,0x7e,0x23,0x6e,0xbc,0xe0, 0x48,0x27,0xbc,0xe9,0xd2,0x41,0x3b,0x52,0x8e,0x8e,0x92,0x36,0x4e,0xbc,0x0d,0xf1,0xf4,0x1b,0x0c,0xf7, 0x39,0x58,0x18,0x45,0x00,0xa6,0xa7,0x70,0xeb,0xed,0xfb,0xe6,0x94,0xd8,0x5a,0x0e,0xbd,0x51,0xa2,0xf8, 0x71,0xcd,0xa5,0x41,0x48,0x5a,0xca,0x12,0x74,0x41,0x3c,0x7b,0xcb,0x1c,0x77,0x1f,0xba,0xe5,0x75,0x02, 0xee,0x68,0xaa,0xec,0x96,0x94,0x3e,0x94,0xaa,0x5c,0x46,0xdd,0x29,0x1f,0x10,0xe7,0x8f,0x50,0x27,0xdf, 0x7f,0xef,0xe2,0x3a,0x7a,0x2e,0x5b,0x5a,0x09,0x2f,0xfe,0xed,0x28,0xe1,0xc1,0x8f,0x2a,0x44,0x43,0x36, 0x55,0x64,0x24,0xb4,0xa7,0x19,0x7d,0x4c,0x28,0x0d,0x12,0xad,0x15,0xa1,0x5a,0xda,0x46,0xfc,0x7b,0x6f, 0x5c,0x16,0xa7,0xe1,0xae,0x6b,0xb3,0x2c,0x99,0x3d,0xe8,0x70,0x43,0x1c,0x65,0x00,0xfa,0x0a,0x66,0x8d, 0xc9,0x84,0xaa,0x97,0x52,0xf3,0xcc,0xcd,0xdb,0xe5,0x3c,0x99,0x0a,0xb5,0x45,0x8a,0x9a,0x40,0x70,0x04, 0xed,0x29,0x8a,0x93,0xd8,0x0d,0x15,0x02,0x7a,0x0a,0x54,0x74,0xa2,0x3a,0xcf,0x00,0x26,0xab,0x98,0xf8, 0x42,0x83,0x79,0x45,0x2f,0xde,0xba,0x86,0xc8,0x4f,0xdb,0x54,0x2c,0x11,0x21,0x09,0xf4,0xa4,0x29,0xe8, 0x7b,0x2a,0xde,0xca,0xd4,0x54,0xd1,0x20,0x01,0xe1,0x3c,0x78,0x69,0x39,0x2d,0xdf,0x75,0xa3,0x53,0xcb, 0xf0,0xe3,0x20,0x97,0x51,0xf0,0xf1,0x36,0x80,0x00,0x51,0x2a,0x1f,0x4f,0x0a,0x49,0xf3,0xf4,0x50,0x3f, 0x5e,0x09,0x42,0xc1,0x39,0x69,0x3a,0x2b,0x72,0xe1,0x61,0xd8,0x8c,0x98,0xee,0x8e,0xa6,0xdd,0x66,0xb2, 0x3a,0xd0,0xb1,0xf9,0x82,0x13,0xa3,0xc4,0x77,0x72,0x2d,0x3a,0xc3,0x2c,0xd5,0x09,0x69,0xd4,0xc8,0x6a, 0x96,0x6d,0xf5,0x26,0x4b,0xca,0x4c,0x82,0xc6,0x92,0xc6,0x3c,0xf8,0xa6,0xb1,0xe3,0xd4,0xd2,0xfc,0xa0, 0xf6,0xc9,0xd2,0x92,0x7d,0x49,0x3e,0x41,0xe9,0x50,0x04,0x6f,0xdb,0x80,0xbc,0xbe,0xb9,0xa9,0xc7,0xf9, 0x29,0x51,0x67,0x75,0x61,0x1e,0xbe,0x22,0x7e,0x23,0x6e,0xbc,0xe0,0x48,0x27,0xbc,0xe9,0xd2,0x41,0x3b, 0x52,0x8e,0x8e,0x92,0x36,0x4e,0xbc,0x0d,0xf0,0x7a,0xf7,0x1f,0xa1,0xa7,0xc0,0x32,0x65,0x54,0x51,0xd6, 0x57,0xab,0xec,0xb7,0xc1,0x31,0x62,0x36,0xd1,0xd7,0x6d,0x5f,0xc2,0x01,0xe1,0x2f,0x15,0x67,0x1b,0x3c, 0xb0,0xc3,0x9b,0xbb,0xc4,0xe3,0xe4,0x12,0x6c,0x64,0xc8,0x85,0x15,0x06,0x24,0x77,0x56,0x92,0x15,0x25, 0xf3,0xea,0x79,0x43,0xa4,0x74,0xb2,0xbf,0xaf,0xbe,0xbc,0x71,0xb2,0xa1,0x5b,0x49,0x3d,0x63,0x70,0xec, 0x6a,0x16,0xdd,0xe7,0x97,0xde,0x0f,0x71,0x45,0xab,0xe7,0xe7,0x99,0xcb,0x80,0x61,0x14,0x02,0x9a,0x9d, 0xc3,0xaf,0xb7,0xef,0x9a,0x53,0x61,0x68,0x3a,0xf5,0x46,0x8b,0xe1,0xc7,0x36,0x95,0x05,0x21,0x6b,0x28, 0x49,0xd1,0x04,0xf0,0xc5,0x1b,0x93,0x29,0x34,0x84,0x4b,0xcf,0xb3,0x37,0x6f,0x94,0xf2,0x64,0x2a,0xd5, 0x16,0x2a,0x69,0x01,0xc0,0x13,0xb4,0xa6,0x2a,0x4f,0x60,0x34,0x54,0x09,0xe8,0x29,0x51,0xd2,0x88,0xeb, 0x3c,0x04,0x91,0x8d,0x72,0x9e,0x23,0x09,0x72,0xd7,0x14,0xc2,0xeb,0x17,0xe8,0x0e,0x35,0x2e,0x1c,0x34, 0x29,0xb5,0x2b,0x41,0x29,0x56,0x81,0x1b,0x25,0x49,0x1e,0x09,0xde,0xc6,0xb7,0xb1,0xc7,0x50,0x71,0x9e, 0x50,0x4f,0x96,0xdc,0x68,0x34,0x18,0x2c,0xa9,0x0e,0xb7,0xdd,0x6d,0xa6,0x61,0xc5,0x5a,0xd6,0x8f,0xe2, 0x00,0x0d,0x91,0xfa,0xf1,0x8d,0x6b,0x22,0xd5,0xa1,0x0a,0xa6,0xae,0x7b,0x6c,0xc7,0xad,0x43,0x31,0xce, 0x62,0xe1,0x0a,0x0d,0xe5,0x14,0xbf,0x7a,0xea,0x1b,0x21,0x3f,0x6d,0x50,0xb0,0x44,0x84,0x27,0xd2,0x90, 0xa7,0xa1,0xec,0xab,0x7b,0x2b,0x51,0x53,0x44,0x80,0x07,0x84,0xf0,0x62,0x75,0xf5,0x26,0x4b,0xca,0x4c, 0x82,0xc6,0x92,0xc6,0x3c,0xf8,0xa6,0xb1,0xe3,0xd4,0xd2,0xfc,0xa0,0xf6,0xc9,0xd2,0x92,0x7d,0x49,0x3e, 0x41,0xe9,0x50,0x04,0x6f,0xdb,0x80,0x35,0x54,0xfc,0xa5,0xb0,0xbd,0x9d,0x4c,0xde,0x17,0x8c,0x33,0x2a, 0x24,0x84,0xc7,0x48,0x7a,0xaa,0x32,0x44,0x95,0x14,0xad,0x47,0xb5,0xe3,0x6b,0xd7,0x65,0xe0,0x7c,0x02, 0x0b,0x2e,0x78,0xd0,0xdf,0x1e,0xca,0xb7,0xe5,0x92,0x30,0xdc,0xa2,0x0e,0x32,0xfe,0x2d,0x1a,0x62,0x6b, 0xdd,0x68,0x37,0x0f,0xb0,0xd2,0x9d,0xeb,0x8c,0x1d,0x49,0x6f,0xa7,0x45,0xc4,0x94,0x38,0x92,0x14,0x9d, 0x8f,0x71,0xbd,0x83,0xaa,0x74,0xf6,0xb6,0x72,0x90,0x85,0x83,0x23,0xbd,0x27,0x20,0x11,0x65,0x81,0x3c, 0x41,0xae,0xb9,0x7d,0x73,0x53,0x8f,0xf2,0x52,0xa2,0xce,0xea,0xc2,0x3d,0x7c,0x44,0xfc,0x46,0xdd,0x79, 0xc0,0x90,0x4f,0x79,0xd3,0xa4,0x82,0x76,0xa5,0x1d,0x1d,0x24,0x6c,0x9d,0x78,0x1b,0xe3,0xe8,0x16,0x39, 0xee,0x72,0xa0,0x30,0x8a,0x01,0x4b,0x4e,0xe1,0xd7,0xdb,0xf7,0xcd,0x29,0xb0,0xb4,0x1d,0x7a,0xa3,0x45, 0xf0,0xe3,0x9b,0x4a,0x82,0x90,0xb5,0x94,0x24,0xe8,0x82,0x78,0xf7,0x96,0x38,0xee,0x3f,0x75,0xca,0xea, 0x05,0xdc,0xd1,0x55,0x59,0x29,0x28,0x7d,0x29,0x54,0xb8,0x8d,0xbc,0x52,0x3e,0x21,0xc3,0xaf,0x50,0x24, 0x79,0xdf,0xfb,0xf8,0x1b,0x68,0xcf,0x29,0x2b,0xdf,0x75,0x89,0x5c,0xbe,0xa5,0x0e,0x34,0x99,0x8a,0x5a, 0x45,0x2c,0x62,0x41,0x8c,0x9e,0xb2,0x9f,0x6f,0x75,0xa3,0x6a,0x40,0xfa,0x80,0x77,0xaf,0x6e,0x0f,0x53, 0xf0,0xc6,0x73,0xb1,0x59,0x32,0x7b,0xd0,0xe1,0xee,0xf2,0xca,0x27,0xd0,0x7e,0x29,0xd2,0x3f,0x26,0x52, 0xaa,0x5d,0x4b,0xcf,0x33,0x37,0x6f,0x94,0xf2,0x64,0x2a,0xd5,0x16,0x2a,0x69,0x01,0xc0,0x13,0xb4,0xa6, 0x2a,0x4f,0x60,0x34,0x54,0x09,0xe8,0x29,0x51,0xd2,0x88,0xeb,0x3c,0x00,0x9a,0xae,0x63,0xe1,0x0a,0x0d, 0xe5,0x14,0xbf,0x7a,0xea,0x1b,0x21,0x3f,0x6d,0x50,0xb0,0x44,0x84,0x27,0xd2,0x90,0xa7,0xa1,0xec,0xab, 0x7b,0x2b,0x51,0x53,0x44,0x80,0x07,0x84,0xf0,0x02,0xbd,0xee,0x51,0x5a,0x26,0xab,0xec,0x5e,0x5e,0x51, 0x5a,0x3f,0x63,0x56,0xab,0x43,0x1e,0x3d,0x7c,0x0e,0xe4,0x56,0x52,0x19,0xd8,0x78,0x2d,0x69,0x08,0x57, 0xcf,0x48,0xd6,0xcf,0xb2,0xbf,0x2e,0x2e,0x57,0x35,0xc9,0x5b,0x27,0x68,0x99,0xae,0xc6,0x31,0x19,0x6f, 0xdd,0x2c,0x21,0x86,0x5a,0xad,0x8a,0x5d,0x67,0xfc,0x5d,0xc7,0xf6,0xea,0x3f,0x12,0x00,0x4b,0x64,0x1f, 0x1b,0x0a,0x29,0x04,0x79,0xd8,0x9a,0xed,0xc4,0x75,0x86,0x59,0xa7,0xa5,0xb6,0x53,0x21,0xa8,0x86,0x7d, 0x7d,0x4b,0x92,0xf2,0x3a,0xe2,0xce,0x8e,0xc6,0x3c,0xf8,0xca,0xf8,0x73,0xd6,0xd2,0xfc,0xa0,0x97,0xdb, 0x3a,0x52,0x4f,0xa9,0x27,0xc8,0x3d,0x2a,0x00,0x8d,0xfb,0x70,0x5a,0xb2,0xe2,0x9f,0x1e,0xe5,0x45,0x0d, 0x95,0xc5,0x84,0x7a,0xf8,0x69,0xae,0x6b,0xa9,0xc7,0xdc,0x09,0x0a,0x57,0x6b,0x7a,0x48,0x27,0x6a,0x51, 0xd1,0xd2,0x46,0xc9,0xd7,0x81,0xbe,0x06,0x73,0x42,0x82,0x86,0xa3,0x95,0x37,0xca,0xa9,0xa3,0xac,0xaf, 0x57,0x4c,0x71,0xd5,0x16,0x23,0x6d,0x1d,0x7c,0x43,0x7f,0xc2,0x01,0xe2,0x07,0x17,0x89,0xb7,0x82,0x63, 0x8e,0xe4,0xd8,0xdc,0x5b,0x62,0x9a,0x40,0xb6,0x4b,0xb0,0x1a,0x7d,0x4a,0xed,0xb4,0x95,0xf6,0x53,0xd7, 0xee,0xa5,0x75,0x1e,0x91,0xec,0x7a,0x4f,0x91,0xe3,0x7a,0xac,0x10,0xe9,0x2a,0x39,0x8d,0xc7,0xb0,0xa8, 0x96,0x7c,0xf3,0x7f,0xe4,0x77,0xae,0xeb,0xe7,0xe7,0x99,0xcb,0x80,0x61,0x14,0x02,0x9a,0x9d,0xc3,0xaf, 0xb7,0xef,0x9a,0x53,0x61,0x68,0x3a,0xf5,0x46,0x8b,0xe1,0xc7,0x36,0x95,0x05,0x21,0x6b,0x28,0x49,0xd1, 0x04,0xf0,0xc5,0x1b,0x93,0x29,0x34,0x84,0x4b,0xcf,0xb3,0x37,0x6f,0x94,0xf2,0x64,0x2a,0xd5,0x16,0x2a, 0x69,0x01,0xc0,0x13,0xb4,0xa6,0x2a,0x4f,0x60,0x34,0x54,0x09,0xe8,0x29,0x51,0xd2,0x88,0xeb,0x3c,0x67, 0x52,0xed,0x79,0x1d,0x1c,0x5f,0x19,0x18,0x6e,0x38,0xd7,0xd8,0xb5,0xcc,0x58,0x2f,0xb9,0x57,0x11,0x06, 0x52,0x1d,0x69,0x6e,0xa1,0x0c,0x05,0x6b,0xad,0x7d,0x28,0xd6,0x8e,0xbc,0x90,0x37,0xf9,0x30,0x41,0xa2, 0xe5,0x93,0xf2,0x6d,0x58,0x9b,0xcb,0xaa,0x2a,0xb7,0x6a,0xa3,0xb7,0x2a,0x52,0x65,0x55,0x44,0x21,0x2d, 0x2c,0x39,0xd2,0xbe,0xa6,0xca,0xd3,0xff,0x00,0x92,0x5e,0xc6,0xf6,0x35,0xbd,0x68,0x82,0x72,0x2d,0xde, 0xb7,0x64,0x40,0x53,0x56,0xb2,0x33,0x9e,0xb5,0x3c,0xd5,0xf3,0x1b,0x08,0x50,0x6f,0x28,0xa5,0xfb,0xd9, 0x50,0xd9,0x09,0xfb,0x6a,0x85,0x82,0x24,0x21,0x3e,0x94,0x85,0x3d,0x0f,0x65,0x5b,0xd9,0x5a,0x8a,0x9a, 0x24,0x00,0x3c,0x27,0x85,0xfe,0x72,0x5f,0xd2,0xe4,0x9c,0xac,0xaf,0xb2,0xa3,0xb2,0x8f,0x3e,0x2a,0xec, 0xdb,0x3d,0x4d,0x2b,0xca,0x09,0x69,0xd3,0xa5,0x24,0xfa,0x92,0x7c,0x83,0xd2,0xa0,0x08,0xdf,0xb7,0x06, 0x28,0xaa,0x79,0x43,0x6b,0x4a,0xdd,0x99,0xc4,0x71,0x38,0x00,0x84,0x77,0xa3,0xcd,0xad,0x8a,0xd3,0xd1, 0xd4,0xb7,0x54,0xca,0x50,0xe2,0x7c,0xf4,0xa8,0xba,0x85,0xb6,0x3c,0xe8,0xa9,0x24,0x02,0x75,0xc2,0x7f, 0x33,0xe5,0xf2,0xfe,0x6f,0x2f,0x2b,0xe4,0xe1,0x23,0x1f,0x48,0x7e,0x53,0x0e,0xf4,0xd7,0xb4,0xdb,0x6e, 0x86,0xd4,0xd2,0xc8,0xea,0x42,0x40,0x52,0x3d,0xff,0x00,0x0a,0x80,0x20,0xf8,0x3c,0x6b,0xff,0x00,0x0f, 0xb5,0xbf,0xe6,0x0a,0xc1,0x60,0x93,0x50,0x6a,0xd2,0xb8,0x6c,0x09,0x91,0x15,0x7b,0x94,0x39,0x1d,0x3e, 0x2d,0xcb,0x69,0xf6,0xd7,0xb2,0x97,0x16,0x1a,0x6c,0x94,0x82,0xe8,0x61,0x6e,0x04,0xa8,0xa1,0xad,0x6f, 0xa1,0x2a,0x29,0x1f,0x4d,0xeb,0x5b,0xd0,0xfa,0xf0,0x76,0xda,0xea,0x93,0x2a,0x80,0xd8,0x5d,0x05,0xc5, 0x95,0x72,0x8a,0x9c,0x8e,0xf8,0xc5,0xec,0x9d,0xe9,0x25,0xb2,0x10,0xfb,0x4b,0x4b,0x00,0xa5,0x69,0x51, 0x20,0x74,0x10,0x74,0x76,0x16,0x93,0xe3,0x88,0x3f,0x67,0x7f,0xf9,0x19,0x38,0x03,0xe4,0xcf,0x70,0x7f, 0xf4,0xda,0xe0,0xba,0x70,0xd4,0x54,0x4c,0x5c,0xfc,0x1a,0xd6,0x56,0x23,0x31,0x47,0x6a,0x6a,0x1a,0x52, 0xa8,0x2e,0x9d,0x01,0xf3,0x22,0xab,0xe5,0x9f,0x6f,0x74,0x74,0x28,0xef,0xf1,0x70,0xad,0x79,0xad,0x0d, 0x49,0xf7,0xc8,0x69,0xeb,0x5c,0xd2,0x43,0x9c,0x34,0x8e,0x91,0x55,0x21,0xe5,0x59,0x75,0x32,0x93,0x1a, 0x96,0xc3,0x29,0x95,0x09,0x67,0x41,0xbb,0xac,0x16,0xd2,0x6a,0xe3,0xf8,0x27,0xd2,0xea,0x43,0x4e,0x29, 0x1e,0x02,0x7d,0x65,0xd5,0x6c,0x8f,0x56,0xbc,0x8a,0x73,0xac,0xac,0x72,0x64,0xa1,0xdc,0xc9,0xcc,0xca, 0xc5,0x95,0x29,0x2b,0x35,0x2c,0x61,0xd6,0x71,0x20,0x84,0xf8,0x25,0x2b,0x6d,0x2d,0xad,0x4e,0x2b,0x63, 0x47,0xb8,0xe3,0x8d,0xf9,0xf0,0x83,0xc3,0xbd,0x67,0x30,0xb3,0x6a,0xf6,0x9c,0x89,0x7b,0x82,0xae,0xdd, 0xf4,0x23,0x6d,0x4d,0xa3,0x98,0xc2,0x59,0x7b,0xc9,0x00,0x29,0xb9,0x0e,0x36,0xb6,0xd5,0xa0,0x09,0x03, 0xac,0x0d,0xf8,0x27,0x81,0x13,0x9f,0xe6,0x16,0x5c,0x90,0x6f,0xae,0x53,0x8b,0x56,0x2f,0xcf,0xd9,0xb4, 0x8e,0x75,0x49,0x5a,0x7d,0x27,0x4e,0xcb,0x50,0xd8,0xfe,0xb2,0x4a,0x5a,0x48,0xfa,0x10,0xe1,0xe2,0x37, 0x6b,0x28,0xbb,0x8b,0x7d,0x44,0x4f,0xd8,0x4d,0x58,0xa8,0xe5,0xa3,0x6d,0x0e,0xc7,0xf3,0xdc,0x66,0x1d, 0x94,0x5c,0x61,0xc4,0x4b,0x87,0x3d,0x11,0xd3,0xd9,0xaf,0x6e,0x8a,0x73,0x2b,0x42,0x42,0x4e,0xd2,0x96, 0x94,0xc8,0x21,0x09,0x00,0x68,0x8f,0xa0,0xde,0x93,0xed,0xc2,0xef,0x27,0xef,0xeb,0x31,0xce,0x5a,0x58, 0xd9,0x5c,0x39,0x21,0x98,0x4d,0xd8,0x39,0xdc,0x75,0xb8,0xae,0xbc,0x10,0x3b,0x4d,0x9d,0xab,0xb6,0x95, 0x14,0x8f,0x1e,0xe4,0x6b,0xf5,0xe3,0x46,0xc4,0x71,0xca,0x4c,0x71,0x95,0x46,0xa5,0xad,0x62,0x18,0x70, 0x85,0x3c,0xb4,0x8d,0xb8,0xf2,0xbf,0x89,0xc7,0x0e,0xd4,0xe2,0xbc,0x9f,0x52,0x89,0x3c,0x26,0xfe,0xce, 0xfe,0x30,0x89,0xe7,0xcf,0xf9,0xc5,0x5e,0x47,0xd3,0xe5,0xb7,0xc5,0x98,0x6d,0x69,0xb4,0xdb,0xc5,0x41, 0xdb,0x23,0xd7,0xf5,0xa9,0xb2,0x03,0x0c,0xab,0x60,0xfb,0x1f,0xc5,0x75,0x77,0x63,0x82,0x67,0x94,0xcd, 0x35,0x61,0x8f,0x5d,0x5f,0x57,0xbc,0x3a,0x99,0x75,0xbc,0x66,0xc1,0x63,0x44,0xf9,0x53,0x6e,0x21,0x8e, 0xa4,0xfb,0x7e,0x24,0x9d,0xfe,0xba,0x3c,0x66,0xb4,0x7c,0xb3,0xfb,0xad,0x96,0x26,0xf7,0x0d,0xc8,0xb3, 0xda,0xb6,0x90,0xa0,0x7e,0x19,0xfc,0x2e,0xcd,0xce,0xb1,0xf5,0x43,0x8a,0x6d,0x0d,0x95,0xa0,0xfe,0x5a, 0xf6,0xd7,0x9e,0x36,0x07,0x31,0x04,0xd7,0x58,0xae,0xdb,0x0d,0xb3,0x77,0x17,0xb1,0x71,0x7d,0xc7,0x04, 0x66,0xc2,0xe1,0xc8,0x56,0xfd,0xdd,0x8a,0x74,0x82,0x7d,0xf6,0xa4,0xf4,0xac,0xff,0x00,0x17,0x06,0x62, 0x73,0x07,0x38,0x87,0x5e,0xec,0x5b,0x4e,0x5f,0xaa,0xc6,0xcd,0x00,0x06,0xe4,0xd6,0x58,0x30,0x88,0x2f, 0x7d,0x36,0x43,0xcb,0x4b,0xcd,0xfe,0xa3,0xa1,0x67,0xf2,0x2a,0xf1,0xc2,0x70,0x33,0x56,0xcd,0xb6,0x4b, 0x4c,0x42,0x9e,0xa0,0x9f,0xf7,0x55,0x5f,0xb6,0xcc,0x7f,0xa9,0x66,0x91,0xd0,0xdd,0x6c,0xb9,0xcd,0x5a, 0xe6,0x6c,0xe6,0x39,0x14,0xe6,0xdc,0xeb,0x65,0x32,0xb1,0x3b,0x16,0xe1,0x46,0x57,0xd3,0xb3,0x1c,0x31, 0xd2,0x92,0x35,0xe1,0x4b,0x2b,0x58,0xfe,0x2f,0x3c,0x1e,0x7b,0x31,0xc7,0xf2,0x7c,0x0b,0x28,0x6e,0x92, 0x4c,0xa7,0xcc,0x6a,0xf9,0x28,0x78,0xae,0x03,0xed,0x25,0xb5,0x06,0xce,0xd0,0xa5,0x2d,0x09,0x01,0x5e, 0x7f,0x09,0xf3,0xe7,0x8e,0xec,0x2a,0x32,0x2c,0xbd,0xce,0xee,0x7d,0x74,0x1d,0x86,0x4e,0xc5,0x1d,0x5a, 0xd4,0xcc,0x20,0x3f,0x27,0x57,0xfd,0x24,0x8f,0xa7,0xe2,0xe8,0x49,0xf3,0xe8,0xe0,0xae,0x49,0x1a,0x25, 0x77,0x2c,0x6f,0x22,0x44,0x8e,0xcc,0x58,0xec,0xd5,0xbc,0xd3,0x6d,0x32,0x80,0x84,0x20,0x74,0x28,0x00, 0x12,0x90,0x00,0x1e,0x7d,0x87,0x03,0x8b,0x7a,0xd5,0xcc,0xb4,0x82,0x4b,0x6e,0x1f,0x1d,0x69,0x77,0xd1, 0x96,0xc3,0x48,0x8e,0x29,0x6b,0x0b,0xc8,0xaa,0x71,0x9e,0x49,0x52,0x59,0x5d,0x39,0x21,0x98,0x69,0x12, 0x7b,0x8e,0xb5,0x15,0xd7,0x82,0x07,0x7d,0xcf,0x2a,0x2d,0xa4,0xf4,0x0f,0x3e,0xe7,0xff,0x00,0x1e,0x23, 0xb2,0xb9,0xc2,0xf3,0x3a,0xd8,0xeb,0x91,0x47,0x7f,0x71,0x18,0x9e,0xf4,0x59,0x0c,0x63,0x76,0x2a,0x29, 0xf6,0xd3,0x8c,0xba,0x86,0x76,0x93,0xe3,0xf1,0x25,0x40,0xf8,0xe0,0xc7,0x27,0xd4,0x95,0xf2,0x9a,0x95, 0x20,0xfe,0x1f,0x88,0x4a,0xbf,0x4f,0x9e,0xe1,0xff,0x00,0xb0,0xf1,0x12,0xb1,0x11,0x59,0x3d,0xcb,0x5c, 0x2e,0xd2,0x4e,0x2b,0x64,0xe2,0xba,0xdc,0x4c,0x44,0x75,0xc3,0x90,0xaf,0xcd,0xe8,0xc7,0x68,0x56,0xff, 0x00,0x89,0x3d,0x0a,0xfe,0xd7,0xb7,0x01,0xaa,0xb5,0xa1,0x9e,0xfe,0x24,0x83,0x27,0x9f,0xad,0x77,0x0c, 0x3f,0x95,0x58,0xf6,0x1d,0xab,0x3a,0xb3,0xc7,0x72,0x65,0x4d,0x5a,0xaa,0x39,0x87,0xcd,0x58,0xf1,0x0f, 0xe0,0x6a,0x5e,0x33,0x6f,0x21,0x68,0xff,0x00,0x6c,0x25,0x1b,0x1f,0xcc,0x13,0xe3,0xdc,0xf0,0x42,0x8e, 0x86,0xad,0xa8,0xa9,0x39,0xac,0x9e,0x61,0xe6,0x4e,0x25,0x5d,0x41,0xbb,0x5c,0x76,0xd1,0x50,0x92,0xa1, 0xd6,0x01,0x11,0xd4,0xca,0x92,0x4f,0x4a,0x87,0xf4,0x85,0x7e,0x40,0x29,0x29,0xe3,0x4f,0x8b,0xcc,0x2c, 0xda,0x0c,0x17,0xe3,0xdb,0xf2,0xf9,0xcb,0x5b,0x06,0xd3,0xf2,0x64,0x53,0xd8,0x30,0x98,0xd2,0x0f,0xf6, 0x92,0xfb,0x88,0x71,0xaf,0x3e,0xe0,0x07,0x07,0xbf,0xa8,0xf0,0x1e,0xd6,0xbf,0x2d,0xcc,0x42,0xfe,0xfb, 0x5e,0x98,0xb5,0xab,0xd8,0xfb,0x12,0x8d,0xd5,0xb2,0xc1,0x49,0xea,0x1f,0x3a,0x47,0x87,0x5e,0xf0,0x50, 0x74,0x9e,0xd2,0x76,0x92,0x08,0x50,0x3e,0x56,0xfe,0x02,0x2e,0xfd,0xdf,0xb4,0x4d,0x30,0x06,0x78,0x05, 0x7a,0x55,0xcc,0x23,0x3b,0xc6,0xb2,0x0b,0xf7,0xaa,0x6a,0x24,0xce,0x7e,0x6c,0x55,0xf4,0xc9,0x6d,0x75, 0x92,0x5a,0xec,0x1d,0x12,0x03,0x8a,0x5b,0x61,0x28,0x3e,0x93,0xf8,0x88,0xde,0x88,0x1e,0x75,0xc2,0x27, 0x29,0x32,0x4a,0x8c,0x5b,0x95,0xd3,0x6c,0xae,0xde,0x7d,0x88,0x69,0xb4,0x73,0xad,0xe4,0x44,0x75,0xe4, 0x23,0xe5,0x35,0xe5,0x5d,0xb4,0x2b,0xa4,0x6c,0x8f,0x7e,0x35,0x6c,0x6e,0x1d,0x6d,0x2c,0x44,0x45,0xaf, 0x83,0x16,0xbe,0x03,0x01,0x4a,0x4b,0x11,0x9a,0x0d,0xb6,0xd8,0xd9,0x51,0xd2,0x52,0x00,0x1b,0x24,0x9f, 0x6f,0x72,0x78,0x41,0xfd,0x9e,0xbc,0xe0,0x13,0x00,0xff,0x00,0x4a,0x39,0xff,0x00,0x74,0xd7,0x17,0xe2, 0x1b,0x47,0x4e,0xba,0x54,0x10,0xb2,0x3d,0x7e,0x6a,0x6b,0xfb,0x86,0x62,0x4f,0x58,0x3f,0x8a,0x54,0xcb, 0xd8,0x7b,0x39,0xb2,0x13,0x63,0x64,0x19,0x04,0xbc,0x79,0xd4,0x21,0x51,0xea,0xd7,0x84,0x59,0xbf,0x19, 0x5a,0xe9,0x3d,0x6a,0x2d,0x76,0xfb,0xc0,0xa9,0x3d,0x40,0x2f,0xa8,0x0f,0xa0,0x1c,0x76,0xfd,0x4d,0xeb, 0xd5,0xff,0x00,0x00,0x27,0x58,0x31,0x1c,0x74,0xe9,0x0d,0xf2,0xda,0xd9,0x21,0x01,0x2a,0x04,0x04,0x80, 0xbf,0x03,0x7c,0x3e,0x23,0x12,0x5d,0x2c,0xc5,0x59,0x60,0xd6,0xce,0xe2,0xd2,0xdc,0x50,0x53,0xac,0x30, 0xd8,0x76,0x04,0x83,0xb1,0xb2,0xe4,0x5d,0xf4,0xec,0x81,0xf8,0x90,0x5b,0x56,0xc9,0x25,0x47,0xd8,0x99, 0x8b,0xcc,0x3c,0xe2,0x3d,0x73,0x91,0x6c,0x79,0x76,0xe4,0xcb,0x64,0x04,0xa5,0x12,0x2b,0xec,0xd8,0x10, 0x5e,0x24,0x0f,0x56,0xdc,0x52,0x5e,0x6c,0x03,0xe3,0x5d,0xb5,0x1f,0x07,0x5d,0x5f,0x59,0xb1,0xb2,0xac, 0xb5,0xb0,0x88,0xd0,0x3d,0x8c,0x4f,0x6a,0xa2,0xed,0xb7,0xdd,0x24,0x4d,0x26,0xb7,0x90,0x65,0x2c,0xbc, 0xd2,0xe6,0x4a,0x96,0x58,0x2b,0x05,0x69,0x1c,0xb9,0xb8,0x6d,0x4a,0x4f,0x8d,0x80,0xa2,0xb2,0x01,0x23, 0xeb,0xa3,0xe7,0xfd,0xdc,0x5f,0x19,0xbe,0x39,0x95,0xe2,0x19,0x33,0x34,0x52,0xe5,0xc9,0x31,0xab,0x65, 0x21,0xe5,0xaa,0xbd,0xf6,0x90,0x85,0x86,0x8e,0xd0,0x56,0xe2,0x12,0x02,0xbd,0x43,0xd3,0xbd,0xeb,0xe9, 0xe0,0xf1,0x6e,0xc6,0x93,0x21,0xcb,0x5c,0xef,0x67,0xf7,0x7f,0x13,0x1b,0xa8,0x28,0x52,0x56,0x15,0x33, 0x01,0x3a,0x20,0x80,0xe1,0xdf,0x72,0x46,0xbe,0xbd,0x45,0x28,0xf7,0xf4,0x7d,0x38,0x23,0x7f,0x16,0x34, 0x2e,0x5f,0x5d,0x42,0x83,0x1d,0x98,0xb1,0x99,0xa9,0x90,0x96,0x9a,0x65,0x01,0x08,0x6d,0x21,0xa5,0x78, 0x4a,0x47,0xa4,0x0d,0x78,0xd0,0x1e,0x38,0x5e,0x2b,0xe3,0x9c,0xa4,0x09,0xcb,0x48,0xf6,0x8e,0xb4,0x57, 0xbc,0x4f,0x01,0xcb,0x71,0xc1,0xed,0x4b,0xd8,0x16,0x4b,0x4d,0x8b,0x72,0x4e,0xa6,0xc6,0xf1,0xf7,0xe3, 0x44,0x0e,0x3f,0xd4,0xf2,0x22,0x3a,0xea,0x11,0xf3,0x88,0x1d,0x45,0xb4,0x9e,0x9d,0x92,0x00,0xde,0xb7, 0xbd,0x79,0xe3,0x39,0xce,0x31,0x48,0x7c,0xc7,0x14,0x16,0xf1,0xf3,0x0c,0xea,0xc2,0x24,0x25,0x2d,0xd8, 0xef,0x9c,0x35,0xf9,0x08,0x58,0x51,0x41,0x25,0xa5,0xb3,0x19,0xa4,0xeb,0xe5,0xfb,0xab,0xac,0x7b,0x6b, 0x5a,0xd2,0xb5,0xce,0x4b,0x28,0x1e,0x51,0xd5,0x84,0xfb,0x87,0x5f,0x1e,0x7e,0x87,0xb8,0xaf,0xff,0x00, 0x3c,0x0e,0x56,0x06,0x9a,0x6b,0x27,0x2d,0xb9,0x7b,0x75,0x27,0x0b,0x9c,0xea,0x82,0x9d,0x6a,0x1b,0x69, 0x72,0x04,0x8d,0x74,0x8f,0x9b,0x11,0x5f,0x2f,0x61,0x09,0x52,0x41,0x41,0x42,0x81,0x51,0x51,0x27,0x8a, 0xf3,0xf2,0xad,0x5a,0xcf,0x79,0x3b,0x5a,0x4f,0x3c,0x52,0x31,0x51,0xdf,0x15,0x60,0x71,0x02,0x81,0x0a, 0xef,0x3f,0xe7,0xfe,0x6a,0x9f,0x7f,0x6c,0x3d,0x7f,0xf6,0x7d,0x9d,0xfe,0xed,0xf0,0xad,0x5d,0x81,0x08, 0x3c,0xcd,0x91,0x9b,0x33,0x91,0x73,0x0c,0x3c,0xf3,0x41,0xbf,0x4e,0x0f,0x27,0xbf,0xfd,0x12,0x11,0xe5, 0x66,0x29,0x68,0x8f,0x4f,0xd1,0xa1,0xe3,0xea,0x0f,0x93,0xb1,0x42,0xe6,0x47,0x32,0x22,0x54,0xbf,0x16, 0xdb,0x96,0xac,0xd8,0xdc,0xb2,0x5a,0x0d,0x48,0xac,0xb8,0x69,0xaa,0xf9,0x01,0x44,0x75,0xac,0x97,0x4f, 0x79,0xa0,0x90,0x55,0xe3,0xb6,0xe6,0xca,0x7d,0xf4,0x41,0xe0,0x04,0xdc,0x5b,0x24,0xcc,0xca,0x5e,0xe6, 0x7e,0x49,0xf6,0x84,0x7f,0x0a,0x14,0x15,0x3d,0x71,0x6a,0xd0,0x47,0x41,0xf5,0x8e,0xae,0xe4,0x8d,0x2d, 0xb0,0xb1,0xdc,0x56,0x82,0x89,0xd0,0x00,0x81,0xc2,0xdf,0x35,0x11,0x09,0x67,0xe0,0xf1,0xc4,0x19,0x1f, 0x14,0xc5,0xb4,0xc4,0xf0,0xb5,0xd5,0x5e,0x67,0x8e,0x64,0xbc,0xb5,0xc8,0x18,0xa2,0xbc,0x9b,0x78,0x58, 0xa9,0x92,0x97,0x25,0xbb,0x05,0xc6,0xfa,0x8f,0x68,0xfe,0x25,0x06,0x90,0xd8,0x3f,0xa0,0x03,0xf9,0x7d, 0x78,0x4e,0xaa,0xbb,0xc1,0xab,0x79,0x79,0x8c,0x9c,0xa6,0xde,0x75,0x4c,0x9e,0xd4,0xc8,0xec,0xba,0xdd, 0x72,0xdd,0x4b,0xed,0x3a,0xf1,0x0e,0xb2,0x76,0xd2,0xdb,0x71,0x2a,0xe9,0x6c,0x94,0xeb,0x7e,0x00,0xe3, 0x56,0xbe,0x87,0x12,0xbf,0x96,0x97,0xd0,0xa0,0x44,0x62,0x1c,0x66,0x6a,0xa4,0xa5,0xa6,0x58,0x6d,0x28, 0x43,0x69,0xed,0xab,0xc0,0x09,0xd0,0x1f,0xea,0x1c,0x00,0xe5,0x8c,0x18,0x36,0x5c,0x9e,0xa9,0x83,0x63, 0x0a,0x3c,0xe8,0x8e,0x87,0xbb,0xac,0x48,0x6c,0x38,0xda,0xc0,0x90,0xe1,0xd2,0x92,0x41,0xdf,0xb6,0xff, 0x00,0xd5,0xbf,0xa7,0x15,0x25,0xcb,0x43,0x4b,0x66,0xe7,0x6e,0xe1,0xf3,0xd0,0xd4,0xc4,0x37,0x9c,0x51, 0xeb,0x07,0xb8,0xa5,0x08,0x78,0x26,0x0f,0x15,0x75,0xed,0xb4,0xd7,0x31,0xc4,0x7a,0xeb,0xa4,0x5c,0xc5, 0x60,0x63,0x13,0x03,0x2d,0x3c,0x95,0xa9,0x61,0x09,0x02,0x18,0xe9,0x6b,0x6a,0x3e,0x84,0xe8,0x7f,0x23, 0xe7,0x83,0x8c,0x56,0x62,0x8c,0xbd,0x35,0xd4,0xc0,0xcf,0xba,0xa6,0x4a,0x8f,0x2d,0xce,0xac,0x5a,0xc3, 0xc2,0xd9,0xb1,0x7a,0x7a,0x40,0xff,0x00,0x15,0xf6,0x2e,0xbe,0xb4,0x9f,0xec,0x04,0x8d,0x83,0xb5,0x1b, 0x75,0xf8,0xc6,0x51,0x85,0x7c,0xce,0x58,0xe4,0xa6,0x1c,0x60,0x36,0x28,0x6e,0x4a,0xe5,0x56,0xab,0xdf, 0xfa,0x33,0xbe,0xeb,0x1e,0x56,0xa5,0x1e,0x85,0x10,0x4e,0xb6,0x35,0xe3,0x83,0xf2,0xf9,0x8d,0xcc,0x59, 0x55,0x4c,0x45,0xa9,0xe5,0x9b,0x35,0xd7,0x2e,0xa9,0xc4,0x38,0xfd,0x95,0xb3,0x2e,0x57,0x46,0xd6,0xfa, 0x16,0x0b,0x47,0xbc,0xe8,0x20,0x0f,0x4f,0x43,0x64,0x75,0x6b,0x7e,0x38,0xcb,0x43,0x6a,0xe0,0x9d,0xff, 0x00,0x71,0x56,0x92,0xea,0x7f,0xb6,0x94,0xf0,0xf1,0x88,0xf2,0xf6,0x23,0xf3,0x52,0xbc,0xe1,0x31,0x5a, 0xae,0x8d,0x11,0xd7,0xac,0x71,0xa9,0xa8,0x6d,0xb6,0x23,0xf7,0x0a,0x14,0xa5,0x08,0xa8,0x03,0xa7,0xba, 0xb0,0x54,0x7d,0x86,0xbf,0x2e,0x2f,0x73,0x13,0x23,0xa7,0xc9,0xb9,0x33,0x6f,0x61,0x4a,0xfb,0xb2,0x62, 0xa9,0xc6,0x02,0x5e,0x54,0x67,0x1b,0x4a,0xb4,0xf2,0x77,0xa2,0xb4,0x8d,0xff,0x00,0xab,0x8e,0xc6,0x0c, 0xbb,0xcb,0x16,0xec,0xf9,0x87,0x7b,0x2b,0x2f,0x96,0x85,0xf5,0xb3,0x1a,0x42,0x43,0x55,0xd1,0xbf,0x1e, 0xbb,0x71,0x53,0xe8,0x51,0xe9,0x57,0x49,0x53,0x9d,0x64,0xe8,0x1d,0xef,0x82,0x9c,0xeb,0xe8,0x6f,0x93, 0xf6,0x48,0x01,0x28,0x1d,0x6c,0x04,0xa5,0x23,0x40,0x69,0xd4,0xfb,0x7e,0x9c,0x57,0xa4,0xb5,0x96,0xcf, 0x40,0xa4,0x93,0x23,0xe2,0xa6,0xcc,0xdd,0xe5,0x9a,0x63,0xa1,0xe9,0x4a,0x18,0x66,0x6f,0x8e,0xe1,0xd8, 0x53,0x26,0xe6,0x61,0xf8,0x87,0xba,0x54,0xc4,0x48,0xe9,0xee,0xc8,0x77,0x4c,0x20,0xf8,0x6d,0x3b,0x20, 0x78,0xd1,0x52,0xb4,0x91,0xb1,0xb2,0x37,0xbe,0x26,0x91,0xcf,0x5c,0x76,0x34,0x38,0xf3,0x64,0xd0,0x5d, 0xb1,0x16,0x4e,0xfb,0x0f,0x38,0xfc,0x04,0xa1,0xcd,0x7b,0xf4,0x93,0x27,0xce,0xbe,0xba,0xe3,0x2a,0xb9, 0xc4,0xf2,0x5b,0x21,0x4b,0x99,0x63,0xd1,0x7e,0xd1,0x4d,0x33,0x41,0xa9,0x31,0x18,0x73,0xa1,0xff,0x00, 0x0d,0x36,0xe7,0x52,0x42,0xb4,0x16,0x35,0xa0,0x42,0x49,0x57,0x90,0x00,0x3c,0x18,0xc4,0xf3,0x2c,0xb3, 0x19,0xc8,0xae,0xb2,0x28,0xfc,0xb8,0xc8,0xe7,0x49,0xbb,0xe8,0xef,0xc6,0x72,0x0c,0xa6,0x51,0x1b,0xa3, 0xc0,0x09,0x70,0x30,0xa2,0xe6,0xff,0x00,0x54,0xa7,0x5e,0xde,0x78,0xd4,0xcb,0xd3,0xac,0x5d,0xc9,0x76, 0x63,0x26,0x4f,0x13,0x1c,0xfb,0x57,0x2c,0x64,0x5c,0x5b,0x48,0x14,0x7a,0x0e,0xd4,0xe9,0xfe,0x10,0xd8, 0x6f,0xfa,0x3a,0xc7,0xfe,0x9d,0x5d,0xfd,0xeb,0x8b,0x15,0xdc,0xf8,0xc6,0xec,0x65,0xa2,0x25,0x75,0x15, 0xcc,0xc9,0x2b,0xfc,0x0c,0xb1,0x2a,0xbd,0x6b,0x57,0xf2,0x02,0x57,0x9e,0x04,0x7e,0xfa,0xf3,0xb0,0x3f, 0xe6,0x7e,0xe7,0xfe,0xb9,0xfd,0xcf,0x80,0x99,0xee,0x7f,0x97,0x66,0xf8,0xa4,0xac,0x62,0xc3,0x96,0x79, 0x05,0x54,0x79,0x6a,0x49,0x5c,0xa6,0x62,0x4a,0x92,0xb4,0x74,0x9d,0x8d,0x36,0xa8,0xed,0x83,0xed,0xfc, 0x43,0x89,0x57,0x4b,0xb6,0x4f,0x2a,0x40,0xf9,0xa6,0x1c,0x8b,0xbf,0xf0,0xad,0x23,0x1b,0xe6,0xfe,0x1b, 0x78,0xf8,0x84,0xb9,0x0f,0xd4,0x4c,0x71,0xc2,0xd3,0x2d,0x58,0x74,0x36,0x1d,0x3b,0x48,0xf4,0x3a,0x95, 0x29,0xa5,0x2b,0x6b,0x03,0xa0,0x2c,0xaf,0x61,0x5e,0x9f,0x1c,0x2f,0x72,0xcf,0x30,0xc7,0xf1,0x0c,0x00, 0xbd,0x77,0x34,0xb4,0xb9,0x16,0x12,0x44,0x68,0xed,0x20,0xba,0xf4,0x85,0x05,0x0d,0x86,0xdb,0x48,0x2a, 0x57,0xb8,0xd9,0xd6,0x86,0xc6,0xc8,0xe1,0x02,0x46,0x2d,0x9a,0x73,0x0f,0x29,0xc7,0x2d,0x46,0x36,0xed, 0x2c,0x5a,0x49,0x2d,0x29,0xd7,0x2c,0x54,0xb6,0x12,0xf2,0x5a,0x53,0x6a,0xd2,0x12,0xb4,0x07,0x36,0xa1, 0xbf,0x3d,0x1d,0x1b,0x04,0x05,0x78,0xf3,0x45,0x78,0xf5,0xbe,0x65,0x8e,0xd1,0xd9,0x62,0x7d,0x13,0x5f, 0xa1,0xb0,0x95,0x22,0x4c,0x60,0xb2,0xd3,0xca,0x4c,0x85,0x36,0x50,0x51,0xd7,0xd2,0x93,0xe1,0xb5,0x6c, 0x15,0x03,0xaf,0xa1,0x27,0x84,0x9c,0x0b,0x2b,0x2b,0xbb,0x83,0x13,0xfa,0x73,0xc7,0xef,0x46,0x2f,0xdc, 0x3e,0x9c,0xd6,0xb2,0xef,0x3d,0x71,0xe6,0x6b,0x99,0xb1,0x7b,0x1e,0xbd,0x6a,0x1b,0xea,0x28,0x69,0xf7, 0x1f,0x80,0x84,0x2d,0x43,0xdd,0x21,0x46,0x4e,0x89,0x1f,0x51,0xc5,0x6f,0xf0,0x86,0xc3,0x7f,0xd1,0xd6, 0x3f,0xf4,0xea,0xef,0xef,0x5c,0x24,0x63,0x39,0x7e,0x5b,0x43,0x97,0xcf,0xcb,0x9b,0xe5,0xd6,0x47,0x2a, 0x6d,0x84,0x56,0xe2,0xbb,0x09,0xc8,0x32,0x90,0x86,0x92,0xdf,0xb2,0xc3,0xc1,0x92,0x56,0x4f,0xd4,0x74, 0x0d,0x7e,0x67,0x86,0x81,0xce,0xac,0xef,0x5a,0xfd,0xcf,0x5c,0xff,0x00,0xd7,0x3f,0xba,0x70,0xf3,0xa5, 0x58,0xff,0x00,0x10,0x4f,0xd6,0x87,0xcc,0x5c,0xf5,0xed,0x45,0x60,0xf3,0xef,0x17,0x9d,0x2d,0xb8,0x90, 0xa9,0xad,0xe4,0xc8,0x74,0xf4,0xb6,0xd3,0x32,0xab,0xd6,0xb5,0x9f,0xc8,0x24,0x4a,0x24,0x9f,0xf5,0x70, 0x56,0x8b,0x9c,0xb8,0x5d,0x84,0xc7,0x62,0x58,0x3d,0x22,0x81,0xc6,0xd6,0xa6,0xc2,0xac,0xcb,0x48,0x69, 0x4a,0x48,0xd9,0x48,0x75,0x0b,0x5b,0x61,0x43,0xdb,0xa5,0x4a,0x0a,0xdf,0x8d,0x70,0x81,0x98,0xf3,0x27, 0x31,0xcb,0x31,0x6b,0x1c,0x6a,0x6f,0x2b,0x6f,0xeb,0xa3,0xd8,0x34,0x5a,0x72,0x53,0x31,0xa5,0xbe,0xb6, 0xc7,0xe6,0x1b,0x31,0x90,0x15,0xfc,0xba,0x87,0xf3,0xe1,0x33,0x32,0xc6,0xf2,0xdc,0xea,0x86,0x1b,0x66, 0x91,0xea,0x28,0x38,0xfc,0x6f,0x9f,0x3e,0xd1,0x0e,0xb0,0xda,0x9b,0x6d,0x1b,0xea,0xe8,0x2d,0xf7,0x7a, 0xb4,0x0e,0xc2,0x50,0xa0,0x0f,0xf5,0x89,0xd7,0x07,0x6f,0x4d,0xb0,0x1c,0x6e,0x31,0xf5,0xae,0x36,0x45, 0xd2,0x23,0xf1,0x5a,0x4f,0x20,0xed,0x60,0xd3,0x54,0x65,0x36,0x76,0x05,0xf4,0x46,0x69,0x51,0x54,0xe2, 0x99,0x8e,0xe3,0xdd,0x09,0xd3,0xe4,0x92,0x1b,0x4a,0x88,0x00,0x0f,0x7d,0x68,0x70,0xdf,0x8c,0x66,0x18, 0x15,0x94,0xeb,0x0c,0x9f,0x1a,0x85,0x6f,0x3d,0xf9,0xe1,0xb8,0xd3,0x66,0xd7,0xe3,0xb6,0x0f,0x25,0xe2, 0xc0,0x3d,0x09,0x51,0x43,0x24,0x15,0x00,0xe1,0x1f,0xc5,0xae,0x94,0x92,0x40,0x48,0x0b,0xbf,0xb3,0x31, 0x01,0x9c,0x98,0x02,0x49,0xdc,0x5d,0x78,0xf2,0x7f,0xa6,0xe1,0x96,0xef,0x03,0xac,0x76,0xe5,0x79,0x0e, 0x3f,0x36,0x66,0x2d,0x90,0x7e,0x23,0x65,0x54,0xe0,0x6c,0xbc,0x7a,0xba,0xfe,0x7b,0x7a,0xed,0xbc,0x82, 0xa0,0x0a,0x82,0xd2,0x7a,0xb4,0x36,0x78,0x4f,0xf1,0x03,0x5a,0x4c,0xc2,0x1e,0x47,0x03,0xa7,0xc0,0xa4, 0xe9,0xbb,0xcd,0x81,0xb7,0xdc,0xf7,0x34,0x6c,0xe6,0x15,0xc0,0xff,0x00,0x99,0xf2,0xff,0x00,0x6f,0x7f, 0xba,0x76,0x7a,0xff,0x00,0xed,0xf8,0xa3,0x90,0x5c,0x63,0x77,0xd5,0x6e,0x56,0x5c,0xe3,0x59,0x4c,0xe8, 0x4b,0x71,0xb7,0x1c,0x8e,0xee,0x25,0x66,0x52,0xb5,0x36,0xb4,0xb8,0x9d,0xa7,0xb1,0xea,0x48,0x52,0x12, 0x48,0x3e,0x0f,0xb1,0x07,0xc8,0x32,0xd2,0x66,0xfc,0xcb,0xa4,0xee,0x57,0xe4,0x78,0xb4,0x7c,0xa8,0x21, 0x95,0x18,0xd6,0xd4,0xb2,0x19,0x8c,0xe3,0xaa,0x48,0x48,0x42,0x5f,0x8e,0xf2,0xd2,0x10,0xa5,0x7a,0xd4, 0x56,0x85,0x29,0x23,0x60,0x04,0x70,0x2e,0x6a,0x39,0x8d,0x9c,0x74,0xaf,0x29,0xba,0x18,0x9d,0x3a,0xfa, 0x55,0xf6,0x25,0x03,0xff,0x00,0x3d,0x49,0x25,0x0a,0xe9,0x91,0x33,0x41,0x5f,0xc6,0x95,0x06,0x82,0x41, 0x04,0x79,0x3c,0x65,0x15,0xb0,0xab,0xbf,0x7f,0xdc,0x55,0xa2,0xe5,0xd2,0x62,0x05,0x1d,0xc6,0xb9,0x83, 0x8a,0xda,0x64,0xe6,0x8a,0x24,0xb9,0xe6,0xd1,0xaf,0xe9,0xa2,0x39,0x55,0x25,0xa7,0x5a,0x04,0x0f,0x2b, 0x4a,0xdb,0x1d,0x23,0xd4,0x0e,0xd5,0xa1,0xe7,0x84,0x0e,0x4e,0xe4,0x94,0xf8,0xbf,0x2c,0x66,0x59,0xdd, 0xbc,0xfc,0x68,0x68,0xb5,0x73,0xad,0xe4,0x45,0x75,0xe4,0x23,0xe5,0xb2,0x07,0x51,0x6d,0x2a,0xe9,0xf2, 0x40,0xf3,0xad,0xef,0x8d,0x3f,0x97,0xf8,0xed,0x1e,0x31,0x05,0xba,0xea,0x1a,0xc8,0xd5,0xf1,0x52,0x01, 0x29,0x65,0x1e,0x54,0x40,0x03,0xa9,0x6a,0x3e,0xa5,0xab,0x40,0x0e,0xa5,0x12,0x7c,0x7b,0xf0,0x8b,0xfb, 0x3b,0xeb,0xf7,0x7d,0x38,0x6f,0xcf,0xda,0x8e,0x7f,0xdd,0x35,0xc6,0xae,0x21,0xb6,0x74,0xfb,0xa5,0x64, 0xac,0x8f,0xcd,0x43,0x7f,0x77,0x9d,0x49,0xeb,0x07,0xf1,0x4c,0x35,0x5c,0xc0,0xc7,0xad,0xab,0xd9,0xb0, 0xaa,0x8f,0x91,0xd8,0x42,0x78,0x12,0xd4,0x88,0xb8,0xd5,0x83,0xad,0x2c,0x05,0x14,0x9d,0x29,0x2c,0x10, 0x7c,0x82,0x3d,0xfe,0x9c,0x21,0xe6,0xf8,0xdd,0x46,0x51,0xcc,0x2a,0x4c,0xb1,0x76,0x3c,0xca,0x80,0x9a, 0xe5,0x28,0xbb,0x12,0x3d,0x05,0xba,0x43,0x9b,0x47,0x4e,0x9a,0x58,0x68,0x18,0xfd,0x43,0x49,0x70,0xa3, 0x45,0x43,0x5f,0x85,0x5b,0x57,0x0c,0x72,0x70,0x16,0x6b,0x6c,0x9d,0xb7,0xc0,0xee,0x66,0x61,0x36,0xae, 0x1f,0x9a,0x6b,0xd2,0x95,0x43,0x7c,0x84,0xf4,0x8e,0xf4,0x55,0x7c,0xa5,0xe8,0x29,0x5a,0x3a,0x49,0x0a, 0x51,0x20,0x93,0xc1,0xa8,0x9c,0xc4,0xe6,0x4c,0x0a,0xd9,0x71,0xee,0xf9,0x76,0xc5,0xc5,0x93,0x28,0x0a, 0x8b,0x26,0x9a,0xcd,0x96,0xa2,0x4b,0x24,0xab,0x61,0x69,0x7d,0x41,0xc6,0x34,0x9e,0x80,0x7c,0x3b,0xb2, 0x4e,0xb5,0xae,0x32,0x6c,0x0b,0x0d,0xca,0xb4,0x1f,0xa7,0xfa,0xab,0xee,0x9b,0x93,0x11,0x56,0x3e,0xf8, 0x57,0x6b,0x7f,0x64,0x65,0xfa,0xff,0x00,0xd9,0x3b,0x3f,0xee,0xfc,0x05,0x9f,0x9c,0xe3,0x39,0x36,0x2d, 0x93,0xc3,0xa4,0x9b,0x26,0x4c,0x88,0xb5,0x92,0xd3,0x21,0xb3,0x02,0x43,0x65,0x95,0x76,0x96,0x08,0x5f, 0x5a,0x07,0x49,0xd8,0x23,0x47,0x5e,0xdc,0x41,0x67,0x47,0x97,0x66,0xdd,0x7f,0xbc,0x3c,0x93,0xb5,0x58, 0xbe,0xa1,0xf7,0x7e,0x85,0xd5,0xc7,0x88,0xa4,0xe9,0x63,0xa5,0xf7,0xc6,0x9e,0x7b,0x69,0x28,0xd8,0xda, 0x53,0xd4,0x9f,0x03,0x47,0x86,0x1b,0x5a,0xba,0xea,0x7e,0x58,0xe4,0x10,0x2a,0x60,0xc6,0x83,0x11,0xaa, 0xa9,0x5d,0x2d,0x47,0x68,0x21,0x00,0x96,0xd5,0xb3,0xa0,0x3d,0xc9,0x24,0x93,0xee,0x7e,0xbc,0x3b,0x0b, 0xc0,0x19,0x4a,0xa8,0x49,0x32,0x3e,0x3a,0xd2,0x32,0x1a,0xe1,0xb0,0xe4,0x81,0x10,0x69,0x4b,0x0a,0xcd, 0x31,0xbc,0x3f,0x94,0x54,0x12,0x72,0x39,0xaf,0xc1,0x8e,0xbe,0xf8,0x0f,0x7c,0x13,0xce,0x37,0xb3,0x21, 0xdd,0x0e,0xb4,0x20,0x80,0x7c,0x1f,0x49,0x3b,0xf1,0xbe,0x0d,0xd8,0xe4,0x74,0x19,0x05,0x5c,0x77,0x1a, 0x83,0x97,0x14,0x9e,0x89,0x30,0x67,0x45,0xc6,0x2c,0x4a,0x9a,0x59,0x49,0xe9,0x79,0xb5,0xfc,0x39,0x49, 0xda,0x55,0xe7,0x60,0xa5,0x49,0x52,0x92,0xa0,0xa4,0xa9,0x49,0x3c,0x72,0x99,0x86,0x24,0xf2,0x7e,0xa6, 0x33,0xed,0x21,0xe6,0x9d,0x44,0x84,0x3a,0xda,0xd0,0x14,0x95,0xa4,0xbe,0xe0,0x29,0x20,0x82,0x08,0x3e, 0xda,0xfa,0xef,0x5c,0x50,0x67,0x0a,0x9d,0x8c,0x4d,0x5d,0x97,0x2d,0x72,0x07,0xf1,0x97,0x56,0xe1,0x75, 0xda,0xa5,0xa4,0xbf,0x57,0x25,0x44,0x85,0x28,0x29,0x85,0x1f,0x96,0xa5,0x74,0x25,0x3d,0x6d,0x14,0xa8, 0x24,0x68,0x0e,0x19,0xa9,0x9b,0x27,0x39,0xd5,0xe4,0x19,0x3d,0xe8,0x70,0xb7,0x8c,0x65,0x23,0xd8,0x76, 0x15,0xdc,0x09,0x35,0x8e,0x59,0xc4,0xbb,0xc8,0x6b,0xb2,0xab,0x4b,0xa8,0x8b,0x52,0xa3,0x48,0x6f,0x0f, 0xb5,0x61,0xa8,0xc0,0xa1,0x4d,0x94,0xb4,0xdf,0x69,0x5d,0x21,0x49,0x59,0xea,0xea,0x52,0x8a,0x95,0xa2, 0x4e,0x90,0xda,0x51,0x76,0x25,0xf5,0x6c,0x6b,0x39,0x36,0xf6,0x30,0xb2,0xd9,0x12,0xd6,0x16,0x86,0x9d, 0x56,0x23,0x64,0x84,0x45,0x8e,0x15,0xbe,0xd3,0x63,0xb2,0x75,0xbd,0x24,0xad,0x5b,0xda,0xd4,0x01,0x3a, 0x4a,0x5b,0x42,0x2e,0x35,0xcc,0x6e,0x63,0x22,0xab,0xe1,0x24,0xf2,0xd9,0x97,0x6f,0x12,0xf2,0x58,0xf8, 0x86,0x2d,0xd9,0x15,0x8e,0x24,0x80,0x14,0xff,0x00,0x52,0x8f,0x79,0x29,0xea,0x2a,0x3d,0xbe,0xda,0x8e, 0x92,0x3d,0x5e,0x78,0x09,0x23,0x12,0xbb,0xcb,0x5e,0x44,0xbe,0x66,0xe4,0x6e,0x5c,0x8e,0xa4,0xb8,0x9a, 0x58,0x1d,0x51,0x6a,0x99,0x50,0x28,0x3e,0x50,0x93,0xd6,0xf9,0x4a,0xd2,0xa2,0x0b,0xaa,0x3e,0x0e,0xba, 0x47,0x12,0xdc,0x4b,0x28,0x24,0xb7,0xdc,0x55,0x2b,0x72,0xe9,0x31,0x02,0xab,0xe6,0xf9,0x96,0x39,0x96, 0xf2,0x87,0x21,0x7f,0x1e,0x9c,0xec,0xe6,0x51,0xf0,0xe1,0x4e,0x88,0x8e,0xa1,0x00,0xf7,0xda,0xf0,0x54, 0xb4,0x01,0xbd,0x1f,0x6d,0xf1,0xe6,0x4b,0x79,0x8e,0xd7,0x72,0x3a,0x1d,0x5e,0x49,0x6a,0xfd,0x4c,0x7b, 0x5c,0x7b,0xe0,0x84,0xdf,0x80,0x79,0xf6,0xdb,0x2e,0xb2,0xa4,0x03,0xe8,0x4f,0x49,0x20,0x12,0x7a,0x4a, 0x81,0x3a,0xde,0xc7,0x06,0xb9,0xad,0x1a,0x2c,0x1e,0x4b,0x5b,0xc4,0x85,0x19,0x88,0xd1,0x9a,0x4c,0x76, 0xda,0x69,0x96,0xc2,0x1b,0x42,0x43,0xed,0xe9,0x29,0x48,0x00,0x01,0xad,0x78,0x1c,0x15,0xc4,0xda,0x62, 0x5f,0x2c,0xe8,0xa3,0x3c,0xd2,0x1f,0x65,0xda,0xc6,0x9b,0x75,0xb5,0xa0,0x29,0x2b,0x05,0xb0,0x0a,0x48, 0x20,0x82,0x0f,0xb6,0xbe,0xbb,0xd7,0x1b,0x5b,0x95,0x74,0xa5,0x30,0x63,0x71,0xec,0x2a,0x15,0xdd,0xe7, 0x5b,0xdf,0x68,0xef,0x59,0xfc,0xca,0xbc,0x3a,0x74,0x9a,0x5b,0x1c,0x62,0xa2,0xea,0x9e,0x03,0x1d,0xb9, 0x09,0x6e,0xb7,0x09,0x9e,0x19,0x92,0x4c,0xb8,0x32,0x83,0x9d,0x48,0x65,0x29,0xf2,0x98,0x69,0x4f,0x56, 0x88,0xf5,0x83,0xfd,0x5d,0x11,0xcc,0xe3,0x31,0x93,0x2a,0xa1,0xf7,0x65,0x65,0x4a,0xfb,0x0a,0xb4,0xc2, 0xa9,0x2d,0xe0,0x96,0x68,0x5b,0x65,0x2e,0xb2,0xe3,0x4e,0x3a,0xa0,0xdf,0xce,0x23,0xb3,0xa5,0x24,0xe9, 0x2a,0xea,0x24,0x04,0x9d,0x92,0xd4,0xce,0x19,0x3b,0x18,0x98,0xbb,0x1e,0x5a,0xe4,0x0f,0xe3,0x2e,0x2d, 0xc2,0xeb,0xb5,0x4b,0x49,0x7e,0xae,0x4a,0x89,0x0a,0x50,0x53,0x0a,0x3f,0x2d,0x4a,0xe8,0x4a,0x7a,0xda, 0x29,0x50,0x48,0xd0,0x1c,0x1e,0x6b,0x98,0xfc,0xc6,0x45,0x47,0xc2,0x49,0xe5,0xb3,0x4e,0xde,0x25,0xe4, 0xb1,0xf1,0x0c,0x5b,0xb2,0x2b,0x1c,0x49,0x00,0x29,0xfe,0xa5,0x1e,0xf2,0x53,0xd4,0x54,0x7b,0x7d,0xb5, 0x1d,0x24,0x7a,0xbc,0xf1,0x8f,0x6d,0x91,0xc7,0x0d,0xf7,0x15,0x63,0x35,0xc5,0x3d,0x2b,0x3f,0xc0,0xe8, 0x6a,0x30,0xfc,0x8e,0x2d,0xca,0xdc,0xcc,0x65,0xb7,0x0a,0xa9,0xda,0xe6,0x91,0x23,0x15,0xb9,0x51,0x4b, 0x65,0x6d,0x28,0x2c,0xa9,0xd0,0xb4,0xa0,0x80,0xd9,0x1a,0x6d,0x28,0x49,0xeb,0x3e,0x06,0xb5,0xc3,0xab, 0xd9,0x9e,0x39,0x96,0xf2,0xe3,0x28,0x7f,0x1e,0x9c,0xe4,0xe6,0x51,0x5a,0xf8,0x53,0xa2,0x23,0xa8,0x40, 0x3d,0xb3,0xe3,0xa9,0x49,0x03,0x7e,0x7d,0xb7,0xc0,0xd7,0xf1,0x3b,0xbc,0xb5,0xe4,0x4b,0xe6,0x5e,0x46, 0xe5,0xc8,0xea,0x4b,0x89,0xa5,0x81,0xd5,0x16,0xa9,0x95,0x02,0x83,0xe5,0x09,0x3d,0x6f,0x94,0xad,0x2a, 0x20,0xba,0xa3,0xe0,0xeb,0xa4,0x70,0xd7,0x92,0xc7,0x89,0x03,0x95,0x97,0xd1,0x22,0x47,0x62,0x2c,0x56, 0xaa,0x9e,0x6d,0x96,0x99,0x6c,0x21,0xb4,0x00,0xd9,0x01,0x29,0x48,0x00,0x01,0xed,0xe0,0x71,0x46,0x13, 0xda,0x39,0x88,0x16,0x49,0x91,0xf1,0xd6,0x82,0xfe,0xef,0x01,0xa6,0x3a,0x1e,0x94,0x95,0x85,0x66,0x98, 0xde,0x1d,0xca,0x2a,0x09,0x39,0x1c,0xd7,0xe0,0xc7,0x50,0x7c,0x07,0xbe,0x09,0xe7,0x1b,0xd9,0x90,0xee, 0x87,0x5a,0x10,0x40,0x3e,0x0f,0xa4,0x9d,0xf8,0xdf,0x14,0xa9,0xaa,0xb0,0x74,0xb9,0x63,0x69,0x5d,0x07, 0x2e,0x79,0x37,0xa2,0x43,0xaf,0xc9,0x6f,0x0f,0x90,0x56,0xf3,0x72,0x9c,0x2f,0x2d,0x22,0x42,0x61,0x07, 0x14,0xd9,0xea,0xd0,0xda,0xce,0x93,0xaf,0xa8,0x04,0x32,0xf2,0x9d,0x86,0x64,0xf2,0x7e,0xa2,0x34,0x86, 0x90,0xf3,0x4e,0xa2,0x42,0x1c,0x6d,0x68,0x0a,0x4a,0xd2,0x5f,0x70,0x14,0x90,0x41,0x04,0x1f,0x6d,0x7d, 0x77,0xae,0x28,0x33,0x85,0xce,0xc6,0x27,0x2e,0xc7,0x96,0xb9,0x03,0xf8,0xcb,0xab,0x70,0xba,0xed,0x52, 0xd2,0x5f,0xab,0x92,0xa2,0x42,0x94,0x14,0xc2,0x8f,0xcb,0x52,0xba,0x12,0x9e,0xb6,0x8a,0x54,0x12,0x34, 0x07,0x05,0xa9,0xbd,0xbf,0x38,0xe1,0xa4,0x19,0x3d,0xe9,0x58,0x7b,0xbc,0xb2,0x9f,0xd0,0x7e,0x29,0x71, 0xbc,0x57,0x1f,0x76,0x5c,0x85,0x4e,0xfd,0xe0,0x2e,0x33,0x56,0x91,0xec,0x6b,0x5a,0x6b,0x15,0x9e,0x0c, 0x77,0x18,0x8a,0xc3,0x0d,0xad,0x44,0xc4,0x25,0x4a,0x4f,0x69,0x5a,0x07,0x69,0x20,0x8d,0xa4,0x9f,0x3c, 0x3a,0xd0,0x5d,0xd2,0x63,0xf5,0x02,0x03,0x35,0xd9,0x9a,0x9a,0x4b,0x8f,0x3e,0xe3,0xd2,0x31,0x5b,0x1e, 0xa5,0x2d,0xc7,0x14,0xeb,0xaa,0x24,0x47,0x03,0xca,0xd6,0xa3,0xa0,0x00,0x1b,0xd0,0x00,0x71,0x6d,0xae, 0x62,0xf3,0x19,0x15,0x3f,0x09,0x27,0x96,0xec,0xbb,0x78,0x97,0x92,0xc7,0xc4,0x31,0x6e,0xc8,0xac,0x71, 0x24,0x00,0xa7,0xfa,0x94,0x7b,0xc9,0x4f,0x51,0x51,0xed,0xf6,0xd4,0x74,0x91,0xea,0xf3,0xc0,0x39,0x18, 0x9d,0xde,0x5a,0xf2,0x25,0xf3,0x37,0x23,0x72,0xe4,0x75,0x25,0xc4,0xd2,0xc0,0xea,0x8b,0x54,0xca,0x81, 0x41,0xf2,0x84,0x9e,0xb7,0xca,0x56,0x95,0x10,0x5d,0x51,0xf0,0x75,0xd2,0x38,0x92,0xe8,0xb4,0xab,0x2c, 0xdf,0x71,0x54,0x5b,0x6b,0x93,0x00,0x0a,0x24,0xee,0x67,0x8e,0x65,0xbc,0xb8,0xca,0x1f,0xc7,0xa7,0x39, 0x39,0x94,0x56,0xbe,0x14,0xe8,0x88,0xea,0x10,0x0f,0x6c,0xf8,0xea,0x52,0x40,0xdf,0x9f,0x6d,0xf0,0x82, 0xeb,0xb8,0x2a,0xb9,0x2b,0x89,0x27,0x3b,0x99,0x22,0x1c,0x28,0x92,0x9f,0x94,0xda,0xcd,0x67,0xc4,0xb0, 0xb7,0x0a,0xe4,0xb6,0x12,0xbe,0xb6,0x5c,0x6c,0xf8,0x71,0x67,0xa4,0xf9,0x05,0x29,0x56,0xfc,0x71,0xab, 0xe4,0xb1,0xe2,0x40,0xe5,0x65,0xf4,0x48,0x71,0xd8,0x8b,0x15,0xaa,0xa7,0x9b,0x65,0xa6,0x50,0x10,0xda, 0x00,0x6c,0x80,0x94,0xa4,0x00,0x00,0xf6,0xf0,0x38,0x05,0xca,0x76,0x19,0x93,0xc9,0xfa,0x88,0xd2,0x1a, 0x43,0xcd,0x3a,0x89,0x08,0x71,0xb5,0xa0,0x29,0x2b,0x49,0x7d,0xc0,0x52,0x41,0x04,0x10,0x7d,0xb5,0xf5, 0xde,0xb8,0xd8,0x47,0x51,0xa4,0x92,0x01,0x8d,0xc3,0xb1,0xa8,0x59,0x49,0xcd,0x59,0xeb,0xb4,0xf7,0x14, 0xa9,0x6b,0x5b,0x8e,0x5b,0xd6,0x57,0x48,0xa5,0xfb,0xe2,0xd1,0x42,0x6b,0xc4,0x69,0x0c,0x62,0x73,0x3b, 0x3f,0x08,0xc4,0x96,0x64,0x04,0xa1,0x28,0x88,0x1b,0xd1,0x0d,0xf5,0x24,0x84,0xe8,0x13,0xfc,0x3e,0x38, 0x92,0xbb,0x19,0xc1,0xe3,0x3a,0xbf,0x89,0xa8,0xce,0x2c,0xe3,0x3b,0x3d,0xdb,0x29,0x11,0x27,0x62,0x53, 0x9d,0x61,0xf9,0x6e,0xb6,0xa6,0xd6,0xf2,0xd3,0xf0,0x83,0x64,0xa5,0x44,0x74,0x8d,0x20,0x7b,0x84,0x82, 0x38,0x30,0xce,0x19,0x3f,0x18,0x98,0xbb,0x1e,0x5a,0xe4,0x0f,0xe3,0x2e,0x2d,0xc2,0xeb,0xb5,0x4b,0x49, 0x7e,0xae,0x4a,0x89,0x0a,0x50,0x53,0x0a,0x3f,0x2d,0x4a,0xe8,0x4a,0x7a,0xda,0x29,0x50,0x48,0xd0,0x1c, 0x1e,0x6b,0x98,0xfc,0xc6,0x45,0x47,0xc2,0x49,0xe5,0xb3,0x4e,0xde,0x25,0xe4,0xb1,0xf1,0x0c,0x5b,0xb2, 0x2b,0x1c,0x49,0x00,0x29,0xfe,0xa5,0x1e,0xf2,0x53,0xd4,0x54,0x7b,0x7d,0xb5,0x1d,0x24,0x7a,0xbc,0xf1, 0x8d,0x6c,0x5a,0xb8,0xbc,0x37,0xdc,0x55,0xcc,0x5d,0x4f,0x4a,0x45,0x63,0x1a,0xc3,0x6b,0xad,0xa0,0x5d, 0x43,0x1c,0xcc,0x87,0x32,0x0a,0xdd,0x7b,0xbc,0xaa,0x3b,0x27,0x10,0xb5,0xa8,0x38,0x16,0xb5,0x21,0xd8, 0xca,0x42,0x3f,0xa6,0x7b,0xc3,0x69,0x40,0xdb,0x8a,0x3a,0xde,0x88,0x17,0x49,0x8a,0x72,0xea,0xcb,0x04, 0xca,0x27,0xe2,0x79,0x05,0xed,0x84,0x6f,0xb2,0xe2,0xa6,0x42,0x14,0xcf,0x4b,0x0e,0xaa,0xbd,0x84,0x26, 0x37,0x52,0xd4,0xc2,0x48,0x50,0x28,0x4a,0x88,0x4a,0x93,0xd4,0x77,0xbf,0x1e,0x38,0x71,0x7f,0x13,0xbb, 0xcb,0x5e,0x44,0xbe,0x65,0xe4,0x6e,0x5c,0x8e,0xa4,0xb8,0x9a,0x58,0x1d,0x51,0x6a,0x99,0x50,0x28,0x3e, 0x50,0x93,0xd6,0xf9,0x4a,0xd2,0xa2,0x0b,0xaa,0x3e,0x0e,0xba,0x47,0x0d,0x79,0x2c,0x78,0x90,0x39,0x59, 0x7d,0x12,0x24,0x76,0x22,0xc5,0x6a,0xa9,0xe6,0xd9,0x69,0x96,0xc2,0x1b,0x40,0x0d,0x90,0x12,0x94,0x80, 0x00,0x1e,0xde,0x07,0x15,0x60,0x5c,0xb5,0xe6,0x95,0x14,0x92,0x64,0x77,0xa5,0x5f,0x0d,0xe1,0x31,0x31, 0xd0,0xf4,0xa4,0xac,0x2b,0x34,0xc6,0xf0,0xfe,0x51,0x50,0x49,0xc8,0xe6,0xbf,0x05,0x85,0x07,0xc0,0x7b, 0xe0,0x9e,0x71,0xbd,0x99,0x0e,0xe8,0x75,0xa1,0x04,0x03,0xe0,0xfa,0x49,0xdf,0x8d,0xf1,0xf4,0xa6,0xf0, 0xdb,0xc9,0x72,0x2e,0x91,0x07,0x35,0x78,0x5a,0x3f,0x0a,0x69,0x75,0x8c,0x6e,0xc4,0xb6,0xbe,0xca,0x74, 0x9e,0x95,0x08,0xfa,0xe8,0x71,0x07,0xa5,0x7f,0x9a,0x54,0x75,0xaf,0x7e,0x0c,0x72,0x9d,0x86,0x64,0xf2, 0x7e,0xa2,0x34,0x86,0x90,0xf3,0x4e,0xa2,0x42,0x1c,0x6d,0x68,0x0a,0x4a,0xd2,0x5f,0x70,0x14,0x90,0x41, 0x04,0x1f,0x6d,0x7d,0x77,0xae,0x28,0x33,0x85,0xce,0xc6,0x27,0x2e,0xc7,0x96,0xb9,0x03,0xf8,0xcb,0xab, 0x70,0xba,0xed,0x52,0xd2,0x5f,0xab,0x92,0xa2,0x42,0x94,0x14,0xc2,0x8f,0xcb,0x52,0xba,0x12,0x9e,0xb6, 0x8a,0x54,0x12,0x34,0x07,0x05,0xa9,0xb5,0x9f,0x3c,0xea,0xd2,0x0c,0x9e,0xf4,0x38,0x7b,0xbc,0xb2,0x9f, 0xd0,0x52,0xcc,0xfc,0x17,0x01,0x9b,0x32,0xaa,0x4c,0x9a,0xcc,0xe9,0xe5,0x55,0xd1,0xb5,0x48,0xc2,0x24, 0x61,0xd2,0x64,0x36,0x59,0x68,0x92,0x97,0x0a,0x5d,0x82,0xa1,0xdd,0xf2,0x7d,0x43,0x5f,0x5d,0x01,0xb3, 0xc5,0xba,0xac,0x6f,0x10,0xa8,0xc8,0x68,0xef,0x89,0xe6,0x4b,0xef,0xd0,0xfc,0x49,0x89,0xf1,0x98,0xec, 0xf5,0xa4,0x25,0xe6,0xca,0x16,0x95,0xac,0xc5,0xeb,0x50,0x00,0xf8,0xda,0xbc,0x7f,0xf2,0xe1,0xe1,0xae, 0x63,0xf3,0x19,0x15,0x1f,0x09,0x27,0x96,0xec,0xbb,0x78,0x97,0x92,0xc7,0xc4,0x31,0x6e,0xc8,0xac,0x71, 0x24,0x00,0xa7,0xfa,0x94,0x7b,0xc9,0x4f,0x51,0x51,0xed,0xf6,0xd4,0x74,0x91,0xea,0xf3,0xc0,0x39,0x18, 0x9d,0xde,0x5a,0xf2,0x25,0xf3,0x37,0x23,0x72,0xe4,0x75,0x25,0xc4,0xd2,0xc0,0xea,0x8b,0x54,0xca,0x81, 0x41,0xf2,0x84,0x9e,0xb7,0xca,0x56,0x95,0x10,0x5d,0x51,0xf0,0x75,0xd2,0x38,0x9a,0xe1,0xb6,0x8b,0x25, 0xfe,0xe2,0x9e,0x85,0xc9,0x88,0x15,0x06,0x71,0x99,0x63,0x79,0x6f,0x28,0x72,0x07,0xf1,0xe9,0xee,0xce, 0x65,0x1f,0x0e,0x14,0xe0,0x88,0xea,0x10,0x0f,0x7d,0xaf,0x1d,0x4b,0x48,0x1b,0xd1,0xf6,0xe3,0x8b,0x9b, 0x4c,0x42,0xa7,0x97,0x98,0x6c,0xbc,0xca,0x7c,0xb8,0x31,0xe2,0x22,0x1c,0xe8,0xef,0x37,0x11,0xd5,0xb7, 0xdd,0x4a,0x0f,0x4a,0x14,0xb4,0x36,0x53,0xa2,0x3a,0x81,0x4e,0xf7,0xe3,0x83,0x7c,0xd6,0x8d,0x16,0x0f, 0x25,0xad,0xe2,0x42,0x8c,0xc4,0x68,0xcd,0x26,0x3b,0x6d,0x34,0xcb,0x61,0x0d,0xa1,0x21,0xf6,0xf4,0x94, 0xa4,0x00,0x00,0xd6,0xbc,0x0e,0x0a,0xe2,0x6d,0x31,0x2f,0x96,0x74,0x51,0x9e,0x69,0x0f,0xb2,0xed,0x63, 0x4d,0xba,0xda,0xd0,0x14,0x95,0x82,0xd8,0x05,0x24,0x10,0x41,0x07,0xdb,0x5f,0x5d,0xeb,0x8d,0x57,0x65, 0xfe,0x52,0xad,0x06,0x37,0x1e,0xc2,0xa3,0x5d,0xde,0x79,0xbd,0xf6,0x8e,0xf5,0x99,0x4b,0xc5,0x39,0x7f, 0x79,0x8a,0x5a,0xd6,0x34,0xc6,0x7e,0xba,0xfb,0xf8,0xf1,0x52,0xb7,0xe3,0xe3,0x93,0x95,0xf2,0x9a,0x92, 0xec,0x96,0xbb,0x6b,0xf8,0x52,0x9e,0x9f,0x9d,0xd3,0xb2,0x08,0xe8,0x42,0x07,0xb8,0x2a,0x36,0xa3,0xe2, 0x1c,0xbd,0x6a,0x0c,0xf8,0x9f,0x76,0xf2,0xee,0x99,0xa1,0x29,0x2a,0x6b,0x0b,0x97,0x1c,0xb2,0x00,0x52, 0x57,0xda,0x0c,0xc3,0x40,0x6d,0x4b,0x42,0x94,0x85,0xad,0x20,0x2d,0x49,0xd0,0xea,0xf0,0x9d,0x1c,0x67, 0x0c,0x9f,0x8c,0x4c,0x5d,0x8f,0x2d,0x72,0x07,0xf1,0x97,0x16,0xe1,0x75,0xda,0xa5,0xa4,0xbf,0x57,0x25, 0x44,0x85,0x28,0x29,0x85,0x1f,0x96,0xa5,0x74,0x25,0x3d,0x6d,0x14,0xa8,0x24,0x68,0x0e,0x0f,0x35,0xcc, 0x7e,0x63,0x22,0xa3,0xe1,0x24,0xf2,0xd9,0xa7,0x6f,0x12,0xf2,0x58,0xf8,0x86,0x2d,0xd9,0x15,0x8e,0x24, 0x80,0x14,0xff,0x00,0x52,0x8f,0x79,0x29,0xea,0x2a,0x3d,0xbe,0xda,0x8e,0x92,0x3d,0x5e,0x78,0xc8,0xb7, 0xe1,0xdc,0x1c,0x3f,0xdc,0x55,0x6c,0x5d,0x4f,0x4a,0x46,0x8f,0x8e,0x62,0x15,0xd3,0xe5,0xcc,0x60,0x73, 0x2d,0x96,0x64,0xc9,0x89,0x2d,0xf6,0x9f,0xa0,0xb1,0x7d,0x04,0xc4,0x91,0xf1,0x08,0xdb,0x8e,0xc6,0x53, 0x84,0x17,0x4a,0xd4,0x76,0xbd,0x9e,0xb5,0x79,0x1e,0x34,0x85,0x79,0x55,0x81,0xc7,0xe5,0xd5,0x4a,0xb0, 0xbb,0xeb,0x7b,0x88,0x95,0x92,0x55,0x12,0x31,0x94,0xc1,0x4b,0x6c,0x25,0xe0,0xa7,0x5d,0x01,0x5d,0xa4, 0x6d,0x4a,0x5a,0x50,0x74,0xad,0x91,0xaf,0x1a,0xe3,0x59,0x91,0x89,0x5d,0xe5,0xaf,0x22,0x5f,0x33,0x72, 0x37,0x2e,0x47,0x52,0x5c,0x4d,0x2c,0x0e,0xa8,0xb5,0x4c,0xa8,0x14,0x1f,0x28,0x49,0xeb,0x7c,0xa5,0x69, 0x51,0x05,0xd5,0x1f,0x07,0x5d,0x23,0x8a,0x7c,0xfc,0x8b,0x1a,0x17,0x2c,0xeb,0x62,0x42,0x8c,0xcc,0x68, 0xcc,0xd8,0xb4,0xdb,0x4d,0x32,0xd8,0x43,0x6d,0xa4,0x34,0xe8,0x01,0x29,0x00,0x00,0x35,0xaf,0x03,0x8d, 0x7f,0xe1,0xf3,0x6c,0xea,0x28,0xa0,0x92,0x67,0xe9,0x50,0xea,0x81,0x8e,0x1b,0x13,0x11,0x15,0xff,0xd9 }; #if 0 static unsigned char bouttons[11916]={ 0xff,0xd8,0xff,0xdb,0x00,0x43,0x00,0x05,0x03,0x04,0x04,0x04,0x03,0x05,0x04,0x04,0x04,0x05,0x05,0x05, 0x06,0x07,0x0c,0x08,0x07,0x07,0x07,0x07,0x0f,0x0b,0x0b,0x09,0x0c,0x11,0x0f,0x12,0x12,0x11,0x0f,0x11, 0x11,0x13,0x16,0x1c,0x17,0x13,0x14,0x1a,0x15,0x11,0x11,0x18,0x21,0x18,0x1a,0x1d,0x1d,0x1f,0x1f,0x1f, 0x13,0x17,0x22,0x24,0x22,0x1e,0x24,0x1c,0x1e,0x1f,0x1e,0xff,0xdb,0x00,0x43,0x01,0x05,0x05,0x05,0x07, 0x06,0x07,0x0e,0x08,0x08,0x0e,0x1e,0x14,0x11,0x14,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, 0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, 0xff,0xc0,0x00,0x11,0x08,0x00,0x20,0x02,0x80,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11,0x01,0xff, 0xc4,0x00,0x1c,0x00,0x00,0x02,0x02,0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x05,0x06,0x04,0x07,0x00,0x02,0x03,0x01,0x08,0xff,0xc4,0x00,0x4c,0x10,0x00,0x01,0x04,0x02,0x00,0x05, 0x02,0x02,0x05,0x08,0x06,0x06,0x07,0x09,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x11,0x00,0x07,0x12, 0x13,0x21,0x22,0x31,0x14,0x41,0x15,0x16,0x23,0x51,0x61,0x08,0x17,0x32,0x52,0x71,0x95,0xd2,0xd4,0x33, 0x35,0x42,0x55,0x56,0x62,0x18,0x34,0x81,0x82,0x91,0x96,0x36,0x37,0x94,0xa4,0xb1,0xb3,0xc1,0x44,0x45, 0x76,0x93,0xa3,0xb4,0xd1,0xd3,0xd5,0xff,0xc4,0x00,0x18,0x01,0x00,0x03,0x01,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x04,0x05,0x02,0x01,0xff,0xc4,0x00,0x30,0x11,0x00,0x02, 0x01,0x03,0x03,0x02,0x04,0x05,0x03,0x05,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x00,0x04,0x11, 0x05,0x12,0x21,0x31,0xb1,0x41,0x51,0x71,0xa1,0x13,0x14,0x15,0x81,0xc1,0x06,0x22,0x91,0x32,0x42,0x61, 0xd1,0xf0,0x72,0xff,0xda,0x00,0x0c,0x03,0x01,0x00,0x02,0x11,0x03,0x11,0x00,0x3f,0x00,0x71,0xe4,0x5d, 0x9d,0x75,0x47,0x2d,0xec,0x26,0xda,0xce,0x8d,0x06,0x22,0x6c,0xd4,0x16,0xec,0x87,0xd2,0xd2,0x01,0x2d, 0xb5,0xa0,0x54,0xa2,0x07,0xbe,0xb8,0x3f,0x06,0xeb,0x26,0xcb,0x5c,0x0d,0x60,0xd8,0xf2,0x8c,0x55,0x80, 0x45,0xc5,0xd2,0x55,0x16,0x2e,0x88,0x04,0x29,0xb6,0x88,0x0f,0x3d,0xee,0x47,0xe8,0xa0,0x78,0xfd,0x2f, 0x3c,0x2c,0x72,0x3e,0x9e,0x9e,0xe7,0x06,0x94,0xc5,0xc5,0x4c,0x0b,0x16,0x9b,0xb1,0x70,0xa1,0x32,0xa3, 0xa1,0xd4,0xa4,0x96,0xd9,0xd9,0xd2,0x81,0xfb,0x87,0xb7,0x1b,0x64,0x74,0xfc,0xb0,0xc6,0x63,0xc5,0x93, 0x63,0x41,0x8c,0xc9,0x4c,0xc5,0xb2,0xcc,0x36,0x5a,0xa3,0x8e,0xe3,0x92,0x54,0xa6,0xd6,0x50,0x01,0x4a, 0x42,0x42,0x9c,0x52,0x49,0x0b,0x57,0x4b,0x7a,0x4e,0x80,0x4f,0x95,0x71,0xdd,0x78,0x40,0x75,0x49,0x37, 0x82,0x5b,0x3c,0x0f,0x0a,0x1e,0x8f,0xbc,0x58,0xa6,0x0e,0x06,0x2a,0xca,0xae,0xe5,0x33,0x6e,0xb4,0xb9, 0x19,0x56,0x5b,0x91,0xdb,0x58,0x3a,0x8e,0x9e,0xa8,0x76,0x2e,0xd7,0x47,0x63,0xc9,0x3a,0x6d,0xa6,0x16, 0x91,0xe3,0x7e,0xeb,0x2b,0x51,0xd0,0xd9,0x3a,0xe0,0x5d,0x8e,0x23,0xcc,0x0c,0x4d,0xb2,0xed,0x44,0xe6, 0x73,0x1a,0x84,0x7f,0xec,0xd3,0xd6,0x88,0xd6,0x2d,0x27,0xd2,0x34,0x97,0x80,0x0d,0xbd,0xa0,0x14,0x74, 0xe0,0x4a,0x89,0x3e,0x5c,0x3c,0x01,0x8b,0xc9,0xb7,0x2e,0x14,0x99,0x6a,0xc3,0xb9,0x7f,0x8c,0xb2,0x85, 0x15,0x33,0x1a,0x4d,0x1a,0x27,0xbe,0xaf,0x04,0x6d,0xde,0xd3,0x8d,0x36,0x93,0xa3,0xfa,0x00,0xba,0x37, 0xe7,0xab,0x60,0x68,0x5e,0x43,0xcb,0xfa,0xfc,0x16,0xbd,0x53,0x32,0x5c,0x0b,0x0b,0xb1,0xa2,0x8d,0xd2, 0x5e,0xb6,0xad,0xa9,0x69,0x0e,0x30,0xd8,0xd0,0x25,0xd6,0x1e,0x52,0x95,0xf7,0xfa,0xd0,0xb7,0x54,0x7f, 0x53,0xef,0x5c,0xc9,0x0c,0x8b,0xf0,0xf1,0x93,0xe5,0x81,0xed,0xcd,0x36,0x0b,0x29,0xc8,0x6a,0x70,0xc5, 0xb2,0xfa,0x7b,0x5b,0x21,0x54,0xb3,0x26,0xb2,0xe1,0x23,0x6b,0xac,0xb2,0x68,0xc7,0x92,0x3c,0x13,0xb4, 0xa4,0xf8,0x70,0x00,0x09,0xea,0x6c,0xa9,0x3f,0x8f,0x0a,0x5c,0x86,0x97,0x16,0x0f,0x2f,0x2c,0xa6,0x4d, 0x92,0xcc,0x68,0xcd,0x4f,0x71,0x4e,0x3c,0xf3,0x81,0x08,0x40,0xed,0x37,0xb2,0x54,0x48,0x00,0x7e,0x27, 0x82,0xd8,0x66,0x2d,0xcb,0xd9,0x50,0x61,0x59,0x41,0xa3,0xc6,0xe4,0x22,0x4b,0x4d,0x96,0x56,0x8a,0x96, 0x59,0x2a,0xdb,0x7d,0xc0,0x7a,0x0a,0x02,0x82,0x94,0x85,0x25,0x64,0x1f,0x97,0x90,0x00,0xf1,0xc0,0x1e, 0x48,0x54,0x54,0xdc,0xe0,0x13,0x23,0xdc,0x56,0x41,0xb1,0x65,0x16,0x6b,0x52,0x5b,0x96,0xc2,0x5d,0x4a, 0x4f,0x69,0xb1,0xd5,0xa5,0x02,0x3d,0xbc,0x6f,0xf1,0xe1,0x8b,0x35,0x89,0x74,0xcb,0x80,0xb9,0xdb,0xb8, 0x77,0x34,0x09,0xcb,0x1b,0xc8,0x49,0xf2,0x3f,0x8a,0x67,0xaf,0xba,0xc8,0x72,0xe7,0x83,0x18,0x15,0x32, 0x5e,0x8a,0xaf,0x26,0xee,0xd5,0x2b,0x66,0x16,0xbf,0x59,0xa4,0x0d,0x39,0x23,0xe7,0xe5,0x21,0x29,0xff, 0x00,0x3f,0x0c,0xd1,0x39,0x4d,0x09,0xc8,0x0e,0xfd,0x39,0x95,0xe5,0x36,0x16,0x8e,0x81,0xd5,0x3a,0x3d, 0x9b,0xb0,0xd2,0xda,0xb4,0x00,0xed,0xc7,0x65,0x41,0xa0,0x3f,0x05,0xa5,0x64,0xff,0x00,0x68,0xab,0x7c, 0x56,0x3c,0xc7,0x6f,0x94,0x38,0x15,0x5b,0x76,0x17,0xf8,0x75,0x10,0xef,0xa8,0xa2,0x3b,0x0c,0x52,0xb2, 0xb5,0xbc,0xa4,0x8d,0xf4,0x8f,0x48,0x48,0x3a,0xd7,0x95,0x10,0x3c,0x7c,0xf8,0xaa,0xf0,0x5b,0xc7,0x79, 0x8d,0x9b,0x1a,0x8c,0x3f,0x94,0xd8,0x04,0x68,0x29,0x01,0x6e,0xaa,0x55,0x53,0x4f,0x3a,0xc3,0x5e,0xc5, 0xc3,0xeb,0x68,0x2b,0xef,0xe9,0x48,0xdf,0xcb,0x67,0x8e,0x69,0x76,0x06,0xe2,0x16,0x96,0x15,0xc2,0xaf, 0x52,0x70,0x3d,0xe9,0x8b,0x99,0x0a,0x9c,0x33,0x62,0xbe,0x85,0xb6,0x87,0x9e,0x61,0xae,0xf5,0x59,0x46, 0xfa,0xdd,0x4b,0xbd,0x26,0x74,0x06,0xd2,0x8b,0x06,0x87,0x9f,0x2e,0xc7,0xf0,0x87,0x7f,0x12,0xd1,0x07, 0xc7,0x86,0xf8,0xda,0xce,0xee,0x9f,0x22,0xe5,0x8e,0x45,0x2e,0xaa,0x6b,0x72,0x9a,0x4d,0x7b,0xe1,0xc4, 0xa7,0xc3,0x8d,0x2c,0x36,0x4f,0x4b,0x88,0x20,0x29,0x0a,0x1e,0x36,0x14,0x01,0xe1,0x0e,0x7d,0x5e,0x23, 0x88,0xce,0x89,0x07,0x3d,0xe5,0xee,0x23,0x19,0xa9,0xaf,0x88,0xf0,0x6d,0xab,0xaa,0xda,0x5c,0x69,0x2e, 0x13,0xe1,0x2a,0x65,0x49,0x2e,0xb2,0xa3,0xe3,0xc6,0x96,0x9f,0xf3,0xf0,0xf7,0x71,0x8e,0x63,0xb4,0xf8, 0x2e,0x46,0xf5,0x3d,0x05,0x4d,0x73,0x86,0xaa,0x42,0x4a,0xe2,0x44,0x6d,0xa3,0xae,0xd9,0xf4,0xed,0x20, 0x70,0x0b,0x68,0x62,0x4b,0xe4,0x38,0x21,0xb7,0x0f,0x43,0xcd,0x72,0x46,0x66,0x81,0xff,0x00,0x76,0x78, 0xfc,0x54,0x3e,0x57,0x49,0x85,0x5b,0xc9,0xaa,0xa9,0xd3,0x64,0xb1,0x12,0x3a,0x04,0x87,0x1e,0x7d,0xe7, 0x03,0x68,0x48,0xef,0xac,0x6c,0xa9,0x5e,0x00,0xd0,0xf9,0xf1,0xb4,0x2b,0xbc,0x8b,0x2c,0x73,0xb3,0x81, 0xd2,0x07,0xa3,0x1f,0xfd,0xf3,0x6c,0x14,0xc4,0x30,0x3f,0x59,0xb4,0x0f,0xb4,0x91,0xfe,0xe8,0x4a,0x7d, 0xb4,0xb3,0xf3,0x8f,0xcb,0xaa,0x5a,0x6b,0xae,0x4f,0x63,0xec,0xdc,0xd4,0xc0,0xb2,0x69,0x06,0x41,0x4a, 0x25,0xc7,0x43,0xa9,0x49,0x2f,0xb8,0x36,0x02,0xc6,0xbd,0xb8,0x09,0xcc,0x08,0xbc,0xa5,0xc2,0x20,0xb3, 0x2e,0xef,0x0c,0xa0,0x2b,0x94,0xe1,0x6a,0x2b,0x0c,0xd2,0xb2,0xe2,0xdf,0x58,0xf2,0x52,0x3d,0x00,0x0f, 0x07,0xe6,0xa0,0x3c,0x7b,0xf1,0xcd,0x50,0x40,0x75,0x39,0x44,0x80,0x96,0xc9,0xc7,0xf3,0x5c,0xb3,0x66, 0x16,0x48,0x73,0x81,0x81,0xda,0xac,0x78,0x9c,0xa1,0x8e,0xfc,0x17,0x8e,0x45,0x97,0xe5,0x16,0x36,0x6f, 0xa7,0x46,0x54,0x5b,0x47,0xa0,0x36,0xc1,0xf9,0x76,0x99,0x65,0x61,0x03,0x5b,0xfe,0xdf,0x59,0xfc,0x4f, 0x01,0x2d,0xea,0xf9,0x81,0x87,0x29,0x4f,0x3a,0xca,0x73,0x6a,0x64,0x6c,0xa5,0xd8,0xa9,0x6a,0x35,0xa3, 0x43,0xd4,0x74,0xa6,0xf4,0x96,0x5f,0xf7,0x4a,0x47,0x41,0x68,0x80,0x09,0xe9,0x51,0xe3,0xe7,0xfb,0x4b, 0x77,0x9e,0x98,0x5c,0xa9,0xe5,0x67,0x2e,0xa1,0x44,0x20,0x04,0x31,0x3a,0xa4,0xbe,0xf8,0x3f,0x7a,0x94, 0xda,0x52,0x9d,0x9f,0x1e,0x06,0xc0,0xfd,0x63,0xc1,0x5a,0x0c,0xab,0x01,0xae,0x8e,0xda,0x39,0x83,0xcb, 0x6c,0x56,0x00,0x3e,0x3e,0x93,0xaf,0xa8,0x43,0x91,0x89,0xf5,0x9d,0x2d,0xb2,0xd9,0x71,0x3e,0x02,0x07, 0xa7,0xb9,0xb2,0x49,0x21,0x00,0x10,0x0f,0x71,0x6f,0x17,0xc2,0x05,0xb0,0xdf,0xe0,0x11,0x91,0x40,0x8a, 0xed,0x4c,0x9b,0x41,0xe6,0xaf,0xfc,0x36,0xfe,0x8b,0x24,0xef,0xb7,0x59,0x39,0x12,0x14,0xc9,0xed,0x4a, 0x8e,0xa4,0x29,0x97,0xd8,0xf2,0x53,0xa7,0x1a,0x50,0x0e,0x36,0x4f,0x4a,0xb5,0xd4,0x90,0x48,0x1b,0x1b, 0x1c,0x22,0xf2,0x2e,0x74,0x3a,0xde,0x59,0xd8,0xce,0xb0,0x97,0x1e,0x1c,0x56,0xac,0xd6,0x5c,0x79,0xf7, 0x52,0xda,0x10,0x3b,0x4d,0x0d,0x95,0x2b,0xd2,0x3f,0x69,0xe1,0xdf,0x14,0xc4,0xb1,0x4a,0x9b,0x56,0xa6, 0x55,0x63,0x14,0xd0,0x24,0xa0,0x90,0x87,0xa3,0xc1,0x69,0xa5,0xa7,0x63,0xa4,0xe8,0xa5,0x20,0xec,0x83, 0xa3,0xfb,0x78,0x40,0xe4,0xa5,0x25,0x2d,0xdf,0x2e,0xe4,0x33,0x75,0x51,0x5f,0x64,0xdb,0x76,0xae,0x16, 0xd3,0x2e,0x32,0x1d,0x09,0x25,0xa6,0xb6,0x40,0x50,0x3a,0xf9,0x71,0xdb,0x2f,0x84,0x34,0xab,0x80,0xa4, 0xed,0xc8,0xf5,0xf1,0xad,0xdc,0x64,0xdf,0x45,0xe8,0x7f,0x14,0xcb,0x5d,0x6b,0x93,0xe6,0x0e,0xa5,0xac, 0x16,0x95,0x2d,0xc2,0x56,0x89,0xba,0xb9,0x6d,0x6c,0xc6,0x29,0xd8,0x3d,0x4d,0x33,0xb0,0xf3,0xde,0x36, 0x37,0xf6,0x69,0xd8,0x04,0x28,0x8f,0x76,0x48,0xbc,0xa2,0x8a,0xe5,0x6b,0x9f,0x4b,0x66,0x59,0x6c,0xcb, 0x87,0x7a,0x54,0x6c,0x19,0xb3,0x72,0x2a,0x5b,0x52,0x40,0x03,0xa2,0x33,0x64,0x30,0x07,0x81,0xe9,0x52, 0x15,0xf3,0xd9,0x24,0x92,0x57,0x0f,0x2f,0xb0,0x2d,0xf9,0xc2,0x31,0x9f,0xdb,0xf4,0x53,0x1f,0xc0,0x78, 0xaf,0xf2,0x1b,0x0e,0x58,0x30,0xd3,0x8d,0xe3,0x1c,0xb9,0xc7,0xb2,0x77,0xda,0x52,0x50,0xe3,0xf1,0xab, 0xe3,0xb7,0x01,0x92,0xa2,0x81,0xa5,0x48,0x28,0x29,0x51,0xd2,0xc9,0xe9,0x6c,0x38,0x76,0x92,0x08,0x4e, 0xf6,0x27,0xd9,0xc9,0x17,0x48,0xd4,0xfa,0xe2,0x9c,0x99,0x1c,0xf2,0x4d,0x58,0xd6,0x51,0x73,0xcc,0x39, 0x40,0xdb,0x42,0x19,0x6d,0x46,0xf4,0x99,0xf5,0xcd,0x06,0xe7,0x34,0x9f,0xbd,0xe8,0xc3,0x41,0xcd,0x02, 0x49,0x53,0x5e,0x4e,0xbf,0xa3,0xf3,0xbe,0x3c,0x9f,0x7d,0x4f,0x90,0xf2,0xf3,0x20,0x9b,0x4f,0x3d,0x99, 0xad,0x0a,0xe9,0x28,0x70,0x27,0x69,0x5b,0x4a,0xec,0x93,0xd0,0xb4,0x1f,0x52,0x14,0x01,0x1e,0x95,0x00, 0x47,0xcc,0x0e,0x15,0x30,0xee,0x55,0x42,0x65,0xf5,0xd8,0xe5,0x95,0xb8,0x9c,0xb7,0x9d,0x1a,0x15,0xb5, 0xd8,0xfc,0x56,0xa1,0xc7,0x3a,0x1b,0x01,0x4b,0x6c,0xba,0xb3,0xb0,0x4e,0xd4,0xa0,0x3c,0x9f,0x1e,0xda, 0x65,0xb4,0xc5,0xf1,0x9a,0x5c,0x47,0x21,0x93,0x4d,0x8e,0xd4,0x56,0xbe,0x6a,0x64,0xa0,0xbb,0x12,0x13, 0x6d,0x28,0xa4,0xb6,0x49,0x4e,0xd0,0x9f,0x6f,0x03,0xe7,0xf2,0x1c,0x6a,0xdd,0xad,0x8d,0xf4,0x7b,0x7f, 0xab,0x70,0xe9,0xd3,0xad,0x62,0x65,0x7f,0x80,0xe1,0xb9,0xe0,0xf6,0xad,0x79,0x51,0x36,0x05,0x4f,0x25, 0xab,0xec,0x2c,0x65,0xc6,0x83,0x19,0x2e,0x3e,0x5d,0x7e,0x43,0xa1,0xb6,0xd3,0xb7,0x8a,0x46,0xd4,0xad, 0x01,0xe7,0x43,0xf1,0xf6,0xf9,0xf1,0x1a,0xb7,0x20,0xca,0xb3,0x72,0x91,0xcb,0x9c,0x73,0x75,0xcb,0x29, 0x3f,0x58,0x2f,0x50,0xb8,0xd0,0x8a,0x4f,0x41,0xdb,0x2d,0x68,0x3a,0xf9,0x23,0xb8,0x9d,0x8e,0x94,0x85, 0x01,0xe4,0x83,0xc6,0xfc,0xb0,0xa4,0xa5,0xba,0xe5,0x05,0x32,0x2e,0x2a,0x6b,0xec,0x50,0xdb,0x92,0x3a, 0x04,0xb8,0xe8,0x74,0x23,0x6e,0xab,0x7a,0x0a,0x07,0x5b,0xd0,0xf6,0xfb,0xbf,0xd8,0x6a,0x1e,0x71,0x4f, 0xfa,0x91,0x67,0x8f,0x46,0x57,0x2a,0xb9,0x6a,0xdf,0xd2,0xaf,0x38,0x82,0x9e,0xc0,0x95,0xbe,0x95,0x34, 0x35,0xbe,0xcb,0x3d,0x04,0x77,0x3e,0xe5,0xfb,0xfc,0xb5,0xa5,0x3f,0x7f,0x6d,0x0c,0xda,0xa4,0xaa,0x46, 0x5b,0x27,0xae,0x31,0x4b,0x5a,0x3b,0x25,0x9a,0x11,0xe4,0x3f,0x15,0x7f,0xc3,0xe4,0xca,0x1c,0xa9,0x7c, 0x5f,0x73,0x03,0x32,0x9d,0x77,0x21,0x4d,0xad,0x76,0x51,0x2c,0x0c,0x24,0x32,0xa4,0x6b,0xc3,0x51,0x91, 0xf6,0x09,0x4a,0x82,0x40,0x50,0x52,0x57,0xbd,0x9f,0x3b,0x3b,0xe0,0x14,0xd8,0xfc,0xcd,0xc1,0xca,0x53, 0x90,0x55,0xfd,0x78,0xa7,0x04,0x0f,0xa5,0x68,0xe3,0x76,0xe7,0x23,0x7d,0x09,0xdb,0xd0,0xb6,0x7a,0xb6, 0xa5,0x1f,0x2c,0x95,0x69,0x28,0x2a,0x29,0x1c,0x26,0x0a,0x58,0x9a,0xff,0x00,0xaa,0x0e,0x5d,0xfc,0x87, 0xfa,0xc8,0xfe,0x47,0xf1,0xe1,0x2a,0x9e,0xd1,0x16,0x1c,0xe6,0x97,0x83,0xa3,0x95,0x1c,0xb6,0x01,0x96, 0x7b,0x81,0xa3,0x18,0x02,0x3e,0xc9,0x0e,0x7f,0x4f,0xd9,0x3b,0xfd,0x2f,0x6e,0xc8,0xfb,0xbe,0x5b,0x3c, 0x92,0xd4,0x48,0x87,0x7a,0xe4,0x28,0xcf,0x87,0xb7,0x34,0x54,0x7d,0xac,0x36,0xb7,0x26,0xaf,0x65,0xe4, 0x94,0x59,0x47,0x2b,0xb2,0x0b,0x1c,0x7e,0xd2,0x35,0x84,0x75,0x55,0xc8,0xea,0x2d,0x1f,0x52,0x3e,0xc9, 0x5e,0x14,0x93,0xa5,0x20,0xfe,0x0a,0x1b,0xd1,0xe1,0x7f,0x09,0xc9,0xa8,0x31,0x6e,0x4f,0x51,0xcc,0xbe, 0xb3,0x66,0x13,0x6b,0x2f,0x86,0xd2,0xb2,0x54,0xb7,0x4f,0xc4,0x2c,0x69,0x0d,0xa7,0xd6,0xb3,0xe4,0x6c, 0x24,0x12,0x37,0xfb,0x78,0x34,0xfe,0x39,0x4f,0x57,0xcb,0xbb,0xd9,0x31,0xf1,0x9a,0x3a,0x89,0xc6,0xa2, 0x48,0x70,0x57,0x32,0x92,0x91,0xb6,0xd7,0xb0,0x1c,0x08,0x41,0x23,0xfd,0xd1,0xfb,0x3c,0x70,0x2b,0x95, 0x98,0xae,0x2f,0x73,0xcb,0x7a,0x79,0x16,0xf8,0xdd,0x45,0x83,0xc4,0x3d,0xb7,0x25,0xc2,0x69,0xd5,0x1d, 0x3e,0xe0,0x1e,0x54,0x09,0xf6,0xf1,0xc6,0x82,0xc7,0xf4,0x77,0x03,0x3b,0x77,0x8f,0x5e,0x86,0x82,0x77, 0x7c,0xfa,0xf9,0xed,0x3d,0xc5,0x49,0x81,0x1f,0x9a,0x19,0xcf,0x9a,0x3a,0xc1,0x82,0x53,0xac,0x1d,0x59, 0xdd,0x30,0x1d,0xb0,0x5f,0xb8,0xdb,0x50,0xc1,0x01,0x1a,0x52,0x74,0x7b,0xaa,0x1b,0x4a,0x82,0x80,0x3e, 0xdc,0x30,0xca,0xe4,0xc2,0x13,0x52,0xc8,0xa3,0xcf,0xf3,0x38,0x37,0x4c,0x17,0x16,0x9b,0x29,0x56,0x2a, 0x98,0x87,0x94,0xbd,0xe8,0x3b,0x19,0x7a,0x65,0x49,0x48,0x3a,0x09,0x42,0x51,0xad,0x0f,0x3b,0x1b,0xe2, 0x39,0xe5,0xd7,0x2f,0x8f,0xbe,0x09,0x8b,0xfe,0xe9,0x63,0xf8,0x38,0xcf,0xcd,0xd7,0x2f,0xbd,0xbe,0xa2, 0xe2,0xff,0x00,0xba,0x58,0xfd,0xbf,0xab,0xc4,0x98,0xae,0xa2,0x88,0x6d,0x55,0xa7,0x9a,0x27,0x63,0x9c, 0xd0,0x5b,0x0b,0xcc,0xc7,0x09,0x71,0x5f,0x9c,0x1c,0x6c,0x3d,0x5a,0xde,0xcf,0xd6,0x0a,0x24,0x38,0xfc, 0x54,0xa7,0xd4,0x76,0xf3,0x1e,0x5e,0x60,0x04,0xa5,0x20,0x9f,0x5a,0x49,0x3e,0xe0,0x71,0x2b,0x9b,0x13, 0xab,0xad,0xf9,0x25,0x3e,0xc2,0xae,0x63,0x13,0x63,0x29,0x6c,0x74,0x3c,0xcb,0x81,0x69,0x3f,0x6a,0x91, 0xad,0x8f,0x1b,0x1e,0xdc,0x11,0x1c,0xbc,0xe5,0xf8,0x3b,0x18,0x36,0x30,0x08,0x3b,0xfe,0xa9,0x63,0xf8, 0x78,0x13,0xcd,0x6a,0x6a,0x9a,0x8e,0x52,0x5d,0xb7,0x53,0x55,0x06,0x02,0x0b,0x91,0xba,0x93,0x16,0x3a, 0x1a,0x07,0xed,0x53,0xef,0xd2,0x07,0x0f,0x68,0xcd,0x11,0xd4,0x22,0x28,0xb8,0x24,0x8e,0xf4,0xb5,0xf8, 0x71,0x69,0x20,0x27,0x3c,0x1a,0xa4,0x72,0x4c,0xe6,0xff,0x00,0x19,0xaf,0xa3,0xc7,0xe8,0x64,0x37,0x05, 0x17,0x08,0xee,0x49,0x94,0x96,0xfa,0x9f,0x49,0x4b,0x4d,0x27,0x48,0x2a,0xda,0x40,0xd7,0xb9,0xe9,0xdf, 0xdc,0x47,0xbf,0x06,0x79,0x55,0xf4,0xb6,0x75,0x71,0x3f,0x1c,0x6a,0xd6,0x6d,0x7c,0xda,0xc6,0x52,0xeb, 0xb3,0x5c,0xb7,0xb4,0x7d,0x12,0x12,0x7c,0x00,0x1a,0x13,0x11,0xd0,0x7f,0x1e,0xb2,0x3e,0xe0,0x3e,0x4e, 0xf8,0x4e,0x15,0x8d,0x66,0x38,0x3b,0x4d,0xdf,0x56,0xa1,0xf7,0x1a,0xe8,0x0d,0x48,0x42,0x8b,0x6f,0xb5, 0xf6,0x2d,0xfe,0x8b,0x89,0x21,0x43,0xef,0xd7,0xb7,0xdf,0xbf,0x6e,0x22,0x9f,0xc9,0xd7,0x0f,0x53,0x09, 0x61,0x77,0x57,0xcb,0x6d,0x27,0x61,0x2a,0x4c,0x22,0x01,0xfb,0xff,0x00,0xd5,0xfd,0xf8,0xa7,0x75,0xa8, 0xdb,0xc5,0x73,0x22,0x91,0x83,0xb8,0xf3,0x8c,0xf3,0xe7,0x58,0x86,0x19,0x1a,0x14,0x2b,0xe4,0x3b,0x51, 0x4f,0xcd,0x56,0x4b,0xad,0xfd,0x7a,0x57,0xb0,0xfe,0xdd,0xb7,0xff,0x00,0xd3,0xe0,0x56,0x63,0x85,0xdd, 0xe2,0x58,0xb5,0x86,0x4d,0x37,0x2a,0x91,0x65,0x1e,0xb9,0xbe,0xeb,0x91,0x19,0x9b,0x6b,0x1d,0x6e,0x8f, 0xb8,0x38,0x6c,0x16,0x12,0x7f,0x12,0x85,0x7e,0xce,0x34,0xff,0x00,0x46,0xec,0x23,0xfb,0xce,0xe7,0xff, 0x00,0x95,0x0b,0xf9,0x6e,0x3a,0xc5,0xfc,0x9d,0xb1,0x08,0x92,0x51,0x26,0x25,0xdd,0xf4,0x77,0xdb,0x3d, 0x48,0x75,0xa4,0xc2,0x4a,0xd2,0x7e,0xf0,0x44,0x7d,0x83,0xc0,0x06,0xad,0x08,0x3c,0xb1,0x23,0xd2,0xb7, 0xf2,0xd2,0x7f,0xc6,0x96,0xee,0x2f,0xb2,0x4c,0x1e,0xab,0x16,0xc8,0x20,0x5c,0xbf,0x31,0xac,0x8e,0x6b, 0x2d,0xb9,0x5f,0x35,0xd7,0x64,0xb2,0xcb,0x6e,0x68,0x78,0x5b,0xae,0x2d,0xde,0xb1,0xf7,0xa5,0x69,0x41, 0xf7,0xe8,0xe2,0x94,0xc8,0x29,0xe0,0x49,0x9a,0xc4,0x57,0x5b,0x79,0x2c,0x99,0xae,0x46,0x57,0x69,0x5e, 0xa0,0xd2,0x52,0xd1,0x48,0x1b,0xf1,0xb1,0xd6,0xa3,0xbf,0x27,0xdb,0xdf,0xc6,0xbe,0xb2,0xa3,0xe5,0x2e, 0x2b,0x56,0xae,0xf4,0xa3,0x2e,0xe5,0x68,0x70,0xbc,0xd2,0x2c,0x4b,0x6a,0x65,0xb5,0xfc,0xd6,0x19,0x6d, 0x08,0x68,0xaf,0xfc,0xea,0x49,0x57,0xe3,0xc5,0x6d,0xcb,0x5e,0x57,0x55,0xe6,0x55,0xf2,0x6d,0x2c,0xac, 0x67,0xc4,0x0c,0xd8,0xc8,0xe8,0x11,0x54,0x94,0xac,0x92,0x96,0x7a,0x55,0xd4,0xa0,0xa1,0xe3,0xa1,0x7f, 0x2d,0x9e,0xa1,0xe4,0x01,0xe7,0x31,0xea,0x50,0x6e,0x67,0x03,0x8e,0x33,0xc7,0x5e,0x78,0xfe,0x2b,0xad, 0x04,0xb8,0xc6,0x69,0x5f,0x1e,0xe4,0xce,0x39,0x6b,0x97,0x37,0x87,0xb4,0xc4,0x76,0xa4,0x9a,0xf4,0xcf, 0x4d,0x93,0xcd,0xbe,0xb1,0xd0,0x7d,0x9b,0x2c,0xa5,0xe4,0xed,0x43,0x63,0x6a,0x0b,0xd7,0xf9,0x47,0xc9, 0xb7,0xfd,0x16,0x2b,0xbd,0xcd,0xbd,0x3f,0x8f,0x1f,0xd5,0x52,0x7f,0x9c,0xe1,0xe7,0xf3,0x31,0x8e,0x1a, 0xe1,0x5c,0xab,0x6b,0xa5,0xc3,0x0b,0xee,0x76,0x14,0x63,0x94,0x15,0xfe,0xb9,0x4f,0x67,0x5d,0x5f,0x8f, 0x11,0x53,0xc8,0x8c,0x38,0x0d,0x19,0x36,0x07,0xf1,0x2c,0xc4,0xff,0x00,0xf4,0x70,0x63,0xac,0xc3,0x8f, 0xda,0xc4,0x7d,0xb3,0x58,0xf9,0x49,0x3c,0x45,0x21,0xdf,0xfe,0x4d,0xb5,0x54,0x54,0x13,0xef,0x24,0x4d, 0xad,0x9a,0xcc,0x16,0x14,0xfa,0xe3,0xb5,0x02,0x43,0x4b,0x74,0x24,0x6c,0xa4,0x2c,0xca,0x57,0x49,0x3f, 0x7f,0x49,0xfd,0x87,0x8a,0xd7,0x2b,0xc0,0x29,0xe9,0xb1,0xfa,0x8c,0xb6,0xb5,0xa5,0x44,0x36,0x09,0x0e, 0x35,0x15,0x05,0x64,0x32,0x82,0x3f,0x45,0x4a,0x51,0x25,0x6a,0xff,0x00,0x36,0x90,0x3f,0xcb,0xc7,0xd1, 0x71,0xf9,0x1f,0x89,0xc7,0x7d,0x0f,0xc7,0x9b,0x66,0xcb,0xcd,0x90,0xa4,0x38,0xda,0x22,0xa5,0x48,0x23, 0xe6,0x08,0x67,0x60,0xfe,0x23,0x8e,0x79,0x07,0x24,0x28,0xad,0xa3,0xc8,0x0a,0xc8,0x2f,0x50,0xfb,0xa9, 0x2a,0x0b,0x2b,0x6b,0xa1,0x4e,0xeb,0xc3,0x8e,0x25,0x2d,0xa7,0xb8,0x77,0xee,0x49,0x04,0xfd,0xe3,0xc1, 0x1a,0x8f,0x58,0x84,0xb0,0x0c,0xc4,0xfd,0xab,0x86,0xd6,0x4d,0xbd,0x28,0x7f,0xe4,0xda,0xeb,0x31,0xeb, 0xf2,0xa9,0x12,0x1d,0x43,0x4d,0x34,0x98,0xcb,0x5b,0x8b,0x50,0x48,0x42,0x47,0x78,0x95,0x12,0x7c,0x00, 0x35,0xb2,0x7f,0x0e,0x18,0x06,0x67,0x63,0x93,0x4e,0x72,0xbb,0x96,0xb8,0xfb,0xd9,0x23,0xa8,0x70,0xb6, 0xed,0xa3,0xaa,0x2c,0x55,0xc6,0x50,0x56,0x89,0x53,0xe7,0x7d,0xd2,0x9d,0xa5,0x5d,0x0d,0x05,0x75,0x24, 0xec,0x7b,0x1e,0x16,0x3f,0x27,0xba,0xda,0xeb,0x48,0x39,0x2c,0x4b,0x38,0x10,0xe7,0xc7,0xee,0xc4,0x3d, 0xa9,0x0c,0x25,0xc4,0x12,0x3b,0xfa,0x3d,0x2a,0xd8,0xe2,0x04,0xdc,0xe3,0x90,0x10,0x33,0x0b,0xba,0x0b, 0x8c,0x52,0x86,0x10,0xaa,0x71,0x2c,0x7c,0x52,0xf1,0xee,0xe0,0x92,0xfe,0xd6,0x97,0x90,0x94,0xa1,0x92, 0x42,0x51,0xa4,0x8e,0xa5,0x11,0xd4,0x54,0x74,0x08,0x01,0x4a,0x07,0xea,0x30,0x8f,0xa8,0x92,0x54,0x9c, 0x01,0xd8,0x56,0x34,0xbc,0x8b,0x51,0xcf,0x89,0xee,0x6a,0xd8,0xa3,0xe5,0x2d,0xa4,0xd2,0xec,0xfc,0xf3, 0x35,0xb8,0xb0,0x9e,0xf3,0x0a,0x42,0x22,0x52,0xca,0x76,0xba,0x0c,0x3e,0xa0,0x93,0xe8,0x0d,0xa8,0x38, 0xea,0x92,0xa0,0xb0,0x16,0xe2,0xb4,0x42,0xbc,0xa0,0x70,0x2a,0x66,0x29,0xcc,0xac,0x27,0x46,0xa6,0x62, 0x73,0xea,0x34,0xe8,0x08,0xf3,0x16,0x96,0x2d,0x58,0x4f,0xa5,0x3e,0x1d,0xfe,0x8e,0x4e,0x92,0x16,0x48, 0x50,0x42,0xd4,0x55,0xad,0xf1,0x5f,0x8c,0xeb,0xf2,0x64,0x03,0x42,0xb7,0x1b,0xff,0x00,0x95,0x1d,0xfe, 0x5f,0xf0,0x1c,0x41,0xc8,0x79,0x8b,0xf9,0x3a,0x40,0xaa,0x54,0xaa,0xdc,0x62,0x82,0xda,0x4a,0x16,0xd8, 0x10,0xda,0xc6,0xcb,0x4b,0x5a,0x0a,0xd2,0x97,0x0a,0x54,0xe3,0x01,0x3d,0x49,0x4e,0xd4,0x12,0x54,0x01, 0xe9,0x03,0xa8,0x6f,0x7c,0x4c,0x32,0xab,0x0d,0x85,0x0d,0x38,0x10,0x83,0x9d,0xd5,0x73,0x72,0xf3,0x31, 0xa4,0xc9,0x25,0x3b,0x0e,0x3a,0xe4,0xc2,0xb4,0x64,0x0f,0x89,0xaa,0xb0,0x69,0x51,0xa6,0x47,0x3d,0x20, 0xe9,0x6d,0x2f,0xcf,0x8e,0xa1,0xea,0x4f,0x52,0x7c,0x8f,0x3c,0x26,0x72,0x1e,0x64,0x2a,0xde,0x58,0x58, 0xcf,0xb1,0x97,0x1e,0x1c,0x56,0xad,0x16,0x5c,0x7d,0xf7,0x52,0xdb,0x69,0x1d,0xb6,0x40,0xda,0x94,0x40, 0x1e,0xff,0x00,0x33,0xf3,0xe1,0xd3,0x09,0xc7,0x30,0x65,0xb3,0x5f,0x75,0x8e,0xe3,0x54,0x4c,0x33,0x29, 0x84,0x49,0x8c,0xfb,0x15,0xad,0xb2,0xa2,0x85,0x23,0xa9,0x0a,0xd7,0x4a,0x54,0x9d,0x8d,0x1f,0x91,0x03, 0xc1,0x03,0x84,0x6e,0x45,0xd2,0xd3,0xdc,0xf2,0xf5,0xf6,0xae,0x2a,0xab,0xec,0x50,0x8b,0x57,0xba,0x51, 0x2a,0x32,0x1d,0x09,0xdb,0x4c,0xef,0x5d,0x40,0xeb,0x7f,0xfa,0x71,0x42,0xcc,0x46,0x34,0xa9,0xc2,0x82, 0x06,0x47,0xe6,0x92,0x9c,0x37,0xcf,0x45,0x93,0x93,0x83,0xf8,0xa2,0x11,0x32,0x6c,0xa7,0x33,0x57,0x6b, 0x96,0x78,0xd7,0xc5,0xc4,0x23,0x5f,0x4f,0x5c,0xa5,0x71,0x6b,0x87,0x83,0xe5,0x09,0x23,0xba,0xff,0x00, 0x94,0xa9,0x27,0xa4,0x69,0x2a,0xd7,0x9d,0x11,0xc3,0x3c,0x0e,0x4d,0x2e,0x45,0x74,0xd3,0x93,0xe7,0xd9, 0x65,0x95,0xb4,0xa4,0x84,0xfc,0x64,0x09,0xcb,0xae,0x6a,0x2e,0x8a,0x88,0x2c,0xb0,0xd2,0xba,0x01,0xe9, 0x29,0x04,0xb9,0xdc,0xd9,0x4e,0xfc,0x7b,0x71,0xc1,0x5c,0xba,0xe5,0xf2,0xbf,0x4b,0x05,0xc5,0xcf,0xed, 0xa9,0x63,0xf8,0x78,0xac,0xb9,0x80,0x8a,0xac,0x7b,0x9a,0x18,0xe6,0x31,0x57,0xc9,0x5c,0x62,0xc2,0x05, 0xa9,0x74,0x29,0xc5,0x43,0x84,0x97,0xa5,0xf6,0xd1,0xdc,0x5f,0x63,0x6a,0x09,0x47,0x6c,0x69,0x5f,0x6a, 0x00,0x59,0xf4,0xa7,0xa4,0x7a,0xf8,0x95,0x6f,0x2c,0x4b,0xc2,0x2f,0xbd,0x3f,0x22,0x39,0xf1,0xa7,0xab, 0x1a,0xee,0x67,0xe1,0x05,0x6b,0x97,0x11,0x3c,0xc0,0xa4,0x46,0xd7,0xf1,0x10,0x1a,0x4b,0x16,0x8d,0x23, 0xd4,0xa3,0xd4,0xc6,0xfb,0x6f,0xff,0x00,0x61,0x23,0xb6,0x52,0xaf,0x1b,0x23,0x89,0x4a,0xca,0x28,0xb2, 0x7e,0x5d,0x65,0x2b,0xa8,0x9c,0x1f,0x71,0x8a,0xe9,0x48,0x91,0x1d,0xc0,0xa6,0xdf,0x61,0x41,0xb5,0x02, 0x1c,0x69,0x60,0x2d,0x07,0x69,0x23,0xd4,0x06,0xc8,0x3a,0xdf,0x12,0x7f,0x37,0x5c,0xbe,0xff,0x00,0x02, 0xe2,0xff,0x00,0x77,0xf5,0x4b,0x1f,0xc3,0xc7,0x1c,0x83,0x17,0xc6,0xa9,0xf1,0x0b,0xe7,0x6a,0x31,0xda, 0x7a,0xf7,0x05,0x5c,0xad,0x2e,0x34,0x26,0xda,0x23,0xec,0x57,0xf3,0x4a,0x47,0x06,0xb2,0x78,0x9e,0xed, 0x18,0x2e,0x0e,0x47,0x7a,0x1d,0xc2,0x3a,0xc0,0xe0,0xb7,0x18,0x34,0x2b,0x97,0xd7,0x35,0x38,0xff,0x00, 0x25,0x2a,0x6c,0xee,0xac,0x23,0xd7,0xc4,0x47,0xc4,0x05,0x3a,0xf3,0x81,0x20,0x9e,0xf3,0xa7,0x49,0x04, 0xed,0x4a,0x3a,0x3a,0x48,0xd9,0x3a,0xf0,0x37,0xc6,0x57,0xd8,0xe7,0xb9,0xca,0xc7,0xd4,0x8a,0x01,0x4b, 0x4e,0xe1,0xd7,0xd3,0xf7,0xcd,0x29,0xb0,0xb4,0x1d,0x7a,0xa3,0x45,0xf0,0xe3,0x9b,0x4a,0x82,0x90,0xb5, 0x94,0x24,0xe8,0x82,0x78,0xf7,0x96,0x38,0xee,0x3f,0x77,0xca,0xea,0x05,0xdc,0xd1,0x55,0xd9,0x2d,0x08, 0x7d,0x29,0x54,0xb8,0x8d,0xba,0x52,0x3e,0x21,0xc3,0xaf,0x50,0x3f,0x3d,0xf0,0x55,0x78,0x17,0x2d,0x93, 0x29,0xb8,0x8b,0xc2,0xf1,0x24,0xc8,0x71,0x0a,0x71,0x0d,0x1a,0xc8,0xe1,0x6b,0x42,0x4a,0x42,0x94,0x07, 0x46,0xc8,0x05,0x68,0x04,0xfc,0xba,0x87,0xde,0x38,0x26,0xac,0x62,0x5d,0x42,0x52,0xcb,0x93,0x93,0xde, 0xb1,0x60,0x18,0xda,0x46,0x01,0xf0,0x1d,0xaa,0x6c,0x7e,0x4c,0x85,0x52,0x11,0x2f,0x3d,0xcc,0xdd,0xbe, 0x53,0xc9,0x90,0xab,0x54,0x58,0xa9,0xa4,0x07,0x00,0x4e,0xd2,0x98,0xa9,0x3d,0x80,0xd1,0x50,0x27,0xa0, 0xa5,0x47,0x4a,0x23,0xac,0xf0,0x02,0x6a,0xb9,0x8f,0x84,0x28,0x37,0x94,0x52,0xfd,0x6b,0xa8,0x6c,0x84, 0xfd,0x35,0x42,0xc1,0x12,0x10,0x9f,0x4a,0x42,0x9e,0x87,0xb2,0xad,0xec,0xad,0x45,0x4d,0x12,0x00,0x1e, 0x13,0xc4,0x97,0x71,0x2e,0x53,0x35,0x74,0xcd,0x33,0xf8,0xd6,0x12,0xdd,0x9c,0x86,0xcb,0x8c,0xc3,0x5c, 0x18,0xa1,0xf7,0x12,0x3a,0xbd,0x49,0x41,0x1d,0x44,0x7a,0x55,0xe4,0x0f,0xec,0x9f,0xb8,0xf0,0xb3,0x8e, 0x72,0xfe,0x92,0x97,0x26,0x95,0x17,0x2d,0xc7,0x71,0x7b,0x18,0xf7,0x53,0x9e,0x14,0xc5,0xaa,0x58,0x89, 0x6e,0x22,0x52,0x5d,0x71,0x11,0x94,0x12,0xd2,0x56,0x56,0x58,0x4f,0x5f,0x71,0x45,0x40,0x94,0x29,0x3e, 0x92,0x94,0xa9,0xe5,0x24,0xb8,0x8a,0x55,0xc3,0x2e,0x68,0xeb,0x14,0x8a,0x72,0x1a,0x8d,0x67,0xb7,0xd4, 0xb9,0x2f,0x23,0xae,0x6c,0xe8,0xec,0x63,0xcf,0x8c,0xaf,0x87,0x3d,0x6d,0x2f,0xca,0x09,0x7d,0xb3,0xa5, 0x24,0xfa,0x92,0x7c,0x83,0xd2,0xa0,0x08,0xdf,0xb7,0x05,0xab,0x2e,0x29,0xf1,0xee,0x54,0x50,0xd9,0x5c, 0x58,0x47,0xaf,0x86,0x9a,0xe6,0xba,0x9c,0x7d,0xc0,0x90,0xa5,0x76,0xb7,0xa4,0x82,0x76,0xa5,0x1d,0x1d, 0x24,0x6c,0x9d,0x78,0x1b,0xe0,0x57,0x34,0x31,0xfa,0x2a,0x7e,0x57,0x5f,0x2a,0xa2,0x8e,0xb6,0xbc,0x94, 0x30,0x09,0x8b,0x11,0xb6,0x8f,0xfa,0xc3,0x5f,0xaa,0x07,0x1d,0x9c,0x87,0x8b,0xb5,0xca,0x4a,0xec,0x83, 0x26,0xc7,0xa0,0x5b,0x31,0x57,0x8f,0xa6,0x4a,0xc3,0xd0,0x5a,0x79,0xce,0xdb,0x6d,0x77,0x14,0x94,0xf5, 0xf8,0x3e,0xc7,0x5b,0x23,0xf6,0xf1,0x65,0xf6,0x36,0x8a,0xbd,0x71,0xb8,0xf6,0x14,0x8a,0x86,0xfa,0x83, 0x73,0xfd,0xa3,0xb9,0xa8,0xf5,0xf3,0xf3,0xcc,0xe5,0xc0,0x30,0x8a,0x01,0x4d,0x4e,0xe1,0xd7,0xd3,0xf7, 0xcd,0x29,0xb0,0xb4,0x1d,0x7a,0xa3,0x45,0xf0,0xe3,0x9b,0x4a,0x82,0x90,0xb5,0x94,0x24,0xe8,0x82,0x78, 0x62,0x8d,0xc9,0x94,0x9a,0x42,0x25,0xe7,0xd9,0x9b,0xb7,0xca,0x79,0x32,0x15,0x6a,0x8b,0x15,0x34,0x80, 0xe0,0x09,0xda,0x53,0x15,0x27,0xb0,0x1a,0x2a,0x04,0xf4,0x14,0xa8,0xe9,0x44,0x75,0x9e,0x13,0xdd,0xad, 0xe5,0xd4,0x7b,0x58,0x75,0x96,0x7c,0xa6,0xab,0xad,0x91,0x31,0x25,0x6c,0xfc,0x4d,0x75,0x68,0x4a,0x92, 0x1f,0x8e,0xc1,0xf5,0x25,0x64,0x6f,0xaa,0x53,0x7a,0x4f,0xba,0xb4,0xa0,0x90,0x55,0xd2,0x95,0x48,0x35, 0xdc,0x99,0x55,0xfa,0x69,0xdb,0xc6,0xf0,0xb7,0x5e,0xf8,0x67,0xe4,0x3a,0xeb,0x70,0x62,0x29,0xb8,0xe1, 0x97,0x19,0x6d,0x49,0x70,0xff,0x00,0x65,0x45,0x4f,0xa7,0x40,0x8f,0x92,0xbd,0xb4,0x37,0x1e,0x29,0xe3, 0x88,0x61,0x54,0xd3,0xcf,0x1b,0x31,0xeb,0x52,0x66,0xaf,0x98,0xd8,0x42,0x83,0x79,0x45,0x2f,0xd6,0xba, 0x86,0xc8,0x4f,0xd3,0x54,0x2c,0x11,0x21,0x09,0xf4,0xa4,0x29,0xe8,0x7b,0x2a,0xde,0xca,0xd4,0x54,0xd1, 0x20,0x01,0xe1,0x3c,0x18,0x9d,0x7d,0x49,0x92,0xf2,0x93,0x20,0xb1,0xa4,0xb1,0x8f,0x3e,0x29,0xac,0x78, 0xf5,0x34,0xbf,0x28,0x3d,0xb2,0x74,0xa4,0x9f,0x52,0x4f,0x90,0x7a,0x54,0x01,0x1b,0xf6,0xe0,0x43,0x34, 0x3c,0x99,0x7a,0x7a,0x6b,0xd9,0xa6,0xc0,0x5c,0x98,0xa5,0xa9,0xb4,0xc7,0x44,0x68,0x85,0xc2,0xa4,0x90, 0x14,0x9e,0x90,0x37,0xb0,0x48,0x04,0x7c,0xb6,0x38,0x35,0x7d,0x8f,0xd0,0xd4,0x60,0x39,0x32,0xaa,0x28, 0xeb,0x2b,0xd5,0xf4,0x5b,0xe0,0x98,0xb1,0x1b,0x68,0xeb,0xb6,0xaf,0xd5,0x00,0xf0,0xc6,0x9e,0xd1,0x1b, 0xc8,0xc8,0x5c,0x1c,0x8e,0xf4,0x3b,0x85,0x65,0x85,0x81,0x3c,0x60,0xd0,0x1e,0x5f,0x5c,0xd4,0xe3,0xfc, 0x94,0xa8,0xb3,0xba,0xb0,0x8f,0x5f,0x11,0x3f,0x11,0xb7,0x5e,0x70,0x24,0x13,0xde,0x74,0xe9,0x20,0x9d, 0xa9,0x47,0x47,0x49,0x1b,0x27,0x5e,0x06,0xf8,0xc8,0x36,0x19,0xee,0x72,0xb0,0x30,0x8a,0x01,0x4d,0x4e, 0xe1,0xd7,0xd3,0xf7,0xcd,0x29,0xb0,0xb4,0x1d,0x7a,0xa3,0x45,0xf0,0xe3,0x9b,0x4a,0x82,0x90,0xb5,0x94, 0x24,0xe8,0x82,0x78,0xf7,0x96,0x38,0xee,0x3f,0x75,0xca,0xea,0x05,0xdc,0xd1,0x55,0xd9,0x2d,0x28,0x7d, 0x29,0x54,0xb8,0x8d,0xba,0x52,0x3e,0x21,0xcf,0x1e,0xa0,0x4f,0xbe,0xff,0x00,0xe3,0xc1,0xa3,0xcb,0xae, 0x5f,0x1f,0x7c,0x13,0x17,0xfd,0xd2,0xc7,0xf0,0x71,0xad,0x58,0xc2,0xba,0x8c,0xac,0xcb,0x93,0x93,0xde, 0x87,0xa7,0x86,0x36,0x91,0x80,0x7c,0x07,0x6a,0x91,0x1b,0x93,0x09,0x55,0x2e,0xa5,0xe7,0x99,0x9b,0xb7, 0xca,0x79,0x32,0x15,0x6a,0x8b,0x15,0x34,0x80,0xe0,0x09,0xda,0x53,0x15,0x27,0xb0,0x1a,0x2a,0x04,0xf4, 0x14,0xa8,0xe9,0x44,0x75,0x9e,0x00,0x4d,0x57,0x31,0xf0,0x85,0x06,0xf2,0x8a,0x5f,0xad,0x75,0x0d,0x90, 0x9f,0xa6,0xa8,0x58,0x22,0x42,0x13,0xe9,0x48,0x53,0xd0,0xf6,0x55,0xbd,0x95,0xa8,0xa9,0xa2,0x40,0x03, 0xc2,0x78,0x2f,0xf9,0xba,0xe5,0xf1,0x3b,0xfa,0x8b,0x8b,0xfe,0xe9,0x63,0xf8,0x78,0xcf,0xcd,0xd7,0x2f, 0xbf,0xc0,0xb8,0xbf,0xee,0x96,0x3f,0x87,0x84,0xe5,0xb9,0x86,0x55,0xc3,0x2e,0x69,0x94,0x86,0x45,0x39, 0x0d,0x5e,0x4d,0xbe,0xa4,0xc9,0x79,0x49,0x90,0x58,0xd2,0x58,0xc7,0x9f,0x14,0xd6,0x3c,0x7a,0x9a,0x5f, 0x94,0x1e,0xd9,0x3a,0x52,0x4f,0xa9,0x27,0xc8,0x3d,0x2a,0x00,0x8d,0xfb,0x70,0x17,0x97,0xd7,0x35,0x38, 0xff,0x00,0x25,0x2a,0x2c,0xee,0xac,0x23,0xd7,0xc4,0x4f,0xc4,0x6d,0xd7,0x9c,0x09,0x04,0xf7,0x9d,0x3a, 0x48,0x27,0x6a,0x51,0xd1,0xd2,0x46,0xc9,0xd7,0x81,0xbe,0x0f,0x5e,0xe3,0xf4,0x34,0xf8,0x06,0x4c,0xaa, 0x8a,0x3a,0xca,0xf5,0x7d,0x16,0xf8,0x26,0x2c,0x46,0xda,0x3a,0xed,0xab,0xf5,0x40,0x3c,0x02,0xe5,0x96, 0x39,0x8f,0xdd,0xf2,0xb2,0x85,0x57,0x54,0x55,0x76,0x4a,0x4a,0x1f,0x4a,0x55,0x2a,0x23,0x6e,0x94,0xa7, 0xe2,0x1c,0x3a,0x05,0x40,0x91,0xe7,0x8b,0x40,0x21,0xd1,0x5b,0xae,0x37,0x0e,0xc6,0x90,0x6d,0xdf,0x50, 0x5f,0x3d,0xa7,0xb8,0xaf,0x2b,0xe7,0xe7,0x99,0xcb,0x80,0x61,0x14,0x02,0x9a,0x9d,0xc3,0xaf,0xa7,0xef, 0x9a,0x53,0x61,0x68,0x3a,0xf5,0x46,0x8b,0xe1,0xc7,0x36,0x95,0x05,0x21,0x6b,0x28,0x49,0xd1,0x04,0xf0, 0xc5,0x1b,0x93,0x29,0x34,0x84,0x4b,0xcf,0xb3,0x37,0x6f,0x94,0xf2,0x64,0x2a,0xd5,0x16,0x2a,0x69,0x01, 0xc0,0x13,0xb4,0xa6,0x2a,0x4f,0x60,0x34,0x54,0x09,0xe8,0x29,0x51,0xd2,0x88,0xeb,0x3c,0x70,0x3c,0xba, 0xe5,0xf1,0xf7,0xc1,0x31,0x7f,0xdd,0x2c,0x7f,0x07,0x19,0xf9,0xba,0xe5,0xf1,0x3b,0xfa,0x8b,0x8b,0xfe, 0xe9,0x63,0xf8,0x78,0x8b,0x15,0xcc,0x31,0x0c,0x2a,0x9a,0x7d,0xe2,0x76,0x3d,0x68,0x3c,0xc7,0x39,0x8b, 0x84,0x28,0x37,0x94,0x52,0xfd,0x6b,0xa8,0x6c,0x84,0xfd,0x35,0x42,0xc1,0x12,0x10,0x9f,0x4a,0x42,0x9e, 0x87,0xb2,0xad,0xec,0xad,0x45,0x4d,0x12,0x00,0x1e,0x13,0xc1,0x89,0xd7,0xd4,0x99,0x2f,0x29,0x32,0x0b, 0x1a,0x4b,0x18,0xf3,0xe2,0x9a,0xc7,0x8f,0x53,0x4b,0xf2,0x83,0xdb,0x27,0x4a,0x49,0xf5,0x24,0xf9,0x07, 0xa5,0x40,0x11,0xbf,0x6e,0x33,0xf3,0x75,0xcb,0xef,0xf0,0x2e,0x2f,0xfb,0xa5,0x8f,0xe1,0xe3,0xa5,0xfe, 0x3f,0x43,0x51,0xcb,0xdc,0x95,0x55,0x14,0x55,0x75,0xea,0xfa,0x2e,0x40,0x26,0x2c,0x56,0xda,0x3a,0xed, 0xab,0xf5,0x40,0x3c,0x33,0xa7,0x3c,0x2d,0x78,0x85,0x57,0x07,0x23,0xbd,0x0a,0xe1,0x59,0x61,0x60,0x4f, 0x18,0x34,0x03,0x97,0xd7,0x35,0x38,0xff,0x00,0x25,0x2a,0x2c,0xee,0xac,0x23,0xd7,0xc4,0x4f,0xc4,0x6d, 0xd7,0x9c,0x09,0x04,0xf7,0x9d,0x3a,0x48,0x27,0x6a,0x51,0xd1,0xd2,0x46,0xc9,0xd7,0x81,0xbe,0x32,0x05, 0x86,0x7b,0x9c,0xa8,0x0c,0x22,0x80,0x52,0xd3,0xb8,0x75,0xf4,0xfd,0xf3,0x4a,0x6c,0x2d,0x07,0x5e,0xa8, 0xd1,0x7c,0x38,0xe6,0xd2,0xa0,0xa4,0x2d,0x65,0x09,0x3a,0x20,0x9e,0x3d,0xe5,0x8e,0x3b,0x8f,0xdd,0x72, 0xba,0x81,0x77,0x34,0x55,0x56,0x4a,0x4a,0x1f,0x4a,0x55,0x2e,0x23,0x6f,0x14,0x8f,0x88,0x70,0xeb,0xd4, 0x09,0x1e,0x77,0xff,0x00,0x1e,0x0d,0x1e,0x5d,0x72,0xf8,0xfb,0xe0,0x98,0xbf,0xee,0x96,0x3f,0x83,0x8d, 0xea,0xc6,0x25,0xd4,0x25,0x66,0x5c,0x9c,0x9e,0xf4,0x3b,0x00,0xe6,0xd2,0x30,0x0f,0x80,0xec,0x2a,0x44, 0x7e,0x4c,0x25,0x54,0xba,0x97,0x9e,0x66,0x6e,0xdf,0x29,0xe4,0xc8,0x55,0xaa,0x2c,0x54,0xd2,0x03,0x80, 0x27,0x69,0x4c,0x54,0x9e,0xc0,0x68,0xa8,0x13,0xd0,0x52,0xa3,0xa5,0x11,0xd6,0x78,0x01,0x35,0x5c,0xc7, 0xc2,0x14,0x1b,0xca,0x29,0x7e,0xb5,0xd4,0x36,0x42,0x7e,0x9a,0xa1,0x60,0x89,0x08,0x4f,0xa5,0x21,0x4f, 0x43,0xd9,0x56,0xf6,0x56,0xa2,0xa6,0x89,0x00,0x0f,0x09,0xe0,0xbf,0xe6,0xeb,0x97,0xc4,0xef,0xea,0x2e, 0x2f,0xfb,0xa5,0x8f,0xe1,0xe3,0x3f,0x37,0x5c,0xbe,0xff,0x00,0x02,0xe2,0xff,0x00,0xba,0x58,0xfe,0x1e, 0x13,0x96,0xe6,0x19,0x57,0x0c,0xb9,0xa6,0x52,0x19,0x14,0xe4,0x35,0x05,0xcf,0x6f,0xa9,0x72,0x5e,0x47, 0x5c,0x59,0xd1,0xd8,0xc7,0x9f,0x19,0x5f,0x0e,0x7a,0xda,0x5f,0x94,0x12,0xfb,0x67,0x4a,0x49,0xf5,0x24, 0xf9,0x07,0xa5,0x40,0x11,0xbf,0x6e,0x0b,0x56,0x5c,0x53,0xe3,0xdc,0xa8,0xa1,0xb2,0xb8,0xb0,0x8f,0x5f, 0x0d,0x35,0xcd,0x75,0x38,0xfb,0x81,0x21,0x4a,0xed,0x6f,0x49,0x04,0xed,0x4a,0x3a,0x3a,0x48,0xd9,0x3a, 0xf0,0x37,0xc0,0xce,0x68,0x50,0x50,0xd4,0x72,0xa6,0xf9,0x55,0x34,0x75,0x95,0xea,0xe9,0x8e,0x3a,0xa2, 0xc4,0x6d,0xa3,0xaf,0x88,0x6f,0xf5,0x40,0x3c,0x12,0xc7,0x71,0xfa,0x0b,0xcc,0x23,0x1d,0x55,0xd5,0x15, 0x5d,0x92,0x9b,0xab,0x61,0x08,0x54,0xb8,0x6d,0xba,0x42,0x7a,0x01,0xd6,0xd4,0x0f,0x8d,0x9e,0x2c,0xc9, 0xf0,0xfe,0x8a,0xa3,0x9c,0x6e,0x3d,0x85,0x20,0x81,0xbe,0xa0,0xdf,0xf9,0x1d,0xe8,0x4d,0x7c,0xfc,0xf3, 0x39,0x70,0x0c,0x22,0x80,0x53,0x53,0xb8,0x75,0xf4,0xfd,0xf3,0x4a,0x6c,0x2d,0x07,0x5e,0xa8,0xd1,0x7c, 0x38,0xe6,0xd2,0xa0,0xa4,0x2d,0x65,0x09,0x3a,0x20,0x9e,0x18,0xa3,0x72,0x65,0x26,0x90,0x89,0x79,0xf6, 0x66,0xed,0xf2,0x9e,0x4c,0x85,0x5a,0xa2,0xc5,0x4d,0x20,0x38,0x02,0x76,0x94,0xc5,0x49,0xec,0x06,0x8a, 0x81,0x3d,0x05,0x2a,0x3a,0x51,0x1d,0x67,0x8e,0x07,0x97,0x5c,0xbe,0x3e,0xf8,0x26,0x2f,0xfb,0xa5,0x8f, 0xe0,0xe3,0x3f,0x37,0x5c,0xbe,0x27,0x7f,0x51,0x71,0x7f,0xdd,0x2c,0x7f,0x0f,0x11,0xa2,0xb9,0x86,0x21, 0x85,0x53,0x4f,0xbc,0x4e,0xc7,0xad,0x08,0x9a,0xbe,0x63,0x61,0x0a,0x0d,0xe5,0x14,0xbf,0x5b,0x2a,0x1b, 0x21,0x3f,0x4d,0x50,0xb0,0x44,0x84,0x27,0xd2,0x90,0xa7,0xa1,0xec,0xab,0x7b,0x2b,0x51,0x53,0x44,0x80, 0x07,0x84,0xf0,0xbf,0xce,0x4b,0xfa,0x5c,0x93,0x95,0x95,0xf6,0x54,0x76,0x51,0xe7,0xc5,0x5d,0x9b,0x67, 0xa9,0xa5,0x79,0x41,0x2d,0x3a,0x74,0xa4,0x9f,0x52,0x4f,0x90,0x7a,0x54,0x01,0x1b,0xf6,0xe1,0xdf,0xf3, 0x75,0xcb,0xef,0xf0,0x2e,0x2f,0xfb,0xa5,0x8f,0xe1,0xe1,0x27,0x9e,0xd4,0x34,0x54,0xd8,0x3c,0x4f,0xa1, 0xe9,0x2b,0x2b,0x8a,0xac,0x5b,0x49,0x31,0x62,0x21,0xa2,0x47,0x6d,0xcf,0x1e,0x90,0x3c,0x7e,0x1c,0x58, 0xfd,0x39,0x24,0x47,0x53,0x8d,0x95,0x70,0x49,0xa9,0xfa,0xb8,0x65,0xb1,0x70,0x4e,0x46,0x2a,0x27,0x28, 0x72,0x3a,0x7c,0x5b,0x96,0xd3,0xed,0xaf,0x65,0x2e,0x2c,0x34,0xd9,0x29,0x05,0xd0,0xc2,0xdc,0x09,0x51, 0x43,0x5a,0xdf,0x42,0x54,0x52,0x3e,0x5b,0xd6,0xb7,0xa1,0xf3,0xe0,0xed,0xb5,0xd5,0x26,0x55,0x01,0xb0, 0xba,0x0b,0x8b,0x2a,0xe5,0x15,0x39,0x1d,0xf1,0x8b,0xd9,0x3b,0xd2,0x4b,0x64,0x21,0xf6,0x96,0x96,0x01, 0x4a,0xd2,0xa2,0x40,0xe8,0x20,0xe8,0xec,0x2d,0x27,0xc7,0x1c,0x3f,0x27,0x7f,0xfa,0x19,0x38,0x03,0xe4, 0xcf,0x70,0x7f,0xf4,0xda,0xe0,0xba,0x70,0xd4,0x54,0x4c,0x5c,0xfc,0x1a,0xd6,0x56,0x23,0x31,0x47,0x6a, 0x6a,0x1a,0x52,0xa8,0x2e,0x9d,0x01,0xf6,0x91,0x55,0xf6,0x67,0xdb,0xdd,0x1d,0x0a,0x3b,0xfd,0x2e,0x07, 0xfa,0x81,0xa1,0x1a,0xa4,0x9b,0xf2,0x1b,0x3d,0x6b,0x3a,0x38,0x73,0x62,0x98,0xe9,0x8a,0x89,0x0f,0x2a, 0xcb,0xa9,0x94,0x98,0xd4,0xb6,0x19,0x4c,0xa8,0x4b,0x3a,0x0d,0xdd,0x60,0xb6,0x93,0x57,0x1f,0xc1,0x3e, 0x97,0x52,0x1a,0x71,0x48,0xf0,0x13,0xeb,0x2e,0xab,0x64,0x7a,0xb5,0xe4,0x43,0x9d,0x65,0x63,0x93,0x25, 0x0e,0xe6,0x4e,0x66,0x56,0x2c,0xa9,0x49,0x59,0xa9,0x63,0x0e,0xb3,0x89,0x04,0x27,0xc1,0x29,0x5b,0x69, 0x6d,0x6a,0x71,0x5b,0x1a,0x3d,0xc7,0x1c,0x6f,0xcf,0x84,0x1e,0x1d,0xeb,0x39,0x85,0x9b,0x57,0xb4,0xe4, 0x4b,0xdc,0x15,0x76,0xef,0xa1,0x1b,0x6a,0x6d,0x1c,0xc6,0x12,0xcb,0xde,0x48,0x01,0x4d,0xc8,0x71,0xb5, 0xb6,0xad,0x00,0x48,0x1d,0x60,0x6f,0xc1,0x3c,0x08,0x9c,0xff,0x00,0x30,0xb2,0xe4,0x83,0x7d,0x72,0x9c, 0x5a,0xb1,0x7e,0x7e,0x8d,0xa4,0x73,0xaa,0x4a,0xd3,0xe9,0x3a,0x76,0x5a,0x86,0xc7,0xf6,0x92,0x52,0xd2, 0x47,0xc8,0x87,0x0f,0x09,0xbb,0x40,0x8b,0xb8,0xb7,0xdc,0x63,0x3e,0xc3,0x34,0xe2,0xa3,0x96,0xc6,0xda, 0x1d,0x8f,0xe7,0xb8,0xcc,0x3b,0x28,0xb8,0xc3,0x88,0x97,0x0e,0x7a,0x23,0xa7,0xb3,0x5e,0xdd,0x14,0xe6, 0x56,0x84,0x84,0x9d,0xa5,0x2d,0x29,0x90,0x42,0x12,0x00,0xd1,0x1f,0x21,0xbd,0x27,0xdb,0x85,0xde,0x4f, 0xdf,0xd6,0x63,0x9c,0xb4,0xb1,0xb2,0xb8,0x72,0x43,0x30,0x9b,0xb0,0x73,0xb8,0xeb,0x71,0x5d,0x78,0x20, 0x76,0x9b,0x3b,0x57,0x6d,0x2a,0x29,0x1e,0x3d,0xc8,0xd7,0xe3,0xc5,0x8d,0x88,0xe3,0x94,0x98,0xe3,0x2a, 0x8d,0x4b,0x5a,0xc4,0x30,0xe1,0x0a,0x79,0x69,0x1b,0x71,0xe5,0x7e,0xb3,0x8e,0x1d,0xa9,0xc5,0x79,0x3e, 0xa5,0x12,0x78,0x4d,0xfc,0x9d,0xfc,0x61,0x13,0xcf,0x9f,0xeb,0x15,0x79,0x1f,0x2f,0xb3,0x6f,0x87,0x2c, 0xda,0x16,0xd2,0xae,0x0a,0x83,0xb7,0x23,0xc7,0xfc,0xd2,0xd7,0x01,0x85,0xe4,0x20,0xf9,0x1f,0xc5,0x6d, 0x77,0x63,0x82,0x67,0x94,0xcd,0x35,0x61,0x8f,0x5d,0x5f,0x57,0xbc,0x3a,0x99,0x75,0xbc,0x66,0xc1,0x63, 0x44,0xf9,0x53,0x6e,0x21,0x8e,0xa4,0xfb,0x7e,0x92,0x4e,0xff,0x00,0x1d,0x1e,0x2b,0x5a,0x3e,0x59,0xfd, 0x56,0xcb,0x13,0x7b,0x86,0xe4,0x59,0xed,0x5b,0x48,0x50,0x3f,0x0c,0xfe,0x17,0x66,0xe7,0x58,0xf9,0xa1, 0xc5,0x36,0x86,0xca,0xd0,0x7e,0xed,0x7b,0x6b,0xcf,0x17,0x03,0x98,0x82,0x6b,0xac,0x57,0x6d,0x86,0xd9, 0xbb,0x8b,0xd8,0xb8,0xbe,0xe3,0x82,0x33,0x61,0x70,0xe4,0x2b,0x7e,0xee,0xc5,0x3a,0x41,0x3e,0xfb,0x52, 0x7a,0x56,0x7f,0x5b,0x83,0x31,0x39,0x85,0x9c,0x43,0xaf,0x76,0x2d,0xa7,0x2f,0xd5,0x63,0x66,0x80,0x03, 0x72,0x6b,0x2c,0x18,0x44,0x17,0xbe,0x5b,0x21,0xe5,0xa5,0xe6,0xff,0x00,0x11,0xd0,0xb3,0xf7,0x15,0x78, 0xe0,0x3a,0x7d,0xea,0xc3,0x1b,0x24,0x2c,0x42,0x9e,0xa0,0x9f,0xf7,0xc5,0x35,0x3c,0x6c,0xc7,0xf7,0x2e, 0x69,0x1d,0x0d,0xd6,0xcb,0x9c,0xd5,0xae,0x66,0xce,0x63,0x91,0x4e,0x6d,0xce,0xb6,0x53,0x2b,0x13,0xb1, 0x6e,0x14,0x65,0x7c,0xbb,0x31,0xc3,0x1d,0x29,0x23,0x5e,0x14,0xb2,0xb5,0x8f,0xd6,0xf3,0xc1,0xe7,0xb3, 0x1c,0x7f,0x27,0xc0,0xb2,0x86,0xe9,0x24,0xca,0x7c,0xc6,0xaf,0x92,0x87,0x8a,0xe0,0x3e,0xd2,0x5b,0x50, 0x6c,0xed,0x0a,0x52,0xd0,0x90,0x15,0xe7,0xf4,0x4f,0x9f,0x3c,0x6f,0x61,0x51,0x91,0x65,0xee,0x77,0x73, 0xeb,0xa0,0xec,0x32,0x76,0x28,0xea,0xd6,0xa6,0x61,0x01,0xf7,0x3a,0xbf,0xe9,0x24,0x7c,0xbf,0x4b,0xa1, 0x27,0xcf,0xa3,0x82,0xb9,0x24,0x68,0x95,0xdc,0xb1,0xbc,0x89,0x12,0x3b,0x31,0x63,0xb3,0x56,0xf3,0x4d, 0xb4,0xca,0x02,0x10,0x81,0xd0,0xa0,0x00,0x4a,0x40,0x00,0x79,0xf6,0x1c,0x66,0xd6,0x68,0xa4,0xbd,0x8f, 0x04,0x96,0xdc,0x3d,0x3a,0xd6,0x67,0x46,0x58,0x1b,0x23,0x1c,0x52,0xd6,0x17,0x91,0x54,0xe3,0x3c,0x92, 0xa4,0xb2,0xba,0x72,0x43,0x30,0xd2,0x24,0xf7,0x1d,0x6a,0x2b,0xaf,0x04,0x0e,0xfb,0x9e,0x54,0x5b,0x49, 0xe8,0x1e,0x7d,0xcf,0xfe,0xbc,0x73,0xb2,0xb9,0xc2,0xf3,0x3a,0xd8,0xeb,0x91,0x47,0x7f,0x71,0x18,0x9e, 0xf4,0x59,0x0c,0x63,0x76,0x2a,0x29,0xf6,0xd3,0x8c,0xba,0x86,0x76,0x93,0xe3,0xf4,0x92,0xa0,0x7c,0x70, 0x63,0x93,0xea,0x4a,0xf9,0x4d,0x4a,0x90,0x7f,0x47,0xe2,0x12,0xaf,0xc3,0xed,0xdc,0x3f,0xf8,0x1e,0x39, 0x2b,0x11,0x15,0x93,0xdc,0xb5,0xc2,0xed,0x24,0xe2,0xb6,0x4e,0x2b,0xad,0xc4,0xc4,0x47,0x5c,0x39,0x0a, 0xfb,0xde,0x8c,0x76,0x85,0x6f,0xf5,0x93,0xd0,0xaf,0xf3,0x7b,0x71,0x8d,0x5d,0xa1,0x1a,0x94,0xbf,0x13, 0x20,0xe4,0xf3,0xf7,0xae,0x58,0x87,0xf9,0x34,0xc7,0x90,0xed,0x55,0xd5,0x9e,0x3b,0x93,0x2a,0x6a,0xd5, 0x51,0xcc,0x3e,0x6a,0xc7,0x88,0x7f,0x41,0xa9,0x78,0xcd,0xbc,0x85,0xa3,0xfd,0xf0,0x94,0x6c,0x7e,0xd0, 0x4f,0x8f,0x73,0xc1,0x0a,0x3a,0x1a,0xb6,0xa2,0xa4,0xe6,0xb2,0x79,0x87,0x99,0x38,0x95,0x75,0x06,0xed, 0x71,0xdb,0x45,0x42,0x4a,0x87,0x58,0x04,0x47,0x53,0x2a,0x49,0x3d,0x2a,0x1f,0xd2,0x15,0xf9,0x00,0xa4, 0xa7,0x8b,0x3e,0x2f,0x30,0xb3,0x68,0x30,0x5f,0x8f,0x6f,0xcb,0xe7,0x2d,0x6c,0x1b,0x4f,0xd8,0xc8,0xa7, 0xb0,0x61,0x31,0xa4,0x1f,0xf3,0x25,0xf7,0x10,0xe3,0x5e,0x7d,0xc0,0x0e,0x0f,0x7f,0x51,0xe0,0x3d,0xad, 0x7e,0x5b,0x98,0x85,0xfd,0x76,0xbd,0x31,0x6b,0x57,0xb1,0xf4,0x25,0x1b,0xab,0x65,0x82,0x93,0xd4,0x3e, 0xda,0x47,0x87,0x5e,0xf0,0x50,0x74,0x9e,0xd2,0x76,0x92,0x08,0x50,0x3e,0x46,0xff,0x00,0x2e,0x8b,0xbf, 0x77,0xf1,0x8c,0xd1,0x86,0xe7,0xc0,0x2b,0xd2,0xa6,0x61,0x19,0xde,0x35,0x90,0x5f,0xbd,0x53,0x51,0x26, 0x73,0xf3,0x62,0xaf,0xa6,0x4b,0x6b,0xac,0x92,0xd7,0x60,0xe8,0x90,0x1c,0x52,0xdb,0x09,0x41,0xf4,0x9f, 0xd2,0x23,0x7a,0x20,0x79,0xd7,0x08,0x9c,0xa4,0xc9,0x2a,0x31,0x6e,0x57,0x4d,0xb2,0xbb,0x79,0xf6,0x21, 0xa6,0xd1,0xce,0xb7,0x91,0x11,0xd7,0x90,0x8f,0xb2,0x6b,0xca,0xbb,0x68,0x57,0x48,0xd9,0x1e,0xfc,0x5a, 0xd8,0xdc,0x3a,0xda,0x58,0x88,0x8b,0x5f,0x06,0x2d,0x7c,0x06,0x02,0x94,0x96,0x23,0x34,0x1b,0x6d,0xb1, 0xb2,0xa3,0xa4,0xa4,0x00,0x36,0x49,0x3e,0xde,0xe4,0xf0,0x83,0xf9,0x3d,0x79,0xc0,0x26,0x01,0xfd,0xe8, 0xe7,0xfe,0x53,0x5c,0x3f,0x66,0x62,0x3a,0x54,0xe5,0x41,0x0b,0x91,0xe3,0xeb,0x4a,0x4f,0xb8,0x5f,0x45, 0x9e,0xb8,0x3f,0x8a,0x54,0xcb,0xd8,0x7b,0x39,0xb2,0x13,0x63,0x64,0x19,0x04,0xbc,0x79,0xd4,0x21,0x51, 0xea,0xd7,0x84,0x59,0xbf,0x19,0x5a,0xe9,0x3d,0x6a,0x2d,0x76,0xfb,0xc0,0xa9,0x3d,0x40,0x2f,0xa8,0x0f, 0x90,0x1c,0x6e,0xfd,0x4d,0xeb,0xd5,0xff,0x00,0x00,0x27,0x58,0x31,0x1c,0x74,0xe9,0x0d,0xf2,0xda,0xd9, 0x21,0x01,0x2a,0x04,0x04,0x80,0xbf,0x03,0x7c,0x3e,0x23,0x12,0x5d,0x2c,0xc5,0x59,0x60,0xd6,0xce,0xe2, 0xd2,0xdc,0x50,0x53,0xac,0x30,0xd8,0x76,0x04,0x83,0xb1,0xb2,0xe4,0x5d,0xf4,0xec,0x81,0xfa,0x48,0x2d, 0xab,0x64,0x92,0xa3,0xec,0x4c,0xc5,0xe6,0x26,0x71,0x1e,0xb9,0xc8,0xb6,0x3c,0xbb,0x72,0x65,0xb2,0x02, 0x52,0x89,0x15,0xf6,0x6c,0x08,0x2f,0x12,0x07,0xab,0x6e,0x29,0x2f,0x36,0x01,0xf1,0xae,0xda,0x8f,0x83, 0xae,0xaf,0x9a,0xd6,0xd7,0x50,0xb4,0x41,0x11,0xb0,0x3c,0x8e,0x33,0xda,0x98,0x96,0x37,0xdd,0x92,0x33, 0x49,0xad,0xe4,0x19,0x4b,0x2f,0x34,0xb9,0x92,0xa5,0x96,0x0a,0xc1,0x5a,0x47,0x2e,0x6e,0x1b,0x52,0x93, 0xe3,0x60,0x28,0xac,0x80,0x48,0xf9,0xe8,0xf9,0xff,0x00,0x87,0x13,0xc6,0x6f,0x8e,0x65,0x78,0x86,0x4c, 0xcd,0x14,0xb9,0x72,0x4c,0x6a,0xd9,0x48,0x79,0x6a,0xaf,0x7d,0xa4,0x21,0x61,0xa3,0xb4,0x15,0xb8,0x84, 0x80,0xaf,0x50,0xf4,0xef,0x7a,0xf9,0x78,0x3c,0x4b,0xb1,0xa4,0xc8,0x72,0xe7,0x3b,0xd9,0xfd,0xdf,0xc4, 0xc6,0xea,0x0a,0x14,0x95,0x85,0x4c,0xc0,0x4e,0x88,0x20,0x38,0x77,0xdc,0x91,0xaf,0x9f,0x51,0x4a,0x3d, 0xfd,0x1f,0x2e,0x08,0xdf,0xc5,0x8d,0x0b,0x97,0xd7,0x50,0xa0,0xc7,0x66,0x2c,0x66,0x6a,0x64,0x25,0xa6, 0x99,0x40,0x42,0x1b,0x48,0x69,0x5e,0x12,0x91,0xe9,0x03,0x5e,0x34,0x07,0x8e,0x07,0x6a,0xf6,0xe6,0xf1, 0x02,0x72,0xdb,0x87,0x96,0x3a,0xd6,0xa6,0xf8,0x9f,0x01,0xcb,0x71,0xc1,0xed,0x4b,0xd8,0x16,0x4b,0x4d, 0x8b,0x72,0x4e,0xa6,0xc6,0xf1,0xf7,0xe3,0x44,0x0e,0x3f,0xd4,0xf2,0x22,0x3a,0xea,0x11,0xf6,0xc4,0x0e, 0xa2,0xda,0x4f,0x4e,0xc9,0x00,0x6f,0x5b,0xde,0xbc,0xf1,0x5c,0xe7,0x18,0xa4,0x3e,0x63,0x8a,0x0b,0x78, 0xf9,0x86,0x75,0x61,0x12,0x12,0x96,0xec,0x77,0xce,0x1a,0xfc,0x84,0x2c,0x28,0xa0,0x92,0xd2,0xd9,0x8c, 0xd2,0x75,0xf6,0x7e,0xea,0xeb,0x1e,0xda,0xd6,0xb4,0xab,0x73,0x92,0xca,0x07,0x94,0x75,0x61,0x3e,0xe1, 0xd7,0xc7,0x9f,0x91,0xee,0x2b,0xff,0x00,0xcf,0x03,0x95,0x81,0xa6,0x9a,0xc9,0xcb,0x6e,0x5e,0xdd,0x49, 0xc2,0xe7,0x3a,0xa0,0xa7,0x5a,0x86,0xda,0x5c,0x81,0x23,0x5d,0x23,0xed,0x62,0x2b,0xec,0xf6,0x10,0x95, 0x24,0x14,0x14,0x28,0x15,0x15,0x12,0x78,0x73,0x51,0xba,0x8a,0x2d,0x4e,0x5c,0x9d,0xad,0x93,0xcf,0x14, 0xbd,0x9a,0x3b,0xd9,0xa6,0x07,0x18,0x14,0x08,0x57,0x79,0xfe,0xbf,0xe6,0xa9,0xf7,0xf6,0xc3,0xd7,0xff, 0x00,0x87,0xd1,0xdf,0xf0,0xdf,0x0a,0xd5,0xd8,0x10,0x83,0xcc,0xd9,0x19,0xb3,0x39,0x17,0x30,0xc3,0xcf, 0x34,0x1b,0xf4,0xe0,0xf2,0x7b,0xff,0x00,0xd1,0x21,0x1e,0x56,0x62,0x96,0x88,0xf4,0xfc,0x9a,0x1e,0x3e, 0x60,0xf9,0x37,0x14,0x2e,0x64,0x73,0x22,0x25,0x4b,0xf1,0x6d,0xb9,0x6a,0xcd,0x8d,0xcb,0x25,0xa0,0xd4, 0x8a,0xcb,0x86,0x9a,0xaf,0x90,0x14,0x47,0x5a,0xc9,0x74,0xf7,0x9a,0x09,0x05,0x5e,0x3b,0x6e,0x6c,0xa7, 0xdf,0x44,0x1e,0x00,0x4d,0xc5,0xb2,0x4c,0xcc,0xa5,0xee,0x67,0xe4,0x9f,0x48,0x47,0xf0,0xa1,0x41,0x53, 0xd7,0x16,0xad,0x04,0x74,0x1f,0x58,0xea,0xee,0x48,0xd2,0xdb,0x0b,0x1d,0xc5,0x68,0x28,0x9d,0x00,0x08, 0x1c,0x09,0xef,0x51,0x10,0x96,0x7e,0x0f,0x1c,0x60,0xe4,0x7a,0x51,0x56,0x26,0x27,0x85,0xad,0xaa,0xf3, 0x3c,0x73,0x25,0xe5,0xae,0x40,0xc5,0x15,0xe4,0xdb,0xc2,0xc5,0x4c,0x94,0xb9,0x2d,0xd8,0x2e,0x37,0xd4, 0x7b,0x47,0xf4,0x94,0x1a,0x43,0x60,0xfe,0x00,0x0f,0xd9,0xf3,0xe0,0x4e,0x0b,0xcc,0x0c,0x4f,0x0f,0xe5, 0xbd,0x0b,0x39,0x1d,0x8b,0xf0,0x54,0xff,0x00,0x78,0x34,0x4c,0x07,0xd6,0x97,0x0f,0x7d,0x7e,0x12,0xa4, 0x20,0x85,0x1f,0x23,0xc0,0x3b,0xf3,0xae,0x1e,0xef,0xa1,0xc4,0xaf,0xe5,0xa5,0xf4,0x28,0x11,0x18,0x87, 0x19,0x9a,0xa9,0x29,0x69,0x96,0x1b,0x4a,0x10,0xda,0x7b,0x6a,0xf0,0x02,0x74,0x07,0xfb,0x07,0x00,0x39, 0x63,0x06,0x0d,0x97,0x27,0xaa,0x60,0xd8,0xc2,0x8f,0x3a,0x23,0xa1,0xee,0xeb,0x12,0x1b,0x0e,0x36,0xb0, 0x24,0x38,0x74,0xa4,0x90,0x77,0xed,0xbf,0xf6,0x6f,0xe5,0xc3,0x2a,0xf0,0xfd,0x1d,0x9b,0x9d,0xbb,0xc7, 0xaf,0x43,0x4b,0x7e,0xef,0x9f,0x51,0xe3,0xb4,0xf7,0x14,0x78,0xe5,0xf5,0xfd,0x5a,0xfa,0x23,0x2e,0xfd, 0xa3,0x15,0xb2,0xd7,0xfc,0x7b,0x1c,0x79,0xf5,0xbe,0xbf,0xfb,0x9f,0x2f,0x1f,0xb7,0x13,0xb3,0xfe,0x5f, 0x85,0xaa,0xfc,0x63,0x28,0xc2,0xbe,0xd3,0x96,0x39,0x29,0x87,0x18,0x0d,0x8a,0x1b,0x92,0xb9,0x55,0xaa, 0xf7,0xfe,0x8c,0xef,0xba,0xc7,0x95,0xa9,0x47,0xa1,0x44,0x13,0xad,0x8d,0x78,0xe0,0xfc,0xbe,0x63,0xf3, 0x16,0x55,0x53,0x11,0x6a,0x79,0x66,0xcd,0x75,0xcb,0xaa,0x71,0x0e,0x3f,0x65,0x6c,0xcb,0x95,0xd1,0xb5, 0xbe,0x85,0x82,0xd1,0xef,0x3a,0x08,0x03,0xd3,0xd0,0xd9,0x1d,0x5a,0xdf,0x8e,0x24,0x47,0x15,0xb4,0x83, 0x21,0xbd,0xc5,0x3e,0xd2,0x4a,0x0f,0xf4,0xd6,0x4e,0xce,0xe9,0x20,0x43,0x76,0x6c,0xf8,0x59,0x3c,0x48, 0xac,0xa3,0xad,0xd7,0xdf,0xc6,0x2c,0x5b,0x6d,0xb4,0xeb,0x65,0x4a,0x52,0x98,0x00,0x01,0xf3,0x27,0xdb, 0x80,0x3c,0xc4,0xc8,0xe9,0xf2,0x6e,0x4c,0xdb,0xd8,0x52,0xbe,0xec,0x98,0xaa,0x71,0x80,0x97,0x95,0x19, 0xc6,0xd2,0xad,0x3c,0x9d,0xe8,0xad,0x23,0x7f,0xec,0xe3,0x71,0x83,0x2e,0xf2,0xc5,0xbb,0x3e,0x61,0xde, 0xca,0xcb,0xe5,0xa1,0x7d,0x6c,0xc6,0x90,0x90,0xd5,0x74,0x6f,0xd3,0xd7,0x6e,0x2a,0x7d,0x0a,0x3d,0x2a, 0xe9,0x2a,0x73,0xac,0x9d,0x03,0xbd,0xf0,0x53,0x9d,0x7d,0x0d,0xf2,0x7e,0xc9,0x00,0x25,0x03,0xad,0x80, 0x94,0xa4,0x68,0x0d,0x3a,0x9f,0x6f,0xc3,0x87,0xb4,0x63,0x6f,0xf5,0x18,0x95,0x09,0x27,0x23,0xd2,0x95, 0xbf,0x2e,0x6d,0x24,0xdd,0x8e,0x87,0xa5,0x28,0x61,0x99,0xbe,0x3b,0x87,0x61,0x4c,0x9b,0x99,0x87,0xe2, 0x1e,0xe9,0x53,0x11,0x23,0xa7,0xbb,0x21,0xdd,0x30,0x83,0xe1,0xb4,0xec,0x81,0xe3,0x45,0x4a,0xd2,0x46, 0xc6,0xc8,0xde,0xf8,0xed,0x23,0x9e,0xb8,0xec,0x68,0x71,0xe6,0xc9,0xa0,0xbb,0x62,0x2c,0x9d,0xf6,0x1e, 0x71,0xf8,0x09,0x43,0x9a,0xf7,0xe9,0x26,0x4f,0x9d,0x7c,0xf5,0xc5,0x55,0x73,0x89,0xe4,0xb6,0x42,0x97, 0x32,0xc7,0xa2,0xfd,0x22,0x9a,0x66,0x83,0x52,0x62,0x30,0xe7,0x43,0xfe,0x1a,0x6d,0xce,0xa4,0x85,0x68, 0x2c,0x6b,0x40,0x84,0x92,0xaf,0x20,0x00,0x78,0x31,0x89,0xe6,0x59,0x66,0x33,0x91,0x5d,0x64,0x51,0xf9, 0x71,0x91,0xce,0x93,0x77,0xd1,0xdf,0x8c,0xe4,0x19,0x4c,0xa2,0x37,0x47,0x80,0x12,0xe0,0x61,0x45,0xcd, 0xfe,0x29,0x4e,0xbd,0xbc,0xf1,0x56,0xef,0x4e,0xb7,0x96,0xe6,0x46,0x63,0x93,0x93,0xc6,0x71,0xcf,0x95, 0x66,0x0b,0x89,0x16,0x24,0x0a,0x3c,0x07,0x6a,0x74,0xff,0x00,0x48,0x6c,0x37,0xfb,0xba,0xc7,0xfe,0xdd, 0x5d,0xfc,0xd7,0x12,0x2b,0xb9,0xf1,0x8d,0xd8,0xcb,0x44,0x4a,0xea,0x2b,0x99,0x92,0x57,0xfa,0x0c,0xb1, 0x2a,0xbd,0x6b,0x57,0xec,0x02,0x57,0x9e,0x04,0x7e,0x7a,0xf3,0xb0,0x3f,0xea,0x7e,0xe7,0xfe,0xf9,0xfc, 0x9f,0x01,0x33,0xdc,0xff,0x00,0x2e,0xcd,0xf1,0x49,0x58,0xc5,0x87,0x2c,0xf2,0x0a,0xa8,0xf2,0xd4,0x92, 0xb9,0x4c,0xc4,0x95,0x25,0x68,0xe9,0x3b,0x1a,0x6d,0x51,0xdb,0x07,0xdb,0xf5,0x87,0x0a,0xae,0x93,0x11, 0x3c,0xa9,0x03,0xd6,0x88,0x6e,0x25,0xff,0x00,0x85,0x59,0x18,0xdf,0x37,0xf0,0xdb,0xc7,0xc4,0x25,0xc8, 0x7e,0xa2,0x63,0x8e,0x16,0x99,0x6a,0xc3,0xa1,0xb0,0xe9,0xda,0x47,0xa1,0xd4,0xa9,0x4d,0x29,0x5b,0x58, 0x1d,0x01,0x65,0x7b,0x0a,0xf4,0xf8,0xe1,0x7b,0x96,0x79,0x86,0x3f,0x88,0x60,0x05,0xeb,0xb9,0xa5,0xa5, 0xc8,0xb0,0x92,0x23,0x47,0x69,0x05,0xd7,0xa4,0x28,0x28,0x6c,0x36,0xda,0x41,0x52,0xbd,0xc6,0xce,0xb4, 0x36,0x36,0x47,0x08,0x12,0x31,0x6c,0xd3,0x98,0x79,0x4e,0x39,0x6a,0x31,0xb7,0x69,0x62,0xd2,0x49,0x69, 0x4e,0xb9,0x62,0xa5,0xb0,0x97,0x92,0xd2,0x9b,0x56,0x90,0x95,0xa0,0x39,0xb5,0x0d,0xf9,0xe8,0xe8,0xd8, 0x20,0x2b,0xc7,0x98,0x2b,0xc7,0xad,0xf3,0x2c,0x76,0x8e,0xcb,0x13,0xe8,0x9a,0xfd,0x0d,0x84,0xa9,0x12, 0x63,0x05,0x96,0x9e,0x52,0x64,0x29,0xb2,0x82,0x8e,0xbe,0x94,0x9f,0x0d,0xab,0x60,0xa8,0x1d,0x7c,0x89, 0x3c,0x04,0xd8,0x40,0xb9,0x5d,0xdc,0x1c,0x67,0xfc,0x73,0xc7,0xf3,0x5b,0x13,0xc8,0x7c,0x39,0xab,0x65, 0xde,0x7a,0xe3,0xcc,0xd7,0x33,0x62,0xf6,0x3d,0x7a,0xd4,0x37,0xd4,0x50,0xd3,0xee,0x3f,0x01,0x08,0x5a, 0x87,0xba,0x42,0x8c,0x9d,0x12,0x3e,0x63,0x88,0xdf,0xe9,0x0d,0x86,0xff,0x00,0x77,0x58,0xff,0x00,0xdb, 0xab,0xbf,0x9a,0xe1,0x23,0x19,0xcb,0xf2,0xda,0x1c,0xbe,0x7e,0x5c,0xdf,0x2e,0xb2,0x39,0x53,0x6c,0x22, 0xb7,0x15,0xd8,0x4e,0x41,0x94,0x84,0x34,0x96,0xfd,0x96,0x1e,0x0c,0x92,0xb2,0x7e,0x63,0xa0,0x6b,0xef, 0x3c,0x34,0x0e,0x75,0x67,0x7a,0xd7,0xe6,0x7a,0xe7,0xfe,0xf9,0xfc,0xa7,0x07,0x3a,0x4c,0x1f,0xda,0x09, 0xfb,0xd6,0x7e,0x62,0x4f,0x1e,0xd4,0x56,0x0f,0x3e,0xf1,0x79,0xd2,0xdb,0x89,0x0a,0x9a,0xde,0x4c,0x87, 0x4f,0x4b,0x6d,0x33,0x2a,0xbd,0x6b,0x59,0xfb,0x82,0x44,0xa2,0x49,0xff,0x00,0x67,0x05,0x68,0xb9,0xcb, 0x85,0xd8,0x4c,0x76,0x25,0x83,0xd2,0x28,0x1c,0x6d,0x6a,0x6c,0x2a,0xcc,0xb4,0x86,0x94,0xa4,0x8d,0x94, 0x87,0x50,0xb5,0xb6,0x14,0x3d,0xba,0x54,0xa0,0xad,0xf8,0xd7,0x08,0x19,0x8f,0x32,0x73,0x1c,0xb3,0x16, 0xb1,0xc6,0xa6,0xf2,0xb6,0xfe,0xba,0x3d,0x83,0x45,0xa7,0x25,0x33,0x1a,0x5b,0xeb,0x6c,0x7d,0xe1,0xb3, 0x19,0x01,0x5f,0xb3,0xa8,0x7e,0xde,0x13,0x33,0x2c,0x6f,0x2d,0xce,0xa8,0x61,0xb6,0x69,0x1e,0xa2,0x83, 0x8f,0xc6,0xfb,0x79,0xf6,0x88,0x75,0x86,0xd4,0xdb,0x68,0xdf,0x57,0x41,0x6f,0xbb,0xd5,0xa0,0x76,0x12, 0x85,0x00,0x7f,0xb4,0x4e,0xb8,0xea,0xe9,0x76,0xc1,0x86,0xf3,0x8f,0xbd,0x73,0xe6,0x25,0x23,0x1f,0x8a, 0xb2,0x79,0x07,0x6b,0x06,0x9a,0xa3,0x29,0xb3,0xb0,0x2f,0xa2,0x33,0x4a,0x8a,0xa7,0x14,0xcc,0x77,0x1e, 0xe8,0x4e,0x9f,0x24,0x90,0xda,0x54,0x40,0x00,0x7b,0xeb,0x43,0x86,0xfc,0x63,0x30,0xc0,0xac,0xa7,0xd8, 0x64,0xf8,0xd4,0x2b,0x89,0xef,0xcf,0x0d,0xc6,0x9b,0x36,0xbf,0x1d,0xb0,0x79,0x2f,0x16,0x01,0xe8,0x4a, 0x8a,0x19,0x20,0xa8,0x07,0x08,0xfd,0x6d,0x74,0xa4,0x92,0x02,0x40,0x5d,0xfc,0x99,0x88,0x0c,0xe4,0xc0, 0x12,0x4e,0xe2,0xeb,0xc7,0x93,0xfd,0x37,0x0c,0xb7,0x78,0x1d,0x63,0xb7,0x2b,0xc8,0x71,0xf9,0xb3,0x31, 0x6c,0x83,0xf4,0x8d,0x95,0x53,0x81,0xb2,0xf1,0xea,0xeb,0xfb,0x76,0xf5,0xdb,0x79,0x05,0x40,0x15,0x05, 0xa4,0xf5,0x68,0x6c,0xf1,0x8f,0xd4,0x8d,0x12,0x5f,0x90,0xf9,0x1c,0x0e,0x9e,0x82,0x83,0xa5,0xef,0x36, 0xc3,0x6f,0x99,0xee,0x68,0xd9,0xcc,0x2b,0x81,0xfe,0xa7,0xcb,0xfd,0xbd,0xfe,0xa9,0xd9,0xeb,0xff,0x00, 0xb7,0xe2,0x0e,0x41,0x71,0x8d,0xdf,0x55,0xb9,0x59,0x73,0x8d,0x65,0x33,0xa1,0x2d,0xc6,0xdc,0x72,0x3b, 0xb8,0x95,0x99,0x4a,0xd4,0xda,0xd2,0xe2,0x76,0x9e,0xc7,0xa9,0x21,0x48,0x49,0x20,0xf8,0x3e,0xc4,0x1f, 0x20,0xf5,0xa4,0xcd,0xf9,0x97,0x49,0xdc,0xaf,0xc8,0xf1,0x68,0xf9,0x50,0x43,0x2a,0x31,0xad,0xa9,0x64, 0x33,0x19,0xc7,0x54,0x90,0x90,0x84,0xbf,0x1d,0xe5,0xa4,0x21,0x4a,0xf5,0xa8,0xad,0x0a,0x52,0x46,0xc0, 0x08,0xe0,0x5c,0xd4,0x73,0x1b,0x38,0xe9,0x5e,0x53,0x74,0x31,0x3a,0x75,0xf4,0xab,0xe8,0x4a,0x07,0xfe, 0xdd,0x49,0x25,0x0a,0xe9,0x91,0x33,0x41,0x5f,0xae,0x95,0x06,0x82,0x41,0x04,0x79,0x3c,0x49,0x29,0x6e, 0xab,0xbf,0x7f,0xb8,0xa7,0x44,0x92,0x93,0x8c,0x0a,0x3b,0x8d,0x73,0x07,0x15,0xb4,0xc9,0xcd,0x14,0x49, 0x73,0xcd,0xa3,0x5f,0xd3,0x44,0x72,0xaa,0x4b,0x4e,0xb4,0x08,0x1e,0x56,0x95,0xb6,0x3a,0x47,0xa8,0x1d, 0xab,0x43,0xcf,0x08,0x1c,0x9d,0xc9,0x29,0xf1,0x7e,0x58,0xcc,0xb3,0xbb,0x79,0xf8,0xd0,0xd1,0x6a,0xe7, 0x5b,0xc8,0x8a,0xeb,0xc8,0x47,0xd9,0xb2,0x07,0x51,0x6d,0x2a,0xe9,0xf2,0x40,0xf3,0xad,0xef,0x8b,0x3f, 0x97,0xd8,0xed,0x1e,0x31,0x09,0xba,0xea,0x1a,0xc8,0xd5,0xf1,0x52,0x01,0x29,0x65,0x1e,0x54,0x40,0x03, 0xa9,0x6a,0x3e,0xa5,0xab,0x40,0x0e,0xa5,0x12,0x7c,0x7b,0xf0,0x8b,0xf9,0x3b,0xeb,0xf3,0x7d,0x38,0x6f, 0xcf,0xd2,0x8e,0x7f,0xe5,0x35,0xc5,0x6b,0x33,0x19,0xd2,0xe7,0x2b,0x92,0xb9,0x1f,0x9a,0x46,0xe3,0x77, 0xcf,0xc5,0x9e,0xb8,0x3f,0x8a,0x61,0xaa,0xe6,0x06,0x3d,0x6d,0x5e,0xcd,0x85,0x54,0x7c,0x8e,0xc2,0x13, 0xc0,0x96,0xa4,0x45,0xc6,0xac,0x1d,0x69,0x60,0x28,0xa4,0xe9,0x49,0x60,0x83,0xe4,0x11,0xef,0xf2,0xe1, 0x0f,0x39,0xc6,0xaa,0x32,0x8e,0x61,0x52,0x65,0x8b,0xb1,0xe6,0x5c,0x04,0xd7,0x29,0x45,0xd8,0x91,0xe8, 0x2d,0xd2,0x1c,0xda,0x3a,0x74,0xd2,0xc3,0x40,0xc7,0xea,0x1a,0x4b,0x85,0x1a,0x2a,0x1a,0xfd,0x15,0x6d, 0x5c,0x31,0xc9,0xc0,0x59,0xad,0xb2,0x76,0xdf,0x03,0xb9,0x99,0x84,0xda,0xb8,0x7e,0xd4,0xd7,0xa5,0x2a, 0x86,0xf9,0x09,0xe9,0x1d,0xe8,0xaa,0xfb,0x25,0xe8,0x29,0x5a,0x3a,0x49,0x0a,0x51,0x20,0x93,0xc1,0xa8, 0x9c,0xc4,0xe6,0x4c,0x0a,0xd9,0x71,0xee,0xf9,0x76,0xc5,0xc5,0x93,0x28,0x0a,0x8b,0x26,0x9a,0xcd,0x96, 0xa2,0x4b,0x24,0xab,0x61,0x69,0x7d,0x41,0xc6,0x34,0x9e,0x80,0x7c,0x3b,0xb2,0x4e,0xb5,0xae,0x23,0xc0, 0x20,0x6e,0x55,0xb0,0x7e,0xdf,0xea,0x9f,0x94,0xc9,0x9c,0x62,0xa4,0x7d,0x70,0xae,0xd6,0xfe,0x88,0xcb, 0xf5,0xff,0x00,0xc2,0x76,0x7f,0xcb,0xf0,0x16,0x76,0x73,0x8c,0xe4,0xd8,0xb6,0x4f,0x0e,0x92,0x6c,0x99, 0x32,0x22,0xd6,0x4b,0x4c,0x86,0xcc,0x09,0x0d,0x96,0x55,0xda,0x58,0x21,0x7d,0x68,0x1d,0x27,0x60,0x8d, 0x1d,0x7b,0x71,0xc2,0xce,0x8f,0x2e,0xcd,0xba,0xff,0x00,0x38,0x79,0x27,0x6a,0xb1,0x7d,0x43,0xea,0xfd, 0x0b,0xab,0x8f,0x11,0x49,0xd2,0xc7,0x4b,0xef,0x8d,0x3c,0xf6,0xd2,0x51,0xb1,0xb4,0xa7,0xa9,0x3e,0x06, 0x8f,0x0c,0x36,0x95,0x75,0xd4,0xfc,0xb1,0xc8,0x20,0x54,0xc1,0x8d,0x06,0x23,0x55,0x52,0xba,0x5a,0x8e, 0xd0,0x42,0x01,0x2d,0xab,0x67,0x40,0x7b,0x92,0x49,0x27,0xdc,0xfc,0xf8,0x3d,0x8f,0xc0,0x17,0x88,0xa8, 0x49,0x39,0x1e,0x9d,0x68,0x37,0x0d,0x21,0x81,0xc9,0x03,0x18,0x34,0xa5,0x85,0x66,0x98,0xde,0x1f,0xca, 0x2a,0x09,0x39,0x1c,0xd7,0xe0,0xc7,0x5f,0x7c,0x07,0xbe,0x09,0xe7,0x1b,0xd9,0x90,0xee,0x87,0x5a,0x10, 0x40,0x3e,0x0f,0xa4,0x9d,0xf8,0xdf,0x06,0xec,0x72,0x3a,0x0c,0x82,0xae,0x3b,0x8d,0x41,0xcb,0x8a,0x4f, 0x44,0x98,0x33,0xa2,0xe3,0x16,0x25,0x4d,0x2c,0xa4,0xf4,0xbc,0xda,0xfe,0x1c,0xa4,0xed,0x2a,0xf3,0xb0, 0x52,0xa4,0xa9,0x49,0x50,0x52,0x54,0xa4,0x9d,0x39,0x4c,0xc3,0x12,0x79,0x3f,0x53,0x19,0xf6,0x90,0xf3, 0x4e,0xa2,0x42,0x1d,0x6d,0x68,0x0a,0x4a,0xd2,0x5f,0x70,0x14,0x90,0x41,0x04,0x1f,0x6d,0x7c,0xf7,0xae, 0x20,0x33,0x85,0x4e,0xc6,0x26,0xae,0xcb,0x96,0xb9,0x03,0xf8,0xcb,0xab,0x70,0xba,0xed,0x52,0xd2,0x5f, 0xab,0x92,0xa2,0x42,0x94,0x14,0xc2,0x8f,0xd9,0xa9,0x5d,0x09,0x4f,0x5b,0x45,0x2a,0x09,0x1a,0x03,0x82, 0x6a,0xe6,0x03,0xa8,0x4a,0xaf,0x90,0x72,0x7b,0xd6,0x2c,0x37,0x8b,0x48,0xc8,0xf2,0x1d,0x85,0x6f,0x02, 0x4d,0x63,0x96,0x71,0x2e,0xf2,0x1a,0xec,0xaa,0xd2,0xea,0x22,0xd4,0xa8,0xd2,0x1b,0xc3,0xed,0x58,0x6a, 0x30,0x28,0x53,0x65,0x2d,0x37,0xda,0x57,0x48,0x52,0x56,0x7a,0xba,0x94,0xa2,0xa5,0x68,0x93,0xa4,0x36, 0x94,0x4d,0x89,0x7b,0x5b,0x1a,0xce,0x4d,0xc5,0x8c,0x2c,0xb6,0x44,0xb5,0x85,0xa1,0xa7,0x55,0x88,0xd9, 0x21,0x11,0x63,0x85,0x6f,0xb4,0xd8,0xec,0x9d,0x6f,0x49,0x2b,0x56,0xf6,0xb5,0x00,0x4e,0x92,0x96,0xd0, 0x89,0xad,0x73,0x1f,0x98,0xc8,0xa9,0xf8,0x49,0x3c,0xb6,0x65,0xdb,0xc4,0xbc,0x96,0x3e,0x21,0x8b,0x76, 0x45,0x63,0x89,0x20,0x05,0x3f,0xd4,0xa3,0xde,0x4a,0x7a,0x8a,0x8f,0x6f,0xb6,0xa3,0xa4,0x8f,0x57,0x9e, 0x01,0xc8,0xc4,0xae,0xf2,0xd7,0x91,0x2f,0x99,0xb9,0x1b,0x97,0x23,0xa9,0x2e,0x26,0x96,0x07,0x54,0x5a, 0xa6,0x54,0x0a,0x0f,0x94,0x24,0xf5,0xbe,0x52,0xb4,0xa8,0x82,0xea,0x8f,0x83,0xae,0x91,0xc2,0x92,0x47, 0x6e,0x83,0x25,0xbd,0xc5,0x32,0xb2,0x4a,0x4e,0x30,0x2a,0x3e,0x6f,0x99,0x63,0x99,0x6f,0x28,0x72,0x17, 0xf1,0xe9,0xce,0xce,0x65,0x1f,0x0e,0x14,0xe8,0x88,0xea,0x10,0x0f,0x7d,0xaf,0x05,0x4b,0x40,0x1b,0xd1, 0xf6,0xdf,0x1e,0x65,0x17,0x78,0xed,0x7f,0x23,0x21,0xd5,0x64,0x96,0xaf,0xd4,0xc7,0xb6,0xc7,0xbe,0x08, 0x4d,0xf8,0x07,0x9f,0x6d,0xb2,0xeb,0x2a,0x40,0x3e,0x84,0xf4,0x92,0x01,0x27,0xa4,0xa8,0x13,0xad,0xec, 0x70,0x6b,0x9a,0xd1,0xa2,0xc1,0xe4,0xb5,0xbc,0x48,0x51,0x98,0x8d,0x19,0xa4,0xc7,0x6d,0xa6,0x99,0x6c, 0x21,0xb4,0x24,0x3e,0xde,0x92,0x94,0x80,0x00,0x1a,0xd7,0x81,0xc1,0x5c,0x4d,0xa6,0x25,0xf2,0xce,0x8a, 0x33,0xcd,0x21,0xf6,0x5d,0xac,0x69,0xb7,0x5b,0x5a,0x02,0x92,0xb0,0x5b,0x00,0xa4,0x82,0x08,0x20,0xfb, 0x6b,0xe7,0xbd,0x71,0x6d,0x99,0x46,0x8a,0xa7,0x07,0x1b,0x8f,0x61,0x48,0xae,0xef,0x9f,0x6f,0x3d,0xa3, 0xb9,0xaa,0xf6,0x65,0x4e,0x1d,0x3e,0x4d,0x2d,0x8e,0x31,0x4f,0x75,0x4f,0x02,0x3f,0x6e,0x42,0x5b,0xad, 0xc1,0xe7,0x86,0x64,0x93,0x2e,0x0c,0xa0,0xe7,0x52,0x19,0x4a,0x7c,0xa6,0x1a,0x53,0xd5,0xa2,0x3d,0x60, 0xff,0x00,0x67,0x46,0x03,0x38,0xcc,0x64,0xcb,0xa8,0x7d,0xd9,0x59,0x52,0xbe,0x82,0xad,0x30,0xaa,0x4b, 0x78,0x25,0x9a,0x16,0xd9,0x4b,0xac,0xb8,0xd3,0x8e,0xa8,0x37,0xf6,0xc4,0x76,0x74,0xa4,0x9d,0x25,0x5d, 0x44,0x80,0x93,0xb2,0x5a,0x99,0xc3,0x27,0xe3,0x13,0x17,0x63,0xcb,0x5c,0x81,0xfc,0x65,0xc5,0xb8,0x5d, 0x76,0xa9,0x69,0x2f,0xd5,0xc9,0x51,0x21,0x4a,0x0a,0x61,0x47,0xec,0xd4,0xae,0x84,0xa7,0xad,0xa2,0x95, 0x04,0x8d,0x01,0xc1,0xe6,0xb9,0x8f,0xcc,0x64,0x54,0x7c,0x24,0x9e,0x5b,0x34,0xed,0xe2,0x5e,0x4b,0x1f, 0x10,0xc5,0xbb,0x22,0xb1,0xc4,0x90,0x02,0x9f,0xea,0x51,0xef,0x25,0x3d,0x45,0x47,0xb7,0xdb,0x51,0xd2, 0x47,0xab,0xcf,0x11,0x62,0x11,0x38,0xe1,0xbd,0xc5,0x38,0xcd,0x22,0x9e,0x95,0x5e,0xe0,0x78,0xfd,0x46, 0x1f,0x93,0x45,0xbb,0x5b,0xb9,0x94,0xb6,0xe1,0x55,0x3b,0x5c,0xd2,0x24,0x62,0xb7,0x2a,0x29,0x6c,0xad, 0xa5,0x05,0x95,0x3a,0x16,0x94,0x10,0x1b,0x23,0x4d,0xa5,0x09,0x3d,0x67,0xc0,0xd6,0xb8,0x77,0x7b,0x33, 0xc7,0x32,0xde,0x5c,0x65,0x0f,0xe3,0xd3,0x9c,0x9c,0xca,0x2b,0x5f,0x0a,0x74,0x44,0x75,0x08,0x07,0xb6, 0x7c,0x75,0x29,0x20,0x6f,0xcf,0xb6,0xf8,0x1a,0xfe,0x27,0x77,0x96,0xbc,0x89,0x7c,0xcc,0xc8,0xdc,0xb9, 0x1d,0x49,0x71,0x34,0xb0,0x3a,0xa2,0xd5,0x32,0xa0,0x50,0x7c,0xa1,0x27,0xad,0xf2,0x95,0xa5,0x44,0x17, 0x54,0x7c,0x1d,0x74,0x8e,0x1a,0xf2,0x58,0xf1,0x20,0x72,0xb2,0xfa,0x24,0x48,0xec,0x45,0x8a,0xd5,0x53, 0xcd,0xb2,0xd3,0x2d,0x84,0x36,0x80,0x1b,0x20,0x25,0x29,0x00,0x00,0x3d,0xbc,0x0e,0x19,0xb0,0x78,0x8d, 0xf2,0x05,0xc9,0x39,0x1e,0x9d,0x6b,0x13,0xee,0xf8,0x0d,0x9c,0x74,0x3d,0x29,0x2b,0x0a,0xcd,0x31,0xbc, 0x3b,0x94,0x54,0x12,0x72,0x39,0xaf,0xc1,0x8e,0xa0,0xf8,0x0f,0x7c,0x13,0xce,0x37,0xb3,0x21,0xdd,0x0e, 0xb4,0x20,0x80,0x7c,0x1f,0x49,0x3b,0xf1,0xbe,0x1a,0x62,0xe6,0xf5,0x12,0xe3,0x33,0x26,0x2d,0x76,0x54, 0xfc,0x77,0xd0,0x97,0x1a,0x75,0xbc,0x5e,0xc9,0x48,0x5a,0x54,0x36,0x14,0x14,0x18,0xd1,0x04,0x10,0x77, 0xf8,0xf0,0x3b,0x94,0xec,0x33,0x27,0x93,0xf5,0x11,0xa4,0x34,0x87,0x9a,0x75,0x12,0x10,0xe3,0x6b,0x40, 0x52,0x56,0x92,0xfb,0x80,0xa4,0x82,0x08,0x20,0xfb,0x6b,0xe7,0xbd,0x71,0x01,0x9c,0x2e,0x76,0x31,0x35, 0x76,0x3c,0xb5,0xc8,0x1f,0xc6,0x5d,0x5b,0x85,0xd7,0x6a,0x96,0x92,0xfd,0x5c,0x95,0x12,0x14,0xa0,0xa6, 0x14,0x7e,0xcd,0x4a,0xe8,0x4a,0x7a,0xda,0x29,0x50,0x48,0xd0,0x1c,0x6b,0x57,0x30,0x1d,0x42,0x50,0xf9, 0x07,0x27,0xbd,0x0e,0xc0,0xb8,0xb4,0x8c,0x8f,0x21,0xf8,0xa6,0x4f,0xad,0xf5,0xff,0x00,0xdd,0x19,0x7f, 0xfc,0xa9,0x67,0xfc,0xbf,0x1e,0x39,0x99,0x56,0xb6,0x92,0xa7,0x2a,0xb2,0xd4,0x24,0x02,0x4a,0x95,0x8a, 0x59,0x00,0x00,0xf7,0xf3,0xd8,0xe3,0x93,0x5c,0xc7,0xe6,0x32,0x2a,0x3e,0x12,0x4f,0x2d,0x99,0x76,0xf1, 0x2f,0x25,0x8f,0x88,0x62,0xdd,0x91,0x58,0xe2,0x48,0x01,0x4f,0xf5,0x28,0xf7,0x92,0x9e,0xa2,0xa3,0xdb, 0xed,0xa8,0xe9,0x23,0xd5,0xe7,0x80,0x52,0x31,0x3b,0xbc,0xb5,0xe4,0x4b,0xe6,0x6e,0x46,0xe5,0xc8,0xea, 0x4b,0x89,0xa5,0x81,0xd5,0x16,0xa9,0x95,0x02,0x83,0xe5,0x09,0x3d,0x6f,0x94,0xad,0x2a,0x20,0xba,0xa3, 0xe0,0xeb,0xa4,0x70,0x94,0x91,0x5b,0xc6,0x37,0x16,0xf7,0x14,0xca,0x49,0x29,0x38,0xc0,0xa2,0x4e,0xe6, 0x78,0xe6,0x5b,0xcb,0x8c,0xa1,0xfc,0x7a,0x73,0x93,0x99,0x45,0x6b,0xe1,0x4e,0x88,0x8e,0xa1,0x00,0xf6, 0xcf,0x8e,0xa5,0x24,0x0d,0xf9,0xf6,0xdf,0x00,0xf0,0xac,0xd3,0x1b,0xc3,0xf9,0x45,0x41,0x27,0x23,0x9a, 0xfc,0x16,0x14,0x1f,0x01,0xef,0x82,0x79,0xc6,0xf6,0x64,0x3b,0xa1,0xd6,0x84,0x10,0x0f,0x83,0xe9,0x27, 0x7e,0x37,0xc3,0xae,0x4b,0x1e,0x24,0x0e,0x56,0x5f,0x44,0x87,0x1d,0x88,0xb1,0x5a,0xaa,0x79,0xb6,0x5a, 0x65,0x01,0x0d,0xa0,0x06,0xc8,0x09,0x4a,0x40,0x00,0x0f,0x6f,0x03,0x80,0x5c,0xa7,0x61,0x99,0x3c,0x9f, 0xa8,0x8d,0x21,0xa4,0x3c,0xd3,0xa8,0x90,0x87,0x1b,0x5a,0x02,0x92,0xb4,0x97,0xdc,0x05,0x24,0x10,0x41, 0x07,0xdb,0x5f,0x3d,0xeb,0x8b,0x4a,0xd1,0xfd,0x15,0x8e,0x0e,0x37,0x0e,0xc6,0x90,0x21,0xbe,0xa0,0xbe, 0x7b,0x4f,0x71,0x44,0x62,0xe6,0xf5,0x12,0xe3,0x33,0x26,0x2d,0x76,0x54,0xfb,0x0f,0x21,0x2e,0x34,0xeb, 0x58,0xbd,0x92,0x90,0xb4,0xa8,0x6c,0x28,0x28,0x31,0xa2,0x08,0x20,0xef,0xdb,0x8e,0x9f,0x5b,0xeb,0xff, 0x00,0xba,0x32,0xff,0x00,0xf9,0x52,0xcf,0xf9,0x7e,0x16,0xd9,0xc3,0x27,0xe3,0x13,0x17,0x63,0xcb,0x5c, 0x81,0xfc,0x65,0xc5,0xb8,0x5d,0x76,0xa9,0x69,0x2f,0xd5,0xc9,0x51,0x21,0x4a,0x0a,0x61,0x47,0xec,0xd4, 0xae,0x84,0xa7,0xad,0xa2,0x95,0x04,0x8d,0x01,0xc1,0xe6,0xb9,0x8f,0xcc,0x64,0x54,0x7c,0x24,0x9e,0x5b, 0x34,0xed,0xe2,0x5e,0x4b,0x1f,0x10,0xc5,0xbb,0x22,0xb1,0xc4,0x90,0x02,0x9f,0xea,0x51,0xef,0x25,0x3d, 0x45,0x47,0xb7,0xdb,0x51,0xd2,0x47,0xab,0xcf,0x11,0x23,0x8a,0xde,0x41,0xc3,0x7b,0x8a,0x7d,0xa4,0x95, 0x4f,0x4a,0xea,0xe6,0x65,0x58,0xda,0x4a,0x9c,0xaa,0xcb,0x50,0x90,0x09,0x2a,0x56,0x2b,0x64,0x00,0x03, 0xdc,0x93,0xd8,0xe2,0x0b,0xb9,0x9e,0x39,0x96,0xf2,0xdb,0x28,0x7b,0x1e,0x9c,0xe4,0xe6,0x51,0x5b,0x20, 0x29,0xc4,0xc4,0x75,0x08,0x07,0xb6,0x7c,0x15,0xad,0x00,0x6f,0xcf,0xb6,0xf8,0x16,0xfe,0x27,0x77,0x96, 0xbc,0x89,0x7c,0xcb,0xc8,0xdc,0xb9,0x1d,0x49,0x71,0x34,0xb0,0x3a,0xa2,0xd5,0x32,0xa0,0x50,0x7c,0xa1, 0x27,0xad,0xf2,0x95,0xa5,0x44,0x17,0x54,0x7c,0x1d,0x74,0x8e,0x1a,0xf2,0x58,0xf1,0x20,0x72,0xb2,0xfa, 0x24,0x48,0xec,0x45,0x8a,0xd5,0x53,0xcd,0xb2,0xd3,0x2d,0x84,0x36,0x80,0x1b,0x20,0x25,0x29,0x00,0x00, 0x3d,0xbc,0x0e,0x1a,0xd3,0x8c,0x02,0xf1,0x11,0x32,0x4e,0x47,0xdb,0x9a,0x15,0xc1,0x73,0x0b,0x6e,0xc7, 0x43,0xd2,0x92,0xb0,0xac,0xd3,0x1b,0xc3,0xf9,0x45,0x41,0x27,0x23,0x9a,0xfc,0x16,0x14,0x1f,0x01,0xef, 0x82,0x79,0xc6,0xf6,0x64,0x3b,0xa1,0xd6,0x84,0x10,0x0f,0x83,0xe9,0x27,0x7e,0x37,0xc3,0x4c,0x5c,0xde, 0xa2,0x5c,0x66,0x64,0xc5,0xae,0xca,0x9f,0x8e,0xfa,0x12,0xe3,0x4e,0xb7,0x8b,0xd9,0x29,0x0b,0x4a,0x86, 0xc2,0x82,0x83,0x1a,0x20,0x82,0x0e,0xff,0x00,0x1e,0x07,0x72,0x9d,0x86,0x64,0xf2,0x7e,0xa2,0x34,0x86, 0x90,0xf3,0x4e,0xa2,0x42,0x1c,0x6d,0x68,0x0a,0x4a,0xd2,0x5f,0x70,0x14,0x90,0x41,0x04,0x1f,0x6d,0x7c, 0xf7,0xae,0x20,0x33,0x85,0xce,0xc6,0x26,0xae,0xc7,0x96,0xb9,0x03,0xf8,0xcb,0xab,0x70,0xba,0xed,0x52, 0xd2,0x5f,0xab,0x92,0xa2,0x42,0x94,0x14,0xc2,0x8f,0xd9,0xa9,0x5d,0x09,0x4f,0x5b,0x45,0x2a,0x09,0x1a, 0x03,0x82,0x6a,0xe6,0x03,0xa8,0x4a,0xaf,0x90,0x72,0x7b,0xd0,0xec,0x0b,0x8b,0x48,0xc8,0xf2,0x1f,0x8a, 0x64,0xfa,0xdf,0x5f,0xfd,0xd1,0x97,0xff,0x00,0xca,0x96,0x7f,0xcb,0xf1,0xe3,0x99,0x95,0x6b,0x69,0x2a, 0x72,0xab,0x2d,0x42,0x40,0x24,0xa9,0x58,0xa5,0x90,0x00,0x0f,0x7f,0x3d,0x8e,0x38,0xb5,0xcc,0x7e,0x63, 0x22,0xa3,0xe1,0x24,0xf2,0xd9,0x97,0x6f,0x12,0xf2,0x58,0xf8,0x86,0x2d,0xd9,0x15,0x8e,0x24,0x80,0x14, 0xff,0x00,0x52,0x8f,0x79,0x29,0xea,0x2a,0x3d,0xbe,0xda,0x8e,0x92,0x3d,0x5e,0x78,0x07,0x23,0x13,0xbb, 0xcb,0x5e,0x44,0xbe,0x66,0xe4,0x6e,0x5c,0x8e,0xa4,0xb8,0x9a,0x58,0x1d,0x51,0x6a,0x99,0x50,0x28,0x3e, 0x50,0x93,0xd6,0xf9,0x4a,0xd2,0xa2,0x0b,0xaa,0x3e,0x0e,0xba,0x47,0x09,0x49,0x15,0xbc,0x63,0x25,0xbd, 0xc5,0x32,0x92,0x4a,0x4e,0x30,0x2b,0x86,0x71,0x99,0x63,0x79,0x6f,0x28,0x72,0x07,0xf1,0xe9,0xee,0xce, 0x65,0x1f,0x0e,0x14,0xe0,0x88,0xea,0x10,0x0f,0x7d,0xaf,0x1d,0x4b,0x48,0x1b,0xd1,0xf6,0xe0,0x8c,0x6c, 0xc7,0x1e,0xc3,0x39,0x79,0x8e,0xcb,0xc9,0x67,0x3d,0x0a,0x3b,0xb5,0xd1,0xfa,0x5e,0xf8,0x27,0x9c,0x6f, 0x65,0x1e,0x12,0x56,0x84,0x14,0x83,0xe9,0x3e,0x37,0xbf,0x1c,0x77,0xe6,0xb4,0x68,0xb0,0x79,0x2d,0x6f, 0x12,0x14,0x66,0x23,0x46,0x69,0x31,0xdb,0x69,0xa6,0x5b,0x08,0x6d,0x09,0x0f,0xb7,0xa4,0xa5,0x20,0x00, 0x06,0xb5,0xe0,0x70,0x57,0x13,0x69,0x89,0x7c,0xb3,0xa2,0x8c,0xf3,0x48,0x7d,0x97,0x6b,0x1a,0x6d,0xd6, 0xd6,0x80,0xa4,0xac,0x16,0xc0,0x29,0x20,0x82,0x08,0x3e,0xda,0xf9,0xef,0x5c,0x5a,0x90,0xa1,0xd1,0x55, 0xb0,0x71,0xb8,0xf6,0x14,0x8a,0x6e,0xfa,0x83,0x79,0xed,0x1d,0xcd,0x70,0x8b,0x9b,0xd4,0x4b,0x8c,0xcc, 0x98,0xb5,0xd9,0x53,0xec,0x3c,0x84,0xb8,0xd3,0xad,0x62,0xf6,0x4a,0x42,0xd2,0xa1,0xb0,0xa0,0xa0,0xc6, 0x88,0x20,0x83,0xbf,0x6e,0x3a,0x7d,0x6f,0xaf,0xfe,0xe8,0xcb,0xff,0x00,0xe5,0x4b,0x3f,0xe5,0xf8,0x5b, 0x67,0x0c,0x9f,0x8c,0x4c,0x5d,0x8f,0x2d,0x72,0x07,0xf1,0x97,0x16,0xe1,0x75,0xda,0xa5,0xa4,0xbf,0x57, 0x25,0x44,0x85,0x28,0x29,0x85,0x1f,0xb3,0x52,0xba,0x12,0x9e,0xb6,0x8a,0x54,0x12,0x34,0x07,0x07,0x9a, 0xe6,0x3f,0x31,0x91,0x51,0xf0,0x92,0x79,0x6c,0xd3,0xb7,0x89,0x79,0x2c,0x7c,0x43,0x16,0xec,0x8a,0xc7, 0x12,0x40,0x0a,0x7f,0xa9,0x47,0xbc,0x94,0xf5,0x15,0x1e,0xdf,0x6d,0x47,0x49,0x1e,0xaf,0x3c,0x44,0x8e, 0x28,0x24,0x1c,0x37,0xb8,0xa7,0x9a,0x49,0x54,0xf4,0xae,0xae,0x66,0x55,0xad,0xa4,0xa9,0xca,0x9c,0xb5, 0x09,0x00,0x92,0xa5,0x62,0x96,0x40,0x00,0x3d,0xce,0xfb,0x1c,0x56,0xfc,0xde,0xcc,0x71,0xcc,0xbb,0x97, 0xf1,0xe4,0x63,0xb3,0xdc,0x9c,0xcb,0x76,0x6d,0x85,0x38,0x22,0xba,0x84,0x03,0xda,0x73,0xc7,0x52,0xd2, 0x06,0xfc,0x8f,0x1e,0xfc,0x33,0x48,0xc4,0xae,0xf2,0xd7,0x91,0x2f,0x99,0xb9,0x1b,0x97,0x23,0xa9,0x2e, 0x26,0x96,0x07,0x54,0x5a,0xa6,0x54,0x0a,0x0f,0x94,0x24,0xf5,0xbe,0x52,0xb4,0xa8,0x82,0xea,0x8f,0x83, 0xae,0x91,0xc4,0x3e,0x7e,0x45,0x8d,0x0b,0x96,0x75,0xb1,0x21,0x46,0x66,0x34,0x66,0x6c,0x5a,0x6d,0xa6, 0x99,0x6c,0x21,0xb6,0xd2,0x1a,0x74,0x00,0x94,0x80,0x00,0x1a,0xd7,0x81,0xc5,0x9f,0xd3,0x62,0x0f,0xaa, 0x44,0xaa,0x49,0x39,0xfb,0x54,0xfd,0x58,0xbb,0x58,0xb9,0x6c,0x63,0x15,0xff,0xd9 }; #endif luvcview-0.2.6/color.h0000644000175000017500000000552610764151556014210 0ustar aurel32aurel32/**************************************************************************** # GspcaGui: Gspca/Spca5xx Grabber # # Copyright (C) 2004 2005 2006 Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # ****************************************************************************/ typedef struct Myrgb16 { unsigned short blue:5; unsigned short green:6; unsigned short red:5; } Myrgb16; typedef struct Myrgb24 { unsigned char blue; unsigned char green; unsigned char red; } Myrgb24; typedef struct Myrgb32 { unsigned char blue; unsigned char green; unsigned char red; unsigned char alpha; } Myrgb32; typedef struct MyYUV422 { unsigned char y0; unsigned char u; unsigned char y1; unsigned char v; } MyYUV422; typedef struct MyYUV444 { unsigned char y; unsigned char u; unsigned char v; } MyYUV444; #define CLIP(color) (unsigned char)(((color)>0xFF)?0xff:(((color)<0)?0:(color))) unsigned char RGB24_TO_Y(unsigned char r, unsigned char g, unsigned char b); unsigned char YR_TO_V(unsigned char r, unsigned char y); unsigned char YB_TO_U(unsigned char b, unsigned char y); unsigned char R_FROMYV(unsigned char y, unsigned char v); unsigned char G_FROMYUV(unsigned char y, unsigned char u, unsigned char v); unsigned char B_FROMYU(unsigned char y, unsigned char u); #define YfromRGB(r,g,b) CLIP((77*(r)+150*(g)+29*(b))>>8) #define UfromRGB(r,g,b) CLIP(((128*(b)-85*(g)-43*(r))>>8 )+128) #define VfromRGB(r,g,b) CLIP(((128*(r)-107*(g)-21*(b))>>8) +128) #define PACKRGB16(r,g,b) (__u16) ((((b) & 0xF8) << 8 ) | (((g) & 0xFC) << 3 ) | (((r) & 0xF8) >> 3 )) #define UNPACK16(pixel,r,g,b) r=((pixel)&0xf800) >> 8; g=((pixel)&0x07e0) >> 3; b=(((pixel)&0x001f) << 3) void initLut(void); void freeLut(void); luvcview-0.2.6/huffman.h0000644000175000017500000001302410764151556014506 0ustar aurel32aurel32 #define DHT_SIZE 432 static unsigned char dht_data[DHT_SIZE] = { 0xff, 0xc4, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xc4, 0x00, 0x1f, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0xff, 0xc4, 0x00, 0xb5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa }; #define JPG_HUFFMAN_TABLE_LENGTH 0x1A0 const unsigned char JPEGHuffmanTable[JPG_HUFFMAN_TABLE_LENGTH] = { 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA }; luvcview-0.2.6/v4l2uvc.c0000644000175000017500000010451311122645011014345 0ustar aurel32aurel32/******************************************************************************* # uvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # *******************************************************************************/ #include #include #include #include "v4l2uvc.h" #include "utils.h" #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define FOURCC_FORMAT "%c%c%c%c" #define FOURCC_ARGS(c) (c) & 0xFF, ((c) >> 8) & 0xFF, ((c) >> 16) & 0xFF, ((c) >> 24) & 0xFF static int debug = 0; static int init_v4l2(struct vdIn *vd); static int float_to_fraction_recursive(double f, double p, int *num, int *den) { int whole = (int)f; f = fabs(f - whole); if(f > p) { int n, d; int a = float_to_fraction_recursive(1 / f, p + p / f, &n, &d); *num = d; *den = d * a + n; } else { *num = 0; *den = 1; } return whole; } static void float_to_fraction(float f, int *num, int *den) { int whole = float_to_fraction_recursive(f, FLT_EPSILON, num, den); *num += whole * *den; } int check_videoIn(struct vdIn *vd, char *device) { int ret; if (vd == NULL || device == NULL) return -1; vd->videodevice = (char *) calloc(1, 16 * sizeof(char)); snprintf(vd->videodevice, 12, "%s", device); printf("Device information:\n"); printf(" Device path: %s\n", vd->videodevice); if ((vd->fd = open(vd->videodevice, O_RDWR)) == -1) { perror("ERROR opening V4L interface"); exit(1); } memset(&vd->cap, 0, sizeof(struct v4l2_capability)); ret = ioctl(vd->fd, VIDIOC_QUERYCAP, &vd->cap); if (ret < 0) { printf("Error opening device %s: unable to query device.\n", vd->videodevice); goto fatal; } if ((vd->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) { printf("Error opening device %s: video capture not supported.\n", vd->videodevice); } if (!(vd->cap.capabilities & V4L2_CAP_STREAMING)) { printf("%s does not support streaming i/o\n", vd->videodevice); } if (!(vd->cap.capabilities & V4L2_CAP_READWRITE)) { printf("%s does not support read i/o\n", vd->videodevice); } enum_frame_formats(vd->fd, NULL, 0); fatal: close(vd->fd); free(vd->videodevice); return 0; } int init_videoIn(struct vdIn *vd, char *device, int width, int height, float fps, int format, int grabmethod, char *avifilename) { int ret = -1; int i; if (vd == NULL || device == NULL) return -1; if (width == 0 || height == 0) return -1; if (grabmethod < 0 || grabmethod > 1) grabmethod = 1; //mmap by default; vd->videodevice = NULL; vd->status = NULL; vd->pictName = NULL; vd->videodevice = (char *) calloc(1, 16 * sizeof(char)); vd->status = (char *) calloc(1, 100 * sizeof(char)); vd->pictName = (char *) calloc(1, 80 * sizeof(char)); snprintf(vd->videodevice, 12, "%s", device); printf("Device information:\n"); printf(" Device path: %s\n", vd->videodevice); vd->toggleAvi = 0; vd->avifile = NULL; vd->avifilename = avifilename; vd->recordtime = 0; vd->framecount = 0; vd->recordstart = 0; vd->getPict = 0; vd->signalquit = 1; vd->width = width; vd->height = height; vd->fps = fps; vd->formatIn = format; vd->grabmethod = grabmethod; vd->fileCounter = 0; vd->rawFrameCapture = 0; vd->rfsBytesWritten = 0; vd->rfsFramesWritten = 0; vd->captureFile = NULL; vd->bytesWritten = 0; vd->framesWritten = 0; if (init_v4l2(vd) < 0) { printf(" Init v4L2 failed !! exit fatal\n"); goto error;; } /* alloc a temp buffer to reconstruct the pict */ vd->framesizeIn = (vd->width * vd->height << 1); switch (vd->formatIn) { case V4L2_PIX_FMT_MJPEG: vd->tmpbuffer = (unsigned char *) calloc(1, (size_t) vd->framesizeIn); if (!vd->tmpbuffer) goto error; vd->framebuffer = (unsigned char *) calloc(1, (size_t) vd->width * (vd->height + 8) * 2); break; case V4L2_PIX_FMT_YUYV: vd->framebuffer = (unsigned char *) calloc(1, (size_t) vd->framesizeIn); break; default: printf(" should never arrive exit fatal !!\n"); goto error; break; } if (!vd->framebuffer) goto error; return 0; error: free(vd->videodevice); free(vd->status); free(vd->pictName); close(vd->fd); return -1; } int enum_controls(int vd) //struct vdIn *vd) { struct v4l2_queryctrl queryctrl; struct v4l2_querymenu querymenu; struct v4l2_control control_s; struct v4l2_input* getinput; //Name of the device getinput=(struct v4l2_input *) calloc(1, sizeof(struct v4l2_input)); memset(getinput, 0, sizeof(struct v4l2_input)); getinput->index=0; ioctl(vd,VIDIOC_ENUMINPUT , getinput); printf ("Available controls of device '%s' (Type 1=Integer 2=Boolean 3=Menu 4=Button)\n", getinput->name); //subroutine to read menu items of controls with type 3 void enumerate_menu (void) { printf (" Menu items:\n"); memset (&querymenu, 0, sizeof (querymenu)); querymenu.id = queryctrl.id; for (querymenu.index = queryctrl.minimum; querymenu.index <= queryctrl.maximum; querymenu.index++) { if (0 == ioctl (vd, VIDIOC_QUERYMENU, &querymenu)) { printf (" index:%d name:%s\n", querymenu.index, querymenu.name); SDL_Delay(10); } else { printf ("error getting control menu"); break; } } } //predefined controls printf ("V4L2_CID_BASE (predefined controls):\n"); memset (&queryctrl, 0, sizeof (queryctrl)); for (queryctrl.id = V4L2_CID_BASE; queryctrl.id < V4L2_CID_LASTP1; queryctrl.id++) { if (0 == ioctl (vd, VIDIOC_QUERYCTRL, &queryctrl)) { if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) continue; control_s.id=queryctrl.id; ioctl(vd, VIDIOC_G_CTRL, &control_s); SDL_Delay(10); printf (" index:%-10d name:%-32s type:%d min:%-5d max:%-5d step:%-5d def:%-5d now:%d\n", queryctrl.id, queryctrl.name, queryctrl.type, queryctrl.minimum, queryctrl.maximum, queryctrl.step, queryctrl.default_value, control_s.value); if (queryctrl.type == V4L2_CTRL_TYPE_MENU) enumerate_menu (); } else { if (errno == EINVAL) continue; perror ("error getting base controls"); goto fatal_controls; } } //driver specific controls printf ("V4L2_CID_PRIVATE_BASE (driver specific controls):\n"); for (queryctrl.id = V4L2_CID_PRIVATE_BASE;; queryctrl.id++) { if (0 == ioctl (vd, VIDIOC_QUERYCTRL, &queryctrl)) { if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) continue; control_s.id=queryctrl.id; ioctl(vd, VIDIOC_G_CTRL, &control_s); SDL_Delay(20); printf (" index:%-10d name:%-32s type:%d min:%-5d max:%-5d step:%-5d def:%-5d now:%d\n", queryctrl.id, queryctrl.name, queryctrl.type, queryctrl.minimum, queryctrl.maximum, queryctrl.step, queryctrl.default_value, control_s.value); if (queryctrl.type == V4L2_CTRL_TYPE_MENU) enumerate_menu (); } else { if (errno == EINVAL) break; perror ("error getting private base controls"); goto fatal_controls; } } return 0; fatal_controls: return -1; } int save_controls(int vd) { struct v4l2_queryctrl queryctrl; struct v4l2_control control_s; FILE *configfile; memset (&queryctrl, 0, sizeof (queryctrl)); memset (&control_s, 0, sizeof (control_s)); configfile = fopen("luvcview.cfg", "w"); if ( configfile == NULL) { perror("saving configfile luvcview.cfg failed"); } else { fprintf(configfile, "id value # luvcview control settings configuration file\n"); for (queryctrl.id = V4L2_CID_BASE; queryctrl.id < V4L2_CID_LASTP1; queryctrl.id++) { if (0 == ioctl (vd, VIDIOC_QUERYCTRL, &queryctrl)) { if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) continue; control_s.id=queryctrl.id; ioctl(vd, VIDIOC_G_CTRL, &control_s); SDL_Delay(10); fprintf (configfile, "%-10d %-10d # name:%-32s type:%d min:%-5d max:%-5d step:%-5d def:%d\n", queryctrl.id, control_s.value, queryctrl.name, queryctrl.type, queryctrl.minimum, queryctrl.maximum, queryctrl.step, queryctrl.default_value); printf ("%-10d %-10d # name:%-32s type:%d min:%-5d max:%-5d step:%-5d def:%d\n", queryctrl.id, control_s.value, queryctrl.name, queryctrl.type, queryctrl.minimum, queryctrl.maximum, queryctrl.step, queryctrl.default_value); SDL_Delay(10); } } for (queryctrl.id = V4L2_CID_PRIVATE_BASE;; queryctrl.id++) { if (0 == ioctl (vd, VIDIOC_QUERYCTRL, &queryctrl)) { if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED) continue; if ((queryctrl.id==134217735) || (queryctrl.id==134217736)) continue; control_s.id=queryctrl.id; ioctl(vd, VIDIOC_G_CTRL, &control_s); SDL_Delay(10); fprintf (configfile, "%-10d %-10d # name:%-32s type:%d min:%-5d max:%-5d step:%-5d def:%d\n", queryctrl.id, control_s.value, queryctrl.name, queryctrl.type, queryctrl.minimum, queryctrl.maximum, queryctrl.step, queryctrl.default_value); printf ("%-10d %-10d # name:%-32s type:%d min:%-5d max:%-5d step:%-5d def:%d\n", queryctrl.id, control_s.value, queryctrl.name, queryctrl.type, queryctrl.minimum, queryctrl.maximum, queryctrl.step, queryctrl.default_value); } else { if (errno == EINVAL) break; } } fflush(configfile); fclose(configfile); SDL_Delay(100); } } int load_controls(int vd) //struct vdIn *vd) { struct v4l2_control control; FILE *configfile; memset (&control, 0, sizeof (control)); configfile = fopen("luvcview.cfg", "r"); if ( configfile == NULL) { perror("configfile luvcview.cfg open failed"); } else { printf("loading controls from luvcview.cfg\n"); char buffer[512]; fgets(buffer, sizeof(buffer), configfile); while (NULL !=fgets(buffer, sizeof(buffer), configfile) ) { sscanf(buffer, "%i%i", &control.id, &control.value); if (ioctl(vd, VIDIOC_S_CTRL, &control)) printf("ERROR id:%d val:%d\n", control.id, control.value); else printf("OK id:%d val:%d\n", control.id, control.value); SDL_Delay(20); } fclose(configfile); } } static int init_v4l2(struct vdIn *vd) { int i; int ret = 0; if ((vd->fd = open(vd->videodevice, O_RDWR)) == -1) { perror("ERROR opening V4L interface"); exit(1); } memset(&vd->cap, 0, sizeof(struct v4l2_capability)); ret = ioctl(vd->fd, VIDIOC_QUERYCAP, &vd->cap); if (ret < 0) { printf("Error opening device %s: unable to query device.\n", vd->videodevice); goto fatal; } if ((vd->cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) { printf("Error opening device %s: video capture not supported.\n", vd->videodevice); goto fatal;; } if (vd->grabmethod) { if (!(vd->cap.capabilities & V4L2_CAP_STREAMING)) { printf("%s does not support streaming i/o\n", vd->videodevice); goto fatal; } } else { if (!(vd->cap.capabilities & V4L2_CAP_READWRITE)) { printf("%s does not support read i/o\n", vd->videodevice); goto fatal; } } printf("Stream settings:\n"); // Enumerate the supported formats to check whether the requested one // is available. If not, we try to fall back to YUYV. unsigned int device_formats[16] = { 0 }; // Assume no device supports more than 16 formats int requested_format_found = 0, fallback_format = -1; if(enum_frame_formats(vd->fd, device_formats, ARRAY_SIZE(device_formats))) { printf("Unable to enumerate frame formats"); goto fatal; } for(i = 0; i < ARRAY_SIZE(device_formats) && device_formats[i]; i++) { if(device_formats[i] == vd->formatIn) { requested_format_found = 1; break; } if(device_formats[i] == V4L2_PIX_FMT_MJPEG || device_formats[i] == V4L2_PIX_FMT_YUYV) fallback_format = i; } if(requested_format_found) { // The requested format is supported printf(" Frame format: "FOURCC_FORMAT"\n", FOURCC_ARGS(vd->formatIn)); } else if(fallback_format >= 0) { // The requested format is not supported but there's a fallback format printf(" Frame format: "FOURCC_FORMAT" ("FOURCC_FORMAT " is not supported by device)\n", FOURCC_ARGS(device_formats[0]), FOURCC_ARGS(vd->formatIn)); vd->formatIn = device_formats[0]; } else { // The requested format is not supported and no fallback format is available printf("ERROR: Requested frame format "FOURCC_FORMAT" is not available " "and no fallback format was found.\n", FOURCC_ARGS(vd->formatIn)); goto fatal; } // Set pixel format and frame size memset(&vd->fmt, 0, sizeof(struct v4l2_format)); vd->fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd->fmt.fmt.pix.width = vd->width; vd->fmt.fmt.pix.height = vd->height; vd->fmt.fmt.pix.pixelformat = vd->formatIn; vd->fmt.fmt.pix.field = V4L2_FIELD_ANY; ret = ioctl(vd->fd, VIDIOC_S_FMT, &vd->fmt); if (ret < 0) { perror("Unable to set format"); goto fatal; } if ((vd->fmt.fmt.pix.width != vd->width) || (vd->fmt.fmt.pix.height != vd->height)) { printf(" Frame size: %ux%u (requested size %ux%u is not supported by device)\n", vd->fmt.fmt.pix.width, vd->fmt.fmt.pix.height, vd->width, vd->height); vd->width = vd->fmt.fmt.pix.width; vd->height = vd->fmt.fmt.pix.height; /* look the format is not part of the deal ??? */ //vd->formatIn = vd->fmt.fmt.pix.pixelformat; } else { printf(" Frame size: %dx%d\n", vd->width, vd->height); } /* set framerate */ struct v4l2_streamparm* setfps; setfps=(struct v4l2_streamparm *) calloc(1, sizeof(struct v4l2_streamparm)); memset(setfps, 0, sizeof(struct v4l2_streamparm)); setfps->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; // Convert the frame rate into a fraction for V4L2 int n = 0, d = 0; float_to_fraction(vd->fps, &n, &d); setfps->parm.capture.timeperframe.numerator = d; setfps->parm.capture.timeperframe.denominator = n; ret = ioctl(vd->fd, VIDIOC_S_PARM, setfps); if(ret == -1) { perror("Unable to set frame rate"); goto fatal; } ret = ioctl(vd->fd, VIDIOC_G_PARM, setfps); if(ret == 0) { float confirmed_fps = (float)setfps->parm.capture.timeperframe.denominator / (float)setfps->parm.capture.timeperframe.numerator; if (confirmed_fps != (float)n / (float)d) { printf(" Frame rate: %g fps (requested frame rate %g fps is " "not supported by device)\n", confirmed_fps, vd->fps); vd->fps = confirmed_fps; } else { printf(" Frame rate: %g fps\n", vd->fps); } } else { perror("Unable to read out current frame rate"); goto fatal; } /* request buffers */ memset(&vd->rb, 0, sizeof(struct v4l2_requestbuffers)); vd->rb.count = NB_BUFFER; vd->rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd->rb.memory = V4L2_MEMORY_MMAP; ret = ioctl(vd->fd, VIDIOC_REQBUFS, &vd->rb); if (ret < 0) { perror("Unable to allocate buffers"); goto fatal; } /* map the buffers */ for (i = 0; i < NB_BUFFER; i++) { memset(&vd->buf, 0, sizeof(struct v4l2_buffer)); vd->buf.index = i; vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd->buf.memory = V4L2_MEMORY_MMAP; ret = ioctl(vd->fd, VIDIOC_QUERYBUF, &vd->buf); if (ret < 0) { perror("Unable to query buffer"); goto fatal; } if (debug) printf("length: %u offset: %u\n", vd->buf.length, vd->buf.m.offset); vd->mem[i] = mmap(0 /* start anywhere */ , vd->buf.length, PROT_READ, MAP_SHARED, vd->fd, vd->buf.m.offset); if (vd->mem[i] == MAP_FAILED) { perror("Unable to map buffer"); goto fatal; } if (debug) printf("Buffer mapped at address %p.\n", vd->mem[i]); } /* Queue the buffers. */ for (i = 0; i < NB_BUFFER; ++i) { memset(&vd->buf, 0, sizeof(struct v4l2_buffer)); vd->buf.index = i; vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd->buf.memory = V4L2_MEMORY_MMAP; ret = ioctl(vd->fd, VIDIOC_QBUF, &vd->buf); if (ret < 0) { perror("Unable to queue buffer"); goto fatal;; } } return 0; fatal: return -1; } static int video_enable(struct vdIn *vd) { int type = V4L2_BUF_TYPE_VIDEO_CAPTURE; int ret; ret = ioctl(vd->fd, VIDIOC_STREAMON, &type); if (ret < 0) { perror("Unable to start capture"); return ret; } vd->isstreaming = 1; return 0; } static int video_disable(struct vdIn *vd) { int type = V4L2_BUF_TYPE_VIDEO_CAPTURE; int ret; ret = ioctl(vd->fd, VIDIOC_STREAMOFF, &type); if (ret < 0) { perror("Unable to stop capture"); return ret; } vd->isstreaming = 0; return 0; } int uvcGrab(struct vdIn *vd) { #define HEADERFRAME1 0xaf int ret; if (!vd->isstreaming) if (video_enable(vd)) goto err; memset(&vd->buf, 0, sizeof(struct v4l2_buffer)); vd->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd->buf.memory = V4L2_MEMORY_MMAP; ret = ioctl(vd->fd, VIDIOC_DQBUF, &vd->buf); if (ret < 0) { perror("Unable to dequeue buffer"); goto err; } /* Capture a single raw frame */ if (vd->rawFrameCapture && vd->buf.bytesused > 0) { FILE *frame = NULL; char filename[13]; int ret; /* Disable frame capturing unless we're in frame stream mode */ if(vd->rawFrameCapture == 1) vd->rawFrameCapture = 0; /* Create a file name and open the file */ sprintf(filename, "frame%03u.raw", vd->fileCounter++ % 1000); frame = fopen(filename, "wb"); if(frame == NULL) { perror("Unable to open file for raw frame capturing"); goto end_capture; } /* Write the raw data to the file */ ret = fwrite(vd->mem[vd->buf.index], vd->buf.bytesused, 1, frame); if(ret < 1) { perror("Unable to write to file"); goto end_capture; } printf("Saved raw frame to %s (%u bytes)\n", filename, vd->buf.bytesused); if(vd->rawFrameCapture == 2) { vd->rfsBytesWritten += vd->buf.bytesused; vd->rfsFramesWritten++; } /* Clean up */ end_capture: if(frame) fclose(frame); } /* Capture raw stream data */ if (vd->captureFile && vd->buf.bytesused > 0) { int ret; ret = fwrite(vd->mem[vd->buf.index], vd->buf.bytesused, 1, vd->captureFile); if (ret < 1) { perror("Unable to write raw stream to file"); fprintf(stderr, "Stream capturing terminated.\n"); fclose(vd->captureFile); vd->captureFile = NULL; vd->framesWritten = 0; vd->bytesWritten = 0; } else { vd->framesWritten++; vd->bytesWritten += vd->buf.bytesused; if (debug) printf("Appended raw frame to stream file (%u bytes)\n", vd->buf.bytesused); } } switch (vd->formatIn) { case V4L2_PIX_FMT_MJPEG: if(vd->buf.bytesused <= HEADERFRAME1) { /* Prevent crash on empty image */ /* if(debug)*/ printf("Ignoring empty buffer ...\n"); return 0; } memcpy(vd->tmpbuffer, vd->mem[vd->buf.index],vd->buf.bytesused); /* avi recording is toggled on */ if (vd->toggleAvi) { /* if vd->avifile is NULL, then we need to initialize it */ if (vd->avifile == NULL) { vd->avifile = AVI_open_output_file(vd->avifilename); /* if avifile is NULL, there was an error */ if (vd->avifile == NULL ) { fprintf(stderr,"Error opening avifile %s\n",vd->avifilename); } else { /* we default the fps to 15, we'll reset it on close */ AVI_set_video(vd->avifile, vd->width, vd->height, 15, "MJPG"); printf("recording to %s\n",vd->avifilename); } } else { /* if we have a valid avifile, record the frame to it */ AVI_write_frame(vd->avifile, vd->tmpbuffer, vd->buf.bytesused, vd->framecount); vd->framecount++; } } if (jpeg_decode(&vd->framebuffer, vd->tmpbuffer, &vd->width, &vd->height) < 0) { printf("jpeg decode errors\n"); goto err; } if (debug) printf("bytes in used %d\n", vd->buf.bytesused); break; case V4L2_PIX_FMT_YUYV: if (vd->buf.bytesused > vd->framesizeIn) memcpy(vd->framebuffer, vd->mem[vd->buf.index], (size_t) vd->framesizeIn); else memcpy(vd->framebuffer, vd->mem[vd->buf.index], (size_t) vd->buf.bytesused); break; default: goto err; break; } ret = ioctl(vd->fd, VIDIOC_QBUF, &vd->buf); if (ret < 0) { perror("Unable to requeue buffer"); goto err; } return 0; err: vd->signalquit = 0; return -1; } int close_v4l2(struct vdIn *vd) { if (vd->isstreaming) video_disable(vd); if (vd->tmpbuffer) free(vd->tmpbuffer); vd->tmpbuffer = NULL; free(vd->framebuffer); vd->framebuffer = NULL; free(vd->videodevice); free(vd->status); free(vd->pictName); vd->videodevice = NULL; vd->status = NULL; vd->pictName = NULL; } /* return >= 0 ok otherwhise -1 */ static int isv4l2Control(struct vdIn *vd, int control, struct v4l2_queryctrl *queryctrl) { int err =0; queryctrl->id = control; if ((err= ioctl(vd->fd, VIDIOC_QUERYCTRL, queryctrl)) < 0) { perror("ioctl querycontrol error"); } else if (queryctrl->flags & V4L2_CTRL_FLAG_DISABLED) { printf("control %s disabled\n", (char *) queryctrl->name); } else if (queryctrl->flags & V4L2_CTRL_TYPE_BOOLEAN) { return 1; } else if (queryctrl->type & V4L2_CTRL_TYPE_INTEGER) { return 0; } else { printf("contol %s unsupported\n", (char *) queryctrl->name); } return -1; } int v4l2GetControl(struct vdIn *vd, int control) { struct v4l2_queryctrl queryctrl; struct v4l2_control control_s; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; control_s.id = control; if ((err = ioctl(vd->fd, VIDIOC_G_CTRL, &control_s)) < 0) { printf("ioctl get control error\n"); return -1; } return control_s.value; } int v4l2SetControl(struct vdIn *vd, int control, int value) { struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int min, max, step, val_def; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; min = queryctrl.minimum; max = queryctrl.maximum; step = queryctrl.step; val_def = queryctrl.default_value; if ((value >= min) && (value <= max)) { control_s.id = control; control_s.value = value; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl set control error\n"); return -1; } } return 0; } int v4l2UpControl(struct vdIn *vd, int control) { struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int min, max, current, step, val_def; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; min = queryctrl.minimum; max = queryctrl.maximum; step = queryctrl.step; val_def = queryctrl.default_value; current = v4l2GetControl(vd, control); current += step; printf("max %d, min %d, step %d, default %d ,current %d\n",max,min,step,val_def,current); if (current <= max) { control_s.id = control; control_s.value = current; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl set control error\n"); return -1; } printf ("Control name:%s set to value:%d\n", queryctrl.name, control_s.value); } else { printf ("Control name:%s already has max value:%d\n", queryctrl.name, max); } return control_s.value; } int v4l2DownControl(struct vdIn *vd, int control) { struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int min, max, current, step, val_def; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; min = queryctrl.minimum; max = queryctrl.maximum; step = queryctrl.step; val_def = queryctrl.default_value; current = v4l2GetControl(vd, control); current -= step; printf("max %d, min %d, step %d, default %d ,current %d\n",max,min,step,val_def,current); if (current >= min) { control_s.id = control; control_s.value = current; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl set control error\n"); return -1; } printf ("Control name:%s set to value:%d\n", queryctrl.name, control_s.value); } else { printf ("Control name:%s already has min value:%d\n", queryctrl.name, min); } return control_s.value; } int v4l2ToggleControl(struct vdIn *vd, int control) { struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int current; int err; if (isv4l2Control(vd, control, &queryctrl) != 1) return -1; current = v4l2GetControl(vd, control); control_s.id = control; control_s.value = !current; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl toggle control error\n"); return -1; } return control_s.value; } int v4l2ResetControl(struct vdIn *vd, int control) { struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int val_def; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; val_def = queryctrl.default_value; control_s.id = control; control_s.value = val_def; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl reset control error\n"); return -1; } return 0; } int v4l2ResetPan(struct vdIn *vd) { int control = V4L2_CID_PAN_RESET; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; control_s.id = control; control_s.value = 1; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ERROR: Unable to reset pan (error = %d)\n", errno); return -1; } return 0; } int v4l2ResetTilt(struct vdIn *vd) { int control = V4L2_CID_TILT_RESET; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; control_s.id = control; control_s.value = 1; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ERROR: Unable to reset tilt (error = %d)\n", errno); return -1; } return 0; } int v4l2ResetPanTilt(struct vdIn *vd) { int control = V4L2_CID_PANTILT_RESET; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; unsigned char val; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; control_s.id = control; control_s.value = 3; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ERROR: Unable to reset pan/tilt (error = %d)\n", errno); return -1; } return 0; } int v4L2UpDownPan(struct vdIn *vd, short inc) { int control = V4L2_CID_PAN_RELATIVE; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; control_s.id = control; control_s.value = inc; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl pan updown control error\n"); return -1; } return 0; } int v4L2UpDownTilt(struct vdIn *vd, short inc) { int control = V4L2_CID_TILT_RELATIVE; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int err; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; control_s.id = control; control_s.value = inc; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl tiltupdown control error\n"); return -1; } return 0; } int v4L2UpDownPanTilt(struct vdIn *vd, short inc_p, short inc_t) { int p_control = V4L2_CID_PAN_RELATIVE; int t_control = V4L2_CID_TILT_RELATIVE; struct v4l2_ext_controls control_s_array; struct v4l2_queryctrl queryctrl; struct v4l2_ext_control control_s[2]; int err; if(isv4l2Control(vd, p_control, &queryctrl) < 0 || isv4l2Control(vd, t_control, &queryctrl) < 0) return -1; control_s_array.count = 2; control_s_array.ctrl_class = V4L2_CTRL_CLASS_USER; control_s_array.reserved[0] = 0; control_s_array.reserved[1] = 0; control_s_array.controls = control_s; control_s[0].id = p_control; control_s[0].value = inc_p; control_s[1].id = t_control; control_s[1].value = inc_t; if ((err = ioctl(vd->fd, VIDIOC_S_EXT_CTRLS, &control_s_array)) < 0) { printf("ioctl pan-tilt updown control error\n"); return -1; } return 0; } #if 0 union pantilt { struct { short pan; short tilt; } s16; int value; } __attribute__((packed)) ; int v4L2UpDownPan(struct vdIn *vd, short inc) { int control = V4L2_CID_PANTILT_RELATIVE; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int err; union pantilt pan; control_s.id = control; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; pan.s16.pan = inc; pan.s16.tilt = 0; control_s.value = pan.value ; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl pan updown control error\n"); return -1; } return 0; } int v4L2UpDownTilt(struct vdIn *vd, short inc) { int control = V4L2_CID_PANTILT_RELATIVE; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int err; union pantilt pan; control_s.id = control; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; pan.s16.pan= 0; pan.s16.tilt = inc; control_s.value = pan.value; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl tiltupdown control error\n"); return -1; } return 0; } #endif int v4l2SetLightFrequencyFilter(struct vdIn *vd, int flt) { int control = V4L2_CID_POWER_LINE_FREQUENCY; struct v4l2_control control_s; struct v4l2_queryctrl queryctrl; int err; control_s.id = control; if (isv4l2Control(vd, control, &queryctrl) < 0) return -1; control_s.value = flt; if ((err = ioctl(vd->fd, VIDIOC_S_CTRL, &control_s)) < 0) { printf("ioctl set_light_frequency_filter error\n"); return -1; } return 0; } int enum_frame_intervals(int dev, __u32 pixfmt, __u32 width, __u32 height) { int ret; struct v4l2_frmivalenum fival; memset(&fival, 0, sizeof(fival)); fival.index = 0; fival.pixel_format = pixfmt; fival.width = width; fival.height = height; printf("\tTime interval between frame: "); while ((ret = ioctl(dev, VIDIOC_ENUM_FRAMEINTERVALS, &fival)) == 0) { if (fival.type == V4L2_FRMIVAL_TYPE_DISCRETE) { printf("%u/%u, ", fival.discrete.numerator, fival.discrete.denominator); } else if (fival.type == V4L2_FRMIVAL_TYPE_CONTINUOUS) { printf("{min { %u/%u } .. max { %u/%u } }, ", fival.stepwise.min.numerator, fival.stepwise.min.numerator, fival.stepwise.max.denominator, fival.stepwise.max.denominator); break; } else if (fival.type == V4L2_FRMIVAL_TYPE_STEPWISE) { printf("{min { %u/%u } .. max { %u/%u } / " "stepsize { %u/%u } }, ", fival.stepwise.min.numerator, fival.stepwise.min.denominator, fival.stepwise.max.numerator, fival.stepwise.max.denominator, fival.stepwise.step.numerator, fival.stepwise.step.denominator); break; } fival.index++; } printf("\n"); if (ret != 0 && errno != EINVAL) { perror("ERROR enumerating frame intervals"); return errno; } return 0; } int enum_frame_sizes(int dev, __u32 pixfmt) { int ret; struct v4l2_frmsizeenum fsize; memset(&fsize, 0, sizeof(fsize)); fsize.index = 0; fsize.pixel_format = pixfmt; while ((ret = ioctl(dev, VIDIOC_ENUM_FRAMESIZES, &fsize)) == 0) { if (fsize.type == V4L2_FRMSIZE_TYPE_DISCRETE) { printf("{ discrete: width = %u, height = %u }\n", fsize.discrete.width, fsize.discrete.height); ret = enum_frame_intervals(dev, pixfmt, fsize.discrete.width, fsize.discrete.height); if (ret != 0) printf(" Unable to enumerate frame sizes.\n"); } else if (fsize.type == V4L2_FRMSIZE_TYPE_CONTINUOUS) { printf("{ continuous: min { width = %u, height = %u } .. " "max { width = %u, height = %u } }\n", fsize.stepwise.min_width, fsize.stepwise.min_height, fsize.stepwise.max_width, fsize.stepwise.max_height); printf(" Refusing to enumerate frame intervals.\n"); break; } else if (fsize.type == V4L2_FRMSIZE_TYPE_STEPWISE) { printf("{ stepwise: min { width = %u, height = %u } .. " "max { width = %u, height = %u } / " "stepsize { width = %u, height = %u } }\n", fsize.stepwise.min_width, fsize.stepwise.min_height, fsize.stepwise.max_width, fsize.stepwise.max_height, fsize.stepwise.step_width, fsize.stepwise.step_height); printf(" Refusing to enumerate frame intervals.\n"); break; } fsize.index++; } if (ret != 0 && errno != EINVAL) { perror("ERROR enumerating frame sizes"); return errno; } return 0; } int enum_frame_formats(int dev, unsigned int *supported_formats, unsigned int max_formats) { int ret; struct v4l2_fmtdesc fmt; memset(&fmt, 0, sizeof(fmt)); fmt.index = 0; fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; while ((ret = ioctl(dev, VIDIOC_ENUM_FMT, &fmt)) == 0) { if(supported_formats == NULL) { printf("{ pixelformat = '%c%c%c%c', description = '%s' }\n", fmt.pixelformat & 0xFF, (fmt.pixelformat >> 8) & 0xFF, (fmt.pixelformat >> 16) & 0xFF, (fmt.pixelformat >> 24) & 0xFF, fmt.description); ret = enum_frame_sizes(dev, fmt.pixelformat); if(ret != 0) printf(" Unable to enumerate frame sizes.\n"); } else if(fmt.index < max_formats) { supported_formats[fmt.index] = fmt.pixelformat; } fmt.index++; } if (errno != EINVAL) { perror("ERROR enumerating frame formats"); return errno; } return 0; } luvcview-0.2.6/gui.c0000644000175000017500000000754510764151556013654 0ustar aurel32aurel32/******************************************************************************* # uvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # *******************************************************************************/ #include #include #include #include #include #include #include #include "gui.h" #include "utils.h" #include "button.h" #define ADDRESSE(x,y,w) (((y)*(w))+(x)) unsigned char *YUYVbutt = NULL; typedef struct YUYV { unsigned char Y0; unsigned char U0; } YUYV; /* Each pixels in the resulting figure need to be set. For each one take the nearest available in the original surface If the last Chroma component is U take a V else take U by moving the index in the nearest pixel from the left This routine only deal with X axis you need to make the original picture with the good height */ static int resize(unsigned char *INbuff, unsigned char *OUTbuff, int Owidth, int Oheight, int width, int height) { int rx; int xscale; int x, y; int Cc, lastCc; YUYV *input = (YUYV *) INbuff; YUYV *output = (YUYV *) OUTbuff; if (!width || !height) return -1; /* at start Cc mean a U component so LastCc should be a V */ lastCc = 1; xscale = (Owidth << 16) / width; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { rx = x * xscale >> 16; if (((2 * rx + 1) & 0x03) == 3) Cc = 1; // find V component else Cc = 0; if (lastCc == Cc) { /* no Chroma interleave correct by moving the index */ rx -= 1; Cc = !Cc; } memcpy(output++, &input[ADDRESSE((int) rx, (int) y, Owidth)], sizeof(YUYV)); lastCc = Cc; } } return 0; } int creatButt(int width, int height) { int wOrg = 0; int hOrg = 0; jpeg_decode(&YUYVbuttOrg, bouttons, &wOrg, &hOrg); if (wOrg != BUTTWIDTH || hOrg != BUTTHEIGHT) { printf(" alloc jpeg Button fail !!\n"); goto err; } YUYVbutt = (unsigned char *) calloc(1, width * height << 1); if (!YUYVbutt) { printf(" alloc Button fail !!\n"); goto err; } if (resize(YUYVbuttOrg, YUYVbutt, BUTTWIDTH, BUTTHEIGHT, width, height) < 0) { printf(" resize Button fail !!\n"); goto err; } return 0; err: exit(0); } int destroyButt(void) { free(YUYVbutt); YUYVbutt = NULL; free(YUYVbuttOrg); YUYVbuttOrg = NULL; } luvcview-0.2.6/avilib.c0000644000175000017500000014733110767450671014337 0ustar aurel32aurel32/* * avilib.c * * Copyright (C) Thomas Östreich - June 2001 * multiple audio track support Copyright (C) 2002 Thomas Östreich * * Original code: * Copyright (C) 1999 Rainer Johanni * * This file is part of transcode, a linux video stream processing tool * * transcode is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * transcode is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Make; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ //SLM #ifdef WIN32 #include #define ftruncate _chsize #define strncasecmp _strnicmp typedef int ssize_t; #endif #ifdef __CYGWIN__ #include #endif #include "avilib.h" //#include #define INFO_LIST /* The following variable indicates the kind of error */ long AVI_errno = 0; #define MAX_INFO_STRLEN 64 static char id_str[MAX_INFO_STRLEN]; #define FRAME_RATE_SCALE 1000000 /******************************************************************* * * * Utilities for writing an AVI File * * * *******************************************************************/ static size_t avi_read(int fd, char *buf, size_t len) { size_t n = 0; size_t r = 0; while (r < len) { n = read (fd, buf + r, len - r); if ((ssize_t)n <= 0) return r; r += n; } return r; } static size_t avi_write (int fd, char *buf, size_t len) { size_t n = 0; size_t r = 0; while (r < len) { n = write (fd, buf + r, len - r); if ((ssize_t)n < 0) return n; r += n; } return r; } /* HEADERBYTES: The number of bytes to reserve for the header */ #define HEADERBYTES 2048 /* AVI_MAX_LEN: The maximum length of an AVI file, we stay a bit below the 2GB limit (Remember: 2*10^9 is smaller than 2 GB) */ #define AVI_MAX_LEN (UINT_MAX-(1<<20)*16-HEADERBYTES) #define PAD_EVEN(x) ( ((x)+1) & ~1 ) /* Copy n into dst as a 4 byte, little endian number. Should also work on big endian machines */ static void long2str(unsigned char *dst, int n) { dst[0] = (n )&0xff; dst[1] = (n>> 8)&0xff; dst[2] = (n>>16)&0xff; dst[3] = (n>>24)&0xff; } /* Convert a string of 4 or 2 bytes to a number, also working on big endian machines */ static unsigned long str2ulong(unsigned char *str) { return ( str[0] | (str[1]<<8) | (str[2]<<16) | (str[3]<<24) ); } static unsigned long str2ushort(unsigned char *str) { return ( str[0] | (str[1]<<8) ); } /* Calculate audio sample size from number of bits and number of channels. This may have to be adjusted for eg. 12 bits and stereo */ static int avi_sampsize(avi_t *AVI, int j) { int s; s = ((AVI->track[j].a_bits+7)/8)*AVI->track[j].a_chans; // if(s==0) s=1; /* avoid possible zero divisions */ if(s<4) s=4; /* avoid possible zero divisions */ return s; } /* Add a chunk (=tag and data) to the AVI file, returns -1 on write error, 0 on success */ static int avi_add_chunk(avi_t *AVI, unsigned char *tag, unsigned char *data, int length) { unsigned char c[8]; /* Copy tag and length int c, so that we need only 1 write system call for these two values */ memcpy(c,tag,4); long2str(c+4,length); /* Output tag, length and data, restore previous position if the write fails */ length = PAD_EVEN(length); if( avi_write(AVI->fdes,(char *)c,8) != 8 || avi_write(AVI->fdes,(char *)data,length) != length ) { lseek(AVI->fdes,AVI->pos,SEEK_SET); AVI_errno = AVI_ERR_WRITE; return -1; } /* Update file position */ AVI->pos += 8 + length; //fprintf(stderr, "pos=%lu %s\n", AVI->pos, tag); return 0; } static int avi_add_index_entry(avi_t *AVI, unsigned char *tag, long flags, unsigned long pos, unsigned long len) { void *ptr; if(AVI->n_idx>=AVI->max_idx) { ptr = realloc((void *)AVI->idx,(AVI->max_idx+4096)*16); if(ptr == 0) { AVI_errno = AVI_ERR_NO_MEM; return -1; } AVI->max_idx += 4096; AVI->idx = (unsigned char((*)[16]) ) ptr; } /* Add index entry */ // fprintf(stderr, "INDEX %s %ld %lu %lu\n", tag, flags, pos, len); memcpy(AVI->idx[AVI->n_idx],tag,4); long2str(AVI->idx[AVI->n_idx]+ 4,flags); long2str(AVI->idx[AVI->n_idx]+ 8, pos); long2str(AVI->idx[AVI->n_idx]+12, len); /* Update counter */ AVI->n_idx++; if(len>AVI->max_len) AVI->max_len=len; return 0; } //SLM #ifndef S_IRUSR #define S_IRWXU 00700 /* read, write, execute: owner */ #define S_IRUSR 00400 /* read permission: owner */ #define S_IWUSR 00200 /* write permission: owner */ #define S_IXUSR 00100 /* execute permission: owner */ #define S_IRWXG 00070 /* read, write, execute: group */ #define S_IRGRP 00040 /* read permission: group */ #define S_IWGRP 00020 /* write permission: group */ #define S_IXGRP 00010 /* execute permission: group */ #define S_IRWXO 00007 /* read, write, execute: other */ #define S_IROTH 00004 /* read permission: other */ #define S_IWOTH 00002 /* write permission: other */ #define S_IXOTH 00001 /* execute permission: other */ #endif /* AVI_open_output_file: Open an AVI File and write a bunch of zero bytes as space for the header. returns a pointer to avi_t on success, a zero pointer on error */ avi_t* AVI_open_output_file(char * filename) { avi_t *AVI; int i; int mask; unsigned char AVI_header[HEADERBYTES]; /* Allocate the avi_t struct and zero it */ AVI = (avi_t *) malloc(sizeof(avi_t)); if(AVI==0) { AVI_errno = AVI_ERR_NO_MEM; return 0; } memset((void *)AVI,0,sizeof(avi_t)); /* Since Linux needs a long time when deleting big files, we do not truncate the file when we open it. Instead it is truncated when the AVI file is closed */ mask = umask (0); umask (mask); #ifdef WIN32 AVI->fdes = open(filename, O_RDWR|O_CREAT|O_BINARY, (S_IRUSR | S_IWUSR) &~ mask); #else AVI->fdes = open(filename, O_RDWR|O_CREAT, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) &~ mask); #endif if (AVI->fdes < 0) { AVI_errno = AVI_ERR_OPEN; free(AVI); return 0; } /* Write out HEADERBYTES bytes, the header will go here when we are finished with writing */ for (i=0;ifdes,(char *)AVI_header,HEADERBYTES); if (i != HEADERBYTES) { close(AVI->fdes); AVI_errno = AVI_ERR_WRITE; free(AVI); return 0; } AVI->pos = HEADERBYTES; AVI->mode = AVI_MODE_WRITE; /* open for writing */ //init AVI->anum = 0; AVI->aptr = 0; return AVI; } void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor) { /* may only be called if file is open for writing */ if(AVI->mode==AVI_MODE_READ) return; AVI->width = width; AVI->height = height; AVI->fps = fps; if(strncmp(compressor, "RGB", 3)==0) { memset(AVI->compressor, 0, 4); } else { memcpy(AVI->compressor,compressor,4); } AVI->compressor[4] = 0; avi_update_header(AVI); } void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format, long mp3rate) { /* may only be called if file is open for writing */ if(AVI->mode==AVI_MODE_READ) return; //inc audio tracks AVI->aptr=AVI->anum; ++AVI->anum; if(AVI->anum > AVI_MAX_TRACKS) { fprintf(stderr, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); exit(1); } AVI->track[AVI->aptr].a_chans = channels; AVI->track[AVI->aptr].a_rate = rate; AVI->track[AVI->aptr].a_bits = bits; AVI->track[AVI->aptr].a_fmt = format; AVI->track[AVI->aptr].mp3rate = mp3rate; avi_update_header(AVI); } #define OUT4CC(s) \ if(nhb<=HEADERBYTES-4) memcpy(AVI_header+nhb,s,4); nhb += 4 #define OUTLONG(n) \ if(nhb<=HEADERBYTES-4) long2str(AVI_header+nhb,n); nhb += 4 #define OUTSHRT(n) \ if(nhb<=HEADERBYTES-2) { \ AVI_header[nhb ] = (n )&0xff; \ AVI_header[nhb+1] = (n>>8)&0xff; \ } \ nhb += 2 //ThOe write preliminary AVI file header: 0 frames, max vid/aud size int avi_update_header(avi_t *AVI) { int njunk, sampsize, hasIndex, ms_per_frame, frate, flag; int movi_len, hdrl_start, strl_start, j; unsigned char AVI_header[HEADERBYTES]; long nhb; //assume max size movi_len = AVI_MAX_LEN - HEADERBYTES + 4; //assume index will be written hasIndex=1; if(AVI->fps < 0.001) { frate=0; ms_per_frame=0; } else { frate = (int) (FRAME_RATE_SCALE*AVI->fps + 0.5); ms_per_frame=(int) (1000000/AVI->fps + 0.5); } /* Prepare the file header */ nhb = 0; /* The RIFF header */ OUT4CC ("RIFF"); OUTLONG(movi_len); // assume max size OUT4CC ("AVI "); /* Start the header list */ OUT4CC ("LIST"); OUTLONG(0); /* Length of list in bytes, don't know yet */ hdrl_start = nhb; /* Store start position */ OUT4CC ("hdrl"); /* The main AVI header */ /* The Flags in AVI File header */ #define AVIF_HASINDEX 0x00000010 /* Index at end of file */ #define AVIF_MUSTUSEINDEX 0x00000020 #define AVIF_ISINTERLEAVED 0x00000100 #define AVIF_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames */ #define AVIF_WASCAPTUREFILE 0x00010000 #define AVIF_COPYRIGHTED 0x00020000 OUT4CC ("avih"); OUTLONG(56); /* # of bytes to follow */ OUTLONG(ms_per_frame); /* Microseconds per frame */ //ThOe ->0 // OUTLONG(10000000); /* MaxBytesPerSec, I hope this will never be used */ OUTLONG(0); OUTLONG(0); /* PaddingGranularity (whatever that might be) */ /* Other sources call it 'reserved' */ flag = AVIF_ISINTERLEAVED; if(hasIndex) flag |= AVIF_HASINDEX; if(hasIndex && AVI->must_use_index) flag |= AVIF_MUSTUSEINDEX; OUTLONG(flag); /* Flags */ OUTLONG(0); // no frames yet OUTLONG(0); /* InitialFrames */ OUTLONG(AVI->anum+1); OUTLONG(0); /* SuggestedBufferSize */ OUTLONG(AVI->width); /* Width */ OUTLONG(AVI->height); /* Height */ /* MS calls the following 'reserved': */ OUTLONG(0); /* TimeScale: Unit used to measure time */ OUTLONG(0); /* DataRate: Data rate of playback */ OUTLONG(0); /* StartTime: Starting time of AVI data */ OUTLONG(0); /* DataLength: Size of AVI data chunk */ /* Start the video stream list ---------------------------------- */ OUT4CC ("LIST"); OUTLONG(0); /* Length of list in bytes, don't know yet */ strl_start = nhb; /* Store start position */ OUT4CC ("strl"); /* The video stream header */ OUT4CC ("strh"); OUTLONG(56); /* # of bytes to follow */ OUT4CC ("vids"); /* Type */ OUT4CC (AVI->compressor); /* Handler */ OUTLONG(0); /* Flags */ OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ OUTLONG(0); /* InitialFrames */ OUTLONG(FRAME_RATE_SCALE); /* Scale */ OUTLONG(frate); /* Rate: Rate/Scale == samples/second */ OUTLONG(0); /* Start */ OUTLONG(0); // no frames yet OUTLONG(0); /* SuggestedBufferSize */ OUTLONG(-1); /* Quality */ OUTLONG(0); /* SampleSize */ OUTLONG(0); /* Frame */ OUTLONG(0); /* Frame */ // OUTLONG(0); /* Frame */ //OUTLONG(0); /* Frame */ /* The video stream format */ OUT4CC ("strf"); OUTLONG(40); /* # of bytes to follow */ OUTLONG(40); /* Size */ OUTLONG(AVI->width); /* Width */ OUTLONG(AVI->height); /* Height */ OUTSHRT(1); OUTSHRT(24); /* Planes, Count */ OUT4CC (AVI->compressor); /* Compression */ // ThOe (*3) OUTLONG(AVI->width*AVI->height*3); /* SizeImage (in bytes?) */ OUTLONG(0); /* XPelsPerMeter */ OUTLONG(0); /* YPelsPerMeter */ OUTLONG(0); /* ClrUsed: Number of colors used */ OUTLONG(0); /* ClrImportant: Number of colors important */ /* Finish stream list, i.e. put number of bytes in the list to proper pos */ long2str(AVI_header+strl_start-4,nhb-strl_start); /* Start the audio stream list ---------------------------------- */ for(j=0; janum; ++j) { sampsize = avi_sampsize(AVI, j); OUT4CC ("LIST"); OUTLONG(0); /* Length of list in bytes, don't know yet */ strl_start = nhb; /* Store start position */ OUT4CC ("strl"); /* The audio stream header */ OUT4CC ("strh"); OUTLONG(56); /* # of bytes to follow */ OUT4CC ("auds"); // ----------- // ThOe OUTLONG(0); /* Format (Optionally) */ // ----------- OUTLONG(0); /* Flags */ OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ OUTLONG(0); /* InitialFrames */ // ThOe /4 OUTLONG(sampsize/4); /* Scale */ OUTLONG(1000*AVI->track[j].mp3rate/8); OUTLONG(0); /* Start */ OUTLONG(4*AVI->track[j].audio_bytes/sampsize); /* Length */ OUTLONG(0); /* SuggestedBufferSize */ OUTLONG(-1); /* Quality */ // ThOe /4 OUTLONG(sampsize/4); /* SampleSize */ OUTLONG(0); /* Frame */ OUTLONG(0); /* Frame */ // OUTLONG(0); /* Frame */ //OUTLONG(0); /* Frame */ /* The audio stream format */ OUT4CC ("strf"); OUTLONG(16); /* # of bytes to follow */ OUTSHRT(AVI->track[j].a_fmt); /* Format */ OUTSHRT(AVI->track[j].a_chans); /* Number of channels */ OUTLONG(AVI->track[j].a_rate); /* SamplesPerSec */ // ThOe OUTLONG(1000*AVI->track[j].mp3rate/8); //ThOe (/4) OUTSHRT(sampsize/4); /* BlockAlign */ OUTSHRT(AVI->track[j].a_bits); /* BitsPerSample */ /* Finish stream list, i.e. put number of bytes in the list to proper pos */ long2str(AVI_header+strl_start-4,nhb-strl_start); } /* Finish header list */ long2str(AVI_header+hdrl_start-4,nhb-hdrl_start); /* Calculate the needed amount of junk bytes, output junk */ njunk = HEADERBYTES - nhb - 8 - 12; /* Safety first: if njunk <= 0, somebody has played with HEADERBYTES without knowing what (s)he did. This is a fatal error */ if(njunk<=0) { fprintf(stderr,"AVI_close_output_file: # of header bytes too small\n"); exit(1); } OUT4CC ("JUNK"); OUTLONG(njunk); memset(AVI_header+nhb,0,njunk); //2001-11-14 added id string if(njunk > strlen(id_str)+8) { //sprintf(id_str, "%s-%s", PACKAGE, VERSION); //memcpy(AVI_header+nhb, id_str, strlen(id_str)); } nhb += njunk; /* Start the movi list */ OUT4CC ("LIST"); OUTLONG(movi_len); /* Length of list in bytes */ OUT4CC ("movi"); /* Output the header, truncate the file to the number of bytes actually written, report an error if someting goes wrong */ if ( lseek(AVI->fdes,0,SEEK_SET)<0 || avi_write(AVI->fdes,(char *)AVI_header,HEADERBYTES)!=HEADERBYTES || lseek(AVI->fdes,AVI->pos,SEEK_SET)<0) { AVI_errno = AVI_ERR_CLOSE; return -1; } return 0; } /* Write the header of an AVI file and close it. returns 0 on success, -1 on write error. */ static int avi_close_output_file(avi_t *AVI) { int ret, njunk, sampsize, hasIndex, ms_per_frame, frate, idxerror, flag; unsigned long movi_len; int hdrl_start, strl_start, j; unsigned char AVI_header[HEADERBYTES]; long nhb; #ifdef INFO_LIST long info_len; // time_t calptr; #endif /* Calculate length of movi list */ movi_len = AVI->pos - HEADERBYTES + 4; /* Try to ouput the index entries. This may fail e.g. if no space is left on device. We will report this as an error, but we still try to write the header correctly (so that the file still may be readable in the most cases */ idxerror = 0; // fprintf(stderr, "pos=%lu, index_len=%ld\n", AVI->pos, AVI->n_idx*16); ret = avi_add_chunk(AVI, (unsigned char *)"idx1", (unsigned char *)AVI->idx, AVI->n_idx*16); hasIndex = (ret==0); //fprintf(stderr, "pos=%lu, index_len=%d\n", AVI->pos, hasIndex); if(ret) { idxerror = 1; AVI_errno = AVI_ERR_WRITE_INDEX; } /* Calculate Microseconds per frame */ if(AVI->fps < 0.001) { frate=0; ms_per_frame=0; } else { frate = (int) (FRAME_RATE_SCALE*AVI->fps + 0.5); ms_per_frame=(int) (1000000/AVI->fps + 0.5); } /* Prepare the file header */ nhb = 0; /* The RIFF header */ OUT4CC ("RIFF"); OUTLONG(AVI->pos - 8); /* # of bytes to follow */ OUT4CC ("AVI "); /* Start the header list */ OUT4CC ("LIST"); OUTLONG(0); /* Length of list in bytes, don't know yet */ hdrl_start = nhb; /* Store start position */ OUT4CC ("hdrl"); /* The main AVI header */ /* The Flags in AVI File header */ #define AVIF_HASINDEX 0x00000010 /* Index at end of file */ #define AVIF_MUSTUSEINDEX 0x00000020 #define AVIF_ISINTERLEAVED 0x00000100 #define AVIF_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames */ #define AVIF_WASCAPTUREFILE 0x00010000 #define AVIF_COPYRIGHTED 0x00020000 OUT4CC ("avih"); OUTLONG(56); /* # of bytes to follow */ OUTLONG(ms_per_frame); /* Microseconds per frame */ //ThOe ->0 // OUTLONG(10000000); /* MaxBytesPerSec, I hope this will never be used */ OUTLONG(0); OUTLONG(0); /* PaddingGranularity (whatever that might be) */ /* Other sources call it 'reserved' */ flag = AVIF_ISINTERLEAVED; if(hasIndex) flag |= AVIF_HASINDEX; if(hasIndex && AVI->must_use_index) flag |= AVIF_MUSTUSEINDEX; OUTLONG(flag); /* Flags */ OUTLONG(AVI->video_frames); /* TotalFrames */ OUTLONG(0); /* InitialFrames */ OUTLONG(AVI->anum+1); // if (AVI->track[0].audio_bytes) // { OUTLONG(2); } /* Streams */ // else // { OUTLONG(1); } /* Streams */ OUTLONG(0); /* SuggestedBufferSize */ OUTLONG(AVI->width); /* Width */ OUTLONG(AVI->height); /* Height */ /* MS calls the following 'reserved': */ OUTLONG(0); /* TimeScale: Unit used to measure time */ OUTLONG(0); /* DataRate: Data rate of playback */ OUTLONG(0); /* StartTime: Starting time of AVI data */ OUTLONG(0); /* DataLength: Size of AVI data chunk */ /* Start the video stream list ---------------------------------- */ OUT4CC ("LIST"); OUTLONG(0); /* Length of list in bytes, don't know yet */ strl_start = nhb; /* Store start position */ OUT4CC ("strl"); /* The video stream header */ OUT4CC ("strh"); OUTLONG(56); /* # of bytes to follow */ OUT4CC ("vids"); /* Type */ OUT4CC (AVI->compressor); /* Handler */ OUTLONG(0); /* Flags */ OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ OUTLONG(0); /* InitialFrames */ OUTLONG(FRAME_RATE_SCALE); /* Scale */ OUTLONG(frate); /* Rate: Rate/Scale == samples/second */ OUTLONG(0); /* Start */ OUTLONG(AVI->video_frames); /* Length */ OUTLONG(0); /* SuggestedBufferSize */ OUTLONG(-1); /* Quality */ OUTLONG(0); /* SampleSize */ OUTLONG(0); /* Frame */ OUTLONG(0); /* Frame */ // OUTLONG(0); /* Frame */ //OUTLONG(0); /* Frame */ /* The video stream format */ OUT4CC ("strf"); OUTLONG(40); /* # of bytes to follow */ OUTLONG(40); /* Size */ OUTLONG(AVI->width); /* Width */ OUTLONG(AVI->height); /* Height */ OUTSHRT(1); OUTSHRT(24); /* Planes, Count */ OUT4CC (AVI->compressor); /* Compression */ // ThOe (*3) OUTLONG(AVI->width*AVI->height*3); /* SizeImage (in bytes?) */ OUTLONG(0); /* XPelsPerMeter */ OUTLONG(0); /* YPelsPerMeter */ OUTLONG(0); /* ClrUsed: Number of colors used */ OUTLONG(0); /* ClrImportant: Number of colors important */ /* Finish stream list, i.e. put number of bytes in the list to proper pos */ long2str(AVI_header+strl_start-4,nhb-strl_start); /* Start the audio stream list ---------------------------------- */ for(j=0; janum; ++j) { //if (AVI->track[j].a_chans && AVI->track[j].audio_bytes) { sampsize = avi_sampsize(AVI, j); OUT4CC ("LIST"); OUTLONG(0); /* Length of list in bytes, don't know yet */ strl_start = nhb; /* Store start position */ OUT4CC ("strl"); /* The audio stream header */ OUT4CC ("strh"); OUTLONG(56); /* # of bytes to follow */ OUT4CC ("auds"); // ----------- // ThOe OUTLONG(0); /* Format (Optionally) */ // ----------- OUTLONG(0); /* Flags */ OUTLONG(0); /* Reserved, MS says: wPriority, wLanguage */ OUTLONG(0); /* InitialFrames */ // ThOe /4 OUTLONG(sampsize/4); /* Scale */ OUTLONG(1000*AVI->track[j].mp3rate/8); OUTLONG(0); /* Start */ OUTLONG(4*AVI->track[j].audio_bytes/sampsize); /* Length */ OUTLONG(0); /* SuggestedBufferSize */ OUTLONG(-1); /* Quality */ // ThOe /4 OUTLONG(sampsize/4); /* SampleSize */ OUTLONG(0); /* Frame */ OUTLONG(0); /* Frame */ // OUTLONG(0); /* Frame */ //OUTLONG(0); /* Frame */ /* The audio stream format */ OUT4CC ("strf"); OUTLONG(16); /* # of bytes to follow */ OUTSHRT(AVI->track[j].a_fmt); /* Format */ OUTSHRT(AVI->track[j].a_chans); /* Number of channels */ OUTLONG(AVI->track[j].a_rate); /* SamplesPerSec */ // ThOe OUTLONG(1000*AVI->track[j].mp3rate/8); //ThOe (/4) OUTSHRT(sampsize/4); /* BlockAlign */ OUTSHRT(AVI->track[j].a_bits); /* BitsPerSample */ /* Finish stream list, i.e. put number of bytes in the list to proper pos */ } long2str(AVI_header+strl_start-4,nhb-strl_start); } /* Finish header list */ long2str(AVI_header+hdrl_start-4,nhb-hdrl_start); // add INFO list --- (0.6.0pre4) #ifdef INFO_LIST OUT4CC ("LIST"); //FIXME info_len = MAX_INFO_STRLEN + 12; OUTLONG(info_len); OUT4CC ("INFO"); // OUT4CC ("INAM"); // OUTLONG(MAX_INFO_STRLEN); // sprintf(id_str, "\t"); // memset(AVI_header+nhb, 0, MAX_INFO_STRLEN); // memcpy(AVI_header+nhb, id_str, strlen(id_str)); // nhb += MAX_INFO_STRLEN; OUT4CC ("ISFT"); OUTLONG(MAX_INFO_STRLEN); //sprintf(id_str, "%s-%s", PACKAGE, VERSION); memset(AVI_header+nhb, 0, MAX_INFO_STRLEN); //memcpy(AVI_header+nhb, id_str, strlen(id_str)); nhb += MAX_INFO_STRLEN; // OUT4CC ("ICMT"); // OUTLONG(MAX_INFO_STRLEN); // calptr=time(NULL); // sprintf(id_str, "\t%s %s", ctime(&calptr), ""); // memset(AVI_header+nhb, 0, MAX_INFO_STRLEN); // memcpy(AVI_header+nhb, id_str, 25); // nhb += MAX_INFO_STRLEN; #endif // ---------------------------- /* Calculate the needed amount of junk bytes, output junk */ njunk = HEADERBYTES - nhb - 8 - 12; /* Safety first: if njunk <= 0, somebody has played with HEADERBYTES without knowing what (s)he did. This is a fatal error */ if(njunk<=0) { fprintf(stderr,"AVI_close_output_file: # of header bytes too small\n"); exit(1); } OUT4CC ("JUNK"); OUTLONG(njunk); memset(AVI_header+nhb,0,njunk); nhb += njunk; /* Start the movi list */ OUT4CC ("LIST"); OUTLONG(movi_len); /* Length of list in bytes */ OUT4CC ("movi"); /* Output the header, truncate the file to the number of bytes actually written, report an error if someting goes wrong */ if ( lseek(AVI->fdes,0,SEEK_SET)<0 || avi_write(AVI->fdes,(char *)AVI_header,HEADERBYTES)!=HEADERBYTES || ftruncate(AVI->fdes,AVI->pos)<0 ) { AVI_errno = AVI_ERR_CLOSE; return -1; } if(idxerror) return -1; return 0; } /* AVI_write_data: Add video or audio data to the file; Return values: 0 No error; -1 Error, AVI_errno is set appropriatly; */ static int avi_write_data(avi_t *AVI, char *data, unsigned long length, int audio, int keyframe) { int n; unsigned char astr[5]; /* Check for maximum file length */ if ( (AVI->pos + 8 + length + 8 + (AVI->n_idx+1)*16) > AVI_MAX_LEN ) { AVI_errno = AVI_ERR_SIZELIM; return -1; } /* Add index entry */ //set tag for current audio track sprintf((char *)astr, "0%1dwb", (int)(AVI->aptr+1)); if(audio) n = avi_add_index_entry(AVI,astr,0x00,AVI->pos,length); else n = avi_add_index_entry(AVI,(unsigned char *)"00db",((keyframe)?0x10:0x0),AVI->pos,length); if(n) return -1; /* Output tag and data */ if(audio) n = avi_add_chunk(AVI,astr,(unsigned char *)data,length); else n = avi_add_chunk(AVI,(unsigned char *)"00db",(unsigned char *)data,length); if (n) return -1; return 0; } int AVI_write_frame(avi_t *AVI, char *data, long bytes, int keyframe) { unsigned long pos; if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } pos = AVI->pos; if(avi_write_data(AVI,data,bytes,0,keyframe)) return -1; AVI->last_pos = pos; AVI->last_len = bytes; AVI->video_frames++; return 0; } int AVI_dup_frame(avi_t *AVI) { if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(AVI->last_pos==0) return 0; /* No previous real frame */ if(avi_add_index_entry(AVI,(unsigned char *)"00db",0x10,AVI->last_pos,AVI->last_len)) return -1; AVI->video_frames++; AVI->must_use_index = 1; return 0; } int AVI_write_audio(avi_t *AVI, char *data, long bytes) { if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if( avi_write_data(AVI,data,bytes,1,0) ) return -1; AVI->track[AVI->aptr].audio_bytes += bytes; return 0; } int AVI_append_audio(avi_t *AVI, char *data, long bytes) { long i, length, pos; unsigned char c[4]; if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } // update last index entry: --AVI->n_idx; length = str2ulong(AVI->idx[AVI->n_idx]+12); pos = str2ulong(AVI->idx[AVI->n_idx]+8); //update; long2str(AVI->idx[AVI->n_idx]+12,length+bytes); ++AVI->n_idx; AVI->track[AVI->aptr].audio_bytes += bytes; //update chunk header lseek(AVI->fdes, pos+4, SEEK_SET); long2str(c, length+bytes); avi_write(AVI->fdes, (char *)c, 4); lseek(AVI->fdes, pos+8+length, SEEK_SET); i=PAD_EVEN(length + bytes); bytes = i - length; avi_write(AVI->fdes, data, bytes); AVI->pos = pos + 8 + i; return 0; } long AVI_bytes_remain(avi_t *AVI) { if(AVI->mode==AVI_MODE_READ) return 0; return ( AVI_MAX_LEN - (AVI->pos + 8 + 16*AVI->n_idx)); } long AVI_bytes_written(avi_t *AVI) { if(AVI->mode==AVI_MODE_READ) return 0; return (AVI->pos + 8 + 16*AVI->n_idx); } int AVI_set_audio_track(avi_t *AVI, int track) { if(track < 0 || track + 1 > AVI->anum) return(-1); //this info is not written to file anyway AVI->aptr=track; return 0; } int AVI_get_audio_track(avi_t *AVI) { return(AVI->aptr); } /******************************************************************* * * * Utilities for reading video and audio from an AVI File * * * *******************************************************************/ int AVI_close(avi_t *AVI) { int ret, i; /* If the file was open for writing, the header and index still have to be written */ if(AVI->mode == AVI_MODE_WRITE) ret = avi_close_output_file(AVI); else ret = 0; /* Even if there happened an error, we first clean up */ close(AVI->fdes); if(AVI->idx) free(AVI->idx); if(AVI->video_index) free(AVI->video_index); //FIXME //if(AVI->audio_index) free(AVI->audio_index); if (AVI->bitmap_info_header) free(AVI->bitmap_info_header); for (i = 0; i < AVI->anum; i++) { if (AVI->wave_format_ex[i]) free(AVI->wave_format_ex[i]); if (AVI->track[i].audio_chunks) free(AVI->track[i].audio_index); } free(AVI); return ret; } #define ERR_EXIT(x) \ { \ AVI_close(AVI); \ AVI_errno = x; \ return 0; \ } avi_t *AVI_open_input_file(const char *filename, int getIndex) { avi_t *AVI=NULL; /* Create avi_t structure */ AVI = (avi_t *) malloc(sizeof(avi_t)); if(AVI==NULL) { AVI_errno = AVI_ERR_NO_MEM; return 0; } memset((void *)AVI,0,sizeof(avi_t)); AVI->mode = AVI_MODE_READ; /* open for reading */ /* Open the file */ #ifdef WIN32 AVI->fdes = open(filename,O_RDONLY|O_BINARY); #else AVI->fdes = open(filename,O_RDONLY); #endif if(AVI->fdes < 0) { AVI_errno = AVI_ERR_OPEN; free(AVI); return 0; } avi_parse_input_file(AVI, getIndex); AVI->aptr=0; //reset return AVI; } avi_t *AVI_open_fd(int fd, int getIndex) { avi_t *AVI=NULL; /* Create avi_t structure */ AVI = (avi_t *) malloc(sizeof(avi_t)); if(AVI==NULL) { AVI_errno = AVI_ERR_NO_MEM; return 0; } memset((void *)AVI,0,sizeof(avi_t)); AVI->mode = AVI_MODE_READ; /* open for reading */ // file alread open AVI->fdes = fd; avi_parse_input_file(AVI, getIndex); AVI->aptr=0; //reset return AVI; } int avi_parse_input_file(avi_t *AVI, int getIndex) { long i, rate, scale, idx_type; off_t n; unsigned char *hdrl_data; long header_offset=0, hdrl_len=0; long nvi, nai[AVI_MAX_TRACKS], ioff; long tot[AVI_MAX_TRACKS]; int j; int lasttag = 0; int vids_strh_seen = 0; int vids_strf_seen = 0; int auds_strh_seen = 0; // int auds_strf_seen = 0; int num_stream = 0; char data[256]; /* Read first 12 bytes and check that this is an AVI file */ if( avi_read(AVI->fdes,data,12) != 12 ) ERR_EXIT(AVI_ERR_READ) if( strncasecmp(data ,"RIFF",4) !=0 || strncasecmp(data+8,"AVI ",4) !=0 ) ERR_EXIT(AVI_ERR_NO_AVI) /* Go through the AVI file and extract the header list, the start position of the 'movi' list and an optionally present idx1 tag */ hdrl_data = 0; while(1) { if( avi_read(AVI->fdes,data,8) != 8 ) break; /* We assume it's EOF */ n = str2ulong((unsigned char *)data+4); n = PAD_EVEN(n); if(strncasecmp(data,"LIST",4) == 0) { if( avi_read(AVI->fdes,data,4) != 4 ) ERR_EXIT(AVI_ERR_READ) n -= 4; if(strncasecmp(data,"hdrl",4) == 0) { hdrl_len = n; hdrl_data = (unsigned char *) malloc(n); if(hdrl_data==0) ERR_EXIT(AVI_ERR_NO_MEM); // offset of header header_offset = lseek(AVI->fdes,0,SEEK_CUR); if( avi_read(AVI->fdes,(char *)hdrl_data,n) != n ) ERR_EXIT(AVI_ERR_READ) } else if(strncasecmp(data,"movi",4) == 0) { AVI->movi_start = lseek(AVI->fdes,0,SEEK_CUR); lseek(AVI->fdes,n,SEEK_CUR); } else lseek(AVI->fdes,n,SEEK_CUR); } else if(strncasecmp(data,"idx1",4) == 0) { /* n must be a multiple of 16, but the reading does not break if this is not the case */ AVI->n_idx = AVI->max_idx = n/16; AVI->idx = (unsigned char((*)[16]) ) malloc(n); if(AVI->idx==0) ERR_EXIT(AVI_ERR_NO_MEM) if(avi_read(AVI->fdes, (char *) AVI->idx, n) != n ) ERR_EXIT(AVI_ERR_READ) } else lseek(AVI->fdes,n,SEEK_CUR); } if(!hdrl_data ) ERR_EXIT(AVI_ERR_NO_HDRL) if(!AVI->movi_start) ERR_EXIT(AVI_ERR_NO_MOVI) /* Interpret the header list */ for(i=0;icompressor,hdrl_data+i+4,4); AVI->compressor[4] = 0; // ThOe AVI->v_codech_off = header_offset + i+4; scale = str2ulong(hdrl_data+i+20); rate = str2ulong(hdrl_data+i+24); if(scale!=0) AVI->fps = (double)rate/(double)scale; AVI->video_frames = str2ulong(hdrl_data+i+32); AVI->video_strn = num_stream; AVI->max_len = 0; vids_strh_seen = 1; lasttag = 1; /* vids */ } else if (strncasecmp ((char *)hdrl_data+i,"auds",4) ==0 && ! auds_strh_seen) { //inc audio tracks AVI->aptr=AVI->anum; ++AVI->anum; if(AVI->anum > AVI_MAX_TRACKS) { fprintf(stderr, "error - only %d audio tracks supported\n", AVI_MAX_TRACKS); return(-1); } AVI->track[AVI->aptr].audio_bytes = str2ulong(hdrl_data+i+32)*avi_sampsize(AVI, 0); AVI->track[AVI->aptr].audio_strn = num_stream; // auds_strh_seen = 1; lasttag = 2; /* auds */ // ThOe AVI->track[AVI->aptr].a_codech_off = header_offset + i; } else lasttag = 0; num_stream++; } else if(strncasecmp((char *)hdrl_data+i,"strf",4)==0) { i += 8; if(lasttag == 1) { BITMAPINFOHEADER_avilib bih; memcpy(&bih, hdrl_data + i, sizeof(BITMAPINFOHEADER_avilib)); AVI->bitmap_info_header = (BITMAPINFOHEADER_avilib *)malloc(bih.bi_size); if (AVI->bitmap_info_header != NULL) memcpy(AVI->bitmap_info_header, hdrl_data + i, bih.bi_size); AVI->width = str2ulong(hdrl_data+i+4); AVI->height = str2ulong(hdrl_data+i+8); vids_strf_seen = 1; //ThOe AVI->v_codecf_off = header_offset + i+16; memcpy(AVI->compressor2, hdrl_data+i+16, 4); AVI->compressor2[4] = 0; } else if(lasttag == 2) { WAVEFORMATEX_avilib *wfe; char *nwfe; int wfes; if ((hdrl_len - i) < sizeof(WAVEFORMATEX_avilib)) wfes = hdrl_len - i; else wfes = sizeof(WAVEFORMATEX_avilib); wfe = (WAVEFORMATEX_avilib *)malloc(sizeof(WAVEFORMATEX_avilib)); if (wfe != NULL) { memset(wfe, 0, sizeof(WAVEFORMATEX_avilib)); memcpy(wfe, hdrl_data + i, wfes); if (wfe->cb_size != 0) { nwfe = (char *)realloc(wfe, sizeof(WAVEFORMATEX_avilib) + wfe->cb_size); if (nwfe != 0) { off_t lpos = lseek(AVI->fdes, 0, SEEK_CUR); lseek(AVI->fdes, header_offset + i + sizeof(WAVEFORMATEX_avilib), SEEK_SET); wfe = (WAVEFORMATEX_avilib *)nwfe; nwfe = &nwfe[sizeof(WAVEFORMATEX_avilib)]; avi_read(AVI->fdes, nwfe, wfe->cb_size); lseek(AVI->fdes, lpos, SEEK_SET); } } AVI->wave_format_ex[AVI->aptr] = wfe; } AVI->track[AVI->aptr].a_fmt = str2ushort(hdrl_data+i ); //ThOe AVI->track[AVI->aptr].a_codecf_off = header_offset + i; AVI->track[AVI->aptr].a_chans = str2ushort(hdrl_data+i+2); AVI->track[AVI->aptr].a_rate = str2ulong (hdrl_data+i+4); //ThOe: read mp3bitrate AVI->track[AVI->aptr].mp3rate = 8*str2ulong(hdrl_data+i+8)/1000; //:ThOe AVI->track[AVI->aptr].a_bits = str2ushort(hdrl_data+i+14); // auds_strf_seen = 1; } lasttag = 0; } else { i += 8; lasttag = 0; } i += n; } free(hdrl_data); if(!vids_strh_seen || !vids_strf_seen) ERR_EXIT(AVI_ERR_NO_VIDS) AVI->video_tag[0] = AVI->video_strn/10 + '0'; AVI->video_tag[1] = AVI->video_strn%10 + '0'; AVI->video_tag[2] = 'd'; AVI->video_tag[3] = 'b'; /* Audio tag is set to "99wb" if no audio present */ if(!AVI->track[0].a_chans) AVI->track[0].audio_strn = 99; for(j=0; janum; ++j) { AVI->track[j].audio_tag[0] = (j+1)/10 + '0'; AVI->track[j].audio_tag[1] = (j+1)%10 + '0'; AVI->track[j].audio_tag[2] = 'w'; AVI->track[j].audio_tag[3] = 'b'; } lseek(AVI->fdes,AVI->movi_start,SEEK_SET); /* get index if wanted */ if(!getIndex) return(0); /* if the file has an idx1, check if this is relative to the start of the file or to the start of the movi list */ idx_type = 0; if(AVI->idx) { off_t pos, len; /* Search the first videoframe in the idx1 and look where it is in the file */ for(i=0;in_idx;i++) if( strncasecmp((char *)AVI->idx[i],(char *)AVI->video_tag,3)==0 ) break; if(i>=AVI->n_idx) ERR_EXIT(AVI_ERR_NO_VIDS) pos = str2ulong(AVI->idx[i]+ 8); len = str2ulong(AVI->idx[i]+12); lseek(AVI->fdes,pos,SEEK_SET); if(avi_read(AVI->fdes,data,8)!=8) ERR_EXIT(AVI_ERR_READ) if( strncasecmp(data,(char *)AVI->idx[i],4)==0 && str2ulong((unsigned char *)data+4)==len ) { idx_type = 1; /* Index from start of file */ } else { lseek(AVI->fdes,pos+AVI->movi_start-4,SEEK_SET); if(avi_read(AVI->fdes,data,8)!=8) ERR_EXIT(AVI_ERR_READ) if( strncasecmp(data,(char *)AVI->idx[i],4)==0 && str2ulong((unsigned char *)data+4)==len ) { idx_type = 2; /* Index from start of movi list */ } } /* idx_type remains 0 if neither of the two tests above succeeds */ } if(idx_type == 0) { /* we must search through the file to get the index */ lseek(AVI->fdes, AVI->movi_start, SEEK_SET); AVI->n_idx = 0; while(1) { if( avi_read(AVI->fdes,data,8) != 8 ) break; n = str2ulong((unsigned char *)data+4); /* The movi list may contain sub-lists, ignore them */ if(strncasecmp(data,"LIST",4)==0) { lseek(AVI->fdes,4,SEEK_CUR); continue; } /* Check if we got a tag ##db, ##dc or ##wb */ if( ( (data[2]=='d' || data[2]=='D') && (data[3]=='b' || data[3]=='B' || data[3]=='c' || data[3]=='C') ) || ( (data[2]=='w' || data[2]=='W') && (data[3]=='b' || data[3]=='B') ) ) { avi_add_index_entry(AVI,(unsigned char *)data,0,lseek(AVI->fdes,0,SEEK_CUR)-8,n); } lseek(AVI->fdes,PAD_EVEN(n),SEEK_CUR); } idx_type = 1; } /* Now generate the video index and audio index arrays */ nvi = 0; for(j=0; janum; ++j) nai[j] = 0; for(i=0;in_idx;i++) { if(strncasecmp((char *)AVI->idx[i],AVI->video_tag,3) == 0) nvi++; for(j=0; janum; ++j) if(strncasecmp((char *)AVI->idx[i], AVI->track[j].audio_tag,4) == 0) nai[j]++; } AVI->video_frames = nvi; for(j=0; janum; ++j) AVI->track[j].audio_chunks = nai[j]; // fprintf(stderr, "chunks = %ld %d %s\n", AVI->track[0].audio_chunks, AVI->anum, AVI->track[0].audio_tag); if(AVI->video_frames==0) ERR_EXIT(AVI_ERR_NO_VIDS); AVI->video_index = (video_index_entry *) malloc(nvi*sizeof(video_index_entry)); if(AVI->video_index==0) ERR_EXIT(AVI_ERR_NO_MEM); for(j=0; janum; ++j) { if(AVI->track[j].audio_chunks) { AVI->track[j].audio_index = (audio_index_entry *) malloc((nai[j]+1)*sizeof(audio_index_entry)); memset(AVI->track[j].audio_index, 0, (nai[j]+1)*(sizeof(audio_index_entry))); if(AVI->track[j].audio_index==0) ERR_EXIT(AVI_ERR_NO_MEM); } } nvi = 0; for(j=0; janum; ++j) nai[j] = tot[j] = 0; ioff = idx_type == 1 ? 8 : AVI->movi_start+4; for(i=0;in_idx;i++) { //video if(strncasecmp((char *)AVI->idx[i],AVI->video_tag,3) == 0) { AVI->video_index[nvi].key = str2ulong(AVI->idx[i]+ 4); AVI->video_index[nvi].pos = str2ulong(AVI->idx[i]+ 8)+ioff; AVI->video_index[nvi].len = str2ulong(AVI->idx[i]+12); nvi++; } //audio for(j=0; janum; ++j) { if(strncasecmp((char *)AVI->idx[i],AVI->track[j].audio_tag,4) == 0) { AVI->track[j].audio_index[nai[j]].pos = str2ulong(AVI->idx[i]+ 8)+ioff; AVI->track[j].audio_index[nai[j]].len = str2ulong(AVI->idx[i]+12); AVI->track[j].audio_index[nai[j]].tot = tot[j]; tot[j] += AVI->track[j].audio_index[nai[j]].len; nai[j]++; } } } for(j=0; janum; ++j) AVI->track[j].audio_bytes = tot[j]; /* Reposition the file */ lseek(AVI->fdes,AVI->movi_start,SEEK_SET); AVI->video_pos = 0; return(0); } long AVI_video_frames(avi_t *AVI) { return AVI->video_frames; } int AVI_video_width(avi_t *AVI) { return AVI->width; } int AVI_video_height(avi_t *AVI) { return AVI->height; } double AVI_frame_rate(avi_t *AVI) { return AVI->fps; } char* AVI_video_compressor(avi_t *AVI) { return AVI->compressor2; } long AVI_max_video_chunk(avi_t *AVI) { return AVI->max_len; } int AVI_audio_tracks(avi_t *AVI) { return(AVI->anum); } int AVI_audio_channels(avi_t *AVI) { return AVI->track[AVI->aptr].a_chans; } long AVI_audio_mp3rate(avi_t *AVI) { return AVI->track[AVI->aptr].mp3rate; } int AVI_audio_bits(avi_t *AVI) { return AVI->track[AVI->aptr].a_bits; } int AVI_audio_format(avi_t *AVI) { return AVI->track[AVI->aptr].a_fmt; } long AVI_audio_rate(avi_t *AVI) { return AVI->track[AVI->aptr].a_rate; } long AVI_audio_bytes(avi_t *AVI) { return AVI->track[AVI->aptr].audio_bytes; } long AVI_audio_chunks(avi_t *AVI) { return AVI->track[AVI->aptr].audio_chunks; } long AVI_audio_codech_offset(avi_t *AVI) { return AVI->track[AVI->aptr].a_codech_off; } long AVI_audio_codecf_offset(avi_t *AVI) { return AVI->track[AVI->aptr].a_codecf_off; } long AVI_video_codech_offset(avi_t *AVI) { return AVI->v_codech_off; } long AVI_video_codecf_offset(avi_t *AVI) { return AVI->v_codecf_off; } long AVI_frame_size(avi_t *AVI, long frame) { if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } if(frame < 0 || frame >= AVI->video_frames) return 0; return(AVI->video_index[frame].len); } long AVI_audio_size(avi_t *AVI, long frame) { if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->track[AVI->aptr].audio_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } if(frame < 0 || frame >= AVI->track[AVI->aptr].audio_chunks) return 0; return(AVI->track[AVI->aptr].audio_index[frame].len); } long AVI_get_video_position(avi_t *AVI, long frame) { if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } if(frame < 0 || frame >= AVI->video_frames) return 0; return(AVI->video_index[frame].pos); } int AVI_seek_start(avi_t *AVI) { if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } lseek(AVI->fdes,AVI->movi_start,SEEK_SET); AVI->video_pos = 0; return 0; } int AVI_set_video_position(avi_t *AVI, long frame) { if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } if (frame < 0 ) frame = 0; AVI->video_pos = frame; return 0; } int AVI_set_audio_bitrate(avi_t *AVI, long bitrate) { if(AVI->mode==AVI_MODE_READ) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } AVI->track[AVI->aptr].mp3rate = bitrate; return 0; } long AVI_read_frame(avi_t *AVI, char *vidbuf, int *keyframe) { long n; if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->video_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } if(AVI->video_pos < 0 || AVI->video_pos >= AVI->video_frames) return -1; n = AVI->video_index[AVI->video_pos].len; *keyframe = (AVI->video_index[AVI->video_pos].key==0x10) ? 1:0; lseek(AVI->fdes, AVI->video_index[AVI->video_pos].pos, SEEK_SET); if (avi_read(AVI->fdes,vidbuf,n) != n) { AVI_errno = AVI_ERR_READ; return -1; } AVI->video_pos++; return n; } int AVI_set_audio_position(avi_t *AVI, long byte) { long n0, n1, n; if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->track[AVI->aptr].audio_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } if(byte < 0) byte = 0; /* Binary search in the audio chunks */ n0 = 0; n1 = AVI->track[AVI->aptr].audio_chunks; while(n0track[AVI->aptr].audio_index[n].tot>byte) n1 = n; else n0 = n; } AVI->track[AVI->aptr].audio_posc = n0; AVI->track[AVI->aptr].audio_posb = byte - AVI->track[AVI->aptr].audio_index[n0].tot; return 0; } long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes) { long nr, pos, left, todo; if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->track[AVI->aptr].audio_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } nr = 0; /* total number of bytes read */ while(bytes>0) { left = AVI->track[AVI->aptr].audio_index[AVI->track[AVI->aptr].audio_posc].len - AVI->track[AVI->aptr].audio_posb; if(left==0) { if(AVI->track[AVI->aptr].audio_posc>=AVI->track[AVI->aptr].audio_chunks-1) return nr; AVI->track[AVI->aptr].audio_posc++; AVI->track[AVI->aptr].audio_posb = 0; continue; } if(bytestrack[AVI->aptr].audio_index[AVI->track[AVI->aptr].audio_posc].pos + AVI->track[AVI->aptr].audio_posb; lseek(AVI->fdes, pos, SEEK_SET); if (avi_read(AVI->fdes,audbuf+nr,todo) != todo) { AVI_errno = AVI_ERR_READ; return -1; } bytes -= todo; nr += todo; AVI->track[AVI->aptr].audio_posb += todo; } return nr; } long AVI_read_audio_chunk(avi_t *AVI, char *audbuf) { long pos, left; if(AVI->mode==AVI_MODE_WRITE) { AVI_errno = AVI_ERR_NOT_PERM; return -1; } if(!AVI->track[AVI->aptr].audio_index) { AVI_errno = AVI_ERR_NO_IDX; return -1; } if (AVI->track[AVI->aptr].audio_index[AVI->track[AVI->aptr].audio_posc].len == 0) return 0; left = AVI->track[AVI->aptr].audio_index[AVI->track[AVI->aptr].audio_posc].len - AVI->track[AVI->aptr].audio_posb; if (audbuf == NULL) return left; if(left==0) return 0; pos = AVI->track[AVI->aptr].audio_index[AVI->track[AVI->aptr].audio_posc].pos + AVI->track[AVI->aptr].audio_posb; lseek(AVI->fdes, pos, SEEK_SET); if (avi_read(AVI->fdes,audbuf,left) != left) { AVI_errno = AVI_ERR_READ; return -1; } AVI->track[AVI->aptr].audio_posc++; AVI->track[AVI->aptr].audio_posb = 0; return left; } /* AVI_read_data: Special routine for reading the next audio or video chunk without having an index of the file. */ int AVI_read_data(avi_t *AVI, char *vidbuf, long max_vidbuf, char *audbuf, long max_audbuf, long *len) { /* * Return codes: * * 1 = video data read * 2 = audio data read * 0 = reached EOF * -1 = video buffer too small * -2 = audio buffer too small */ off_t n; char data[8]; if(AVI->mode==AVI_MODE_WRITE) return 0; while(1) { /* Read tag and length */ if( avi_read(AVI->fdes,data,8) != 8 ) return 0; /* if we got a list tag, ignore it */ if(strncasecmp(data,"LIST",4) == 0) { lseek(AVI->fdes,4,SEEK_CUR); continue; } n = PAD_EVEN(str2ulong((unsigned char *)data+4)); if(strncasecmp(data,AVI->video_tag,3) == 0) { *len = n; AVI->video_pos++; if(n>max_vidbuf) { lseek(AVI->fdes,n,SEEK_CUR); return -1; } if(avi_read(AVI->fdes,vidbuf,n) != n ) return 0; return 1; } else if(strncasecmp(data,AVI->track[AVI->aptr].audio_tag,4) == 0) { *len = n; if(n>max_audbuf) { lseek(AVI->fdes,n,SEEK_CUR); return -2; } if(avi_read(AVI->fdes,audbuf,n) != n ) return 0; return 2; break; } else if(lseek(AVI->fdes,n,SEEK_CUR)<0) return 0; } } /* AVI_print_error: Print most recent error (similar to perror) */ char *(avi_errors[]) = { /* 0 */ "avilib - No Error", /* 1 */ "avilib - AVI file size limit reached", /* 2 */ "avilib - Error opening AVI file", /* 3 */ "avilib - Error reading from AVI file", /* 4 */ "avilib - Error writing to AVI file", /* 5 */ "avilib - Error writing index (file may still be useable)", /* 6 */ "avilib - Error closing AVI file", /* 7 */ "avilib - Operation (read/write) not permitted", /* 8 */ "avilib - Out of memory (malloc failed)", /* 9 */ "avilib - Not an AVI file", /* 10 */ "avilib - AVI file has no header list (corrupted?)", /* 11 */ "avilib - AVI file has no MOVI list (corrupted?)", /* 12 */ "avilib - AVI file has no video data", /* 13 */ "avilib - operation needs an index", /* 14 */ "avilib - Unkown Error" }; static int num_avi_errors = sizeof(avi_errors)/sizeof(char*); static char error_string[4096]; void AVI_print_error(char *str) { int aerrno; aerrno = (AVI_errno>=0 && AVI_errno=0 && AVI_errno * * This file is part of transcode, a linux video stream processing tool * * transcode is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * transcode is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with GNU Make; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include #include #include #include //SLM #ifdef __CYGWIN__ #include #elif defined WIN32 #if defined __GNUWIN32__ #include #else #define uint32_t unsigned __int32 #define uint8_t unsigned __int8 #define uint16_t unsigned __int16 #define uint64_t unsigned __int64 #endif #else #include #include #endif #include #include #include #include #ifndef AVILIB_H #define AVILIB_H #define AVI_MAX_TRACKS 8 typedef struct { off_t key; off_t pos; off_t len; } video_index_entry; typedef struct { off_t pos; off_t len; off_t tot; } audio_index_entry; typedef struct track_s { long a_fmt; /* Audio format, see #defines below */ long a_chans; /* Audio channels, 0 for no audio */ long a_rate; /* Rate in Hz */ long a_bits; /* bits per audio sample */ long mp3rate; /* mp3 bitrate kbs*/ long audio_strn; /* Audio stream number */ off_t audio_bytes; /* Total number of bytes of audio data */ long audio_chunks; /* Chunks of audio data in the file */ char audio_tag[4]; /* Tag of audio data */ long audio_posc; /* Audio position: chunk */ long audio_posb; /* Audio position: byte within chunk */ off_t a_codech_off; /* absolut offset of audio codec information */ off_t a_codecf_off; /* absolut offset of audio codec information */ audio_index_entry *audio_index; } track_t; typedef struct { uint32_t bi_size; uint32_t bi_width; uint32_t bi_height; uint16_t bi_planes; uint16_t bi_bit_count; uint32_t bi_compression; uint32_t bi_size_image; uint32_t bi_x_pels_per_meter; uint32_t bi_y_pels_per_meter; uint32_t bi_clr_used; uint32_t bi_clr_important; } BITMAPINFOHEADER_avilib; typedef struct { uint16_t w_format_tag; uint16_t n_channels; uint32_t n_samples_per_sec; uint32_t n_avg_bytes_per_sec; uint16_t n_block_align; uint16_t w_bits_per_sample; uint16_t cb_size; } WAVEFORMATEX_avilib; typedef struct { uint32_t fcc_type; uint32_t fcc_handler; uint32_t dw_flags; uint32_t dw_caps; uint16_t w_priority; uint16_t w_language; uint32_t dw_scale; uint32_t dw_rate; uint32_t dw_start; uint32_t dw_length; uint32_t dw_initial_frames; uint32_t dw_suggested_buffer_size; uint32_t dw_quality; uint32_t dw_sample_size; uint32_t dw_left; uint32_t dw_top; uint32_t dw_right; uint32_t dw_bottom; uint32_t dw_edit_count; uint32_t dw_format_change_count; char sz_name[64]; } AVISTREAMINFO; typedef struct { long fdes; /* File descriptor of AVI file */ long mode; /* 0 for reading, 1 for writing */ long width; /* Width of a video frame */ long height; /* Height of a video frame */ double fps; /* Frames per second */ char compressor[8]; /* Type of compressor, 4 bytes + padding for 0 byte */ char compressor2[8]; /* Type of compressor, 4 bytes + padding for 0 byte */ long video_strn; /* Video stream number */ long video_frames; /* Number of video frames */ char video_tag[4]; /* Tag of video data */ long video_pos; /* Number of next frame to be read (if index present) */ unsigned long max_len; /* maximum video chunk present */ track_t track[AVI_MAX_TRACKS]; // up to AVI_MAX_TRACKS audio tracks supported off_t pos; /* position in file */ long n_idx; /* number of index entries actually filled */ long max_idx; /* number of index entries actually allocated */ off_t v_codech_off; /* absolut offset of video codec (strh) info */ off_t v_codecf_off; /* absolut offset of video codec (strf) info */ unsigned char (*idx)[16]; /* index entries (AVI idx1 tag) */ video_index_entry *video_index; off_t last_pos; /* Position of last frame written */ unsigned long last_len; /* Length of last frame written */ int must_use_index; /* Flag if frames are duplicated */ off_t movi_start; int anum; // total number of audio tracks int aptr; // current audio working track BITMAPINFOHEADER_avilib *bitmap_info_header; WAVEFORMATEX_avilib *wave_format_ex[AVI_MAX_TRACKS]; } avi_t; #define AVI_MODE_WRITE 0 #define AVI_MODE_READ 1 /* The error codes delivered by avi_open_input_file */ #define AVI_ERR_SIZELIM 1 /* The write of the data would exceed the maximum size of the AVI file. This is more a warning than an error since the file may be closed safely */ #define AVI_ERR_OPEN 2 /* Error opening the AVI file - wrong path name or file nor readable/writable */ #define AVI_ERR_READ 3 /* Error reading from AVI File */ #define AVI_ERR_WRITE 4 /* Error writing to AVI File, disk full ??? */ #define AVI_ERR_WRITE_INDEX 5 /* Could not write index to AVI file during close, file may still be usable */ #define AVI_ERR_CLOSE 6 /* Could not write header to AVI file or not truncate the file during close, file is most probably corrupted */ #define AVI_ERR_NOT_PERM 7 /* Operation not permitted: trying to read from a file open for writing or vice versa */ #define AVI_ERR_NO_MEM 8 /* malloc failed */ #define AVI_ERR_NO_AVI 9 /* Not an AVI file */ #define AVI_ERR_NO_HDRL 10 /* AVI file has no has no header list, corrupted ??? */ #define AVI_ERR_NO_MOVI 11 /* AVI file has no has no MOVI list, corrupted ??? */ #define AVI_ERR_NO_VIDS 12 /* AVI file contains no video data */ #define AVI_ERR_NO_IDX 13 /* The file has been opened with getIndex==0, but an operation has been performed that needs an index */ /* Possible Audio formats */ #ifndef WAVE_FORMAT_PCM #define WAVE_FORMAT_UNKNOWN (0x0000) #define WAVE_FORMAT_PCM (0x0001) #define WAVE_FORMAT_ADPCM (0x0002) #define WAVE_FORMAT_IBM_CVSD (0x0005) #define WAVE_FORMAT_ALAW (0x0006) #define WAVE_FORMAT_MULAW (0x0007) #define WAVE_FORMAT_OKI_ADPCM (0x0010) #define WAVE_FORMAT_DVI_ADPCM (0x0011) #define WAVE_FORMAT_DIGISTD (0x0015) #define WAVE_FORMAT_DIGIFIX (0x0016) #define WAVE_FORMAT_YAMAHA_ADPCM (0x0020) #define WAVE_FORMAT_DSP_TRUESPEECH (0x0022) #define WAVE_FORMAT_GSM610 (0x0031) #define IBM_FORMAT_MULAW (0x0101) #define IBM_FORMAT_ALAW (0x0102) #define IBM_FORMAT_ADPCM (0x0103) #endif avi_t* AVI_open_output_file(char * filename); void AVI_set_video(avi_t *AVI, int width, int height, double fps, char *compressor); void AVI_set_audio(avi_t *AVI, int channels, long rate, int bits, int format, long mp3rate); int AVI_write_frame(avi_t *AVI, char *data, long bytes, int keyframe); int AVI_dup_frame(avi_t *AVI); int AVI_write_audio(avi_t *AVI, char *data, long bytes); int AVI_append_audio(avi_t *AVI, char *data, long bytes); long AVI_bytes_remain(avi_t *AVI); int AVI_close(avi_t *AVI); long AVI_bytes_written(avi_t *AVI); avi_t *AVI_open_input_file(const char *filename, int getIndex); avi_t *AVI_open_fd(int fd, int getIndex); int avi_parse_input_file(avi_t *AVI, int getIndex); long AVI_audio_mp3rate(avi_t *AVI); long AVI_video_frames(avi_t *AVI); int AVI_video_width(avi_t *AVI); int AVI_video_height(avi_t *AVI); double AVI_frame_rate(avi_t *AVI); char* AVI_video_compressor(avi_t *AVI); int AVI_audio_channels(avi_t *AVI); int AVI_audio_bits(avi_t *AVI); int AVI_audio_format(avi_t *AVI); long AVI_audio_rate(avi_t *AVI); long AVI_audio_bytes(avi_t *AVI); long AVI_audio_chunks(avi_t *AVI); long AVI_max_video_chunk(avi_t *AVI); long AVI_frame_size(avi_t *AVI, long frame); long AVI_audio_size(avi_t *AVI, long frame); int AVI_seek_start(avi_t *AVI); int AVI_set_video_position(avi_t *AVI, long frame); long AVI_get_video_position(avi_t *AVI, long frame); long AVI_read_frame(avi_t *AVI, char *vidbuf, int *keyframe); int AVI_set_audio_position(avi_t *AVI, long byte); int AVI_set_audio_bitrate(avi_t *AVI, long bitrate); long AVI_read_audio(avi_t *AVI, char *audbuf, long bytes); long AVI_read_audio_chunk(avi_t *AVI, char *audbuf); long AVI_audio_codech_offset(avi_t *AVI); long AVI_audio_codecf_offset(avi_t *AVI); long AVI_video_codech_offset(avi_t *AVI); long AVI_video_codecf_offset(avi_t *AVI); int AVI_read_data(avi_t *AVI, char *vidbuf, long max_vidbuf, char *audbuf, long max_audbuf, long *len); void AVI_print_error(char *str); char *AVI_strerror(void); char *AVI_syserror(void); int AVI_scan(char *name); int AVI_dump(char *name, int mode); char *AVI_codec2str(short cc); int AVI_file_check(char *import_file); void AVI_info(avi_t *avifile); uint64_t AVI_max_size(void); int avi_update_header(avi_t *AVI); int AVI_set_audio_track(avi_t *AVI, int track); int AVI_get_audio_track(avi_t *AVI); int AVI_audio_tracks(avi_t *AVI); struct riff_struct { unsigned char id[4]; /* RIFF */ uint32_t len; unsigned char wave_id[4]; /* WAVE */ }; struct chunk_struct { unsigned char id[4]; uint32_t len; }; struct common_struct { uint16_t wFormatTag; uint16_t wChannels; uint32_t dwSamplesPerSec; uint32_t dwAvgBytesPerSec; uint16_t wBlockAlign; uint16_t wBitsPerSample; /* Only for PCM */ }; struct wave_header { struct riff_struct riff; struct chunk_struct format; struct common_struct common; struct chunk_struct data; }; struct AVIStreamHeader { long fccType; long fccHandler; long dwFlags; long dwPriority; long dwInitialFrames; long dwScale; long dwRate; long dwStart; long dwLength; long dwSuggestedBufferSize; long dwQuality; long dwSampleSize; }; #endif luvcview-0.2.6/Makefile0000644000175000017500000000223211245427514014343 0ustar aurel32aurel32############################## # spcaview Makefile ############################## INSTALLROOT=$(PWD) CC=gcc CPP=g++ INSTALL=install APP_BINARY=luvcview BIN=/usr/local/bin MATH_LIB = -lm SDLLIBS = $(shell sdl-config --libs) SDLFLAGS = $(shell sdl-config --cflags) #LIBX11FLAGS= -I/usr/X11R6/include -L/usr/X11R6/lib VERSION = 0.2.6 #WARNINGS = -Wall \ # -Wundef -Wpointer-arith -Wbad-function-cast \ # -Wcast-align -Wwrite-strings -Wstrict-prototypes \ # -Wmissing-prototypes -Wmissing-declarations \ # -Wnested-externs -Winline -Wcast-qual -W \ # -Wno-unused # -Wunused CFLAGS += -DUSE_SDL -O2 -DLINUX -DVERSION=\"$(VERSION)\" -I$(SDLFLAGS) $(WARNINGS) CPPFLAGS = $(CFLAGS) OBJECTS= luvcview.o color.o utils.o v4l2uvc.o gui.o avilib.o all: luvcview clean: @echo "Cleaning up directory." rm -f *.a *.o $(APP_BINARY) core *~ log errlog *.avi # Applications: luvcview: $(OBJECTS) $(CC) $(CFLAGS) $(OBJECTS) $(X11_LIB) $(XPM_LIB)\ $(MATH_LIB) \ $(SDLLIBS)\ -o $(APP_BINARY) chmod 755 $(APP_BINARY) install: luvcview $(INSTALL) -s -m 755 -g root -o root $(APP_BINARY) $(BIN) rm -f $(BIN)/uvcview luvcview-0.2.6/utils.c0000644000175000017500000007024611245427514014221 0ustar aurel32aurel32/******************************************************************************* # luvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public 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 "utils.h" #include "color.h" #include #include #include #include #include #include #include #include #include #include "huffman.h" #define ISHIFT 11 #define IFIX(a) ((int)((a) * (1 << ISHIFT) + .5)) #ifndef __P # define __P(x) x #endif /* special markers */ #define M_BADHUFF -1 #define M_EOF 0x80 struct jpeg_decdata { int dcts[6 * 64 + 16]; int out[64 * 6]; int dquant[3][64]; }; struct in { unsigned char *p; unsigned int bits; int left; int marker; int (*func) __P((void *)); void *data; }; /*********************************/ struct dec_hufftbl; struct enc_hufftbl; union hufftblp { struct dec_hufftbl *dhuff; struct enc_hufftbl *ehuff; }; struct scan { int dc; /* old dc value */ union hufftblp hudc; union hufftblp huac; int next; /* when to switch to next scan */ int cid; /* component id */ int hv; /* horiz/vert, copied from comp */ int tq; /* quant tbl, copied from comp */ }; /*********************************/ #define DECBITS 10 /* seems to be the optimum */ struct dec_hufftbl { int maxcode[17]; int valptr[16]; unsigned char vals[256]; unsigned int llvals[1 << DECBITS]; }; static int huffman_init(void); static void decode_mcus __P((struct in *, int *, int, struct scan *, int *)); static int dec_readmarker __P((struct in *)); static void dec_makehuff __P((struct dec_hufftbl *, int *, unsigned char *)); static void setinput __P((struct in *, unsigned char *)); /*********************************/ #undef PREC #define PREC int static void idctqtab __P((unsigned char *, PREC *)); inline static void idct(int *in, int *out, int *quant, long off, int max); int is_huffman(unsigned char *buf); /*********************************/ static void yuv420pto422(int * out,unsigned char *pic,int width); static void yuv422pto422(int * out,unsigned char *pic,int width); static void yuv444pto422(int * out,unsigned char *pic,int width); static void yuv400pto422(int * out,unsigned char *pic,int width); typedef void (*ftopict) ( int *out, unsigned char *pic, int width) ; /*********************************/ #define M_SOI 0xd8 #define M_APP0 0xe0 #define M_DQT 0xdb #define M_SOF0 0xc0 #define M_DHT 0xc4 #define M_DRI 0xdd #define M_SOS 0xda #define M_RST0 0xd0 #define M_EOI 0xd9 #define M_COM 0xfe static unsigned char *datap; static int getbyte(void) { return *datap++; } static int getword(void) { int c1, c2; c1 = *datap++; c2 = *datap++; return c1 << 8 | c2; } struct comp { int cid; int hv; int tq; }; #define MAXCOMP 4 struct jpginfo { int nc; /* number of components */ int ns; /* number of scans */ int dri; /* restart interval */ int nm; /* mcus til next marker */ int rm; /* next restart marker */ }; static struct jpginfo info; static struct comp comps[MAXCOMP]; static struct scan dscans[MAXCOMP]; static unsigned char quant[4][64]; static struct dec_hufftbl dhuff[4]; #define dec_huffdc (dhuff + 0) #define dec_huffac (dhuff + 2) static struct in in; static int readtables(int till, int *isDHT) { int m, l, i, j, lq, pq, tq; int tc, th, tt; for (;;) { if (getbyte() != 0xff) return -1; nextbyte: if ((m = getbyte()) == till) break; switch (m) { case 0xc2: return 0; case M_DQT: //printf("find DQT \n"); lq = getword(); while (lq > 2) { pq = getbyte(); tq = pq & 15; if (tq > 3) return -1; pq >>= 4; if (pq != 0) return -1; for (i = 0; i < 64; i++) quant[tq][i] = getbyte(); lq -= 64 + 1; } break; case M_DHT: //printf("find DHT \n"); l = getword(); while (l > 2) { int hufflen[16], k; unsigned char huffvals[256]; tc = getbyte(); th = tc & 15; tc >>= 4; tt = tc * 2 + th; if (tc > 1 || th > 1) return -1; for (i = 0; i < 16; i++) hufflen[i] = getbyte(); l -= 1 + 16; k = 0; for (i = 0; i < 16; i++) { for (j = 0; j < hufflen[i]; j++) huffvals[k++] = getbyte(); l -= hufflen[i]; } dec_makehuff(dhuff + tt, hufflen, huffvals); } *isDHT= 1; break; case M_DRI: printf("find DRI \n"); l = getword(); info.dri = getword(); break; case 0xff: goto nextbyte; break; default: l = getword(); while (l-- > 2) getbyte(); break; } } return 0; } static void dec_initscans(void) { int i; info.nm = info.dri + 1; info.rm = M_RST0; for (i = 0; i < info.ns; i++) dscans[i].dc = 0; } static int dec_checkmarker(void) { int i; if (dec_readmarker(&in) != info.rm) return -1; info.nm = info.dri; info.rm = (info.rm + 1) & ~0x08; for (i = 0; i < info.ns; i++) dscans[i].dc = 0; return 0; } int jpeg_decode(unsigned char **pic, unsigned char *buf, int *width, int *height) { struct jpeg_decdata *decdata; int i, j, m, tac, tdc; int intwidth, intheight; int mcusx, mcusy, mx, my; int ypitch ,xpitch,bpp,pitch,x,y; int mb; int max[6]; ftopict convert; int err = 0; int isInitHuffman = 0; decdata = (struct jpeg_decdata *) malloc(sizeof(struct jpeg_decdata)); if (!decdata) { err = -1; goto error; } if (buf == NULL) { err = -1; goto error; } datap = buf; if (getbyte() != 0xff) { err = ERR_NO_SOI; goto error; } if (getbyte() != M_SOI) { err = ERR_NO_SOI; goto error; } if (readtables(M_SOF0, &isInitHuffman)) { err = ERR_BAD_TABLES; goto error; } getword(); i = getbyte(); if (i != 8) { err = ERR_NOT_8BIT; goto error; } intheight = getword(); intwidth = getword(); if ((intheight & 7) || (intwidth & 7)) { err = ERR_BAD_WIDTH_OR_HEIGHT; goto error; } info.nc = getbyte(); if (info.nc > MAXCOMP) { err = ERR_TOO_MANY_COMPPS; goto error; } for (i = 0; i < info.nc; i++) { int h, v; comps[i].cid = getbyte(); comps[i].hv = getbyte(); v = comps[i].hv & 15; h = comps[i].hv >> 4; comps[i].tq = getbyte(); if (h > 3 || v > 3) { err = ERR_ILLEGAL_HV; goto error; } if (comps[i].tq > 3) { err = ERR_QUANT_TABLE_SELECTOR; goto error; } } if (readtables(M_SOS,&isInitHuffman)) { err = ERR_BAD_TABLES; goto error; } getword(); info.ns = getbyte(); if (!info.ns){ printf("info ns %d/n",info.ns); err = ERR_NOT_YCBCR_221111; goto error; } for (i = 0; i < info.ns; i++) { dscans[i].cid = getbyte(); tdc = getbyte(); tac = tdc & 15; tdc >>= 4; if (tdc > 1 || tac > 1) { err = ERR_QUANT_TABLE_SELECTOR; goto error; } for (j = 0; j < info.nc; j++) if (comps[j].cid == dscans[i].cid) break; if (j == info.nc) { err = ERR_UNKNOWN_CID_IN_SCAN; goto error; } dscans[i].hv = comps[j].hv; dscans[i].tq = comps[j].tq; dscans[i].hudc.dhuff = dec_huffdc + tdc; dscans[i].huac.dhuff = dec_huffac + tac; } i = getbyte(); j = getbyte(); m = getbyte(); if (i != 0 || j != 63 || m != 0) { printf("hmm FW error,not seq DCT ??\n"); } // printf("ext huffman table %d \n",isInitHuffman); if(!isInitHuffman) { if(huffman_init() < 0) return -ERR_BAD_TABLES; } /* if (dscans[0].cid != 1 || dscans[1].cid != 2 || dscans[2].cid != 3) { err = ERR_NOT_YCBCR_221111; goto error; } if (dscans[1].hv != 0x11 || dscans[2].hv != 0x11) { err = ERR_NOT_YCBCR_221111; goto error; } */ /* if internal width and external are not the same or heigth too and pic not allocated realloc the good size and mark the change need 1 macroblock line more ?? */ if (intwidth != *width || intheight != *height || *pic == NULL) { *width = intwidth; *height = intheight; // BytesperPixel 2 yuyv , 3 rgb24 *pic = (unsigned char *) realloc((unsigned char *) *pic, (size_t) intwidth * (intheight + 8) * 2); } switch (dscans[0].hv) { case 0x22: // 411 mb=6; mcusx = *width >> 4; mcusy = *height >> 4; bpp=2; xpitch = 16 * bpp; pitch = *width * bpp; // YUYV out ypitch = 16 * pitch; convert = yuv420pto422; break; case 0x21: //422 // printf("find 422 %dx%d\n",*width,*height); mb=4; mcusx = *width >> 4; mcusy = *height >> 3; bpp=2; xpitch = 16 * bpp; pitch = *width * bpp; // YUYV out ypitch = 8 * pitch; convert = yuv422pto422; break; case 0x11: //444 mcusx = *width >> 3; mcusy = *height >> 3; bpp=2; xpitch = 8 * bpp; pitch = *width * bpp; // YUYV out ypitch = 8 * pitch; if (info.ns==1) { mb = 1; convert = yuv400pto422; } else { mb=3; convert = yuv444pto422; } break; default: err = ERR_NOT_YCBCR_221111; goto error; break; } idctqtab(quant[dscans[0].tq], decdata->dquant[0]); idctqtab(quant[dscans[1].tq], decdata->dquant[1]); idctqtab(quant[dscans[2].tq], decdata->dquant[2]); setinput(&in, datap); dec_initscans(); dscans[0].next = 2; dscans[1].next = 1; dscans[2].next = 0; /* 4xx encoding */ for (my = 0,y=0; my < mcusy; my++,y+=ypitch) { for (mx = 0,x=0; mx < mcusx; mx++,x+=xpitch) { if (info.dri && !--info.nm) if (dec_checkmarker()) { err = ERR_WRONG_MARKER; goto error; } switch (mb){ case 6: { decode_mcus(&in, decdata->dcts, mb, dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); idct(decdata->dcts + 64, decdata->out + 64, decdata->dquant[0], IFIX(128.5), max[1]); idct(decdata->dcts + 128, decdata->out + 128, decdata->dquant[0], IFIX(128.5), max[2]); idct(decdata->dcts + 192, decdata->out + 192, decdata->dquant[0], IFIX(128.5), max[3]); idct(decdata->dcts + 256, decdata->out + 256, decdata->dquant[1], IFIX(0.5), max[4]); idct(decdata->dcts + 320, decdata->out + 320, decdata->dquant[2], IFIX(0.5), max[5]); } break; case 4: { decode_mcus(&in, decdata->dcts, mb, dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); idct(decdata->dcts + 64, decdata->out + 64, decdata->dquant[0], IFIX(128.5), max[1]); idct(decdata->dcts + 128, decdata->out + 256, decdata->dquant[1], IFIX(0.5), max[4]); idct(decdata->dcts + 192, decdata->out + 320, decdata->dquant[2], IFIX(0.5), max[5]); } break; case 3: decode_mcus(&in, decdata->dcts, mb, dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); idct(decdata->dcts + 64, decdata->out + 256, decdata->dquant[1], IFIX(0.5), max[4]); idct(decdata->dcts + 128, decdata->out + 320, decdata->dquant[2], IFIX(0.5), max[5]); break; case 1: decode_mcus(&in, decdata->dcts, mb, dscans, max); idct(decdata->dcts, decdata->out, decdata->dquant[0], IFIX(128.5), max[0]); break; } // switch enc411 convert(decdata->out,*pic+y+x,pitch); } } m = dec_readmarker(&in); if (m != M_EOI) { err = ERR_NO_EOI; goto error; } if (decdata) free(decdata); return 0; error: if (decdata) free(decdata); return err; } /****************************************************************/ /************** huffman decoder ***************/ /****************************************************************/ static int huffman_init(void) { int tc, th, tt; const unsigned char *ptr= JPEGHuffmanTable ; int i, j, l; l = JPG_HUFFMAN_TABLE_LENGTH ; while (l > 0) { int hufflen[16], k; unsigned char huffvals[256]; tc = *ptr++; th = tc & 15; tc >>= 4; tt = tc * 2 + th; if (tc > 1 || th > 1) return -ERR_BAD_TABLES; for (i = 0; i < 16; i++) hufflen[i] = *ptr++; l -= 1 + 16; k = 0; for (i = 0; i < 16; i++) { for (j = 0; j < hufflen[i]; j++) huffvals[k++] = *ptr++; l -= hufflen[i]; } dec_makehuff(dhuff + tt, hufflen, huffvals); } return 0; } static int fillbits __P((struct in *, int, unsigned int)); static int dec_rec2 __P((struct in *, struct dec_hufftbl *, int *, int, int)); static void setinput(in, p) struct in *in; unsigned char *p; { in->p = p; in->left = 0; in->bits = 0; in->marker = 0; } static int fillbits(in, le, bi) struct in *in; int le; unsigned int bi; { int b, m; if (in->marker) { if (le <= 16) in->bits = bi << 16, le += 16; return le; } while (le <= 24) { b = *in->p++; if (b == 0xff && (m = *in->p++) != 0) { if (m == M_EOF) { if (in->func && (m = in->func(in->data)) == 0) continue; } in->marker = m; if (le <= 16) bi = bi << 16, le += 16; break; } bi = bi << 8 | b; le += 8; } in->bits = bi; /* tmp... 2 return values needed */ return le; } static int dec_readmarker(in) struct in *in; { int m; in->left = fillbits(in, in->left, in->bits); if ((m = in->marker) == 0) return 0; in->left = 0; in->marker = 0; return m; } #define LEBI_DCL int le, bi #define LEBI_GET(in) (le = in->left, bi = in->bits) #define LEBI_PUT(in) (in->left = le, in->bits = bi) #define GETBITS(in, n) ( \ (le < (n) ? le = fillbits(in, le, bi), bi = in->bits : 0), \ (le -= (n)), \ bi >> le & ((1 << (n)) - 1) \ ) #define UNGETBITS(in, n) ( \ le += (n) \ ) static int dec_rec2(in, hu, runp, c, i) struct in *in; struct dec_hufftbl *hu; int *runp; int c, i; { LEBI_DCL; LEBI_GET(in); if (i) { UNGETBITS(in, i & 127); *runp = i >> 8 & 15; i >>= 16; } else { for (i = DECBITS; (c = ((c << 1) | GETBITS(in, 1))) >= (hu->maxcode[i]); i++); if (i >= 16) { in->marker = M_BADHUFF; return 0; } i = hu->vals[hu->valptr[i] + c - hu->maxcode[i - 1] * 2]; *runp = i >> 4; i &= 15; } if (i == 0) { /* sigh, 0xf0 is 11 bit */ LEBI_PUT(in); return 0; } /* receive part */ c = GETBITS(in, i); if (c < (1 << (i - 1))) c += (-1 << i) + 1; LEBI_PUT(in); return c; } #define DEC_REC(in, hu, r, i) ( \ r = GETBITS(in, DECBITS), \ i = hu->llvals[r], \ i & 128 ? \ ( \ UNGETBITS(in, i & 127), \ r = i >> 8 & 15, \ i >> 16 \ ) \ : \ ( \ LEBI_PUT(in), \ i = dec_rec2(in, hu, &r, r, i), \ LEBI_GET(in), \ i \ ) \ ) static void decode_mcus(in, dct, n, sc, maxp) struct in *in; int *dct; int n; struct scan *sc; int *maxp; { struct dec_hufftbl *hu; int i, r, t; LEBI_DCL; memset(dct, 0, n * 64 * sizeof(*dct)); LEBI_GET(in); while (n-- > 0) { hu = sc->hudc.dhuff; *dct++ = (sc->dc += DEC_REC(in, hu, r, t)); hu = sc->huac.dhuff; i = 63; while (i > 0) { t = DEC_REC(in, hu, r, t); if (t == 0 && r == 0) { dct += i; break; } dct += r; *dct++ = t; i -= r + 1; } *maxp++ = 64 - i; if (n == sc->next) sc++; } LEBI_PUT(in); } static void dec_makehuff(hu, hufflen, huffvals) struct dec_hufftbl *hu; int *hufflen; unsigned char *huffvals; { int code, k, i, j, d, x, c, v; for (i = 0; i < (1 << DECBITS); i++) hu->llvals[i] = 0; /* * llvals layout: * * value v already known, run r, backup u bits: * vvvvvvvvvvvvvvvv 0000 rrrr 1 uuuuuuu * value unknown, size b bits, run r, backup u bits: * 000000000000bbbb 0000 rrrr 0 uuuuuuu * value and size unknown: * 0000000000000000 0000 0000 0 0000000 */ code = 0; k = 0; for (i = 0; i < 16; i++, code <<= 1) { /* sizes */ hu->valptr[i] = k; for (j = 0; j < hufflen[i]; j++) { hu->vals[k] = *huffvals++; if (i < DECBITS) { c = code << (DECBITS - 1 - i); v = hu->vals[k] & 0x0f; /* size */ for (d = 1 << (DECBITS - 1 - i); --d >= 0;) { if (v + i < DECBITS) { /* both fit in table */ x = d >> (DECBITS - 1 - v - i); if (v && x < (1 << (v - 1))) x += (-1 << v) + 1; x = x << 16 | (hu->vals[k] & 0xf0) << 4 | (DECBITS - (i + 1 + v)) | 128; } else x = v << 16 | (hu->vals[k] & 0xf0) << 4 | (DECBITS - (i + 1)); hu->llvals[c | d] = x; } } code++; k++; } hu->maxcode[i] = code; } hu->maxcode[16] = 0x20000; /* always terminate decode */ } /****************************************************************/ /************** idct ***************/ /****************************************************************/ #define IMULT(a, b) (((a) * (b)) >> ISHIFT) #define ITOINT(a) ((a) >> ISHIFT) #define S22 ((PREC)IFIX(2 * 0.382683432)) #define C22 ((PREC)IFIX(2 * 0.923879532)) #define IC4 ((PREC)IFIX(1 / 0.707106781)) static unsigned char zig2[64] = { 0, 2, 3, 9, 10, 20, 21, 35, 14, 16, 25, 31, 39, 46, 50, 57, 5, 7, 12, 18, 23, 33, 37, 48, 27, 29, 41, 44, 52, 55, 59, 62, 15, 26, 30, 40, 45, 51, 56, 58, 1, 4, 8, 11, 19, 22, 34, 36, 28, 42, 43, 53, 54, 60, 61, 63, 6, 13, 17, 24, 32, 38, 47, 49 }; inline static void idct(int *in, int *out, int *quant, long off, int max) { long t0, t1, t2, t3, t4, t5, t6, t7; // t ; long tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6; long tmp[64], *tmpp; int i, j, te; unsigned char *zig2p; t0 = off; if (max == 1) { t0 += in[0] * quant[0]; for (i = 0; i < 64; i++) out[i] = ITOINT(t0); return; } zig2p = zig2; tmpp = tmp; for (i = 0; i < 8; i++) { j = *zig2p++; t0 += in[j] * (long) quant[j]; j = *zig2p++; t5 = in[j] * (long) quant[j]; j = *zig2p++; t2 = in[j] * (long) quant[j]; j = *zig2p++; t7 = in[j] * (long) quant[j]; j = *zig2p++; t1 = in[j] * (long) quant[j]; j = *zig2p++; t4 = in[j] * (long) quant[j]; j = *zig2p++; t3 = in[j] * (long) quant[j]; j = *zig2p++; t6 = in[j] * (long) quant[j]; if ((t1 | t2 | t3 | t4 | t5 | t6 | t7) == 0) { tmpp[0 * 8] = t0; tmpp[1 * 8] = t0; tmpp[2 * 8] = t0; tmpp[3 * 8] = t0; tmpp[4 * 8] = t0; tmpp[5 * 8] = t0; tmpp[6 * 8] = t0; tmpp[7 * 8] = t0; tmpp++; t0 = 0; continue; } //IDCT; tmp0 = t0 + t1; t1 = t0 - t1; tmp2 = t2 - t3; t3 = t2 + t3; tmp2 = IMULT(tmp2, IC4) - t3; tmp3 = tmp0 + t3; t3 = tmp0 - t3; tmp1 = t1 + tmp2; tmp2 = t1 - tmp2; tmp4 = t4 - t7; t7 = t4 + t7; tmp5 = t5 + t6; t6 = t5 - t6; tmp6 = tmp5 - t7; t7 = tmp5 + t7; tmp5 = IMULT(tmp6, IC4); tmp6 = IMULT((tmp4 + t6), S22); tmp4 = IMULT(tmp4, (C22 - S22)) + tmp6; t6 = IMULT(t6, (C22 + S22)) - tmp6; t6 = t6 - t7; t5 = tmp5 - t6; t4 = tmp4 - t5; tmpp[0 * 8] = tmp3 + t7; //t0; tmpp[1 * 8] = tmp1 + t6; //t1; tmpp[2 * 8] = tmp2 + t5; //t2; tmpp[3 * 8] = t3 + t4; //t3; tmpp[4 * 8] = t3 - t4; //t4; tmpp[5 * 8] = tmp2 - t5; //t5; tmpp[6 * 8] = tmp1 - t6; //t6; tmpp[7 * 8] = tmp3 - t7; //t7; tmpp++; t0 = 0; } for (i = 0, j = 0; i < 8; i++) { t0 = tmp[j + 0]; t1 = tmp[j + 1]; t2 = tmp[j + 2]; t3 = tmp[j + 3]; t4 = tmp[j + 4]; t5 = tmp[j + 5]; t6 = tmp[j + 6]; t7 = tmp[j + 7]; if ((t1 | t2 | t3 | t4 | t5 | t6 | t7) == 0) { te = ITOINT(t0); out[j + 0] = te; out[j + 1] = te; out[j + 2] = te; out[j + 3] = te; out[j + 4] = te; out[j + 5] = te; out[j + 6] = te; out[j + 7] = te; j += 8; continue; } //IDCT; tmp0 = t0 + t1; t1 = t0 - t1; tmp2 = t2 - t3; t3 = t2 + t3; tmp2 = IMULT(tmp2, IC4) - t3; tmp3 = tmp0 + t3; t3 = tmp0 - t3; tmp1 = t1 + tmp2; tmp2 = t1 - tmp2; tmp4 = t4 - t7; t7 = t4 + t7; tmp5 = t5 + t6; t6 = t5 - t6; tmp6 = tmp5 - t7; t7 = tmp5 + t7; tmp5 = IMULT(tmp6, IC4); tmp6 = IMULT((tmp4 + t6), S22); tmp4 = IMULT(tmp4, (C22 - S22)) + tmp6; t6 = IMULT(t6, (C22 + S22)) - tmp6; t6 = t6 - t7; t5 = tmp5 - t6; t4 = tmp4 - t5; out[j + 0] = ITOINT(tmp3 + t7); out[j + 1] = ITOINT(tmp1 + t6); out[j + 2] = ITOINT(tmp2 + t5); out[j + 3] = ITOINT(t3 + t4); out[j + 4] = ITOINT(t3 - t4); out[j + 5] = ITOINT(tmp2 - t5); out[j + 6] = ITOINT(tmp1 - t6); out[j + 7] = ITOINT(tmp3 - t7); j += 8; } } static unsigned char zig[64] = { 0, 1, 5, 6, 14, 15, 27, 28, 2, 4, 7, 13, 16, 26, 29, 42, 3, 8, 12, 17, 25, 30, 41, 43, 9, 11, 18, 24, 31, 40, 44, 53, 10, 19, 23, 32, 39, 45, 52, 54, 20, 22, 33, 38, 46, 51, 55, 60, 21, 34, 37, 47, 50, 56, 59, 61, 35, 36, 48, 49, 57, 58, 62, 63 }; static PREC aaidct[8] = { IFIX(0.3535533906), IFIX(0.4903926402), IFIX(0.4619397663), IFIX(0.4157348062), IFIX(0.3535533906), IFIX(0.2777851165), IFIX(0.1913417162), IFIX(0.0975451610) }; static void idctqtab(qin, qout) unsigned char *qin; PREC *qout; { int i, j; for (i = 0; i < 8; i++) for (j = 0; j < 8; j++) qout[zig[i * 8 + j]] = qin[zig[i * 8 + j]] * IMULT(aaidct[i], aaidct[j]); } #define FOUR_TWO_TWO 2 //Y00 Cb Y01 Cr /* translate YUV422Packed to rgb24 */ unsigned int Pyuv422torgb24(unsigned char * input_ptr, unsigned char * output_ptr, unsigned int image_width, unsigned int image_height) { unsigned int i, size; unsigned char Y, Y1, U, V; unsigned char *buff = input_ptr; unsigned char *output_pt = output_ptr; size = image_width * image_height /2; for (i = size; i > 0; i--) { /* bgr instead rgb ?? */ Y = buff[0] ; U = buff[1] ; Y1 = buff[2]; V = buff[3]; buff += 4; *output_pt++ = R_FROMYV(Y,V); *output_pt++ = G_FROMYUV(Y,U,V); //b *output_pt++ = B_FROMYU(Y,U); //v *output_pt++ = R_FROMYV(Y1,V); *output_pt++ = G_FROMYUV(Y1,U,V); //b *output_pt++ = B_FROMYU(Y1,U); //v } return FOUR_TWO_TWO; } static void yuv420pto422(int * out,unsigned char *pic,int width) { int j, k; unsigned char *pic0, *pic1; int *outy, *outu, *outv; int outy1 = 0; int outy2 = 8; pic0 = pic; pic1 = pic + width; outy = out; outu = out + 64 * 4; outv = out + 64 * 5; for (j = 0; j < 8; j++) { for (k = 0; k < 8; k++) { if( k == 4) { outy1 += 56; outy2 += 56; } *pic0++ = CLIP(outy[outy1]); *pic0++ = CLIP(128 + *outu); *pic0++ = CLIP(outy[outy1+1]); *pic0++ = CLIP(128 + *outv); *pic1++ = CLIP(outy[outy2]); *pic1++ = CLIP(128 + *outu); *pic1++ = CLIP(outy[outy2+1]); *pic1++ = CLIP(128 + *outv); outy1 +=2; outy2 += 2; outu++; outv++; } if(j==3) { outy = out + 128; } else { outy += 16; } outy1 = 0; outy2 = 8; pic0 += 2 * (width -16); pic1 += 2 * (width -16); } } static void yuv422pto422(int * out,unsigned char *pic,int width) { int j, k; unsigned char *pic0, *pic1; int *outy, *outu, *outv; int outy1 = 0; int outy2 = 8; int outu1 = 0; int outv1 = 0; pic0 = pic; pic1 = pic + width; outy = out; outu = out + 64 * 4; outv = out + 64 * 5; for (j = 0; j < 4; j++) { for (k = 0; k < 8; k++) { if( k == 4) { outy1 += 56; outy2 += 56; } *pic0++ = CLIP(outy[outy1]); *pic0++ = CLIP(128 + outu[outu1]); *pic0++ = CLIP(outy[outy1+1]); *pic0++ = CLIP(128 + outv[outv1]); *pic1++ = CLIP(outy[outy2]); *pic1++ = CLIP(128 + outu[outu1+8]); *pic1++ = CLIP(outy[outy2+1]); *pic1++ = CLIP(128 + outv[outv1+8]); outv1 += 1; outu1 += 1; outy1 +=2; outy2 +=2; } outy += 16;outu +=8; outv +=8; outv1 = 0; outu1=0; outy1 = 0; outy2 = 8; pic0 += 2 * (width -16); pic1 += 2 * (width -16); } } static void yuv444pto422(int * out,unsigned char *pic,int width) { int j, k; unsigned char *pic0, *pic1; int *outy, *outu, *outv; int outy1 = 0; int outy2 = 8; int outu1 = 0; int outv1 = 0; pic0 = pic; pic1 = pic + width; outy = out; outu = out + 64 * 4; // Ooops where did i invert ?? outv = out + 64 * 5; for (j = 0; j < 4; j++) { for (k = 0; k < 4; k++) { *pic0++ =CLIP( outy[outy1]); *pic0++ =CLIP( 128 + outu[outu1]); *pic0++ =CLIP( outy[outy1+1]); *pic0++ =CLIP( 128 + outv[outv1]); *pic1++ =CLIP( outy[outy2]); *pic1++ =CLIP( 128 + outu[outu1+8]); *pic1++ =CLIP( outy[outy2+1]); *pic1++ =CLIP( 128 + outv[outv1+8]); outv1 += 2; outu1 += 2; outy1 +=2; outy2 +=2; } outy += 16;outu +=16; outv +=16; outv1 = 0; outu1=0; outy1 = 0; outy2 = 8; pic0 += 2 * (width -8); pic1 += 2 * (width -8); } } static void yuv400pto422(int * out,unsigned char *pic,int width) { int j, k; unsigned char *pic0, *pic1; int *outy ; int outy1 = 0; int outy2 = 8; pic0 = pic; pic1 = pic + width; outy = out; for (j = 0; j < 4; j++) { for (k = 0; k < 4; k++) { *pic0++ = CLIP(outy[outy1]); *pic0++ = 128 ; *pic0++ = CLIP(outy[outy1+1]); *pic0++ = 128 ; *pic1++ = CLIP(outy[outy2]); *pic1++ = 128 ; *pic1++ = CLIP(outy[outy2+1]); *pic1++ = 128 ; outy1 +=2; outy2 +=2; } outy += 16; outy1 = 0; outy2 = 8; pic0 += 2 * (width -8); pic1 += 2 * (width -8); } } int is_huffman(unsigned char *buf) { unsigned char *ptbuf; int i = 0; ptbuf = buf; while (((ptbuf[0] << 8) | ptbuf[1]) != 0xffda){ if(i++ > 2048) return 0; if(((ptbuf[0] << 8) | ptbuf[1]) == 0xffc4) return 1; ptbuf++; } return 0; } static void getPictureName (char *Picture, int fmt) { char temp[80]; char *myext[] = { "pnm", "jpg" }; int i; time_t curdate; struct tm *tdate; memset (temp, '\0', sizeof (temp)); time (&curdate); tdate = localtime (&curdate); snprintf (temp, 26, "P-%02d:%02d:%04d-%02d:%02d:%02d.%s\0", tdate->tm_mon + 1, tdate->tm_mday, tdate->tm_year + 1900, tdate->tm_hour, tdate->tm_min, tdate->tm_sec, myext[fmt]); memcpy (Picture, temp, strlen (temp)); } int get_picture(unsigned char *buf,int size) { FILE *file; unsigned char *ptdeb,*ptcur = buf; int sizein; char *name = NULL; name = calloc(80,1); getPictureName (name, 1); file = fopen(name, "wb"); if (file != NULL) { if(!is_huffman(buf)){ ptdeb = ptcur = buf; while (((ptcur[0] << 8) | ptcur[1]) != 0xffc0) ptcur++; sizein = ptcur-ptdeb; fwrite(buf, sizein, 1, file); fwrite(dht_data, DHT_SIZE, 1, file); fwrite(ptcur,size-sizein,1,file); } else { fwrite(ptcur,size,1,file); /* ptcur was uninit -wsr */ } fclose(file); } if(name) free(name); return 0; } int get_pictureYV2(unsigned char *buf,int width,int height) { FILE *foutpict; unsigned char *picture = NULL; char *name = NULL; name = calloc(80,1); getPictureName (name, 0); picture = (unsigned char *)malloc(width*height*3*sizeof(char)); if(picture){ Pyuv422torgb24(buf, picture, width, height); }else{ printf(" no room to take a picture \n"); return 0; } if(name){ foutpict = fopen (name, "wb"); fprintf (foutpict, "P6\n%d %d\n255\n", width, height); fwrite (picture, sizeof (char), width * height * 3, foutpict); fclose (foutpict); free(name); } free(picture); picture = NULL; return 0; } luvcview-0.2.6/v4l2uvc.h0000644000175000017500000000772711122645011014363 0ustar aurel32aurel32/******************************************************************************* # luvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # *******************************************************************************/ #include #include #include #include #include #include #include #include #include #include "avilib.h" #include "uvcvideo.h" #include "dynctrl-logitech.h" #define NB_BUFFER 4 #define DHT_SIZE 432 struct vdIn { int fd; char *videodevice; char *status; char *pictName; struct v4l2_capability cap; struct v4l2_format fmt; struct v4l2_buffer buf; struct v4l2_requestbuffers rb; void *mem[NB_BUFFER]; unsigned char *tmpbuffer; unsigned char *framebuffer; int isstreaming; int grabmethod; int width; int height; float fps; int formatIn; int formatOut; int framesizeIn; int signalquit; int toggleAvi; int getPict; int rawFrameCapture; /* raw frame capture */ unsigned int fileCounter; /* raw frame stream capture */ unsigned int rfsFramesWritten; unsigned int rfsBytesWritten; /* raw stream capture */ FILE *captureFile; unsigned int framesWritten; unsigned int bytesWritten; avi_t *avifile; char *avifilename; int framecount; int recordstart; int recordtime; }; int init_videoIn(struct vdIn *vd, char *device, int width, int height, float fps, int format, int grabmethod, char *avifilename); int enum_controls(int vd); int save_controls(int vd); int load_controls(int vd); int uvcGrab(struct vdIn *vd); int close_v4l2(struct vdIn *vd); int v4l2GetControl(struct vdIn *vd, int control); int v4l2SetControl(struct vdIn *vd, int control, int value); int v4l2UpControl(struct vdIn *vd, int control); int v4l2DownControl(struct vdIn *vd, int control); int v4l2ToggleControl(struct vdIn *vd, int control); int v4l2ResetControl(struct vdIn *vd, int control); int v4l2ResetPanTilt(struct vdIn *vd); int v4L2UpDownPan(struct vdIn *vd, short inc); int v4L2UpDownTilt(struct vdIn *vd,short inc); int v4L2UpDownPanTilt(struct vdIn *vd, short inc_p, short inc_t); int v4l2SetLightFrequencyFilter(struct vdIn *vd,int flt); int enum_frame_intervals(int dev, __u32 pixfmt, __u32 width, __u32 height); int enum_frame_sizes(int dev, __u32 pixfmt); int enum_frame_formats(int dev, unsigned int *supported_formats, unsigned int max_formats); luvcview-0.2.6/uvc_compat.h0000644000175000017500000001762011245455154015224 0ustar aurel32aurel32#ifndef _UVC_COMPAT_H #define _UVC_COMPAT_H #include #ifndef __KERNEL__ #ifndef __user #define __user #endif #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18) /* * Extended control API */ struct v4l2_ext_control { __u32 id; __u32 reserved2[2]; union { __s32 value; __s64 value64; void *reserved; }; } __attribute__ ((packed)); struct v4l2_ext_controls { __u32 ctrl_class; __u32 count; __u32 error_idx; __u32 reserved[2]; struct v4l2_ext_control *controls; }; /* Values for ctrl_class field */ #define V4L2_CTRL_CLASS_USER 0x00980000 /* Old-style 'user' controls */ #define V4L2_CTRL_CLASS_MPEG 0x00990000 /* MPEG-compression controls */ #define V4L2_CTRL_ID_MASK (0x0fffffff) #define V4L2_CTRL_ID2CLASS(id) ((id) & 0x0fff0000UL) #define V4L2_CTRL_DRIVER_PRIV(id) (((id) & 0xffff) >= 0x1000) /* Control flags */ #define V4L2_CTRL_FLAG_READ_ONLY 0x0004 #define V4L2_CTRL_FLAG_UPDATE 0x0008 #define V4L2_CTRL_FLAG_INACTIVE 0x0010 #define V4L2_CTRL_FLAG_SLIDER 0x0020 /* Query flags, to be ORed with the control ID */ #define V4L2_CTRL_FLAG_NEXT_CTRL 0x80000000 /* User-class control IDs defined by V4L2 */ #undef V4L2_CID_BASE #define V4L2_CID_BASE (V4L2_CTRL_CLASS_USER | 0x900) #define V4L2_CID_USER_BASE V4L2_CID_BASE #define V4L2_CID_USER_CLASS (V4L2_CTRL_CLASS_USER | 1) #define VIDIOC_G_EXT_CTRLS _IOWR('V', 71, struct v4l2_ext_controls) #define VIDIOC_S_EXT_CTRLS _IOWR('V', 72, struct v4l2_ext_controls) #define VIDIOC_TRY_EXT_CTRLS _IOWR('V', 73, struct v4l2_ext_controls) #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) /* * Frame size and frame rate enumeration * * Included in Linux 2.6.19 */ enum v4l2_frmsizetypes { V4L2_FRMSIZE_TYPE_DISCRETE = 1, V4L2_FRMSIZE_TYPE_CONTINUOUS = 2, V4L2_FRMSIZE_TYPE_STEPWISE = 3, }; struct v4l2_frmsize_discrete { __u32 width; /* Frame width [pixel] */ __u32 height; /* Frame height [pixel] */ }; struct v4l2_frmsize_stepwise { __u32 min_width; /* Minimum frame width [pixel] */ __u32 max_width; /* Maximum frame width [pixel] */ __u32 step_width; /* Frame width step size [pixel] */ __u32 min_height; /* Minimum frame height [pixel] */ __u32 max_height; /* Maximum frame height [pixel] */ __u32 step_height; /* Frame height step size [pixel] */ }; struct v4l2_frmsizeenum { __u32 index; /* Frame size number */ __u32 pixel_format; /* Pixel format */ __u32 type; /* Frame size type the device supports. */ union { /* Frame size */ struct v4l2_frmsize_discrete discrete; struct v4l2_frmsize_stepwise stepwise; }; __u32 reserved[2]; /* Reserved space for future use */ }; enum v4l2_frmivaltypes { V4L2_FRMIVAL_TYPE_DISCRETE = 1, V4L2_FRMIVAL_TYPE_CONTINUOUS = 2, V4L2_FRMIVAL_TYPE_STEPWISE = 3, }; struct v4l2_frmival_stepwise { struct v4l2_fract min; /* Minimum frame interval [s] */ struct v4l2_fract max; /* Maximum frame interval [s] */ struct v4l2_fract step; /* Frame interval step size [s] */ }; struct v4l2_frmivalenum { __u32 index; /* Frame format index */ __u32 pixel_format; /* Pixel format */ __u32 width; /* Frame width */ __u32 height; /* Frame height */ __u32 type; /* Frame interval type the device supports. */ union { /* Frame interval */ struct v4l2_fract discrete; struct v4l2_frmival_stepwise stepwise; }; __u32 reserved[2]; /* Reserved space for future use */ }; #define VIDIOC_ENUM_FRAMESIZES _IOWR('V', 74, struct v4l2_frmsizeenum) #define VIDIOC_ENUM_FRAMEINTERVALS _IOWR('V', 75, struct v4l2_frmivalenum) #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) /* * V4L2 Control identifiers. */ #define V4L2_CTRL_CLASS_CAMERA 0x009A0000 /* Camera class controls */ #define V4L2_CID_POWER_LINE_FREQUENCY (V4L2_CID_BASE+24) enum v4l2_power_line_frequency { V4L2_CID_POWER_LINE_FREQUENCY_DISABLED = 0, V4L2_CID_POWER_LINE_FREQUENCY_50HZ = 1, V4L2_CID_POWER_LINE_FREQUENCY_60HZ = 2, }; #define V4L2_CID_HUE_AUTO (V4L2_CID_BASE+25) #define V4L2_CID_WHITE_BALANCE_TEMPERATURE (V4L2_CID_BASE+26) #define V4L2_CID_SHARPNESS (V4L2_CID_BASE+27) #define V4L2_CID_BACKLIGHT_COMPENSATION (V4L2_CID_BASE+28) #define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900) #define V4L2_CID_CAMERA_CLASS (V4L2_CTRL_CLASS_CAMERA | 1) #define V4L2_CID_EXPOSURE_AUTO (V4L2_CID_CAMERA_CLASS_BASE+1) enum v4l2_exposure_auto_type { V4L2_EXPOSURE_MANUAL = 0, V4L2_EXPOSURE_AUTO = 1, V4L2_EXPOSURE_SHUTTER_PRIORITY = 2, V4L2_EXPOSURE_APERTURE_PRIORITY = 3 }; #define V4L2_CID_EXPOSURE_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+2) #define V4L2_CID_EXPOSURE_AUTO_PRIORITY (V4L2_CID_CAMERA_CLASS_BASE+3) #define V4L2_CID_PAN_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+4) #define V4L2_CID_TILT_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+5) #define V4L2_CID_PAN_RESET (V4L2_CID_CAMERA_CLASS_BASE+6) #define V4L2_CID_TILT_RESET (V4L2_CID_CAMERA_CLASS_BASE+7) #define V4L2_CID_PAN_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+8) #define V4L2_CID_TILT_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+9) #define V4L2_CID_FOCUS_ABSOLUTE (V4L2_CID_CAMERA_CLASS_BASE+10) #define V4L2_CID_FOCUS_RELATIVE (V4L2_CID_CAMERA_CLASS_BASE+11) #define V4L2_CID_FOCUS_AUTO (V4L2_CID_CAMERA_CLASS_BASE+12) #endif #ifdef __KERNEL__ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14) /* * kzalloc() */ static inline void * kzalloc(size_t size, unsigned int __nocast gfp_flags) { void *mem = kmalloc(size, gfp_flags); if (mem) memset(mem, 0, size); return mem; } #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15) /* * vm_insert_page() */ static inline int vm_insert_page(struct vm_area_struct *vma, unsigned long addr, struct page *page) { /* Not sure if this is needed. remap_pfn_range() sets VM_RESERVED * in 2.6.14. */ vma->vm_flags |= VM_RESERVED; SetPageReserved(page); return remap_pfn_range(vma, addr, page_to_pfn(page), PAGE_SIZE, vma->vm_page_prot); } #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) /* * v4l_printk_ioctl() */ static inline void v4l_printk_ioctl(unsigned int cmd) { switch (_IOC_TYPE(cmd)) { case 'v': printk(KERN_DEBUG "ioctl 0x%x (V4L1)\n", cmd); break; case 'V': printk(KERN_DEBUG "ioctl 0x%x (%s)\n", cmd, v4l2_ioctl_names[_IOC_NR(cmd)]); break; default: printk(KERN_DEBUG "ioctl 0x%x (?)\n", cmd); break; } } #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16) /* * Mutex API */ #include #define mutex_lock(mutex) down(mutex) #define mutex_lock_interruptible(mutex) down_interruptible(mutex) #define mutex_unlock(mutex) up(mutex) #define mutex_init(mutex) init_MUTEX(mutex) #define mutex semaphore #else #include #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19) /* * usb_endpoint_* functions * * Included in Linux 2.6.19 */ static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) { return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); } static inline int usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) { return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT); } static inline int usb_endpoint_xfer_isoc(const struct usb_endpoint_descriptor *epd) { return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_ISOC); } static inline int usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) { return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK); } static inline int usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd) { return (usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd)); } /* * USB auto suspend * * Included in Linux 2.6.19 */ static inline int usb_autopm_get_interface(struct usb_interface *intf) { return 0; } static inline void usb_autopm_put_interface(struct usb_interface *intf) { } #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22) /* * Linked list API */ #define list_first_entry(ptr, type, member) \ list_entry((ptr)->next, type, member) #endif #endif /* __KERNEL__ */ #endif /* _UVC_COMPAT_H */ luvcview-0.2.6/uvcvideo.h0000644000175000017500000005474511245455027014720 0ustar aurel32aurel32#ifndef _USB_VIDEO_H_ #define _USB_VIDEO_H_ #include #include #include "uvc_compat.h" /* * Dynamic controls */ /* Data types for UVC control data */ enum uvc_control_data_type { UVC_CTRL_DATA_TYPE_RAW = 0, UVC_CTRL_DATA_TYPE_SIGNED, UVC_CTRL_DATA_TYPE_UNSIGNED, UVC_CTRL_DATA_TYPE_BOOLEAN, UVC_CTRL_DATA_TYPE_ENUM, UVC_CTRL_DATA_TYPE_BITMASK, }; #define UVC_CONTROL_SET_CUR (1 << 0) #define UVC_CONTROL_GET_CUR (1 << 1) #define UVC_CONTROL_GET_MIN (1 << 2) #define UVC_CONTROL_GET_MAX (1 << 3) #define UVC_CONTROL_GET_RES (1 << 4) #define UVC_CONTROL_GET_DEF (1 << 5) /* Control should be saved at suspend and restored at resume. */ #define UVC_CONTROL_RESTORE (1 << 6) /* Control can be updated by the camera. */ #define UVC_CONTROL_AUTO_UPDATE (1 << 7) #define UVC_CONTROL_GET_RANGE (UVC_CONTROL_GET_CUR | UVC_CONTROL_GET_MIN | \ UVC_CONTROL_GET_MAX | UVC_CONTROL_GET_RES | \ UVC_CONTROL_GET_DEF) struct uvc_xu_control_info { __u8 entity[16]; __u8 index; __u8 selector; __u16 size; __u32 flags; }; struct uvc_xu_control_mapping { __u32 id; __u8 name[32]; __u8 entity[16]; __u8 selector; __u8 size; __u8 offset; enum v4l2_ctrl_type v4l2_type; enum uvc_control_data_type data_type; }; struct uvc_xu_control { __u8 unit; __u8 selector; __u16 size; __u8 __user *data; }; #define UVCIOC_CTRL_ADD _IOW('U', 1, struct uvc_xu_control_info) #define UVCIOC_CTRL_MAP _IOWR('U', 2, struct uvc_xu_control_mapping) #define UVCIOC_CTRL_GET _IOWR('U', 3, struct uvc_xu_control) #define UVCIOC_CTRL_SET _IOW('U', 4, struct uvc_xu_control) #ifdef __KERNEL__ #include /* -------------------------------------------------------------------------- * UVC constants */ #define SC_UNDEFINED 0x00 #define SC_VIDEOCONTROL 0x01 #define SC_VIDEOSTREAMING 0x02 #define SC_VIDEO_INTERFACE_COLLECTION 0x03 #define PC_PROTOCOL_UNDEFINED 0x00 #define CS_UNDEFINED 0x20 #define CS_DEVICE 0x21 #define CS_CONFIGURATION 0x22 #define CS_STRING 0x23 #define CS_INTERFACE 0x24 #define CS_ENDPOINT 0x25 /* VideoControl class specific interface descriptor */ #define VC_DESCRIPTOR_UNDEFINED 0x00 #define VC_HEADER 0x01 #define VC_INPUT_TERMINAL 0x02 #define VC_OUTPUT_TERMINAL 0x03 #define VC_SELECTOR_UNIT 0x04 #define VC_PROCESSING_UNIT 0x05 #define VC_EXTENSION_UNIT 0x06 /* VideoStreaming class specific interface descriptor */ #define VS_UNDEFINED 0x00 #define VS_INPUT_HEADER 0x01 #define VS_OUTPUT_HEADER 0x02 #define VS_STILL_IMAGE_FRAME 0x03 #define VS_FORMAT_UNCOMPRESSED 0x04 #define VS_FRAME_UNCOMPRESSED 0x05 #define VS_FORMAT_MJPEG 0x06 #define VS_FRAME_MJPEG 0x07 #define VS_FORMAT_MPEG2TS 0x0a #define VS_FORMAT_DV 0x0c #define VS_COLORFORMAT 0x0d #define VS_FORMAT_FRAME_BASED 0x10 #define VS_FRAME_FRAME_BASED 0x11 #define VS_FORMAT_STREAM_BASED 0x12 /* Endpoint type */ #define EP_UNDEFINED 0x00 #define EP_GENERAL 0x01 #define EP_ENDPOINT 0x02 #define EP_INTERRUPT 0x03 /* Request codes */ #define RC_UNDEFINED 0x00 #define SET_CUR 0x01 #define GET_CUR 0x81 #define GET_MIN 0x82 #define GET_MAX 0x83 #define GET_RES 0x84 #define GET_LEN 0x85 #define GET_INFO 0x86 #define GET_DEF 0x87 /* VideoControl interface controls */ #define VC_CONTROL_UNDEFINED 0x00 #define VC_VIDEO_POWER_MODE_CONTROL 0x01 #define VC_REQUEST_ERROR_CODE_CONTROL 0x02 /* Terminal controls */ #define TE_CONTROL_UNDEFINED 0x00 /* Selector Unit controls */ #define SU_CONTROL_UNDEFINED 0x00 #define SU_INPUT_SELECT_CONTROL 0x01 /* Camera Terminal controls */ #define CT_CONTROL_UNDEFINED 0x00 #define CT_SCANNING_MODE_CONTROL 0x01 #define CT_AE_MODE_CONTROL 0x02 #define CT_AE_PRIORITY_CONTROL 0x03 #define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 #define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 #define CT_FOCUS_ABSOLUTE_CONTROL 0x06 #define CT_FOCUS_RELATIVE_CONTROL 0x07 #define CT_FOCUS_AUTO_CONTROL 0x08 #define CT_IRIS_ABSOLUTE_CONTROL 0x09 #define CT_IRIS_RELATIVE_CONTROL 0x0a #define CT_ZOOM_ABSOLUTE_CONTROL 0x0b #define CT_ZOOM_RELATIVE_CONTROL 0x0c #define CT_PANTILT_ABSOLUTE_CONTROL 0x0d #define CT_PANTILT_RELATIVE_CONTROL 0x0e #define CT_ROLL_ABSOLUTE_CONTROL 0x0f #define CT_ROLL_RELATIVE_CONTROL 0x10 #define CT_PRIVACY_CONTROL 0x11 /* Processing Unit controls */ #define PU_CONTROL_UNDEFINED 0x00 #define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 #define PU_BRIGHTNESS_CONTROL 0x02 #define PU_CONTRAST_CONTROL 0x03 #define PU_GAIN_CONTROL 0x04 #define PU_POWER_LINE_FREQUENCY_CONTROL 0x05 #define PU_HUE_CONTROL 0x06 #define PU_SATURATION_CONTROL 0x07 #define PU_SHARPNESS_CONTROL 0x08 #define PU_GAMMA_CONTROL 0x09 #define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a #define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b #define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c #define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d #define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e #define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f #define PU_HUE_AUTO_CONTROL 0x10 #define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 #define PU_ANALOG_LOCK_STATUS_CONTROL 0x12 #define LXU_MOTOR_PANTILT_RELATIVE_CONTROL 0x01 #define LXU_MOTOR_PANTILT_RESET_CONTROL 0x02 #define LXU_MOTOR_FOCUS_MOTOR_CONTROL 0x03 /* VideoStreaming interface controls */ #define VS_CONTROL_UNDEFINED 0x00 #define VS_PROBE_CONTROL 0x01 #define VS_COMMIT_CONTROL 0x02 #define VS_STILL_PROBE_CONTROL 0x03 #define VS_STILL_COMMIT_CONTROL 0x04 #define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 #define VS_STREAM_ERROR_CODE_CONTROL 0x06 #define VS_GENERATE_KEY_FRAME_CONTROL 0x07 #define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 #define VS_SYNC_DELAY_CONTROL 0x09 #define TT_VENDOR_SPECIFIC 0x0100 #define TT_STREAMING 0x0101 /* Input Terminal types */ #define ITT_VENDOR_SPECIFIC 0x0200 #define ITT_CAMERA 0x0201 #define ITT_MEDIA_TRANSPORT_INPUT 0x0202 /* Output Terminal types */ #define OTT_VENDOR_SPECIFIC 0x0300 #define OTT_DISPLAY 0x0301 #define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 /* External Terminal types */ #define EXTERNAL_VENDOR_SPECIFIC 0x0400 #define COMPOSITE_CONNECTOR 0x0401 #define SVIDEO_CONNECTOR 0x0402 #define COMPONENT_CONNECTOR 0x0403 #define UVC_TERM_INPUT 0x0000 #define UVC_TERM_OUTPUT 0x8000 #define UVC_ENTITY_TYPE(entity) ((entity)->type & 0x7fff) #define UVC_ENTITY_IS_UNIT(entity) (((entity)->type & 0xff00) == 0) #define UVC_ENTITY_IS_TERM(entity) (((entity)->type & 0xff00) != 0) #define UVC_ENTITY_IS_ITERM(entity) \ (((entity)->type & 0x8000) == UVC_TERM_INPUT) #define UVC_ENTITY_IS_OTERM(entity) \ (((entity)->type & 0x8000) == UVC_TERM_OUTPUT) #define UVC_STATUS_TYPE_CONTROL 1 #define UVC_STATUS_TYPE_STREAMING 2 /* ------------------------------------------------------------------------ * GUIDs */ #define UVC_GUID_UVC_CAMERA \ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01} #define UVC_GUID_UVC_OUTPUT \ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02} #define UVC_GUID_UVC_MEDIA_TRANSPORT_INPUT \ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03} #define UVC_GUID_UVC_PROCESSING \ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01} #define UVC_GUID_UVC_SELECTOR \ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02} #define UVC_GUID_LOGITECH_DEV_INFO \ {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1e} #define UVC_GUID_LOGITECH_USER_HW \ {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1f} #define UVC_GUID_LOGITECH_VIDEO \ {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x50} #define UVC_GUID_LOGITECH_MOTOR \ {0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x56} #define UVC_GUID_FORMAT_MJPEG \ { 'M', 'J', 'P', 'G', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} #define UVC_GUID_FORMAT_YUY2 \ { 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} #define UVC_GUID_FORMAT_NV12 \ { 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} #define UVC_GUID_FORMAT_YV12 \ { 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} #define UVC_GUID_FORMAT_I420 \ { 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} #define UVC_GUID_FORMAT_UYVY \ { 'U', 'Y', 'V', 'Y', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} #define UVC_GUID_FORMAT_Y800 \ { 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} #define UVC_GUID_FORMAT_BY8 \ { 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \ 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71} /* ------------------------------------------------------------------------ * Driver specific constants. */ #define DRIVER_VERSION_NUMBER KERNEL_VERSION(0, 1, 0) /* Number of isochronous URBs. */ #define UVC_URBS 5 /* Maximum number of packets per isochronous URB. */ #define UVC_MAX_ISO_PACKETS 40 /* Maximum frame size in bytes, for sanity checking. */ #define UVC_MAX_FRAME_SIZE (16*1024*1024) /* Maximum number of video buffers. */ #define UVC_MAX_VIDEO_BUFFERS 32 #define UVC_CTRL_CONTROL_TIMEOUT 300 #define UVC_CTRL_STREAMING_TIMEOUT 1000 /* Devices quirks */ #define UVC_QUIRK_STATUS_INTERVAL 0x00000001 #define UVC_QUIRK_PROBE_MINMAX 0x00000002 #define UVC_QUIRK_PROBE_EXTRAFIELDS 0x00000004 #define UVC_QUIRK_BUILTIN_ISIGHT 0x00000008 #define UVC_QUIRK_STREAM_NO_FID 0x00000010 /* Format flags */ #define UVC_FMT_FLAG_COMPRESSED 0x00000001 #define UVC_FMT_FLAG_STREAM 0x00000002 /* ------------------------------------------------------------------------ * Structures. */ struct uvc_device; /* TODO: Put the most frequently accessed fields at the beginning of * structures to maximize cache efficiency. */ struct uvc_streaming_control { __u16 bmHint; __u8 bFormatIndex; __u8 bFrameIndex; __u32 dwFrameInterval; __u16 wKeyFrameRate; __u16 wPFrameRate; __u16 wCompQuality; __u16 wCompWindowSize; __u16 wDelay; __u32 dwMaxVideoFrameSize; __u32 dwMaxPayloadTransferSize; __u32 dwClockFrequency; __u8 bmFramingInfo; __u8 bPreferedVersion; __u8 bMinVersion; __u8 bMaxVersion; }; struct uvc_menu_info { __u32 value; __u8 name[32]; }; struct uvc_control_info { struct list_head list; struct list_head mappings; __u8 entity[16]; __u8 index; __u8 selector; __u16 size; __u32 flags; }; struct uvc_control_mapping { struct list_head list; struct uvc_control_info *ctrl; __u32 id; __u8 name[32]; __u8 entity[16]; __u8 selector; __u8 size; __u8 offset; enum v4l2_ctrl_type v4l2_type; enum uvc_control_data_type data_type; struct uvc_menu_info *menu_info; __u32 menu_count; }; struct uvc_control { struct uvc_entity *entity; struct uvc_control_info *info; __u8 index; /* Used to match the uvc_control entry with a uvc_control_info. */ __u8 dirty : 1, loaded : 1, modified : 1; __u8 *data; }; struct uvc_format_desc { char *name; __u8 guid[16]; __u32 fcc; }; /* The term 'entity' refers to both UVC units and UVC terminals. * * The type field is either the terminal type (wTerminalType in the terminal * descriptor), or the unit type (bDescriptorSubtype in the unit descriptor). * As the bDescriptorSubtype field is one byte long, the type value will * always have a null MSB for units. All terminal types defined by the UVC * specification have a non-null MSB, so it is safe to use the MSB to * differentiate between units and terminals as long as the descriptor parsing * code makes sure terminal types have a non-null MSB. * * For terminals, the type's most significant bit stores the terminal * direction (either UVC_TERM_INPUT or UVC_TERM_OUTPUT). The type field should * always be accessed with the UVC_ENTITY_* macros and never directly. */ struct uvc_entity { struct list_head list; /* Entity as part of a UVC device. */ struct list_head chain; /* Entity as part of a video device * chain. */ __u8 id; __u16 type; char name[64]; union { struct { __u16 wObjectiveFocalLengthMin; __u16 wObjectiveFocalLengthMax; __u16 wOcularFocalLength; __u8 bControlSize; __u8 *bmControls; } camera; struct { __u8 bControlSize; __u8 *bmControls; __u8 bTransportModeSize; __u8 *bmTransportModes; } media; struct { __u8 bSourceID; } output; struct { __u8 bSourceID; __u16 wMaxMultiplier; __u8 bControlSize; __u8 *bmControls; __u8 bmVideoStandards; } processing; struct { __u8 bNrInPins; __u8 *baSourceID; } selector; struct { __u8 guidExtensionCode[16]; __u8 bNumControls; __u8 bNrInPins; __u8 *baSourceID; __u8 bControlSize; __u8 *bmControls; __u8 *bmControlsType; } extension; }; unsigned int ncontrols; struct uvc_control *controls; }; struct uvc_frame { __u8 bFrameIndex; __u8 bmCapabilities; __u16 wWidth; __u16 wHeight; __u32 dwMinBitRate; __u32 dwMaxBitRate; __u32 dwMaxVideoFrameBufferSize; __u8 bFrameIntervalType; __u32 dwDefaultFrameInterval; __u32 *dwFrameInterval; }; struct uvc_format { __u8 type; __u8 index; __u8 bpp; __u8 colorspace; __u32 fcc; __u32 flags; char name[32]; unsigned int nframes; struct uvc_frame *frame; }; struct uvc_streaming_header { __u8 bNumFormats; __u8 bEndpointAddress; __u8 bTerminalLink; __u8 bControlSize; __u8 *bmaControls; /* The following fields are used by input headers only. */ __u8 bmInfo; __u8 bStillCaptureMethod; __u8 bTriggerSupport; __u8 bTriggerUsage; }; struct uvc_streaming { struct list_head list; struct usb_interface *intf; int intfnum; __u16 maxpsize; struct uvc_streaming_header header; unsigned int nformats; struct uvc_format *format; struct uvc_streaming_control ctrl; struct uvc_format *cur_format; struct uvc_frame *cur_frame; struct mutex mutex; }; enum uvc_buffer_state { UVC_BUF_STATE_IDLE = 0, UVC_BUF_STATE_QUEUED = 1, UVC_BUF_STATE_ACTIVE = 2, UVC_BUF_STATE_DONE = 3, UVC_BUF_STATE_ERROR = 4, }; struct uvc_buffer { unsigned long vma_use_count; struct list_head stream; /* Touched by interrupt handler. */ struct v4l2_buffer buf; struct list_head queue; wait_queue_head_t wait; enum uvc_buffer_state state; }; struct uvc_video_queue { void *mem; unsigned int streaming : 1, frozen : 1, drop_incomplete : 1; __u32 sequence; unsigned int count; unsigned int buf_size; struct uvc_buffer buffer[UVC_MAX_VIDEO_BUFFERS]; struct mutex mutex; /* protects buffers and mainqueue */ spinlock_t irqlock; /* protects irqqueue */ struct list_head mainqueue; struct list_head irqqueue; }; struct uvc_video_device { struct uvc_device *dev; struct video_device *vdev; atomic_t active; struct list_head iterms; struct uvc_entity *oterm; struct uvc_entity *processing; struct uvc_entity *selector; struct list_head extensions; struct mutex ctrl_mutex; struct uvc_video_queue queue; /* Video streaming object, must always be non-NULL. */ struct uvc_streaming *streaming; void (*decode) (struct urb *urb, struct uvc_video_device *video, struct uvc_buffer *buf); /* Context data used by the bulk completion handler. */ struct { __u8 header[256]; unsigned int header_size; int skip_payload; __u32 payload_size; __u32 max_payload_size; } bulk; struct urb *urb[UVC_URBS]; char *urb_buffer[UVC_URBS]; __u8 last_fid; }; enum uvc_device_state { UVC_DEV_DISCONNECTED = 1, }; struct uvc_device { struct usb_device *udev; struct usb_interface *intf; __u32 quirks; int intfnum; char name[32]; enum uvc_device_state state; struct kref kref; struct list_head list; /* Video control interface */ __u16 uvc_version; __u32 clock_frequency; struct list_head entities; struct uvc_video_device video; /* Status Interrupt Endpoint */ struct usb_host_endpoint *int_ep; struct urb *int_urb; __u8 status[16]; struct input_dev *input; /* Video Streaming interfaces */ struct list_head streaming; }; enum uvc_handle_state { UVC_HANDLE_PASSIVE = 0, UVC_HANDLE_ACTIVE = 1, }; struct uvc_fh { struct uvc_video_device *device; enum uvc_handle_state state; }; struct uvc_driver { struct usb_driver driver; struct mutex open_mutex; /* protects from open/disconnect race */ struct list_head devices; /* struct uvc_device list */ struct list_head controls; /* struct uvc_control_info list */ struct mutex ctrl_mutex; /* protects controls and devices lists */ }; /* ------------------------------------------------------------------------ * Debugging, printing and logging */ #define UVC_TRACE_PROBE (1 << 0) #define UVC_TRACE_DESCR (1 << 1) #define UVC_TRACE_CONTROL (1 << 2) #define UVC_TRACE_FORMAT (1 << 3) #define UVC_TRACE_CAPTURE (1 << 4) #define UVC_TRACE_CALLS (1 << 5) #define UVC_TRACE_IOCTL (1 << 6) #define UVC_TRACE_FRAME (1 << 7) #define UVC_TRACE_SUSPEND (1 << 8) #define UVC_TRACE_STATUS (1 << 9) extern unsigned int uvc_trace_param; #define uvc_trace(flag, msg...) \ do { \ if (uvc_trace_param & flag) \ printk(KERN_DEBUG "uvcvideo: " msg); \ } while (0) #define uvc_printk(level, msg...) \ printk(level "uvcvideo: " msg) #define UVC_GUID_FORMAT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" \ "%02x%02x%02x%02x%02x%02x" #define UVC_GUID_ARGS(guid) \ (guid)[3], (guid)[2], (guid)[1], (guid)[0], \ (guid)[5], (guid)[4], \ (guid)[7], (guid)[6], \ (guid)[8], (guid)[9], \ (guid)[10], (guid)[11], (guid)[12], \ (guid)[13], (guid)[14], (guid)[15] /* -------------------------------------------------------------------------- * Internal functions. */ /* Core driver */ extern struct uvc_driver uvc_driver; extern void uvc_delete(struct kref *kref); /* Video buffers queue management. */ extern void uvc_queue_init(struct uvc_video_queue *queue); extern int uvc_alloc_buffers(struct uvc_video_queue *queue, unsigned int nbuffers, unsigned int buflength); extern int uvc_free_buffers(struct uvc_video_queue *queue); extern int uvc_query_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf); extern int uvc_queue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf); extern int uvc_dequeue_buffer(struct uvc_video_queue *queue, struct v4l2_buffer *v4l2_buf, int nonblocking); extern int uvc_queue_enable(struct uvc_video_queue *queue, int enable); extern void uvc_queue_cancel(struct uvc_video_queue *queue); extern struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue, struct uvc_buffer *buf); extern unsigned int uvc_queue_poll(struct uvc_video_queue *queue, struct file *file, poll_table *wait); /* V4L2 interface */ extern struct file_operations uvc_fops; /* Video */ extern int uvc_video_init(struct uvc_video_device *video); extern int uvc_video_suspend(struct uvc_video_device *video); extern int uvc_video_resume(struct uvc_video_device *video); extern int uvc_video_enable(struct uvc_video_device *video, int enable); extern int uvc_probe_video(struct uvc_video_device *video, struct uvc_streaming_control *probe); extern int uvc_query_ctrl(struct uvc_device *dev, __u8 query, __u8 unit, __u8 intfnum, __u8 cs, void *data, __u16 size); extern int uvc_set_video_ctrl(struct uvc_video_device *video, struct uvc_streaming_control *ctrl, int probe); /* Status */ extern int uvc_status_init(struct uvc_device *dev); extern void uvc_status_cleanup(struct uvc_device *dev); extern int uvc_status_suspend(struct uvc_device *dev); extern int uvc_status_resume(struct uvc_device *dev); /* Controls */ extern struct uvc_control *uvc_find_control(struct uvc_video_device *video, __u32 v4l2_id, struct uvc_control_mapping **mapping); extern int uvc_query_v4l2_ctrl(struct uvc_video_device *video, struct v4l2_queryctrl *v4l2_ctrl); extern int uvc_ctrl_add_info(struct uvc_control_info *info); extern int uvc_ctrl_add_mapping(struct uvc_control_mapping *mapping); extern int uvc_ctrl_init_device(struct uvc_device *dev); extern void uvc_ctrl_cleanup_device(struct uvc_device *dev); extern int uvc_ctrl_resume_device(struct uvc_device *dev); extern void uvc_ctrl_init(void); extern int uvc_ctrl_begin(struct uvc_video_device *video); extern int __uvc_ctrl_commit(struct uvc_video_device *video, int rollback); static inline int uvc_ctrl_commit(struct uvc_video_device *video) { return __uvc_ctrl_commit(video, 0); } static inline int uvc_ctrl_rollback(struct uvc_video_device *video) { return __uvc_ctrl_commit(video, 1); } extern int uvc_ctrl_get(struct uvc_video_device *video, struct v4l2_ext_control *xctrl); extern int uvc_ctrl_set(struct uvc_video_device *video, struct v4l2_ext_control *xctrl); extern int uvc_xu_ctrl_query(struct uvc_video_device *video, struct uvc_xu_control *ctrl, int set); /* Utility functions */ extern void uvc_simplify_fraction(uint32_t *numerator, uint32_t *denominator, unsigned int n_terms, unsigned int threshold); extern uint32_t uvc_fraction_to_interval(uint32_t numerator, uint32_t denominator); extern struct usb_host_endpoint *uvc_find_endpoint( struct usb_host_interface *alts, __u8 epaddr); /* Quirks support */ void uvc_video_decode_isight(struct urb *urb, struct uvc_video_device *video, struct uvc_buffer *buf); #endif /* __KERNEL__ */ #endif luvcview-0.2.6/color.c0000644000175000017500000000765410764151556014207 0ustar aurel32aurel32/**************************************************************************** # GspcaGui: Gspca/Spca5xx Grabber # # Copyright (C) 2004 2005 2006 Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # ****************************************************************************/ #include #include #include #include "color.h" static int *LutYr = NULL; static int *LutYg = NULL;; static int *LutYb = NULL;; static int *LutVr = NULL;; static int *LutVrY = NULL;; static int *LutUb = NULL;; static int *LutUbY = NULL;; static int *LutRv = NULL; static int *LutGu = NULL; static int *LutGv = NULL; static int *LutBu = NULL; #if 0 #define RGB24_TO_Y(r,g,b) LutYr[(r)] + LutYg[(g)] + LutYb[(b)] #define YR_TO_V(r,y) LutVr[(r)] + LutVrY[(y)] #define YB_TO_U(b,y) LutUb[(b)] + LutUbY[(y)] #define R_FROMYV(y,v) CLIP((y) + LutRv[(v)]) #define G_FROMYUV(y,u,v) CLIP((y) + LutGu[(u)] + LutGv[(v)]) #define B_FROMYU(y,u) CLIP((y) + LutBu[(u)]) #endif unsigned char RGB24_TO_Y(unsigned char r, unsigned char g, unsigned char b) { return (LutYr[(r)] + LutYg[(g)] + LutYb[(b)]); } unsigned char YR_TO_V(unsigned char r, unsigned char y) { return (LutVr[(r)] + LutVrY[(y)]); } unsigned char YB_TO_U(unsigned char b, unsigned char y) { return (LutUb[(b)] + LutUbY[(y)]); } unsigned char R_FROMYV(unsigned char y, unsigned char v) { return CLIP((y) + LutRv[(v)]); } unsigned char G_FROMYUV(unsigned char y, unsigned char u, unsigned char v) { return CLIP((y) + LutGu[(u)] + LutGv[(v)]); } unsigned char B_FROMYU(unsigned char y, unsigned char u) { return CLIP((y) + LutBu[(u)]); } void initLut(void) { int i; #define Rcoef 299 #define Gcoef 587 #define Bcoef 114 #define Vrcoef 711 //656 //877 #define Ubcoef 560 //500 //493 564 #define CoefRv 1402 #define CoefGu 714 // 344 #define CoefGv 344 // 714 #define CoefBu 1772 LutYr = malloc(256*sizeof(int)); LutYg = malloc(256*sizeof(int)); LutYb = malloc(256*sizeof(int)); LutVr = malloc(256*sizeof(int)); LutVrY = malloc(256*sizeof(int)); LutUb = malloc(256*sizeof(int)); LutUbY = malloc(256*sizeof(int)); LutRv = malloc(256*sizeof(int)); LutGu = malloc(256*sizeof(int)); LutGv = malloc(256*sizeof(int)); LutBu = malloc(256*sizeof(int)); for (i= 0;i < 256;i++){ LutYr[i] = i*Rcoef/1000 ; LutYg[i] = i*Gcoef/1000 ; LutYb[i] = i*Bcoef/1000 ; LutVr[i] = i*Vrcoef/1000; LutUb[i] = i*Ubcoef/1000; LutVrY[i] = 128 -(i*Vrcoef/1000); LutUbY[i] = 128 -(i*Ubcoef/1000); LutRv[i] = (i-128)*CoefRv/1000; LutBu[i] = (i-128)*CoefBu/1000; LutGu[i] = (128-i)*CoefGu/1000; LutGv[i] = (128-i)*CoefGv/1000; } } void freeLut(void){ free(LutYr); free(LutYg); free(LutYb); free(LutVr); free(LutVrY); free(LutUb); free(LutUbY); free(LutRv); free(LutGu); free(LutGv); free(LutBu); } luvcview-0.2.6/dynctrl-logitech.h0000644000175000017500000000432311245455034016330 0ustar aurel32aurel32 /* * UVC dynamic control mapping header file * * This file has been dynamically generated using the include.xsl XSLT * transform stylesheet from a dynamic control mapping configuration file. * * Version: 1.0 * Author: Martin Rubli, Logitech * Contact: http://www.quickcamteam.net/ * Revision: 0.16 * * Copyright (c) 2006-2008 Logitech */ /* Start constants */ #ifndef UVC_GUID_LOGITECH_USER_HW_CONTROL #define UVC_GUID_LOGITECH_USER_HW_CONTROL { \ 0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x1f \ } #endif #ifndef UVC_GUID_LOGITECH_VIDEO_PIPE #define UVC_GUID_LOGITECH_VIDEO_PIPE { \ 0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x50 \ } #endif #ifndef UVC_GUID_LOGITECH_MOTOR_CONTROL #define UVC_GUID_LOGITECH_MOTOR_CONTROL { \ 0x82, 0x06, 0x61, 0x63, 0x70, 0x50, 0xab, 0x49, \ 0xb8, 0xcc, 0xb3, 0x85, 0x5e, 0x8d, 0x22, 0x56 \ } #endif #ifndef XU_HW_CONTROL_LED1 #define XU_HW_CONTROL_LED1 1 #endif #ifndef XU_COLOR_PROCESSING_DISABLE #define XU_COLOR_PROCESSING_DISABLE 5 #endif #ifndef XU_RAW_DATA_BITS_PER_PIXEL #define XU_RAW_DATA_BITS_PER_PIXEL 8 #endif #ifndef XU_MOTORCONTROL_PANTILT_RELATIVE #define XU_MOTORCONTROL_PANTILT_RELATIVE 1 #endif #ifndef XU_MOTORCONTROL_PANTILT_RESET #define XU_MOTORCONTROL_PANTILT_RESET 2 #endif #ifndef XU_MOTORCONTROL_FOCUS #define XU_MOTORCONTROL_FOCUS 3 #endif #ifndef V4L2_CID_PAN_RELATIVE #define V4L2_CID_PAN_RELATIVE 0x009A0904 #endif #ifndef V4L2_CID_TILT_RELATIVE #define V4L2_CID_TILT_RELATIVE 0x009A0905 #endif #ifndef V4L2_CID_PANTILT_RESET #define V4L2_CID_PANTILT_RESET 0x0A046D03 #endif #ifndef V4L2_CID_PAN_RESET #define V4L2_CID_PAN_RESET 0x009A0906 #endif #ifndef V4L2_CID_TILT_RESET #define V4L2_CID_TILT_RESET 0x009A0907 #endif #ifndef V4L2_CID_FOCUS #define V4L2_CID_FOCUS 0x0A046D04 #endif #ifndef V4L2_CID_LED1_MODE #define V4L2_CID_LED1_MODE 0x0A046D05 #endif #ifndef V4L2_CID_LED1_FREQUENCY #define V4L2_CID_LED1_FREQUENCY 0x0A046D06 #endif #ifndef V4L2_CID_DISABLE_PROCESSING #define V4L2_CID_DISABLE_PROCESSING 0x0A046D71 #endif #ifndef V4L2_CID_RAW_BITS_PER_PIXEL #define V4L2_CID_RAW_BITS_PER_PIXEL 0x0A046D72 #endif /* End constants */ luvcview-0.2.6/gui.h0000644000175000017500000000347510764151556013657 0ustar aurel32aurel32/******************************************************************************* # luvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # *******************************************************************************/ extern unsigned char *YUYVbutt; int creatButt(int width, int height); int destroyButt(void); luvcview-0.2.6/utils.h0000644000175000017500000000452210764151556014225 0ustar aurel32aurel32/******************************************************************************* # luvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # *******************************************************************************/ #define ERR_NO_SOI 1 #define ERR_NOT_8BIT 2 #define ERR_HEIGHT_MISMATCH 3 #define ERR_WIDTH_MISMATCH 4 #define ERR_BAD_WIDTH_OR_HEIGHT 5 #define ERR_TOO_MANY_COMPPS 6 #define ERR_ILLEGAL_HV 7 #define ERR_QUANT_TABLE_SELECTOR 8 #define ERR_NOT_YCBCR_221111 9 #define ERR_UNKNOWN_CID_IN_SCAN 10 #define ERR_NOT_SEQUENTIAL_DCT 11 #define ERR_WRONG_MARKER 12 #define ERR_NO_EOI 13 #define ERR_BAD_TABLES 14 #define ERR_DEPTH_MISMATCH 15 int jpeg_decode(unsigned char **pic, unsigned char *buf, int *width, int *height); int get_picture(unsigned char *buf,int size); int get_pictureYV2(unsigned char *buf,int width,int height); luvcview-0.2.6/README0000644000175000017500000000764210771616436013603 0ustar aurel32aurel32luvcview: SDL-based video grabber ================================= Copyright and license --------------------- Copyright (C) 2005-2008 Michel Xhaard This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Credits ------- Original code from spcaview: Copyright (C) 2003-2006 Michel Xhaard AVI writing code from Avilib: Copyright (C) 1999 Rainer Johanni SDL (Simple DirectMedia Layer) Contributions by: Laurent Pinchart, Linux UVC driver (http://linux-uvc.berlios.de/) Martin Rubli, Logitech (http://www.quickcamteam.net/) ... and many others whose names are in the ChangeLog. Download and support -------------------- Currently luvcview does not have an official website but the preferred way of posting questions and feedback is through the QuickCam Team forums: http://forums.quickcamteam.net/forumdisplay.php?fid=6 The latest version can be found in the Subversion repository at: http://svn.quickcamteam.net/svn/luvcview/ The current maintainer of luvcview is Michel Xhaard . Disclaimer ---------- Use this program as you see fit. We are not liable for damages or illegal use of it whatsoever. You are on your own. Use of this code is at your own risk. There is absolutely no warranty. Have fun with it! Building -------- Required libraries: - SDL (from http://www.libsdl.org/ or e.g. the libsdl1.2 Debian package) Required header files: - SDL (from http://www.libsdl.org/ or e.g. the libsdl1.2-dev Debian package) - uvcvideo (Linux UVC driver) - uvcdynctrl (part of libwebcam) The JPEG encoder and decoder are now part of the package to allow for a small footprint on embedded devices. libsdl provides the necessary layers to run on the Linux framebuffer or an X server. Important notes on the uvcvideo and uvcdynctrl dependencies: Compiling the luvcview sources requires three source files to be present. If you already have these projects on your system, you can link them, e.g. using the following commands: ln -s ~/uvcvideo/trunk/uvcvideo.h ln -s ~/uvcvideo/trunk/uvc_compat.h ln -s ~/libwebcam/Common/include/dynctrl-logitech.h Alternatively, the latest versions can be downloaded directly from the corresponding source code repositories: wget http://svn.berlios.de/svnroot/repos/linux-uvc/linux-uvc/trunk/uvcvideo.h wget http://svn.berlios.de/svnroot/repos/linux-uvc/linux-uvc/trunk/uvc_compat.h wget http://svn.quickcamteam.net/svn/qct/Linux/Common/include/dynctrl-logitech.h Once you have the SDL headers installed and the three above header files in the luvcview source directory you can continue as normal. To compile luvcview simply type: make To install it in /usr/local/bin type (as root): make install Usage ----- Run luvcview with the -h or --help command line options to get a list of supported command line options. In the GUI the following keys are supported: {SDLK_n, A_BRIGHTNESS_UP}, {SDLK_b, A_BRIGHTNESS_DOWN}, {SDLK_x, A_CONTRAST_UP}, {SDLK_w, A_CONTRAST_DOWN}, {SDLK_c, A_SATURATION_UP}, {SDLK_v, A_SATURATION_DOWN}, {SDLK_z, A_GAIN_UP}, {SDLK_a, A_GAIN_DOWN}, {SDLK_r, A_SHARPNESS_UP}, {SDLK_e, A_SHARPNESS_DOWN}, {SDLK_y, A_CUSTOM_A}, {SDLK_t, A_CUSTOM_B}, {SDLK_f, A_SWITCH_LIGHTFREQFILT}, {SDLK_s, A_SCREENSHOT}, {SDLK_p, A_RECORD_TOGGLE}, {SDLK_l, A_RESET}, {SDLK_q, A_QUIT}, {SDLK_F1, A_SAVE}, // save configuration {SDLK_F2, A_LOAD}, // restore configuration luvcview-0.2.6/luvcview.c0000644000175000017500000006606211125031102014703 0ustar aurel32aurel32/******************************************************************************* # luvcview: Sdl video Usb Video Class grabber . # #This package work with the Logitech UVC based webcams with the mjpeg feature. # #All the decoding is in user space with the embedded jpeg decoder # #. # # Copyright (C) 2005 2006 Laurent Pinchart && Michel Xhaard # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # # *******************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "v4l2uvc.h" #include "gui.h" #include "utils.h" #include "color.h" /* Fixed point arithmetic */ #define FIXED Sint32 #define FIXED_BITS 16 #define TO_FIXED(X) (((Sint32)(X))<<(FIXED_BITS)) #define FROM_FIXED(X) (((Sint32)(X))>>(FIXED_BITS)) #define INCPANTILT 64 // 1° typedef enum action_gui { /* 0..7..15 action top */ A_BRIGHTNESS_UP, A_CONTRAST_UP, A_SATURATION_UP, A_GAIN_UP, A_SHARPNESS_UP, A_GAMMA_UP, A_SCREENSHOT, A_RESET, A_PAN_UP, A_TILT_UP, A_PAN_RESET, A_SWITCH_LIGHTFREQFILT, A_EXPOSURE_UP, A_EXPOSURE_ON, A_BALANCE_UP, A_BALANCE_ON, /* 8..15 -> 16..31 action bottom */ A_BRIGHTNESS_DOWN, A_CONTRAST_DOWN, A_SATURATION_DOWN, A_GAIN_DOWN, A_SHARPNESS_DOWN, A_GAMMA_DOWN, A_RECORD_TOGGLE, A_QUIT, A_PAN_DOWN, A_TILT_DOWN, A_TILT_RESET, A_NOT1_DOWN, A_EXPOSURE_DOWN, A_EXPOSURE_OFF, A_BALANCE_DOWN, A_BALANCE_OFF, /* 16.. action others */ A_VIDEO, A_CAPTURE_FRAME, A_CAPTURE_STREAM, A_CAPTURE_FRAMESTREAM, A_SAVE, A_LOAD, A_LAST } action_gui; typedef struct act_title { action_gui action; char * title; } act_title; typedef struct key_action_t { SDLKey key; action_gui action; } key_action_t; key_action_t keyaction[] = { {SDLK_n, A_BRIGHTNESS_UP}, {SDLK_b, A_BRIGHTNESS_DOWN}, {SDLK_x, A_CONTRAST_UP}, {SDLK_w, A_CONTRAST_DOWN}, {SDLK_c, A_SATURATION_UP}, {SDLK_v, A_SATURATION_DOWN}, {SDLK_z, A_GAIN_UP}, {SDLK_a, A_GAIN_DOWN}, {SDLK_r, A_SHARPNESS_UP}, {SDLK_e, A_SHARPNESS_DOWN}, {SDLK_y, A_PAN_UP}, {SDLK_t, A_PAN_DOWN}, {SDLK_s, A_SCREENSHOT}, {SDLK_p, A_RECORD_TOGGLE}, {SDLK_f, A_SWITCH_LIGHTFREQFILT}, {SDLK_l, A_RESET}, {SDLK_q, A_QUIT}, {SDLK_m, A_VIDEO}, {SDLK_f, A_CAPTURE_FRAME}, {SDLK_i, A_CAPTURE_STREAM}, {SDLK_j, A_CAPTURE_FRAMESTREAM}, {SDLK_F1, A_SAVE}, {SDLK_F2, A_LOAD} }; act_title title_act[A_LAST] ={ /* 0..7..15 action top */ { A_BRIGHTNESS_UP,"Brightness Up"}, { A_CONTRAST_UP,"Contrast Up"}, { A_SATURATION_UP,"Saturation Up"}, { A_GAIN_UP,"Gain_Up"}, { A_SHARPNESS_UP,"Sharpness Up"}, { A_GAMMA_UP,"Gamma Up"}, { A_SCREENSHOT,"Take a Picture!!"}, { A_RESET,"Reset All to Default !!"}, { A_PAN_UP,"Pan +angle"}, { A_TILT_UP,"Tilt +angle"}, { A_PAN_RESET,"Pan reset"}, { A_SWITCH_LIGHTFREQFILT,"Switch light freq filter"}, { A_EXPOSURE_UP,"Exposure Up"}, { A_EXPOSURE_ON,"Auto Exposure On"}, { A_BALANCE_UP,"White Balance Up"}, { A_BALANCE_ON,"Auto White Balance On"}, /* 8..15 -> 16..31 action bottom */ { A_BRIGHTNESS_DOWN,"Brightness Down"}, { A_CONTRAST_DOWN,"Contrast Down"}, { A_SATURATION_DOWN,"Saturation Down"}, { A_GAIN_DOWN,"Gain Down"}, { A_SHARPNESS_DOWN,"Sharpness Down"}, { A_GAMMA_DOWN,"Gamma Down"}, { A_RECORD_TOGGLE,"AVI Start/Stop"}, { A_QUIT,"Quit Happy, Bye Bye:)"}, { A_PAN_DOWN,"Pan -angle"}, { A_TILT_DOWN,"Tilt -angle"}, { A_TILT_RESET,"Tilt Reset"}, { A_NOT1_DOWN,"Nothing"}, { A_EXPOSURE_DOWN,"Exposure Down"}, { A_EXPOSURE_OFF,"Auto Exposure OFF"}, { A_BALANCE_DOWN,"White Balance Down"}, { A_BALANCE_OFF,"Auto White Balance OFF"}, /* 16.. action others */ { A_VIDEO,"LUVCview (c) Michel Xhaard"}, { A_CAPTURE_FRAME, "Single frame captured" }, { A_CAPTURE_STREAM, "Stream capture" }, { A_CAPTURE_FRAMESTREAM, "Frame stream capture" }, { A_SAVE, "Saved Configuration" }, { A_LOAD, "Restored Configuration" } }; static const char version[] = VERSION; struct vdIn *videoIn; /* Translates screen coordinates into buttons */ action_gui GUI_whichbutton(int x, int y, SDL_Surface * pscreen, struct vdIn *videoIn); action_gui GUI_keytoaction(SDLKey key); struct pt_data { SDL_Surface **ptscreen; SDL_Event *ptsdlevent; SDL_Rect *drect; struct vdIn *ptvideoIn; float frmrate; SDL_mutex *affmutex; } ptdata; static int eventThread(void *data); static Uint32 SDL_VIDEO_Flags = SDL_ANYFORMAT | SDL_DOUBLEBUF | SDL_RESIZABLE; int main(int argc, char *argv[]) { const SDL_VideoInfo *info; char driver[128]; SDL_Surface *pscreen; SDL_Overlay *overlay; SDL_Rect drect; SDL_Event sdlevent; SDL_Thread *mythread; SDL_mutex *affmutex; int status; Uint32 currtime; Uint32 lasttime; unsigned char *p = NULL; int hwaccel = 0; const char *videodevice = NULL; const char *mode = NULL; int format = V4L2_PIX_FMT_MJPEG; int i; int grabmethod = 1; int width = 640; int height = 480; float fps = 30.0; // Requested frame rate float frmrate = 0.0; // Measured frame rate char *avifilename = NULL; int queryformats = 0; int querycontrols = 0; int readconfigfile = 0; char *separateur; char *sizestring = NULL; char *fpsstring = NULL; int enableRawStreamCapture = 0; int enableRawFrameCapture = 0; printf("luvcview %s\n\n", version); for (i = 1; i < argc; i++) { /* skip bad arguments */ if (argv[i] == NULL || *argv[i] == 0 || *argv[i] != '-') { continue; } if (strcmp(argv[i], "-d") == 0) { if (i + 1 >= argc) { printf("No parameter specified with -d, aborting.\n"); exit(1); } videodevice = strdup(argv[i + 1]); } if (strcmp(argv[i], "-g") == 0) { /* Ask for read instead default mmap */ grabmethod = 0; } if (strcmp(argv[i], "-w") == 0) { /* disable hw acceleration */ hwaccel = 1; } if (strcmp(argv[i], "-f") == 0) { if (i + 1 >= argc) { printf("No parameter specified with -f, aborting.\n"); exit(1); } mode = argv[i + 1]; if (strcasecmp(mode, "yuv") == 0 || strcasecmp(mode, "YUYV") == 0) { format = V4L2_PIX_FMT_YUYV; } else if (strcasecmp(mode, "jpg") == 0 || strcasecmp(mode, "MJPG") == 0) { format = V4L2_PIX_FMT_MJPEG; } else { printf("Unknown format specified. Aborting.\n"); exit(1); } } if (strcmp(argv[i], "-s") == 0) { if (i + 1 >= argc) { printf("No parameter specified with -s, aborting.\n"); exit(1); } sizestring = strdup(argv[i + 1]); width = strtoul(sizestring, &separateur, 10); if (*separateur != 'x') { printf("Error in size use -s widthxheight\n"); exit(1); } else { ++separateur; height = strtoul(separateur, &separateur, 10); if (*separateur != 0) printf("hmm.. dont like that!! trying this height\n"); } } if (strcmp(argv[i], "-i") == 0){ if (i + 1 >= argc) { printf("No parameter specified with -i, aborting.\n"); exit(1); } fpsstring = argv[i + 1]; fps = strtof(fpsstring, &separateur); if(*separateur != '\0') { printf("Invalid frame rate '%s' specified with -i. " "Only numbers are supported. Aborting.\n", fpsstring); exit(1); } } if (strcmp(argv[i], "-S") == 0) { /* Enable raw stream capture from the start */ enableRawStreamCapture = 1; } if (strcmp(argv[i], "-c") == 0) { /* Enable raw frame capture for the first frame */ enableRawFrameCapture = 1; } if (strcmp(argv[i], "-C") == 0) { /* Enable raw frame stream capture from the start*/ enableRawFrameCapture = 2; } if (strcmp(argv[i], "-o") == 0) { /* set the avi filename */ if (i + 1 >= argc) { printf("No parameter specified with -o, aborting.\n"); exit(1); } avifilename = strdup(argv[i + 1]); } if (strcmp(argv[i], "-L") == 0) { /* query list of valid video formats */ queryformats = 1; } if (strcmp(argv[i], "-l") == 0) { /* query list of valid video formats */ querycontrols = 1; } if (strcmp(argv[i], "-r") == 0) { /* query list of valid video formats */ readconfigfile = 1; } if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { printf("usage: uvcview [-h -d -g -f -s -i -c -o -C -S -L -l -r]\n"); printf("-h print this message\n"); printf("-d /dev/videoX use videoX device\n"); printf("-g use read method for grab instead mmap\n"); printf("-w disable SDL hardware accel.\n"); printf("-f choose video format (YUYV/yuv and MJPG/jpg are valid, MJPG is default)\n"); printf("-i fps use specified frame rate\n"); printf("-s widthxheight use specified input size\n"); printf("-c enable raw frame capturing for the first frame\n"); printf("-C enable raw frame stream capturing from the start\n"); printf("-S enable raw stream capturing from the start\n"); printf("-o avifile create avifile, default video.avi\n"); printf("-L query valid video formats\n"); printf("-l query valid controls and settings\n"); printf("-r read and set control settings from luvcview.cfg (save/restore with F1/F2)\n"); exit(0); } } /************* Test SDL capabilities ************/ if (SDL_Init(SDL_INIT_VIDEO) < 0) { fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError()); exit(1); } /* For this version, we'll be save and disable hardware acceleration */ if(hwaccel) if ( ! getenv("SDL_VIDEO_YUV_HWACCEL") ) { putenv("SDL_VIDEO_YUV_HWACCEL=0"); } printf("SDL information:\n"); if (SDL_VideoDriverName(driver, sizeof(driver))) { printf(" Video driver: %s\n", driver); } info = SDL_GetVideoInfo(); if (info->wm_available) { printf(" A window manager is available\n"); } if (info->hw_available) { printf(" Hardware surfaces are available (%dk video memory)\n", info->video_mem); SDL_VIDEO_Flags |= SDL_HWSURFACE; } if (info->blit_hw) { printf(" Copy blits between hardware surfaces are accelerated\n"); SDL_VIDEO_Flags |= SDL_ASYNCBLIT; } if (info->blit_hw_CC) { printf (" Colorkey blits between hardware surfaces are accelerated\n"); } if (info->blit_hw_A) { printf(" Alpha blits between hardware surfaces are accelerated\n"); } if (info->blit_sw) { printf (" Copy blits from software surfaces to hardware surfaces are accelerated\n"); } if (info->blit_sw_CC) { printf (" Colorkey blits from software surfaces to hardware surfaces are accelerated\n"); } if (info->blit_sw_A) { printf (" Alpha blits from software surfaces to hardware surfaces are accelerated\n"); } if (info->blit_fill) { printf(" Color fills on hardware surfaces are accelerated\n"); } if (!(SDL_VIDEO_Flags & SDL_HWSURFACE)) SDL_VIDEO_Flags |= SDL_SWSURFACE; if (videodevice == NULL || *videodevice == 0) { videodevice = "/dev/video0"; } if (avifilename == NULL || *avifilename == 0) { avifilename = "video.avi"; } videoIn = (struct vdIn *) calloc(1, sizeof(struct vdIn)); if ( queryformats ) { /* if we're supposed to list the video formats, do that now and go out */ check_videoIn(videoIn,(char *) videodevice); free(videoIn); SDL_Quit(); exit(1); } if (init_videoIn (videoIn, (char *) videodevice, width, height, fps, format, grabmethod, avifilename) < 0) exit(1); /* if we're supposed to list the controls, do that now */ if ( querycontrols ) enum_controls(videoIn->fd); /* if we're supposed to read the control settings from a configfile, do that now */ if ( readconfigfile ) load_controls(videoIn->fd); pscreen = SDL_SetVideoMode(videoIn->width, videoIn->height + 32, 0, SDL_VIDEO_Flags); overlay = SDL_CreateYUVOverlay(videoIn->width, videoIn->height + 32, SDL_YUY2_OVERLAY, pscreen); p = (unsigned char *) overlay->pixels[0]; drect.x = 0; drect.y = 0; drect.w = pscreen->w; drect.h = pscreen->h; if (enableRawStreamCapture) { videoIn->captureFile = fopen("stream.raw", "wb"); if(videoIn->captureFile == NULL) { perror("Unable to open file for raw stream capturing"); } else { printf("Starting raw stream capturing to stream.raw ...\n"); } } if (enableRawFrameCapture) videoIn->rawFrameCapture = enableRawFrameCapture; initLut(); SDL_WM_SetCaption(title_act[A_VIDEO].title, NULL); lasttime = SDL_GetTicks(); creatButt(videoIn->width, 32); SDL_LockYUVOverlay(overlay); memcpy(p + (videoIn->width * (videoIn->height) * 2), YUYVbutt, videoIn->width * 64); SDL_UnlockYUVOverlay(overlay); /* initialize thread data */ ptdata.ptscreen = &pscreen; ptdata.ptvideoIn = videoIn; ptdata.ptsdlevent = &sdlevent; ptdata.drect = &drect; affmutex = SDL_CreateMutex(); ptdata.affmutex = affmutex; mythread = SDL_CreateThread(eventThread, (void *) &ptdata); // Initialize frame rate calculator int loop_counter = 0; const int frmrate_update = videoIn->fps / 2; lasttime = SDL_GetTicks(); // [ms] /* main big loop */ while (videoIn->signalquit) { // Measure the frame rate every (fps/2) frames if(loop_counter ++ % frmrate_update == 0) { currtime = SDL_GetTicks(); // [ms] if (currtime - lasttime > 0) { frmrate = frmrate_update * (1000.0 / (currtime - lasttime)); } lasttime = currtime; } if (uvcGrab(videoIn) < 0) { printf("Error grabbing\n"); break; } /* if we're grabbing video, show the frame rate */ if (videoIn->toggleAvi) printf("\rframe rate: %g ", frmrate); SDL_LockYUVOverlay(overlay); memcpy(p, videoIn->framebuffer, videoIn->width * (videoIn->height) * 2); SDL_UnlockYUVOverlay(overlay); SDL_DisplayYUVOverlay(overlay, &drect); if (videoIn->getPict) { switch(videoIn->formatIn){ case V4L2_PIX_FMT_MJPEG: get_picture(videoIn->tmpbuffer,videoIn->buf.bytesused); break; case V4L2_PIX_FMT_YUYV: get_pictureYV2(videoIn->framebuffer,videoIn->width,videoIn->height); break; default: break; } videoIn->getPict = 0; printf("get picture !\n"); } SDL_LockMutex(affmutex); ptdata.frmrate = frmrate; SDL_WM_SetCaption(videoIn->status, NULL); SDL_UnlockMutex(affmutex); SDL_Delay(10); } SDL_WaitThread(mythread, &status); SDL_DestroyMutex(affmutex); /* if avifile is defined, we made a video: compute the exact fps and set it in the video */ if (videoIn->avifile != NULL) { float fps=(videoIn->framecount/(videoIn->recordtime/1000)); fprintf(stderr,"setting fps to %f\n",fps); AVI_set_video(videoIn->avifile, videoIn->width, videoIn->height, fps, "MJPG"); AVI_close(videoIn->avifile); } close_v4l2(videoIn); free(videoIn); destroyButt(); freeLut(); printf("Cleanup done. Exiting ...\n"); SDL_Quit(); } action_gui GUI_whichbutton(int x, int y, SDL_Surface * pscreen, struct vdIn *videoIn) { int nbutton, retval; FIXED scaleh = TO_FIXED(pscreen->h) / (videoIn->height + 32); int nheight = FROM_FIXED(scaleh * videoIn->height); if (y < nheight) return (A_VIDEO); nbutton = FROM_FIXED(scaleh * 32); /* 8 buttons across the screen, corresponding to 0-7 extand to 16*/ retval = (x * 16) / (pscreen->w); /* Bottom half of the button denoted by flag|0x10 */ if (y > (nheight + (nbutton / 2))) retval |= 0x10; return ((action_gui) retval); } action_gui GUI_keytoaction(SDLKey key) { int i = 0; while(keyaction[i].key){ if (keyaction[i].key == key) return (keyaction[i].action); i++; } return (A_VIDEO); } static int eventThread(void *data) { struct pt_data *gdata = (struct pt_data *) data; struct v4l2_control control; SDL_Surface *pscreen = *gdata->ptscreen; struct vdIn *videoIn = gdata->ptvideoIn; SDL_Event *sdlevent = gdata->ptsdlevent; SDL_Rect *drect = gdata->drect; SDL_mutex *affmutex = gdata->affmutex; int x, y; int mouseon = 0; int value = 0; int len = 0; short incpantilt = INCPANTILT; int boucle = 0; action_gui curr_action = A_VIDEO; while (videoIn->signalquit) { SDL_LockMutex(affmutex); float frmrate = gdata->frmrate; while (SDL_PollEvent(sdlevent)) { //scan the event queue switch (sdlevent->type) { case SDL_KEYUP: case SDL_MOUSEBUTTONUP: mouseon = 0; incpantilt = INCPANTILT; boucle = 0; break; case SDL_MOUSEBUTTONDOWN: mouseon = 1; case SDL_MOUSEMOTION: SDL_GetMouseState(&x, &y); curr_action = GUI_whichbutton(x, y, pscreen, videoIn); break; case SDL_VIDEORESIZE: pscreen = SDL_SetVideoMode(sdlevent->resize.w, sdlevent->resize.h, 0, SDL_VIDEO_Flags); drect->w = sdlevent->resize.w; drect->h = sdlevent->resize.h; break; case SDL_KEYDOWN: curr_action = GUI_keytoaction(sdlevent->key.keysym.sym); if (curr_action != A_VIDEO) mouseon = 1; break; case SDL_QUIT: printf("\nQuit signal received.\n"); videoIn->signalquit = 0; break; } } //end if poll SDL_UnlockMutex(affmutex); /* traiter les actions */ value = 0; if (mouseon){ boucle++; switch (curr_action) { case A_BRIGHTNESS_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_BRIGHTNESS)) < 0) printf("Set Brightness up error\n"); break; case A_CONTRAST_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_CONTRAST)) < 0) printf("Set Contrast up error\n"); break; case A_SATURATION_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_SATURATION)) < 0) printf("Set Saturation up error\n"); break; case A_GAIN_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_GAIN)) < 0) printf("Set Gain up error\n"); break; case A_SHARPNESS_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_SHARPNESS)) < 0) printf("Set Sharpness up error\n"); break; case A_GAMMA_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_GAMMA)) < 0) printf("Set Gamma up error\n"); break; /* Motor control events */ case A_PAN_UP: if ((value = v4L2UpDownPan(videoIn, -incpantilt)) < 0) printf("Set Pan up error\n"); break; case A_PAN_DOWN: if ((value = v4L2UpDownPan(videoIn, incpantilt)) < 0) printf("Set Pan down error\n"); break; case A_TILT_UP: if ((value = v4L2UpDownTilt(videoIn, -incpantilt)) < 0) printf("Set Tilt up error\n"); break; case A_TILT_DOWN: if ((value = v4L2UpDownTilt(videoIn, incpantilt)) < 0) printf("Set Tilt down error\n"); break; case A_PAN_RESET: if (v4l2ResetPan(videoIn) < 0) printf("Reset pan error\n"); break; case A_TILT_RESET: if (v4l2ResetTilt(videoIn) < 0) printf("Reset tilt error\n"); break; case A_SCREENSHOT: SDL_Delay(200); videoIn->getPict = 1; value = 1; break; case A_RESET: if (v4l2ResetControl(videoIn, V4L2_CID_BRIGHTNESS) < 0) printf("reset Brightness error\n"); if (v4l2ResetControl(videoIn, V4L2_CID_SATURATION) < 0) printf("reset Saturation error\n"); if (v4l2ResetControl(videoIn, V4L2_CID_CONTRAST) < 0) printf("reset Contrast error\n"); if (v4l2ResetControl(videoIn, V4L2_CID_HUE) < 0) printf("reset Hue error\n"); if (v4l2ResetControl(videoIn, V4L2_CID_SHARPNESS) < 0) printf("reset Sharpness error\n"); if (v4l2ResetControl(videoIn, V4L2_CID_GAMMA) < 0) printf("reset Gamma error\n"); if (v4l2ResetControl(videoIn, V4L2_CID_GAIN) < 0) printf("reset Gain error\n"); if (v4l2ResetPanTilt(videoIn) < 0) printf("reset pantilt error\n"); break; case A_BRIGHTNESS_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_BRIGHTNESS)) < 0) printf("Set Brightness down error\n"); break; case A_CONTRAST_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_CONTRAST)) < 0) printf("Set Contrast down error\n"); break; case A_SATURATION_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_SATURATION)) < 0) printf("Set Saturation down error\n"); break; case A_GAIN_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_GAIN)) < 0) printf("Set Gain down error\n"); break; case A_SHARPNESS_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_SHARPNESS)) < 0) printf("Set Sharpness down error\n"); break; case A_GAMMA_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_GAMMA)) < 0) printf("Set Gamma down error\n"); break; case A_RECORD_TOGGLE: SDL_Delay(200); videoIn->toggleAvi = !videoIn->toggleAvi; value = videoIn->toggleAvi; if ( value == 1 ) { printf("avi recording started\n"); videoIn->recordstart=SDL_GetTicks(); } else { int dur=SDL_GetTicks()-videoIn->recordstart; printf("\navi recording stopped (%ds)\n",dur/1000); videoIn->recordtime+=dur; } break; case A_SWITCH_LIGHTFREQFILT: if ((value =v4l2GetControl(videoIn,V4L2_CID_POWER_LINE_FREQUENCY)) < 0) printf("Get value of light frequency filter error\n"); if(value < 2) // round switch 50->60->NoFliker->. value++; // \_______________; else value=0; if(value == 0) printf("Current light frequency filter: 50Hz\n"); else if(value == 1) printf("Current light frequency filter: 60Hz\n"); else if(value == 2) printf("Current light frequency filter: NoFliker\n"); if ((value =v4l2SetLightFrequencyFilter(videoIn,value)) < 0) printf("Switch light frequency filter error\n"); break; case A_QUIT: videoIn->signalquit = 0; break; case A_VIDEO: break; case A_CAPTURE_FRAME: value = 1; videoIn->rawFrameCapture = 1; break; case A_CAPTURE_FRAMESTREAM: value = 1; if (!videoIn->rawFrameCapture) { videoIn->rawFrameCapture = 2; videoIn->rfsBytesWritten = 0; videoIn->rfsFramesWritten = 0; printf("Starting raw frame stream capturing ...\n"); } else if(videoIn->framesWritten >= 5) { videoIn->rawFrameCapture = 0; printf("Stopped raw frame stream capturing. %u bytes written for %u frames.\n", videoIn->rfsBytesWritten, videoIn->rfsFramesWritten); } break; case A_CAPTURE_STREAM: value = 1; if (videoIn->captureFile == NULL) { videoIn->captureFile = fopen("stream.raw", "wb"); if(videoIn->captureFile == NULL) { perror("Unable to open file for raw stream capturing"); } else { printf("Starting raw stream capturing to stream.raw ...\n"); } videoIn->bytesWritten = 0; videoIn->framesWritten = 0; } else if(videoIn->framesWritten >= 5) { fclose(videoIn->captureFile); printf("Stopped raw stream capturing to stream.raw. %u bytes written for %u frames.\n", videoIn->bytesWritten, videoIn->framesWritten); videoIn->captureFile = NULL; } break; case A_EXPOSURE_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_EXPOSURE_ABSOLUTE)) < 0) printf("Set Absolute Exposure up error\n"); break; case A_EXPOSURE_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_EXPOSURE_ABSOLUTE)) < 0) printf("Set Absolute Exposure down error\n"); break; case A_EXPOSURE_ON: control.id =V4L2_CID_EXPOSURE_AUTO; control.value =1; if ((value = ioctl(videoIn->fd, VIDIOC_S_CTRL, &control)) < 0) printf("Set Auto Exposure on error\n"); else printf("Auto Exposure set to %d\n", control.value); break; case A_EXPOSURE_OFF: control.id =V4L2_CID_EXPOSURE_AUTO; control.value =8; if ((value = ioctl(videoIn->fd, VIDIOC_S_CTRL, &control)) < 0) printf("Set Auto Exposure off error\n"); else printf("Auto Exposure set to %d\n", control.value); break; case A_BALANCE_UP: if ((value = v4l2UpControl(videoIn, V4L2_CID_WHITE_BALANCE_TEMPERATURE)) < 0) printf("Set Balance Temperature up error\n"); break; case A_BALANCE_DOWN: if ((value = v4l2DownControl(videoIn, V4L2_CID_WHITE_BALANCE_TEMPERATURE)) < 0) printf("Set Balance Temperature down error\n"); break; case A_BALANCE_ON: control.id =V4L2_CID_AUTO_WHITE_BALANCE; control.value =1; if ((value = ioctl(videoIn->fd, VIDIOC_S_CTRL, &control)) < 0) printf("Set Auto Balance on error\n"); else printf("Auto Balance set to %d\n", control.value); break; case A_BALANCE_OFF: control.id =V4L2_CID_AUTO_WHITE_BALANCE; control.value =0; if ((value = ioctl(videoIn->fd, VIDIOC_S_CTRL, &control)) < 0) printf("Set Auto Balance off error\n"); else printf("Auto Balance set to %d\n", control.value); break; case A_SAVE: printf("Save controls\n"); save_controls(videoIn->fd); break; case A_LOAD: printf("load controls\n"); load_controls(videoIn->fd); break; default: break; } if(!(boucle%10)) // smooth pan tilt method if(incpantilt < (10*INCPANTILT)) incpantilt += (INCPANTILT/4); if(value){ len = strlen(title_act[curr_action].title)+8; snprintf(videoIn->status, len,"%s %06d",title_act[curr_action].title,value); } } else { // mouseon len = 100 * sizeof(char); // as allocated in init_videoIn snprintf(videoIn->status, len, "%s, %.1f fps", title_act[curr_action].title, frmrate); } SDL_Delay(50); //printf("fp/s %d\n",frmrate); } //end main loop /* Close the stream capture file */ if (videoIn->captureFile) { fclose(videoIn->captureFile); printf("Stopped raw stream capturing to stream.raw. %u bytes written for %u frames.\n", videoIn->bytesWritten, videoIn->framesWritten); } /* Display stats for raw frame stream capturing */ if (videoIn->rawFrameCapture == 2) { printf("Stopped raw frame stream capturing. %u bytes written for %u frames.\n", videoIn->rfsBytesWritten, videoIn->rfsFramesWritten); } }