From: Roman Bazalevsky <rvb@rvb.name> Date: Sat, 6 Dec 2014 19:26:44 +0000 (+0300) Subject: Forked from git://github.com/merbanan/rtl_433.git X-Git-Url: https://git.rvb.name/rtl-433.git/commitdiff_plain/d608f7f08edef0577b9613f4ea36ffb7753287c3 Forked from git://github.com/merbanan/rtl_433.git - WH2 (Hame etc.) weather sensor protocol added - Sensors data printed to stdout instead of stderr - Unified single-line output format for simplified autoprocessing --- d608f7f08edef0577b9613f4ea36ffb7753287c3 diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..36da22f --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +Steve Markgraf <steve@steve-m.de> +Dimitri Stolnikov <horiz0n@gmx.net> +Hoernchen <la@tfc-server.de> +Kyle Keen <keenerd@gmail.com> diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..61ceb08 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,145 @@ +# Copyright 2012 OSMOCOM Project +# +# This file is part of rtl-sdr +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + + +######################################################################## +# Project setup +######################################################################## +cmake_minimum_required(VERSION 2.6) +project(rtlsdr C) + +#select the release build type by default to get optimization flags +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") + message(STATUS "Build type not specified: defaulting to release.") +endif(NOT CMAKE_BUILD_TYPE) +set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "") + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules) + +######################################################################## +# Compiler specific setup +######################################################################## +if(CMAKE_COMPILER_IS_GNUCC AND NOT WIN32) + ADD_DEFINITIONS(-Wall) + ADD_DEFINITIONS(-Wextra) + ADD_DEFINITIONS(-Wno-unused) + ADD_DEFINITIONS(-Wsign-compare) + ADD_DEFINITIONS(-g3 -O0) + #http://gcc.gnu.org/wiki/Visibility + add_definitions(-fvisibility=hidden) +endif() + +######################################################################## +# Find build dependencies +######################################################################## +find_package(PkgConfig) +find_package(LibUSB) +set(THREADS_USE_PTHREADS_WIN32 true) +find_package(Threads) + +if(NOT LIBUSB_FOUND) + message(FATAL_ERROR "LibUSB 1.0 required to compile rtl-sdr") +endif() +if(NOT THREADS_FOUND) + message(FATAL_ERROR "pthreads(-win32) required to compile rtl-sdr") +endif() +######################################################################## +# Setup the include and linker paths +######################################################################## +include_directories( + ${CMAKE_SOURCE_DIR}/include + ${LIBUSB_INCLUDE_DIR} + ${THREADS_PTHREADS_INCLUDE_DIR} +) + +#link_directories( +# ... +#) + +# Set component parameters +#set(INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/include CACHE INTERNAL "" FORCE) + +######################################################################## +# Create uninstall target +######################################################################## +configure_file( + ${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake +@ONLY) + +add_custom_target(uninstall + ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake +) + +######################################################################## +# Install udev rules +######################################################################## +option(INSTALL_UDEV_RULES "Install udev rules for RTL-SDR" OFF) +if (INSTALL_UDEV_RULES) + install ( + FILES rtl-sdr.rules + DESTINATION "/etc/udev/rules.d" + COMPONENT "udev" + ) +else (INSTALL_UDEV_RULES) + message (STATUS "Udev rules not being installed, install them with -DINSTALL_UDEV_RULES=ON") +endif (INSTALL_UDEV_RULES) + +######################################################################## +# Add subdirectories +######################################################################## +add_subdirectory(include) +add_subdirectory(src) + +######################################################################## +# Create Pkg Config File +######################################################################## +FOREACH(inc ${LIBUSB_INCLUDE_DIR}) + LIST(APPEND RTLSDR_PC_CFLAGS "-I${inc}") +ENDFOREACH(inc) + +FOREACH(lib ${LIBUSB_LIBRARY_DIRS}) + LIST(APPEND RTLSDR_PC_LIBS "-L${lib}") +ENDFOREACH(lib) + +# use space-separation format for the pc file +STRING(REPLACE ";" " " RTLSDR_PC_CFLAGS "${RTLSDR_PC_CFLAGS}") +STRING(REPLACE ";" " " RTLSDR_PC_LIBS "${RTLSDR_PC_LIBS}") + +# unset these vars to avoid hard-coded paths to cross environment +IF(CMAKE_CROSSCOMPILING) + UNSET(RTLSDR_PC_CFLAGS) + UNSET(RTLSDR_PC_LIBS) +ENDIF(CMAKE_CROSSCOMPILING) + +set(prefix ${CMAKE_INSTALL_PREFIX}) +set(exec_prefix \${prefix}) +set(libdir \${exec_prefix}/lib) +set(includedir \${prefix}/include) + +CONFIGURE_FILE( + ${CMAKE_CURRENT_SOURCE_DIR}/librtlsdr.pc.in + ${CMAKE_CURRENT_BINARY_DIR}/librtlsdr.pc +@ONLY) + +INSTALL( + FILES ${CMAKE_CURRENT_BINARY_DIR}/librtlsdr.pc + DESTINATION lib/pkgconfig +) diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + 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. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You 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. + + <signature of Ty Coon>, 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. diff --git a/Doxyfile.in b/Doxyfile.in new file mode 100644 index 0000000..9278d4e --- /dev/null +++ b/Doxyfile.in @@ -0,0 +1,1716 @@ +# Doxyfile 1.7.4 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = librtlsdr + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = @VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "RTL-SDR library" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command <command> <input-file>, where <command> is the value of +# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = include src + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = images/ + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command <filter> <input-file>, where <filter> +# is the value of the INPUT_FILTER tag, and <input-file> is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is adviced to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> +# Qt Help Project / Custom Filters</a>. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> +# Qt Help Project / Filter Attributes</a>. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = YES + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = NO + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = YES + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = NO + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = /usr/bin/dot + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..2ffa532 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,49 @@ +AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6 +ACLOCAL_AMFLAGS = -I m4 + +INCLUDES = $(all_includes) -I$(top_srcdir)/include +SUBDIRS = include src + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = librtlsdr.pc + +BUILT_SOURCES = $(top_srcdir)/.version +$(top_srcdir)/.version: + echo $(VERSION) > $@-t && mv $@-t $@ +dist-hook: + echo $(VERSION) > $(distdir)/.tarball-version + +install-udev-rules: + $(INSTALL_DATA) rtl-sdr.rules /etc/udev/rules.d + +uninstall-udev-rules: + rm -rf /etc/udev/rules.d/rtl-sdr.rules + +EXTRA_DIST = git-version-gen + +if HAVE_DOXYGEN + +pkgdocdir=$(docdir)/$(PACKAGE)-$(VERSION) +doc_htmldir=$(pkgdocdir)/html + +doc_html_DATA = $(top_builddir)/doc/html.tar + +$(doc_html_DATA): $(top_builddir)/doc/html/index.html + cd $(top_builddir)/doc && tar cf html.tar html + +$(top_builddir)/doc/html/index.html: $(SOURCES) Doxyfile + @rm -rf doc + mkdir -p doc + $(DOXYGEN) Doxyfile + +install-data-hook: + cd $(DESTDIR)$(doc_htmldir) && tar xf html.tar --strip-components 1 && rm -f html.tar + +uninstall-hook: + cd $(DESTDIR) && rm -rf $(doc_htmldir) + +DX_CLEAN = doc/{html,latex}/* doc/html.tar + +endif + +MOSTLYCLEANFILES = $(DX_CLEAN) diff --git a/README b/README new file mode 100644 index 0000000..acc298b --- /dev/null +++ b/README @@ -0,0 +1,31 @@ +rtl_433, turns your Realtek RTL2832 based DVB dongle into a 433.92MHz generic data receiver +====================================================================== + +Installation instructions: + +cd rtl_433/ +mkdir build +cd build +cmake ../ +make + + +Running: + +./rtl_433 -h + +Usage: [-d device_index (default: 0)] + [-g gain (default: 0 for auto)] + [-a analyze mode, print a textual description of the signal] + [-l change the detection level used to determine pulses (0-32000) default 10000] + [-f change the receive frequency, default is 433.92MHz] + [-S force sync output (default: async)] + [-r read data from file instead of from a receiver] + filename (a '-' dumps samples to stdout) + + +./rtl_433 -a will run in analyze mode and you will get a text log of the received signal. +./rtl_433 -a file_name will save the demodulated signal in a file. The format of the file is 48kHz 16 bit samples. +./rtl_433 will run the software in receive mode. Some sensor data can be receviced. + +This software is mostly useable for developers right now. diff --git a/build/CMakeCache.txt b/build/CMakeCache.txt new file mode 100644 index 0000000..592a85f --- /dev/null +++ b/build/CMakeCache.txt @@ -0,0 +1,350 @@ +# This is the CMakeCache file. +# For build in directory: /home/rvb/git/rtl_433/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING= + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//C compiler. +CMAKE_C_COMPILER:FILEPATH=/usr/bin/cc + +//Flags used by the compiler during all build types. +CMAKE_C_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_C_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release minsize builds. +CMAKE_C_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds (/MD /Ob1 /Oi +// /Ot /Oy /Gs will produce slightly less optimized but smaller +// files). +CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during Release with Debug Info builds. +CMAKE_C_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=rtlsdr + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING=' ' + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If true, cmake will use relative paths in makefiles and projects. +CMAKE_USE_RELATIVE_PATHS:BOOL=OFF + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Install udev rules for RTL-SDR +INSTALL_UDEV_RULES:BOOL=OFF + +//Path to a file. +LIBUSB_INCLUDE_DIR:PATH=/usr/include/libusb-1.0 + +//Path to a library. +LIBUSB_LIBRARIES:FILEPATH=/usr/lib/x86_64-linux-gnu/libusb-1.0.so + +//pkg-config executable +PKG_CONFIG_EXECUTABLE:FILEPATH=/usr/bin/pkg-config + +//Value Computed by CMake +rtlsdr_BINARY_DIR:STATIC=/home/rvb/git/rtl_433/build + +//Value Computed by CMake +rtlsdr_SOURCE_DIR:STATIC=/home/rvb/git/rtl_433 + +//Dependencies for the target +rtlsdr_shared_LIB_DEPENDS:STATIC=general;/usr/lib/x86_64-linux-gnu/libusb-1.0.so; + +//Dependencies for the target +rtlsdr_static_LIB_DEPENDS:STATIC=general;/usr/lib/x86_64-linux-gnu/libusb-1.0.so; + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_BUILD_TOOL +CMAKE_BUILD_TOOL-ADVANCED:INTERNAL=1 +//What is the target build tool cmake is generating for. +CMAKE_BUILD_TOOL:INTERNAL=/usr/bin/make +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/rvb/git/rtl_433/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=2 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=8 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=12 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_C_COMPILER +CMAKE_C_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS +CMAKE_C_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_DEBUG +CMAKE_C_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_MINSIZEREL +CMAKE_C_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELEASE +CMAKE_C_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_C_FLAGS_RELWITHDEBINFO +CMAKE_C_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Have library pthreads +CMAKE_HAVE_PTHREADS_CREATE:INTERNAL= +//Have library pthread +CMAKE_HAVE_PTHREAD_CREATE:INTERNAL=1 +//Have include pthread.h +CMAKE_HAVE_PTHREAD_H:INTERNAL=1 +//Start directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/rvb/git/rtl_433 +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_LOCAL_GENERATORS:INTERNAL=3 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-2.8 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_USE_RELATIVE_PATHS +CMAKE_USE_RELATIVE_PATHS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 +//Details about finding PkgConfig +FIND_PACKAGE_MESSAGE_DETAILS_PkgConfig:INTERNAL=[/usr/bin/pkg-config][v0.26()] +//Details about finding Threads +FIND_PACKAGE_MESSAGE_DETAILS_Threads:INTERNAL=[TRUE][v()] +//libusb-1.0 found +LIBUSB_FOUND:INTERNAL=TRUE +//ADVANCED property for variable: LIBUSB_INCLUDE_DIR +LIBUSB_INCLUDE_DIR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: LIBUSB_LIBRARIES +LIBUSB_LIBRARIES-ADVANCED:INTERNAL=1 +LIBUSB_PKG_CFLAGS:INTERNAL=-I/usr/include/libusb-1.0 +LIBUSB_PKG_CFLAGS_I:INTERNAL= +LIBUSB_PKG_CFLAGS_OTHER:INTERNAL= +LIBUSB_PKG_FOUND:INTERNAL=1 +LIBUSB_PKG_INCLUDEDIR:INTERNAL=/usr/include +LIBUSB_PKG_INCLUDE_DIRS:INTERNAL=/usr/include/libusb-1.0 +LIBUSB_PKG_LDFLAGS:INTERNAL=-lusb-1.0 +LIBUSB_PKG_LDFLAGS_OTHER:INTERNAL= +LIBUSB_PKG_LIBDIR:INTERNAL=/usr/lib/x86_64-linux-gnu +LIBUSB_PKG_LIBRARIES:INTERNAL=usb-1.0 +LIBUSB_PKG_LIBRARY_DIRS:INTERNAL= +LIBUSB_PKG_LIBS:INTERNAL= +LIBUSB_PKG_LIBS_L:INTERNAL= +LIBUSB_PKG_LIBS_OTHER:INTERNAL= +LIBUSB_PKG_LIBS_PATHS:INTERNAL= +LIBUSB_PKG_PREFIX:INTERNAL=/usr +LIBUSB_PKG_STATIC_CFLAGS:INTERNAL=-I/usr/include/libusb-1.0 +LIBUSB_PKG_STATIC_CFLAGS_I:INTERNAL= +LIBUSB_PKG_STATIC_CFLAGS_OTHER:INTERNAL= +LIBUSB_PKG_STATIC_INCLUDE_DIRS:INTERNAL=/usr/include/libusb-1.0 +LIBUSB_PKG_STATIC_LDFLAGS:INTERNAL=-pthread;-lusb-1.0;-ludev +LIBUSB_PKG_STATIC_LDFLAGS_OTHER:INTERNAL=-pthread +LIBUSB_PKG_STATIC_LIBDIR:INTERNAL= +LIBUSB_PKG_STATIC_LIBRARIES:INTERNAL=usb-1.0;udev +LIBUSB_PKG_STATIC_LIBRARY_DIRS:INTERNAL= +LIBUSB_PKG_STATIC_LIBS:INTERNAL= +LIBUSB_PKG_STATIC_LIBS_L:INTERNAL= +LIBUSB_PKG_STATIC_LIBS_OTHER:INTERNAL= +LIBUSB_PKG_STATIC_LIBS_PATHS:INTERNAL= +LIBUSB_PKG_VERSION:INTERNAL=1.0.17 +LIBUSB_PKG_libusb-1.0_INCLUDEDIR:INTERNAL= +LIBUSB_PKG_libusb-1.0_LIBDIR:INTERNAL= +LIBUSB_PKG_libusb-1.0_PREFIX:INTERNAL= +LIBUSB_PKG_libusb-1.0_VERSION:INTERNAL= +//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE +PKG_CONFIG_EXECUTABLE-ADVANCED:INTERNAL=1 +__pkg_config_checked_LIBUSB_PKG:INTERNAL=1 + diff --git a/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake b/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake new file mode 100644 index 0000000..83254ce --- /dev/null +++ b/build/CMakeFiles/2.8.12.2/CMakeCCompiler.cmake @@ -0,0 +1,56 @@ +set(CMAKE_C_COMPILER "/usr/bin/cc") +set(CMAKE_C_COMPILER_ARG1 "") +set(CMAKE_C_COMPILER_ID "GNU") +set(CMAKE_C_COMPILER_VERSION "4.8.2") +set(CMAKE_C_PLATFORM_ID "Linux") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCC 1) +set(CMAKE_C_COMPILER_LOADED 1) +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_C_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_C_COMPILER_ENV_VAR "CC") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_C_COMPILER_ID_RUN 1) +set(CMAKE_C_SOURCE_FILE_EXTENSIONS c) +set(CMAKE_C_IGNORE_EXTENSIONS h;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_C_LINKER_PREFERENCE 10) + +# Save compiler ABI information. +set(CMAKE_C_SIZEOF_DATA_PTR "8") +set(CMAKE_C_COMPILER_ABI "ELF") +set(CMAKE_C_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_C_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_C_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_C_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_C_COMPILER_ABI}") +endif() + +if(CMAKE_C_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + + + + +set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "c") +set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_C_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") + + + diff --git a/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin b/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin new file mode 100755 index 0000000..2f2ebe4 Binary files /dev/null and b/build/CMakeFiles/2.8.12.2/CMakeDetermineCompilerABI_C.bin differ diff --git a/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake b/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake new file mode 100644 index 0000000..e8bbe02 --- /dev/null +++ b/build/CMakeFiles/2.8.12.2/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-3.13.0-40-generic") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "3.13.0-40-generic") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-3.13.0-40-generic") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "3.13.0-40-generic") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c b/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c new file mode 100644 index 0000000..cba81d4 --- /dev/null +++ b/build/CMakeFiles/2.8.12.2/CompilerIdC/CMakeCCompilerId.c @@ -0,0 +1,389 @@ +#ifdef __cplusplus +# error "A C++ compiler has been selected for C." +#endif + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__18CXX) +# define ID_VOID_MAIN +#endif + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH HEX(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__WATCOMC__ % 100) + +#elif defined(__SUNPRO_C) +# define COMPILER_ID "SunPro" +# if __SUNPRO_C >= 0x5100 + /* __SUNPRO_C = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# else + /* __SUNPRO_C = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_C>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_C>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_C & 0xF) +# endif + +#elif defined(__HP_cc) +# define COMPILER_ID "HP" + /* __HP_cc = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_cc/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_cc/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_cc % 100) + +#elif defined(__DECC) +# define COMPILER_ID "Compaq" + /* __DECC_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECC_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECC_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECC_VER % 10000) + +#elif defined(__IBMC__) +# if defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" +# else +# if __IBMC__ >= 800 +# define COMPILER_ID "XL" +# else +# define COMPILER_ID "VisualAge" +# endif + /* __IBMC__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMC__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMC__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMC__ % 10) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__TINYC__) +# define COMPILER_ID "TinyCC" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +/* Analog VisualDSP++ >= 4.5.6 */ +#elif defined(__VISUALDSPVERSION__) +# define COMPILER_ID "ADSP" + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) + +/* Analog VisualDSP++ < 4.5.6 */ +#elif defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" + +/* IAR Systems compiler for embedded systems. + http://www.iar.com */ +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +/* sdcc, the small devices C compiler for embedded systems, + http://sdcc.sourceforge.net */ +#elif defined(SDCC) +# define COMPILER_ID "SDCC" + /* SDCC = VRP */ +# define COMPILER_VERSION_MAJOR DEC(SDCC/100) +# define COMPILER_VERSION_MINOR DEC(SDCC/10 % 10) +# define COMPILER_VERSION_PATCH DEC(SDCC % 10) + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + +/* This compiler is either not known or is too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" + +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# define ARCHITECTURE_ID "ARM" + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +/*--------------------------------------------------------------------------*/ + +#ifdef ID_VOID_MAIN +void main() {} +#else +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif + (void)argv; + return require; +} +#endif diff --git a/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out b/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out new file mode 100755 index 0000000..33a3d2b Binary files /dev/null and b/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out differ diff --git a/build/CMakeFiles/CMakeDirectoryInformation.cmake b/build/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..277cdd8 --- /dev/null +++ b/build/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Relative path conversion top directories. +SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/rvb/git/rtl_433") +SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/rvb/git/rtl_433/build") + +# Force unix paths in dependencies. +SET(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/CMakeFiles/CMakeError.log b/build/CMakeFiles/CMakeError.log new file mode 100644 index 0000000..7a9c36e --- /dev/null +++ b/build/CMakeFiles/CMakeError.log @@ -0,0 +1,19 @@ +Determining if the function pthread_create exists in the pthreads failed with the following output: +Change Dir: /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec505551368/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec505551368.dir/build.make CMakeFiles/cmTryCompileExec505551368.dir/build +make[1]: ÐÑ Ð¾Ð´ в каÑалог `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec505551368.dir/CheckFunctionExists.c.o +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTryCompileExec505551368.dir/CheckFunctionExists.c.o -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c +Linking C executable cmTryCompileExec505551368 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec505551368.dir/link.txt --verbose=1 +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTryCompileExec505551368.dir/CheckFunctionExists.c.o -o cmTryCompileExec505551368 -rdynamic -lpthreads +/usr/bin/ld: cannot find -lpthreads +collect2: error: ld returned 1 exit status +make[1]: *** [cmTryCompileExec505551368] ÐÑибка 1 +make[1]: ÐÑÑ Ð¾Ð´ из каÑалога `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' +make: *** [cmTryCompileExec505551368/fast] ÐÑибка 2 + + diff --git a/build/CMakeFiles/CMakeOutput.log b/build/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..440dd62 --- /dev/null +++ b/build/CMakeFiles/CMakeOutput.log @@ -0,0 +1,163 @@ +The system is: Linux - 3.13.0-40-generic - x86_64 +Compiling the C compiler identification source file "CMakeCCompilerId.c" succeeded. +Compiler: /usr/bin/cc +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the C compiler identification source "CMakeCCompilerId.c" produced "a.out" + +The C compiler identification is GNU, found in "/home/rvb/git/rtl_433/build/CMakeFiles/2.8.12.2/CompilerIdC/a.out" + +Determining if the C compiler works passed with the following output: +Change Dir: /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec101314951/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec101314951.dir/build.make CMakeFiles/cmTryCompileExec101314951.dir/build +make[1]: ÐÑ Ð¾Ð´ в каÑалог `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec101314951.dir/testCCompiler.c.o +/usr/bin/cc -o CMakeFiles/cmTryCompileExec101314951.dir/testCCompiler.c.o -c /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/testCCompiler.c +Linking C executable cmTryCompileExec101314951 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec101314951.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTryCompileExec101314951.dir/testCCompiler.c.o -o cmTryCompileExec101314951 -rdynamic +make[1]: ÐÑÑ Ð¾Ð´ из каÑалога `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' + + +Detecting C compiler ABI info compiled with the following output: +Change Dir: /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec2457921890/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec2457921890.dir/build.make CMakeFiles/cmTryCompileExec2457921890.dir/build +make[1]: ÐÑ Ð¾Ð´ в каÑалог `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o +/usr/bin/cc -o CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-2.8/Modules/CMakeCCompilerABI.c +Linking C executable cmTryCompileExec2457921890 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2457921890.dir/link.txt --verbose=1 +/usr/bin/cc -v CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec2457921890 -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/cc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec2457921890' '-rdynamic' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec2457921890 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o +make[1]: ÐÑÑ Ð¾Ð´ из каÑалога `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' + + +Parsed C implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:/usr/bin/make "cmTryCompileExec2457921890/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTryCompileExec2457921890.dir/build.make CMakeFiles/cmTryCompileExec2457921890.dir/build] + ignore line: [make[1]: ÐÑ Ð¾Ð´ в каÑалог `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp'] + ignore line: [/usr/bin/cmake -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/CMakeFiles 1] + ignore line: [Building C object CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o] + ignore line: [/usr/bin/cc -o CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o -c /usr/share/cmake-2.8/Modules/CMakeCCompilerABI.c] + ignore line: [Linking C executable cmTryCompileExec2457921890] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2457921890.dir/link.txt --verbose=1] + ignore line: [/usr/bin/cc -v CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o -o cmTryCompileExec2457921890 -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/cc] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTryCompileExec2457921890' '-rdynamic' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTryCompileExec2457921890 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/collect2] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTryCompileExec2457921890] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] + arg [CMakeFiles/cmTryCompileExec2457921890.dir/CMakeCCompilerABI.c.o] ==> ignore + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [-lc] ==> lib [c] + arg [-lgcc] ==> lib [gcc] + arg [--as-needed] ==> ignore + arg [-lgcc_s] ==> lib [gcc_s] + arg [--no-as-needed] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8] ==> [/usr/lib/gcc/x86_64-linux-gnu/4.8] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/4.8/../../..] ==> [/usr/lib] + implicit libs: [c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/4.8;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + +Determining if files pthread.h exist passed with the following output: +Change Dir: /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec2733461284/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec2733461284.dir/build.make CMakeFiles/cmTryCompileExec2733461284.dir/build +make[1]: ÐÑ Ð¾Ð´ в каÑалог `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec2733461284.dir/CheckIncludeFiles.c.o +/usr/bin/cc -o CMakeFiles/cmTryCompileExec2733461284.dir/CheckIncludeFiles.c.o -c /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/CheckIncludeFiles.c +Linking C executable cmTryCompileExec2733461284 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec2733461284.dir/link.txt --verbose=1 +/usr/bin/cc CMakeFiles/cmTryCompileExec2733461284.dir/CheckIncludeFiles.c.o -o cmTryCompileExec2733461284 -rdynamic +make[1]: ÐÑÑ Ð¾Ð´ из каÑалога `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' + + +Determining if the function pthread_create exists in the pthread passed with the following output: +Change Dir: /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp + +Run Build Command:/usr/bin/make "cmTryCompileExec3300727535/fast" +/usr/bin/make -f CMakeFiles/cmTryCompileExec3300727535.dir/build.make CMakeFiles/cmTryCompileExec3300727535.dir/build +make[1]: ÐÑ Ð¾Ð´ в каÑалог `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' +/usr/bin/cmake -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp/CMakeFiles 1 +Building C object CMakeFiles/cmTryCompileExec3300727535.dir/CheckFunctionExists.c.o +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create -o CMakeFiles/cmTryCompileExec3300727535.dir/CheckFunctionExists.c.o -c /usr/share/cmake-2.8/Modules/CheckFunctionExists.c +Linking C executable cmTryCompileExec3300727535 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTryCompileExec3300727535.dir/link.txt --verbose=1 +/usr/bin/cc -DCHECK_FUNCTION_EXISTS=pthread_create CMakeFiles/cmTryCompileExec3300727535.dir/CheckFunctionExists.c.o -o cmTryCompileExec3300727535 -rdynamic -lpthread +make[1]: ÐÑÑ Ð¾Ð´ из каÑалога `/home/rvb/git/rtl_433/build/CMakeFiles/CMakeTmp' + + diff --git a/build/CMakeFiles/CMakeRuleHashes.txt b/build/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 0000000..797a413 --- /dev/null +++ b/build/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,2 @@ +# Hashes of file build rules. +0db8b50fb6254a99627991da835cfe0c CMakeFiles/uninstall diff --git a/build/CMakeFiles/Makefile.cmake b/build/CMakeFiles/Makefile.cmake new file mode 100644 index 0000000..543e99a --- /dev/null +++ b/build/CMakeFiles/Makefile.cmake @@ -0,0 +1,65 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# The generator used is: +SET(CMAKE_DEPENDS_GENERATOR "Unix Makefiles") + +# The top level Makefile was generated from the following files: +SET(CMAKE_MAKEFILE_DEPENDS + "CMakeCache.txt" + "../CMakeLists.txt" + "CMakeFiles/2.8.12.2/CMakeCCompiler.cmake" + "CMakeFiles/2.8.12.2/CMakeSystem.cmake" + "../cmake/Modules/FindLibUSB.cmake" + "../cmake/Modules/FindThreads.cmake" + "../cmake/cmake_uninstall.cmake.in" + "../include/CMakeLists.txt" + "../librtlsdr.pc.in" + "../src/CMakeLists.txt" + "/usr/share/cmake-2.8/Modules/CMakeCInformation.cmake" + "/usr/share/cmake-2.8/Modules/CMakeCommonLanguageInclude.cmake" + "/usr/share/cmake-2.8/Modules/CMakeGenericSystem.cmake" + "/usr/share/cmake-2.8/Modules/CMakeParseArguments.cmake" + "/usr/share/cmake-2.8/Modules/CMakeSystemSpecificInformation.cmake" + "/usr/share/cmake-2.8/Modules/CheckIncludeFiles.cmake" + "/usr/share/cmake-2.8/Modules/CheckLibraryExists.cmake" + "/usr/share/cmake-2.8/Modules/Compiler/GNU-C.cmake" + "/usr/share/cmake-2.8/Modules/Compiler/GNU.cmake" + "/usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake" + "/usr/share/cmake-2.8/Modules/FindPackageMessage.cmake" + "/usr/share/cmake-2.8/Modules/FindPkgConfig.cmake" + "/usr/share/cmake-2.8/Modules/MultiArchCross.cmake" + "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU-C.cmake" + "/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake" + "/usr/share/cmake-2.8/Modules/Platform/Linux.cmake" + "/usr/share/cmake-2.8/Modules/Platform/UnixPaths.cmake" + ) + +# The corresponding makefile is: +SET(CMAKE_MAKEFILE_OUTPUTS + "Makefile" + "CMakeFiles/cmake.check_cache" + ) + +# Byproducts of CMake generate step: +SET(CMAKE_MAKEFILE_PRODUCTS + "cmake_uninstall.cmake" + "librtlsdr.pc" + "CMakeFiles/CMakeDirectoryInformation.cmake" + "include/CMakeFiles/CMakeDirectoryInformation.cmake" + "src/CMakeFiles/CMakeDirectoryInformation.cmake" + ) + +# Dependency information for all targets: +SET(CMAKE_DEPEND_INFO_FILES + "CMakeFiles/uninstall.dir/DependInfo.cmake" + "src/CMakeFiles/rtl_433.dir/DependInfo.cmake" + "src/CMakeFiles/rtl_adsb.dir/DependInfo.cmake" + "src/CMakeFiles/rtl_eeprom.dir/DependInfo.cmake" + "src/CMakeFiles/rtl_fm.dir/DependInfo.cmake" + "src/CMakeFiles/rtl_sdr.dir/DependInfo.cmake" + "src/CMakeFiles/rtl_tcp.dir/DependInfo.cmake" + "src/CMakeFiles/rtl_test.dir/DependInfo.cmake" + "src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + "src/CMakeFiles/rtlsdr_static.dir/DependInfo.cmake" + ) diff --git a/build/CMakeFiles/Makefile2 b/build/CMakeFiles/Makefile2 new file mode 100644 index 0000000..db11875 --- /dev/null +++ b/build/CMakeFiles/Makefile2 @@ -0,0 +1,456 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# The main recursive all target +all: +.PHONY : all + +# The main recursive preinstall target +preinstall: +.PHONY : preinstall + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +#============================================================================= +# Target rules for target CMakeFiles/uninstall.dir + +# All Build rule for target. +CMakeFiles/uninstall.dir/all: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/depend + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles + @echo "Built target uninstall" +.PHONY : CMakeFiles/uninstall.dir/all + +# Build rule for subdir invocation for target. +CMakeFiles/uninstall.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 + $(MAKE) -f CMakeFiles/Makefile2 CMakeFiles/uninstall.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : CMakeFiles/uninstall.dir/rule + +# Convenience name for target. +uninstall: CMakeFiles/uninstall.dir/rule +.PHONY : uninstall + +# clean rule for target. +CMakeFiles/uninstall.dir/clean: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/clean +.PHONY : CMakeFiles/uninstall.dir/clean + +# clean rule for target. +clean: CMakeFiles/uninstall.dir/clean +.PHONY : clean + +#============================================================================= +# Directory level rules for directory include + +# Convenience name for "all" pass in the directory. +include/all: +.PHONY : include/all + +# Convenience name for "clean" pass in the directory. +include/clean: +.PHONY : include/clean + +# Convenience name for "preinstall" pass in the directory. +include/preinstall: +.PHONY : include/preinstall + +#============================================================================= +# Directory level rules for directory src + +# Convenience name for "all" pass in the directory. +src/all: src/CMakeFiles/rtl_433.dir/all +src/all: src/CMakeFiles/rtl_adsb.dir/all +src/all: src/CMakeFiles/rtl_eeprom.dir/all +src/all: src/CMakeFiles/rtl_fm.dir/all +src/all: src/CMakeFiles/rtl_sdr.dir/all +src/all: src/CMakeFiles/rtl_tcp.dir/all +src/all: src/CMakeFiles/rtl_test.dir/all +src/all: src/CMakeFiles/rtlsdr_shared.dir/all +src/all: src/CMakeFiles/rtlsdr_static.dir/all +.PHONY : src/all + +# Convenience name for "clean" pass in the directory. +src/clean: src/CMakeFiles/rtl_433.dir/clean +src/clean: src/CMakeFiles/rtl_adsb.dir/clean +src/clean: src/CMakeFiles/rtl_eeprom.dir/clean +src/clean: src/CMakeFiles/rtl_fm.dir/clean +src/clean: src/CMakeFiles/rtl_sdr.dir/clean +src/clean: src/CMakeFiles/rtl_tcp.dir/clean +src/clean: src/CMakeFiles/rtl_test.dir/clean +src/clean: src/CMakeFiles/rtlsdr_shared.dir/clean +src/clean: src/CMakeFiles/rtlsdr_static.dir/clean +.PHONY : src/clean + +# Convenience name for "preinstall" pass in the directory. +src/preinstall: +.PHONY : src/preinstall + +#============================================================================= +# Target rules for target src/CMakeFiles/rtl_433.dir + +# All Build rule for target. +src/CMakeFiles/rtl_433.dir/all: src/CMakeFiles/rtlsdr_shared.dir/all + $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/depend + $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 1 + @echo "Built target rtl_433" +.PHONY : src/CMakeFiles/rtl_433.dir/all + +# Include target in all. +all: src/CMakeFiles/rtl_433.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtl_433.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 7 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_433.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtl_433.dir/rule + +# Convenience name for target. +rtl_433: src/CMakeFiles/rtl_433.dir/rule +.PHONY : rtl_433 + +# clean rule for target. +src/CMakeFiles/rtl_433.dir/clean: + $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/clean +.PHONY : src/CMakeFiles/rtl_433.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtl_433.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtl_adsb.dir + +# All Build rule for target. +src/CMakeFiles/rtl_adsb.dir/all: src/CMakeFiles/rtlsdr_shared.dir/all + $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/depend + $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 2 + @echo "Built target rtl_adsb" +.PHONY : src/CMakeFiles/rtl_adsb.dir/all + +# Include target in all. +all: src/CMakeFiles/rtl_adsb.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtl_adsb.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 7 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_adsb.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtl_adsb.dir/rule + +# Convenience name for target. +rtl_adsb: src/CMakeFiles/rtl_adsb.dir/rule +.PHONY : rtl_adsb + +# clean rule for target. +src/CMakeFiles/rtl_adsb.dir/clean: + $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/clean +.PHONY : src/CMakeFiles/rtl_adsb.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtl_adsb.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtl_eeprom.dir + +# All Build rule for target. +src/CMakeFiles/rtl_eeprom.dir/all: src/CMakeFiles/rtlsdr_shared.dir/all + $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/depend + $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 3 + @echo "Built target rtl_eeprom" +.PHONY : src/CMakeFiles/rtl_eeprom.dir/all + +# Include target in all. +all: src/CMakeFiles/rtl_eeprom.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtl_eeprom.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 7 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_eeprom.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtl_eeprom.dir/rule + +# Convenience name for target. +rtl_eeprom: src/CMakeFiles/rtl_eeprom.dir/rule +.PHONY : rtl_eeprom + +# clean rule for target. +src/CMakeFiles/rtl_eeprom.dir/clean: + $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/clean +.PHONY : src/CMakeFiles/rtl_eeprom.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtl_eeprom.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtl_fm.dir + +# All Build rule for target. +src/CMakeFiles/rtl_fm.dir/all: src/CMakeFiles/rtlsdr_shared.dir/all + $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/depend + $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 4 + @echo "Built target rtl_fm" +.PHONY : src/CMakeFiles/rtl_fm.dir/all + +# Include target in all. +all: src/CMakeFiles/rtl_fm.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtl_fm.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 7 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_fm.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtl_fm.dir/rule + +# Convenience name for target. +rtl_fm: src/CMakeFiles/rtl_fm.dir/rule +.PHONY : rtl_fm + +# clean rule for target. +src/CMakeFiles/rtl_fm.dir/clean: + $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/clean +.PHONY : src/CMakeFiles/rtl_fm.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtl_fm.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtl_sdr.dir + +# All Build rule for target. +src/CMakeFiles/rtl_sdr.dir/all: src/CMakeFiles/rtlsdr_shared.dir/all + $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/depend + $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 5 + @echo "Built target rtl_sdr" +.PHONY : src/CMakeFiles/rtl_sdr.dir/all + +# Include target in all. +all: src/CMakeFiles/rtl_sdr.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtl_sdr.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 7 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_sdr.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtl_sdr.dir/rule + +# Convenience name for target. +rtl_sdr: src/CMakeFiles/rtl_sdr.dir/rule +.PHONY : rtl_sdr + +# clean rule for target. +src/CMakeFiles/rtl_sdr.dir/clean: + $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/clean +.PHONY : src/CMakeFiles/rtl_sdr.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtl_sdr.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtl_tcp.dir + +# All Build rule for target. +src/CMakeFiles/rtl_tcp.dir/all: src/CMakeFiles/rtlsdr_shared.dir/all + $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/depend + $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 6 + @echo "Built target rtl_tcp" +.PHONY : src/CMakeFiles/rtl_tcp.dir/all + +# Include target in all. +all: src/CMakeFiles/rtl_tcp.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtl_tcp.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 7 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_tcp.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtl_tcp.dir/rule + +# Convenience name for target. +rtl_tcp: src/CMakeFiles/rtl_tcp.dir/rule +.PHONY : rtl_tcp + +# clean rule for target. +src/CMakeFiles/rtl_tcp.dir/clean: + $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/clean +.PHONY : src/CMakeFiles/rtl_tcp.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtl_tcp.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtl_test.dir + +# All Build rule for target. +src/CMakeFiles/rtl_test.dir/all: src/CMakeFiles/rtlsdr_shared.dir/all + $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/depend + $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 7 + @echo "Built target rtl_test" +.PHONY : src/CMakeFiles/rtl_test.dir/all + +# Include target in all. +all: src/CMakeFiles/rtl_test.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtl_test.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 7 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_test.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtl_test.dir/rule + +# Convenience name for target. +rtl_test: src/CMakeFiles/rtl_test.dir/rule +.PHONY : rtl_test + +# clean rule for target. +src/CMakeFiles/rtl_test.dir/clean: + $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/clean +.PHONY : src/CMakeFiles/rtl_test.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtl_test.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtlsdr_shared.dir + +# All Build rule for target. +src/CMakeFiles/rtlsdr_shared.dir/all: + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/depend + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 8 9 10 11 12 13 + @echo "Built target rtlsdr_shared" +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/all + +# Include target in all. +all: src/CMakeFiles/rtlsdr_shared.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtlsdr_shared.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 6 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtlsdr_shared.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/rule + +# Convenience name for target. +rtlsdr_shared: src/CMakeFiles/rtlsdr_shared.dir/rule +.PHONY : rtlsdr_shared + +# clean rule for target. +src/CMakeFiles/rtlsdr_shared.dir/clean: + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/clean +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtlsdr_shared.dir/clean +.PHONY : clean + +#============================================================================= +# Target rules for target src/CMakeFiles/rtlsdr_static.dir + +# All Build rule for target. +src/CMakeFiles/rtlsdr_static.dir/all: + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/depend + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/build + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles 14 15 16 17 18 19 + @echo "Built target rtlsdr_static" +.PHONY : src/CMakeFiles/rtlsdr_static.dir/all + +# Include target in all. +all: src/CMakeFiles/rtlsdr_static.dir/all +.PHONY : all + +# Build rule for subdir invocation for target. +src/CMakeFiles/rtlsdr_static.dir/rule: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 6 + $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtlsdr_static.dir/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : src/CMakeFiles/rtlsdr_static.dir/rule + +# Convenience name for target. +rtlsdr_static: src/CMakeFiles/rtlsdr_static.dir/rule +.PHONY : rtlsdr_static + +# clean rule for target. +src/CMakeFiles/rtlsdr_static.dir/clean: + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/clean +.PHONY : src/CMakeFiles/rtlsdr_static.dir/clean + +# clean rule for target. +clean: src/CMakeFiles/rtlsdr_static.dir/clean +.PHONY : clean + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/CMakeFiles/TargetDirectories.txt b/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..659fd5d --- /dev/null +++ b/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,10 @@ +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_433.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_adsb.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_eeprom.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_fm.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_sdr.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_tcp.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_test.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir +/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir +/home/rvb/git/rtl_433/build/CMakeFiles/uninstall.dir diff --git a/build/CMakeFiles/cmake.check_cache b/build/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/build/CMakeFiles/progress.marks b/build/CMakeFiles/progress.marks new file mode 100644 index 0000000..d6b2404 --- /dev/null +++ b/build/CMakeFiles/progress.marks @@ -0,0 +1 @@ +19 diff --git a/build/CMakeFiles/uninstall.dir/DependInfo.cmake b/build/CMakeFiles/uninstall.dir/DependInfo.cmake new file mode 100644 index 0000000..f60a001 --- /dev/null +++ b/build/CMakeFiles/uninstall.dir/DependInfo.cmake @@ -0,0 +1,17 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/CMakeFiles/uninstall.dir/build.make b/build/CMakeFiles/uninstall.dir/build.make new file mode 100644 index 0000000..cf0c099 --- /dev/null +++ b/build/CMakeFiles/uninstall.dir/build.make @@ -0,0 +1,66 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Utility rule file for uninstall. + +# Include the progress variables for this target. +include CMakeFiles/uninstall.dir/progress.make + +CMakeFiles/uninstall: + /usr/bin/cmake -P /home/rvb/git/rtl_433/build/cmake_uninstall.cmake + +uninstall: CMakeFiles/uninstall +uninstall: CMakeFiles/uninstall.dir/build.make +.PHONY : uninstall + +# Rule to build all files generated by this target. +CMakeFiles/uninstall.dir/build: uninstall +.PHONY : CMakeFiles/uninstall.dir/build + +CMakeFiles/uninstall.dir/clean: + $(CMAKE_COMMAND) -P CMakeFiles/uninstall.dir/cmake_clean.cmake +.PHONY : CMakeFiles/uninstall.dir/clean + +CMakeFiles/uninstall.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/CMakeFiles/uninstall.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : CMakeFiles/uninstall.dir/depend + diff --git a/build/CMakeFiles/uninstall.dir/cmake_clean.cmake b/build/CMakeFiles/uninstall.dir/cmake_clean.cmake new file mode 100644 index 0000000..828e2a2 --- /dev/null +++ b/build/CMakeFiles/uninstall.dir/cmake_clean.cmake @@ -0,0 +1,8 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/uninstall" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang) + INCLUDE(CMakeFiles/uninstall.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/CMakeFiles/uninstall.dir/progress.make b/build/CMakeFiles/uninstall.dir/progress.make new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/build/CMakeFiles/uninstall.dir/progress.make @@ -0,0 +1 @@ + diff --git a/build/Makefile b/build/Makefile new file mode 100644 index 0000000..5f680bc --- /dev/null +++ b/build/Makefile @@ -0,0 +1,307 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles /home/rvb/git/rtl_433/build/CMakeFiles/progress.marks + $(MAKE) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named uninstall + +# Build rule for target. +uninstall: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 uninstall +.PHONY : uninstall + +# fast build rule for target. +uninstall/fast: + $(MAKE) -f CMakeFiles/uninstall.dir/build.make CMakeFiles/uninstall.dir/build +.PHONY : uninstall/fast + +#============================================================================= +# Target rules for targets named rtl_433 + +# Build rule for target. +rtl_433: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtl_433 +.PHONY : rtl_433 + +# fast build rule for target. +rtl_433/fast: + $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/build +.PHONY : rtl_433/fast + +#============================================================================= +# Target rules for targets named rtl_adsb + +# Build rule for target. +rtl_adsb: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtl_adsb +.PHONY : rtl_adsb + +# fast build rule for target. +rtl_adsb/fast: + $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/build +.PHONY : rtl_adsb/fast + +#============================================================================= +# Target rules for targets named rtl_eeprom + +# Build rule for target. +rtl_eeprom: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtl_eeprom +.PHONY : rtl_eeprom + +# fast build rule for target. +rtl_eeprom/fast: + $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/build +.PHONY : rtl_eeprom/fast + +#============================================================================= +# Target rules for targets named rtl_fm + +# Build rule for target. +rtl_fm: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtl_fm +.PHONY : rtl_fm + +# fast build rule for target. +rtl_fm/fast: + $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/build +.PHONY : rtl_fm/fast + +#============================================================================= +# Target rules for targets named rtl_sdr + +# Build rule for target. +rtl_sdr: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtl_sdr +.PHONY : rtl_sdr + +# fast build rule for target. +rtl_sdr/fast: + $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/build +.PHONY : rtl_sdr/fast + +#============================================================================= +# Target rules for targets named rtl_tcp + +# Build rule for target. +rtl_tcp: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtl_tcp +.PHONY : rtl_tcp + +# fast build rule for target. +rtl_tcp/fast: + $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/build +.PHONY : rtl_tcp/fast + +#============================================================================= +# Target rules for targets named rtl_test + +# Build rule for target. +rtl_test: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtl_test +.PHONY : rtl_test + +# fast build rule for target. +rtl_test/fast: + $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/build +.PHONY : rtl_test/fast + +#============================================================================= +# Target rules for targets named rtlsdr_shared + +# Build rule for target. +rtlsdr_shared: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtlsdr_shared +.PHONY : rtlsdr_shared + +# fast build rule for target. +rtlsdr_shared/fast: + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/build +.PHONY : rtlsdr_shared/fast + +#============================================================================= +# Target rules for targets named rtlsdr_static + +# Build rule for target. +rtlsdr_static: cmake_check_build_system + $(MAKE) -f CMakeFiles/Makefile2 rtlsdr_static +.PHONY : rtlsdr_static + +# fast build rule for target. +rtlsdr_static/fast: + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/build +.PHONY : rtlsdr_static/fast + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... uninstall" + @echo "... rtl_433" + @echo "... rtl_adsb" + @echo "... rtl_eeprom" + @echo "... rtl_fm" + @echo "... rtl_sdr" + @echo "... rtl_tcp" + @echo "... rtl_test" + @echo "... rtlsdr_shared" + @echo "... rtlsdr_static" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/cmake_install.cmake b/build/cmake_install.cmake new file mode 100644 index 0000000..5cd8e65 --- /dev/null +++ b/build/cmake_install.cmake @@ -0,0 +1,55 @@ +# Install script for directory: /home/rvb/git/rtl_433 + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr/local") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Release") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig" TYPE FILE FILES "/home/rvb/git/rtl_433/build/librtlsdr.pc") +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + INCLUDE("/home/rvb/git/rtl_433/build/include/cmake_install.cmake") + INCLUDE("/home/rvb/git/rtl_433/build/src/cmake_install.cmake") + +ENDIF(NOT CMAKE_INSTALL_LOCAL_ONLY) + +IF(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +ELSE(CMAKE_INSTALL_COMPONENT) + SET(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +ENDIF(CMAKE_INSTALL_COMPONENT) + +FILE(WRITE "/home/rvb/git/rtl_433/build/${CMAKE_INSTALL_MANIFEST}" "") +FOREACH(file ${CMAKE_INSTALL_MANIFEST_FILES}) + FILE(APPEND "/home/rvb/git/rtl_433/build/${CMAKE_INSTALL_MANIFEST}" "${file}\n") +ENDFOREACH(file) diff --git a/build/cmake_uninstall.cmake b/build/cmake_uninstall.cmake new file mode 100644 index 0000000..edf516d --- /dev/null +++ b/build/cmake_uninstall.cmake @@ -0,0 +1,32 @@ +# http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F + +IF(NOT EXISTS "/home/rvb/git/rtl_433/build/install_manifest.txt") + MESSAGE(FATAL_ERROR "Cannot find install manifest: \"/home/rvb/git/rtl_433/build/install_manifest.txt\"") +ENDIF(NOT EXISTS "/home/rvb/git/rtl_433/build/install_manifest.txt") + +FILE(READ "/home/rvb/git/rtl_433/build/install_manifest.txt" files) +STRING(REGEX REPLACE "\n" ";" files "${files}") +FOREACH(file ${files}) + MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + IF(EXISTS "$ENV{DESTDIR}${file}") + EXEC_PROGRAM( + "/usr/bin/cmake" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF(NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF(NOT "${rm_retval}" STREQUAL 0) + ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}") + EXEC_PROGRAM( + "/usr/bin/cmake" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF(NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF(NOT "${rm_retval}" STREQUAL 0) + ELSE(EXISTS "$ENV{DESTDIR}${file}") + MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + ENDIF(EXISTS "$ENV{DESTDIR}${file}") +ENDFOREACH(file) diff --git a/build/include/CMakeFiles/CMakeDirectoryInformation.cmake b/build/include/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..277cdd8 --- /dev/null +++ b/build/include/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Relative path conversion top directories. +SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/rvb/git/rtl_433") +SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/rvb/git/rtl_433/build") + +# Force unix paths in dependencies. +SET(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/include/CMakeFiles/progress.marks b/build/include/CMakeFiles/progress.marks new file mode 100644 index 0000000..573541a --- /dev/null +++ b/build/include/CMakeFiles/progress.marks @@ -0,0 +1 @@ +0 diff --git a/build/include/Makefile b/build/include/Makefile new file mode 100644 index 0000000..11278e2 --- /dev/null +++ b/build/include/Makefile @@ -0,0 +1,167 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles /home/rvb/git/rtl_433/build/include/CMakeFiles/progress.marks + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 include/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 include/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 include/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 include/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/include/cmake_install.cmake b/build/include/cmake_install.cmake new file mode 100644 index 0000000..86256b8 --- /dev/null +++ b/build/include/cmake_install.cmake @@ -0,0 +1,41 @@ +# Install script for directory: /home/rvb/git/rtl_433/include + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr/local") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Release") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include" TYPE FILE FILES + "/home/rvb/git/rtl_433/include/rtl-sdr.h" + "/home/rvb/git/rtl_433/include/rtl-sdr_export.h" + ) +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + diff --git a/build/librtlsdr.pc b/build/librtlsdr.pc new file mode 100644 index 0000000..7f0f276 --- /dev/null +++ b/build/librtlsdr.pc @@ -0,0 +1,11 @@ +prefix=/usr/local +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: RTL-SDR Library +Description: C Utility Library +Version: +Cflags: -I${includedir}/ -I/usr/include/libusb-1.0 +Libs: -L${libdir} -lrtlsdr -lusb-1.0 +Libs.private: diff --git a/build/src/CMakeFiles/CMakeDirectoryInformation.cmake b/build/src/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..277cdd8 --- /dev/null +++ b/build/src/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Relative path conversion top directories. +SET(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/rvb/git/rtl_433") +SET(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/rvb/git/rtl_433/build") + +# Force unix paths in dependencies. +SET(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +SET(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +SET(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +SET(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +SET(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/build/src/CMakeFiles/progress.marks b/build/src/CMakeFiles/progress.marks new file mode 100644 index 0000000..d6b2404 --- /dev/null +++ b/build/src/CMakeFiles/progress.marks @@ -0,0 +1 @@ +19 diff --git a/build/src/CMakeFiles/rtl_433.dir/C.includecache b/build/src/CMakeFiles/rtl_433.dir/C.includecache new file mode 100644 index 0000000..4e6ee4d --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/C.includecache @@ -0,0 +1,46 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +/home/rvb/git/rtl_433/src/getopt/getopt.h +ctype.h +- + +/home/rvb/git/rtl_433/src/rtl_433.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +time.h +- +unistd.h +- +Windows.h +- +io.h +- +fcntl.h +- +getopt/getopt.h +/home/rvb/git/rtl_433/src/getopt/getopt.h +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h + diff --git a/build/src/CMakeFiles/rtl_433.dir/DependInfo.cmake b/build/src/CMakeFiles/rtl_433.dir/DependInfo.cmake new file mode 100644 index 0000000..9f4cb01 --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/rtl_433.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_433.dir/rtl_433.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtl_433.dir/build.make b/build/src/CMakeFiles/rtl_433.dir/build.make new file mode 100644 index 0000000..8907f6e --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/build.make @@ -0,0 +1,104 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtl_433.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtl_433.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtl_433.dir/flags.make + +src/CMakeFiles/rtl_433.dir/rtl_433.c.o: src/CMakeFiles/rtl_433.dir/flags.make +src/CMakeFiles/rtl_433.dir/rtl_433.c.o: ../src/rtl_433.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtl_433.dir/rtl_433.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtl_433.dir/rtl_433.c.o -c /home/rvb/git/rtl_433/src/rtl_433.c + +src/CMakeFiles/rtl_433.dir/rtl_433.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtl_433.dir/rtl_433.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/rtl_433.c > CMakeFiles/rtl_433.dir/rtl_433.c.i + +src/CMakeFiles/rtl_433.dir/rtl_433.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtl_433.dir/rtl_433.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/rtl_433.c -o CMakeFiles/rtl_433.dir/rtl_433.c.s + +src/CMakeFiles/rtl_433.dir/rtl_433.c.o.requires: +.PHONY : src/CMakeFiles/rtl_433.dir/rtl_433.c.o.requires + +src/CMakeFiles/rtl_433.dir/rtl_433.c.o.provides: src/CMakeFiles/rtl_433.dir/rtl_433.c.o.requires + $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/rtl_433.c.o.provides.build +.PHONY : src/CMakeFiles/rtl_433.dir/rtl_433.c.o.provides + +src/CMakeFiles/rtl_433.dir/rtl_433.c.o.provides.build: src/CMakeFiles/rtl_433.dir/rtl_433.c.o + +# Object files for target rtl_433 +rtl_433_OBJECTS = \ +"CMakeFiles/rtl_433.dir/rtl_433.c.o" + +# External object files for target rtl_433 +rtl_433_EXTERNAL_OBJECTS = + +src/rtl_433: src/CMakeFiles/rtl_433.dir/rtl_433.c.o +src/rtl_433: src/CMakeFiles/rtl_433.dir/build.make +src/rtl_433: src/librtlsdr.so.0.0.0 +src/rtl_433: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/rtl_433: src/CMakeFiles/rtl_433.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable rtl_433" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtl_433.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtl_433.dir/build: src/rtl_433 +.PHONY : src/CMakeFiles/rtl_433.dir/build + +src/CMakeFiles/rtl_433.dir/requires: src/CMakeFiles/rtl_433.dir/rtl_433.c.o.requires +.PHONY : src/CMakeFiles/rtl_433.dir/requires + +src/CMakeFiles/rtl_433.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtl_433.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtl_433.dir/clean + +src/CMakeFiles/rtl_433.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_433.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtl_433.dir/depend + diff --git a/build/src/CMakeFiles/rtl_433.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtl_433.dir/cmake_clean.cmake new file mode 100644 index 0000000..8d44e31 --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtl_433.dir/rtl_433.c.o" + "rtl_433.pdb" + "rtl_433" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtl_433.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtl_433.dir/depend.internal b/build/src/CMakeFiles/rtl_433.dir/depend.internal new file mode 100644 index 0000000..fb86867 --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/depend.internal @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_433.dir/rtl_433.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + /home/rvb/git/rtl_433/src/getopt/getopt.h + /home/rvb/git/rtl_433/src/rtl_433.c diff --git a/build/src/CMakeFiles/rtl_433.dir/depend.make b/build/src/CMakeFiles/rtl_433.dir/depend.make new file mode 100644 index 0000000..e2b0445 --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/depend.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_433.dir/rtl_433.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtl_433.dir/rtl_433.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtl_433.dir/rtl_433.c.o: ../src/getopt/getopt.h +src/CMakeFiles/rtl_433.dir/rtl_433.c.o: ../src/rtl_433.c + diff --git a/build/src/CMakeFiles/rtl_433.dir/flags.make b/build/src/CMakeFiles/rtl_433.dir/flags.make new file mode 100644 index 0000000..f4dc571 --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = + diff --git a/build/src/CMakeFiles/rtl_433.dir/link.txt b/build/src/CMakeFiles/rtl_433.dir/link.txt new file mode 100644 index 0000000..d40f48d --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -O3 -DNDEBUG CMakeFiles/rtl_433.dir/rtl_433.c.o -o rtl_433 -rdynamic librtlsdr.so.0.0.0 -lusb-1.0 -lpthread -lm -Wl,-rpath,/home/rvb/git/rtl_433/build/src: diff --git a/build/src/CMakeFiles/rtl_433.dir/progress.make b/build/src/CMakeFiles/rtl_433.dir/progress.make new file mode 100644 index 0000000..781c7de --- /dev/null +++ b/build/src/CMakeFiles/rtl_433.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 1 + diff --git a/build/src/CMakeFiles/rtl_433.dir/rtl_433.c.o b/build/src/CMakeFiles/rtl_433.dir/rtl_433.c.o new file mode 100644 index 0000000..41f32e2 Binary files /dev/null and b/build/src/CMakeFiles/rtl_433.dir/rtl_433.c.o differ diff --git a/build/src/CMakeFiles/rtl_adsb.dir/C.includecache b/build/src/CMakeFiles/rtl_adsb.dir/C.includecache new file mode 100644 index 0000000..0f4623a --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/C.includecache @@ -0,0 +1,68 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +/home/rvb/git/rtl_433/src/getopt/getopt.h +ctype.h +- + +/home/rvb/git/rtl_433/src/rtl_adsb.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +math.h +- +unistd.h +- +Windows.h +- +fcntl.h +- +io.h +- +getopt/getopt.h +/home/rvb/git/rtl_433/src/getopt/getopt.h +semaphore.h +- +pthread.h +- +libusb.h +- +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h + +/usr/include/libusb-1.0/libusb.h +stdint.h +- +sys/types.h +- +sys/time.h +- +time.h +- +limits.h +- +windows.h +- +winsock.h +- + diff --git a/build/src/CMakeFiles/rtl_adsb.dir/DependInfo.cmake b/build/src/CMakeFiles/rtl_adsb.dir/DependInfo.cmake new file mode 100644 index 0000000..43732d9 --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/rtl_adsb.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtl_adsb.dir/build.make b/build/src/CMakeFiles/rtl_adsb.dir/build.make new file mode 100644 index 0000000..67d0164 --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/build.make @@ -0,0 +1,104 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtl_adsb.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtl_adsb.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtl_adsb.dir/flags.make + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o: src/CMakeFiles/rtl_adsb.dir/flags.make +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o: ../src/rtl_adsb.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o -c /home/rvb/git/rtl_433/src/rtl_adsb.c + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtl_adsb.dir/rtl_adsb.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/rtl_adsb.c > CMakeFiles/rtl_adsb.dir/rtl_adsb.c.i + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtl_adsb.dir/rtl_adsb.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/rtl_adsb.c -o CMakeFiles/rtl_adsb.dir/rtl_adsb.c.s + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.requires: +.PHONY : src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.requires + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.provides: src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.requires + $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.provides.build +.PHONY : src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.provides + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.provides.build: src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o + +# Object files for target rtl_adsb +rtl_adsb_OBJECTS = \ +"CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o" + +# External object files for target rtl_adsb +rtl_adsb_EXTERNAL_OBJECTS = + +src/rtl_adsb: src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o +src/rtl_adsb: src/CMakeFiles/rtl_adsb.dir/build.make +src/rtl_adsb: src/librtlsdr.so.0.0.0 +src/rtl_adsb: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/rtl_adsb: src/CMakeFiles/rtl_adsb.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable rtl_adsb" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtl_adsb.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtl_adsb.dir/build: src/rtl_adsb +.PHONY : src/CMakeFiles/rtl_adsb.dir/build + +src/CMakeFiles/rtl_adsb.dir/requires: src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o.requires +.PHONY : src/CMakeFiles/rtl_adsb.dir/requires + +src/CMakeFiles/rtl_adsb.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtl_adsb.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtl_adsb.dir/clean + +src/CMakeFiles/rtl_adsb.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_adsb.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtl_adsb.dir/depend + diff --git a/build/src/CMakeFiles/rtl_adsb.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtl_adsb.dir/cmake_clean.cmake new file mode 100644 index 0000000..24dbd16 --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o" + "rtl_adsb.pdb" + "rtl_adsb" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtl_adsb.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtl_adsb.dir/depend.internal b/build/src/CMakeFiles/rtl_adsb.dir/depend.internal new file mode 100644 index 0000000..53eb7fe --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/depend.internal @@ -0,0 +1,9 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + /home/rvb/git/rtl_433/src/getopt/getopt.h + /home/rvb/git/rtl_433/src/rtl_adsb.c + /usr/include/libusb-1.0/libusb.h diff --git a/build/src/CMakeFiles/rtl_adsb.dir/depend.make b/build/src/CMakeFiles/rtl_adsb.dir/depend.make new file mode 100644 index 0000000..09a34a6 --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/depend.make @@ -0,0 +1,9 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o: ../src/getopt/getopt.h +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o: ../src/rtl_adsb.c +src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o: /usr/include/libusb-1.0/libusb.h + diff --git a/build/src/CMakeFiles/rtl_adsb.dir/flags.make b/build/src/CMakeFiles/rtl_adsb.dir/flags.make new file mode 100644 index 0000000..f4dc571 --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = + diff --git a/build/src/CMakeFiles/rtl_adsb.dir/link.txt b/build/src/CMakeFiles/rtl_adsb.dir/link.txt new file mode 100644 index 0000000..2f4ac84 --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -O3 -DNDEBUG CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o -o rtl_adsb -rdynamic librtlsdr.so.0.0.0 -lusb-1.0 -lpthread -lm -Wl,-rpath,/home/rvb/git/rtl_433/build/src: diff --git a/build/src/CMakeFiles/rtl_adsb.dir/progress.make b/build/src/CMakeFiles/rtl_adsb.dir/progress.make new file mode 100644 index 0000000..164e1d2 --- /dev/null +++ b/build/src/CMakeFiles/rtl_adsb.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 2 + diff --git a/build/src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o b/build/src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o new file mode 100644 index 0000000..c66c8a6 Binary files /dev/null and b/build/src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o differ diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/C.includecache b/build/src/CMakeFiles/rtl_eeprom.dir/C.includecache new file mode 100644 index 0000000..a07c414 --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/C.includecache @@ -0,0 +1,36 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +/home/rvb/git/rtl_433/src/getopt/getopt.h +ctype.h +- + +/home/rvb/git/rtl_433/src/rtl_eeprom.c +string.h +- +stdio.h +- +stdlib.h +- +unistd.h +- +Windows.h +- +getopt/getopt.h +/home/rvb/git/rtl_433/src/getopt/getopt.h +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h + diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/DependInfo.cmake b/build/src/CMakeFiles/rtl_eeprom.dir/DependInfo.cmake new file mode 100644 index 0000000..3ca8016 --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/rtl_eeprom.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/build.make b/build/src/CMakeFiles/rtl_eeprom.dir/build.make new file mode 100644 index 0000000..728559d --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/build.make @@ -0,0 +1,104 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtl_eeprom.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtl_eeprom.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtl_eeprom.dir/flags.make + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o: src/CMakeFiles/rtl_eeprom.dir/flags.make +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o: ../src/rtl_eeprom.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o -c /home/rvb/git/rtl_433/src/rtl_eeprom.c + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/rtl_eeprom.c > CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.i + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/rtl_eeprom.c -o CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.s + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.requires: +.PHONY : src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.requires + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.provides: src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.requires + $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.provides.build +.PHONY : src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.provides + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.provides.build: src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o + +# Object files for target rtl_eeprom +rtl_eeprom_OBJECTS = \ +"CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o" + +# External object files for target rtl_eeprom +rtl_eeprom_EXTERNAL_OBJECTS = + +src/rtl_eeprom: src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o +src/rtl_eeprom: src/CMakeFiles/rtl_eeprom.dir/build.make +src/rtl_eeprom: src/librtlsdr.so.0.0.0 +src/rtl_eeprom: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/rtl_eeprom: src/CMakeFiles/rtl_eeprom.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable rtl_eeprom" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtl_eeprom.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtl_eeprom.dir/build: src/rtl_eeprom +.PHONY : src/CMakeFiles/rtl_eeprom.dir/build + +src/CMakeFiles/rtl_eeprom.dir/requires: src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o.requires +.PHONY : src/CMakeFiles/rtl_eeprom.dir/requires + +src/CMakeFiles/rtl_eeprom.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtl_eeprom.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtl_eeprom.dir/clean + +src/CMakeFiles/rtl_eeprom.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_eeprom.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtl_eeprom.dir/depend + diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtl_eeprom.dir/cmake_clean.cmake new file mode 100644 index 0000000..72eb064 --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o" + "rtl_eeprom.pdb" + "rtl_eeprom" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtl_eeprom.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/depend.internal b/build/src/CMakeFiles/rtl_eeprom.dir/depend.internal new file mode 100644 index 0000000..72bfb26 --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/depend.internal @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + /home/rvb/git/rtl_433/src/getopt/getopt.h + /home/rvb/git/rtl_433/src/rtl_eeprom.c diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/depend.make b/build/src/CMakeFiles/rtl_eeprom.dir/depend.make new file mode 100644 index 0000000..3b8517b --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/depend.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o: ../src/getopt/getopt.h +src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o: ../src/rtl_eeprom.c + diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/flags.make b/build/src/CMakeFiles/rtl_eeprom.dir/flags.make new file mode 100644 index 0000000..f4dc571 --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = + diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/link.txt b/build/src/CMakeFiles/rtl_eeprom.dir/link.txt new file mode 100644 index 0000000..3349419 --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -O3 -DNDEBUG CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o -o rtl_eeprom -rdynamic librtlsdr.so.0.0.0 -lusb-1.0 -lpthread -Wl,-rpath,/home/rvb/git/rtl_433/build/src: diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/progress.make b/build/src/CMakeFiles/rtl_eeprom.dir/progress.make new file mode 100644 index 0000000..822db75 --- /dev/null +++ b/build/src/CMakeFiles/rtl_eeprom.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 3 + diff --git a/build/src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o b/build/src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o new file mode 100644 index 0000000..bcf2cfc Binary files /dev/null and b/build/src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o differ diff --git a/build/src/CMakeFiles/rtl_fm.dir/C.includecache b/build/src/CMakeFiles/rtl_fm.dir/C.includecache new file mode 100644 index 0000000..8fc9c76 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/C.includecache @@ -0,0 +1,68 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +/home/rvb/git/rtl_433/src/getopt/getopt.h +ctype.h +- + +/home/rvb/git/rtl_433/src/rtl_fm.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +math.h +- +unistd.h +- +Windows.h +- +fcntl.h +- +io.h +- +getopt/getopt.h +/home/rvb/git/rtl_433/src/getopt/getopt.h +semaphore.h +- +pthread.h +- +libusb.h +- +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h + +/usr/include/libusb-1.0/libusb.h +stdint.h +- +sys/types.h +- +sys/time.h +- +time.h +- +limits.h +- +windows.h +- +winsock.h +- + diff --git a/build/src/CMakeFiles/rtl_fm.dir/DependInfo.cmake b/build/src/CMakeFiles/rtl_fm.dir/DependInfo.cmake new file mode 100644 index 0000000..8c3b092 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/rtl_fm.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtl_fm.dir/build.make b/build/src/CMakeFiles/rtl_fm.dir/build.make new file mode 100644 index 0000000..95873e0 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/build.make @@ -0,0 +1,104 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtl_fm.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtl_fm.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtl_fm.dir/flags.make + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o: src/CMakeFiles/rtl_fm.dir/flags.make +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o: ../src/rtl_fm.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtl_fm.dir/rtl_fm.c.o -c /home/rvb/git/rtl_433/src/rtl_fm.c + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtl_fm.dir/rtl_fm.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/rtl_fm.c > CMakeFiles/rtl_fm.dir/rtl_fm.c.i + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtl_fm.dir/rtl_fm.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/rtl_fm.c -o CMakeFiles/rtl_fm.dir/rtl_fm.c.s + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.requires: +.PHONY : src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.requires + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.provides: src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.requires + $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.provides.build +.PHONY : src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.provides + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.provides.build: src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o + +# Object files for target rtl_fm +rtl_fm_OBJECTS = \ +"CMakeFiles/rtl_fm.dir/rtl_fm.c.o" + +# External object files for target rtl_fm +rtl_fm_EXTERNAL_OBJECTS = + +src/rtl_fm: src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o +src/rtl_fm: src/CMakeFiles/rtl_fm.dir/build.make +src/rtl_fm: src/librtlsdr.so.0.0.0 +src/rtl_fm: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/rtl_fm: src/CMakeFiles/rtl_fm.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable rtl_fm" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtl_fm.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtl_fm.dir/build: src/rtl_fm +.PHONY : src/CMakeFiles/rtl_fm.dir/build + +src/CMakeFiles/rtl_fm.dir/requires: src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o.requires +.PHONY : src/CMakeFiles/rtl_fm.dir/requires + +src/CMakeFiles/rtl_fm.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtl_fm.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtl_fm.dir/clean + +src/CMakeFiles/rtl_fm.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_fm.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtl_fm.dir/depend + diff --git a/build/src/CMakeFiles/rtl_fm.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtl_fm.dir/cmake_clean.cmake new file mode 100644 index 0000000..09229d9 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtl_fm.dir/rtl_fm.c.o" + "rtl_fm.pdb" + "rtl_fm" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtl_fm.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtl_fm.dir/depend.internal b/build/src/CMakeFiles/rtl_fm.dir/depend.internal new file mode 100644 index 0000000..3795536 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/depend.internal @@ -0,0 +1,9 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + /home/rvb/git/rtl_433/src/getopt/getopt.h + /home/rvb/git/rtl_433/src/rtl_fm.c + /usr/include/libusb-1.0/libusb.h diff --git a/build/src/CMakeFiles/rtl_fm.dir/depend.make b/build/src/CMakeFiles/rtl_fm.dir/depend.make new file mode 100644 index 0000000..83e1000 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/depend.make @@ -0,0 +1,9 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o: ../src/getopt/getopt.h +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o: ../src/rtl_fm.c +src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o: /usr/include/libusb-1.0/libusb.h + diff --git a/build/src/CMakeFiles/rtl_fm.dir/flags.make b/build/src/CMakeFiles/rtl_fm.dir/flags.make new file mode 100644 index 0000000..f4dc571 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = + diff --git a/build/src/CMakeFiles/rtl_fm.dir/link.txt b/build/src/CMakeFiles/rtl_fm.dir/link.txt new file mode 100644 index 0000000..48aaeca --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -O3 -DNDEBUG CMakeFiles/rtl_fm.dir/rtl_fm.c.o -o rtl_fm -rdynamic librtlsdr.so.0.0.0 -lusb-1.0 -lpthread -lm -Wl,-rpath,/home/rvb/git/rtl_433/build/src: diff --git a/build/src/CMakeFiles/rtl_fm.dir/progress.make b/build/src/CMakeFiles/rtl_fm.dir/progress.make new file mode 100644 index 0000000..8b1fa81 --- /dev/null +++ b/build/src/CMakeFiles/rtl_fm.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 4 + diff --git a/build/src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o b/build/src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o new file mode 100644 index 0000000..717fdb7 Binary files /dev/null and b/build/src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o differ diff --git a/build/src/CMakeFiles/rtl_sdr.dir/C.includecache b/build/src/CMakeFiles/rtl_sdr.dir/C.includecache new file mode 100644 index 0000000..e47bc4b --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/C.includecache @@ -0,0 +1,44 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +/home/rvb/git/rtl_433/src/getopt/getopt.h +ctype.h +- + +/home/rvb/git/rtl_433/src/rtl_sdr.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +unistd.h +- +Windows.h +- +io.h +- +fcntl.h +- +getopt/getopt.h +/home/rvb/git/rtl_433/src/getopt/getopt.h +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h + diff --git a/build/src/CMakeFiles/rtl_sdr.dir/DependInfo.cmake b/build/src/CMakeFiles/rtl_sdr.dir/DependInfo.cmake new file mode 100644 index 0000000..cf16725 --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/rtl_sdr.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtl_sdr.dir/build.make b/build/src/CMakeFiles/rtl_sdr.dir/build.make new file mode 100644 index 0000000..c76ac81 --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/build.make @@ -0,0 +1,104 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtl_sdr.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtl_sdr.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtl_sdr.dir/flags.make + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o: src/CMakeFiles/rtl_sdr.dir/flags.make +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o: ../src/rtl_sdr.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o -c /home/rvb/git/rtl_433/src/rtl_sdr.c + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtl_sdr.dir/rtl_sdr.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/rtl_sdr.c > CMakeFiles/rtl_sdr.dir/rtl_sdr.c.i + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtl_sdr.dir/rtl_sdr.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/rtl_sdr.c -o CMakeFiles/rtl_sdr.dir/rtl_sdr.c.s + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.requires: +.PHONY : src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.requires + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.provides: src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.requires + $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.provides.build +.PHONY : src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.provides + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.provides.build: src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o + +# Object files for target rtl_sdr +rtl_sdr_OBJECTS = \ +"CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o" + +# External object files for target rtl_sdr +rtl_sdr_EXTERNAL_OBJECTS = + +src/rtl_sdr: src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o +src/rtl_sdr: src/CMakeFiles/rtl_sdr.dir/build.make +src/rtl_sdr: src/librtlsdr.so.0.0.0 +src/rtl_sdr: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/rtl_sdr: src/CMakeFiles/rtl_sdr.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable rtl_sdr" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtl_sdr.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtl_sdr.dir/build: src/rtl_sdr +.PHONY : src/CMakeFiles/rtl_sdr.dir/build + +src/CMakeFiles/rtl_sdr.dir/requires: src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o.requires +.PHONY : src/CMakeFiles/rtl_sdr.dir/requires + +src/CMakeFiles/rtl_sdr.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtl_sdr.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtl_sdr.dir/clean + +src/CMakeFiles/rtl_sdr.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_sdr.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtl_sdr.dir/depend + diff --git a/build/src/CMakeFiles/rtl_sdr.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtl_sdr.dir/cmake_clean.cmake new file mode 100644 index 0000000..fc4ac8d --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o" + "rtl_sdr.pdb" + "rtl_sdr" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtl_sdr.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtl_sdr.dir/depend.internal b/build/src/CMakeFiles/rtl_sdr.dir/depend.internal new file mode 100644 index 0000000..b4964a9 --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/depend.internal @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + /home/rvb/git/rtl_433/src/getopt/getopt.h + /home/rvb/git/rtl_433/src/rtl_sdr.c diff --git a/build/src/CMakeFiles/rtl_sdr.dir/depend.make b/build/src/CMakeFiles/rtl_sdr.dir/depend.make new file mode 100644 index 0000000..8f049fa --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/depend.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o: ../src/getopt/getopt.h +src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o: ../src/rtl_sdr.c + diff --git a/build/src/CMakeFiles/rtl_sdr.dir/flags.make b/build/src/CMakeFiles/rtl_sdr.dir/flags.make new file mode 100644 index 0000000..f4dc571 --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = + diff --git a/build/src/CMakeFiles/rtl_sdr.dir/link.txt b/build/src/CMakeFiles/rtl_sdr.dir/link.txt new file mode 100644 index 0000000..b29aed4 --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -O3 -DNDEBUG CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o -o rtl_sdr -rdynamic librtlsdr.so.0.0.0 -lusb-1.0 -lpthread -Wl,-rpath,/home/rvb/git/rtl_433/build/src: diff --git a/build/src/CMakeFiles/rtl_sdr.dir/progress.make b/build/src/CMakeFiles/rtl_sdr.dir/progress.make new file mode 100644 index 0000000..b9ea7bd --- /dev/null +++ b/build/src/CMakeFiles/rtl_sdr.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 5 + diff --git a/build/src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o b/build/src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o new file mode 100644 index 0000000..beca2a7 Binary files /dev/null and b/build/src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o differ diff --git a/build/src/CMakeFiles/rtl_tcp.dir/C.includecache b/build/src/CMakeFiles/rtl_tcp.dir/C.includecache new file mode 100644 index 0000000..8d4b0c9 --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/C.includecache @@ -0,0 +1,56 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +/home/rvb/git/rtl_433/src/getopt/getopt.h +ctype.h +- + +/home/rvb/git/rtl_433/src/rtl_tcp.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +unistd.h +- +arpa/inet.h +- +sys/socket.h +- +sys/types.h +- +sys/socket.h +- +sys/time.h +- +netinet/in.h +- +fcntl.h +- +WinSock2.h +- +getopt/getopt.h +/home/rvb/git/rtl_433/src/getopt/getopt.h +pthread.h +- +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h + diff --git a/build/src/CMakeFiles/rtl_tcp.dir/DependInfo.cmake b/build/src/CMakeFiles/rtl_tcp.dir/DependInfo.cmake new file mode 100644 index 0000000..be153c2 --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/rtl_tcp.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtl_tcp.dir/build.make b/build/src/CMakeFiles/rtl_tcp.dir/build.make new file mode 100644 index 0000000..1534eb9 --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/build.make @@ -0,0 +1,104 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtl_tcp.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtl_tcp.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtl_tcp.dir/flags.make + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o: src/CMakeFiles/rtl_tcp.dir/flags.make +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o: ../src/rtl_tcp.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o -c /home/rvb/git/rtl_433/src/rtl_tcp.c + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtl_tcp.dir/rtl_tcp.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/rtl_tcp.c > CMakeFiles/rtl_tcp.dir/rtl_tcp.c.i + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtl_tcp.dir/rtl_tcp.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/rtl_tcp.c -o CMakeFiles/rtl_tcp.dir/rtl_tcp.c.s + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.requires: +.PHONY : src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.requires + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.provides: src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.requires + $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.provides.build +.PHONY : src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.provides + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.provides.build: src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o + +# Object files for target rtl_tcp +rtl_tcp_OBJECTS = \ +"CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o" + +# External object files for target rtl_tcp +rtl_tcp_EXTERNAL_OBJECTS = + +src/rtl_tcp: src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o +src/rtl_tcp: src/CMakeFiles/rtl_tcp.dir/build.make +src/rtl_tcp: src/librtlsdr.so.0.0.0 +src/rtl_tcp: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/rtl_tcp: src/CMakeFiles/rtl_tcp.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable rtl_tcp" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtl_tcp.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtl_tcp.dir/build: src/rtl_tcp +.PHONY : src/CMakeFiles/rtl_tcp.dir/build + +src/CMakeFiles/rtl_tcp.dir/requires: src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o.requires +.PHONY : src/CMakeFiles/rtl_tcp.dir/requires + +src/CMakeFiles/rtl_tcp.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtl_tcp.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtl_tcp.dir/clean + +src/CMakeFiles/rtl_tcp.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_tcp.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtl_tcp.dir/depend + diff --git a/build/src/CMakeFiles/rtl_tcp.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtl_tcp.dir/cmake_clean.cmake new file mode 100644 index 0000000..4d200c1 --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o" + "rtl_tcp.pdb" + "rtl_tcp" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtl_tcp.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtl_tcp.dir/depend.internal b/build/src/CMakeFiles/rtl_tcp.dir/depend.internal new file mode 100644 index 0000000..e317f7b --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/depend.internal @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + /home/rvb/git/rtl_433/src/getopt/getopt.h + /home/rvb/git/rtl_433/src/rtl_tcp.c diff --git a/build/src/CMakeFiles/rtl_tcp.dir/depend.make b/build/src/CMakeFiles/rtl_tcp.dir/depend.make new file mode 100644 index 0000000..732b843 --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/depend.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o: ../src/getopt/getopt.h +src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o: ../src/rtl_tcp.c + diff --git a/build/src/CMakeFiles/rtl_tcp.dir/flags.make b/build/src/CMakeFiles/rtl_tcp.dir/flags.make new file mode 100644 index 0000000..f4dc571 --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = + diff --git a/build/src/CMakeFiles/rtl_tcp.dir/link.txt b/build/src/CMakeFiles/rtl_tcp.dir/link.txt new file mode 100644 index 0000000..f08ccae --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -O3 -DNDEBUG CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o -o rtl_tcp -rdynamic librtlsdr.so.0.0.0 -lusb-1.0 -lpthread -Wl,-rpath,/home/rvb/git/rtl_433/build/src: diff --git a/build/src/CMakeFiles/rtl_tcp.dir/progress.make b/build/src/CMakeFiles/rtl_tcp.dir/progress.make new file mode 100644 index 0000000..16d5ea2 --- /dev/null +++ b/build/src/CMakeFiles/rtl_tcp.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 6 + diff --git a/build/src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o b/build/src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o new file mode 100644 index 0000000..4e17c9f Binary files /dev/null and b/build/src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o differ diff --git a/build/src/CMakeFiles/rtl_test.dir/C.includecache b/build/src/CMakeFiles/rtl_test.dir/C.includecache new file mode 100644 index 0000000..2122d99 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/C.includecache @@ -0,0 +1,46 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +/home/rvb/git/rtl_433/src/getopt/getopt.h +ctype.h +- + +/home/rvb/git/rtl_433/src/rtl_test.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +math.h +- +sys/time.h +- +time.h +- +unistd.h +- +Windows.h +- +getopt/getopt.h +/home/rvb/git/rtl_433/src/getopt/getopt.h +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h + diff --git a/build/src/CMakeFiles/rtl_test.dir/DependInfo.cmake b/build/src/CMakeFiles/rtl_test.dir/DependInfo.cmake new file mode 100644 index 0000000..6681f04 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/DependInfo.cmake @@ -0,0 +1,23 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/rtl_test.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_test.dir/rtl_test.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake" + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtl_test.dir/build.make b/build/src/CMakeFiles/rtl_test.dir/build.make new file mode 100644 index 0000000..3b48646 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/build.make @@ -0,0 +1,104 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtl_test.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtl_test.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtl_test.dir/flags.make + +src/CMakeFiles/rtl_test.dir/rtl_test.c.o: src/CMakeFiles/rtl_test.dir/flags.make +src/CMakeFiles/rtl_test.dir/rtl_test.c.o: ../src/rtl_test.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtl_test.dir/rtl_test.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtl_test.dir/rtl_test.c.o -c /home/rvb/git/rtl_433/src/rtl_test.c + +src/CMakeFiles/rtl_test.dir/rtl_test.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtl_test.dir/rtl_test.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/rtl_test.c > CMakeFiles/rtl_test.dir/rtl_test.c.i + +src/CMakeFiles/rtl_test.dir/rtl_test.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtl_test.dir/rtl_test.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/rtl_test.c -o CMakeFiles/rtl_test.dir/rtl_test.c.s + +src/CMakeFiles/rtl_test.dir/rtl_test.c.o.requires: +.PHONY : src/CMakeFiles/rtl_test.dir/rtl_test.c.o.requires + +src/CMakeFiles/rtl_test.dir/rtl_test.c.o.provides: src/CMakeFiles/rtl_test.dir/rtl_test.c.o.requires + $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/rtl_test.c.o.provides.build +.PHONY : src/CMakeFiles/rtl_test.dir/rtl_test.c.o.provides + +src/CMakeFiles/rtl_test.dir/rtl_test.c.o.provides.build: src/CMakeFiles/rtl_test.dir/rtl_test.c.o + +# Object files for target rtl_test +rtl_test_OBJECTS = \ +"CMakeFiles/rtl_test.dir/rtl_test.c.o" + +# External object files for target rtl_test +rtl_test_EXTERNAL_OBJECTS = + +src/rtl_test: src/CMakeFiles/rtl_test.dir/rtl_test.c.o +src/rtl_test: src/CMakeFiles/rtl_test.dir/build.make +src/rtl_test: src/librtlsdr.so.0.0.0 +src/rtl_test: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/rtl_test: src/CMakeFiles/rtl_test.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C executable rtl_test" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtl_test.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtl_test.dir/build: src/rtl_test +.PHONY : src/CMakeFiles/rtl_test.dir/build + +src/CMakeFiles/rtl_test.dir/requires: src/CMakeFiles/rtl_test.dir/rtl_test.c.o.requires +.PHONY : src/CMakeFiles/rtl_test.dir/requires + +src/CMakeFiles/rtl_test.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtl_test.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtl_test.dir/clean + +src/CMakeFiles/rtl_test.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtl_test.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtl_test.dir/depend + diff --git a/build/src/CMakeFiles/rtl_test.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtl_test.dir/cmake_clean.cmake new file mode 100644 index 0000000..aff9013 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtl_test.dir/rtl_test.c.o" + "rtl_test.pdb" + "rtl_test" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtl_test.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtl_test.dir/depend.internal b/build/src/CMakeFiles/rtl_test.dir/depend.internal new file mode 100644 index 0000000..ba680c3 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/depend.internal @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_test.dir/rtl_test.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + /home/rvb/git/rtl_433/src/getopt/getopt.h + /home/rvb/git/rtl_433/src/rtl_test.c diff --git a/build/src/CMakeFiles/rtl_test.dir/depend.make b/build/src/CMakeFiles/rtl_test.dir/depend.make new file mode 100644 index 0000000..5f021ba --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/depend.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtl_test.dir/rtl_test.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtl_test.dir/rtl_test.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtl_test.dir/rtl_test.c.o: ../src/getopt/getopt.h +src/CMakeFiles/rtl_test.dir/rtl_test.c.o: ../src/rtl_test.c + diff --git a/build/src/CMakeFiles/rtl_test.dir/flags.make b/build/src/CMakeFiles/rtl_test.dir/flags.make new file mode 100644 index 0000000..f4dc571 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = + diff --git a/build/src/CMakeFiles/rtl_test.dir/link.txt b/build/src/CMakeFiles/rtl_test.dir/link.txt new file mode 100644 index 0000000..c3afd07 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -O3 -DNDEBUG CMakeFiles/rtl_test.dir/rtl_test.c.o -o rtl_test -rdynamic librtlsdr.so.0.0.0 -lusb-1.0 -lpthread -lm -lrt -Wl,-rpath,/home/rvb/git/rtl_433/build/src: diff --git a/build/src/CMakeFiles/rtl_test.dir/progress.make b/build/src/CMakeFiles/rtl_test.dir/progress.make new file mode 100644 index 0000000..68e0bc5 --- /dev/null +++ b/build/src/CMakeFiles/rtl_test.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 7 + diff --git a/build/src/CMakeFiles/rtl_test.dir/rtl_test.c.o b/build/src/CMakeFiles/rtl_test.dir/rtl_test.c.o new file mode 100644 index 0000000..cd1506d Binary files /dev/null and b/build/src/CMakeFiles/rtl_test.dir/rtl_test.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/C.includecache b/build/src/CMakeFiles/rtlsdr_shared.dir/C.includecache new file mode 100644 index 0000000..4a128a8 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/C.includecache @@ -0,0 +1,132 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/reg_field.h +stdint.h +- +stdarg.h +- + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +../include/rtlsdr_i2c.h + +../include/tuner_e4k.h + +../include/tuner_fc0012.h + +../include/tuner_fc0013.h + +../include/tuner_fc2580.h + +../include/tuner_r820t.h + +/home/rvb/git/rtl_433/src/librtlsdr.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +unistd.h +- +libusb.h +- +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h +tuner_e4k.h +/home/rvb/git/rtl_433/src/tuner_e4k.h +tuner_fc0012.h +/home/rvb/git/rtl_433/src/tuner_fc0012.h +tuner_fc0013.h +/home/rvb/git/rtl_433/src/tuner_fc0013.h +tuner_fc2580.h +/home/rvb/git/rtl_433/src/tuner_fc2580.h +tuner_r820t.h +/home/rvb/git/rtl_433/src/tuner_r820t.h + +/home/rvb/git/rtl_433/src/tuner_e4k.c +limits.h +- +stdint.h +- +errno.h +- +string.h +- +stdio.h +- +reg_field.h +- +tuner_e4k.h +- + +/home/rvb/git/rtl_433/src/tuner_fc0012.c +stdint.h +- +stdio.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_fc0012.h +/home/rvb/git/rtl_433/src/tuner_fc0012.h + +/home/rvb/git/rtl_433/src/tuner_fc0013.c +stdint.h +- +stdio.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_fc0013.h +/home/rvb/git/rtl_433/src/tuner_fc0013.h + +/home/rvb/git/rtl_433/src/tuner_fc2580.c +stdint.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_fc2580.h +/home/rvb/git/rtl_433/src/tuner_fc2580.h + +/home/rvb/git/rtl_433/src/tuner_r820t.c +stdint.h +- +stdio.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_r820t.h +/home/rvb/git/rtl_433/src/tuner_r820t.h + +/usr/include/libusb-1.0/libusb.h +stdint.h +- +sys/types.h +- +sys/time.h +- +time.h +- +limits.h +- +windows.h +- +winsock.h +- + diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake b/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake new file mode 100644 index 0000000..624ab32 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake @@ -0,0 +1,34 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/librtlsdr.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o" + "/home/rvb/git/rtl_433/src/tuner_e4k.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o" + "/home/rvb/git/rtl_433/src/tuner_fc0012.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o" + "/home/rvb/git/rtl_433/src/tuner_fc0013.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o" + "/home/rvb/git/rtl_433/src/tuner_fc2580.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o" + "/home/rvb/git/rtl_433/src/tuner_r820t.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Pairs of files generated by the same build rule. +SET(CMAKE_MULTIPLE_OUTPUT_PAIRS + "/home/rvb/git/rtl_433/build/src/librtlsdr.so" "/home/rvb/git/rtl_433/build/src/librtlsdr.so.0.0.0" + "/home/rvb/git/rtl_433/build/src/librtlsdr.so.0" "/home/rvb/git/rtl_433/build/src/librtlsdr.so.0.0.0" + ) + + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/build.make b/build/src/CMakeFiles/rtlsdr_shared.dir/build.make new file mode 100644 index 0000000..c44c058 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/build.make @@ -0,0 +1,238 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtlsdr_shared.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtlsdr_shared.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtlsdr_shared.dir/flags.make + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: src/CMakeFiles/rtlsdr_shared.dir/flags.make +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../src/librtlsdr.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o -c /home/rvb/git/rtl_433/src/librtlsdr.c + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/librtlsdr.c > CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.i + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/librtlsdr.c -o CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.s + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.requires + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.provides: src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.provides + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.provides.build: src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o + +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o: src/CMakeFiles/rtlsdr_shared.dir/flags.make +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o: ../src/tuner_e4k.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_2) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o -c /home/rvb/git/rtl_433/src/tuner_e4k.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_e4k.c > CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.i + +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_e4k.c -o CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.s + +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.requires + +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.provides: src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.provides + +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.provides.build: src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o: src/CMakeFiles/rtlsdr_shared.dir/flags.make +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o: ../src/tuner_fc0012.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_3) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o -c /home/rvb/git/rtl_433/src/tuner_fc0012.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_fc0012.c > CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.i + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_fc0012.c -o CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.s + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.requires + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.provides: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.provides + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.provides.build: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o: src/CMakeFiles/rtlsdr_shared.dir/flags.make +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o: ../src/tuner_fc0013.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_4) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o -c /home/rvb/git/rtl_433/src/tuner_fc0013.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_fc0013.c > CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.i + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_fc0013.c -o CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.s + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.requires + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.provides: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.provides + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.provides.build: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o: src/CMakeFiles/rtlsdr_shared.dir/flags.make +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o: ../src/tuner_fc2580.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_5) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o -c /home/rvb/git/rtl_433/src/tuner_fc2580.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_fc2580.c > CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.i + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_fc2580.c -o CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.s + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.requires + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.provides: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.provides + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.provides.build: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o + +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o: src/CMakeFiles/rtlsdr_shared.dir/flags.make +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o: ../src/tuner_r820t.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_6) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o -c /home/rvb/git/rtl_433/src/tuner_r820t.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_r820t.c > CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.i + +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_r820t.c -o CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.s + +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.requires + +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.provides: src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.provides + +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.provides.build: src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o + +# Object files for target rtlsdr_shared +rtlsdr_shared_OBJECTS = \ +"CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o" \ +"CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o" \ +"CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o" \ +"CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o" \ +"CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o" \ +"CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o" + +# External object files for target rtlsdr_shared +rtlsdr_shared_EXTERNAL_OBJECTS = + +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/build.make +src/librtlsdr.so.0.0.0: /usr/lib/x86_64-linux-gnu/libusb-1.0.so +src/librtlsdr.so.0.0.0: src/CMakeFiles/rtlsdr_shared.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C shared library librtlsdr.so" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtlsdr_shared.dir/link.txt --verbose=$(VERBOSE) + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_symlink_library librtlsdr.so.0.0.0 librtlsdr.so.0 librtlsdr.so + +src/librtlsdr.so.0: src/librtlsdr.so.0.0.0 + +src/librtlsdr.so: src/librtlsdr.so.0.0.0 + +# Rule to build all files generated by this target. +src/CMakeFiles/rtlsdr_shared.dir/build: src/librtlsdr.so +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/build + +src/CMakeFiles/rtlsdr_shared.dir/requires: src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o.requires +src/CMakeFiles/rtlsdr_shared.dir/requires: src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o.requires +src/CMakeFiles/rtlsdr_shared.dir/requires: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o.requires +src/CMakeFiles/rtlsdr_shared.dir/requires: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o.requires +src/CMakeFiles/rtlsdr_shared.dir/requires: src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o.requires +src/CMakeFiles/rtlsdr_shared.dir/requires: src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o.requires +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/requires + +src/CMakeFiles/rtlsdr_shared.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtlsdr_shared.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/clean + +src/CMakeFiles/rtlsdr_shared.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_shared.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/depend + diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtlsdr_shared.dir/cmake_clean.cmake new file mode 100644 index 0000000..8fa29ee --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/cmake_clean.cmake @@ -0,0 +1,17 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o" + "CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o" + "CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o" + "CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o" + "CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o" + "CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o" + "librtlsdr.pdb" + "librtlsdr.so" + "librtlsdr.so.0.0.0" + "librtlsdr.so.0" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtlsdr_shared.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/depend.internal b/build/src/CMakeFiles/rtlsdr_shared.dir/depend.internal new file mode 100644 index 0000000..bb892a5 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/depend.internal @@ -0,0 +1,33 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + ../include/tuner_e4k.h + ../include/tuner_fc0012.h + ../include/tuner_fc0013.h + ../include/tuner_fc2580.h + ../include/tuner_r820t.h + /home/rvb/git/rtl_433/src/librtlsdr.c + /usr/include/libusb-1.0/libusb.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o + ../include/reg_field.h + ../include/tuner_e4k.h + /home/rvb/git/rtl_433/src/tuner_e4k.c +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_fc0012.h + /home/rvb/git/rtl_433/src/tuner_fc0012.c +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_fc0013.h + /home/rvb/git/rtl_433/src/tuner_fc0013.c +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_fc2580.h + /home/rvb/git/rtl_433/src/tuner_fc2580.c +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_r820t.h + /home/rvb/git/rtl_433/src/tuner_r820t.c diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/depend.make b/build/src/CMakeFiles/rtlsdr_shared.dir/depend.make new file mode 100644 index 0000000..da58f07 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/depend.make @@ -0,0 +1,33 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../include/tuner_e4k.h +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../include/tuner_fc0012.h +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../include/tuner_fc0013.h +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../include/tuner_fc2580.h +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../include/tuner_r820t.h +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: ../src/librtlsdr.c +src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o: /usr/include/libusb-1.0/libusb.h + +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o: ../include/reg_field.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o: ../include/tuner_e4k.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o: ../src/tuner_e4k.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o: ../include/tuner_fc0012.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o: ../src/tuner_fc0012.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o: ../include/tuner_fc0013.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o: ../src/tuner_fc0013.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o: ../include/tuner_fc2580.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o: ../src/tuner_fc2580.c + +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o: ../include/tuner_r820t.h +src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o: ../src/tuner_r820t.c + diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/flags.make b/build/src/CMakeFiles/rtlsdr_shared.dir/flags.make new file mode 100644 index 0000000..4d1cb95 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -fPIC -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = -Drtlsdr_EXPORTS + diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o b/build/src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o new file mode 100644 index 0000000..20e73ff Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/link.txt b/build/src/CMakeFiles/rtlsdr_shared.dir/link.txt new file mode 100644 index 0000000..e4bd885 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/cc -fPIC -O3 -DNDEBUG -shared -Wl,-soname,librtlsdr.so.0 -o librtlsdr.so.0.0.0 CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o -lusb-1.0 diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/progress.make b/build/src/CMakeFiles/rtlsdr_shared.dir/progress.make new file mode 100644 index 0000000..8cdb8c1 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_shared.dir/progress.make @@ -0,0 +1,7 @@ +CMAKE_PROGRESS_1 = 8 +CMAKE_PROGRESS_2 = 9 +CMAKE_PROGRESS_3 = 10 +CMAKE_PROGRESS_4 = 11 +CMAKE_PROGRESS_5 = 12 +CMAKE_PROGRESS_6 = 13 + diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o new file mode 100644 index 0000000..7e3e9d2 Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o new file mode 100644 index 0000000..57a404a Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o new file mode 100644 index 0000000..767056f Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o new file mode 100644 index 0000000..7995dce Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o new file mode 100644 index 0000000..12cc52d Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/C.includecache b/build/src/CMakeFiles/rtlsdr_static.dir/C.includecache new file mode 100644 index 0000000..4a128a8 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/C.includecache @@ -0,0 +1,132 @@ +#IncludeRegexLine: ^[ ]*#[ ]*(include|import)[ ]*[<"]([^">]+)([">]) + +#IncludeRegexScan: ^.*$ + +#IncludeRegexComplain: ^$ + +#IncludeRegexTransform: + +../include/reg_field.h +stdint.h +- +stdarg.h +- + +../include/rtl-sdr.h +stdint.h +- +rtl-sdr_export.h +- + +../include/rtl-sdr_export.h + +../include/rtlsdr_i2c.h + +../include/tuner_e4k.h + +../include/tuner_fc0012.h + +../include/tuner_fc0013.h + +../include/tuner_fc2580.h + +../include/tuner_r820t.h + +/home/rvb/git/rtl_433/src/librtlsdr.c +errno.h +- +signal.h +- +string.h +- +stdio.h +- +stdlib.h +- +unistd.h +- +libusb.h +- +rtl-sdr.h +/home/rvb/git/rtl_433/src/rtl-sdr.h +tuner_e4k.h +/home/rvb/git/rtl_433/src/tuner_e4k.h +tuner_fc0012.h +/home/rvb/git/rtl_433/src/tuner_fc0012.h +tuner_fc0013.h +/home/rvb/git/rtl_433/src/tuner_fc0013.h +tuner_fc2580.h +/home/rvb/git/rtl_433/src/tuner_fc2580.h +tuner_r820t.h +/home/rvb/git/rtl_433/src/tuner_r820t.h + +/home/rvb/git/rtl_433/src/tuner_e4k.c +limits.h +- +stdint.h +- +errno.h +- +string.h +- +stdio.h +- +reg_field.h +- +tuner_e4k.h +- + +/home/rvb/git/rtl_433/src/tuner_fc0012.c +stdint.h +- +stdio.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_fc0012.h +/home/rvb/git/rtl_433/src/tuner_fc0012.h + +/home/rvb/git/rtl_433/src/tuner_fc0013.c +stdint.h +- +stdio.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_fc0013.h +/home/rvb/git/rtl_433/src/tuner_fc0013.h + +/home/rvb/git/rtl_433/src/tuner_fc2580.c +stdint.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_fc2580.h +/home/rvb/git/rtl_433/src/tuner_fc2580.h + +/home/rvb/git/rtl_433/src/tuner_r820t.c +stdint.h +- +stdio.h +- +rtlsdr_i2c.h +/home/rvb/git/rtl_433/src/rtlsdr_i2c.h +tuner_r820t.h +/home/rvb/git/rtl_433/src/tuner_r820t.h + +/usr/include/libusb-1.0/libusb.h +stdint.h +- +sys/types.h +- +sys/time.h +- +time.h +- +limits.h +- +windows.h +- +winsock.h +- + diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/DependInfo.cmake b/build/src/CMakeFiles/rtlsdr_static.dir/DependInfo.cmake new file mode 100644 index 0000000..d6706a3 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/DependInfo.cmake @@ -0,0 +1,32 @@ +# The set of languages for which implicit dependencies are needed: +SET(CMAKE_DEPENDS_LANGUAGES + "C" + ) +# The set of files for implicit dependencies of each language: +SET(CMAKE_DEPENDS_CHECK_C + "/home/rvb/git/rtl_433/src/librtlsdr.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o" + "/home/rvb/git/rtl_433/src/tuner_e4k.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o" + "/home/rvb/git/rtl_433/src/tuner_fc0012.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o" + "/home/rvb/git/rtl_433/src/tuner_fc0013.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o" + "/home/rvb/git/rtl_433/src/tuner_fc2580.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o" + "/home/rvb/git/rtl_433/src/tuner_r820t.c" "/home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o" + ) +SET(CMAKE_C_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +SET(CMAKE_TARGET_DEFINITIONS + "rtlsdr_STATIC" + ) + +# Targets to which this target links. +SET(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# The include file search paths: +SET(CMAKE_C_TARGET_INCLUDE_PATH + "../include" + "/usr/include/libusb-1.0" + ) +SET(CMAKE_CXX_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_Fortran_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) +SET(CMAKE_ASM_TARGET_INCLUDE_PATH ${CMAKE_C_TARGET_INCLUDE_PATH}) diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/build.make b/build/src/CMakeFiles/rtlsdr_static.dir/build.make new file mode 100644 index 0000000..cf34727 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/build.make @@ -0,0 +1,233 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +# Include any dependencies generated for this target. +include src/CMakeFiles/rtlsdr_static.dir/depend.make + +# Include the progress variables for this target. +include src/CMakeFiles/rtlsdr_static.dir/progress.make + +# Include the compile flags for this target's objects. +include src/CMakeFiles/rtlsdr_static.dir/flags.make + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: src/CMakeFiles/rtlsdr_static.dir/flags.make +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../src/librtlsdr.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_1) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o -c /home/rvb/git/rtl_433/src/librtlsdr.c + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_static.dir/librtlsdr.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/librtlsdr.c > CMakeFiles/rtlsdr_static.dir/librtlsdr.c.i + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_static.dir/librtlsdr.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/librtlsdr.c -o CMakeFiles/rtlsdr_static.dir/librtlsdr.c.s + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.requires + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.provides: src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.provides + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.provides.build: src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o + +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o: src/CMakeFiles/rtlsdr_static.dir/flags.make +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o: ../src/tuner_e4k.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_2) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o -c /home/rvb/git/rtl_433/src/tuner_e4k.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_e4k.c > CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.i + +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_e4k.c -o CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.s + +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.requires + +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.provides: src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.provides + +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.provides.build: src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o: src/CMakeFiles/rtlsdr_static.dir/flags.make +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o: ../src/tuner_fc0012.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_3) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o -c /home/rvb/git/rtl_433/src/tuner_fc0012.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_fc0012.c > CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.i + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_fc0012.c -o CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.s + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.requires + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.provides: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.provides + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.provides.build: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o: src/CMakeFiles/rtlsdr_static.dir/flags.make +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o: ../src/tuner_fc0013.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_4) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o -c /home/rvb/git/rtl_433/src/tuner_fc0013.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_fc0013.c > CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.i + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_fc0013.c -o CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.s + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.requires + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.provides: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.provides + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.provides.build: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o: src/CMakeFiles/rtlsdr_static.dir/flags.make +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o: ../src/tuner_fc2580.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_5) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o -c /home/rvb/git/rtl_433/src/tuner_fc2580.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_fc2580.c > CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.i + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_fc2580.c -o CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.s + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.requires + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.provides: src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.provides + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.provides.build: src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o + +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o: src/CMakeFiles/rtlsdr_static.dir/flags.make +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o: ../src/tuner_r820t.c + $(CMAKE_COMMAND) -E cmake_progress_report /home/rvb/git/rtl_433/build/CMakeFiles $(CMAKE_PROGRESS_6) + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Building C object src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -o CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o -c /home/rvb/git/rtl_433/src/tuner_r820t.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing C source to CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.i" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -E /home/rvb/git/rtl_433/src/tuner_r820t.c > CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.i + +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling C source to assembly CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.s" + cd /home/rvb/git/rtl_433/build/src && /usr/bin/cc $(C_DEFINES) $(C_FLAGS) -S /home/rvb/git/rtl_433/src/tuner_r820t.c -o CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.s + +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.requires: +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.requires + +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.provides: src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.requires + $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.provides.build +.PHONY : src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.provides + +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.provides.build: src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o + +# Object files for target rtlsdr_static +rtlsdr_static_OBJECTS = \ +"CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o" \ +"CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o" \ +"CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o" \ +"CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o" \ +"CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o" \ +"CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o" + +# External object files for target rtlsdr_static +rtlsdr_static_EXTERNAL_OBJECTS = + +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/build.make +src/librtlsdr.a: src/CMakeFiles/rtlsdr_static.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --red --bold "Linking C static library librtlsdr.a" + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtlsdr_static.dir/cmake_clean_target.cmake + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/rtlsdr_static.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +src/CMakeFiles/rtlsdr_static.dir/build: src/librtlsdr.a +.PHONY : src/CMakeFiles/rtlsdr_static.dir/build + +src/CMakeFiles/rtlsdr_static.dir/requires: src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o.requires +src/CMakeFiles/rtlsdr_static.dir/requires: src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o.requires +src/CMakeFiles/rtlsdr_static.dir/requires: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o.requires +src/CMakeFiles/rtlsdr_static.dir/requires: src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o.requires +src/CMakeFiles/rtlsdr_static.dir/requires: src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o.requires +src/CMakeFiles/rtlsdr_static.dir/requires: src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o.requires +.PHONY : src/CMakeFiles/rtlsdr_static.dir/requires + +src/CMakeFiles/rtlsdr_static.dir/clean: + cd /home/rvb/git/rtl_433/build/src && $(CMAKE_COMMAND) -P CMakeFiles/rtlsdr_static.dir/cmake_clean.cmake +.PHONY : src/CMakeFiles/rtlsdr_static.dir/clean + +src/CMakeFiles/rtlsdr_static.dir/depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/rvb/git/rtl_433 /home/rvb/git/rtl_433/src /home/rvb/git/rtl_433/build /home/rvb/git/rtl_433/build/src /home/rvb/git/rtl_433/build/src/CMakeFiles/rtlsdr_static.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : src/CMakeFiles/rtlsdr_static.dir/depend + diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/cmake_clean.cmake b/build/src/CMakeFiles/rtlsdr_static.dir/cmake_clean.cmake new file mode 100644 index 0000000..43efcaa --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/cmake_clean.cmake @@ -0,0 +1,15 @@ +FILE(REMOVE_RECURSE + "CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o" + "CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o" + "CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o" + "CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o" + "CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o" + "CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o" + "librtlsdr.pdb" + "librtlsdr.a" +) + +# Per-language clean rules from dependency scanning. +FOREACH(lang C) + INCLUDE(CMakeFiles/rtlsdr_static.dir/cmake_clean_${lang}.cmake OPTIONAL) +ENDFOREACH(lang) diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/cmake_clean_target.cmake b/build/src/CMakeFiles/rtlsdr_static.dir/cmake_clean_target.cmake new file mode 100644 index 0000000..c3440a1 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/cmake_clean_target.cmake @@ -0,0 +1,3 @@ +FILE(REMOVE_RECURSE + "librtlsdr.a" +) diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/depend.internal b/build/src/CMakeFiles/rtlsdr_static.dir/depend.internal new file mode 100644 index 0000000..af4c78d --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/depend.internal @@ -0,0 +1,33 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o + ../include/rtl-sdr.h + ../include/rtl-sdr_export.h + ../include/tuner_e4k.h + ../include/tuner_fc0012.h + ../include/tuner_fc0013.h + ../include/tuner_fc2580.h + ../include/tuner_r820t.h + /home/rvb/git/rtl_433/src/librtlsdr.c + /usr/include/libusb-1.0/libusb.h +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o + ../include/reg_field.h + ../include/tuner_e4k.h + /home/rvb/git/rtl_433/src/tuner_e4k.c +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_fc0012.h + /home/rvb/git/rtl_433/src/tuner_fc0012.c +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_fc0013.h + /home/rvb/git/rtl_433/src/tuner_fc0013.c +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_fc2580.h + /home/rvb/git/rtl_433/src/tuner_fc2580.c +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o + ../include/rtlsdr_i2c.h + ../include/tuner_r820t.h + /home/rvb/git/rtl_433/src/tuner_r820t.c diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/depend.make b/build/src/CMakeFiles/rtlsdr_static.dir/depend.make new file mode 100644 index 0000000..b14d79f --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/depend.make @@ -0,0 +1,33 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../include/rtl-sdr.h +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../include/rtl-sdr_export.h +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../include/tuner_e4k.h +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../include/tuner_fc0012.h +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../include/tuner_fc0013.h +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../include/tuner_fc2580.h +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../include/tuner_r820t.h +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: ../src/librtlsdr.c +src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o: /usr/include/libusb-1.0/libusb.h + +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o: ../include/reg_field.h +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o: ../include/tuner_e4k.h +src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o: ../src/tuner_e4k.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o: ../include/tuner_fc0012.h +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o: ../src/tuner_fc0012.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o: ../include/tuner_fc0013.h +src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o: ../src/tuner_fc0013.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o: ../include/tuner_fc2580.h +src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o: ../src/tuner_fc2580.c + +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o: ../include/rtlsdr_i2c.h +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o: ../include/tuner_r820t.h +src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o: ../src/tuner_r820t.c + diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/flags.make b/build/src/CMakeFiles/rtlsdr_static.dir/flags.make new file mode 100644 index 0000000..f34305b --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/flags.make @@ -0,0 +1,8 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# compile C with /usr/bin/cc +C_FLAGS = -O3 -DNDEBUG -I/home/rvb/git/rtl_433/include -I/usr/include/libusb-1.0 -Wall -Wextra -Wno-unused -Wsign-compare -g3 -O0 -fvisibility=hidden + +C_DEFINES = -Drtlsdr_STATIC + diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o b/build/src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o new file mode 100644 index 0000000..892aaeb Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/link.txt b/build/src/CMakeFiles/rtlsdr_static.dir/link.txt new file mode 100644 index 0000000..2ac2ef5 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/link.txt @@ -0,0 +1,2 @@ +/usr/bin/ar cr librtlsdr.a CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o +/usr/bin/ranlib librtlsdr.a diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/progress.make b/build/src/CMakeFiles/rtlsdr_static.dir/progress.make new file mode 100644 index 0000000..e1ceb99 --- /dev/null +++ b/build/src/CMakeFiles/rtlsdr_static.dir/progress.make @@ -0,0 +1,7 @@ +CMAKE_PROGRESS_1 = 14 +CMAKE_PROGRESS_2 = 15 +CMAKE_PROGRESS_3 = 16 +CMAKE_PROGRESS_4 = 17 +CMAKE_PROGRESS_5 = 18 +CMAKE_PROGRESS_6 = 19 + diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o new file mode 100644 index 0000000..65aa5a2 Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o new file mode 100644 index 0000000..40f991d Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o new file mode 100644 index 0000000..166f5e4 Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o new file mode 100644 index 0000000..e0ac4be Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o differ diff --git a/build/src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o new file mode 100644 index 0000000..9230c14 Binary files /dev/null and b/build/src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o differ diff --git a/build/src/Makefile b/build/src/Makefile new file mode 100644 index 0000000..fb48efd --- /dev/null +++ b/build/src/Makefile @@ -0,0 +1,671 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 2.8 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/rvb/git/rtl_433 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/rvb/git/rtl_433/build + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running interactive CMake command-line interface..." + /usr/bin/cmake -i . +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target install +install: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install + +# Special rule for the target install +install/fast: preinstall/fast + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Install the project..." + /usr/bin/cmake -P cmake_install.cmake +.PHONY : install/fast + +# Special rule for the target install/local +install/local: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing only the local directory..." + /usr/bin/cmake -DCMAKE_INSTALL_LOCAL_ONLY=1 -P cmake_install.cmake +.PHONY : install/local + +# Special rule for the target install/local +install/local/fast: install/local +.PHONY : install/local/fast + +# Special rule for the target install/strip +install/strip: preinstall + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Installing the project stripped..." + /usr/bin/cmake -DCMAKE_INSTALL_DO_STRIP=1 -P cmake_install.cmake +.PHONY : install/strip + +# Special rule for the target install/strip +install/strip/fast: install/strip +.PHONY : install/strip/fast + +# Special rule for the target list_install_components +list_install_components: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Available install components are: \"Unspecified\"" +.PHONY : list_install_components + +# Special rule for the target list_install_components +list_install_components/fast: list_install_components +.PHONY : list_install_components/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles /home/rvb/git/rtl_433/build/src/CMakeFiles/progress.marks + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/all + $(CMAKE_COMMAND) -E cmake_progress_start /home/rvb/git/rtl_433/build/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +# Convenience name for target. +src/CMakeFiles/rtl_433.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_433.dir/rule +.PHONY : src/CMakeFiles/rtl_433.dir/rule + +# Convenience name for target. +rtl_433: src/CMakeFiles/rtl_433.dir/rule +.PHONY : rtl_433 + +# fast build rule for target. +rtl_433/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/build +.PHONY : rtl_433/fast + +# Convenience name for target. +src/CMakeFiles/rtl_adsb.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_adsb.dir/rule +.PHONY : src/CMakeFiles/rtl_adsb.dir/rule + +# Convenience name for target. +rtl_adsb: src/CMakeFiles/rtl_adsb.dir/rule +.PHONY : rtl_adsb + +# fast build rule for target. +rtl_adsb/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/build +.PHONY : rtl_adsb/fast + +# Convenience name for target. +src/CMakeFiles/rtl_eeprom.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_eeprom.dir/rule +.PHONY : src/CMakeFiles/rtl_eeprom.dir/rule + +# Convenience name for target. +rtl_eeprom: src/CMakeFiles/rtl_eeprom.dir/rule +.PHONY : rtl_eeprom + +# fast build rule for target. +rtl_eeprom/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/build +.PHONY : rtl_eeprom/fast + +# Convenience name for target. +src/CMakeFiles/rtl_fm.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_fm.dir/rule +.PHONY : src/CMakeFiles/rtl_fm.dir/rule + +# Convenience name for target. +rtl_fm: src/CMakeFiles/rtl_fm.dir/rule +.PHONY : rtl_fm + +# fast build rule for target. +rtl_fm/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/build +.PHONY : rtl_fm/fast + +# Convenience name for target. +src/CMakeFiles/rtl_sdr.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_sdr.dir/rule +.PHONY : src/CMakeFiles/rtl_sdr.dir/rule + +# Convenience name for target. +rtl_sdr: src/CMakeFiles/rtl_sdr.dir/rule +.PHONY : rtl_sdr + +# fast build rule for target. +rtl_sdr/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/build +.PHONY : rtl_sdr/fast + +# Convenience name for target. +src/CMakeFiles/rtl_tcp.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_tcp.dir/rule +.PHONY : src/CMakeFiles/rtl_tcp.dir/rule + +# Convenience name for target. +rtl_tcp: src/CMakeFiles/rtl_tcp.dir/rule +.PHONY : rtl_tcp + +# fast build rule for target. +rtl_tcp/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/build +.PHONY : rtl_tcp/fast + +# Convenience name for target. +src/CMakeFiles/rtl_test.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtl_test.dir/rule +.PHONY : src/CMakeFiles/rtl_test.dir/rule + +# Convenience name for target. +rtl_test: src/CMakeFiles/rtl_test.dir/rule +.PHONY : rtl_test + +# fast build rule for target. +rtl_test/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/build +.PHONY : rtl_test/fast + +# Convenience name for target. +src/CMakeFiles/rtlsdr_shared.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtlsdr_shared.dir/rule +.PHONY : src/CMakeFiles/rtlsdr_shared.dir/rule + +# Convenience name for target. +rtlsdr_shared: src/CMakeFiles/rtlsdr_shared.dir/rule +.PHONY : rtlsdr_shared + +# fast build rule for target. +rtlsdr_shared/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/build +.PHONY : rtlsdr_shared/fast + +# Convenience name for target. +src/CMakeFiles/rtlsdr_static.dir/rule: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f CMakeFiles/Makefile2 src/CMakeFiles/rtlsdr_static.dir/rule +.PHONY : src/CMakeFiles/rtlsdr_static.dir/rule + +# Convenience name for target. +rtlsdr_static: src/CMakeFiles/rtlsdr_static.dir/rule +.PHONY : rtlsdr_static + +# fast build rule for target. +rtlsdr_static/fast: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/build +.PHONY : rtlsdr_static/fast + +librtlsdr.o: librtlsdr.c.o +.PHONY : librtlsdr.o + +# target to build an object file +librtlsdr.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.o + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.o +.PHONY : librtlsdr.c.o + +librtlsdr.i: librtlsdr.c.i +.PHONY : librtlsdr.i + +# target to preprocess a source file +librtlsdr.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.i + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.i +.PHONY : librtlsdr.c.i + +librtlsdr.s: librtlsdr.c.s +.PHONY : librtlsdr.s + +# target to generate assembly for a file +librtlsdr.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/librtlsdr.c.s + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/librtlsdr.c.s +.PHONY : librtlsdr.c.s + +rtl_433.o: rtl_433.c.o +.PHONY : rtl_433.o + +# target to build an object file +rtl_433.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/rtl_433.c.o +.PHONY : rtl_433.c.o + +rtl_433.i: rtl_433.c.i +.PHONY : rtl_433.i + +# target to preprocess a source file +rtl_433.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/rtl_433.c.i +.PHONY : rtl_433.c.i + +rtl_433.s: rtl_433.c.s +.PHONY : rtl_433.s + +# target to generate assembly for a file +rtl_433.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_433.dir/build.make src/CMakeFiles/rtl_433.dir/rtl_433.c.s +.PHONY : rtl_433.c.s + +rtl_adsb.o: rtl_adsb.c.o +.PHONY : rtl_adsb.o + +# target to build an object file +rtl_adsb.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.o +.PHONY : rtl_adsb.c.o + +rtl_adsb.i: rtl_adsb.c.i +.PHONY : rtl_adsb.i + +# target to preprocess a source file +rtl_adsb.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.i +.PHONY : rtl_adsb.c.i + +rtl_adsb.s: rtl_adsb.c.s +.PHONY : rtl_adsb.s + +# target to generate assembly for a file +rtl_adsb.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_adsb.dir/build.make src/CMakeFiles/rtl_adsb.dir/rtl_adsb.c.s +.PHONY : rtl_adsb.c.s + +rtl_eeprom.o: rtl_eeprom.c.o +.PHONY : rtl_eeprom.o + +# target to build an object file +rtl_eeprom.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.o +.PHONY : rtl_eeprom.c.o + +rtl_eeprom.i: rtl_eeprom.c.i +.PHONY : rtl_eeprom.i + +# target to preprocess a source file +rtl_eeprom.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.i +.PHONY : rtl_eeprom.c.i + +rtl_eeprom.s: rtl_eeprom.c.s +.PHONY : rtl_eeprom.s + +# target to generate assembly for a file +rtl_eeprom.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_eeprom.dir/build.make src/CMakeFiles/rtl_eeprom.dir/rtl_eeprom.c.s +.PHONY : rtl_eeprom.c.s + +rtl_fm.o: rtl_fm.c.o +.PHONY : rtl_fm.o + +# target to build an object file +rtl_fm.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/rtl_fm.c.o +.PHONY : rtl_fm.c.o + +rtl_fm.i: rtl_fm.c.i +.PHONY : rtl_fm.i + +# target to preprocess a source file +rtl_fm.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/rtl_fm.c.i +.PHONY : rtl_fm.c.i + +rtl_fm.s: rtl_fm.c.s +.PHONY : rtl_fm.s + +# target to generate assembly for a file +rtl_fm.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_fm.dir/build.make src/CMakeFiles/rtl_fm.dir/rtl_fm.c.s +.PHONY : rtl_fm.c.s + +rtl_sdr.o: rtl_sdr.c.o +.PHONY : rtl_sdr.o + +# target to build an object file +rtl_sdr.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.o +.PHONY : rtl_sdr.c.o + +rtl_sdr.i: rtl_sdr.c.i +.PHONY : rtl_sdr.i + +# target to preprocess a source file +rtl_sdr.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.i +.PHONY : rtl_sdr.c.i + +rtl_sdr.s: rtl_sdr.c.s +.PHONY : rtl_sdr.s + +# target to generate assembly for a file +rtl_sdr.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_sdr.dir/build.make src/CMakeFiles/rtl_sdr.dir/rtl_sdr.c.s +.PHONY : rtl_sdr.c.s + +rtl_tcp.o: rtl_tcp.c.o +.PHONY : rtl_tcp.o + +# target to build an object file +rtl_tcp.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.o +.PHONY : rtl_tcp.c.o + +rtl_tcp.i: rtl_tcp.c.i +.PHONY : rtl_tcp.i + +# target to preprocess a source file +rtl_tcp.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.i +.PHONY : rtl_tcp.c.i + +rtl_tcp.s: rtl_tcp.c.s +.PHONY : rtl_tcp.s + +# target to generate assembly for a file +rtl_tcp.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_tcp.dir/build.make src/CMakeFiles/rtl_tcp.dir/rtl_tcp.c.s +.PHONY : rtl_tcp.c.s + +rtl_test.o: rtl_test.c.o +.PHONY : rtl_test.o + +# target to build an object file +rtl_test.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/rtl_test.c.o +.PHONY : rtl_test.c.o + +rtl_test.i: rtl_test.c.i +.PHONY : rtl_test.i + +# target to preprocess a source file +rtl_test.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/rtl_test.c.i +.PHONY : rtl_test.c.i + +rtl_test.s: rtl_test.c.s +.PHONY : rtl_test.s + +# target to generate assembly for a file +rtl_test.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtl_test.dir/build.make src/CMakeFiles/rtl_test.dir/rtl_test.c.s +.PHONY : rtl_test.c.s + +tuner_e4k.o: tuner_e4k.c.o +.PHONY : tuner_e4k.o + +# target to build an object file +tuner_e4k.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.o + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.o +.PHONY : tuner_e4k.c.o + +tuner_e4k.i: tuner_e4k.c.i +.PHONY : tuner_e4k.i + +# target to preprocess a source file +tuner_e4k.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.i + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.i +.PHONY : tuner_e4k.c.i + +tuner_e4k.s: tuner_e4k.c.s +.PHONY : tuner_e4k.s + +# target to generate assembly for a file +tuner_e4k.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_e4k.c.s + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_e4k.c.s +.PHONY : tuner_e4k.c.s + +tuner_fc0012.o: tuner_fc0012.c.o +.PHONY : tuner_fc0012.o + +# target to build an object file +tuner_fc0012.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.o + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.o +.PHONY : tuner_fc0012.c.o + +tuner_fc0012.i: tuner_fc0012.c.i +.PHONY : tuner_fc0012.i + +# target to preprocess a source file +tuner_fc0012.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.i + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.i +.PHONY : tuner_fc0012.c.i + +tuner_fc0012.s: tuner_fc0012.c.s +.PHONY : tuner_fc0012.s + +# target to generate assembly for a file +tuner_fc0012.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0012.c.s + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0012.c.s +.PHONY : tuner_fc0012.c.s + +tuner_fc0013.o: tuner_fc0013.c.o +.PHONY : tuner_fc0013.o + +# target to build an object file +tuner_fc0013.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.o + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.o +.PHONY : tuner_fc0013.c.o + +tuner_fc0013.i: tuner_fc0013.c.i +.PHONY : tuner_fc0013.i + +# target to preprocess a source file +tuner_fc0013.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.i + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.i +.PHONY : tuner_fc0013.c.i + +tuner_fc0013.s: tuner_fc0013.c.s +.PHONY : tuner_fc0013.s + +# target to generate assembly for a file +tuner_fc0013.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc0013.c.s + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc0013.c.s +.PHONY : tuner_fc0013.c.s + +tuner_fc2580.o: tuner_fc2580.c.o +.PHONY : tuner_fc2580.o + +# target to build an object file +tuner_fc2580.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.o + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.o +.PHONY : tuner_fc2580.c.o + +tuner_fc2580.i: tuner_fc2580.c.i +.PHONY : tuner_fc2580.i + +# target to preprocess a source file +tuner_fc2580.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.i + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.i +.PHONY : tuner_fc2580.c.i + +tuner_fc2580.s: tuner_fc2580.c.s +.PHONY : tuner_fc2580.s + +# target to generate assembly for a file +tuner_fc2580.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_fc2580.c.s + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_fc2580.c.s +.PHONY : tuner_fc2580.c.s + +tuner_r820t.o: tuner_r820t.c.o +.PHONY : tuner_r820t.o + +# target to build an object file +tuner_r820t.c.o: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.o + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.o +.PHONY : tuner_r820t.c.o + +tuner_r820t.i: tuner_r820t.c.i +.PHONY : tuner_r820t.i + +# target to preprocess a source file +tuner_r820t.c.i: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.i + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.i +.PHONY : tuner_r820t.c.i + +tuner_r820t.s: tuner_r820t.c.s +.PHONY : tuner_r820t.s + +# target to generate assembly for a file +tuner_r820t.c.s: + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_shared.dir/build.make src/CMakeFiles/rtlsdr_shared.dir/tuner_r820t.c.s + cd /home/rvb/git/rtl_433/build && $(MAKE) -f src/CMakeFiles/rtlsdr_static.dir/build.make src/CMakeFiles/rtlsdr_static.dir/tuner_r820t.c.s +.PHONY : tuner_r820t.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... install" + @echo "... install/local" + @echo "... install/strip" + @echo "... list_install_components" + @echo "... rebuild_cache" + @echo "... rtl_433" + @echo "... rtl_adsb" + @echo "... rtl_eeprom" + @echo "... rtl_fm" + @echo "... rtl_sdr" + @echo "... rtl_tcp" + @echo "... rtl_test" + @echo "... rtlsdr_shared" + @echo "... rtlsdr_static" + @echo "... librtlsdr.o" + @echo "... librtlsdr.i" + @echo "... librtlsdr.s" + @echo "... rtl_433.o" + @echo "... rtl_433.i" + @echo "... rtl_433.s" + @echo "... rtl_adsb.o" + @echo "... rtl_adsb.i" + @echo "... rtl_adsb.s" + @echo "... rtl_eeprom.o" + @echo "... rtl_eeprom.i" + @echo "... rtl_eeprom.s" + @echo "... rtl_fm.o" + @echo "... rtl_fm.i" + @echo "... rtl_fm.s" + @echo "... rtl_sdr.o" + @echo "... rtl_sdr.i" + @echo "... rtl_sdr.s" + @echo "... rtl_tcp.o" + @echo "... rtl_tcp.i" + @echo "... rtl_tcp.s" + @echo "... rtl_test.o" + @echo "... rtl_test.i" + @echo "... rtl_test.s" + @echo "... tuner_e4k.o" + @echo "... tuner_e4k.i" + @echo "... tuner_e4k.s" + @echo "... tuner_fc0012.o" + @echo "... tuner_fc0012.i" + @echo "... tuner_fc0012.s" + @echo "... tuner_fc0013.o" + @echo "... tuner_fc0013.i" + @echo "... tuner_fc0013.s" + @echo "... tuner_fc2580.o" + @echo "... tuner_fc2580.i" + @echo "... tuner_fc2580.s" + @echo "... tuner_r820t.o" + @echo "... tuner_r820t.i" + @echo "... tuner_r820t.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + cd /home/rvb/git/rtl_433/build && $(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/build/src/cmake_install.cmake b/build/src/cmake_install.cmake new file mode 100644 index 0000000..a706116 --- /dev/null +++ b/build/src/cmake_install.cmake @@ -0,0 +1,196 @@ +# Install script for directory: /home/rvb/git/rtl_433/src + +# Set the install prefix +IF(NOT DEFINED CMAKE_INSTALL_PREFIX) + SET(CMAKE_INSTALL_PREFIX "/usr/local") +ENDIF(NOT DEFINED CMAKE_INSTALL_PREFIX) +STRING(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +IF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + IF(BUILD_TYPE) + STRING(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + ELSE(BUILD_TYPE) + SET(CMAKE_INSTALL_CONFIG_NAME "Release") + ENDIF(BUILD_TYPE) + MESSAGE(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +ENDIF(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + +# Set the component getting installed. +IF(NOT CMAKE_INSTALL_COMPONENT) + IF(COMPONENT) + MESSAGE(STATUS "Install component: \"${COMPONENT}\"") + SET(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + ELSE(COMPONENT) + SET(CMAKE_INSTALL_COMPONENT) + ENDIF(COMPONENT) +ENDIF(NOT CMAKE_INSTALL_COMPONENT) + +# Install shared libraries without execute permission? +IF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + SET(CMAKE_INSTALL_SO_NO_EXE "1") +ENDIF(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + FOREACH(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/librtlsdr.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/librtlsdr.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/librtlsdr.so" + ) + IF(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + FILE(RPATH_CHECK + FILE "${file}" + RPATH "") + ENDIF() + ENDFOREACH() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE SHARED_LIBRARY FILES + "/home/rvb/git/rtl_433/build/src/librtlsdr.so.0.0.0" + "/home/rvb/git/rtl_433/build/src/librtlsdr.so.0" + "/home/rvb/git/rtl_433/build/src/librtlsdr.so" + ) + FOREACH(file + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/librtlsdr.so.0.0.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/librtlsdr.so.0" + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/librtlsdr.so" + ) + IF(EXISTS "${file}" AND + NOT IS_SYMLINK "${file}") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "${file}") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() + ENDFOREACH() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE STATIC_LIBRARY FILES "/home/rvb/git/rtl_433/build/src/librtlsdr.a") +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_sdr" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_sdr") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_sdr" + RPATH "") + ENDIF() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/rvb/git/rtl_433/build/src/rtl_sdr") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_sdr" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_sdr") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_sdr") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_sdr") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_tcp" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_tcp") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_tcp" + RPATH "") + ENDIF() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/rvb/git/rtl_433/build/src/rtl_tcp") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_tcp" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_tcp") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_tcp") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_tcp") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_test" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_test") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_test" + RPATH "") + ENDIF() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/rvb/git/rtl_433/build/src/rtl_test") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_test" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_test") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_test") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_test") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_fm" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_fm") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_fm" + RPATH "") + ENDIF() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/rvb/git/rtl_433/build/src/rtl_fm") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_fm" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_fm") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_fm") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_fm") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_eeprom" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_eeprom") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_eeprom" + RPATH "") + ENDIF() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/rvb/git/rtl_433/build/src/rtl_eeprom") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_eeprom" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_eeprom") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_eeprom") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_eeprom") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_adsb" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_adsb") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_adsb" + RPATH "") + ENDIF() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/rvb/git/rtl_433/build/src/rtl_adsb") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_adsb" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_adsb") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_adsb") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_adsb") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + +IF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_433" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_433") + FILE(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_433" + RPATH "") + ENDIF() + FILE(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/rvb/git/rtl_433/build/src/rtl_433") + IF(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_433" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_433") + FILE(RPATH_REMOVE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_433") + IF(CMAKE_INSTALL_DO_STRIP) + EXECUTE_PROCESS(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/rtl_433") + ENDIF(CMAKE_INSTALL_DO_STRIP) + ENDIF() +ENDIF(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + diff --git a/build/src/gfile001.data b/build/src/gfile001.data new file mode 100644 index 0000000..719cb8a --- /dev/null +++ b/build/src/gfile001.data @@ -0,0 +1,71 @@ +h~ {| s{ ~u | i|qu|~| ||}q~~{~w}y}||yq ~t~|~w{| qzx|z|voqy|{x yrl}y~w~lzkyu{~ss||lq{ xtzwzx|z~owtwslzytr~}~|}{mvy ~r{ry{uytz |qo}~xn{|z|| ~~|~xt}xwx}~qvzzs~{q wwpx~y|y}}|p}|||muz z{y||{ n y|yhx{tt|zw|z|v~s}x|w| yytrisxwuzzz xrr{w|nvp~~ t{w{yy{vw|uuzy{u{yz{y{{q{ x~|yo}t{t}y{ zq~suurv~~v}i}xsnwturz~{~px~~|v{w ~|y{v |rz}q~qwy~qqx{ oy~p |}}{yxy||}q{|zv~ls~t}~|z|{q z}|zssl| }u|w}|}zxyxu}szt{{}xxz {yzs|uz|qu}zs|{zly{ y|z||~{|qz|q{xx~~n vox| |www~|vxx|w{x }y{}|z~pruyz {{| }w|} rx|plxq{zz w}~}{tq~x}|| qt{r|v}lx{ {s~rtyou{rz~zgp~{~z{qrzt|n|v}{z{x |x~ ri~{z~ }y|{x|{}}{{{{{r yw yunf{wt{|| {|r}x|{{krpxyzy{wx tz}zzpu~|vz}zts||t}xzv}|}z |}ux~~ yz}~| }~{}szt{ryswuvzzzx|w~vyk}w|tsx{rnuwmy}n{}yzml|~v} xz~y|x~}z{ vuuvvvzy|}t~yz}m{o}}{q}w~~z{}yr}~|~xyz}~|wwx|~v~{z| ~xutzt~vz~|wyy~yojzu}vy}{yqx|twt|y} |~{mx}{|~u~x{{~zzy}u~w t|}~x}{ x}srwr}szuy ~sux}xvxovsz~}q|wrvws|vy{~sguwzsttrz zt~s{low|vx~w~z~ ~}{}wu{z}yz}|z{x{{vzyxtx|x~|~vz{zz{r}y}{| sw t vz |{tp{b t~v}~ y~t uupqvqz{~{{z|}r z{|}s{|zw}{zxz{|m }yy{~~up{{x{vt{w}x{ty}uzwznv| |xg|}|y|}tzy}u~jks}{zwx~mzz}yvi}xyz|~}~v~wtwvv{sww|wym| yu~{g}}t}w |y{zz|~z}zzzx{|t||zy}yqt~ }z{ty|zw{{|xy{yy y{f}|v~{u{|{|x{u}xzzt~~zso{t{rz~||}v|xy}t{wzy}{vwy~~v}|w~}x}|}x~}wt{t {w||{}~{~vhtyt{zx vu~}syvz}wt~y| z r|}vot{o|}~s|xzvm z}xs{tywz {zyw x~||}qz~v{vw ryo}zqx}~y pzyx| p{r{}y{} |}v|}{~zwn}|{zx{ystzuxkx}}ztzo{|}}uvxt}{{|{||vx|~s{p~q}t{y~}z~tu{} uu|y{w~uuvzqu}uy|~kt~rv|w}wzysyr{| w}}||v}t~wzy uxy y~z{nw|xsw x|{y~yqxyw}}|y{~}xxktvx~uyz{p||s}} }xz|u{|~p|p {|tmu}{v~pj}pyvu} t{{tury yp{p{~ ~x}~y|~s|yuw~}xy}v}urvtuq{tv~| z|v |y{v{~zvyt |z}~}wz }wp~|oizrtv~~ }|vwfuv xwdyxz {ps||rtuxzzsyz |p~s~xwwxp~t}y}yyw}|~~}x~zxuz|~~{w| quww|v|~zqz|w s|}xr|wszzq}yz vo}{zz~xj}x}~qsuuvvw~}qv{siq{yru~ twu|whnr{wzz{x {xyzqqt~~r|v{w{oo~}w~tj~v}{ nuu|z~w} }y{w}{xuwzqu}oyx~~~r{|y~ wxqoy}~q{~o~{z {x}z}wzrws~}z~skm|zqu ~woxmxuog}~ }~sc}ow|fq| ~q~p|{ds|y v}nryfyyyxwt z~ z ||hjt~wuw~px|xly~v|c{wht|vl|htir}~lvrti}}jgz|u~uwvr~qozy ypf vpl}pn{iyp yzk~~t{y} { u m{uu rvk|{~d}j}|~|xwmw}| xmu}povu urz ov~}pur~nov{tzyr{xvszuzrsvp{svou{ru|xeu~zzp|d{ixvq v}mo|~{{zoc|wx~ £|zx} ¡o}{ }zv{~{xx{xrz|s|lwq|jkzx pvz gi{qu| ~z|loxr| zvwt|{uu}fp{}z}yo¦yrj{jxdz|}{{uwzyz} r{i w~{y{}vz}rz|}nxs~}ro{qx~{jr|rx~rr}hzun{zw}wkyr|jyzswpp }tzzv|txvtx~lxyr}o nx}qy }~jzzqw|oxls~vo{s}~}wsk~u}zkqtwz{tnvvzv|{egz{zyxg{~t|u {yxtyus}zrpoy t}u~w |uss~rmu |~~zqf~~vxt}s zzyt wwpZt|}}p}xxzv}x~v|yvyp~vv^z~r}}t¦r|tv t{wz{d|wo}wuw~|l}x{z zojq|uouvw~uxlupr {vythttw~nyi~tl|ttyw}p nw} x {}{xvzx{ vx|}}|xwuupmx|x j}sv}wyysy~|mo{{pqq{z~t{|z tyz jtt|mzyuw}~vjyx~|~w{}y~{}{~y ouxuzwup}yy| ~uwxuzspwszwz}|}}mqnyx{x{jitq{uvsur}zrlzxw}q{{~u vz~ytqr |~x q~bo}wzvw}~{}spf~{u{pmx~ x~~yxy ~{~ t}qr |tx{{n {~{~| s~ y z zx}|w}|ywu|v}z|zvpy}pxv}w|}~qvi}y{qoyo~zxyhw wz|xz y~xw{|s{us~x|w v ~yn{v}z}z|}um~zwvyzeyn~|t qlwu qz}np}|yu~s{{k~}z{{xyy}x~~yystx{n {x|vjw |~~fz|z|p||ty wtxs tzqzlyvxx vw}u} y{x{}s{zz{vz|z|wzz~ ~}wsz~|~{}{v~xx{xq{}tq~xwxyqywyyl|uo{}q{ |ynxyv{{|}|y~ye{}yvvw~y~zr}vtsurwx{sy}v~ x g~r~{}}}uy~k|yyosy}}xf{ t} ypsu|{{t~~~w{~~}~m{ |zpwvvz}|{ v~{xqwv}~v{wwyuurx|u~xn~ puzzw{zy~{|nxw}|{w xur{v}}{{lxz}ys{qjzz ~q|ny{ | u~{vu tvu{u|xp}u|to~q{qxt{wqtyq|{{ys~y} {m{zq~ozswxzq}vxkx|r~sv{uqr}yxwr|{|{s{w|~}w z|zx~y|}{}{ ym~ow|{~w}yx{c{}m u|~|~ ~| zso}tx{t uz}xzy{u~|{x~u|}}{vxp rqhvvyuof|z z ww}upzskn|y|}{sjz~my|}m|zvpj~p~iy~}}q|knk~v~m{{{~upp}ec kr s| ~sxkqzm~r|ry~zg~}yr~}pzyyl}~y {yvr{smtyst}mxsyu} ||xuq~wy hx} zx~yj||}oy|xz |||k wsx|z|~}s|w ztywo|zxxs ~x|}{ymou~rz u}~x}} r|grxu}|y~~xqz~qz{p~y~stx~|wx{ |~ }r}wxyo~x|{yzu~pf}t}{~}iww}u|v ||~{upmt~wzmzrp{|{||ww{z |ww~zz|wx~xwh|w|w z}{ w_{mu}xy}y} y~ z|~sr}|ysqzk}sjy z{z|l{r{~{w{z wo{zt{} {kzvz } {{wtzrx}qw~zwv~|x~ |x}~wz~} xw|s{vz}{~}c }du|yo}xv|z {vz~xfzjo}z{~us{x nxry{|zz|zzz{z{|yvfspuqzzrw~~mz~v {xtqwzuou~z|wv| {szr~w{zyt~ zzmzyw}z }}tqt~ttz{}{v wvxt~uwzwk |wx|z{|rzo~ysy}xyu|~~| { vqzwz{us |tsx~yz||~}|~}vyz |y{| x|~|s p|vu{zn zowz} yxop|twuzsg|| {gzw||~nv~~z~uyzz~{wzw|u|u~|y}y|}rxvz v}oo {}my }u}w{usdy~~y{|~{qyx}~|{~zpt~ svt|tzu|uqo~t}y_ } ¤} zvt~u ~wq~oszy||}nx{~y{~v|szy}wt||~xq zs~|mrz ox|~rcv}}y~yypz y~yxvov~}|p o|tvy~ y} vukz|~s|~y ~wpmywz}srvi{q{{won wqixzwiqr|}}}v~x|pz|t p h ~`k x| xzut q}xq{z }~}m~vyy~ x}~wx{ }|~{{{|xx{~{~ v{zxnx ~uwwx|~~xv syp{vx v~n~yv|w} px sz{ {~}~u~pyw zxzu~ |wz~~ |zxt {{zsdz~e{}ksoz~wwr { ~sp~{ {}{yv}r{{zvq~}x{uow y~yyr`t ||mz|||rgz~uxuy{|qr~zu}xy{{yzrw|x~sv}y|vx pw}xs s~svb}v|}o}ww{{{qz||{txt y|hz}~u|vu~uz~z~~z srzn}t}u ~x}{sz ixw{}tt ux{{xz}cv| zpvy|w{|vi|yove}xsunux}z}z}z}}zs{ {{ zxp||~uvx|}}uxu }p }}|mu~ tz~ zr}l~}}w{~|zvo~vxz}p | ptwrtv} woj~z ¢u~}|{zwy|t~~|}qn {}k}||n|w|}mwzw}wttty{{{ ~|txy~ q|pvxy~nxm~{su~zqvtpzy|x}t|h}xy}~ktz~vt{azw}{x{wx{~tww}~s~qty{}|} y|||zy}~}w||}w} u{wupz n||y|{n~}tyy{t}{{xn~~~~u~|~wv {v} y } ~yvsu{ w}z{ x|jt{~|~ ~ zv~|yzy~y{}~z|xx}uv|uoyu}{}|twu z zyuu||tqy~xu|v|y|pv|ss~m |{rn{w|yyzu|z|uontvvzsxy~~{y|| |w{~~z}|~z~meyyz~r~z z~{ t~wzwg||wxz}xgrvw~z{|rkzsp~y~uyww~~{{}{ uzqww}xnv }u|{~s~zu~~iv~xu~w}~y~x{wst}|xzz|ky}yhz |z{{rru t~{zp qzkiqzvwx}{t}wyr{z}~ zw|wh}y tv|{y~wy{|xwyz|t}}qu rrr{{vy|w| |}ovp{{} v|hs|}z pqqnu{r{yzvpyz }x jr||~ ouy}{yzz xx xuyw}{}xz|~|wyzvww{r{{zy{j}tnzwx} n{tvo y rfu}|~wkzx}x |vzxy}{}}~zuv |}tv}yz{u{{~x{xy{r{^~xzy|zuwpvsu}zxjzsuzrvm u~|wz~v{~z}w v~vy{~}yqo~rxwp}wsssr|m zr}k~t}yhuyw{ y~|{|zv{~{{||z||y{z{yzuknw}wx wrq~p}wv|`zoxsppvtkm{szzzyxw~yqjrh|w j~{pz{r i~q|r{kzzu{vy} kn }uxjukvvqz~urv|{ox}l}qsmp|l~qwpt{uwvzwq{ xpyo wsyx{}wzyxh||vw un|rw{yz{{vtop|ywy{~qxxyzqop|{|z~wzy~|p z~ yrxyz|zpz}i } ||}~|uyav}}wttx~ {vg}y~w|}|ty{~|ot~tzztyxmsvu nuxpp~z|q vvz|m |y wn~ty}tny{xw{|y|qiu~ypoxxtv}zk{||wmvx}zy~~wu{~zzo v}vu}s~xszt| y|}y~|z p{yv{{yyz~xw}lm ntx| s~vpzx ~nzyzyyu~{sz{yqxxx }ty|sr~z~|y}}yy~zzww~y | qtu}u{ ~}up uzwzzrm|} ss{~z s{cpz}| {{t {{zw|uzp{zzxy|}t{~~ts|x~yzo~~}zyz}hx}www{s}y {|q|zu~s|ssyqzu~|yo zrvq}zvx{{} {xuvswo}x s v~w x{wzwv vq|~yquzy{{s~zz~ wy{x}z w|yvuyvv{vw{z|zz}}ox{~y}yyus{}o{{zy|z}vwrzwxw|zt}}|u|n{}pvn}~o~o|ut{{v |v orrqz~s{y ~{wk{uxy|~u|~ zzup~~y~vx{xrqu~xt~{~}~}~}|zv|}pvxz}}tm}} t |zrz~w|}~{}yry{}rv{~{}ouyxyy{|}w~s}|vz|x|vwt|w}~|}{z{|}u~~~yzsuszx}ku~wxqzw}y}tzrxxzy}}y}y}w}x }~x|}~z~yxuxy|||l{z vop|t~wu|zslw}w~tutq }yw vzx}xzzx uxtwzzz} {|{}qs|zz{}q|| z}sv|{}oq}|~z|}xzxv{tz}|z |~}{ny xglt{r|{ urrwosm|z~rs{~wtw}u|{xz}tyiu{|ov ~wu{~ t~ u~~ziy~~w{tt{}xz}u}xx}}wn|kqz}x| z{qyuxww}{z~vnu|}ln z }vpu|k{~}x}{vz~xt~nzwnwz||zuxz zz{|z~mw z{trx~{p~kzw~{|w{{~wy{yoxprz~uv}t~ ~xq~yxy{}{ y {yv~~k~}~{vhz~ip|y}wwuv ~vz{sz ~vrrys{sv}otx qxr~s}y}|us}slkvvwn{qywxsar}}x m sux~n|~scuuxvpxx| qp{w~znumdq |t|kzjn~y~vk |swzv{sy{ynun}i{jt{zgssstxx~wy{ sy}w|{zv{xyuyy{t~z{~z wqwyy|wz} ~{zuus}gzzwzp }~{ryx{x{z}v{y}vzp}zv||}y{jys~ywvqup~{vr~ox tzlq~vw~} s~{|r{{ }uy{} v}wymwy{wyo{y ~ws{}zz|u}{ nv~}z{vzwyyzp~}vz|r{{}y{}rj{|zy|zpnx}xtts{w{{~|}}z{wut||quxu xwzxvy|||{|}} |p~z{k|r~jzl|k}{umx z~v tp|}q}wv|y~v~¥xy{}twz}|ny}b{{xt p }}yl|}o{|~~r| w} {~b z}lk v|k|duwzjmw{wr ~u}}n}h|l|hmt}}t~tyz~|]zsvpzw|urwtg}uvys~~}x~w nqz~t~xzoz{v|ouys{{|ua~| jm osv~xt~m ~v|wx|~{ql|yyt{~|upezzt yv~vtlow w|{nhx u}zlrynhtwutjx~p{ rj {|x ~xumm{}}ts}twy{szg}||rbvzv|plj|{ w|zquvpvp{psywx| z~}~w{yz{tqer{}x}tr}{r{o|qtzvy~p|| {}~n|{rriz~xx|qywyvxvs}mhqszujvu v_ous{rio~~ mlwnw|~x{ £vwznsz~vy|rrr} ~|xs|yzzvynvox~}txvju v}~sj~}|¢ up}z|o xysrn}zvxoxzrg{w} xrlyu}}hxx}|x{jxvrvisnwsoo }vZvxztgzu{ttyljvl xs~ y}z{p~|t|xvlzxws{w~h|w~w~y|i~~z ubytz {xz|rwxktvytw~}{~ztz~zxt~ lz|u u ~n{u}~ v| z{vz~x }{pyj{jw{vz~rwusy|x}xwu~tzzr {| ~wxsu }{~~|||{ ~||x{y |{t|~zc~y~w| |~vy{oyz~x{xw|zp~ z{v~w{z{|~}y}{|wtz}|vzy tp}z| uw} }zz{nsw} qpi{}n|yt{|zy|}zz x}w{v{yq}|~|w~~|z}x|tzv}~}v}|x}~~xyl {vmd|y{sx |} p |yv}h | p}yyv}}nxtuyq ~|}kzl{~yxy|}y~vtstl trzz ~~f~axv}ozx}zysy} gtvpx~}xv~vtss|ny~zvx}qvuut~|wyy}e}|tn|qzxytpt u|{~uxwrpqq p~rwb{xuv~t{vu}~gt tvky|w}~w~kwz~uvs{t~s s{l|wv ||||}xx~wnwy}z {zyz~yu~|||r|}|}q}sv}~pltu uvtrtz || }xx~y}~~ vkty~} s| }w {ux|q}}v~z ~ uwwyzx~ysqyuwv sxqs{}{y{xyz qvk|{v{svu pxztwz~p{uyp{vxq|xxzz|~vy|~zqw|worx}t{{quwt~u{{s}u{}tww}t{|zzwlnzs { }w}|{}v{~x yz{yyvy}{}mxs {|||wwy}}x t}nhv~}}~ }z}{yq|rtf~~|~vm{ysvuv ~~x~|yzznz|u{}}q {~srro{~~x~x}{xoznz|p k wzyszuw{||u}py{y{v}w{~zxx{q~wqxutsv{xsyk n y{{lw{~{~{{|y}~quyrywvvtxxx~t{w{z}x~ v|uz~szzyq|uw|} zw~u{|{y|{zst}{s~|xy} r u{zmysy|ox f~vnznrp{ttltzz ~|~t}t}vq{tx~|kts~zt}olnx{x~wtx~y|qtvs{x ytr~ut}ow~lxsx~oh { u{yuysv^xo}rpuuw{}st~y sryxuhyjy}~|tyszxyy{z vn~}mp}~u~ ~|w u~p{zv{||r{|r|wxx}{xpzxz~n|~z{z~ }w~| zx{|~ }}x{vjuz x}}xwguy}|~v}zk~ ~w{x{v} |yvq}}w ~~wz}|z|}}~|yqzsx}|{wss~z|{}}oy{zzryyxhx|~r}vn ~tuuxzr}}z{|||z rsy}s{ zzz|||{t{v| z ~{||zvq{gt{|ynvts}q~~zx }z{}zi~sp}}|~ }}x|szw~{zrw ~~|x|zzx}zzx ztw~ q{{||{{p{yy{wvx~xs~ {vt y}~t~ ~}o{{}|~} w}{xh{z| pyvy~ ||zryxuy~~y~y}|xyy~}}zxzyvx||sxzu |x | z||}v }rrh}zx|nvwr}o}axzp u~vs{l|zuyv|~} x{z~~||y{}}||~|~{z }z|w{y}z}w{|u}}~}x| t{y{|| }}q{~u|{~y}z{z{~x}}{~}~zpz n {z{vzwsuiz~wv{|tx}|p}zv|xt{~ tkz|sw{ v|q{{}~~uyw ~|o~zp{ykz~j}vv}yu zu}swt{}~p|||{~uwz|}||}~r~~{|s{ ~y}|vkwzz v ow gwl~{y|m~tusxqzt{|~u ~us}}t}v zv}u{ytpy}~~q|~~~st}z zvky{}~z}vt~}y|u~|zxwz~z|{yzx}z}sx}pw |~|t~ }o|vwwmomx}{xpv~y}{q{vy x{ |ywvz|{y y y}v h}}uy{y{~ {|}{lw} |mn z y~ru|zz~o~~yp|~|zwyqypx}~xw z}~~ot~x~{}q|}~~}|t{}{}~}~{z~{r }wpyzyu z{j|{} zww}pxq wtvtv|y ytvpvvr w|{yyt~yyv{uxuwt} tywt{qytzjzxt xx}wy~vl}eq{um{tz}ymz~|xywyz}z }yxv|wuzxy}|y|~}{zzys~w~ v~woy{{~kzlzw|||x}y~ y~h{x}jx}gz|x}}z| pyx|||}q~v| qww~{q~~yy y|s{} }xr|zyw}}}s|{ut~~ znv~s}p}}pr~soxurs\kw}y zqz~f~zum}uuyqqy|sqyoxz|£oq w~px}toewtyxx l{owtistz~k~vw|}ouz~rwy~xvx{wuur~{ty{w~ly {{pv}{spo~wtkxtzuw}}ww}}vtv{w xzz{poz}|}} |w{}} up| } x||~u~sx|v{t vy|x{q~vrw~{}zj} zm~o}stvw |{|xz~z{m|x{y~|xs{wy v|{ r}}vwxq~p}t}w| zjo z|y|}~~v~rvm|{y{~|}l}}at}t{|zw |x~{l|} v} z~xy||p~yy{|s|}{ uz|uz}p|~p~x}vu|~x{rw~y{{ }zt}y{}wnznuyw||s~{||{uw}|y~|zmv u{s{uuruv{o{uwtuzz~ |t~uyvvtyp{|{t|}|}t~xs w~sxw {ly}se {j~~uzu pxuv~n{v|~~y~||v}~yz~ lw }}z|xyv uqq}p}zu m|tvzy| xysy~z{~v~ {uwxz|}w|}ww~~}y~{n}x}z{s~|~ty~|t }o|y}uu~} }yv x{rr}~tx{ rwzo||y }|znws}put|~rx {{zzq }yylzq{wx xsyxj{u|xuzqyzx{u~xysv|t{ uzo}xwlwx{zv~v~{xxzy}~}y qy |||xyz| ~ |ws~zvm{yu{uw|||~{q}xwtxvs~gzwy{xsu|z qys ~zp wz{{y{w~y~{xx|ppxt}{ w{ywyx{{y{{z|z}| zo}z}yy{uusv|}sxr ~~xu}t|pw~xz{|x|}uzv ztv~j~sy{~ }|v{x |}qo}||}~}dw}|ow|o}y}~|}y y w|yz~t{xx vx {wx~ y|{~}~|~} hwww|{p|r |u}zxyv~ }yo {n |z~~|}z~k| z~pwyuz~yyyuxv~{vdrswyz{w|}yzz {q|zy~pp }~w{sx~z}}|~~}xq} y{ ~z |}vyq{||} zwq us~ vvxyuv t|~x{|xw{ {yt }y|~}{s|{v| ~z|gstw~¥s||~jw~y|myluqp|x|{}}k~v~ r~pzyzm|q|{v}~{z|x||{zs{wxt{|yz|} tyt}{mjuryz~xw{~~z~|slr{ws~u{}y|qo~}o~w{}pwqfs{}z ¢|}|s}{x|~vtqrx{rotypn{~syx wzywkzxgrnt}tuxxls`yxfx{l§nwu~qhv{x}nowt rokt}|~~ywxxqxsxw rt xgsr|sm~qzsdxr|{u~mwwrsr{}yzv njnvo~q| |ty}rux~ywuq zyjqx}|~}ny|{~| uzxyz}~y|sp s}t{y{~}yv}|wh zzzq|w{|{~xz~pz|zzv{{v tmq|}xys ||t yt|xvzn }{ }yv{}q~ws~prq~vnm{vvv~wxh~|ytzo~n~mwzz~y~vxry||q| }|xxuw|x}~x z~|{{ytz~y{y{te{j~|mez} }hzy}~ xoyzs~tyxwyx{}~ov y|syts|~ |st t}~ tyy{zwx|~}x|tzvk}|zy}z~v}zq z~womyzw||}|qv }{mouzvvt{~w ~uotyt~ yyywyzzwxz z}|s~zyzw|w{x|wy {wr{{z}y|w{~x{|u}zy| ||xz w}zy wr~yzv}wq|y}}vv|~y|vy{ft{yx~}suuuz}x~wzzs{~{{~svgrs xnyk{|srxt vj|||r{qovy}rwss|~ vt|ysxy{{}~y}xw }w}u~w z}v} |xtwtzw}}quw{{zxvpyv{~|ywm~v|yyunxyt}~vxz~zyxyv|vxuq t }xyovy{poutyq{xzv|riavlmtyxtzyw~pwd otvvu fu{tznm{xrzsywp}swp~itx{x~}rt kvuxr|us~ns}xv lq xl}emzntzg{z~pysl| xw}xow~|{}w{|z{x |~ry}v{~}xyx xrwy~{ym}zs} ~|y{}vvzj~pqxuy|p}~}rxo }z|zu{yy~|~}{ wyz~||| uy{xz~~yk|x{v|oxlewu~qr|{x~jwiutzz|ru~ }}}}sm| { | ~yv}v|zy{{~r} x{{||uy||wy{yvl~}{i~vkixqyuruyrz w~tolzyo {}q~p} ~j}v~~||tx{ww~{~~sow~yus{mwyz~ ~ytwrxt|x~p~~|u|}zusnuty~}ywyszi y|||}~{}|~zytz|}y }y||}xqy~{y}mw~vxtv}|ynu|zu z~zs||wsu}w|{|sl{vy z ps|{zwtuw~ww{ z}}w}z~x}ux} v{z||{y~y|{v}ny }zluw|{~kmw} {~ v~zmzitxo|~y{~z zt}yz|}wvz z}wyvyv}p~z~}zpy} uw} zxz wnx}xw~|zhw|s~s}mkqrxgvxwpvm~tusw|~uqzxu~ojis{lxw|}y{tyyv|jo}j~vszus|sxqfsnhrt yfu|{ryqykyxwrupknv]zvxv x~{p}}jnvprosv{pm|twuy|yj~ xk|wlktwp|z{yux{puyt{}q{rnutyi~v~iu|t|}tqg^tt{~t|go}yZw pyxtn~zz{x{{xz{|~q|kx{}~|y ¦yzzjutw}}w}}~~sw|ttzpa{y} }~gt}ytxxeuwu|~d|{ }{|oyY x |vzx} y}wnrn~|zu |~{zvx|wb ytuk|wm x{ymururxhnnuyvyux ~} |vkz ~mu|nzxq¡v|wz~ w{vrvy}y}vu }tr|sq|t{wsur |}tuyz~w{ xw{t{y~xwx~tqw}~{||p ~|z~ y~u{wvuwq|t{ oz{yvssy~zjy{e|urx~}}x xtr~z{iyf}q~oi|{}~vszx px|~~}z rv~ zvrjy~}x}~ o{g|lp|}xyxqzysmku{zzny~x{jp]|pt} w||u }xx~ty |~ip|sxzp}}lrm{{}l{h}rix~{wq|}y| {trv~yi~}}~|xx{{rc|zzq|r~{ qqyy|trwtz|~z z~ yt}}~s |~~}|uypzr{ wxxr}{y}l}{~ ~{|vysvu{wwxu}{{ |qv|r~~|{w zmurrqp|x~|{||wtz~x{q|~ vspx uuy{x{ www x~qgqxp|uut}|qy}tt} }~rzvyyrtrv xm{ux~u {} z~tyr|w~|o~xtyxx~v|w}||m|wyuwqm yx}k{xxyg}w{{okx||z~|yz|wyrx{~{wy{|xow|}l w~w{x{y xztnv {|d~}~zyuy| x|lny{x {} }u}z}}svq~vv}vyx}s}y{w ~vs}v| wy|z{z~{|{wxzxux y|~ ~{x|}znuy}~zr}|{ i w}uyyrry}su|ytzzyu}}}}~quy ry}nwsnwpy|v~x yrt}~|}suzumzswyzdpw|trwdq|~ nwr}x}}}h~~ikyuvuz{~~{ l{}|v |usxr~ uwppu{x{}z|w~q~~|y{~j~~{~ ~|~v|v}|z|st {wr}|}tfx y~{v {{ }~{ ~{x|z z~~ x~|slzurww}u~{yyz}t|x{ {rtm||lf}vz~vwvww{q~nv wwwppr|vn~v~xu{xx|~sq~jx|nz{}q }hh~nu| q{{~{p ~]c|p}qgt{qr |zuyzptqy[zxryv~~wzrux}vw}w tzwtq~z|rxxpzu {k |x||xzv |xxrvtpyi t}vm{~xy~vpyvsy}w}}xts|}s{w k g~wzt{z|xv{v}xp{|tw{~|u|}wqpxq|v~k} wm{nszq|z~}wwo~m{x|}nwvr}~{v|q ~ ~q {{~zxsw}z |wvvp{i|~ {~s|~{z{{~}{~z}w~uxzs~z|~y|{x |}~x zt|wtt||~~y{~~xvxx}oy||~~|q~y mz{qxw~~{rxvuw qx|e|{~~v{|~rlzspzww|{ytx~w }q~s qvnu~z~ox{lzy{ }x|uq}z|trz~p|r{ zyuk}y|wzc{v~s zwtxqs|||yum|}|uzxwzyy{~|w{v {} r}~ww}~|x{wqw} {x| |{~zm~ws wy~~wzzg}~l|{xw~yrywrr~w}un| y|utyo~ rs}~}{w z}||}x|xyqstp|{{}~x~r~vw}{wrx{}r|{y|w{v ~| z|x|x~{s{wvvx~} zu{ {~~}{~q}v}x{}n}}{yy|tttr}tv ||{rz~q z|z}}|p}wxy}z~x~z~} |{ }{w|w}z|}{z}}xysvzwy{ yys myr{w~m|qv{vyxy} gx{}x p}y}{ }{y|}u}yzxuypv{pq{|x }y v|xvwx|w~yy~t{zzw}}zt|x{nvvzv sg{}vy}ztyy}}wwwzxv{ {{lr{m{~z||w~ywuzn}{~n~~{~z{t|uss{{z {~~}ww}zz{y~|oz k}}y{w|~tz{~{xz|}r~zv|~p}{}qqx|zu~~} }~ }~twnn|z y}{uzx|r~~{x~zroz{~}r~~}wr{{u}|x{~z~}~z pwj|qy|{ ~|{}ywx}zzzur~}}w}uz }~y}|m~x{~~}}v{zyzyyy~ ~{z}~~x|w ~~zun z| ~{{~w} vx {o s|ty}v}o ov{~ }} x}}n~| zyp|}zv{wv||{y|}{fvsyuz~w| wvv| |x{{z}wu oz}z| {|xylx|tpz~ {oq~ rv|y ty t}v|} ~}| {{wx|w vv} y|srysv|y{viu zrw}nnsxp|zy|wu{m|px pq|v~t{} {svykzn~|q}rz~{tzsr}d ~iyr~iatvvsqjtxnxvg}{q}z~}oylzzvszopm ty {~~xn}~uz~s{{x yrwmuoy|g~z|so ywx }||{zpvu w|y|x{}~| uwxq v|xwv}}|s{yt}~v~w}uy~{v||wxuqm~{}}tx}mt}sy{}|zyr z~yqx {j{{}~}r{z|{}zl|{syu}xxr}y~|~|{}{q{y{} y{xzy{z|||}v~vxxzwxt}vzzv~ yy ~x} v~{ {p}r{p}{s{xvw}x}t{}z}xzy}|t| {z|yz~ yzxy}w|y vwr|}wzxy| wy|yz}}yzog{yrxw~}uquzwu {~|xp{ }zzvux|}~ u||{xvt}z|}y|~zxrzyz| xz~y|}y}zxu ux|t}z }ztf{|{|y}vzv ~~}p}sx| {y{{~|v}{}zt ~y{~xyw{uxr}vsv||zv q~|}xxyxw}w{}x|w{z~}}w|~pz}zxrx}x|y { |~ys||}sz}~tyt|~s~mxm}osztw~}wxu}sx|{u{| vzy~{{~|pp|{ ~x{uy{|{u{{ ~~zz}y~v| xwxzx}o~tu}xzw p{ yy|}zu ~zxlyxr|s{r~xx jq}y{uvrg te~vvjzo }x| v{ xxyqpu{qqzt{{{qyz} w~ux{~|t~~zz }z}{p~ ~ m|{p~}uup}xyn}{yktuw|xu}ywwxz ~ t|zuu|z~wy{ |z~qpzxps}o}wvq{o}xu~q|{}vk~tu}y oo~v x u}}|qo}p~tt}uw}z~w{}}{ov{{|~onz~vz~}|v~|x|}~{ wz}~~~ }~ w }{|}}~~|yy|~yyzx~x~vwws||x~~ z}y{~zy |}|x}x}t{ t qy~uv~|suv~x }{s~ wy{rywr~~wz}{ryut|gyr~ vxz{zt~vrstzz|} qx~|u z~ox}|z} vw zt|r~txu {~rvt{vu^t ~z| gy {}}{zt} vt~{svzzuz~zv~u~wsvp{r}{u { ~vwzvxm|yyprr|{ko~ }{xt |yzykm }x|xl{yxu{uttw~}}wur|z~~xxyvss~{}jxy x| ~u ~}z| xx ~z{y}z~s~znxv~z~{{x~~tyx |rs} {toz~uz|x}} vxyw}ny~n}v}zhv{{ }v~rz~ s}ytxw|~vysuvssqtv~r|jz{yx{}}wxwqu|jw q zbxpzyzr|p¡zquyvho}{yxyqv}tslryqtuuw m}wy}wnz{}tozuz{mwvzy~wwyru mr|}q}r}tvx}zzvxvwr| zhuruzfrv{|n~p u~zsyw{ {yz|{q|y~zy| tv|z{ y}y}~}}~v~s}}tx|zo{zy|uq }ytz|xzz twyvn{~{t w{y{l~{{ z}z}{w~zyq{{~}ytw~ w~ ~qzv~z~~mv|z{ nt|s{m lwulx }e|mwzxxz~y~|{|y~{| zuu}{~|zp}~ z| {{~}w{{xvy}xyyx}z|t}szt yzr{{{ {|u{oy~~|zxxln{wzw zq}w~~vo~}|y~{y zzx}}}yu|||x}y{}~txy|vu}}~wx|zzwsp xy {f{~xuwrsz{|txx~|~|v|~pxt x}ty{v ~y|t|{{v}| r}~{|}|v}v|}q}~v}~y~yyou ||vpux}u{uu}}w~xtnx~~|t~xuxy}z} us~{}vtr{yzh}|xjxwxxwyzvz{tvw~}zqysww}xrj~~z|y{}ps}qmu|wyvu~uz{ t}u~|}szzz ~yxv ~{x||~x|wz}} rrrw|~p} v{vmy}|`{iu{sx ~sup qcywzz}yrqk{~y|wx~tt}dzuv jtwsx }}{}|ridt|i}~uuyw|t l~{y}xy~qr ujn}~vk|pzz~{tv|u }txq|nv{vx {u|st xhlv}p uxd|} }zxvt} ttf~v{y}{wu{zvu~tt}ivusvzwzztvy~}ox|{}w|tw{}~ }rzy~~ w~s~t{{}x|}u}yzqk{wy q{{zpzqz{~ xvxz{u|{wz}m{u g}}r{x}~ x|qt|k|~r ww{yy}zz{}tuy}izx{~z~{zq~vwy }|v~z~}|}j }{v{x~}n r{}~sr }}}v} yrgy~}xl{}z|tp~x|twx}sx}stvvwvv}q~ xuv|yz} zr~y}pzx v}z}vs~jy~}syhm|~|~}}{~~r|ynwwwyy|pmn|u { |~|z}w ~|yyvw wi}{ms}u|{~w~xv}{m}vv~zs}wxrznxs{xz|rvx{ }ss}n}w y~vu}}}}}{t|~ }|x~v||}zl}m vw uzmew~ y|}zwz~~zzy |zyxu|vt~ylu }tx ~z|}xt~y||z|}w wzwq|u|~qv{ ns|~w {vv|p{ n~w~xxu~xztxyt|n|}ru~}z}q{z~uywz~~t~r| |uy |}y}ywrxw} yzuzzt}xvv{svzz{x}z |r|txz{rt{~tz{{s}vxut|xiyw{uz{ ~ yyt ~z|} ny}wtk~~xpvvuwpw|}}|r zy}ot|ys|zx~}zk y} {w yuz~|yx| wwwy{|| vz~~|}|xu {rw~q{syxlpr~i{xl|tq~v w~ ~yqu|q|{r}{xt}wuyr}mw}t{myvx}y ysxw{}uy~z|zxy ||ss | zu|}y}x|| xmr| ~y~rl|{|~nw ~{} xm~ z~| v}}~{ytttt}ujwlecu~{}tu}qswf{~qx||xv}t|}zv{rw|~u|yx om|{wrq¢{wyevtw}uw|wwwpyvnx{glwu¢z| r ~}lpt}z£quq|~ f}p~w|zrx v ~{t~u{x| |tx}v|~vroyv {~}u}y{tsktz lwix{ nty{qm oivyzw}y |}xxy~q zvmy}|} }wxv~t{~~z}us{|{ztywz{wwq{|zh}k zulv{~e~uzbt~~v ~|rvtudtp}{xxfxvwh} zwsyl|pu~}uzsy yy}}~}xt i}c{ |vu¥xyp^x yx|g\ptvv\¢puj vpiz^s|~uq«oero|q{|mvmxrtyvqnzyw~wngvutm uzw|syatpsssf{uyov~~vx~|y{vpl~xl| q~|~t|~sw~ }n~snq}u|gzhtwtxqvzs~svt~z{kfl{x|y zwy qu| or~q} tmmvu}s~r}v oy~wwqr~z{t|}r~s|~| tu|~||gon~trz}~z£vw|}~ny{tvwf~y w~{z~nrrqw{{~ z}oxx}w|x¢y{wrsnrtzzz{wz|yxjx}yop|X np|ssunimsy{q|| s{ tpyuz~~[{ wz}x|w wsg{t}{l}xzz wuwyyzx|r}p}} sxn} ~s|tyt{y| h||zlyk ztzwuy { {}~zv{z{}hwwz z|yqt}|s ||{|j|yx||t|~|qyx~rjpsv{~|~rt~zr|~{z}x|y {u}{v~w|{xxw}~~x|{znu}u~{ux{z`x~}y||u~~ z{pquxz|{{vf~}xz~x{uo pt{~vz}s}{{xy|}||xvz|}y|ys|x~y~|xz p|tg|~y~y~||tzj|x {yws}orpzyzzv } ystv~xv~tw} u{x{wv{zd|pv|owr ny|uw{{s|h||mvr~hpexgtx{}}xfz zwxtU}tlxqw tzqk}e}ty}sn}mpy||zwrwz}}n ykwhprrp|{xu{y|ijrnrxxyysvuy|yt{d{ zy{{yx}}w w{|wv}{~ys~ uv{{y~{v}i{~zy v {xu~wyfoy~ s~|yztn|y}mlw |l|o{rqtwz|m~{k}|{w{zsxzt orvqw{}tyxsylv|z{xo}}w tz{s~qwm{u{nkz}xvxnox{}wsou}{wv~yfu{|}y x}}~ywmy~w}z}u s~z~ xyxw~|xo{~p|r|z w}gl||}|yw{}|}}{{}xx}z{{w{ y{{tw{zjtm{{{u~~w~uvyhx|}{ s{z~d{}}t} y}~yz { x}n~}zu}}y qq~{vyuvv|zzwqq}z v~v x uu{rowov}vz~{{}~tzh~zzqo n{ lu{~w{s wlu~z |~{ytz}x}{z|~ z~}ypzzq z}qryw{~v{ tx|rx sxs{zzr~z|y yxyyxu{r|d||v{}{yf|wxx{ p {{ z}{~ku }q{nw~s q|z{}vuyzw}}yy|z~wm~{|~} u~{} |w{ ~y|vvtr|y{{v~pu~v~m~z~}i~~|yv xq||t ~usxs~x{wz| ii}}{upzw}y|szr{ywx~{~}{z}kpz{zvuy~uw~zyxsz~jmz|j||}~v~xq~y}rw}v|ypy| |uzq} w~}w}w~rsu ~y|y}~y{{w}x{v{~zv~~~w|xomuyzt{ vv}vq{v{|q{y}~xu~xyuzxxw~y}~x{uqwvzwwtv||zx|r~xn|f~wry|| lk~}qyn~{vtv~{{}ywt|w~{ |yytw|ylvzzzv} u|{||}{|vv{yws|z~os~~l}{lu|zxq |uvvu~| |xww w{r~xo ~}yvz~|{l |vzj t~ {niy|w~wydz{~}}} ~~|u{a{yzw}~} u~}s~wzzz|{ vrxtrq|yyxtx {wt~x}}w~ny|{x|vor| | yy |w t||||zs}}w v{t}u|zwyz|n v|{{}u}{z}tsjp{x{u}|zd|{{|{o~yzvpzv|}vv} }|zyv|}{|~tvy{t ~wx{{e{ox}{|h{~w~ x~ouzxxq}}{~}uwv|~}}tty}oq y~{y|cts{z|lyyjwy~wqqut`~yo|vqmur|lxvorw}}hzy u {~v |r|rmm|}yw v rud~|u}xpuivzyr~t`}prgbx {|~zky |g~s ¤w|x|sit|utx|q|s~yks|xt|~qwxqty{lx}xsz}|~ {zxpygvt~{rzt~w||s {{{~ {{}zyw~~y~y|w~|}pu}k ~|n zyzvor|z rqu~sw~qv|qzz u t}nv|}}}~zz{~{}}yyrzvzzxy~{z}|{}y{ zyv}zy{z}y}{|w ~~v|w|y}s}|~}| |xy|w~v x}~ v}~}`xy~~rvz uq{}||x~zw||ww ~uvq~}whzulw u v~wxn|zz} l uz|xx{x~znvo|u|{~}| xzv}{~ ywz}{~vw|oy~wyr ~yvx}tz{tujpwuxxz}| yqwwyu~~xs{z~z{|}~}{zyy|s~ys| yrurzpxn}xzwr~}|~ ~|}x|zqvqu}t }~~|sz}zosu}x}{z~i~~uuu{{w |~y}y{r{~~{}~z }}}v~yxovv|}x w~|zx{~|rv{{|w}wx}toxww} {u~{q}kvr|}xpvz~zoyv}~ y |w|ouny|r}} }|xz{{|wj|s{{z{}|q}{m}tz~{t{yz}vyzxz{wy zuq~~wyo~xx}~}ty ~t~xu{g}|}zwu}s urz|}}yzr~ } ~zzt~}wu s~z||{y}}}rxqpo yzvpx|zrqsnwwwzw |a{ynyvz~vy y {}x wv{v}|~zxxz }}z~zyp}xz~{}wz~svywo{|jowe~y{vqi|{y|rn{wv}vuzyyw}s}t|w}}vz|yvvz}pt~ {yz }|j|~yw~{}x{zwqx wyvkyz} x~z~{vr{w| zsz}xqw{||zvyyw{yxr|svzhu}{yt}goz|{||{x }u gyw}|}z{}{{z}y|{s} }}u~}}xv}}~~rz~q{~{~irx{z~zs{|t|w}z z{m|x~s~}uz w~{yyx|x|v}t mo|z}uzuyz~qyt}|x z{yw~|}p{{vzy~xu|} v w ~w{}~||~p}z}yyt} t~lrz}txx{ uzz |{}{wr|dz~~y~{|vpr xv}|snzy } s~}rwws}|}}|zv~|xtzy|{}}vy|} wr|w{{w~ mx rmzvsv~~z{t}u~~ }su|s||ztw xyz~wk|vyxup m~~olu }|{oquzq} pwmy z}nu}m~mq~bwxw~z} jv}x{|z|{oqmqk}uz}m }{{xwfu{}jkxq{}mmlv|w tq~p|vpr} pp}z}wu~wx~|q~vz~vzz}q{os| ~w }quv{{zw|}~~ovzw q }z~xyyxwt{ypy~}}oyw y ~}vs{ v~|jvqwo~uq{ ryy|}z~|t|||z~qxyx|zty~wx |{o t v| zy|}u}tvvx}}}yp~|}xy|| ~swuy}}x}~{{zx z zt}o}zv ~x}zrzq|{p zw~z}z~su|}} wxu}~vuyvpo ~z| u~w t}k |w~|}{}x}ps{}v{vryzxxy|}qrw}xxz}o|z|}xv{y|} yz|xx~yspv}}uws{}|t{ }{~r{}ts {zvzx}v~|~w|{ ~yz~ rsx~}~ ~w}|uyt q{py{{¦zrt kt|u w||sjz{zqx wwx||~w}y{|yxq{~s~s}rrv~t tym{ nzs ~~|o~ouwn}m}~{| ~syyuzzm}{w ys|}}||}t |~{ t} yzztwyty s}w|p{{|w|x~r x|qpv|{ury|}zqu|r|~|qo {v{vqvv~ y|y~ux{ry~{tsuz u z| zvyz|~ u~sv{}~}|svt|v{vxnl huvwq|rprrsyy¥t}ppqqxu y~{v|hszom{tnw}ttzvopxy{xvm~zxriwvw|yx } w{pd}ypv {x zx~{xou~r~|}~yp {yst} |{} wp}oz|s{xwyxy |{~vx zxzvuko{yi~xvy~zxnwx|xu~~}t|}vww{~}ywz |{}{t{z{{zxwzv|u{vt}e}up}qx }z|suvv|}lvqv~{xvz{ywqwz~}u} }{~~ r{o|y|pz }xyzz|wvrx~x~{|~{y~y{|u{t u~y|q~}}z~ u{~y{~pozyn}uz}|}yp|sxyrty|yo{{r~s~}mzz{~u{~y zzsmxq||z{tzy{}ury~tq|xt{}~qzw x}m|}{|}o|~owxs~~|~zzq}| z uyxpy{j~y~|wl}svw}}u{}}w~zhtzp~{|zw||y{zvl|z}{qq yssm{yw|}qyvxw{rys y}z zzrzx}y~tf~zyuwwoqus~|wxr~zykxy~}tsz~m{~|y}{yx{y~| yxw|kq~ty}~pufzvznqtzrlu }y~s }}}kxy| |uz{lt|zxwt}|wzzvtuy{sszz{|}yqsp yuz|oy}xy|[lxfo z tvx|}~xx{j||{~isz{zdsxv{ypi rvyw{u{}wt}uxs}lvyz{t}rrrm{dvp|vl y|x~|urzhup {y{vov}zo{yxutyqrxu|~{zuywu ~ r~y~r|x{w~|~{v~xx|s ~vwt{{zs~~}l|z~} ~y|y}{r}qxzv~|v y~ yx |quxz~{p}{}~~~x}| |z~xwp~|z}w{~wzzv{ymn~ wyj{ }y{~~}|t~ wzu{~ {{|rs|~x|{pnyz|ry~ }} ~uvx vtzqz t}~p }}n}xvnvx|zx{nmzuz {s{w~x}uv} zu~~~vo{| }|v{z} w~~yz{{~vyv|~i}t{ vtz|{}t|nsx~yuww {px t{x}|~}s~v~p} rx|~x~}~ u|~lu|~y|qr{{wyxxt}xv}yx|}|o}ztt{ut| xprrwv}}{{x|x~u{ uxy}x}}~vt|vss|r|}zp wvrz~~~ {zpx~ovx{{xozw~ykwwz~z}}|wq}wpg~{ zzyzs}s}|z~|~}z~x~{ |z|wy{vv~ |~ryp{}s }z}wy ~~z }y{}l }{zz~zy|}wk xz t|| x~txxvjywtv| quyq| sz\{w}pavzt}sslx nz~|}ju¥wvx{qhrxkteuyzk|ypyn}|n}kx~~xp}u{ p|ans} z|k}~|v wvqxho|}~|z mn}~{ ~yuwqqys ntzv{~|}uvwsuv~w~wd||oigvst||z{W|ytx{ o}{s{y}dx{|w}pzzqj|symq{{p{vn||rd xx`mm{{xsz¡s§n}~zxx x§z} }orv}{vqt|qypnq wrv}yu|~s t~|w}lv{uxv~uy ~mn{rvym~yr y| ~z xxn{ {s |u}y}} |{~wom| yv}qm m}wo|{|{}{~r~zv vyv~qwxsrvoyzx}q^ |m|xiqz~ }jy}tvy|ytlx~o~evpt{xo~z|~z~zy{ s}vrp |{kx{xs~}y{{qwnjzzzm|~{}u~q~fl}}xs {sq tzv~ ns||}}|txwsa~~~~g}a} zz _y~j{ }ov wzuutzuz¦||yyxv~wpr}Xsl{ {yy|quvqxus~}|w}o~wdk~vpp {wv tewz~t} z~~n}vz~xqvtxxg|y}e{ex} {yormvru{gvr}yqn}k|c~~}}uvtxrny p q`y|x zz t~zu}bzkzyrq~yqzyopr z{knr~yfuzdjlx~g¡~k| oyq}}o{wls v zt}yq~q{~uk{|ml ujnvsn{}{gstpvt||jkux}l| uuprr{{eos{mwz{yyurxyy wu {xy}f} |t|n||z~zpp{}}exz~mwtx~zxzmuww xtpo}}~xz|yu zyv|p{w {~q}n|yuptz{wwzwzvts}txp wyqy}x|wzjx|zz}vwy}| x xzysw|x{}|~{}~t~q{|~x~yst{rzqqqrxl}}}{w}{ zm~ uz}{w u}{~x|iz}{x~~tszk~t}zusyr{yr {yy {}suwu\rw~yfw zsq}mttr~|mq{~qoyt{}~wzxwws|{rx{~z wvpo} u|u~~q}ys~uzrxz k|{zh~zkpr{s|_{~ovrw}y|}u}qwn} {x{lrms}zyyz|zxuzynw|z{{~ |{yt |rpwy}|zh } rjx}xm~{}tt }y}}v }{}~ z~uzz}|wv~{txz}{z}yztyw|s{||uy uu}vhq{s|wy{uzoqrzxluwtwq~}ywy| ~|x{|z |}x~~xup|zxzvy ~y{xzwt}vw }ptuylx||}}whnoszytwinuor~wuvlst ~| sq{x~v}~uvwxt~ ~psjwy{~ zuqysy~x{zpspzygrxqzrxyy{{}hzzc}}p|m}{ypwyx~pinw|}uo}u~rz~urwr zt ywm{~st~yn~{yztv||y}rxwsy t~{} y{}nrw~y |yyy| tzrz}q{~~x} qp~x{{tz{~}xtxw~{zzs|z~wvznz{z|}w{zs}yxu~uup|xw}~sqqxyynwvkm{z{}xz} vtpwuxz }z~~~zy }rvzrr}z|||}u~ }szzzswxq|{r ~}}{{|~}nz~}t{qm~wz~{xzx }~yyw}qzz~o ~ |}|rz}w} t{}twyyy|tvv{ww~~}tzz~v~|s}w~vl}z{ ~x~xwu~}ty|uu|uuv{ ~ q{w}k~|r{qn}z }svpwo}u~|{}try}|t}pt}px~|nxyy}qups up~tyws{y|uz}n {p~t~|{tq}z{z}} |qx~ttwrz |wn|{uz{xv}pyqyn~|{xvz{|u}nz{}zt~~~|{|yiw~zpnzy~v s}~y|rz zsxs{t|}~x{}~|qtyws{}~|yyy{v yt|itvrz~~ u{rwut }z{~yxy{{| }wy~ ~ ~{|}}}x{{z| z|nzw wy }yy wx|y~||tx~~xzzv{y|xs}zxzx}u{|sw{qw}twhw~y}ynsm ezyt~{~x}~rs pypy|}|ovxuwrwqu{t|xwvi|yvott~y}}vyw{km ~yw{x~{ppv{xs~yv}p]o tu|x{u yy~}o~epsrx~s|wn||yty{|}g}y~tu|u{u}z oz|x{z}xzxw~|vouxv~||y~}} |{}{}{ yz ~}}~}z|x ~}y r}z{}{yzy~o~q}wzy{~vjx|ztx}xy~vtuzzw{|{~~o|zxwxum ~ wzz }vw}ny||{ ||}~xto{tin}xrvu}zru}x}mxy~ }t}~kxxy~yxquxxwrx{zz}~vvr~|zm}}u~}{yy xx{w{~w}{w}z {|wuzsymxx}y{}c|ukxw}t{{| yz ys{|wu zuwoxo} v{~ |qu{zq}vyvuy{x{w|y~|}~r{vw {{x~| ~s~w~~~w}xz~|d}}zunz}{x|ve| ¢rvx|lxw|xm}}}w |pz| |rz }{|}ym~y~v~}u~erzxvxrv} s|z|ys{{ ~|r||~{{j|z{s{|~~rwvnwj|yn~~zuv~l{kj{yqqt|} }}h}~utux~yoyy~y|}y|ys| tx|n{{ w{yww~}||uy~wtu{|~~~|n|t~}rmxsryzt{pr x}z{{y{}v|{u|}v}{r{}|e}z zx|xj~ysz~}vo}ty|l~ppusowyzyi}~y ~~ z }uv~yp{{q||ovwuv|hz|{|w}~ rzy|v{oq}o~z~myvz~ytr{~o vs{~ x}{x}wzxwzw{o g}k~ ~s|{z hw}utnq~yv{rq||wtyn|wvv|s~~p |wx}si{t ywx~w}r~{m}ys~j }uvw}rw~ot to}~ruut}~tm~pvy~~vtz| w|w~v~|~{{kvxw g}xzz}z}~{x |r |s}w|~wz|p}{vpu}zjvyzx{~}oy~m|~|rnrg {| |qz} v|w zxutyt |}y z }yu zzuu{|wxvx|zc{{vpwt}}~ xwrvyvxzyxw|g|}rxyyt~|}yy}{{y{uy ~sw||~h~u|zl||r~}z| y|u{ vsowez{q{v~zyunv~n~w|{~ va}~i|whs~vuhr|y{ rvq{r~ytmv{z}{~yxx}~|rz|}xzx{z|xvwztw}x r{yxy qy{nxs~yuxp|ju~vu}ow {v~tv{l~ust{|qzr}z {v}vqo qf~xskrwi }xu^zn qxzwj|~}r~ykwp{ uqnm}v{{j{yyurxjvwm{vsuuwtyz|tlt pwZrneur|{vszzyxyyv}|sr{vtpxvy}wq~ {}zzx |{|~tytY|t}x~~z|okvqvuxijqs{~uy{}wu{y{z~ q {ptv~}s~~y}uwzkmx{z{r{{mg{} v}}{d~w}rwmxzso~k{xx{zwj}w q{| v{uvsxvytqpy |w}|kr}x{ zzx ~prm}|~zv in|yrz|~{ qu{vqsp|vs~sw~toxuu|uwyqu }~w}~¦y~|w|z}|~xsyq { {xy~|{~|z|rxgw~v| z{vvyve|rqvztjrzpvyi~{ {oyqxv tv{y~{{}w |{w}} zs}u u}{~iq}yt dw|q}k}st{{r~{pwsyyuwqus~r {{|xx~ls} }|t{v}szzy||l ww{~ xy zlxqwxnq~sxx}z~k}ssunx fxm qm{{vr{~ w{qw ~z~v}x{pwyx|y~zwxv v||~{ z~ }tlwvx {rzryr}u{zt| ~}y {u |~nxj txkt{~}zud~{krt}zs~|nl~{pyysyt{}wwqxw{xls|ouzkzsr}z~k }|vnqj xsjpy~tzry~_hzyju|tki}ixvwp}~svp|y{o}y}|zro} {u kru~xyr j }{{{|{~yv|~yx{~yy r~||~zx~{p|ymrq{xv|~syyfzt|}wt}|xuxm~n}w{su}{ nz{zzx vx zz~yx|s|utzt|}x y}wt{g{t}s|xxzzqx~vwyxytzz{{n} kztwzz z~n z{{t sz|pz~v|z ~x{{wxuzuzzx}|v}|to|}wy ~~xy}}il}~z~nt|~{|~zx}}vylwomw|vw }|uyuw{v}z{|qzzz{s~|| xz qw}zxvy}x zzxv||{zw {}tkl~{w{ct}~|lxwt{}zky~r{~o }ws~{}{zvrz {xu~y |s~zxl~zw t|z{x~ w}h s}mv}d}ys yo~v|tyv~z}j|yq|tz{ ~oy~zuy~x {r{yzvulym{u z yxutt}v|vkw|vkx{z}a~ x|q z {vn~y|{w}z|sw{sy n m~ux{nz|t~yz |x|||y|{ t}~r l~~tmvvywryv~}}vwz|}{umu|ny~zw| zgxwz}} |w{{}y|pyy|v|~z}xuz|{ ~~~r |wquvqvsj}yxz}{x{o}zuvu|~hp{zvrz}~y~} {pqxwqh z}zqwt{}sqzzyvyzvw||~zr|x iy|zyvs|}|z~~y|{tmv~z~zz {z }rt{}x}~|q|xww}swxuzqw~}ksu{nzr}~|ny|rr||r~|}}uz|~syyy~}zw ~}wzvwq {q}yry~o zz|s{{~t }y~t~r{{tx{}suzu|s|t}yii}~|lzw||my}tzp{}m~vv}}{z|pv~}t~xx{z}xu}}x~w~|s rht{x sv|t}}y~v{ xwozn q}{x|t ~|~zzxt|qywo wxzz~yz}z~s~zw |~vx }{{n}t~rz{ ~|v| ys {x{w{st|v vz u|tu x~o~y||s{}~y ~t{y}|~}~ ox zyzx}r}t|u zh{~tysytus}ovs}mzs{e|}~w~~~ z|uq}uzs||x z}yz~{vly}wz{|~~u}q}uy ~ev| wsuxr|{|txt}svuyymvw{}~ ~xyotn}evo¡t ul{|p ixro~|}sv}w}vqsz~qswq }yho}r{vnv t~{jsyo{qopz |{ wtqsqozz asxstswwpp¢hxtxx~su|n rxuy{ |yxnqjqws s~|vqwm|lwwx t}{~w~uwv{~uf~vyy{ {y wxs~o~xtvu|x y~y{ }sv{wyz}u xrz|~~xkoq~xsv}wv suyxy|vz}{|o}yr{z{x~ |}~mt}s{vnvtyx|vsxqrzt}{}t jr vm| ~ n} z~q||zsy}|z{z{xx|u~|r~}vuxox{uz |zhz|z z~~~f g~~ }jz© }ztpmx k| czqlxzz{y}rvtu exz~}jevuqw]r{t~pbwwzoszpyznv qziuo~sauwzuxyv|x{zrzyxpu}}z ywv{r}z{x z|{y}r|o zt q sn|}vwe~uhv~po{n j{ywkq~ }{y¤un{xu z}~dp|yyu~rxy||ny}stzwztr| zw {t{{t|~qyp~guydyvyy\vwm| yx} {zyx~{zoww|nxt~~Yg|~~~wxptvv} ezv {~z v{xtrs gxs~zrn}hzxnjys{e{{w[ |h }v| |t|j}y}j}v }bqy |vyk}y~~ ztvwwyzq~yv yhizk~ w{qj r |{z[k|c^xloyvq|}{u~ kt]tu{pv|s ||{t~qpnz} ¤{eszhxq||]}lv~~zwqz}izsyuytr~ ooh{q¸vx|uxoxy|{yuy{eseu}}ytskwsruh|xni tqo}t{}jz| {|qw|}qc~w~{}s|}z}ynyzs| rp~~x||qok}h rsxto|xxuezxqtztx}n}fn|{zqr~an}|{yk{jxqtqnj |{ vvwwk~x }xewzswv~lpo|pznrq~txx uslt~w¥rs||ks}zpo}}|~|mq ukvxov}{r ~|q |o}~gnn yr~|vxn otrv}|v}bu~stxvn spvu}otyu}wqvpxj}r~}}xw }~wr|}~wyt ~o|x} t}x o~~whxq{ ~ mwlt}mrzr}|}{wx{zku zzx us}ryywy|u~~{x~y}horh~ t zzhygnw~qqwz}uworwg{yio|{zy~ty}~vvu~}z|~|z~{~w{~q{qyz{ssssu|s sj w}x ~qizryw}y wz}}tovvvsws}{z~ {{ ||}sww}zyz{t|y yuyy~}||y }qx~ }uvttqu~xrrp zy~bxy yqr ua~zzmiq~k}suy}zq}wv}||yyz|z {w}{}vxwt~~{}zz~}v{}|vpox{u}mvyloo w}|y|y}vy|~vw{x~ ytr|}uu}wx~ s}z srsyezt| |tyztx~|n ~xzi~z}~}t}jox~}myxzx|u~~w{|~{|z~|~~u||yv s~q~vvrty~{wx xw|t}p qxveq| uzo sy }zp[|z}|«zpw pv{yk~tu~|z |tp b~{trvk|}}up}~|r zr}vx|{ y { vypxu{zu|} phsk{zv m nxnu}{yqy}~|| z{ ty v{yy}x{~~z{~ryxm}r y~ |xl|rp{u~~~{}y}}y}v}q w{p|~x }{u|{~{~ o{t~ s}xrw{~qsy~~v}pn~ vzory}v}v w{zu ynvvps~} |zwwvhnzwtq~~zwy pv{|twxy{tvxul mmpv{tu}zzxr| }yy|~p }x}}d~l|y}sip}sz|sjuqktx¡z{ {w{r ~nxv}wvt}t|xzx}vs wwtxxy~z{z||t{rux }zzrwmymltuys~|}z{ty~nu o~q| }x}ygzrqqj~y}yupy mxotvl|tsfvyxyn uzjzs`wqxxy{}{uywj}oxqa}~~x |{nszus~uyqnx| v ~xn|{u}ztkbqtzrx }pv~a|{hvh|d{zlswzvtztxn lwv}x pv}pspy~x} zivwyt{yv}wxv~|w||w|m u{}tx|vy}} }}k|povysy s|q o||rsxt}n}qywxr~~m}yyuzu n~~v|}}qo}r~vwyd{tzr~|~wlvwy~|~zxhzxu|hy{yytk|v {u uuynux th{yzv~} ktns {s|y|~~y}k|xl{vszx{ow| }x}zxzyv|q xyiqnxktq}~{}s}z{pyt|t}x}rwv}z|vl~|y~y{z}j|ot}mvuu|u}r}{yuu{y~~{muz}vw~yu~y|t~~}vz~z||w{wszu}|}{|}||~{z|uxz}|}uti~{~x~|to}qxztw~} {tx|ww|ywvvm}w{sq}|x~zv{t ~vx ywz{zz}g{zk~vwyrw}xu~t}vl x|}z{ ~zvzw~ zs~}z w~yywy~qwq~xxfw xxy|tx o } r|}|wy{vzxwu|w}r~~~{x~~u~|}~y|yx}uq{{{{{ph{{zx}~{qot|~wyu~vuvym|u}prvyl sy }|| z}zxvr xutu tp } qswx{|zxx~z~l~wrf{ntt~uoz}|y|ryvozrz}vt|xxvz~{}zyw~}x|p|xmhq|t|ty|vuwb}wy| qyyz}gu~rv~t~} rux}~r}zz{r~||vx}tu{|xu{{zupv~{}tw{}}|u} ~|{v y |zp {{|{ywzxxr}~zyqz~pq}|}||{| |}{{x |{} yz{n|g z{~r{t{wt|zutq||t}m{{}| yowtxtyv|u~zzqux~}}twylt}uuq~uvyso}r}{}u}z|yv|||p tpk~r{{{uywvs}k|}{e~q}zys{yz{ |{zt~} {x}}{w|pu{}zu~hy}~uo x~|}~r{rvs|} w~ y}tv}uxn{}q{w{v{vu~|{wr{~y|} }|~rk~~~|}py tysz}}x~tr{wjxvx o{zy oyztxy {h{ qp~u{yw{~|~uvz yn}{z{qx{{y{x m| tr~{k} {t} vwy~{{y{{zpjqw}{yy{a}r~n} zyxiws|vfxzzvt~y}y|r s u}zx|w~tzw}rvt{suzvuu~yuwztkzu{}w|mpu~} z xo{zsgw} uv}|~q|rv mtwyy {}oj~|x v}lvf}{u|{zx~k|vj}ke|mmzyz{|u{t|mstwju{lt||r|wgzqu~{q vuzoem|}gjrvwvyuo{{y|{pn{{|t wzx}xn{w~|szuw}y yz~w{y{surny~txy}o}pzyp{~t pwnoqr~{w}vtx}{|}}x ~~w~y{zu{y{t{yv~||}x cxx~z|~| w vinhsvw}vs}v m~zutxzkv kuzzr|uzx|v}{rw}| |zz z{w||v x}y~{~ yarwryyk{ms| ~zzzwx|r } w}s{qsw}wzxp||x}lrp~z{u{|ypxv{||{~wwy~x yv|{y|y}yz{uwps||}{{x|yzvvy} w{~ywth|qjvz xt|| u|}x~zyy|x~~}wotu y yxvssvw|xwkvtf~~jw}ztz~sx|qt ~{xw}~~~wi }~tuy{t{ tu ss} ~~zux|y}ww|zvx|~{z vt rp}{w| qsr{~xpwv uny}~ws~wu|{y|rzqyz{x w~uzu~zvt|}yvzxz }|}zp{~|{w|u~q{u||xzv}~t|q}wzpzxuuw}wn{zpx|x|o|yxt|}wvu{}}|tsty}}~~x|}yzx{{tv|oo|~nouqw}dywvu{ |mqoqvwtw}|n}s~tysy{xz|wtyx~s}qlzt{yx m~|h|{jkoz{wttzipxpgu}¡rq`opgwrux{~x {wz}zvulnsz~vqurzgutjlzzx{ xzmtyx~y{oww}zrr}nw}y|w{vz|yx jv||} xv}} zsvww{tm{yr xwzuv}y svuq~ qqx|q|}}r{}tw {~|}wyqzx z~z}r}x~jr{uy{qxyr}x|y~{ny}c|o}|yuy}qv{ {{xo}|}w{u}~z{|r{zzz~{ |~oxtnw{ovx|{ |uz}|tzs~y}qz{rvx~p£~~zxvxnszz}u|zy t|x| zy~xtz{u|y xv}~zwvxxnzy~u|vm~z}{x|}vu x|s|~szrr{}~~rox~izupvwx|vr{ z~{zr|zs~x}y}{sul{yrx{x{ou{qr{t}|qmxz sw{}wyxxwvx| {x{xynzxios{x~}|lxu|~| ~|f{u|{||z||r{ut}yw|z|yuwz|yy{{v zr|z{pryx|} j|os{i|mvrjyq}{wzt}vvxuszvq ~}{~ wysy} zrzyn}tj} ~wuuu |{xn}|uzyuzvqp{w qv |xv|~ps|yrr{|q st{zt|v|v ~pwx~}}r{~zzxnw o{v|~~x}~u zxx~~|sw}ru w}rs~}{~w~x n|}zyz~~|~|v|~}~~y ~vv}y|vv}|zy{xxut zzzuqyvz~ xzwlzzxv{nx|}|~u|zy{so|k{p~}}{~| l}~x~v||}t~ {|s z{u|{zuu}{y yxn}h{}x}xr}ovxzuqv}|qwu}vwvh|tyt~}}}wur|uy}w~} r|u{{w~uqwzv{ u w|{w}xr{~x}|~v|v{w|y{w ltr}q~{yuru~y{jzvwv}~~r}t~zz~wpzyy y}~z}xs{v{q}y}{vlwyusztrrt~{w|t~ ~|y|~u}| vyzk|{szqm{~t}zz}|p|~o zpw~yu~twn{~~{y|z|} z r{wuy{~rutogzxtrxi~ {pw~{{{{p w|xwtt}{y|su~~ {z}|{ wu{}~ }yo~} }zth{|vw{|}zozwt}~~uss v|~|s~}}|w||{z||r~z~y|{pv~u||~ v zz}{x`{~~~svz{|rq| y tz~x~t}}}|z|{}~uwyunz}v|r|xnxkx`~ztquv|v}{|}spxojnkom }iyqz|z}u{p|w{o~ozs}u~wq~ttk}p~t| yx}wwxv~sz ~wo{zl~u}z{|q{exzzhc|ysvimz|k ~{ ~v~iun{o{r|}l{z|pxt}~|}rs{}vv {s~w}|z} v{~zw} r~uvu} x{}wu{~ty}}xwuwzs|zx|z|~x~| s~}u~|x~~|y| z|ot{qtsz|w{w|oztxzyy{xrouzzzy{~zp}}y|}xzn~ }x f|~}ou} wuyz~uz{|}v {}yv|u{|ur|t~ qz} xt}uw{~yvs}u}xwz}w~z sr~zzq wv{~{~||~~zqvn|wsq~o| ~{u{wywpo||z}zz~oxyeqwvnw{zvy{rvx{}tsur~ss~yz x{y ww{ }q}}nmrzx{ {~|}p{u}}w|}~xjuwzxt|{zzuzx|{u|zx~{}{|{~v~z wsxy|}~{xz|{uo}{y}ywztuz~vy yy{~tw}~} v}~|uwzty{o~|| v}}yzyq{}}v{|w||pb~t{zyw|~v{ s{|u~~tv|y{ qu_~wyg{zyvux{zznw||z~uj xst tyw|y~mvw}uogv sqkmvupph~wmzz~|wrqo}zyasroslgr~svl h xtzxzywa¤~xl¢l~|btohx}}R|~s{tnj pbu}}iz p~xy}uo~jq|mysgngqxoepl|vtwp }jpq|ru{qrvr~^d£f~whxpf~{ohuux} xz¡~xvqzt^xs zq~|{vydp|zur{zx{ |}~y~}}{~ut}˲°�ÿ{ÿÇéïÿDÿÞ�q$R�©�ÿ#ÿtÿÖ¼ÿdÿê�£�<-��ÞÿVÿªßÿÿ+ÿ�¼�c_�Ä�ÿ+ÿþܨÿRÿ�Þ��*C��ðÿbÿÅÐÿmÿ"û�¥�Q�x�Ù�ÿEÿäñÿ7ÿ�Ã�h \�®�ÿ'ÿÿÛ·ÿYÿ ã��30��äÿXÿµÕÿÿ$ÿ�¸�Zl�Ê�ÿ7ÿ÷æÿHÿ�Ó�~N�«�õ ÿpÿÏÆÿ`ÿõ��D6��áÿPÿµÚùÿ-þ�Ã�`m�½�ÿ7ÿþósµ{u~~}uzr{uz |}~{g~z~q{k s{yc~uzxvpjcw~yr|z{}z }lnw |lxq~y|ry~ox}~zsy~{rl q}~~nryzlzy}{{x}rwkys} ww`_nwx{ xx}{q|{}~ruy¨¡|{~ z~uevkz ml~qmwmuns||~}jxzo~wzuv~|{{tl`yqioyuysmwtr~t~v vp{n}t zhu{ls{}ex{qtzoxsv}|~x||n~xvwy f~}ru~wx}iuqm wq}} i yx}fks t~z w}uzq|{yuwzuvmoYЫ^ÿ�P�Ä�ä ÿNÿ¨ãüÿ5ÿ�¾�g^�À�ÿ(ÿüܬÿUÿ�Þ��.C��îÿbÿÂÄÿiÿ$û�§�T#�y�Ø�ÿCÿåðÿ:ÿ�Ñ�k[�¯�ÿ%ÿxÿܸÿ[ÿå��52��åÿaÿ±Óÿÿ ÿ�´�Up�Ì�ÿ5ÿøåÿIÿ�Í�~�M�¬�óÿxÿÎÄÿaÿõ��A4� �èÿPÿ´Ü÷ÿ/ÿ�Á�]o�Å�ÿ8ÿðì§ÿCÿÚ�~�+F�¦�úÿqÿÈ¿ÿpÿí�¥�>(�~�ì�µT[Puyy|wuhm{shjr}q }h}sppqyvxxp www}q{tn^~wywmqz|}z||}~}zy r~{wt{|vv}vwy~v~|{~vzs}ix |~{|zwk } ~ v{yxz|{xwv~ w}|srymq m}~zvv}}}rvy~ywx}xv vwyut{t ty|w{t|{urr~{h}|x|{vq}|v~jys}~xyqyw|sw |vro~z|pyyu{wvyyv~{ ||rxy}zy|z~w}w}{{yzxu|xm v|qzwd }tury}rnns}vlsx}jx{u~mkiwxuw{} |{{}|tv|xry xyk×°uÿ�9�Ý÷ÿ[ÿ¸Ùÿ|ÿ)ÿ�³�]i�Ð�ÿ6ÿòã¥ÿHÿ�Ú�|�%O�¢�úÿkÿÒÂÿhÿð�¤�G!��Ý�ÿSÿ«â÷ÿ)ÿ�Ä�bd�»�ÿ+ÿÿà¨ÿQÿÛ��';�¤�ìÿiÿ¿Îÿtÿý�¤�L(w�Ù�ÿ@ÿ«êïÿ=ÿ�É�p]�µ�ÿ-ÿúܹÿQÿè��9<��ðÿ_ÿ½Ïÿ{ÿ!ö�´�M{�Ë�ÿDÿê÷ÿ9ÿ�Ì�s S�³�þÿÿÓ³ÿ`ÿç��27��ø ¶AlGkn y |z} ws~rkwyn}tzuy}{t~{kwy|{x|vvzyyw|{lw~|{ s{v}{vvkw{wy}~v{~tpyy|}xxm}vvwz{{{ yzz ~yiwl}v~q ynt}}rx{uvl{||zwu qzyvqvujvtpo||r|}ivzv|t~~yyyy}}~}}}zvuyyx{myvqxz|xry|y {~w |t~p{q}v ~nq| wu{vx{sx|{|tw}{~xvu|{yw|{|}{}}w~yv~{vs ~s|t{z|~}}yzz |v| xx{v}|o|tyu|v~uz_Ë�{Y�ÿ/ÿÇêð¯ÿUÿá��06��çÿ`ÿ·Óÿ{ÿÿ�®�X"r�Ñ�ÿ8ÿóèÿCÿ�Ó�x�S�®�ø#ÿpÿÔÅÿ\ÿð��C4��çÿUÿ³Øúÿ)ý�Á�Xn�Á�ÿ8ÿ÷ë¥ÿHÿÖ�&E�«�ôÿtÿÆÀÿoÿò�£�C-�ÚÿMÿçûÿ5ÿ�¾�k]�Â�ÿ0ÿöÜÿOÿä��+F��õÿbÿËÍÿnÿõ�¦�L#��Ö�ÿMÿ£Þøÿ0ÿ�Ê�cc�¹�ÿ*ÿÿؤÿyöÂk vx|xxgk{{u{ vw n}|qyxk~xvq{xyzs ~s|t~|s{~u}|w |zv w}y{~}~qr tmuvz~zitzuuvx}|q ox} { ozymwq}x||}kzvx~}{~{{}z~u|mznu}sruo}|~{pzp~{siz~sntwux~yxxh v|{{yyzw}t|~x~~}v}|{z}y|vt{vyvxvr|}pr{ lq rzz|yv}xvx~uvy{vz~|xxz}xvyzo}ur}xx}v{ y~z}|y~z{||}yz{xywqaulq~w{uxuywt}t£L;Ô�ÿ° ÿ3ÿé��>0��ãÿLÿ²á÷ ÿ2ÿ�¼�dh�À�ÿ4ÿõå°ÿKÿ â��0@��òÿiÿÃÅÿqÿó�¬�E!�Ð�ÿIÿ ìøÿ7ÿ�Å�oV�½�þ#ÿÿÕ°ÿZÿå��.?��ëÿYÿÀØÿuÿ%þ�ª�X�t�Ó�ÿAÿéìÿ<ÿ�Ô�o!Z�«�ÿ#ÿuÿÙºÿ\ÿè��9.��æÿ]ÿ°Ôÿÿ þ�´�Zk�È�ÿ5ÿ÷ëÿGÿ�Ì�~K�¯�óÿzÿÌÅÿoÿ�ñ<µ«ickqrxofolwvvxy}susx_s wcnl{ zuxshz j{vv }t ~}p||j}xlmlko~zsz}v|l yt~r{{~u~ ~vtt|~~ar||{zs~{{ usswu{ l|xzv}vv|{ ux|r}mmxz}u |~sq{}z}pox{u~}z}~ wnb }nox~yqvz~st|xtu{ynx~}~tsux wywy|} zn{rty{ {v~xz}| w yxw w~yevz}rixx wwzx~yu~{|zpu}|y{y}hzz|r {x|ztt}lp{x~z~y{wu |~ycÃTîÒGÿ�wC�r�´�ýÿ{ÿÒ¹ÿeÿç��63��áÿXÿ³áÿ}ÿ*ÿ�´�ag�Í�ÿ6ÿñã¨ÿHÿ�Ü�{�%N�¡�úÿjÿÏÈÿeÿð�¡�F&��Ü�ÿQÿ¥Þüÿ+ÿ�Ä�bd�½�ÿ+ÿÿàªÿVÿÛ��)=�¢�êÿiÿ¾Ïÿpÿý�§�L(w�ÚÿAÿ§êîÿ<ÿ�É�o^�»�þ,ÿ|ùÞ¹ÿQÿè��9?��òÿbÿÀÍÿrÿ ö�´�L|�Ë�ÿFÿíõÿ7ÿ�Ë�m&^�u@Hv¨i~gpvy}stuz{xx{u}pwvvdn}z~l{sx z~x}r{y |}|~wq|x| x| ~{}}x| ~x yv~y| wu{y~pvr~{yuwu{wj|y vzo~}yx~r rxz{ |y{r ~zyq|n{w }z}{xvsr}urvxx{ xwmzzltq~zw}y{x|w}yto{ut|~s||vp{truvy{~yyt}}t||{~w}}q|m_tz t|p|{r q{|vskr q~zsz{yry|o|yw~ttzwkv}{{qvr| wn|tfiq~{pxssqc p m\pÂRöÐWÿ�E�t�¯�ûÿrÿÎÅÿaÿô��G-� �åÿPÿ®Ý÷ÿ-ÿ�Ã�_h�¼�ÿ4ÿûæ«ÿIÿÚ�,<�¤�ïÿnÿÀÈÿuÿö�©�D'�ÕÿCÿ¥îñÿ9ÿ�Â�pZ�¾�ý*ÿûØ´ÿUÿê��4=��òÿ[ÿÁÓÿuÿ$ù�¬�O|�Ô�ÿFÿçóÿ8ÿ�Ñ�k +X�¯�ÿ ÿÿÖ´ÿ]ÿ +á��15��ä +ÿ`ÿµÖÿ}ÿ ÿ�°�V!m�Ñ�ÿ<ÿôèÿFÿ�Ë�xJ�·�É0[Wxkvp {zzr{wy | v~vmu|uyr||s}{xs~z}j{~ |}xy vuupxqox~tvnuyt~|wyz {lvxt|vv |xv}r}z|z}t~xu{ ~}xtuys| wzy{m p z~uuv|{zsuvxzwhzt}z}zz |uzt~w~} q~xyx |~~}ty~|uz{}xqyr|~trzx q}jw|~~ |z{}tyrw~~m|qzrv}r|nyvsw~p}xx~u~~yv xz{~}z lytj wx~}}zuv}yw{}wyp~y`{{}lp|~~| u}~{zq{vh{ pÎ +Ò±�ÿiÿÿÏÂÿfÿî� �B(��Û�ÿUÿªÝþÿ*ÿ�Á�_c�Á�ÿ.ÿÿÞ¦ÿUÿ�Ù��'?�§�ìÿjÿÂÏÿmÿü�¤�N*�y�Ü�ÿCÿ§çîÿ;ÿ�Ê�l`�¶�ÿ,ÿ|üß¹ÿRÿã��98��î ÿeÿ¹Ïÿÿø�µ�N +v�Ë�ÿCÿñòÿ?ÿ�Ê�tN�¸�û ÿÿÏ·ÿbÿë��6:��æÿUÿ½Ýþzÿ*ÿ�²�`�o�Ì�ÿ=ÿìè¢ÿ?ÿ�×�r�"V�£�ÿ%ø\C¡zctt~w} ~{vxykszldzv|e~|t w{qeov{yv or ~romppdnYyl{r~ xy {xwswfq}yqjt~ yv{sxzs~]}}w~ruzpqvzc~|{ p}zruuuqrvyv|~}w{wkqo~l{tp xvx|ogxnw j|lxv}vj~z|~{ vz| ztz|}~vzo{t}t}{z{|}~|y||}|vwx ~}~a|}wm} y}}z~yv~~ zx}{xvzs~t||x|}}|y |nt{wzwykumxq} y yzusxym{v ~|¼º +¾�ÿòìÕÿÿ%ÿ�µ�ag�Í�ÿ4ÿóä¤ÿIÿ�Ù�~�%N�¤�øÿlÿÍÉÿbÿò��G%� �ß�ÿPÿ¨Üúÿ-ÿ�Æ�ac�¹�ÿ,ÿýæ«ÿQÿÚ��(>� �êÿmÿ½Íÿsÿù�ª�J)x�ØÿAÿ¨ëñÿ=ÿ�Æ�p[�»�ý,ÿúÙ»ÿRÿè��9=��ñÿ^ÿÁÏÿzÿ#÷�±�O{�Í�ÿFÿñïÿ5ÿ�Î�q + S�±�ÿÿÿÕµÿaÿâ��15��ã ÿ[ÿ¶Ùÿzÿ%ÿ�¯�V!l�Ó�ÿ9ÿïêÿFÿ�Õ�v�U�®�û&ÿtþ×Àÿ[ÿí��@7��î ÿYÿºÕü~ÿ%ù�»�U v�Æ�ÿ?ÿïñ¢ÿ:ÿ�Ñ�w "O�®�þÿzÿϵÿdÿé��50��áÿXÿ²Ýÿ~ÿ&ÿ�±�] g�Ð�ÿ4ÿôäÿGÿ�Ñ�z�S�¬�ø#ÿsÿÓÄÿ]ÿï��C5��çÿVÿ·Øúÿ)ý�¾�V +u�È�ÿ=ÿóî£ÿ?ÿÔ�x&J�¬�ýÿwÿ̼ÿjÿê��9-��ÝÿTÿ¯Þÿÿ*ÿ�³�_g�Ì�ÿ0ÿôå¢ÿKÿ�×��O�«�ö!ÿoÿÐÇÿ_ÿò��E6��èÿSÿ²Úùÿ,þ�¿�Z +q�Æ�ÿ;ÿðî§ÿBÿÖ�x)L�©�úÿvÿϽÿkÿé��:*��ÞÿUÿàÿÿ'ÿ�·�]c�Ê�ÿ0ÿ÷äÿKÿ�Ö��M�«�ôÿpÿÍÅÿ`ÿô��D3� �åÿPÿ´Ü÷ÿ.þ�·�\o�È�ÿ8ÿòê©ÿ@ÿÚ�y)N�§�ýÿsÿϾÿhÿé�¡�;&��Ñ]Fnyzv{||{r~{m}}p}w{x{ny~yro{uqt{}svqpqsiuzz|~llp kr|~hx zzuswb~tbruzo|~wr{w}m s{ivzlrmwx}yu |swysm|xnpjqryp}nuzp{vm q|x v{zy|y}x|ws~z {}| y}{ko{}y | }~ | |~u~w{|yz{~yz{|xvwp~~y}vw~||}{n|puz}| }vnwitx{|xwu }|uxv |}{u~~}xnu}{uqw~ y{t|} ttv}y}ts ~ um|vy~}yu|n}t~¢Å"á�=�ÿ`ÿÿÓ¿ÿcÿê��?(��ßÿVÿ¬Ùÿÿ&ÿ�½�`g�Ã�ÿ-ÿþߢÿOÿ�Ú��&B�§�íÿhÿÆÎÿkÿú� �L+�y�Þ�ÿGÿ¨åïÿ8ÿ�Î�ha�·�ÿ/ÿ}üá¶ÿQÿã��49��í ÿfÿ»Ìÿ|ÿø�²�L v�Ì�ÿ?ÿóòÿ<ÿ�È�v R�¸�ú ÿÿÒ·ÿ]ÿ +î��;;��èÿTÿ¿Úþwÿ)ÿ�²�\p�Ð�ÿ?ÿëë¤ÿ>ÿ�×�s�%U�©�ûÿvð½At}y|||~}|xqv{tzuz|tp|t}~v kv bz| }koy}x {vy~z ~}qy}zt~twt zgx zxyz}u|qx}~~}p~vt}wqs~~}t}w~}myww|s ~ zx}~wtx{t }y~{dzs{wxywr~ow}urxlost|t{xtu|trrzyxzr ~{~w}r~y{} tz{|}~uv~~{|}vzyo{uuuooz~xoyz}zzv}{}mvo}sutvz{|oirz}zplrgnfwmk| fJCÀ�ÿÿ�×�¯�nW�µ�ü'ÿýÖ»ÿYÿ î��89��ëÿXÿºÖû~ÿ'ú�¼�Vt�Æ�ÿ<ÿôì¥ÿCÿÔ�|&D��øÿtÿÈÂÿoÿí�¡�@-��ÛÿLÿ®æúÿ5ÿ�»�h_�Ä�ÿ0ÿöÝÿOÿå��.H��óÿ`ÿÄÍÿmÿô�ª�L�×�ÿKÿã÷ÿ1ÿ�É�jY�·�ÿ#ÿÿݰÿ[ÿà��-:��å ÿdÿ¹×ÿvÿÿ��S%p�Õ�ÿ<ÿ£ïëÿBÿ�Ò�uW�µ�ü'ÿvüÙÀÿWÿì��=9��ìÿ[ÿ½Óýÿ$ù�¸�S +v�Ç�ÿ<ÿïó¡ÿ<ÿ�Ñ�y !M�°�ýÿ{ÿÍ»ÿiÿ ê��82��ßÿTÿ³Þÿÿ+ÿ�°�`i�Í�ÿ4ÿòã¡ÿHÿ�Ø�y�!Q�©�ù"ÿmÿÓÆÿ^ÿñ��A/��æÿUÿ°Ùúÿ'ý�¿�Yr�Â�ÿ8ÿ÷ë¦ÿDÿÔ�%E�¬�÷ÿuÿƼÿjÿ î�¡�:-��Ý ÿNÿãþÿ1ÿ�µ�ba�Ì�ÿ1ÿôá¥ÿLÿ�Ú�~�$N�¦�öÿiÿÑÊÿbÿò��I-� �á�ÿRÿ®Úøÿ*þ�Â�\m�¾�ÿ7ÿùé¨ÿHÿ×�(A�¨�öÿtÿÅ¿ÿnÿï�¤�<+�ÙÿLÿ¬ãþ ÿ.ÿ�¹�gb�È�ÿ.ÿøÜ§ÿOÿ�Û��#M�¨�õÿlÿÌÍÿaÿô��H1��åÿQÿ±Þöÿ-þ�Â�] j�½�ÿ:ÿôê«ÿEÿÚ�{)C�¥�øÿtÿʽÿkÿë�¢�;(��ÛÿRÿªàÿÿ+ÿ�¹�cd�È�ÿ.ÿùó´|«|tj{}{x ssw {y|{}f r ~}jt |x{tyrsp}vzt}zv~y|wq|kysx}{{{~q xy{y}ps||w|x|~w|hwsnt wwzs{~x z{zw}~~~{wt|~x}}} t~~ o{~~ ~}|y|{txt~v|{}y w|}{ {{}ux}us~vp{qz}~|uw~|rslws{|ywulvs|y~ }zxy}ktmw{~y| ~{~ny}~qz~gr|ov n}~{p x}z z{u{{~rz|vvyy{zzx~{x~ s uldvsksqZyr|{}ybkkv}}nJÿµÿ�Ü*4�i�Â�ÿ*ÿþâ«ÿTÿÝ��,<�¡�êÿcÿ¼Ïÿtÿÿ�¨�S%t�Ö�ÿ=ÿ¥îëÿ?ÿ�Í�rW�¯�ÿ+ÿzÿؽÿVÿë��<8��ëÿ[ÿ¶Ñÿÿ#ú�»�Ru�Ç�ÿ9ÿôïÿ@ÿ�Î�} K�¯�öÿ|ÿË¿ÿiÿ +ï��93��àÿOÿµàÿ~ÿ/ÿ�»�dh�É�ÿ5ÿñâ©ÿGÿ�Ý�|�(M� �ûÿkÿÑÇÿfÿï��C*��Ý�ÿUÿ«Ùýÿ+ÿ�Â�^g�À�ÿ-ÿûè¥ÿOÿ×�#8��òÿpÿÀËÿvÿ÷�¤�C-��ÝÿIÿ©éóÿ8ÿ�¾�f `�Â�ÿ1ÿôà³ÿNÿã�}�/G�ª�÷ÿeÿÍÉÿlÿñ�¦�I"��Ú�ÿPÿ£ßúÿ1ÿ�Æ�cd�»�ÿ*ÿÿß©ÿOÿÛ��);�¦�îÿhÿ¾Éÿqÿù�¦�?,�}�ÚÿDÿ¬èõÿ8ÿ�¿�p_�Ã�ÿ/ÿ÷ݳÿOÿå��3H��ôÿeÿÊÍÿpÿó�¨�L"��Ø�ÿNÿ¢à÷ÿ,ÿ�Æ�c b�¹�ÿ/ÿ ùã¡ÿQÿÜ�)>�¤�îÿlÿ¿Åÿrÿø�¨�H'|�ØÿBÿ«íõÿ8ÿ�¾�l\�Å�ÿ+ÿøÜ°ÿPÿ�ã��/I��òÿ[ÿÌÏÿhÿõ�¡�L&�~�Ý�ÿIÿ¤àõÿ-ÿ�Ò�l +b�¸�ÿ/ÿüæ±ÿRÿÛ��->�¥�òÿoÿÂÂÿqÿô�©�E& �ØÿMÿ¶ê÷ÿ2ÿ�½�d\�Å�ÿ,ÿùÚ©ÿQÿ�Ý��.I�¦�óÿhÿËÍÿhÿ÷��K.��à�ÿMÿ°ßõÿ1ÿ�DZr~ p}v}{~sw|krz|wz{xy{{}t~zw}unxtx}pgjjou{ kw v|vom}twu } kx}ulnzzjovr|w `pu }u|{~uh}y~{i}|sv~qpqw~ q~y}vy~mp~ u}tq jwzpuux|w}zwzzyivlyrwvk w}{~y}zkjx|kvm}|rkavuxy{rwz zzxyjpq}x}}z}s|zrt|y~w{zk|o{xvxw rqtow}{vv}s{rhxp{mrxz|u yzzz{zulnoix|o| wzxt{}vwa{v~g{b_qu{zu||d´Æ�Õÿÿ³íðÿ@ÿ�Ì�S�²�ø$ÿwÿÓÁÿaÿð��@5� �äÿUÿ²Øú ÿ+þ�À�[r�Â�ÿ5ÿõì¨ÿEÿ×�(B�©�óÿpÿÉÆÿsÿó�£�@+�ÙÿGÿ©ëóÿ8ÿ�½�m +_�Â�ÿ.ÿûÖ¶ÿMÿâ��-C��óÿaÿÇÏÿpÿì�¬�N�}�×�ÿMÿæõÿ/ÿ�È�h +X�³�ÿÿÿÚ±ÿ^ÿÞ��14��äÿaÿ¸Òÿyÿÿ�¬�U&t�Ô�ÿ<ÿ£ðëÿAÿ�Ë�wY�°�ü(ÿ{þÕÀÿVÿî��<9��îÿYÿ¾Óþzÿ&ú�·�Rv�É�ÿ?ÿíó¡ÿ=ÿ�Ñ�s#P�¯�üÿ}ÿÒ¹ÿdÿ +è��52��à +ÿ[ÿ³Üÿÿ#ÿ�²�^j�Ï�ÿ5ÿóåÿGÿ�Õ�{�Q��ø#ÿoÿÔÄÿ^ÿð��D5��ëÿUÿ¸×úÿ)ü�½�Xs�Æ�ÿ<ÿñî¦ÿ<ÿÓ�w&L�¬�üÿyÿϹÿgÿ é� �7.��ßÿUÿ¯Þÿÿ(ÿ�³�Z +f�Ì�ÿ3ÿõäÿKÿ�Ñ�{�P�®�õ!ÿpÿÑÆÿ`ÿó��C6��éÿSÿµÚøÿ+ý�½�Zq�Æ�ÿ>ÿòì¨ÿBÿ×�u'K�©�þÿuÿÌ»ÿgÿç��;*��ÝÿZÿ®Üÿÿ$ÿ�·�Z h�Ë�ÿ5ÿöæÿKÿ�Ó�~�L�ª�ô ÿuÿÐÃÿaÿõ��B9��çÿPÿµÜøÿ-þ�»�\p�É�ÿ>ÿîë§ÿ?ÿ�Ø�t(N�¨�ÿÿuÿÓ½ÿeÿç��9+��áÿ[ÿ¯Øÿÿ"ÿ�·�T{�URWoyq wtqq{}r}z| u~ w}|~v}lun}}qzr |vxzv| wv| y}w}}m|r} |y}v~ y}t|xv{|wzw}yz yvxr{wv {y|}it~x~qz }}vwz|w yz}z}l zsws~}||y|z}v}{~svvtxy~rwv|x|o {z|tp utwwqtw}zex wqu{}y{zzz~qst} x{~ tg{l} fg}suz|qwwp|zwz x{krudkxsr|~| sjw|lxk}tq~x~vz{w}kqpuw{h}k {{xyh{ZÖjÙò û�Go��ÛÿDÿ¦êôÿ>ÿ�Ã�qZ�»�û(ÿûÖ»ÿSÿè��8>��ðÿ[ÿ¼Óýyÿ%ù�µ�Sw�É�ÿBÿîñ¢ÿ>ÿ�Ò�t#R�¯�ÿÿzÿÍ»ÿfÿê��7/��Ý ÿQÿ±ßÿÿ-ÿ�¶�d e�Ì�ÿ2ÿôá§ÿJÿ�Û�~�&N� �ù ÿhÿÏÇÿdÿó��G(� �ãÿRÿ©Ûúÿ-ÿ�Ç�[h�º�ÿ/ÿüçªÿNÿØ�(@�¦�îÿoÿ¿Éÿqÿö�¨�E�Wfbe{w} vv{wyynyw~}z|n|{}wzhx{vt{txyzyyt|||}ztw~}~w kmosv{jvy~vru~vswxs}u}o|x{m|nzx}~} }nwutu|{m xy |wyx~v qryz~}~owtu}}t~ov~|rt|}w{xw w nqy~|xry|}ounukuv||ypr~wx{sz~yu}~uzwpsvzsxyzvz{tuxxurq}qzm~||}~}jws}r| |vv{ v}xxxk|~qz t wu{~}{pyz~zzy ywzsz||jxlrzyqok|qkr»vW�ÿ0ñàÿkÿ÷��J �Ó�ÿFÿéøÿ7ÿ�Ç�pS�¸�ý!ÿ ÿÓµÿ^ÿè��0:��èÿWÿºÜÿzÿ+ÿ�°�\o�Ð�ÿ<ÿìé¤ÿ@ÿ�Ø�u�&Q�¥�ÿÿrÿÓÀÿcÿê��>)��Ü�ÿWÿ«Üÿÿ&ÿ�¾�_d�Ä�ÿ-ÿüã£ÿPÿ�Ø��!D�¥�ïÿiÿÆËÿjÿø��J-�}�àÿGÿ®ãòÿ5ÿ�Ã�f e�º�ÿ2ÿ÷ä²ÿKÿ +â��2E��ðÿiÿÃÆÿsÿó�¯�C �Ò�ÿIÿ éùÿ4ÿ�Â�lV�¾�ÿ%ÿÿ×®ÿZÿ�à��*B��ëÿ_ÿÁÕÿrÿ"ÿ�¦�T#�u�Ú�ÿCÿ¤æîÿ9ÿ�Ï�k`�³�ÿ,ÿzþÞ¸ÿQÿå��79��î ÿeÿ½Íÿ}ÿö�³�K{�Ì�ÿCÿîõÿ9ÿ�Ç�qU�¸�üÿÿÔ°ÿ^ÿæ��2:��èÿZÿ¿Ûÿtÿ$ÿ�¬�Y q�×�ÿ@ÿ¤êëÿ=ÿ�Ñ�nZ��ÿ*ÿxþݽÿUÿç��:8��êÿ`ÿ·Ïÿÿø�µ�L|�Í�ÿCÿïõÿ;ÿ�Ê�o R�¸�ÿ ÿÿÔ´ÿ`ÿä��.<��åÿ^ÿ¼×ÿsÿÿ�¬�Z#o�Ö�ÿ<ÿ¤ëëÿ?ÿ�Ð�r[�²�ÿ,ÿzýÛ¼ÿUÿé��:7��ðÿaÿ¼Ðÿyÿ!÷�²�O}�Í�ÿBÿêõÿ9ÿ�Ë�pU�¶�ÿÿÿÖ°ÿ]ÿâ��17��åÿaÿºÖÿyÿÿ�«�V%p�×�ÿ=ÿ¥îìÿ@ÿ�Ì�rX�·�ý+ÿ}ûÙ¼ÿUÿì��8=��üèLqK y y vytwv{ ~~xz~}~v vywt} xt{upm}yuwu~ hm|{swyy sw}v~v{z y~uxy~}~wxtt~xyczo~w{ |zo~yw{q||vzz}yxw~~xwyx~|zw~y~msy}suzxqvwxy~y|~~}w{p~~d}~{{q{lyzst~y {x{z|iw~ my|yusy~ {z~~{y| { zy{~}}|~yxtjjv qw { }wk||vsqw}}{~~vsjwyx|s|~{v|xr||q}xz{q~|tuy|}ns}}}}y~y{~w}xsvrvrty·ÿ�Ñ·�öÿFÿ¤ïñÿAÿ�É�t S�¶�ú%ÿ{þÓ¾ÿYÿ ï��=:��ìÿUÿ·×ú}ÿ*ü�º�[s�Æ�ÿ:ÿñï§ÿAÿÖ�}(J�©�øÿyÿͽÿlÿò�¥�;+��ÙÿMÿ¬äþÿ2ÿ�»�i _�Æ�ÿ-ÿ÷ݬÿPÿ�ã��,J��ôÿfÿÊÏÿkÿö�£�M#��Ú�ÿLÿ¦áõÿ0ÿ�Ê�eb�´�ÿ(ÿÿ߯ÿTÿÞ��,9��ê ÿiÿ¹Íÿxÿû�«�K%w�Ôÿ<ÿ¢çí·m_uj|{{y~wpy |{}xy u{x~wxyut{} ~ {v|}y~}x||| |~~ns{}x{z { }w vv{{zvq |}y wr}}gyz}~x x{|iwow{s} }|{pzxy{~}} uyz{ |~v u~~~|o{yv}|||u~}}|t~vvz {} zw }vi{pw |x{p~xz~xv~||wx}z}{~}|qt}tvzuwpyzt{ vx~vx{|~u|zvu~}~~qpx{~~||w~zz w}~{xqz~~{~| my~ }}v}}~tq }}um}}xs{yzy|~tgÈ}¢ýâ�&©�ê ÿ/ÿþá®ÿPÿÜ��->� �ê ÿhÿ»Îÿyÿþ�¬�O#t�Ó�ÿ;ÿ£îîÿ@ÿ�Ï�v�S�²�ú(ÿwüÖ¾ÿXÿï��?7��ëÿVÿ·Öü ÿ'ü�¾�Ys�Â�ÿ9ÿõí¦ÿGÿÔ�%E�ª�öÿuÿÄÁÿmÿó�¤�@- �ÛÿMÿ¯çú ÿ1ÿ�¾�i^�Ä�ÿ0ÿöÞ®ÿOÿä��/I��öÿbÿËËÿnÿó�¦�M��×�ÿKÿ¡ãøÿ0ÿ�Ë�g ^�¬�ÿ-¼_Is~vvwozyw z}x ~zwv w|}}t{vtz} v x}k}w~q|~x{z~oy|y|} {y{vvq}}| wzusvjuvz{t||y|ux~~y{u~yxr}s u~y|}{ tqq tuvi}~x{x~xyy~~ nyyzus}|~rtrzz}w~ |qxysvl|f~v}z}qwj}yx us|ys} ~|vx|uz{|{tu}xxix|q||z vz~y}|z~w|v}}|zvtc|rhwytk}~v~ wy~} ys |uqc{iy|zw ~fu |js{h}~rpfn}zu}zqugv.ÿkÇÿç�K%6��âÿ[ÿ¸Ûÿÿ(ÿ�¸�]j�È�ÿ/ÿúãÿLÿ�Ù��"H�ª�òÿiÿÈÏÿeÿ÷��K(�|�à�ÿKÿ¨áóÿ4ÿ�É�de�¸�ÿ+ÿûæ²ÿRÿ +ß��0;��í ÿdÿ·Íÿzÿü�¯�K!w�Ð�ÿ;ÿ ñðÿBÿ�Ç�wR�´�ø$ÿ~ýÓ¾ÿ\ÿ ð��<:��ëÿVÿ½Ùú|ÿ*ü�µ�Ws�É�ÿ;ÿïí£ÿ>ÿÖ�v'P�ª�ÿÿwÿκÿfÿé� �A)�~BPoytv|r||z{}q{t| p}~}||zr wqwu~ jzwxv} zz|x~yvz utxvtzw|} yzq}uxy{{z |{|q{~vx~xwx}}tx~ooq}}u{y|||f~t}~{{~ }}u{jnz}n|}~}xt|w~{x||hw|~xq}{|{{{y|ws}{tv~q|{w||}xq zxuxy~|po s wx{xx|z|xv~zho|vr|x~vt~bws}z ~}yz|ux~{x~||wx}q}wuz{z~{wuuxyvuxx|txzf R�ÿWÒþUÿ0ÿ�Ê�r O�³�øÿÿÑ»ÿbÿð��=3��æÿOÿ·Þùÿ.ÿ�»�` k�Â�ÿ9ÿôç¬ÿGÿß�}�,E� �÷ÿmÿÇÄÿrÿñ�¬�A$�Ô�ÿGÿ£æýÿ4ÿ�Á�mY�¿�ÿ%ÿýÙ°ÿXÿä��.@��íÿ[ÿÄÔÿqÿ$ý�©�T#�v�Ö�ÿDÿçîÿ9ÿ�Ô�mZ��ÿ%ÿyÿÙ·ÿZÿä��66��åÿ`ÿ´Îÿÿþ�³�Qq�Ê�ÿ7ÿôí¢ÿ:ÿ&Á¨Zo{wz}x z~}~| y}}}}{{}{xzqyyzx{hxz {u}~|}~rwz{w{u}}x{~{wvy~v} ~xwx} xqt{u|s wwr pyw}|yt{{zuvgtnwuy~y~u{|rul~z|{|s{} iyzqgz~vt{ w}~ ~rsx~||tsqq|vz{~wwkuz{ } lu{y}{}ztw ~wmx}wzs{x|vyx|vwuyxx|v~ z|rxz}yy~v}l}vzuww{zzyz~ru~ v xv|{{ioz{ sy~tq} |syyx{yuzv||}izvl|g»p¸îï�=�ãÿ*ÿÿÕ¶ÿ_ÿ ê��69��æÿSÿ½Úÿzÿ*ÿ�µ�]l�Ì�ÿ<ÿîé¥ÿCÿ�Ü�v�(N�¤�ûÿnÿÏÀÿlÿë�¢�A%��×�ÿQÿ§áÿÿ,ÿ�¿�g^�Á�ÿ)ÿþÛ¨ÿUÿ�Þ��(C��íÿcÿÅÒÿnÿ ü�¥�Q(�w�Ú�ÿFÿ¢åðÿ8ÿ�Ï�ha�´�ÿ*ÿzÿà¶ÿUÿá��75��éÿeÿ¹Ïÿ~ÿû�³�Pr�Ì�ÿ<ÿóïÿAÿ�Ê�wK�¶�ó%]Ncwxt vy{x zt |ztwzt}xyu{tw}mqk{ n|~hpzst |{ ~{tvoz}rtyty~ {~ywwvv{}} |zyy }s|{tyx{}uty{t|~ {y}v{rx}y ow|m}{s{vzmz~p~||{|zxyyv~zt| zt~ {xxy}~}{||}|~zxuw~tx}z~z|qyxp~||||}~}gn{~~|tq vzy}{}xv{w}q{{q~}yu|~no~{vvx{tr sw{| ~|wz{y||ny{|{uzs z|p{}{tgvzwz y}{puw~~|rnqpuqvz| vff¡+ÿ¦ÿ�Ñ�-"a�³�ÿ&ÿxÿÛºÿ\ÿè��</��äÿ]ÿµÖÿ ÿ!ÿ�º�Yk�Å�ÿ3ÿúæÿKÿ�Ô��!F�«�ðÿmÿÇÊÿhÿø��I-�{�âÿJÿ®âóÿ5ÿ�Å�f f�¼�ÿ-ÿ~÷ç³ÿLÿ á��2?��ðÿjÿÀÊÿyÿ÷�±�G }�Ð�ÿFÿïõÿ<ÿ�Å�qQ�»�ú"ÿÿÒºÿ_ÿè��6<��ëÿXÿ¿Øÿxÿ)ÿ�¯�Zs�Î�ÿ?ÿêì¤ÿ<ÿ�Õ�s%X�ª�ÿ"ÿvÿÕ¼ÿ`ÿç��8.��áÿ\ÿ°Ùÿ ÿ$ÿ�¹�Yi�Ê�ÿ2ÿöèÿLÿ�Ñ�K�®�òÿrÿÍÇÿdÿó��D5��äÿPÿ²ßö ÿ1ÿ�¿�^j�Â�ÿ9ÿôèÿFÿÝ�y�+G�¢�ûÿoÿÊÃÿrÿì�¦�@%��ÖÿPÿ§áÿÿ,ÿ�¼�eb�Ã�ÿ*ÿýݨÿTÿ�Û��&D�¢�ïÿfÿÇÏÿiÿû�¡�N+�|�ß�ÿHÿ¦äïÿ5ÿ�É�fe�º�ÿ0ÿúã³ÿOÿ à� �1A��óÿiÿÁÅÿuÿô��F �Ò�ÿGÿ éúÿ3ÿ�Á�mX�¾�ÿ%ÿþÙÿXÿâ��+B��ëÿ`ÿÂÔÿnÿ!þ�£�Q!�u�Ü�ÿDÿ¥æïÿ:ÿ�Ì�h_�´�ÿ/ÿ}üá·ÿQÿã��6<��ïÿeÿ½Íÿzÿö�µ�I z�Ë�ÿDÿðóÿ7ÿ�Ç�tT�¹�þ#ÿÿÓ³ÿ^ÿç��/<��êÿ]ÿ¿Øÿpÿ"ÿ�¨�U#�r�Ö�ÿ@ÿ¢èìÿ=ÿ�Ñ�m^�²�ÿ(ÿwýßÈÿCÿnؤ©`uwy|n~tt}ys~u|~~v| z z~~zx~x ~ swo}q}}z | ~oyt~~y~{}yr{|||xrwv {xr}w vv}|fnzz~~~{{zu{w~t}u z}}xvvszgo{twk~gyw{|~n~}ugxv}~ kw~vynx{u{}wb|wyozmmv~xur||x|w|q| }v~z{q o xnwvtqsy|yzvwxr x n~v v{r|yjvuuy} x|zw}}}~ }y} ~y|~yxvj~{ |v ux{ }z}|~}up|w t pxyw|¢sÎÕ�.¢�ÿ^ÿÿÎÈÿiÿ÷��G.��ß�ÿIÿ¬ãóÿ4ÿ�È�c c�¹�ÿ0ÿüã²ÿSÿ +ß��4>��ê ÿiÿ¼Îÿ}ÿú�±�N! w�Î�ÿ:ÿóíÿ@ÿ�É�yP�·�÷#ÿzÿпÿ\ÿî��=6��ê +ÿSÿ»Ùúÿ,ý�¸�[ +p�Æ�ÿ<ÿïî§ÿCÿÙ�x)K�§�úÿuÿÌ¿ÿlÿë�¥�;*��ÚÿTÿªãþÿ,ÿ�»�b^�È�ÿ.ÿùݦÿQÿ�Ü��(H�¥�òÿeÿËÎÿiÿø��K'�}�ß�ÿLÿ¨àõÿ2ÿ�Ë�b +e�¸�ÿ1ÿüã°ÿOÿ Þ��.=� �íÿkÿ¼Éÿwÿõ�«�F$|�ÓÿDÿ¤íõÿ<ÿ�Ä�rV�¿�þ)ÿüÖµÿXÿé��2B��íÿ[ÿÄÔÿrÿ"ú�¨�T�{�Ö�ÿFÿæðÿ6ÿ�Ï�l]�±�ÿ(ÿ|ÿÞµÿWÿ á��1:��é ÿeÿ·Ðÿÿþ�±�L! v�Ï�ÿ<ÿ ïòÿ@ÿ�Æ�v S�º�ù"ÿýÔ¸ÿZÿì��9?��ëÿVÿ¿Ùþtÿ'ü�°�W�s�Ò�ÿCÿèîÿ9ÿ�Ó�m W��ÿ'ÿxÿÙ·ÿXÿã��72��çÿ_ÿ´Ñÿÿþ�´�Pv�Ë�ÿ7ÿóðÿCÿ�Ë�{L�¸�ø!ÿÿѵÿ^ÿë��9<��êÿVÿ½Ûþwÿ)ÿ�°�Yq�Ñ�ÿ?ÿèíÿ=ÿ�Õ�nX�¬�ÿ%ÿvÿÛ¶ÿVÿæ��:-��çÿaÿµÕÿÿú�¶�On�Æ�ÿ<ÿðî§ÿMÿ�Ê�zP�·�ùÿÿÒºÿ`ÿ +î��/)jOrvjpul}znya{|ydytxw y{sr}p{w}r{zqsx}}}}yu|u|xw|tuv{{ytjg~{az {}}wbqz {yx}{}}|u|bv}zrpw{c|aqs\kywuqnr{u}nyvmv}~}xw~y|u |xsbvz~l} zqvvns{ryxw{}v}|u{mv{y}]~||t~giz xsds~uz~www{u`nv {u¦s}r|zx~z|}sn{z|xr }zznjq{{|y}|umz~vxmzm|t t sopk}v}twf |yr{hw|ow }}|jµ3ÿ¥~ÿ�©/�u�Ë�ÿ=ÿóðÿEÿ�Ð�uJ�±�öÿ|þÖÂÿdÿó��E3��ã ÿNÿ±äõÿ1ÿ�»�ff�Å�ÿ7ÿñå°ÿBÿÞ��.F� �øÿiÿÇÄÿrÿð�¨�D!�Ö�ÿLÿ¢çüÿ7ÿ�Ä�kZ�»�ÿ#ÿÿׯÿ[ÿç��+>��ëÿaÿÁÖÿoÿ.ÿ�¨�S%�v�Ù�ÿBÿ£ãñÿ=ÿ�Ò�m +a�³�ÿ)ÿyýá·ÿTÿç��:+��ì +ÿeÿ·Ïÿÿù�³�Pu�Ë�ÿ>ÿøìÿ=ÿ�È�vM�¶�øÿÿгÿaÿë��68��èÿYÿ»Úÿvÿ+ÿ�¯�[p�Ò�ÿ>ÿëéÿ@ÿ�×�t�#W�¬�ÿ!ÿsÿÕÃÿ]ÿè��=0��æÿ\ÿ°Ôÿÿþ�´�Rr�Ç�ÿ=ÿöëÿFÿ�Î�n J�³�öÿÿ;ÿeÿ ò��66��åÿKÿ§àþ|ÿ-ÿ�³�`k�Ê�ÿ9ÿïæ§ÿBÿ�Ü�w�&S�¦�þ!ÿqÿÓÄÿ\ÿê��>+��àÿZÿ´Õÿÿ0ÿ�¿�Uj�Ä�ÿ4ÿøëÿHÿ�Ð�$G�°�öÿvÿËÂÿkÿñ��>3��ß +ÿNÿ¶âüÿ0ÿ�µ�b f�Ë�ÿ:ÿðä¨ÿDÿ�Ø�{�&R� �û"ÿrÿÓÅÿ`ÿî��A,��â�ÿXÿ¬×þÿ(ÿ�Á�Un�Ã�ÿ7ÿøì£ÿHÿ�Ò�"F�¯�÷ÿvÿÇ»ÿgÿ ï��<'�à +ÿOÿ´ãüÿ-ÿ�µ�cf�Ë�ÿ4ÿòã¥ÿHÿ�Ù�z� Q�¤�û#ÿoÿÓÅÿ_ÿñ��B0��æÿXÿ±á÷wÿjky~x{zt~wy~~}}y}v~w~{tv{|x~|}zuswxv ||u~izzw}| {}swzvwxuz{ pxuuuuqs}} ~v}xkym}w{vym }|~{jx~{ovq}ruzy{}}|zp}u~{ vz{}~t|y|w|yqt~yvsswmixx~w }z{snzn{}w|ysqv~}rwxuq~z| zv}owrt|p{ ~zzyzr}y}xw~xy y xy lx~tvz|~}uw }|owo{tw{dm~~|}n ~pou}yu|w ~{x~ n sx vt{~}w{u{mt z}~w ~wvyxy} P¶N�ÿ^Ïÿ ÿRÿè��88��ïÿ[ÿºÓÿ}ÿ'ü�¹�T +v�Å�ÿ;ÿòð¡ÿ?ÿ�Ñ�{#K�¯�öÿwÿÈ¿ÿjÿñ� �@0��ÝÿKÿ®êõÿ3ÿ�½�h a�Ç�ÿ2ÿôà®ÿLÿâ��/G��÷ÿeÿÌËÿoÿò�©�I ��Õ�ÿNÿ ãùÿ-ÿ�Ç�jZ�º�ÿ%ÿÿÙÿ[ÿß��,9��èÿcÿ¼Ñÿtÿÿ�§�N&t�×�ÿ>ÿ£ìëÿ?ÿ�Ì�rZ�´�þ*ÿ{üÛ¼ÿ`ÿ�æ4®·in{lyvsrxvsym r{|}b}{r|yt~{ }~rxqz} vvuz}yrvw|xx~txt w x tyzx|wxw ~y wwmo|} x{~|xyz}{{ jt|xr{wg} |qwyy}nwy}|~y y{~{ss y~yy zx~{v~w}~~qwzz~zw~swwt|~zu~z~vzuz~qv{gx{kz{|o~{u}q||| rx||~lo z~|{wz~{wny~zu}}t~z|}zzvs}}{qvzwp{qz{t wz|~q{vg}~w}|z~|vtj}h~~udw}}xrwu{y|yxm}|sXy ÿIèñ8ÿ��P]�¸�ÿ,ÿúÚ¶ÿTÿê��8;��ñÿ]ÿ¾Ñÿÿ"ø�·�R x�É�ÿ@ÿôï ÿ>ÿ�Ï�z + Q�°�úÿ|ÿ̼ÿiÿð��;2��ß ÿNÿ°åùÿ1ÿ�¸�ed�Ç�ÿ2ÿòã«ÿLÿâ�}�.I��÷ÿeÿÌÉÿoÿñ�¨�G ��Ó�ÿFÿæûÿ.ÿ�Æ�hY�¸�ÿ%ÿÿÚ¬ÿZÿà��,;��èÿ^ÿ½Ôÿtÿ#ÿ�ª�U#�q�Ø�ÿ<ÿ¡êëÿ?ÿ�Î�q�[�±�ÿ(ÿuþݾÿVÿè��;4��êÿ`ÿ¶Òÿÿ ú�¹�Qw�È�ÿ>ÿòñÿAÿ�Í�{ K�µ�øÿ|ÿÍ»ÿfÿ +î��:5��ã ÿQÿ¸àþ|ÿ,ÿ�´�bj�Ê�ÿ8ÿïå¥ÿDÿ�Û�w�$S�¥�ý ÿnÿÓÄÿaÿì��A*��à�ÿXÿªÙÿÿ(ÿ�Á�Yg�À�ÿ3ÿúè¢ÿLÿ�Ô�!C��òÿpÿÅÅÿkÿô� �F0��àÿHÿ±åöÿ4ÿ�¼�hf�Ä�ÿ3ÿôá¯ÿIÿâ��.J��úÿhÿÌÈÿlÿñ�¦�E#� �Ù�ÿQÿ¤Þüÿ-ÿ�Ã�ac�½�ÿ*ÿÿá¨ÿPÿÖ��(?�¨�îÿmÿÂÌÿpÿù�£�F-�{�ÛÿEÿéóÿ8ÿ�Â�j`�Á�ÿ1ÿöÞ±ÿMÿå��.H��öÿdÿÇËÿkÿó�¢�H!� �Ù�ÿMÿ¡Ýûÿ.ÿ�Ç�cd�º�ÿ)ÿÿäªÿRÿÙ��)=�£�ìÿkÿ½Ìÿrÿú�§�J*z�ØÿBÿ§íîÿ<ÿ�Ä�n \�Á�þ.ÿ{úñ¸°J¦| xy zq}| w~}zvxnwzzzz{`t~ }} z||jqzyzzw{|k }| v}yvzzwp}}v}z zz|~w}{s~ ~xt}}x|~syrvxvo ~~xw xqt~ || xv~w}x}xun}|~ymtz{~{xmytz| {|~{~|vxtw~}n y~qzvxz}|m}ywzr}vu {~ }t}p wx~ u}p|q{~s |v{zutzwz~snu}lzuxyzsuq}r| vgzs {zusv{r{yz}y{yyn~~ vz}xx|us~vqq|r{u~zr}{{}}wzwxy|~k|}t vwr~ |{ox_Ù® ÿ�¨( �Â�ÿ*ÿÿÙ±ÿ\ÿá��16��åÿ^ÿºÚÿyÿ#ÿ�¯�Y l�Ñ�ÿ8ÿïç¡ÿDÿ�Ø�z�#U�¨�ü"ÿoÿÑÆÿaÿî��B*��à�ÿUÿ©Úþÿ+ÿ�Â�\g�¿�ÿ,ÿýå¨ÿPÿÙ��%B�¦�ìÿiÿÀÏÿmÿø�¤�J+�w�ÞÿEÿªéïÿ:ÿ�Ç�m_�¸�ÿ/ÿúÞ¸ÿQÿç��6A��ïÿaÿÃÉÿwÿõ�²�L�Ï�ÿAÿêùÿ5ÿ�É�r T�·�þÿÿÒµÿ`ÿã��28��åÿ^ÿ»Ùÿwÿ&ÿ��Y m�Ô�ÿ<ÿìéÿBÿ�Ô�q�X�®�þ&ÿtÿÚÀÿXÿê��?6��èÿ]ÿ³Ôÿÿ"û�¼�Sn�Å�ÿ=ÿôîÿ?ÿ�Ï�} H�³�öÿzÿÊ»ÿgÿð��;4��âÿQÿ·ßÿ}ÿ/ÿ�²�`h�Ì�ÿ6ÿðå¥ÿEÿ�Ù�y�$R�£�ü ÿpÿÒÆÿcÿî��B)��ß�ÿVÿ«Ùþÿ%ÿ�À�Yj�¾�ÿ3ÿüè¢ÿEÿÒ�"D�¨�òÿvÿÆÁÿkÿõ� �=0��ÞÿJÿ±åùÿ1ÿ�¹�f +c�É�ÿ3ÿòâ«ÿJÿ�ß�}�.M� �ùÿiÿÐÉÿeÿð� �F)��à�ÿUÿ«Úûÿ(ÿ�Â�\i�¼�ÿ2ÿûè¦ÿMÿÖ�&B�ª�ñÿoÿÃÂÿoÿó�¡�@-� �ÜÿGÿ®çùÿ3ÿ�¹�h +c�Ç�ÿ/ÿöÞ¬ÿKÿ�Û�~�(L��÷ÿiÿÐËÿfÿó��H+��á�ÿSÿ©Ûùÿ+ÿ�Æ�[j�¾�ÿ5ÿùé§ÿJÿ�Ü�}v¸Pym| |~rtsx{z{ldy| |{ q|ynzxty||z}|| z ~yy{xk~~y~twwt~}{ru yxyv~ }{w~xty} {xzv}{z}wx~w|sz|zwx{tx}~vwuxrz~{ruz~yq}|~}{qxpyu{yy{xz~v ovx{~z{pu} }|w~}~y}| ~{zqy zysr~|}~nxx}vyzvxto {s~g|yxy}{ vzw}z}}xkzxtrv{|{|zt}yt~qy}{}~z }wy{~ ~w}s~ ~~v|ovz{yt p~~huvp nyu}zp y|}q}w|w q}}}ys\ëyÊÿõ�>_�}�Ë�ÿ;ÿðê£ÿEÿÚ�u(K�¨�øÿqÿÊÁÿmÿî�§�>&�ØÿOÿ¨äýÿ1ÿ�¼�h]�Â�þ(ÿûÚ°ÿTÿ�â��.F��ðÿaÿÄÔÿkÿ ø�«�Q �y�Ö�ÿHÿåòÿ5ÿ�Ð�m \�°�ÿ#ÿ}ÿÚ¶ÿ]ÿâ��23��ä ÿ]ÿ³Õÿÿ ÿ�±�U! o�Ð�ÿ7ÿóêÿHÿ�Ì�zR�µ�÷#ÿxÿÑÁÿ\ÿð��?5��ë ÿUÿ·Úùÿ*ü�¹�Yr�Æ�ÿ<ÿïî¨ÿAÿÖ�w'M�«�úÿuÿ;ÿiÿ è�¢�:-��ÛÿUÿ¬áÿÿ(ÿ�¹�`a�Ê�ÿ1ÿùß ÿMÿ�×��$J�¦�ôÿjÿÍÌÿdÿö��H-��âÿMÿ±Üöÿ/ÿ�Ã�^l�¾�ÿ6ÿóì©ÿFÿÛ�+H�£�÷ÿqÿÇÃÿoÿï�¦�>'�×ÿPÿ©åþÿ.ÿ�º�e^�Ä�ÿ,ÿúÞ§ÿQÿ�Ü��&H�¢�ñÿdÿÊÎÿiÿ÷��K-��Þ�ÿIÿ®àóÿ1ÿ�Å�c +g�»�ÿ4ÿøæ°ÿGÿÜ�,B�¢�õÿmÿÅÁÿlÿï�¨�C#�ÖÿMÿ¥åþÿ1ÿ�¿�h]�Ã�ÿ(ÿûݧÿTÿ�Þ��%D�¢�ðÿhÿÈÎÿiÿù��J.�~�âÿJÿ®âóÿ5ÿ�Ä�b g�¼�ÿ6ÿöå°ÿFÿß��/E� �úÿmÿÈÄÿnÿí�¨�@$��Ø�ÿQÿ¦àÿÿ,ÿ�À�cb�Â�ÿ*ÿýâ¤ÿQÿ�×�� D�©�ïÿmÿÅËÿiÿ÷��H1��àÿIÿ±äôÿÿL¸ªe| er|wqxwqq~|sur|i|y|{wnpt|s|xxz|~jn~xx{x{}~}p {~~trquyzv|~xzxuuw{ny}xzr{~}~z{utu z}o{w ~~v|wwwm~u{zuz|y{yxx{}ztz{}vszwx|x}~|z}~{|~~ y~sk~|w}|}z~z~{~ }ys|zv}tsztvsy|zy|~zx}}}z} ~~{yy}}xy|o{n}|~w{rmt|x{tyypk}urx|q}s{|xl{{ uysu{} t p{s~v}x}|}}ws|vt{u{v~ w|}{h|z}to{xe{z sJzÿ]Éÿï�¯�~�(@�¡�ëÿmÿÀÍÿrÿü�¨�M'w�Ø�ÿ>ÿ¦êíÿ>ÿ�É�pZ�³�ÿ+ÿyÿÙ½ÿUÿë��:5��íÿ^ÿ´Ðÿzÿ"û�º�Sv�Å�ÿ:ÿ÷ìÿBÿ�Ï�I�°�ôÿ{ÿʾÿgÿò��>3��á +ÿLÿµâùÿ2ÿ�¼�de�Ç�ÿ7ÿñäªÿIÿá�|�-J��úÿjÿÍÆÿoÿï�§�C$��Õ�ÿOÿ¤äûÿ/ÿ�Ã�g^�½�ÿ'ÿÿÛ©ÿVÿß��(=��ëÿfÿÀÑÿpÿý�¤�O'�u�Ü�ÿBÿ¨èîÿ:ÿ�Í�n_�µ�ÿ.ÿ}ûÞºÿPÿæ��8?��ï +ÿaÿºËÿxÿ÷�´�L {�Ì�ÿDÿñóÿ9ÿ�Ê�s U�¹�ÿ%ÿÿÓ²ÿ]ÿ ì��29��æÿWÿ¼Úÿxÿ(ÿ�¬�Yn�Ó�ÿ;ÿëêÿ@ÿ�Ó�q�X�«�þ%ÿuÿØ¿ÿYÿé��=/��éÿ_ÿ¶Óÿÿ!ú�»�Rs�Æ�ÿ<ÿóïÿBÿ�Î�z I�³�øÿzÿÍ»ÿhÿë��;4��ã ÿOÿ¸ßÿ}ÿ+ÿ�³�ak�Í�ÿ8ÿðå¥ÿCÿ�Ø�x�#T�¦�ý"ÿrÿÓÄÿ[ÿì��@+��äÿYÿ°Õÿÿ&þ�½�Tn�Ä�ÿ9ÿ÷í¡ÿFÿ�Ï�~!I�±�øÿyÿÍÀÿiÿð��53��ß +ÿNÿ¶áþÿ-ÿ�³�bh�Ì�ÿ5ÿñã¦ÿFÿ�Ý�y�$P�¥�ü$ÿnÿÒÃÿ`ÿð��B-��å�ÿWÿ±Öýÿ(þ�Á�Vp�Â�ÿ5ÿóð£ÿFÿÒ�z$G�®�ôÿyÿ¿½M¡}u{{w{xzx}z|~zz~{rw}y|xyxy~x p~xtx}y{xnzr|xiq{ r|}~ }~~xrsw{}s~ry uu|yzzy }x}xzqux~wvwvnvwuyupz|~ttv|zwwe{rwyvxrvw~ |qz}zuv~z} t {nnw {x{}u}s}tzwyz||tp~yaq {{vj~nzys|hk}qrzvw~swlpwyrwm~x~nwqzx{{xlz}}x{zzzwv}}ns { u{prz{q| wp|r|xyz|m~|}~}usw~sxuyw|o||Õ§ÿÙ$�¿�÷ÿlÿÌÈÿhÿô��F(��ß�ÿOÿ§à÷ÿ-ÿ�È�c a�·�ÿ)ÿÿà¬ÿWÿÞ��/5��çÿbÿ»Ôÿxÿÿ�¬�U$q�Ò�ÿ:ÿ ïèÿEÿ�Ò�tT�¬�ü&ÿsÿ×Âÿ\ÿî��@3��çÿZÿ¶×üÿ&þ�¿�Xr�Ã�ÿ7ÿ÷ì£ÿFÿÒ�$G�«�ôÿtÿÄÃÿmÿó� �>/��Ý ÿMÿ°æùÿ4ÿ�¼�g +a�Ä�ÿ2ÿôáÿKÿâ��.J��òÿr©l_~~} ww|}z|qk|xxoq{v}}xqto} tzuyu||v|w|ux vyz{}|~x}~xw|}{{~w~x}t~~fsr wz}|uz~o~~| }suzzy}z~{ sz}zv}~ w~xzz~x{~y|w~ ~{pu {pr}ywpz{v~tzuws}zyxyz|uw}x}}wrkx wul}t m~|~kqnuunqhi{{dw¡|z}| auyyzt|y}zmt|pr~c{v|xxyzn qtlvf{y|~{{vrxv mr{xks|aix}mmvpxswST® ÿ«ÿÑ�o�O�u�Î�ÿEÿíïÿ;ÿ�Õ�q"O�¬�þÿxÿѺÿiÿ ê� �80��ÜÿTÿ°âÿÿ.ÿ�¹�e^�É�ÿ0ÿ÷ݱÿNÿ�â��+J��ôÿeÿËÌÿkÿõ�§�J"��Ø�ÿLÿ£â÷ÿ2ÿ�Ê�f^�¶�ÿ'ÿÿݰÿXÿÞ��.8��æ ÿfÿ¹Õÿyÿÿ�¬�O$o�Ö�ÿ=ÿ¢ðëÿBÿ�Í�tU�´�û(ÿwý׿ÿXÿî��?7��íÿYÿ·Ôüÿ$ù�¶�Wu�Å�ÿ=ÿñð£ÿ<ÿ�Ð�u"K�®�øÿyÿ˽ÿiÿí�¢�A/��Þ +ÿQÿ±àÿÿ.ÿ�µ�_d�Ì�ÿ1ÿòâ§ÿJÿ�Û�|�'O�£�÷ÿhÿÏÌÿ`ÿî��G)��á�ÿTÿ¬Ýùÿ+ÿ�Æ�[g�»�ÿ2ÿýå§ÿLÿØ�(=�©�ñÿnÿ¾Æÿpÿö�¦�F+�ÙÿBÿêôÿ8ÿ�½�k]�Â�þ.ÿöݱÿQÿæ� �2A��óÿ`ÿÍÌÿnÿ õ�¨�L"��Ö�ÿMÿ¡áøÿ0ÿ�Ë�eb�¸�ÿ*ÿÿÝÿRÿÛ��+9� �éÿeÿºÍÿwÿû�ª�I#u�Øÿ@ÿ¦îðÿ<ÿ�Ä�q +Y�¼�ý+ÿùÙ¹ÿTÿè��5C��òÿ_ÿÆÒÿpÿ"÷�´�P �|�Õ�ÿIÿäõÿ4ÿ�Î�m ![�´�ÿ#ÿ}ÿÙ±ÿYÿ ß��.6��çÿgÿºÏÿ{ÿü�¬�N$x�Ó�ÿ=ÿ¥ïïÿ@ÿ�Ë�wW�¸�ú'ÿûÖ¹ÿUÿç��<A��ñÿ]ÿ½Ôÿqÿ%ú�®�Q�x�Ò�ÿGÿãÿ¯êÅw §xv{~|}{ v|z x{rxuu x ~ux{{uy vu||~x tsb|kyyzz{xyz x|ux yx{}}rk~~zxp}y{zyv}~xqv {}zs}|vvxyv~x ~y~sv {{zx}o}~ ||vx w tvo ~w|z }vz||tt t yv~{w{r~{}{ww{zvz~tv}|nxk{{zxzzw|}yz|qjkvo swzw}n~n}zrmwxoqpk}oz wzrw{~xurqzuy|~~|~v }{yxu}y|~| }}y |zzt~y}{y~mz}vws|o|~j| z~ }|y{m\Ð�m^�ÿ4ÿ×Ùü ÿHÿ�Ú��#I�¨�óÿnÿËÊÿeÿ÷��H,��âÿJÿªàõÿ2ÿ�Ç�e +d�µ�ÿ-ÿÿß²ÿPÿ +à��09��ë +ÿgÿºÍÿzÿü�°�N#u�Ï�ÿ9ÿ¡ñîÿDÿ�Ó�|P�±�÷"ÿwÿÓÂÿ`ÿò��?6��ê ÿUÿ»Ùúÿ*ü�¼�Y r�Å�ÿ@ÿðí¥ÿ@ÿ×�y&M�§�úÿvÿʾÿmÿì�¢�;+��ÛÿPÿáÿÿ-ÿ�·�c _�É�ÿ/ÿ÷ß§ÿPÿ�à��'J�£�õÿkÿÉÏÿeÿõ�¢�L(��ß�ÿNÿ¨ßöÿ/ÿ�È�bg�¸�ÿ.ÿþã®ÿRÿÜ��-=�£�ïÿlÿ¾Çÿwÿö�ª�G&|�Ôÿ@ÿ§ëöÿ9ÿ�À�oZ�¾�ý)ÿúØ´ÿTÿå��0D��ñÿ_ÿÅÒÿpÿ$ù�®�R�z�Õ�ÿGÿãôÿ7ÿ�Ð�l!\�²�ÿ!ÿ}ÿÙµÿ]ÿ +â��22��èÿbÿ¶Óÿ}ÿý�¬�Q#s�Ð�ÿ6ÿ¡óíÿBÿ�Ë�xS�´�ø$ÿxþÓ³ÿXÿ +í��:;��îÿWÿ¿Öþwÿ(û�²�Vt�Ï�ÿCÿêï¤ÿ8ÿ�Ò�kV��ÿ"ÿ{ÿÛ·ÿZÿâ��62��æÿXÿ«Òÿÿÿ�²�Vt�Í�ÿ8ÿôíÿBÿ�É�|P�·�ù#ÿ|ÿÑ»ÿ]ÿ +í��:;��ìÿVÿ¼Ûûvÿ(ý�²�Zt�Ò�ÿ?ÿåó¡ÿ:ÿ�Ó�o"Y�«�ÿ!ÿxÿ׸ÿ\ÿå��8/��æÿbÿ³Ñÿÿ!ÿ�·�Qu�É�ÿ6ÿôíÿBÿ�Ë�|N�EdkRp}xvvz r{~ds zvposq~{tow|}|qvxz}yvt}oyz}qzuqowtptoryw zt} {ppvsuyx}mlvwrxz~x}| |||{moxi{xxmo{} n~x}~vvwxh}l~~}{gppqhzxrjpc v }um ys}zt ^p} pl {r| y}v}z^vp px^kv{ox}yols |}|oyusmz i{u {oe~{¦oyoxlrzX|wm|yn~s~bt °p~z~u|g xy d~|{{}~}w}z}rmw} ~~wopjyzw}lk| yuy~|zfW¢3ÿªÿÔ�C.4��âÿZÿ±Ûÿÿ$ÿ�º�Wg�Å�ÿ2ÿúå¡ÿNÿ�Ô��!H�¦�òÿiÿÇÏÿiÿø� �N)�|�á�ÿGÿªâòÿ6ÿ�Î�ga�³�ÿ-ÿ~þá´ÿPÿä��28��ë ÿeÿ»Ðÿ~ÿý�²�Q'w�Í�ÿ;ÿéñÿFÿ�Í�yN�µ�ø#ÿyÿгÿ\ÿñ��>;��ç +ÿSÿ½Ûúÿ+þ�·�\o�Æ�ÿ;ÿñë©ÿ?ÿ×�{)K�§�üÿrÿ̼ÿjÿì�¥�B-�K~^nh w{yzzny z~~~~}uyt~~u|qz x{i~~~w { {{|zxy ~{ v o~~lt~zv{}v|~u~}zx~ vyv}vxr}t xw~{wsyx{~u}| uwi}|tl uz |xo{zlvr~w tvyytsq{}zwxs{~ xsv} y }zx{~~{yl{~~{w~}xk|{{stz }~{{ryxyuz fn{|w ynp{||v|~ y tuzi zs~rw}xvx|py|~|~zv}xn~y t| uwq{v}~yzvmz| { }z~ptru{zun~~uxe~vw|om³Ç,ï�P�ÿ=ÿqÿ²åûÿ2ÿ�»�h b�Á�ÿ,ÿ÷ݰÿNÿ�á� �0D��ôÿbÿÄÐÿsÿ"ö�¯�O|�Ð�ÿFÿêõÿ8ÿ�Ï�q + R�³�þÿ}ÿÒ´ÿ^ÿ ç��82��âÿUÿ´áþÿ,ÿ�´�af�Ë�ÿ5ÿñä¦ÿIÿ�Ý�{�'M� �ùÿjÿÑÇÿeÿò�¤�F%��Ý�ÿQÿ£Þüÿ-ÿ�Æ�`f�¼�ÿ)ÿÿߪÿRÿÚ��'>�£�êÿiÿ¾Ïÿrÿþ�¦�L(u�ÛÿBÿ¥ëîÿ>ÿ�É�m\�·�þ+ÿzúݹÿTÿ é��;;��íÿ_ÿ¾Ðÿ}ÿ ÷�·�Ny�È�ÿAÿíôÿ;ÿ�Ì�w R�´�úÿÿιÿcÿê��55��ãÿTÿµÞÿzÿ*ÿ�±�^j�Ð�ÿ8ÿïæ¢ÿEÿ�Û�x�%T�¦�ü ÿoÿÕÅÿ`ÿí� �B-��á�ÿYÿ¯Ûüÿ&ÿ�Â�Xi�Á�ÿ6ÿüæ¢ÿLÿ�Ó�"D��òÿoÿÅÄÿmÿö��C0��ÞÿHÿ±æöÿ5ÿ�º�g +d�Ä�ÿ3ÿóá®ÿIÿá��-J��úÿgÿÊÉÿkÿñ�¦�E"��Ø�ÿPÿ¢ßüÿ,ÿ�Å�dc�¼�ÿ+ÿÿá©ÿSÿØ��(?��éÿkÿ¿Ëÿpÿü�¤�I+�{�ÛÿAÿªêñÿ9ÿ�Ã�k^�¾�ÿ0ÿ÷Ý·ÿNÿå��3D��öÿcÿÉÌÿrÿó�«�K��Ô�ÿLÿâùÿ2ÿ�Ê�e]�¸�ÿ'ÿÿݬÿXÿÜ��,8�¢�èÿeÿ¼Ñÿuÿü�§�N)y�Øÿ@ÿ©íïÿ:ÿ�Ð�b9ibuf{y{svsy|~z~~{v}~{y{xw{vy{}rw~{q|}o n|z{{xk{}~}yo~ ~s|}{ pwzw~rv}~y|ywt~t yyy}w}}|xz~szuzyl|q}|t~xk~ x{oov}~|sq zyp|qx~vzz}t|}p|{y{szs x z~xs}z}yz~{x{pt|~ ~wuovvx|wtz~|syx~xvsy}z||vt~{}| y|y|~~}kx~~r}|xy}ywv~yzvtxkv|~wo|~~~rr}{ {|v {z}z}}~z~| {}{w}{{~{mÓ�~T�ÿ-öÞÆÿÿ5ÿ�Ì�q +V�´�þÿÿÒ´ÿaÿ +é��43��â ÿRÿ¶ßÿ}ÿ*ÿ�²�ah�Ï�ÿ7ÿòãªÿFÿ�Þ�{�'M� �ûÿkÿÎÆÿjÿð�¥�D%��Ú�ÿQÿ¤ßüÿ-ÿ�Å�b_�¼�ÿ)ÿÿߪÿZÿÚ��*=��êÿeÿ¿Óÿrÿþ�¨�Q(�u�×�ÿAÿ¦êìÿ<ÿ�Ì�n[�³�ÿ,ÿzüܺÿUÿè��;8��ìÿ`ÿºÏÿÿø�¶�O{�É�ÿ?ÿñòÿ>ÿ�Ì�zO�´�úÿ~ÿηÿbÿ ë��87��äÿTÿ¸ßÿ{ÿ+ÿ�±�_k�Í�ÿ9ÿîæ¡ÿDÿ�Û�t�#R�§�þ"ÿoÿÕÁÿbÿì��@-��á�ÿXÿ¯Øÿÿ$ÿ�½�Wm�Ã�ÿ4ÿúè£ÿMÿ�Ò�"C�«�òÿuÿÅÃÿiÿ ó��@1� �á +ÿLÿ²ãúÿ3ÿ�¹�c f�É�ÿ4ÿðäªÿHÿ�ß�|�+N� �øÿjÿÏÇÿdÿí�£�D(��Ü�ÿSÿ§Þûÿ(ÿ�Â�_f�¾�ÿ/ÿþå¥ÿMÿ×�$A�©�ðÿpÿÃÇÿoÿø� �D-��ÜÿFÿ²æöÿ7ÿ�º�g a�Ä�ÿ2ÿôà°ÿKÿ�ß��.K��øÿgÿÊËÿhÿð�¦�H$��Ú�ÿRÿ¥ßûÿ,ÿ�Æ�^a�º�ÿ,ÿÿã¨ÿPÿÖ��)>�¨�îÿoÿÂÆÿpÿ÷�¦�D,�ÚÿEÿ¬èõÿ7ÿ�½�l`�Æ�ÿ0ÿöݯÿMÿã��,J��÷ÿfÿËÍÿhÿó�¥�I#��Ü�ÿOÿ¢Ýùÿ0ÿ�É�\`�º�ý6r?rn~{zv|~y|}vuxxmmr~s {}w}~wht~z|r~| ~y j}s}w~~nwo~ zzxqpzszp{txsxwzxovt||r~}}~y~zzkstwxwu|ys{y q|k|y w{|y pt {cn~u ztxk{v{||vz~xoswtuq}xzyzyv r ~w ~} |vty|ut}|u vx~ozy||l}z |t| zk}|z osy~~l}zptqvy|{~xmvxnrm{o~q}~ wiszww| |}ws}{~|t} l~yytoxjz~y¤yry|u{gottwwu}|wr{w|{|qxxPl½DþÄZÿ�5�Y��ñÿdÿÅÍÿwÿö��M{�Ë�ÿHÿîòÿ9ÿ�Ì�qO�´�ûÿ~ÿиÿcÿê��76��â ÿTÿ´áý~ÿ.ÿ�´�bi�Ë�ÿ5ÿðäªÿGÿ�Ý�{�+P�¡�ùÿiÿÏÅÿfÿî�¤�E$��Ø�ÿSÿ¤âüÿ-ÿ�Å�f^�½�ÿ)ÿÿܪÿXÿÝ��'?�¡�êÿcÿ¿Òÿsÿÿ�¤�Q&�v�Ø�ÿ>ÿ§èîÿ=ÿ�Ì�p^�²�ÿ*ÿyþݼÿQÿè��9:��ëÿ`ÿ¶Îÿ~ÿ!ú�¸�Oy�Ê�ÿ?ÿòñÿ>ÿ�Ì�| L�¶�øÿ}ÿλÿdÿë��87��åÿRÿ¸Þÿ{ÿ,ÿ�¸�dk�Ð�ÿ;ÿïæ¤ÿCÿ�Û�v�%S�§�ýÿoÿÔÂÿ`ÿë��@&��áÿXÿ¬Úÿÿ(ÿ�¿�Xl�Æ�ÿ3ÿùè£ÿRÿ�Ó� !E�®�ñÿqÿÆÄÿjÿõ� �D1��àÿLÿ²æõÿ2ÿ�¿�f d�Ä�ÿ5ÿòäÿFÿâ�}�1J� �úÿiÿÒÅÿmÿï�¥�C%��Ú�ÿRÿ¦Ýþÿ+ÿ�Ã�`f�½�ÿ*ÿÿâ¦ÿMÿ�×��$A�§�ëÿoÿÁÉÿmÿø�¢�H,�}�ßÿGÿ«çóÿ9ÿ�Â�ja�À�ÿ1ÿ õá²ÿLÿä��2G��öÿeÿËÉÿpÿñ�¨�H!� �Õ�ÿPÿ£ãúÿ-ÿ�Æ�g_�»�ÿ)ÿÿߪÿVÿÝ��)<�¤�ëÿiÿ¾Ïÿqÿü�¤�L*x�ÛÿBÿªêñÿ;ÿ�Ã�n +^�¿�ÿ/ÿ÷Þ´ÿOÿè��3C��õÿbÿÅËÿzÿô[À¬Yszsp|~t~x| |w}|w |w{}z{syyx x|pzqvzz}v|qp}y}yx uyu}~zs{q}} y{w|wzrzpww |~exvsq y{z~r}~w{|xvvuwty|~}mr|{ {zzzy{{{}~~kq{w }zyj{x~so}|lqyot wyq|{w{x| x~u}|rzt yy|x{ o{ ~~ }v~wvxs}u~}}ztwzzvyurvx z}}k}{pjwwwrjv|z wxzts|uzz~~u {|~}}||uy~yw{xxr|s{{}{~q ~ ov{|uz{~y{q|z|nÃnÍä3ÿ�[k��ÛÿKÿ£ãöÿ1ÿ�É�i +`�·�ÿ%ÿÿذÿYÿà��08��å ÿaÿ·Üÿ{ÿ!ÿ�²�Zi�Ñ�ÿ8ÿñåÿFÿ�Ö�y�!R�¨�ú#ÿnÿÕÄÿ`ÿï��D,��à�ÿUÿ®Ûûÿ(ÿ�Ã�\j�¾�ÿ.ÿüæ¨ÿPÿÙ��&?�¥�íÿpÿÁËÿpÿù�¤�G+z�ÛÿCÿ©êñÿ9ÿ�Å�o_�¼�þ-ÿøÝ¸ÿQÿ ç��7?��òÿaÿÃÏÿuÿö�´�K +�n?Rfwrqrzyrrp{iuk{|yu~yu}wvu zu}}j{zpx}} {z}} {swv{~~l }vv zr }}zvw~{u|{~v| svuxzv{sztz{xy |~yqs | k~zt~wyw|}{ z~~~|q uxu|s~q| x}w {{jv~} ~rsyzx sz {pulu~uy|w||}~|}ru~ ~~z}{|xp~~ x { ux|{o|s}wn|}u}zuxr~~st}ix||xuz {|~pr~w{{nzuvzz¦8ÿÿ�à +.�e�Ã�ÿ1ÿöá´ÿLÿâ� �1A��óÿdÿ¿Ëÿuÿô�²�L~�Ë�ÿCÿðóÿ>ÿ�É�v +O�¶�úÿ}ÿÏ»ÿdÿë��;6��äÿQÿ¹ßü~ÿ.ÿ�¸�_j�È�ÿ9ÿïè©ÿEÿÞ�z�,J�¡�ýÿlÿÍÂÿjÿí�§�A%��Ø�ÿPÿ¤âþÿ.ÿ�À�g]�Á�ÿ(ÿþÛ¬ÿXÿ�Þ��+B��ëÿeÿÄÓÿmÿü�¥�P'�v�Ú�ÿEÿ¤åïÿ:ÿ�Ñ�i^�±�ÿ)ÿ{þà·ÿVÿä��66��éÿbÿ¶Ëÿÿù�³�Oq�Ë�ÿ@ÿòñÿBÿ�Ê�zO�µ�øÿ{ÿϸÿ_ÿð��:;��çÿQÿºÝûxÿ*ÿ�´�\o�Ð�ÿ<ÿìê¥ÿ?ÿ�Ø�r�&Q�§�ÿÿsÿÖ¿ÿdÿè� �<,��ßÿ[ÿ¯Øÿÿ%ÿ�¼�[l�Å�ÿ2ÿûäÿJÿ�Ñ��!G��òÿsÿÉÆÿfÿö��C1��åÿJÿ´àö ÿ2ÿ�½�bj�Ã�ÿ7ÿóç¯ÿDÿÝ�~�-J��ùÿoÿÉÃÿlÿí�¥�@#��ÞÿRÿ§ßÿÿ&ÿ�¿�aa�Á�ÿ*ÿüߦÿTÿ�Ù��%C�¦�íÿgÿÅÏÿjÿú� �I.�|�ßÿFÿ¯åñÿ5ÿ�Ä�f e�»�ÿ3ÿ ÷ã³ÿKÿ ã��1D��÷ÿiÿÇÇÿqÿñ�«�E �Õ�ÿNÿ¢æûÿ0ÿ�Ã�f]�¾�ÿ'ÿÿÞªÿWÿ�Ü��'@�£�ëÿcÿÂÑÿnÿü�¢�O+�z�Ü�ÿCÿªçðÿ9ÿ�È�ka�¼�ÿ1ÿøá¾ÿBÿ¿ri{yzv x£}qyse~r}}{o||{xzg|}qzzs||w}o~z|{ { v|qqoson~|{{xvmypymr|spp}w{~qru~}o~~x}vhzpx{y|{ z~|j|}txyv}}}|z}x }u pyx||z~} |{yywosz{}yx|yy}uqysusxy}l yzx~~|j}x}{|swu{|wkn yls sz~w}{x~t~{yxqxx{}s{t~sz|zyh}z{v wz~{}vzv~zu{} sypxqyn||}gs|xxwxrwyvw|zoywmÇ�@�÷ÿÇßüÿRÿÝ��09��æ ÿeÿ¼Ñÿwÿþ�ª�R#r�Ó�ÿ5ÿ£ïèÿCÿ�Ô�uT�°�ù#ÿqÿ׿ÿ]ÿî��B/��åÿXÿ²Öýÿ&þ�À�Wn�Á�ÿ6ÿùé¤ÿJÿ�Ó�%B�©�ðÿsÿÄÆÿnÿö�£�D-�~�ÝÿDÿ®çõÿ9ÿ�À�i_�Â�ÿ/ÿõàµÿLÿä��4E��óÿdÿÄÍÿrÿó�¯�K�Î�ÿJÿêöÿ6ÿ�É�kU�¸�ÿ"ÿÿѨÿµ©v{|awyt~}}{}~yvpvvq|u{uz}yu~yt| ~}up~|z{ms}w lu}ot z|m{|ytx~~|~{v{ttvk|zxzs{ t{u x vxqw~sur~z|v ys~{~~w { |ss{~vq{y|vv}|{|k tzw|uw~to~|}¥p p~sw{pkg}s l{{m{vzyy~ y}}}j uw}z ~xy|{v|xy{~wuvy{}}kuw|x~us }~t|zxwtz~u||t}} slr{y{m|~|qw|wr|{n~j|}{}t{{ |~mybN¾#ÿÿ�Á�B*9��æ ÿ\ÿ¸Òÿxÿ#ÿ�®�Uh�Ò�ÿ8ÿðæ ÿDÿ�×�w�"Q�¦�ûÿjÿÓÅÿeÿî� �D&��Ü�ÿUÿ¨ßüÿ,ÿ�Å�b`�½�ÿ+ÿÿÞ©ÿVÿÜ��)>��èÿ`ÿ¿Ôÿrÿ ÿ�§�T%�s�Ú�ÿ?ÿ¤éìÿ>ÿ�Ï�oY�¬�ÿ)ÿxÿÚ¿ÿZÿé��:5��äÿ_ÿµÓÿÿ!þ�º�Uo�Æ�ÿ5ÿ÷ìÿHÿ�Ï�J�¯�òÿvÿÉÁÿfÿó��B3� �âÿJÿ´â÷ÿ3ÿ�½�e g�Á�ÿ6ÿóå¯ÿGÿá�}�-I��÷ÿjÿÇÅÿpÿï�ª�D#��Ù�ÿOÿ£âþÿ5ÿ�Á�i\�¿�ÿ%ÿÿÚÿXÿ�Þ��)?��ëÿbÿÀÕÿmÿý�¦�Q&�u�Ü�ÿBÿ¤æïÿ;ÿ�Í�k _�´�ÿ-ÿzûá¸ÿUÿå��89��ìÿcÿºÎÿÿø�µ�L y�Ë�ÿAÿðóÿ>ÿ�É�tQ�µ�øÿÿиÿ`ÿì��5;��æÿSÿ»Üÿxÿ*ÿ�±�\n�Ð�ÿ<ÿëê¡ÿAÿ�×�t�$T�¨�ÿ#ÿrÿؾÿ_ÿé��=0��áÿ\ÿ¯×ÿÿ"ÿ�¼�Xn�Ä�ÿ:ÿøéÿGÿ�Ð�H�®�ôÿ{ÿÊÀÿhÿò��=3��åÿNÿ¶àûÿ0ÿ�µ�a +i�Ê�ÿ8ÿñæ¬ÿCÿ�Û�x�)P�¡�üÿnÿÑÄÿdÿì�¦�@*��Ý�ÿVÿ©Ûÿÿ*ÿ�Á�[g�Â�ÿ.ÿûæ¢ÿNÿ�Ù��$B�©�íÿiÿÃÊÿjÿõ��E0�~�ßÿIÿ«ãÿ¡â¬dyis~ v }zr|{m|uwzwwzxx||wx}v }}ps{v~o~xyyiyn~}xuu|mw{zz~rmw~}uwt|von|w~y ~mq~nutyl|y ~}zx|zzvpsq~{x|zx z|wxyy ~~z~uqwxt r{z|yz¡xww| ~vp spz|}ux|x{srw|opwv {svyu}{w~y x}w}{|ruyzx{~vxzw}y|u~v}xnyz~ypv{w}|z}z~ y~v}ytz|}wx~~q{zq|wxw~ru}whxt~ sjyfy{xqÃwÁö÷�Fx�£�ÙÿIÿ¥åûÿ2ÿ�Â�l]�½�ÿ%ÿþذÿYÿå��/?��ìÿYÿÂ×ÿvÿ(ÿ�¯�Xr�Ð�ÿAÿêí ÿ:ÿ�Ø�p#S�©�ÿÿtÿÓ»ÿeÿè� �;*��ÛÿWÿàÿÿ'ÿ�º�ab�È�ÿ-ÿúߣÿOÿ�Ú��$H�¥�ñÿgÿÈÐÿhÿø� �L)�}�Ý�ÿJÿ¦áôÿ3ÿ�Ì�dc�¶�ÿ,ÿÿâ²ÿQÿ Ý��2:��êÿjÿ»Îÿzÿû�°�J�Pbmxrwz{yw~lx|~~m}xy}|}|~ty}~|srx| {|{ {}{u}|t~|xvzyv~z}u~z{| ym}st| y}szwv{|zpjv~{gn|z yx~}yuwvvx{s{|}{{ yr|{u |}|~z|}us~v|}z } ~y~|yv z qq~~u zx~~g |yig|}zwx~q~v}xxz|u| py}lwp qcpx}yvswvuq|o~{nyy{x}zv~uyqzvxuxnu ydj£pp|}y||z nzul{|csp~vwzstt{qrr}p|Jê®aÿ�M�¬�Ï�ÿ<ÿóç¤ÿ?ÿ�Û��'M�¤�ûÿmÿÎÂÿgÿî�§�D#��Õ�ÿNÿ¤åûÿ7ÿ�Â�o\�º�ý$ÿþÖ¯ÿYÿã��0>��ìÿZÿÀ×ÿrÿ'ÿ��T�s�Ò�ÿ?ÿ§åó ÿ=ÿ�Ö�iV�©�ÿ ÿsÿÒºÿcÿç��B.��ÞÿYÿÛÿÿ%ÿ�¸�Yi�Æ�ÿ0ÿúãÿLÿ�Ø�� F�®�ù#ÿjÿÌÇÿhÿü��H-��æÿJÿ¯ßõÿ2ÿ�Ã�c_�È�AlN®jszs|x ¤ }v}hq zxytm~ l nu{yyr{ vvix{{q~yuwcvz{zx|g}~n{szvypuuu z{~ ~y{ vYwltz|lx}~ywzp|~wzxq{zr{~rw{vxq{yrt{|{wf~v}x~xsy {~`cql~{cxn zx x ~{z|mt{u{hpw ls~ wy}t tz|v~zkzwwq yx|~~xz{zt £y}|yy¡v u~vovpv}{~v|ew}{|{xb{z}t~wvzxtw yw{yq[yu ~wzy{twl txuxzxsss|lux{x}vmysyviy}tp}wxsx| |zxzlÉ¡`ô�T�ëÿ4ÿrÿËÀÿiÿö��G-�}�Ý�ÿUÿ±äñÿ9ÿ�Á�e a�¶�ÿ0ÿûß·ÿOÿä��3:��îÿ_ÿµÎÿ~ÿû�·�Sy�Ì�ÿ<ÿòðÿEÿ�Ë�zK�³�öÿ}ÿϼÿcÿ ò��>6��å ÿOÿ¶Ýøÿ3ÿ�¾�` `�¹�ÿ;ÿõå¯ÿCÿÝ�{�-E�¢�øÿmÿÇÄÿqÿî�©�@%�Ó�ÿJÿ£éùÿ2ÿ�¿�j[�Á�ÿ%ÿüÚ®ÿWÿ�ã��,C��îÿaÿÃ×ÿmÿ"û�¨�S%�w�Ù�ÿFÿ¢æïÿ:ÿ�Ò�h[�°�ÿ'ÿzÿݶÿYÿ á��63��çÿbÿ¹Ñÿÿü�´�O +q�Ì�ÿ:ÿöëÿBÿ�Ë�{N�µ�÷"ÿ|ÿÏÃÿ^ÿñ��:<��éÿRÿ¼Ûú~ÿ,þ�·�\q�Ì�ÿ=ÿíë§ÿ=ÿ�×�u(R�©�ÿÿsÿÒ½ÿeÿè�¥�9,��ÞÿWÿ¬Øÿ ÿ&ÿ�¹�Zi�È�ÿ1ÿøæÿLÿ�Õ��I�«�òÿsÿËÄÿeÿ÷��C2��æÿLÿ´Þ÷ÿ2ÿ�¼�_ k�Â�ÿ8ÿðêÿEÿÛ�|�+K�¢�ùÿqÿÌÃÿmÿë�¦�?'��×�ÿRÿ¦ãýÿ)ÿ�¾�d_�Å�ÿ-ÿýÞ¤ÿSÿ�Ø� �!D�¦�ïÿjÿÇËÿfÿô��F-�~�Ú�ÿIÿ±âóÿ3ÿ�Ä�eh�½�ÿ5ÿôæ°ÿGÿà��/E��÷ÿlÿÊÅÿpÿï�ª�@#�Ö�ÿNÿ£äýÿ-ÿ�À�d\�Á�ÿ(ÿþݨÿVÿ�Ú��)C�£�ìÿhÿÅÏÿlÿü�£�Myªkuv{||k{}rjyq{{ww |wzy~vlwy~r st }r v }x}}w{t~{}|}}ruz{rzu{}s|zlwx|sxov~}~mc{~{}m~z~nt}{tsxo[~|y{~ x~xv v}|~v~{z~l~x{ {qu~y~{yyl{}}y rwy} yv u}a{y~~z}s}q~}|bp}wx}wrwr}{~w}z~~zvwwz|{w|{|zz|~|{ws|z}ryxwzu|}yi|t}~| ~u~h lysy}{xx}}zwwy}|~z~zsz~zwzxxzyvuswpy~p~ufvÿ@æù2ÿ��oJ�©�ñÿqÿÉÇÿiÿù��F.�}�àÿHÿ®ãóÿ4ÿ�É�fc�·�ÿ/ÿ}üáµÿVÿã��47��ì ÿdÿ¸Ïÿ~ÿø�³�Q +u�Ì�ÿ<ÿôíÿCÿ�Ì�{M�´�õ ÿ|ÿÑÃÿ`ÿò��<7��êÿSÿ»Üùÿ.ÿ�½�am�Ã�ÿ:ÿòë«ÿFÿÚ��-F�¥�ùÿrÿÉÂÿlÿì�¨�@%�ÙÿMÿ§éúÿ7ÿ�¾�k[�Ä�ÿ*ÿüÙ¬ÿTÿ�ß��7O�YpF{e|~|vzz{}o{}|x}vuv~z~v{w|zttywq~j}y~v~j}xzmp~tp}yo~| ~t}v|mxv~ |{l|wz|~sv{z zruvxy|iyh xyo~n~ok}~syx~svw~t}r}}y ~t~|p|t~~xt||~~y}~}|zmp{w| {x~y{ogy~yz~w{y|||}~x~}}}uz{~yk{yz|y}~z}|y ~}|{}qst{w}|{}tqwx| }z{yzyy |}z}|{|~ t~|~w|wx{~}zzry|v Õ�³ Óÿÿ½æõÿ7ÿ�Ì�lW�µ�ÿ"ÿÿÖ´ÿaÿä��64��âÿWÿµÝÿ}ÿ+ÿ�°�_g�Í�ÿ5ÿñä¨ÿIÿ�Ý�{�&J��ùÿhÿÑÉÿjÿñ�ª�E&��Ø�ÿOÿ¡âüÿ/ÿ�Ç�e[�º�ÿ&ÿÿجÿXÿÞ��,;��èÿaÿÀÖÿuÿ!ÿ�ª�\#�q�Ô�ÿ<ÿëêÿAÿ�Ö�r�W�ª�ÿ(ÿuÿؾÿ\ÿë��=/��åÿ[ÿ°Õÿÿ#þ�¼�Wq�Å�ÿ+ÿ¢rfy|quzzz ~{syv~x xh}wt}stw|{uxyry~w v}rqml ~z|~~ w~xz| u|~}}~x|~{yvv|wv~}twzxw~}tz~~x~wqwyxv}yxsutzwx~yu|}uxq} y}{}~x|rw owzz}|vrvw~s|{~uyyzs|w}~u}q{zxxkx~~}y}y}xyz}~wj{rq~w}zryny~x_vs tuov~||uq x{ouunz~xwzvq{tpzy `y|rzzvtpq{{|vuyxmtofzqxunpw |tustpr~qsnzx}v~y{gxSÍÿ�ÁÇ�ñÿAÿ¢ïîÿBÿ�Ð�xR�¯�ù%ÿvÿÒÂÿ_ÿð��@0��çÿTÿ³Úúÿ*ÿ�Ã�\i�½�ÿ2ÿýæ©ÿOÿ×� �(=�¦�íÿmÿ¿Îÿuÿú�¨�L(w�Ùÿ>ÿ¦ìîÿ?ÿ�É�qZ�¶�ý*ÿzüÚ¿ÿVÿê��;8��ëÿ\ÿ¸Ñÿÿ!ø�¹�R +w�Ç�ÿ>ÿõî ÿ@ÿ�Ð�} G�¯�øÿxÿȾÿiÿ ñ��<0��ß +ÿLÿ³äúÿ1ÿ�»�g +e�¼�ÿ;ON| }} vzrpws~u}x }{z}}}s}}~x{ z{ ~|{ }|uy v y} }tqt~{uiwy z{|xnx~uo x y|r{~s xz{}z|y}{|xvyto~{yx}|xiy|p}zsxys|w~yy zw} s vwuw{vw~rwzrx wev|zw~vw|u{| } ~~w||xq~{ry~ {|}mt{zuu|vr|}txxy {u|~}}zzvs~z|xqpz x wx xx}zrts}~{s|x|zw rvvu|r¢|~{~pv¬cºÀ>ÿ�bg�ý ÿAÿÿà²ÿWÿà��18��ç +ÿfÿ¸Óÿzÿÿ�°�Q m�Ò�ÿ7ÿóæÿGÿ�Ò�|�R�¬�ø#ÿqÿÒÅÿaÿñ��F,��ä�ÿRÿ¯Ûùÿ*ÿ�Ä�]j�»�ÿ0ÿþä©ÿOÿÙ��(=�¤�íÿkÿ¾Êÿuÿû�§�N(x�×ÿ?ÿ¦íîÿ?ÿ�È�pZ�·�ý+ÿ~ûÙ½ÿVÿ ê��9<��ëÿ]ÿ¿Ñþ~ÿ#ù�»�Q +u�È�ÿ@ÿðñÿ=ÿ�Ï�x!K�³�õÿÛ D¯j{p ~zu~|~i{} { w| yzyyyt }{}~~uyur{|u|vi~vtoqw~~n~y~ y }y |{qo u}~||{{~~zw~tyv ~|ur}~ |wtxxy|~wv ~z}|||| ~{zxym{r}~v|sqw~z~{u{}}{|~|qr z}~y|{y~}||oxuxt}wsx}yzy}zzxs ~{}}}tsq}}l}|~}em~rw}v|~vup}twyyx~~xwmtyz }|{tz}{sxy|}~y}{twypsxyvhz|yppouw |zs}z| yx}y}k||sx~}q|~}jot~smvm§nÿ�¡6�æÿFÿuÿÐÇÿeÿó��H+��á�ÿPÿ«àöÿ/ÿ�É�`a�¸�ÿ)ÿÿâ¯ÿWÿÝ��07��åÿeÿ¹Öÿxÿÿ��V"n�Õ�ÿ:ÿðèÿEÿ�Ñ�w�T�¬�û%ÿqÿÕÄÿ]ÿï��A.��åÿVÿ¯Øýÿ(ÿ�À�Zm�¿�ÿ4ÿüæ¦ÿLÿÖ�%@�§�ïÿpÿÂÇÿoÿù�¢�E+|�ÜÿEÿ¬çôÿ9ÿ�Â�l ^�½�ÿ1ÿøÜ¶ÿQÿ æ��6@��ôÿbÿÀÎÿwÿõ�³�M}�Ì�ÿGÿíõÿ9ÿ�Ë�p T�µ�þÿÿѳÿbÿç��27��äÿWÿºÚÿyÿ&ÿ�®�\ m�Ð�ÿ:ÿïæÿCÿ�Ö�u�V�©�þ$ÿrÿÕÃÿ\ÿì��@-��äÿZÿ¯Öÿÿ%þ�½�Vn�Ã�ÿ6ÿøê¢ÿIÿ�Ò�!F�®�óÿvÿÆÄÿkÿó��B1��à ÿKÿ³âûÿ2ÿ�¹�g +e�È�ÿ5ÿòâ¬ÿIÿ�â�|�+O�¡�øÿhÿÐÆÿfÿð�¢�D%��Û�ÿTÿ¦ßúÿ+ÿ�Å�]e�½�ÿ+ÿüä§ÿRÿÖ��&A�¦�ìÿnÿÃÊÿqÿ÷�¡�J-��ÚÿBÿ¬êòÿ8ÿ�À�k`�¿�ÿ0ÿöß±ÿPÿæ��4B��öÿbÿÆÌÿqÿò�ª�K�Ô�ÿKÿ¡ç÷ÿ1ÿ�É�iW�¸�ÿ%ÿÿÝÿYÿß��);��éÿcÿ»Óÿsÿþ�§�N&s�ÙÿAÿ§ííÿ=ÿ�È�oZ�¸�þ,ÿúÚ»ÿRÿ +è��8@��ðÿ^ÿÄÎÿwÿ$ù�·�Od°aznv|}w}sq}ppkzlu{wynx||u{~t iz{|~x~} |yq{}}w |v~ pv{w vyyv|ttvywvz|wuptxcrv|s|y}y |y{zn }{|zrzm~vtwr~ ~xz}vy||~|~z uz }~ }p zszv|h|lvzyzqv| wq ~x{ y~sxwsa~y{{rwxnx{ twx}|wzv} }{|~ozsxyy }}~}v wy}~ks|x}m }xzyv}y}z{q~uvow} |}x{}zxvx~z~{~x{|yxzz}ysJOÿkÂÿì�¦�v�$K�¤�ùÿmÿÎÄÿgÿð�§�B#��Ù�ÿOÿ£äüÿ1ÿ�Ã�k[�½�ÿ$ÿÿ×®ÿZÿâ��.>��éÿ[ÿÀÖÿsÿ&ÿ�®�Z�r�Ó�ÿ@ÿêëÿ>ÿ�×�p#Q�©�ÿ"ÿsÿÕ½ÿcÿç��<*��ÜÿYÿ¬Ûÿÿ'ÿ�¼�]e�Æ�ÿ/ÿûâ£ÿQÿ�Ø� �#G�¥�ðÿhÿÇÐÿgÿú��L*�}�áÿKÿ©áòÿ6ÿ�È�d e�¹�ÿ/ÿúä´ÿQÿ +ß��2=��ì ÿjÿ¼Ìÿxÿø�±�J!z�Ð�ÿCÿòñÿ=ÿ�Å�u +R�º�ú#ÿþÔºÿ]ÿê��:=��íÿXÿºÙþyÿ)ý�²�Xr�Î�ÿAÿëí¥ÿ:ÿ�Õ�r%W�«�ÿÿvÿ×»ÿ`ÿç�¡�8.��Ýÿ\ÿ×ÿÿ,ÿ�¸�Ze�Ë�ÿ3ÿøæÿNÿ�Ô�K�®�ôÿsÿÍÆÿdÿõ��D4� �äÿOÿ¸Þ÷ÿ.ÿ�À�_k�Á�ÿ:ÿòé¬ÿDÿÜ�|+F�¤�ûÿoÿÈ¿ÿnÿï�§�>&��ÙÿQÿ§äþÿ.ÿ�»�b`�Ã�ÿ*ÿúߦÿRÿ�Ü��%G�¦�ðÿhÿÉÎÿhÿù��K1��ß�ÿIÿªâòÿ3ÿ�Æ�ed�»�ÿ4ÿùæ±ÿLÿ à��0?��ôÿlÿÃÇÿuÿó�®�D#�Ñ�ÿGÿ¡êùÿ4ÿ�À�hY�Á�ÿ%ÿþÙ¬ÿXÿ�á��,B��íÿ_ÿÄÔÿmÿü�¥�Q&�x�Ý�ÿGÿ¦æïÿ4ÿ�Í�ic�¼�ÿ0ÿùä´ÿ\ÿ ä��4:��æÿt¿wG¢«e|n{{}{~jz}ztuo~rxyfy {scyw~z|{| ~y}zsmymy}t{zv}v z hvz}z{|puxvtu}x |sv|}~wsyw t~uj~uxnuzs~p|yxnihkr xxxmvz}z|yt z{{{l}q}~||~}vy|qrn~~swv|ym}xiwyz|x|u~ sy{z| ~ zyw}{z mx{zuyv{z|sw|wzxu~wlpq{v~}|yv{ow}~~vl z|y|{yst }{{yzyxl{~z{yr{{t}u~w ~|{|{zznexv}|~~ |~xv}~zzuqp}}z}xv{ }zz p u|{}}trt }z|zz|^}~x}tyw o{~|{x{wup}zi|y o{w~~~t}n{wy~xo|~|z|~|~x |{{uxz}~~uu}||w|u{ uu}zyvrr xxw}wwyzyztq|}|~|m{{}f|y}v~qy}wy~v}suvrrs~y}lzst|rrssmvrz[|u~u|xvzysjtopwur}}|v} q{j{}]t}zlnw h}cvovixgvvuw{tl qerrztqu~zh{wszu~~r~pt| x z| ~sv}gvhyqpw}vew}swxz xuq}ryx|ry ~{~ yp { }xyruq~zw xs|zu~~{v}z{{voxxyq ~}wvxt} ~~|~y}}~}h{~yyr{ro~{| y}{xk upxjzz{}kv}r{u|{ww{vuzw~|}|s twz|v}mt{v{|wtzvwz~j~ vw|ztvy}u~{ztz~z||y|r|~{xfx{}|yrs{u{~t{{zr|srx |{r t||~szy|vqpzv|w|rw{xwv|xyz{zx\ xw~|}y{y~{x~}r} {r z~xx|ptx~t~t z|}wvy{uzp}syy{yu~z {qw}ryt|wxyowypsy{ngo~s ||v{vt||| zv}||r }}}u}}u}~|wv{~~||rw~} |xxwx{v~|s|xuvxk z|~yl|}{ zzyv||t|z}}fv~{~uzy ww|wrn }|ztz~w}s|}yz{uz¢ v{}rwos ixwnzmo}~ {szs}kkxrs k{{~~yzqvsqv{tx {}nz~|{~ {wy{tu|{zqm~~mv{s{r|qzu}y~wx}sly|x|qwnq~u|u{zzphp|gnw~wmutws }un vj} qywu| s nu}fsyvckxqwsw{z tu~vqz ryotp wmyutsjvz sz rog|u |}sy{}q hv}z|~u ~|{z{|rnypqxs~vtvo{g~yryxtxytswo styuyy{{}twizx~ {m}ynvz{zv}y~su v~y~x~ ~v{vz~wg{w}|yqt ~r vuw x~|x}qwzw{x~x~y|dzy~x{{y} wxz }x{z~|t}ls~~t~mv} txwzx|vvk{km~} ymtu}}ux~hv|y kyzz ~u}y} wz{xswv{}vs}z|~yysm|gw|stm~zhzvwz~swq{xkyr~pv{x}xf||kz{{w~{}yxw|u^|urlw}xcn}} wc{{w~|~ ixuzwyu~tp{~xu|{t~|zcs}sxqrn|y|ny rx~ ~lmllts|~v~t t|bq|pyxsv{{|ypy}vziwpx~e |}}lnwuzt}v}u{t|uq~u~vsvx|w{j~ |zyjsrz|iyuuvzz|c ~tdxyz wez~x} qvy~z s|{xtpzzvv|{}uf lp{z yun{xxz~y~l|o}twww~|{ {w i ]wsu}~yxzww{zsvt}l{t}~~x~u|}{jrv}u|w~{wlty|r}y~uy}| s}wuqp {vsu~y~eyxw o{~p|lzo~{zx| ts{ p yyypykto}wtlvyy{| ~u py{}zjyyqrzsxtxnorsuxf fp{vy}~wo nwoaxzvpxq{ry~szu|~xnxxsv~ufu|i}h|xqssq{pvl~|ztt_t~~ }os~xouepf{oqx|fvup~s}}x~y~uy l}~y|t}}n ~|sw}pt{£} |tbsyt~|j{v{nrp}z[pz~v}t{p|} } s~z| pwar }~vxyklzxpzqx xljwiwy ~dy~zp| x||xxvywkypvz} s{yzzvxvuy}~ }u|y}x~sxi{{~ts~khzy}y s~tvu{~{xw}z~~}xyt x||v~}u|kw{{{ r{y~vzvus}~mn}xm{qzz}{p}t{}{tpttyw|ynzvv{v}~u{z vzyxy~wzvul |{v{}us |qw{| ysjx {exxwu~z |xv u~xyx}qz| x}yus{tuzw y xuzxvz{ntqx }|}|v|{}vx|v }ttosq|r}¡rpm ~}|yw~|mxmxl}mtlyyz}yv}}z lyxzvwuors| |uxntfx tyzr¡qokwt~wh||uy~~knwwyty r||g{nyw||sjo~nvuzdo{~zv pdwjqnaiuy~r|twyvt {|r }ummx}w~m}iuzzz}{o~x{u~{z |vvzp{pvxru{| v}ko}{wt{{w{~w~zy{xvv| zysz}~srwz~~{nonxp~ywntx ly{oy~x}xt~y{ |~v|xvt}pt v nzs{mwtirxp |ttvogquzztwwxpty|vnryv swtp|| wtu}qt}xtvzvwu}w}pqsuy~x~}}xuv|u}x{nz|{r}|u|wyo vt}~~{zpsx~}s~ u { |sz ~v}~ tqyy~~wz~~~{x{ yrr|pvltxizt~y|or~xu|z|pwwptxzw|zw}y|s~{{~} zzvux|k{{~{|{vwui u}y{y}zxul|lws{|{o|{ ~~uxz|xuzvty~}zs|}vquzpzy~ls| tn|xt~uuuy| uyznr~~yyuz{ry}vp{yuyszy|xx}y}zyy}yx|{} ~~{|nwvv|{}px||~||xzxysw{u|uo{|x{t~v~{xry|zmi||v}rq~gxuwzwtw{rgoqvrqy~sxxu|z~|opsvnvpzd}ylr}xx{|tm}tzwyy uxk~ix~rzi|p xyspiuud~x{t~w|~~c~i}wt}|jr}xprwir{} {ux{vqnw j|~rnpm }xxtzu|}rz~|~~}z~ wzwytt~zp||~wqpxtyz~sx~~}zx~w|vs}~{~z~y}~{}|{zz~yzvzv|~y}||}{sqy{kysr~|{t}xmx}z{tzxtu|m}lz}zyw~ z|q~z|~wx~tus|{o}}|{}~|t|w|xwww|}x| |pq| ~d|zw}yfzzpny k~w~|w~v}|~lom~hwyyp~{ywzr}~uz}~z{|xyx~zqxw wsug}}v{{w{|}zgt|~t zxixw}yxy|v~ {wy{v|ujv{|q z{{s|usxz| r| {~wzx }~{ x{muvv~w~woxwtwz~|~h{nw| yz~m~|x||u~|}o{{v~{{{w{ywz ~zzyto||~xtz} xz||wz{ztz}|y{ypxu umt~qnv}}v s}|xz}zt x~w~x~}|| }|z{~w{|{p{z{wp~yyu qzzstvwy{zzx{y|k x{}uy} x}~pyysmyy~ }z|yo}wxwx~ }}|zyu|{zq~x|r{}~rr{zrdop}twz{zy|uz~z wqtr}{ypvwqxr|lz~{vz}vxs{zz{{zquy}mwn}} z|wgjvzl{utktzwqp~k srztnwzwyqy~{y}y|v{z}nszytk~~t~xut u|{z~~fzuwss}}yzymwjz~w}{t~xqz|st}zv{z{{y|yzy}~{ {stzq~y{{zmxr|{yxwn{k|wy |sxq{|{gxwswvz ~u {}oyz{~sv}{{|{ztzzx}zw~{ ~~uv}}w~rv}}n{|w}tpy|{r~t v ~r|xs|q{x{{yy}zxxvs~y xsz}t{x{ zv} y nxkxnrzqr||{vz q{~~{}~u{|x|uwx|~}w{}v}mz}yxtw|vp z{z|zwx}|r~zzzvz|qtxv}|q|yq{`~y{ku~~yy }{|vz||y {}~vutyxx~|~}wr~~}|q|~uuy|xvzvsg|^x~~}wx k{|w|~vrv|{z~v~ {x{zx~{|yz zz|zyx~u y{~xr|gw~}~ }c|y~||zz {}kx|{r{x}~ }{ y{||{yxzy|z}tu{wpxz}~t{|~zxj vyux svut{{ oz{w{uovk yo ~p rr~wvss|x~twf} wp}dqyzw~|qm}{}}f{vdhu zqsxxq}t~k~m}qvªnvxarxrn|}zsq{tkzxs wx{ytmsyixuvq nzyuh jpsy| v{sxrxrx w k|wvs~mu|n|q }|xp~}|~ xx~|vxy zy}} z}}}uz|u {|zlxomy~wn{xuk~~nzwzq|}zv~z{ h~u~ p ~qvsx |nrs|~|}zwx|}{} {}tx~}w~y z|~zz}p{zu{|{zz{u\|~~y}}yz}~|nvxx | zqyj yww}s ~utq x zwv {s~z}{}uv{zw}k{~vw|l~rr|~|z{x~||zxyyjo}~}psn|y~v {zu}nwn|{ zvy u }vtw~y~zp{}zz~~~ vw||u}}{}{v}rnx~}}nxrr}}{}}}ux|yr|z z~}{}zzv n~z}x~s}z}|}n||n}|xw~||~~x }}v|o{pzzzrx~~ ~ pw}ut|~w| {xxx~yjk~r| z|wv|zy}|vz~y l{u} x{z}|xpj|y}}{~yx{~wqxy|qw vi~wvj| {zy~u{~q|q~~|}v|}~x}z{qtvur| wy{|~~r~ {xrgzyyyu}o~yw~q}r }m~y~}zy{~|x}zz|}kuyy{m}}{~wyg |oetx| x}wqqztyvn}~{{v~zxzs{{~zx|x |z{x }wz yu~zysqe~viw| uxs~p}unvyysr}||}w|xy~u|x{|~~|}tz{|yy ~tyz }nt}|x}}{uzv s||wsxy{}|x||r}x ~yzsx~zyztw kwy|utz~~{uzxv{jzzzwfhv| g|wymm{wxlq|s{ zv|}q sx{|z~w|{z msy ||t | {zw~|}}tm}~}|}yznqs| y|vu |{|~}{z{vt}zx|ss wy|sy~tz}zy{h zvyr}|wvs~|x}zz~ztv x|~|~}sn|~~yv}z|vt|x}}~s{wwsn }pw|vo}v su{zxy|w}syzx} szvlz ~ y~~~|y{kx z~o}xvzo{z~xq {xs l{ v{|~y y|u m{zz w{{v{|w~~y~|z~z xo~~ {xs|yopz||yr}{~|z|st {}qxrwt usulz~v||||v}o}| |{q}} t|{x{|o{}~{~v {~{~||w~~{~rlo}{~{o}||}zt}~|~ u~ qz }{yu{~{wzw ywx~p|qlt xqzywh {uzrkxsyuvr|nrk s{w~ot|}t~~p{gx}{fjr{jun{z|zwzliqg|t{t{~`yzoytvdqtio{sq~rvqx|{wswnpvzy{s}pz{yxwuu{kx} o| }{ rv{ywtzxr{y~w~z{ul}{s~|~~zz{{yz}y{|{y~ v}~~xz}ww~}vz|~lv{~u}mtr}uy|xsxswyqruf~|{~}zzuv rvqz|~vtx~}wzx |jxv u jzz~|xp~}~y}|w|{uy}z}}y|{zwvz{ t~t| pyu~zzwk}u|zk}s|u n||~xrkshyvyyqzz kzw|w{} ~|}xwyy xz|~x~s |zvz{|~~s}vy| so } s~}r}~x|svw{}tzhy||txpw jpxp}x|{~ sw{wpz|r~ vx zr {yw{uuv|}z}yy pp{v |pv{xo|u}}}{|zul|zry}q tw{|zxxvvuz|hzt~swy svx|~} zxs}u|~|hz}xttyz{ z~zwolx { sl{|~{zx||z~mxnj~vvpz~q} z||z{t|z|vt{yvyvw~{}w}x~ug}{}{~xer{{}kmrz}yx{~s^{~~}x l{~wovtr|l~ xv|~}u}{t|w|w{ y~|mu }r|||s{ zy|rz~~{y|u~{cjzr|}li|~zsxxx~pyq{mw§mz~ }|stixwo~ c |wjvs}~|~ rtv|o{hs|zw|msy}}~|vrt }{wgtw vr qt| szzzt||u t{krv~vn|v~tt}yxvvstrqtrv~v|{s| u~}x x|o||}zurzwyvyj}rz|ttk wv {~hr~{wtru |~rv s{yuy t |sxvs}x|{ {z{m yzy mv}ytxts|o}lu|| t|y{z} {{}tzmsrzi zy|zs{yuuyypws ~}yzszsxy}qy xsusk}uu~u|v|zz ~{xztzxu{|{~}y|rwg~{}u}p~v x y~qywpyx~x}} { }v{~{u wx{~vpjw|}quvtz}vvzzy~}uywz~~}z}j~wn{{yx}t xzox}vuotyy~}u urps~y{{ uvi}tw{ui~~ny}|}z vz{{k}zxz{}|yws|}| {s~{yz~omuyr y|pwowwx}~{}y}~u~rx pwy|}s|s{ vuywmqwtv}}{x~x{}w~{ x|yzy y{}ux}} xxze}{~u{xwwy~zv}z{}qxq}vs zsu}|xx~|ywe}~}l}y}t}o~y} t}y~}s }w~ {stl~rkymxsrjqtuqwqno |fewav}} ~y~lunyx|gvvliv| ~|yt sx}wttju~vzm~ru~c uxu~q x|z{~}~pz s¥owx}v qe}uyuaywhnynrvdsazn~i|uctvxy~zf m}uqkfz y{dzz~z{¢zx| x ~}uqx|n}yy ~~{~}yzk|xxj{ mvxkz{r|}u{zrlns~pzzzrzsy~|c{~{~ qj{oyzpw}~{x}¦wzx{tutyszwp s~o~|~wp{|kvs||t|x {~|{zwcxtlx{ywq|}~w}r|m}ki~vxtw |zskq}{ ~f_x{~r~v~tz{y}v{q|||~y}wx|my{v~q}kz|s~r z~vf{o|rx~}}v }{~px{w y{|y} zzww~{~s{q~pt{hzzywyzkuq~~x} riu{q~s{z {¡zwgqh{s|wymy~zv{vzy~yv{rzw~ uzyvx~}v|}vrf~z|qw~z}|u~y wy~sv~wx|}|yz wwyy}~gp }{t|wvj}{|~ y~_s||{~{ s}y~yz^e}}z iu|rqtj yw{qvy rz~ {|pn lx ols~}~}}~~s~thz} u|swuryv|v||| pu~~wzw{}|m|{|yrjx}r}ry}nvttxwzhv{u |w vz{r~x l|{s~ }y{yy} |u~x{|n ~}{z~}p} szwu vtvyz}yo z|r||y}~v{zx~~z}zu{ytwvww{s|ynu~ tx}jz~}}ywo{z~z|noy{~w~z}}~z~|x~~wx}z|{w}} |||y zwx{tx|~ {y~p}~|~{vr|z|znl{yzw~ tyyxvls}{rw}r~zm~y |uzrzxz~z}|zzv|{yo}z } }~|xzxt~x }ztmmr}{|~w}| |{zor~t zszlylx{q}~y {tpy~zz {{xi{|{~~{}y{|w~~y |zwwtr}~ uvw~v~y~|n|}lvyt{{t~wq|pv ~}}qy{ { yy~w}y{y|zz}|~{{z |v~vu}yrxzztm }|~v}x~zhwp{u}x |xvusvydzl{t}sr{ qz{{} }~~||ux} wyzy}py|ystw }~~{wy qr|y}wvzyd |~ {yu|{ zv| n~~}}qgxzul~ uy{{{lz{zuzus~|~wru|}{t }z{~~r{}ox}wv~yr}}y|{uswzrgp| osrr xxyu }y~{vi }|c|w|{y ~pwvyomtw sxo{p zw~p|{xhwr{js}yn|x{onkvv rvzu}x~[|f|r|tywt ngvytys|x|pxw{{}ss~z~q{p~{p| q|y viytz|um~x|xzu~s~kpypvvl~y{~t}||vy}{ o}ws|t x~~|vt ~ ~}xzqx|z}pw~ } ~~zu{ss v}ypzrq~x~~~~q{{r xwzw~~}}|yvysu}~k|w}}t{}~xp}|z yy|zt}gs}xrx|x zy~~y {s{~z~~|{x|}}|~~ }zxwy}y}fsx}zy{}{u }pyuw~x~|}x{~}yx{wqp pz}|{zj{|u{{{~{|vv w|z|{~zepl~rntu|wyby~w~|ez z|tfwqzsz|vwtzzzq|{ozw z|yiz~}wv~y|s z~|}zxhz||{rt q~sys|~~zwu~y~~}ypu|}~xzzyx~z|xu}{|}xwy}||z}x~u z~}~vx{x}}x |y|ezu~ t}tw}xy uupt|}w ~ ~y |v {}y~ {pz~ zww~|y{|}py v}p ~rtzu wzxqywm|z}zmw {}}|~{~yxxzyyrs{}x|}v~z|z|}usqquxw}~{u{l }pyzzl~yz}{x{|u}z}~vzzwovx{z ug{y|v|u ozz| }{q z}uxvz|ttus}v|i}tygwwz^zviv~u}{puzuswq ~h}tz{svzx| zs} u|v|k r s{ }w} r|p hhkw xuqx {t~{gqt ~xpnrh {rz~txv{p{qr wxvu}x}{z|t}s~wyu~}~zxy~y{|uzm~w|u~ } {t|}~|{ {yx~~wjz{y~wxxzzzt {pwxz}|{fwt~x{yrr|wpuwsp~er}ylo{{{ {~ | v~oxzu}{{zy|wz}z{y}{ ~~|}}pywwyt { y|}|wj}xsv{x{w q{xzrx{ rz|vw}}x{~ y}w ~ws{z~{}y}xwz}x~wz} u||qwz{|q~ v}}}zwt~~w|}{{{z{ zu} u{x}yv{r {oy}w{}{~{}|}yp| qvsv{ ~}}n~tw{}z}wyywr|}u{ r|~yt {~{ }|yu}~y~vz|wwpuz}w |x{w|{} xy|{z{uyq n~~||z}z}wxpw}y t oz {z ~|}zwy~ u|}hy|uyvpzuoxw}t q ~h{ x}u xvp~{{}zyz}} |w|vwx{v~}zsvy~} tu| vwypq|{~ }m{{~{{rn|}zg|yz||r}~|{v{{ xy}v{{zu~{tx}vy~}wtz}wo|~~|wnx ou z}qfvwqy gfux}~hwq|kzwmwiy}z~x}u|o s~vy~s xypqyo|v~tv |op~qwzvsyuvs{}z }qsysw |rzp}| prryww y{z~vs|~u}wprk~syzsywq}w{{u}qv }}~|zulx{z wzz|ztts~q~z||w}z}ltxs{xzn}}yt}gt}~fyqz ur{~p{|~q {~|y~}} |||~}~{{|tym|{| }wq~|{s|u|~ k~p~~{qz}~uzkwps|z |x~v{{{y{vxz|t}}~~zy{y|{{z{r~|ovpw~v}p{bwz}y|vz~n}~{ jtx{xq{xz|}zu ~sxyx tp||zn|xz{wyv|}vv|wr{q}nmqwryu{ywpryz}jxm~xvzv{w}sy~o}}pry |sww}t|{~}y {}{z}w}z}ywl|{ {y}m}|p}zw z}tqyyy{{u }vy{}|xx}|{~{{~}u~zv|{y{w{sy~z{z|wt}u s}}xxkwyzxrz{~t {~{znn|y}~|r{u~}|q }wyx|x~}sv{~oy| zu u r}}~epz|~vp|vw{{y||vvz}|lxsqq{z wq| y~zy~}{yz~}u|t{|}~~sx|sxpu nz~z{~~|yg {y wms{~|yuoxuzkqsux |~v{u~~ywwyoy}x~udo~rlr x{x{wu}xvjx||u}vzusy{yyqxy}} svs{~m{ ~|~wx}q|w|{yy{ |~zy}~ } {quw |i~{}|v|{yus{ ~u||}t~vy{{zzw~ysz}z}w~y}w~z{tmxzxu{{zypw }yt~||wsszz}~t}rx~yk ~~q~vwz~}mtow kz{t t{uyy}~}r~ ~|{~y~v{~pz~ z| |{{|y s|||jwxq}smwsuw}w|uuqm}{~ u}}syw|x~wx~{z|z r| |~h|~ ~|{{wv}} v }m{{|x{ tz~ey{yt{}v~|s}~z}u}x}z{~z z}x}zzyww{~zuv{~{}~~}y~yz}||z|z~|}~|||~tz~~{qwzu ~zz}}z~uy|x{ y~vt{w|} }t~z|~yz|x~~z}vruzy~zz~u}~|u}x ~{iu qw{nz n{s~wwwvr}|pww~~z{ }xwxxxzw{|~ zu} y{sw{qv{}wzzn~y} uz~z t|y{u~wr}xxvvxqxx~{x~zm}q |uw~r~qmwrzyj ~uz{kuzpx~nrottqopvtmz svxtx{qux{~siiu{wxt}{mz~jx~|w~|}~prwu szwmyrxymywvztnt}{tuys|vyxzsmt \ No newline at end of file diff --git a/build/src/gfile002.data b/build/src/gfile002.data new file mode 100644 index 0000000..17eeaef --- /dev/null +++ b/build/src/gfile002.data @@ -0,0 +1,94 @@ +nwx~{|q |w~~zy|t|~{{y| z~v~|ppxesyyywtvzmx{}z}{usvyx~qv{p l}pxpxxyv~z|}~ evx w}x| }szvrx{}|y{~z} x}v {~z x| x|vx~n|{wwvvq{sx~}t }y~|yu}~v~}qwx~rzo|uxsx wy~||yxy~||w~wys|t{r{z{iv zy||z yz~{|~z{ |v|}v~vrzvz||xy vtxzrxy|}wn}}~}u} o}}qyw}yzq~xyv ~myx}~zv~lvtitj}{u} u }zqxr}uvytz|v~ |~m{}|| }o{v|}uwsty} um~|w{xwuy}z~x}z|{j~dyyz|u{ux}~{ yx}{xwzv~}u}} }}}q o|{| {~ww}~mux~}iuww|fy~ jz~~vs|o}n{oz~q}|v{|{~x|~xu yy~{|wyzxz} |{w~{ }~m}p|z }~z{{{}|wrm~t~y ~v{{w}t~sy~xwzr}~~}z|||y{z~}u|~ yf~ z{vykvr g|{{~|swzm}||t{|xw|{z~{uvy}osqu~|~ h~uz{|z q{rwu|wqy}ys|uk v}q| x}x~y~}sx szyu}~|o|vsw~v } n~v}| ~~swwq{}{wwtoy~z |~luzx{{~tsv}z}r wz{ w}o|{y w}{t{w ~ ~| t}~ ~mx~{xm ztpzrnoyuw{ vjx~v|x}~xxq vwp ~~~y ~wwsw~}z ~yx| yw |dr|}w} u~ n|~|~~zw{q~}{{v~l z{{ |r}z|~xv t~}}} ~}~~wyx{|}yr}|f|{zp~{u~tx| s{n}izv~zkz}|} ~u yr~yvzy{}~w|||}}{ty}ks}~qkz} yxo{u{wvzy|jz ~wz~|yzy{ ~ttq~vww{{|v}{v|p|{p{sz|~|oozwz{ou t |m}{tuzr|}{tw ws v{u|rw~v{{nu{}}~uu~yly }}}y|}|zzos}xxqxz|z|txvn| in y{ug||ksxx}~|{y|yz{ {~z}{{~z}y}|}}wuv}zs{~yygy{vry~{~zy{}~}wx~~}|y}z is~m{s~ yfx{ s||zt xzy{zwv {}zt~{z|rzl} yuxx}vuvqp~{qo|{z||z wsw}o}s}vxpr{qx~v | }{|~~{~~{zy {z||~} {tzz}zwwqy}oc ~{{v {p}w{v~}sbwyzj~} {~o |u~|t{~{yzz}y}sx| ~uyxx ~}{y{}zyx}y}|{{o||q}r~x{~x|}|}~|{evs{wu}~xz}{ww}zp~p} }} ~~|}{yty} z|~i}vbts zkt~u {|{x|h vv{xj|wt{i}|wzuv~z}vxxv}zu{sxywt~~~ r||}s~wlzy{~m~}}ro~rt{qt~vw}{vs |~z kwwtyu v| vru}~}v w}qzp~ytw}w~~|x wrztw zz|u ju{xx{tz}zivy }|w y}oxs|{u~z} u{{|t}v||qupwvsgzs~fyv~}}o}rozt}k y}zxq~{vuqqrqv|{urx|rs|vzw rv~{rum~y~~~uv }yy{| zqx}~ }sxxqw q ylk x cw~m}} s ~|p{o{p}|wzv}{z~wvrxxx|zwz zymz~mz|| w~q|~}|qovu{zu|p s}|wzt yuv~u}ywzl{~{s }}~ {~ y~~x{}~y}~~s||}vt{nxznr|~~zxo }~yyxyf~vw~r|zzwvr{xx m~}|{{yxz|zw|z z}v ~x¡u{nuqxzxpvsvot xq~uy| vl z|z ywqqzy{~qywr|x~ysxx lzy ztcsznyo{}x{qq|~xotws|x{{~ugx}|k~xzuzm ~} gr|j{ {{zux}}~u|y|}{{syy~|z |m~}x{}}{{yznzuvz~y}~} |z{{~v{ny|{w~{ws~vtxw}{{~|yyyx~ | }~zrwxwzzs}}~~s }pvyvw|zrmg{| }w {|y{|xwwu~}z yx ~}z rzwqv|u t{|vww} y|z{|~|~x|}~| ~wzw{~}{y~hz t|y||q|xt|qw{~{ k|xg|}q{|v wwz~}}k|w~x }w| znu~}~ t{xstwo|vz~p|u}t}sydtw~yzut} p{yxsxq~ vu z}z}}vy~v}u}~~y}rs w{|{ vuyty~p}v ~~{w}xp st }yw}|y~|v~y}}~iy~ zo}y h|m ~s}{l|ug{{z}swxuezzxxupzvvzw~{xyt{{z} vxy}pxt } {~ttwwtsllwwzv|lyxznrr{qq}{q|~v|~yq|~|wr xtt}w}z~xnz} v}|x|ty~||usz{{giy}xxojqt|nuvyu pzyyw}|yuv|x}{xyns znr srrt{}qsyz| n}~y}}sz{{|r|~wotks sy~yvm~x{uwyt|vm~}qv }y zt rzu{|x{ypqzt~z~uuu}zz{yuw{t{q |swxu~kv}ztw|}nyt|}pz~|uwvvy }zy~}z {{xwvwyuxuut{{v{wyrur~y|zutt||}~wt||wknq rw}ynzy|wqx} {{wz|s~{ o yzxtx|{{|v}z| u|xts w v{u|y{qzs|v~y{ztx|rq{v{}q|q~{{|z }yy~wrrz }y y~|x|u ~|~t~v{p |z|~rw~~ |}utzqz{| }y{ x zp | zw qyvw{xutz i ~}xrx~~|x| {z{i|x}s}{z|}tvxw{u s~xv}tt}y}}y{}}z|y}~{~zy}xukw|~z}|xzmw|t{|||}q} s~z}l~uouruvxy~|}r }|t~w}rzow~s{u~|s{{vz~t tvyt|x |vyty }}m yst|swq~|||vu{uru{zv|| x}r~{y|~v~~}|{vuzx|{v~}yz r}z{ h~| v}|y ~{y`y{~~w}h|nxvxtx{m{{ xqz~wq{n {|w{}||v{ }wt}u} t||v|k{w}|ryv}u zvz}u guvy|{{qt}}}|n urzoyxzx~s|u | v}}|wz|z~yx| r~x||x p |{p{}x {wwypyts|x|u~ {ev i{~ {tv~vtpv sx~xss}zt~w~v s}xyzy{{}o{v}}~|}z~} ~wu{w||~svzz~{npo|{qs~ o~tooyvu~w}lvz{r{ s|~}|srv~x}wy|}x~px{{|||z{|u}y{wlv~vx{ooy~uslv yz{jo{v}w y||~~tsq| ~r~rhyxypx |{zyr||~ nrx{{w}}z|g{zy| }y| }{x{xg| z}}qjxyz|xq}zz }~yyn~~zizuw|z~vl}fz~}~ wyxzt|~v{o~~x|}~~~~}zy}uv{z{{sw|sxq {xw{vv{}~rww~|lg~p rwzswz{~} pyx|y~x}{q xwkuy}{z{}z}v| {sxw||tou~py|q{z|wv}~{}}w{uzy y uy{|pw|q}~z|tzuu|xy{ryuw{w~u|wz{{}y~{wz~}| }vq wz~x}||vvw}vtzytzv{}~w}|~} tuupq}s}r~~w }}o|wtzuszsvv|~~z|xi~{||t~zqwy}yhx{z}xz~y}v zv{{txmz}|~zy|~|}yzw| ~{{{ z~my~ |~wx wz}t{{|}t|yvyyxyom{s}zzxvt yv }}w|u~{~|x}y~{z}xv~ {wwypt}qy}} ~rt~y x}zrzw~}wzws w{w~zyz}~wwutxvo{}|}{~z|t{ {~ ~zkw|wzu}{ qpmuv zszy ~{ vruz| utv|~~xt}xssww}{~ {z }{w|l ~v}vzts }zk~}t~pu}tv|}yyt~s ~{u }~|}{~rxrs|u}vs yx{|zqu|zz{xu{wv{pjytq~yo yy{c| x}}tz|~~ ty~v |n{s~wz{rv}o | z}szuss~yzyk x~xr}}qp}{~}uwrq |qy~zzyrv}s{zjiqtr x|mlt}}|~uhqkz}ytjpwzz{vpvx{vqr~{t}}||{y|u|twz{u}xoq¡} yp{|v|zozs{hxs~q}~tyzV~ ~ l lzrwqx |ss|y l yz~zvyudt}s} yoxrzvw|~z}y{ruxvr pª}vvwtm}~n}vc}wsyXzssut wqvovvpyyqxvu}k{yztu{|||rr~~z}y|zt{zt~k|vkx}tyv}{txpixtxtsuw{}txxjt|} tyop{~f t {}zjwwvW|twzgxz}}|x}|t|} w|{^} ~kts zuwutuvhz|x l{ kp~ x~xy}vbtzxo e~xe}}yw| |}rv|}y~r~}z~ssy{ nx~~{lwstrxz }p}up{ wv}tf~ouo{~ui}~uu~ z o}r~~|v~t[u}yyy¡u}}so{v|{vz ymwx~~v{~v} qvzxzoypxz}f ~zxhysz{}~}{ms{qmc~{}qz~}~uvy ~ {}{~zrn|zv{~v|{trwdx~hrv~utiv { ¨{wwulr}~ ~| ~~ipwx~{k{{h f| u|rvzsv}}zmyvxwysz|{~f{z l}}y{ jns}|r~eyry|xy|q||{ytj |~|y~}xt x{|xw{tl pr {ssqt¨|~|~zzz}ou|z|vt}|pyz ~}{wzsr{||w{}w{r|u}rt~~z|{y~x{~u{wz||x}vvuoxtt ~tus{x~zz{~}}~ ~r|w|s~ytw~z~zwyyw } {{~{xy}xu~}{~u{ru~}}tm}wqq~rxs{|z~xz~vtv{o~uzzr |}s }yvy~w~~}~{{}ytt{~~|x {w}}r u~~vzv|z~rv{~xy y}~w|w~px}pr|w|ztn~ |uy x~{{y tx|~{{~u{{}{v | zy{~y|~}pxyy|}xsxxyz}|xxutszz {y~tzqrw y~t~v|}r{|~vtw|}wsy}yzx{v| {|y|z}w|szu}wx }wyxy }r~~w~~wxw~vz~jz{w}q{|} |~~x~tq {y~y yzw~~xz| t{|w|grn{|}z{~qu{{y |y¢| os{rg|w |r t|h|pwwxgz |uxw}w yq|wv}y}|y| v}zrz n}y f{|szrz|~|yv~q}quzsy{{j{{p~w{~su}|x x v{ wwz~||q~{z~ tny~w{z~|z~z}x~zmsx{{{ |z~ kuxv|nuv}zix{kyjw~}{~{}vx}wzz~ip~{w w|~|{~|{|~sy~u w{y{ |wzv|zu~z zzqf{u||~}jxzrzzm}~w xo{~yz|{ {xvy~~ w{}xwz|uw{{|y|~{x{|zx ~}~~{||xhytz}vz }yzzf} {y|x}~zx~p tmzr~k|{{s |~{t|ww{{x}}zz|s z } ty~{ |~~~}qw}~w{ ~txv{ |`{z r}|w|w}|}vnx{ |k~}{~z~w{~px{}u~r||}x| ~x|v s|~w}~{oyz{}}|~}psywx~ {lyzwktr{|zst}x}rvx}{| y{pzt}|yy{xsx}ty}x~z{x}zyt}}t}rwyu}f|}p|v}wz w{v~{uu}{ou~~ t~~ z{~xy||{{x~ }lz~t|~s}x}zoz} {~iyzzyvuxz~zn {y{qy{y}|u| ~~z~ w{ ~~xy{ }vwxyy}~}~}vqy{ |}v| xg y|w|v~ {~}uy}|v~}zmz~~||y|ot{yzymr}|zvq}s|ku|yx~~w{h~ot}z{} yu~~y{t|~ux{~xu~}uqylz{vw|}jm}yy}|m~x|~|z~||{y|s {sy| zu}~wzszy} |qt}{z}wxx}w~{}gv~x|{}w~y||s}~z|wy|}{uqxqzdyj|ts{ uw w~to|yy~z~w}rzs{}|xk{gvsxwo||{}xm}}wyt~ u xw~|yx}~w~r|n{wq|~ wxx}x rzz} {z|u|zx|y|tz {~|o{u{x}| {yg w~~}p~ s|{w ttz||yr}}tr}l|xyxz|s~~yolupzkyts{ ~^z{}}|~xs~yry v{{{u|}~ vvx~uvwyzpm~vx} rzks~|zt| yxq~q|w{|lzt~{~q su{}z}z v~sxs |tqz|~|vvu|s|}{{~ x}}}d|~tuq~~xo{w~ }xd|~rfu{ztv}|vx~ylx}y~z~pv|{tyu}y|xx ~z} {u y{}}}{py{}}}x~}ry |rp ~{gskxz~x{zy{nt|v~z~}wrzwo tqs{ z{~~|{z ~|yu{||ro{tyw~}z{w |vx}qv{ xwz v}~joqt}wr~ {|jt~z{~zt~y}~}tu{ vwxxyt}}||~v|o|{v ~x|uq{z|t}}zx|~~zswkoy{|z{vr~z|||z{ za} wyqqy}~zv}~vs|}|yz~s|yzzy x}wvwv|zvvu|}e~~ ~{ks | }n{|||zxsyt}}{{~y {swy qxstz }jvus}utw||{z~{~|vy{{}x{}}u}{~x~|{ {}}}o}u{ uux}p ~xxu~~zz|v} t|z{~ |os~y~w {y~{{~wyv{uxxt}x|ykx~z}}}wwx s}wv|{}{qqw{|tuu}y~s}w{ {|w{~s|{t|sy|tyu }wy}v~} q}~~z{nx{~t~{ tsytsz{xwtqu}~~e|f~ wz| zw|o{r|ux~x {vx t y o{x|zr|~~y~}stqnk}|~z zyz}x}x|yryx{xw{yw{|xzl|y ~s xy}x tw~z{|{}z{wzyvt~y}x|s zwyytw{{|{o|p~oxvf}}~{xxq}xw{vzyrqy|}||rv~pw}~pwz~}|||{z}o~qw~ {}|vzxs{}}}wxqz~ tq}i vmz}x|}{s{zz} x{x~pu}y{s| t{ry t}pxjqwxyk}swq|zryz~sx|u r{yzzs{ngt} qpyx|p}uwsx}yu}xz{~{ ~}pt} ~zqn| {yd~xv}z~zs}y}|~x}zyvyvw~xyn|y|z}z~~{osvy{u~w{~|~wyy~mf}~|ry|z zzwtwx~xwvs t~}yt|{r}}uvvp{{zs|x}{|~ztv~u|l}|}zwpw~{s x|uywu{xy {{~~y{}|||s} v{{{{y {mzzlq{ v|}wy~w}x|z~~~ sxt zy{ vsy{uxuv}~x}x jz~os{q~~~~t}}|}}pp v vzsszzzvo~}|~t~~ |u~~z{~qv~ z~ zvy|p|~tg~z}zyxlswxyz}} ~n|x~k |px{vt|tx y}z| ~~vptt}zyz }~}r{{nzxx~u}{z{{orwvx~{u~|zqu|~xvuuu{x}{ y~~vsz}u~xw~xztf mutzw|tt~|yv|x}}~}u}}}w}s|~i{| |p w}{ljo~ unyyu zx}|y|}o z}s{}v}x~wz nv h{thuz}}~|~{}uwzzu~|y{ {|}tzd~vy}srxxzjxq|q~ym|}y|vx}}xqo{qw x~|x{vj~zv ~cuu| u~zzyuw~}|y}}}sqs{{xyu~~qz| {~vy|xr}}y}}|{{mw} w}qyyk|vu{~|~ srvw w{w}}r zxrww|}w}zw~wkt}st}{~vrk~ztut}wwys rv{}v{i~~{g}r~~~nuxz~w{}u u|su|~|y|z||{zyu}z| yz~x|yxh{ zyzz^~|uzx}ez~{h ~|xxquovxyly~wi|{{x{yzwts||zxy~z}}~z}|{}x n~~vzry {zzyu {|~zuuxz|}}y~uyxz~p}{||~}nru}|~w~v~}vrx~}}{~p|~y~ y~x~yz~wzyt|{spx~s{k}~{hr}{rz~}}ysy~owl|~tq|~y|sv|x||}y|v~x z~~v{zx {v|wvvy|~|t{{t}v} zv tz|{y {rupyyos{t}j s}x{ u}{k~tw }|ovtyvw|spy}{t{||}~w~ s z{|y|}v}}rzn||w} ~|~|| yv~{}u~tttzl{||u}|{ ~q~x}vst|ez{wyz{ { qz{{{{}zyq{p~|}o~zwym} s|vym~x{}xn{} w{~~r{~z~~{wz~|m{y ~}|}yw zy}{}v}{{}u|y{v{tvyp|}|mu}pwytpz{w~x|ow zapiwv{y {~usxyyxyx{}{r {zzxnx|{}|j||~vvvuvy}}|}}~tx z}{{i{~xzz|uznvuu~~rtw|tt|w ~|py }wwww}}~zr||uss{o xx}xx|l|vw|j~weyrty}wqyqy||{yuw{z |xutx}}{}zt |}|~|q ul |zxux~u|r~~z{zwnz}zy}s~}vwu~suzw w~zxr{zz|{z z|xvo r|oxz|s~z~ut|pv{} {zy{~p||tvu}yzr~~vz}~~y~xvxz}xl}~|nzu}}~n|qo }~lv{qryu{~v }kwsvt o~| }v~sw}yxs |}~qotwyuxsv}suuwzsqzy uywrzxlxzx~|yyj yprwnzz~|zu}}~ vtyx}{werp}vw{s~wv{yrow}xs{{~}x|nxxw|uyx~{uxhu}x{~wzuzywtwuu~ty}~ zt u|{{||~uw~~x}oyu~|zzsxzuux{z{u}jm~yuy~~sz}{~d{~|wziwx} ~twz~xz|x}|pu ~y{ux{}o {xyst{~ttqwyuux~qr{|y|wwxyv~|}|~~~vt~ynyqy }|~wt~oz}u}{sj}v|wmw}v{z}|mp} ~wy v}vuwxyusyyyyzyzp~z}r~x} vvu|wqpt~yw~{d z~~z}n|~{o||y~|zv{{~r| ~t|s~uw~|{} ~|~|~oxyz}uu||~z|~{y{{ z{z{{zw|w~{}qv}|u{} y}pz| z }}xy{y~y{~}jky~|{xou}{|pn{~v{ ~k~{{}p|k|~ow~zx~wz v~|p}z||~}ty x|q|wuvy|{xt{|q}z }|{u~q~{tx|}ozut~z }}}y~sz||tvuswtzuqw~nw~s}~rnv |ur|uw}y yx~}yxqyz~v|z xryr|{px~t~}z~tyws|w}}|ww}|y{}|w|~no pq}l~z x|o |v}vly} u~y |wz}z~uz rz}sw|vqs}~ vxs}xqyzpxuzy{yyxw~~syuxprz{}py}xw mq}uvs u zoww ~~ysj{|xzmqx~}z~}lti|xnoy|{ux~ ~lhyvusqbh|yxvvmzl}}vhv{~|wx x{|fzvunt{ypostov|iotsdzyh|{tl|zwy sqxyxu~|mb~|u~ }}vkxz~q|}r{||xy}ur}q{y|vuzwxp~}qz~ r}wqvq}k|j| z|wv~_|~w{y yvx}w~xfy~tr|~oxt~{zw¡g~v|y{zi}xxzow{l|uqozufvwxy qmwxs{yuw }\zx~x{z}soxz~zxtqvyzr wvwqsztwr~moz{x||c{~}xrp|r~~mytz~~zq~zw¡xy }fzzzy¢t|w}sw |xw{~y{ }yzyzy{|w{q{yr{zzrtv|rt{xr}|rv [|c|vy~q~lsk}}sttv||zj~zzzxvu{~~xwxz~vq~twt}swmmxrkpt } z|}jy|s|q}ypqu~sztvl} pr}pY}x uvtz{}{txbvy|}{~ }}sntz |vu } ~||pvv~z |sy}~zwxorrhm|}{} rzj~}ny~}huty}yuubm{z}z{z {{|~}} uyyz~t}vx}}rmyva}~zm{p~tv} }jxl~{{yx|v|wzzrros}~||}~zt ~} | lwsw uuyyp{y~|~~|~x{~}y} ~}vxo~|{}|z~}~}{}x z~{{s}|u }w~{z}y|sx~{vs}|yx{~ } v{ |}vzx{{y|| zzurts }zvprw y~}u~|w|wv ~ys u{u|{{|zt|w~y~vz ~|y}v }|y wux{}~~~ v~{~uwx}{xxx~} ytp w||oqxwx}x}yu{{|zu{~{trzw~|y~ {|zsiyzy{}y~xvyvz}x ~wz~q pzvknx } }z{ t|~{{lys}{w~zz yxzz xxu|~{{w q~r|w utx~w{szxyxyw yzv{r{}nz vmw||~l~~~yy{wt~y|~zymxzwzsx|{~x| x yz}~{~tl y|~~wvw}uy qzxy~s||~|t}{wz~x~p}|x y|zrh|{~sux~~}yz~ssx {~} }xv{wyqu| }{|~|u}ywv~y}]zz|{qy}|s}}~yzzs|r{~y| ~xx}}{xy~yv~{~xxtz{}u{| sz~~ynxo{y zpx~zm|p rw}hz|}yptj{~|quww~t{~z~~v|~ww{|~}|t{y|{ zt{t{ u}}~{|x}v|y~|f}{px|y}w}upyw|mx~}x~~|}q{{~y{ux}|}x{u}~ztk vxr~~~vz{tx|{{zttyu| l v}mz u}wy|} ~}v~~zz yxzru u{o z~ i~ x}t~x|}~vy~wy{yy|{q|| }w}~r tn{~n ~uy||t}s x{|zn{}xuu{ x xuy|uwx~} zt{u|u}u r}vw }l|~yvxz ~c~wvx|vv|uqu{}|ywl||}~izmw}u}~| y}~w ~| }zz |{x{w~|xzzx{u~{u snw{||~}woyu|ir{z wqm¡~|| {|i|}|z~z|wz~uy~}w|{yz zxx{~|zzzy}{zw{qrt}}wmyqo|e{~wxyrwyxwwyuo}|x|xtwxv~}tq y}z~{~zsntu|{t xpt|q{n}}nx~qm~zu}{x|q|| x ~tv{|tx|{s v||w{|}zy~z{x~|wz| y ||vvu{z{rt |yx|uyz}o}~ ztujx{}z{}{ wwozur~s~m{~|t{zwt{ |z|~su}}~ru~z {u }yshsuzyu|lv}v~yuz~yq|vzy} |rxxztix~}|s exrl{vyx| wx||}}zui~zz~yrtxzsvuq|zw q}xz}qku x|w x~ x~~ uz|{{~}}{ywd x{hw{d{|~ t}|tuxqz{zvlvx~w||~z zyyp ~~{urr|t~yp}yy|j{|}~z}}ryw~|qzvq|sn|rv{|w}qyixw{{y yzt}zx~{{~t y ~~zvyr~r{|u} zzo~}sys}l}}||~vs{ x}jn|zx}xzwok~{ uv~u{kvw~z|su~ vytw|~yuy xs~lyly v}zeuuxstx}||}v~~qw~zsylskz}{tn} wm}w~~ysv~}}tuyq| p}y~sp} x|~{}|}yus}{ yzwzxv}n }~}z~z| v{|ps~|v~|p~~txw|u{|zp {|~}wy~zrr}|w~ v~r|zwu~}y|~ ruxuz{s nq}zyx uqgw|}wz|n{zty|u|{ywvxtz|oy{t~wzy hv~{xuz{ wxy~x|zz|x}}}zz}r{v|u{xx} ry~uz }}kuxs||xiuzs|}|{|~t~{ws{xtzyz{z~{trp {zyzw{~}}}|zuww{{ wx} ~te|zz~yzx~xxnyr{~}}}z}x}x yy |rz|~y}{i~vqtmxyrzs |~}uz{yzwx sp~|p}{myo~ q{tw|}wyrp w}y ztvxp}yztys rz~}zxx uqwz}xyp{~|yjvvry||~||{zcrxtpypq|uz~|w x}yxnzsv w~w|z|{{~|~rft|}zxvq |rz~~{wjzqzqc u ztd{{u}p{zty~x{wwnuz}ro|~x|r}|~zw~y{w||{{w{s| zyyx|jzz~~u|}wzkxspp}t|qwt|}g{y{yyvv}rx~vu{vr{}uvzs}{oxt|zum}~}tv~~yx zv{|px qx~ y{w{zz ~~}{xwyyu w~yvyzyzt{|qyzy t}{}rzzx }tt|yz}z~~wn|t~{u~}{~{vz~{} |}t~~y|~uyl~zy|txiro~zpnu{z}zqxx|yzz xzv{~k~ zyyvxw}|wo}svu~yk|z}x}{~y{z~|}w {e~~~fq{|y}mz|{ttzyww~|~||~x { wwzzzn{ y~wzptxmxsynl~y{~xwsz{}|nrm{xt|~u}wq{xyo}t{wrnrx{| {zr~yzv wu~ }zsmw{{ |yor}{r{x{xu| |u}pr~rshvw }suvtxf rz|{v}v{~zuvwunz|w~u y}{vvsxwv vq}zx~tmwvvxu~wu{~|w~ }wwq}}p~x|}x}nr}|txyyvpzuvz}wzwttztv||u}}wu{ y{zyt {ww|z|{u }|xpq~ u}||xyyu uy}~v xx}qu t}}yw~~vzqw~~tus{xx{d ||yrvu~}~~}svth~z}}tq}{yw{ ~{{~|z|z |~|tk}~wwwt~ z{~|u~ wux|vm mws vm{wv|yyws~~ z~{|x~lz~y|{st}j{vo{}~m uvzv {} xk~opmtws }s~~~zvyy|srx}svqwzp{ w}vt{{}i~~{z~rzzvjx~~ ~{}v||ry v u}w}z~w|}us~{{h{w}w~ts}x}u|}j~}w ~}wz|sq{|~z~x~yut|{svv~vwu{z~}xtz}{~s{~qz}o}s{uv{m}}{wi{|}zts }zow~tw|}zyw|zz||y}|~x z~}yy {x| stm~ wu}y{tn}~|||txq~~yw~rluxutyz~||yt}u~zzu{ztv}~x}|x~~uws}wwywxh~{ y~v}svq{nnu | {~~un}~ yxu}vzn~wsvvx}tqt }{tzmxw |z|ux} txw ts |yw|f}}}{l} ~noxy {}pxvuy|hzq{i|zw}}yywn~~{l{ {lsz|yp{w}~yztt}y}x|{vo~y{|z|xsx n~z}x}} u~|t|{zm~} px| wwr~{sn~y}{vzpwxz }{ ~sx~ytqvsx}~zsyzu{vvx}pysu{w{ {|j~{x{~~}uir|z|w |{n y}p~z u}{ q|}{~z{|ztzt { zyro{vywx{rz pxuxtrsq{xoy {zt} {x~or|~vzvt|zotvwxow}~z|vuxyp}m } ~x|w vxwvoxv~umrwz ywny{ruulyyouvot~{s~x~{x|}st|y| zyuyyrz||t}|tn{uu{vy{zs} ||w|w|y}vzutyv wqwvyzwz|}zpu~t|u p}w{{x w}o|e st|w{}uqx~}v~xx|v}w}|y{vyy} p~ t||||~}|}pz}}{{mlu q~ n}| ww|wv qov|}|r|}yxx}}{~ ~y {z|qx|t~w}z{rx{ zym}x{im}|q vuzt|zw~}~ yvytxuts |~nxrv~wztx~~~{~|{xttxy}zzutv|{~wtw{lny}}{}mrzu|}|}~~zu| yrxtvv{v|ws}t|wy~vyoz|{{~}pz ~ts~~} |sy{u~{~~| wwu} |sy~ ty}~sy~yvrz|z{|{w{to {~~}o{}xzxsz|vwu|{ utz}z nyn{~z{~wsnywq|| ~gzy}zzvtt~}tn~~|t~{vwvzu~~}yj {|~ yw}~v tz||{}xy~{q~}| |x yunyxuw{t}|zq|yzw|uzqru}lxh}zzswzpvvjoyzzwxo{w{ykv{||y}yuyt~zyv|wr~rzy|trz x}yrx pwy}k|ty}m {x ~z {n|otxvuzz} mz tv}ry}} {{r|}{vrw}vyt isx{v}xx }q}t~ }}}qrw{~vwxzmzewy sk zwznz v{zzw}|u}~r} vmz vnptwy }kq{|zzv}uzyywv|yvwxz ~zus}{||wo{xrz~pw~~~~|{}y~||~vx| |owt|w}xlt{ux|lvw|rxx~|t}{}jv{wwq|~p|zz~|wsq}~~}zk}u rwu{r{yx|{~ymxu~uugu~}w}zvpt|zw~ ~vvv~|~~pzy~z|{} { x ~ }q{w~}nvqt ~z xxsw{ {~w~vwmt~{}ztyz{{{ x| } |x}tv|{tzux|zy|zl{t~} ux wo } szs }o t}v~|}w{xxty}~wsyvz~{yt|}{~|~}xzy xizx|t y}|{p|w}|}zqul uwsz u~}wzyry} {~~|yul}|rj|v|}h~u|ykz }z{}xzsq ls{z|uxzvz}}lyvrxyyuz{|||~~sx||xt{{wz~ vxZs yts{oz}x|~ k yjy~ x{{mz ~wxyx{w|ty y~}z}wv|zvszxnz}~~v}{x qxyuy~mxzy{~wxsp uy|qqjqzy}zyn}||tmtvz|~vhy~~pm|sw{}~r|{ owz~{~ul}yy p{~{}zw{~d{ ||qwi~z{gpi{dznlzf |w{zdx{v~sm|o{prs}y x~w~ zvsvymk xzevyv|swwpjpv u {ww ~qt{zxxswv{ vs}|zwyf~}ywxn }te{p}ot||zivqo bux{g~y}u uti{~qvt~}oz}mw| ~~uvky ztwrq{|tp}|wz gcrvyywh sn ~|t{xqy~}wm{ xz~wtyxzq~{|vnp|pozzzzqcz|xs}r~}nmsvqkdx|zsczty}e{pryk u~||wou|xjuz|oyz~l wzs}~ x l~|vrt||~|tan~m{tm{xy ztqu{{b~xl}nj}qts|stt~~sq zq} xrxx{zwyvwqxzk }s{~o{ ovozqhyuuj}v~ymnw~x{qss|rylsx zub}~}gxw }{{veapss|si~`{{luydst||uuxaxzwect~u z}~o~~w{u{~}ydu {z~l|{xqx¢ }zszxx|{zyw qyzfmu{ssx{\z~p ocsv}gywry|{n|x~| |z{r|zx~~{z}{|w{^u{~wtg|wuvftw¢}ho{wfykzvwwyvmxzq~{t ztwyx{}}y| ztt|u{{yr ~|yuyz| }~{y{{vy~k| }s{ zw}{zjx{wx~~xqv{yz~uy{|{u} yxx|xwoz |u vqwy|{}~{{~}|touywy}z}x~v{s~z}x|m~vx}} wu{ywx}x~zzn |~n~|{vx }}}|}~}vs| y}uvzztqvzw~wwut{{ {~z|vn} xzxlxzyy}x r z~~{w}znpq~}r{w|~}x{r~w|y{~}|t{v |y}~w|}w|}~|xp||z{z}xszwwxn|{o rpvxiv|}{z}wvp|ww~syz|~z{v{}}}{wy{~ }urr~}z{{} | ||x|vvvr |z| ~|zyq{zznv}uty}wywx{q}| ~}~|v}y}u } p|}vvrs~jrz}~x{tk y~zzz~{ kxnhru|su| rvsz}}||{~ {zzxt}~{~vn{}~w{rt|q|tnpr}q}{uy{wxtvy|lz~pmy}}~y}lq}rvxxywfs~|}| yq{{xw {zyy}rvysy rpx|~x ~u|}ry z uzxzosu~ q{y |vo|~pnxl~{pxe~wzy}m | o~~w ~xtz{xx|zw~~} xux~xvyzyzu}{oyxz~zm~yzpt| w|t z{{}s}~~h }uuu{{~i}|z~uw|r~t|x v|{~~}x z~r|v}}{tu~w}}ve{y { z|| r{v~w~upt| vw~{x~ u~}w{|vx} wxv|~zr|r|{|~s~ vvx}||p}~x~zz}qv}lyzv~u|y|{x}y~~tyvxz~| }}yy{k}}||{vzx}yyyt~~y~{~~yw }u~v~| x}u~x|~} ty{}tx~ w~{zmp| |}mzx~ |~p }y|zx|}{ }z~xnt|y|}p|v{~zt~ps~ z s r{r{yz{}gxzz|yw{}z}t{pzq~yuvw~~xu} y~ |}y x~}n{|y~~| |x{wwzvv{{u{yuk }o|v|wu| yy}~}v|ywv{ y{yyv}urwzr|wzuzy¡xx{{z}x{}~{ }| t{ms~|{yp} ~{}}|{{{|}o}~~z t~}z}zvuv| w{| jy{y|}tq~x}|~}r {w}~yvtsyzx}}|o~x }~{lvp~~sxx tzzux}}z ~kqu ~{q}w~zwtwwzwr|z||tuz~w~~|yx|z}v~l}}r {sz|w~}r}}j w~{rvu{oyx~}|wuxvu}}pq~|p|ux|}ht}{tv|vz q~ x}}ryx zyr~u~tx|ts{~g ~ztx}wp|vs yt||yxk|{y {|vzw{wdr|p ~}wxvmyqrvqr~ z~~z{{vmz v|w}}~m~z{~w|ytyw~rvrz{sqpvu|}{~ y|x{{z~}}y}|p|mv{zyryzt~vu~yk|~|xy {xrtu{w|vfy}||x}~x|vz|z}y|qy}{{ovpfm|{{w~w|w{z~}{{|{}o| ~uwtwux~wtvux q|zx }|ny x}usvzhyt}}vxx{uw| {{{yyr~{sy|z|}~hqw{{q{v}t}z`{~zvz{u~p{ ~ }pov~k~~~}pz}si| }}z xvy{w{{vw{w{x}zv~~y{usvyu~x}v{ u{stt ~ysrxx~vtrwr{{f}yv |iu}~{ssl~x|q}x|sxw|n}|v~|{~{{{y~yvx~}v yw}~ z{|}|s u|po~}xz^s{x~uv}z}|}vtv {{niz{x}ry||{ p} ~~~~z|yy}~||y}s~}}sw{wzz{~{vuxsx|rxuy|~kmy}~{x }v {}wz~x|}t}z~~~|~}~ u{~||zrzk}y}}lx y}ztw}vv{ w wzrviywzy~ltrry{x}~{m{u ~} u} tsx|{jpyw|z}}zuvw{v{}y||uup}{x{r{v}z }yyv{~r}|zlzz}xzw~z~{p}zu|sw{xw }w|sp}rz~xyj|uz~z|ssr{{{~ |yyzwuo}v~yx}{}x}o}xs~~ u|uz}w p{zyis {o yzxvxp~v~}z||{z uwt||}~x~|~z~u{ ~x{wy~|xmzk~kzu}{z~{yt{}~{ty y|nl~nzyz}z}{}}sv}}m} x|wwwrwvwzwy}s|dxvoz}yztxu s|zryr}xs~{z}znhzy|xsr{|tg }sy}|qsqvs{{}rx~trz}y~ t}~~zz~q{~zzw{zuwxz|u}nwd {wvm|ywuvvpz~t{{{xuut~||ty{k}~w|{ y{z~l }upv {~s~{ ~oz{}|}z{go~ ywyvup}}{w}}|}{l|syu | ~sn~n{wz|r vz~~kztjz~xxqr|~p|~vqstv{zv}}{}{z {o{z| ~y{{}rzt~v{{ ~{yyyy{z|~~s~ ~lyu~rzkw|z| }sozp|w~utxw} |{poxvmwq{e}}| jq|l~~w~}~yxvx{}yz~|zux{yorwky}w{ni~wtnv{wt{v~wz|x|p~{v }ustj |~vvppox~~o|mvyzv{} z{{zu|{zsqt}~}|nx~~~||}~{~w~yu{ m zzu~{{|j}}yy~}| {} w~}v}}zw}z {wud|z{t| wr{|| d|{txkv yrqtxzy~u{o{|~w~o|nq~v{}}s{{vs }pu{uw yz~zy|v|sty}~}qp|rv~~ztw~|uj~t{xy|zyw|z|s yyuyrxy}un{u{wyv~puor}sirnq}y} }{}yyo wkp~yy~tt~~{qxzw}r~{v~wxgzwnuy wvo ~j y|yyowym}o{|{x}|j}}} zy~{{}t|yvr~{}sz{t{}rqvsyrz|xl}y~~}|uzxym {|~~~ ~z~{|r}~w~ptv{ | u||z~nu~~ }r| y} {qv}iqqv|v| ~v}v {~w yu|{~{} }yk~|~w~w~z~~xz}|z{~st{yqysv|ytu||hy ~}~pvmq{jpzxlnvvvzr} pq }{tvx ~ttz~}u}|||~{wr|}x{~v{wtz}w{x|~ss}z|x ~xtx|tq~yu|p{{ s~stuvyuq{jy{tu~}vv{}{x~~{~{~~~{ }{w {|~suu~| {~vx~}u}ww ztouvzy ~}}r|mu ~yqx| szvx{pmsywwv}t}}~x{}}~uu~p wyu{s|}~~ o}{vzl~}~~q{||v|szz|wdvx}{qyuvpvxusv}uzt t{p}yp}}~|y} }|xs~}}z}z}wys|y{~uzzw osywz{o} |zzt~vtlyww~q xw~{wh|}|~sm}u|{~xlwx~~s~ zzz|wsnxxsn{o{ |}~|~}v~}tz} |q~|pz~z{n~yl|u{ xw{~r{xbv uyzp~~u kwyx~}wr~ yzpyvx}z yzm}}~z}|rl{x} sw wz|z~slwz|{zax{}xymz rwl|n{{~~xqvy}qyp{sxtt tuop|~r~o~w{|yxf~zyp{s~z {~u{{|h|{oy}r{}vy|}q xs{ut~~~~} wzlq{|{|u}v}zu yyptp|v~uzmxwl}ts|z}y vsoz~ uzz sur~uwxxyvqzb|~vou{{|w} zz z}{v~}vus~oxw|oouyyv}x }r}v||rlyv zr|u{t ptt}r }{x{uxc}|s}{uqvw|b{~x||{ y||tv||{z|}~~yuv~{z}zqz~vto~}zp~z|zy~ wu|twzz~ {~zxx}~x}zz}}x~shzzy ~ }{xy}w}~t~z v~{~z}{~k om~yxuwz ut~ {{|y }{yw~x{z|q uu|s~{zy~|{x}}|{|v ~}zr }~vw{~szutzy|v~~s|}|uvwr}u ~q{ z{v~y{wvuz{{nz|x{{w|}ytv yv}~x|~t~}q{xywv y}{{y {vwywzzyv~}{ ~{xy|{u|yz} yzqy~}wv}{r~y~|~|{}{~zt| zy{}{~ ryv{x~ {|z } w} ~z}ytv|~t{|zzt yz~rt|}~yw}q ~~zu~ruwp~{~ w x|}{{v}~{wz|zpv{ {yx{~~|x{{|xw~rys}}wzx{x~vyvyyzx~ y} zt u} l|t|~}|{pryw{nzy}|xi}w{uw w}|tw{{uz}tt{x}|wq{{{ yywx|~vt{}z{v~|{zvr}{ { }nsx| {~ws{uvt|}ty|xs } ~zymzs}tyrww}uwzs| z| tz}~vv y zvz|my {ot} x~|xrv{t vmx|tvy~{ |~r{vy}q zry~yzzvxx |tv{}|{zx~{w{|y w||y}}s|{y r} |~~u~| }| ~xyy}u{t|wy|xw |lr|zz zzzwvy~vt~vy}zz~{{zx~{ox~}z~x~w} x~u{jw {~ {~~~ x|}}} x}}v| }{}x~x}xx}}{ ~x ~ ~zv xxyw{r}z{y|u}}p}~u{|| }~u|~}||vw~~xt|}|y~~wrvwx{zvz|~z|{|zz {ux|o}}w}}{}z}~{|}t {vxr{vz~~yw~vt{~yvzu}ox|vwzyy~|{y}|}v~zs{yuz un~zzxz~v uxymmth{zw{~| ux|unor~|mwqr|wuu{p{vwyyr¢~yzov~wwsz~up~r|yo~{~r¥{}xwyzyqixz~ x{vqa }rve~yyz yz|rs{gs |{|sy}vxzvyvwvrzz~tpxy{n~| q |uk wiqyvov w{yzx|stw{yz~t~ |{ylu wZ}zqx|jtz ws} tqtx||{q}xpz~sxzv|zo}twpoxt}gze{hu|vi wxm|xyd{y{}{|uy~xuix }k}o}ty~sywyu}y{sxv}wx|~~{s x` ~~m zzyovyvh{zr}{ |j}vync}pu go|stwzxto~rq|~wohwr}y}xurx{uxlyxyzx{{qxvty|}txyuv{vz|uxl|tpy ~} i~yt}m{}x~hy~{~r}w~k~}o{ {unzuyvzvvyuo~|px {|x}|sdy{hrjq~sv}wgk~zbws~|zxvuyz~zx{{} t|xl xt|~z~do rlyw xn~oqvsz |up}|u{yy jj}{_xyzr|t}p{]x~}}u~jupw}wsryvqs}wpno|~~x k }wy~g~||{u}} ~}}{vpzr~zn|t~~}bu}y~}~}|{z uzz }}_vyzxj{yit~yy |zz|zvhzsl{}u{ m |r~} sh{{}s}ty{|vy x{}~~kxxrzsufvkztzzz}§vpr|o}^xw{t|w}}tzz{olxx{qn|~~{qp~x~}xy{p~ }}{z {x~u|~w~xy|x|zwx} y{~wvwp~~k|} w}ztx ptj{{prxw y {{w| zz|ssx}zx|vwz|~~z~x||{~y{t~v~~ zy wsx z u}y{y|x{tyuwe}yjxzx~~x|w~wx|y{vzu~|}yvwz~{v~{x~ | y~v~vxx tv|s|vz{}v~u|px~~{tok~wrw q||y~}x|t{~x {up}y~|z}u}wy|ux}yyz z{qys~~yz ~q|~wu|u|x~yy| uth}}zmnyse}~{~zx{u{vrz~wv~qz}~{|t~v||{{sz~v~}|| t}{v }{{|}msxyzutzzusny{wxxw|uruqx~vsv~s}rx}xt}xr~w~w~z}w~zpxb~x}o xx{zll~}|y ~}}{iuezvwu{}}zy {}{ ~ zz~sz~{~zu|s}ws}zx|zww~{uv|z~~yxv{ xv}t} ~ryy}kyry~tvn{}q|m}u| |x| z|}|vz |{q{zx|x}}x {~v~t}}z mz x~ps|n|ws{yoyyzt|qan|~xvt v}h|zy|to{|xwy~~ tu{{ zq{xwt s|w~r{}zv~~|uuqyy{{vx|yznvstzty~yf}z|{{uurzwv{~~xzqt~yv ~z{|}zqyzx{rz|zzw{xzyxzz|}z|~~|{szsu}}tpv~ |}~w|~zoypuis u~vooyv~|x{~x~~w h~ } z|v|v~}{|z|yrsw}} }xz}z|tzj{ |{mlx} }wo|{{{muy{~}zfyz}}t~t|z~xyq|xv}}xto|x zy|swvyu|pot|{yt ~~v|s~~{}}u}~ v }x}xvy|~yrtypz|lxyp{|wz ||y~q}yqruvy{mx~z{v~ {}}yz|{tw r}rxww|n|s~xtrvwy}h| xqzrqy vyuyvk|p |~w~wy~zuvuy}y|~z||r ~xzn{~y un~ ttz{wz{twvuwxpt ~ ~}v}mx|r}vx~xy~yywvnvwz}}~z{|wy ut~ x~}w}vf}|xy } y|~lw| qm{q|s|~tx t~w~~ } }}{~y{|z~}~vzpw}}z}x~ l~yy{x{wt vkvy~{i||~wjwwp|rv}sr|z| }{tr~ {trwy}uwyx t}|vyyrtsnqm|{xr | yr}u}vr~w}}zvw|u~~o{{u|{~q yy|~{}w|{|uzpsjrpuu |vy~s r}}wruy}qo|ytg}~|{ t~ruyu~r{|u{z~vywqw { }}zv t~l~qlz~x~||x{}w~xu|yt{}w~}rxwsss~woy|xp}pz|s}t~}z{y}~{ n }||zw|q|uvn}y|wv }}{w~{~}y}t~tqpqy}{|y~{~lptq~y{~nx~zytswzu}y}{}tr}xzw z~s~{wszzl w}{u}yyxyy~w~{~vuw~x yv| |y uxy|}zw{|u~vxzx~~~x ~x~|~~{~} |x~xxy{zu~y{xyty}y~zu{~{~||u|zws}vvuv|zst}zjuu~ rz}{}|~x{ ~xyxx}z}sw~zz|wxuw| iu{|{ty}~yj|{ zsy~iy} xr}{~ zmw~px~{|vqx}|n~ ~y} y|{zvx{y{{r~wwxus x|}x{~swp|nw}~}i~}~q~{|~ }}ww~yyty~l|~}mzz~|~v~u|r u{ry~l z~~~}}~ {v {uo}{| uy}~ z|} ~yt|oxrz{ {tny} zsw||kx{toz~rzwz}twvzy{|~~z}v}|y~uzzvw|}nz||~|}ryw~{ {{~~t|qms~e{~z{ypu|zy} zi |uy{x x|xzz}z~{}x{~zt}t}pzw} miqzs~{e~}tvzu||{ py||p{sq|s|vw}w}| v}| wy w u}puy{vdy| ytyy|tuoy}yrwm||}{ |w}||{ww}u{~u vv|{x|}z||rx|{|wrswtz{y~y~w{wuoxw|s zzxw{p}} ~|tn|lpx~~ny|y}n~ ~{x~uy|~{~ zvx{z y|xxst zuv{u|}ft|{|{ms~~qyz pxuq}y{ xoszzynp}}}}q~}yyh~~|vwz{{ytxc}wxxv~|~ tv{rl}uxwwr zx uwz}u|su{gqoqpy~}u|~w~zyx|rx}}{z{y{|vz{~|yx{v~~`y|}xr}zyyrwvzzzu}{|u~wuo{op{y|lt|wrmr|i~{xr|t wzyy{~ v}y}{~zyrxs~usxu plvvuu~r{su~} ||~ z w}}s y{m}{}~q|w}yr~upy~ywwz |}|{s}rx v|rtz{zys~{||q |v z}~ {}}}xgz}x}}wuhs}{zx~x{k}wvyl}slmmwz um{upz}~rz}|~w~{{iqx vwxuui{|mxry|wlzxtw~y~u|{~{ y~}|{~}yy}x|~z }}yzw vv~qwo qm{~ z }{w|}|}xvypuy}|x~xsy{s~z{uv{|uw}vm{zt|xz~ t}xyyu{~p{}g}z|~}~zyxk s~{{y{{}|s}|v}o}~{yzx{}o} }z|xsu|v}q}z}}x l t{x }xrj|{wp~}|wy|y sz|y }{} y||{zz}}{x{x|y~}qy|t||rrxyru}{zx{~z~y{rv}u}y{{t|~yrzxz}{|ps~t|~ wu|vvx} z rdy {sul{zx~us}usu|myz{¢wyov}z|}p}~{v{ yz}}xywz|}r{|wsswu| ¡v |xmzwtpyrhxw}uq}uryw x~y~|zz~~}v~wyw} yw}xz|~~lww}~}tqx~y{~v{vxx zpw~||wp{ro~~qn y xszoy x~ q}w}r { kz}yv{uvx wxx}{y}}w{z|{x ~svzx|zxzy |z~ }wvxw{wwu{z u|ypmyztg~xy{stzvq|~vz |yy}zyzvx~{r||~|vzyquov|}x~}zxvoutw|zolv{ow{ktv~x}xl ~uuzyvs|}{{xxy{q{}{ st ~}}~ |v|~uzyxz{noyzuwx~p~}urv z ||w c|~|w}{e|yzp~uj~vytxqiy}zxntq{{iw}|xk|r|~q| mv~|y|}~{t{z{~{~}}xx{z i~ }zy q k |vw{x{ryu}v tz| z{q|w~d~}wq}q {~nwz{ s z|}~q{z}{ {{u yw{|xyyz}yz |{xy|~{tovu {{yjz{t}}pty|{}{zuzwm~{|~~~ pqx|{z|~vwy~}ttzvtvx|w y}wn}~uqpx~oypsxuo} |}s~dyz}~uxz}}}w zsyvip{tuw~xt~r}xsx{r~{ ||su z| {orupxxhzy j |r}||{xzzwux}~||r~z{uymzo|ks|}zrzvyx{vz}ztyy}wt~~|{z|z}|{~{|~y~{{{zwx~}}s||sq}t}} }uo}vj|~~tyu~uqu{p|~y{v|w~tx w|vxz }x}yy z|hy}~{}{pu}}|{z~s~w }z{~ yvt||~ut}}}zj{t|mt|| q{~zyw{ }|yszxp {t{ w z{}wzux{||svo~}yu{zrywuu {qr xuzu|o~muyynvo~|y|zvw w{tq{z{y~ x ~ |}{~{wxt~xw~~xyu rsw{u{y wynzrvl}vxws{{w {|z}| eo}upz~y}|s~w |xvy| zrv|{y |{ zsxzz s~yrs}wz~}mwtx~||}vy{yzxzp}klzuuoqx{yt~xxt~}~w~v}~}~mzw|y||{ ~w|m}x|}ys||{ o|{ws xx}{~}u~{i{vx}trz|t{ p||~}|ps| }|rt z ~|y}~xst}uuuywd~~z ~or~zw|z}}|}w{ | y~r|to~yx}{|}q vwswv} ||xpw{|u~z~ym| yvz uz{w{y|yx}j |yu{}s~wy{|vzzxu|zyvyy~u~xtzvtp}t~~{}~yu |w}uz|x}|z|tpz}x|z|zp v |{xzz|t|~~xwur |y~qy{y|z{zy u t }yv{z ~||xtry{~~z}v~yy~z{ y q{yz{yz {sxzqw~{zw}w|izyqivxysuul{~x w~~ o{{svz{vww |y~u|~~ z}y|x|}{ {|{szzvtt |y|wu}l~{~{y{}}}vqyvvx}z~xq~{u}stur{wzup{ {}}~ yrwzyn |ylvkormztvvw~p yyvv~z~yz| z~ttyu}}{w}~|x|{qwt| y{ s}| }xw~sws~tu }jwn|~z w}w ~vx|r{z~x xk~yr~xtrxx}}w|{} nw~{ }|xq~qy|{wvz{~|z|y~~ytz}uzz~v~ztzuzvk}x~ntztw||nyn{zyynu ~w{vw}x} zy~| z{~ru{to|z~xsgw|{uzirx uyy {~u}zs{zz|w}{ rvgymuq|zzu~xzwup{z~y~tw~o~s~y{~vrp|wuy}fpyu } xyz{ztptxwwyy{ sx|{n v~~qtoi}nwcuvzwzz||~tksl{~q~su}y~gs{lv {z |yf qsst xvbyrjv|xxzyxxxxy{zyzz }ywv}}l| g||~~shz|vx~w} wmqvx v|se{z{~vvex{ dwxyu} zr{ |¡|h~zczxr{mmy v~|v{py}~zuz {|{||~}w{z~yx{ux{ws|juu~~q~yvz{~pyd}s~x~} }z|qs~x~xdxw||x~rx|u~s~^z~ xzx|¢|}q}uow{o zje{s|t~ |rnfp~pv {^} ~}{~t}z{r~z{} prtz zy tz{{wzy~|w}wzq{}i{z{q|~kv}x~|xvmmw{~p|y}gv{~lzwro }}kx ||f{|}x~~u| txzm} ykxu ywt z{}yrwpvkd u{~|vn}xuxv || hu|{{{~zrx~}|wzm z~|uwt~¢{z uvn{npylz~vgay~wlt xq}tizw|zw{zzzvvx}}yrw {sx|~wsw{iwxz m|~s}~|mzrn} rnv{v{z_|yrh~q ~zu~u}x{wx{~c ~x |~u|qyo|}} yz|zv~qy zyzxxxytyw||y|}xxm}{mpruxyyyyy zy|vu v~~wzk~lysxtz yx~}|wy|rwzz}{z~xuw{w{kuzqz | }vt~v|| v{ow~tyv yzz}}uu~~szv| z~y}y~{}|z~~t|nw zwvqq{xxy}zzwr} bru~yvu~| ~s}lwz~zv|osz ~xznx~rvx}x xy~z}|~}wy{r zxu} |{ y~{~w|w r~ ~|}{u|}}}rvt}|}syq~z{x}yssmzxus s|~}w~p~||p~|t v~}{z}~~{xqwrzzzzvz{~ }x}xxw| {w~xw~~{}von{}vtp~w~uzl{~ v}ux {{zz}|l{pxy}ww} z}}r|y zv} {{} }} u sy z~ux}{}{uyys{|gz|{sv| }~{ytux~|}~s{yz|yzw{{ z~vyo{zsyyywyu| xm|~| y}}h~{ozr~sgxl||wzx{pp}~}~ry}~x|~s{~uzuq px t|y{uyt z}{}pu|{{uyw}xv~ uzzx| x|t{ru ~sum|zyz |~xypzw~ws}y{{w~ wwqwq w}yy~| z~}yt{u ut}yz tvv{iv| |x}py{~txonty{joxnm|{xxno}x{w~~u}}ywzv|yyvwp}y~}~|zq~z{~xz} |w}z} ||o{w|z~z vw~u{~}{y{zw{ }{o{ssz u }}yp~}||rv~{{{~} ~~vy{ }yy}zyqyy{uvp yz |}x|n||xu~|v~}}~yn yz~ xv}}|vkl~|yns{}zvm| t} |z{xv~}||}| {{r~zz|}~v~| vyyw}z{|tx{vru t|vz}px{|z|qhwx|}sm~}zwvj ~{|s|u u {x~|qkr{}zyx|yw} z ~{r~~t{|txy~} ~| z}{ptpzvy~m}{z{|p~} y |z~jsz~ |u ~w~sy~ x{u~{ z q~{ |ruyquu}ysz|~ss ~}rozw|t xpyv}|v }u{u|xsx{qu}zzx} yw}uzzyy |~{{{~{y{ |~wkk|}}|w~|s~y x{u}~ uzu{}v|y~vx }{}y { u|}v { ~snt{|yoyt{ q~ ~rv{x}pyswx}} zt}zx~|} yzrt~}zyzzu}}zyrzwy}p~{uusjoo~vt~~rt~ o|w||u|v~ |z |zx~t~x{ tjq{|nlxyv{zzk| }px~ ~xxz {~o x ~zyu||u||{~m}u|}y|evz|}y|pttzzmx}q~~{x |yyvyu} rys| q~yx~ox|}xwtwzux~~ |u{}zmvt}y{r z}vyuuz{tu|||}xy~y~swzz w}x|wrysytr pq}y~m~m}y ww|{|rs}jz|{{xxm| |zm xu||}yv~{xw}}r|tp~|||wfz|ux z lm~{~y{|} zv nuy~rj|y~gyxs~x|{~hvx z ~f{|zyvl~~|xopysy{}~~x~yrwzntw { ~ryo{vw}{xu~}iutyxr| xsty~vxyf{vwk~| |~ {}tsx{us }wz {v } {{z{{s t|yx~z~}uqu{y{}~xy~yy} jz|xy }{vytw~xoyxx|~w~u~|r wp {x|xz~kw|vwyr tr}x{rzywszsw}}f~}j{yvc~{~w|l|pvp{poxy fr~qz y |~~~| ~wwz}x~nuyy y~ t{}xutxy||z}{x {z{zzy|}s~o}vynw~|s| x z} yxp|y zz}~}{ |{~xk~w|ww|}x~twxz|}sovy~|ov~}~u u}~|{ w~}}~|xyxy { }{y}}vurw}}}pv u}x~}zzx}||{~{}vt }t~pu|up}~o|uzq z|zyx} x }}wzv zyx~|q{v| x{~tf s}{~zv{~{~~wy|yvo{vvr}}qs~z}srg~zus|v{{|qz w~{{ y{ vw wq |x~|| { |o|p}xxpyvvwpz ty}s{y{zvvw|~yr{p}vyy|zy|||w}~z{vq}w~~|o~}|y||}j{}|z|}~yg}|}z|t}~y{u}~~~tn}m{vo{tuiwwusl~ysu}zzv i}|{xtxuswsy vvvv~~w} {}|| z{xwmz}z~~{wwrxpzzz zswy~ wy~utzp|w~}{| |~w{rvy~v{|q~} w{}z{ yx{s|k{~~ yt}x y}{zx| qy|p}k|qmu}juot~{~~ h}wzzq|y~tc{zzs{w t{|wz{w}~y|z~ ~s|y{} ~|z{s|{vo|svpyyttv~rw ~ou|tort~}|} ~~~x}|x}v~}r{ytnw|zzyt|~|{ w}q~wqv x |q~s{jut w|{|z} suzx||~|wx}xvv}ystw nvu~zz}v~|~{qv|vt}| {ywtz{|}h{z{t}{hx{yszr~~z nzu~ |t|y v{xovw}s~w yy~|{y{shixvyusyow}uy~wwyu}u}u m kqg|qsq} ymwux~owpw~}{uqr}}w}zvy{y}qzphvqzuxqzyu} }}mxyu ~~xy|{~ ||| }} x{}{{rzz }ywxuo| yyyq vw sz|} }szq}z{uzx} {|{vy~}{ |{l|y~|y~svk}z~yg p~xxp r ~toxv{y{z}x~ }rqsx{|{~x{p{}ys ^ vuw| qr}z| {{~zzx{vv|| ~{zx~|tto}w{}}{x s}{}z|mzw{g|{ { {z|z|s|}xyzyxy suw|u}~~sz|x{{ {x|z|yz}t~}~x|v~{s| {yq ~yvuxo{|w~v}xim w{swx tsixznxz|~tzzwt lxvwu{yzw~x}wzw~ yi{~y}l}{w |ry~} { {yj}zz}vyt}r~~xr t|zz~y~vp~sz}r w{u{|l |tqu|nzt{~{u|}z~tts|r|~v{qwy}~z zqu }wwv{otzux}~{r{{z x| {|{zvxz|{xvty}}r ~x ~ ||{sr|{u}zynsx|quno|~y|{}|q|yu|}ys|l{}{|{|}qrzvx}{y~~ ~{{x}wv|{z|{|~{}xz}pyys}unpxzw}rtw~ny}z uz|z} }r wv~|{~q|zq{|qr| wyz z||y|u{zzux}vzy||tuwqzs}}{}uxw{mz|kyz|ud|n{|} r}u}vovvv~q~~~w{zq|}~{|yxuxzy}qw|{z r y{~y}y~y|{u~z}y{}yxyh}yp wh~{m~u}{hv{ x}}l{o}u~| t}x|~~}w~~~{ww| |y{p~|zuynt{ ~|p|{~un|xv{{yw|} ~w}zlx~} xrtq~qwyl~ts{z{r }{s ~{{xxvy v{nswxz}v}uq|x{~v~ x~}s}v|qynt }y w~m~wo{| mq~~~{||{musv}yvpt}~}~}sz{x~x|z~vuvwzvwtus yxv|svsuy{ {zz} x{{usxx ~zr}v}~{tw |u{uu|ys|zzyz~{kqx}~uzvv}qtq~vsp}~zpvwtx}|{{} vz}}yzx~o{~~{y }v~{ys}vrtw|z{nvs~{~psu zujwyqv s~uyqynx}|~wz~}x|~v{~x{j{|{}yyyuv}x}x|~}xrt|} yy~y~ow~ |}xm{usx~z~l| y{}{x~{xxx}y|w| {}y~|vypxrzy{~qsrngy~~zm}w}{{} |xw{zywpxtzry~}u|{zxt|yzz |~ z}yz~y{pus|~|}}v ~w}}t { {wy~ {{{| ly~v|xoy q|zu{vw |ut~y~{r |xr}yr{|wpzw}h{~x }zwz}}~~xzys{|v|{| {suuxzy~lu|{tv}~ sq{yowyq~ }{ mpuxwwyn~ }xr~x} qu z~vuy~wwxx{ur~~}ozizzyy t } uxzvq|~zb{t} w |zysn~}|xmm }ty|yzzz}u~~}oyyk yy}t ssx|~~|p~}j {| |{tqmx}~o{r{{~{xxu~}z{ z{vyr y{|z}z{v}~v|s}y|{xxun}{uy~s}p }y}vz}|zt{rvp x~sz}{{|z} }ny}v~{{tzr|nx s}yu|v~|{~ xu}py|~y|}}x~ ~}yzzz|| m|~spz|~~~tw|{ |~zzr{y|wr~zu yvyv} |~zzxtw~{~}tv z zs}}y}loz~wxmv}w}{s~t{{~uysz~rwy|sqzuxu{zz|z y~y|y~{ w{t}n|{l|u|z{j{ }|ru| t{ xzy}l}|w|{|yt|yz{u~}|x{ }v~~u|~zyq}}xz}ypv|~z quwvzrz~nt s}rw v}~{y|unuu z{|{ry~}~|}xyuu|u| q|wx}{|~~qy|{}~}x}ix|zqpy~n x~}yvrq z{|rz~w} ~~xx || {vxs~v}u||xy|{uv{{sz}}{gu{~v}u~usyu r ~|p}pz{sz}xt~m~v{y| }yn~rzzwww~vu zuzowz tn||{yzwk}t }{~z {{}mt }y|uu}~r{{r l xxx|}}szzzwzztu]z{{lo}x w~vz lv`||y~v~xk{w|y{s vuvwxhg{rw~{ un{{ rp{lk~l}w~{y|} }}tlnsx}{iz{{~ox}z~zwy}}ywrj{z~rtw wxo}osn}l{{|p}vnylz xxxmz xx¡ z{~v}}u|w}q}}ry y}~}v}np udgzwp r}kqf|||rhh{gyyss~}}u sv}zkd |}{|¢|lu~~||£z~~fl}}x}~{}{v}u |~kw}{qp~yvnsztruz}xl ~~|~nx{azw q|vnlpvyf}x~zz||gv||~zp{ywxvew{vtxogwv|rt}l{~{x ztpytx}v|~dw|vxzo~n {~}e os|vtstv£xozqwy|s~y|ux|{xqyw|~|jzw|}ms}~wxq~s ~yw~xoq{ |rgq p|u £}ukycx xuqxzyg z~ e~yymvx{z|pn|{~vxys}v {|wtqx}}qxw{i~|lgzhm lt~|pu ¤{w¢my}uqwstyu }zy} w|uu~zyr{}~jy~{z{~cz|nuz}ysk{ sn||{r[ x}xx jp}}x}x}y~|avs}||w~y {}~} uz}w}wq {v{{ze}||wx|nzwtw{nvqpu|}z|zmzv t}}{{t{y zzvw}u }} wxupyxyx}y}}x}y{ryxvtz~y |rzxy}~r{kyy|~u|tzy|tx{pyw}zv wzv~t }{{yr t|||v vw}}u}{y}ztx{t{{tsvx}w|ypmzu{w~ s}syspvq~q o~x{x~v|q ury}|z{{u{ |x~tt} }twytz}zwz| v{| ~~qryn}}~thn{|||}ut~y|~vqq{}{ vp uzzx~v~j~~|~z|y}zy~~{{~{|y{} |{|y|v{~ w}~qt{ zx|} tw ~{~xw~s{w}~x| s {}qy~{y{}~tt}| |}xt~z~~usyny}y}{zu{~}}tkzxz|nvwzv}r{x||xyy{~zv ttvw}v m~}{yu{ xvq| ps yut{t}z ~z}ywyy{uv{|y} |vx~^ yuuy pzzn{s||~oqzx}}r~~}}w|~~ymu~|wxy} s}{uoy|zuy~x||xw~}z|zsx{u wj rywuun h~}xo~j }xyxpr{uzuzx~yr}| |z ruxx }}{{|{r|zv s~yyz|j{{q}z}{tvw~~tup{p|yup xw}ygu~}w~}|{z~z}d }{xyx|~t }xy}zy|uvy~kxrt}{v}mzv{wu |zzuvmmvoz~{wf|wmqy z~~} }~zsz{xvn xw~||xwpzxwx}y|z vxy}oyqz|wt{ {y~sg}z}s{~w|{vzn}x~sqyx{ ~|}xk{uw|}vwvjzvz{zy|{{}{|~zz|ozs|ty~ vz s~~||zyvl}~}x~iu ssz~qr p}~}zr~uw|{yupzz}y|xvz|w}yy|~}|}v}urzwvyzn}}xnvw{~vr|t|xvqj{}ti{wq|{~yy}|z}zxqt}w }}~~}z} x{yx~}yxu{~zw~~|{xx~~y|uwpzt{}q}xus{~n}f { hz~v vyypouswuyxYzyv|u}r~y wv~{u{z~l|yyvyyv{{wxptovxx{}~|x|u~}~~ls{ wn~xv}{{y|yxr{y|yyw~zx }~xy}s|~|yn|xm {zyv~ o~{uz||uo}v}r}{u}}sxnv{ zzvz pz~t~v|}r~{x~{ m~nt~{t}y|~yz wv|}|x~z~~tz} {}xp}vh}||zu}unr||}xx}vzw |{r~}u~~ s|~tp|~zzz~{py}~tw|}zsqy~{oyxtx||zyu{rxz{{{~wy~zx wv{{}e{yy{lqy|urw}zyw||{|x wv{ y~{x}uq uz}~ ~v~qx}u|}r|}m}|j}~~zt{ wx{|s~rqwyxsoy~vypvso~zonvtvol}quv|}y{z{zz|{wy}}w}|~v~yr wy~m}}|rjywz}n}zyq u{w|ox{~u~ xx r| }}r|e|} yz||xx~{{w{~y|}{~y{~y}|~yo} ~c|u }wp}z~~u g}~m~u|un}{u xt}{qx{|qszt~{t }y v~|t wy}|| q~~zx}olw|vzzzss|t}vq}rqp}sm|x~ hsyw~ppyy|{pv| ~ |y{zvq~w~ z}~ zv~{{l {| xuhw{ww~k sypntwn~}xv}yp{zy|x~kt||qn~uy}y|qqu{~~ y| ~|~uzqz~~zou{szut~y|mqu~r}tvz|qxqz}}sw}~g~~x}vzuuz}x{zyz} wu u~|yttx}s~zx ~v~}p||xt |xvytw}~~vyhr |vz{ v{{}{v}x pvx~xu~pt|yr{zu}wuuz wnwyy}wrxk}u~y zyzvkl}wuy}~pvy{~ | qso~ zk xz~xpz~| u~szxz{uzxs~~r}|xvyz|z~}xjqzwww s}|sp~ix|~}y zu|yv{~y |~vyr|y~w yy{|xxw}~| xw}v|y ~x{wzxy r}{}l~{w~z }y wtyyt| wzx}} }~|m|~u}~rhzw~m}wm~{|{wyzwl{|||qv}x~ {yw}|pqx~v} yt| vzuv{n{tw}{ xt |{m{}ywx|~~z| o|~tbu||qxy~|~rw|}wxywt}y~{~z |~{{sr}~|u{u~tx oyz|{z|{}w|vv|t|~yttnlzw |qq}y}~||f{s kp}z}{x}xwi~z}~}|x zz yx{x~w~jxr} v{{ ru w} }k~~zpy|}vx ql|vr}xu{ ^áÌÿÿâl�*�®NÿÃÿÿ÷!��2ü¯ÿÿ¶ÿ3�"�ëÿÿÈÿI·�<��hâÿøÜÿcÉH��VÖqÿéìÿz×\��E�ÃTÿÓûÿåm�+�©EÿÈÿÿ¥ò$��.ü¦ÿÿ³ÿ8��véÿÿÃÿM²�7��_ÛÿòÚÿ[Ê�M��KÌnÿèëÿyà`��=�¸[ÿÚöÿïp� +)�¤AÿÁÿÿªý.��2ÿªÿÿ¿ÿ@¤�$�|òÿúÑÿRª�6��bÝxÿñÚÿlÅ�H��I�Ìqÿ¯fq |{xwz}t|ztz{t~ywvuu~p|z~uow~z{ryl~~}qnwx} {lsu ~}uw|yww myz w }zwqzpj}|vp ~pw{ }wz~y{w}z| ~~}~xxjuo}}ssytnyz~{qs{|ry~ z ~}qu {c|t~ |mvm } xr{y~ |yywu| z } u{nlthpx|}z|vwq{~y} ||{||py{w{y{|zw~ot}w{|{zy}z}{dt z}x{tz~}xo{xvwv~ ~yzr~~{w~wzuz~||r ~x|x|~~xk|u{³.ìèñÿqØa�8�¼[ÿÙýÿãv�,�GÿÆÿÿªù-��1ÿ¨ÿÿÀÿ?¡�&�{ïÿùÒÿQµ�6��]ÝoÿêäÿjÇ�K��G�Ä`ÿáëÿ{Þa��0�«KÿÅýÿî��8ÿ®ÿÿ´þ5��#ñÿÿÀÿA¶�7��kãÿûÙÿ]À�E��X +Ø{ÿèïÿ{Ø +X��A�ÄYÿÙûÿæp�0�ªEÿÂÿÿ¦ô(��*þ§ÿÿ¸ÿ:¥��xìÿüÅÿK¯�2��f +Ù|ÿìÞÿhÆ�I��K�Âpÿ´rqq~|t{x|uvqu{ yyywzs|{z {ywz|x~}{xz}|{| sx{ }xu}fvz{tw|~ tx~rtx| {}{uov|x yyy}}~~}{{vzxz}{~wv}vz}vvuv{~{x{k~}zvryww|zaxoxz{t~rs~x ~{}w{p}umrz~~}x}~|~{wsu}x{ez||{}}|{h}wk{o~gtu|y~zwsv|tyzx|iu|x~}z |{z~}|w||~~zv}| y}~twxx}|s{|py xq{zzx~m |s~wy|wvzx~z|~v~d¾ÿÿ÷��0ù°ÿÿ´ÿ:£�( �xíÿÿÌÿQ¹�6�däÿôÞÿiÎN��RÎlÿÞöÿàf��?�¹JÿÈÿÿõ*w�'�£<ÿ®ÿÿ«ù0��~!óÿþÄÿC¥�"�iâÿ÷Òÿ`¿�A��OÍsÿéåÿlØY��>�º]ÿ×òÿèq�-�²IÿÆÿÿú%��3ý´ÿÿ¸ÿ9�!�!õ¡ÿÿËÿV°�2�i +ç~ÿñâÿmÀ�?��U�ÐrÿßðÿzÙ`��=�¼IÿÍûÿéq�%�<ÿ¨Úxu{{|wxxzx}{~t z tb|yq~w}x~~z wtouy | x~uzuzr{sz{}z~xi{}sz|w{}ztptm l~vunruxu{z|o|wyxrxutlwxw~~{yu~y ~{ x|r z}ry|z}y} ux}x{{~}~r{ ~{ww}~sm ~qwo}vy|m}mt{| }}y}y}}w}zy} || x{q}z|z xnwzz vz}z}|yu}z |yyyqyuqy|g|x{vvm| qw~wp~vl~|wz{ {~~|||ex~|}~yvw|xx~}~v|s||~w~{}w{^~.�¢Mÿ×÷ÿén�+�¤Bÿ¿ÿÿ¨ö.��,ÿ©ÿÿ³ÿ=��zîÿ÷ÑÿV®�9��]ÛzÿïÛÿdÈ�O��D�ÃeÿÛëÿ|Þ f��+�³OÿÌúÿï ��:ý²ÿÿÿ/�!�{)ó¢ÿÿÂÿF³�3�nêÿòÞÿ_Ä�D��[ÔuÿçòÿyÐ`��D�ÇXÿÐþÿâm��,� =ÿ¾ÿÿ¤ô(��.ýÿÿ·ý9¢� �têÿÿÄÿF´�7��bÝÿîÜÿ_É�P��AÆdÿãíÿ|â +g�.�Ç\ßrs}xy v{vx~v}}xoz~{|t{}~x||o}|| ~~zvz{|y~}onwxzy|}||{|~~ w~~rprj z}ts w}yz~xvzsxj~v} lgzz~{ }xz{{p|{y}}ylyzzny{yww~{{y{|urwvx}}~~{} }rv{~tw{~ox|{~xouh ~zxyuy~ey{wwrz~ y}ys{p|pz}y{xy{{t~~w {u{vy}}q~t~~ypwy{ ~{wv{u}~}yv{~uw}|{xurszuq l{ v{syqzztxv~rqy}|vymz}xu~jj×9��;�ÂPÿÍýÿås�*�©;ÿ¼ÿÿ¤ó&��&ö¦ÿÿµÿ9�$�säÿûÈÿJº�E��aÞyÿößÿ\Í�U��H�Äcÿáðÿ~ä h��8�¯TÿÎÿÿô!t� %�£;ÿµÿÿ´ÿ7��!úÿÿÅÿI¬�* +�téÿôÙÿ_¿�>��YØnÿçåÿsÍR��C�¾\ÿ×óÿâg��0�BÿÃÿÿó}��5û³ÿÿÿ/�&�*ô¤ÿÿÃÿJµ�5�gèÿúÜÿ_Ã�@��Z +ÚsÿéëÿyÖS�Pu~x ~t{u y|{zz|zuy} t|zzuxw|}wy{~t}u{vynv~jutv|t }vzkv wyvrwvwn}|q{}y{}{~vo| zosx}yv| i}~~{|t~m yx}j txxxus}v}wz}y xz|xvwvx{|~n{rx|qvz |zx}vuw{ul]u~x{~v||xxq|}}~nzy|}}{u~nz~xvtxxzyx}t|}}|rsqp{yqwu~puyy zu~}} v{ }{u~ wz|~xt~{ }{|u{| |}tw|{ }y{ rq¹xÿÿ´ö*|��*ÿ§ÿÿÀÿ>�# +�zîÿöÓÿQµ�8��gØwÿêäÿiÍ�O��F�¿^ÿßîÿ~Þl�,�±PÿÇüÿõ� �@ÿ¹ÿÿ«ÿ1� �*ö¢ÿÿÆÿHµ�8�lçÿüØÿ^Â�H��ZÚvÿêêÿrÑW��D�ÄUÿÛòÿÝi��3�±CÿÈþÿï%� �/ü«ÿÿ´ÿ6� �z!ðÿÿÂÿC±�3��hãÿóÜÿcÊ�I��UÌvÿðäÿsÝ_��<�Ä^ÿÛûÿçv�1�«EÿÆÿÿ x}wxzu}{wtv~q vz|~|oxs}xxuxvu~ ~~~y|z r| w }}}|xu ~y||t|xu|{|w|q~zz|x~}{~w t{ vt}puyn xx zvtvz}y~}u~~ru|w}}xtw~{~}wzppww~t}n}~to{|x|yz~w|{yy~s~j}}{|zwx~qx~}w |}}}~~yyw}|~ sw|ws{|n|ynxvnx} u~yt w~~m~ xyzw}uxvykz|} {|ww}wguywezx{|zmn ~{~ ~y}{|{fsvxw~tf~{uux~}t~yww |~|p {v xuÎlæ+8��bÐvíñðÿr×U��MÍdÿÜõÿám��:�®Mÿ¯ýøð#��0ù¯ÿÿ¶ÿB�.� ÷ÿüËÿSª�,��cßÿóÍÿoÇ�J��J¿`ÿÜíÿzÜT +�;�®SÿÎúÿë{�&� @û½þÿ¦þ(�#�'ö®ùÿ¸ÿE±�/ �k-ÞÿöÖÿ^¿�8��] +ÔqÿëìíjËM��B�ÇRÿÕ÷ÿçg�79ÿÇÿÿî)k� �.ý§ÿë½þ9�#�}èÿÿÄÿMª�D�{ ÕÿõØÿa�N�m|z}zjxtsu z {s|o g|wxq~wwx|xspwluszte||xrt~szyoynsquxx}x|{yw}z}z||}|qcyn{z {|~tx{~qyyt{xgyxvz~uz~uzf{r{xx~p|qv~wq}v|xs}yyw]y|u|yz |v~ m{l u{w}nrr}t zpu{unukvv |{~ ust{c|}~~lm}v|z ytupzx^z~u{~no}o{}xvj}~|~yxqe|trt{|y~x}y|~xg|}jql~w wz|rvu}c{nto}z||pb s}s~y~{swoàçûG�$B�|#ôÿÿÀåZ¨�,��håsüóÇÿ]Æ�>��OÐnÿÝæÿpÚi��8�ÅYÿÔ÷þìs�*� GüÁÿÿ®ô9��.û¹ÿÿÀÿA�&_$éÿúØÿWÅ�L��fØÿàÞæUÓ +K��H�ÆdÿÙóÿÙf�5�½EÿÆüÿí$v�!�2û°ÿÿþ.��z êÿÿÈÿO¤�;�iÞÿö×ÿf¹H��_ÏkÿÜìÿqæ]��A�¶hÿ¾èùwõp��5�«]ÿÂÿÿ¤ð&�/�3ÿªÿÿ»öZ~r xpz}qrz}wT}yx{_ntzrsyq ~}wvmx{xsxnt|x~z}}zw |z syt~~u~vtw}|p~zx~~q{w|wmkupwo} r|q| nyv {snevtqiu p vyt~~~ }y{t{}{y~{zz|ss}~~w}sxw}|~u~|{ w v}r|pv|~~~~ |}|yr{zrr ~xjy~ |v ovk ~zzw} x~}x z}~xz|t{|{|}y w{||yvt| s~~uyz~{qw{bswx{}u~~}y| |}swu{x{tvuwvp{|r{yvp}k»ýÅî j�1�±PÿÊÿÿ¡ô$�(�5ÿ²ÿÿ»ÿ=��ûÿÿÌÿM¨�/�läzÿðßÿaÅ�C��V�Ê`ÿáåÿsÕ\��7�¼XÿËøÿåz��<ÿÀÿÿ§û,��,÷ªÿÿ¸ÿ;¬�+�sêÿÿÏÿQÂ�D��[Ù~ÿöçÿrÒY��J�ÈaÿÝûÿäk�3�°JÿÅÿÿ¢ñ&~� �¡-ÿªÿÿµú4��õÿþÈÿP«�(�gß}ÿôÒÿ]À�@��UÏqÿææÿoÖ�^��9�¹RÿÖ÷ÿì v�'�§HÿÄÿÿý%��3ý²ÿÿ¸ÿ?¢�(�~ðÿÿÓÿU¸�4�kæÿðåÿgÄ@��QÒgÿÜóÿ}Ó]��4�¼NÿÎúÿêk��&�¢Cÿµÿÿ¨÷ ��0û ÿÿ¸ÿ6¡�%�séÿÿËÿEº�=��fÛzÿðáÿdÏ�S��RÐlÿæôÿ|âh��<�»SÿÒÿÿð!z�/�¬@ÿ»ÿÿªó+��(þªÿÿ»ÿ>� �}ìÿûÉÿN¬�/��cÛÿñÙÿVÆ�J��IÈbÿæçÿsÜ^��=�¶\ÿÕúÿêh� ++�«GÿÇÿÿ¨ù'��.ý±ÿÿ¼ÿ9�#�"÷ÿþÉÿHª�)�läÿõÔÿ]¿�@��V�ÐkÿæèÿvÏ�Q��?�½iÿÙòÿäl�#�«NÿÈþÿô��3øºÿÿ²ÿ1��!ì©ÿÿÆÿG±�(�xìÿÿÒÿWº�>��dã{ÿôÜÿpËR��M�ÎaÿÚñÿÚZ��8�´RÿÌüÿçq�$�@ÿ¾ÿÿ¢û)��)ô¯ÿÿ·ÿ:¢�&�%ôÿÿÍÿO¶�wjq|ww{s}| zix~uw~}~zw}} ~ }u~zyxrxs~pi{ vyzzuvw{|}|y zt}|{u|oxiuw {rx~|u|{yyutjry||w|~v}yx{w|{vuz~|pwm~z~y|i{ {{ z~~ yu{v{ zzw{sx}oym r~}}yu}~}yyq~tsy}u{o~~w~u|{sx|sux~vq{v|uw|~x| |oz|xwv|yrz y wy~zzvotv{{zpw}}{y{|~z{t}zw}qz{}~y{try|{~zv |z~~g{qy{ z}vk{y{|rÞÆõÿkÀ�G��Z�Òlÿãðÿ~Õ _��=�ºRÿÊþÿèr�%�£;ÿ¹ÿÿ¦ö,� �,ø¤ÿÿÀÿ> �&��rèÿ÷ÐÿQ·�:��ZázÿòÞÿhÐ�U��HÌjÿãïÿæk�:�¸NÿÌÿÿó!v�&�=ÿ»ÿÿ±ü5��&ÿÿÿÄÿG¥�,�xìÿöÕÿX³�5��^ØjÿääÿfÌL��I�Ë^ÿÚñÿ}âo��0�®GÿÍúÿô�$�3ý¼ÿÿ¬ÿ*�! �+ùªÿÿÂÿF�0�uìÿÿË}}{t| { yy|q{{wj~wwt t{o|wz} hx{xyxtqwz{}v q|p i}uy~n}m{y||x}y w{}yt}zypxwwxws{t{}x~vpuzsqyvz z}~rlzyu~ y~{{xzo}vyw o}|x}xoznzy{s~}oz}{pxuywzduy|zz|w |~ln| yws }}z~}~y p t~x{~y|x }{zsv{{~x~|yxsz~zyu|opv~}xzus }s{tx~|{z}~ s}v}rxxxz z|y|ywx}{zoyz{x|}zp|oëÖßÿ?¤�.��fäÿöÔÿWÄ�I��LÌoÿéçÿsÙ�^��D�¸Zÿ×øÿï q�4�¡FÿÑþÿ¦ÿ*��5ÿ¯ÿÿ¾ÿ@�#�~öÿÿÏÿTµ�:��jä{ÿñÞÿdÂ�E��OÐhÿØðÿw×^��8�²UÿÏöÿén�$�¢>ÿ¿ÿÿ¨ù$��/ø¥ÿÿ¸ÿ;©�( �u!ëÿýÏÿQ¸�9��dâÿõçÿmÎY��QËjÿâùÿ|Ýd��=�¸NÿÌýÿês�)�¥9ÿ´ÿÿ©ö*��$ô£ÿÿµÿ: �"�réÿúÊÿGµ�7��[ +×ÿ÷×ÿaÐ�T��FÅjÿéêÿyÞ +T��=�¸XÿÓþÿêu� -�ªMÿÇÿÿªø-��.ÿ®ÿÿÃÿ@�%�óÿùÏÿS°�/�háÿíàÿh¿�C��DÊjÿãåÿwÕY��A�»[ÿ×õÿéq�&�£NÿÃÿÿû#��6þªÿÿ»ÿ=¡�.�~!òÿÿÑÿOº�:�hßÿôÞÿbÅI��T�ÏfÿáíÿwÕ[��D�¾NÿÐûÿál�*�¥>ÿ¾ÿÿ¢ý.��,ö©ÿÿ±ÿ1��wåÿÿÄÿK¶�.�làÿþÛÿZÅ�I��WÌxÿðëÿzÕ_��?�¾]ÿÖÿÿèm�3�²DÿÃÿÿð#~� +!�+ÿ«ÿÿ³ù-��~ôÿÿÄÿFª�)��læÿøÓÿV»�:��RÒzÿìãÿl×�Z��D�Æmÿáóÿçl�6�³MÿÍÿÿ¡÷'�'�£9ÿ·ÿÿ¨û4��1ù£ÿÿÁÿ@¤�&�víÿöÒÿT½�5��Z +Ù~ÿï×ÿkÈ�I��B�ÆiÿÙ÷ÿs»9v{ r|{{xy|mrxpnz{|~v y {}~|yw|}zvtst|vq| }|~~syw~|sz~xy|zz{ z|}|pwx{|~wxu v~|{yv|{ywz}~p|}~{|n{y }{~ywt~} {~r|{t~}}y|sy}s|~|zr|u|}u}vt |o}xz} u|tv{uus{| ~ sa r}mzs}|yzw{|i~r}gv xy|x}g} t}|}~wt}rz}rqkz ytt ytxjq|}|}t ~~ |~|~|y~x|szz~y{h~pjºÿýÅÿM«�,�fÛÿðÙÿbÆ�E��JÊgÿåèÿtÚb�4�³VÿÓöÿñ�'�¦>ÿ¼ÿÿ©ÿ.��/ú¨ÿÿ¾ÿ=¡�,�xðÿÿÐÿZ¹�=�dÓwÿëéÿpÉJ��O�Ê[ÿÚöÿÞc��5�µOÿÏùÿî!u��£4ÿ´ÿÿªû,��'óªÿÿÀÿA�.�háÿüÑÿWÀ�D��] ÕvÿóåÿoÕY��H�Àbÿáöÿâm�7�·MÿÉÿÿó'� �¡:ÿµÿÿµü4��öÿÿÀÿD´�(�n +äÿøÌÿ[¼�9��W�ÊkÿëâÿiÐS��?�Â^ÿÙñÿá +r�-�¨GÿÍüÿù� %�>ÿµÿÿ³ÿ6�!�'ú¤ÿÿÌÿG¬�2�yïÿöÛÿ[¾�@��ZÚoÿæêÿoÌL��E�ÌcÿÙòÿÙe��/�°GÿÊûÿí~��8ü¼ÿÿ©ÿ*��{+ò£ÿÿ½ÿ;²�9�uêÿÿÔÿXÀ�>��bÚÿñéÿlÒP��F�ÇdÿÜöÿÙ_��<�¹KÿÉÿÿëw�(�£>ÿ¶ÿÿ«ö-��'õ«ÿÿ´ÿ;�$�éÿûÍÿL»�;��cÜÿùØÿ_Ë�P��IÈyÿèîÿyã b�3�¹[ÿÓÿÿó$t�-�«DÿÂÿÿ¦õ*�&�6ÿ«ÿÿ·ÿ>��ðÿùÇÿS®�*��gÜ}ÿñÕÿ]Á�?��RÔwÿêæÿtÙY��AÃdÿÜóÿç q�4�¬MÿÌÿÿ ò!~�"�Aÿ±ÿÿ³þ4�$�*ÿÿÿÇÿFª�2�wéÿ÷Òÿ\¶�8��^ÞxÿìàÿjÊ�O��H�Âhÿ®Ówn{|x|~ns{ w q~{{yw~w |}yzxx~z |y{ n|w}ly~|z}wt|y|~ {yp {my~ }}w~o qct} }q}y~u{z}~z{wxtv}}uy}{ {y{ {yyp{{ywx}uy|o{y~zq|y| xy i{~x|xzp}{{}ttz s{runvzzwuplz~}xyz}o|zxtzqyst}vpz ~zms}uxly~wp xk}}|~w~spuxz u~r~}}}xv}~v|wqzq|k|~uv|y| }rvqy}z{~p{~}$W�vQÿÉûÿô��8ÿ´ÿÿ´ÿ4��)ûÿÿÆÿK¬�6�rçÿõÖÿ_¾�A��\ÖhÿãëÿtÐ +O��B�ÄTÿ×ïÿåf��)�©HÿËúÿî��2û¯ÿÿ«ÿ7�"�~&ò£ÿÿÂÿK°�5��kåÿùÛÿ^È�J��Y ÖwÿïçÿtÖ [��E�È`ÿÚüÿÞp�2�´FÿÆÿÿê� "�3ÿ©ÿÿ«ü4��x!ïÿÿ¿ÿD¢�&��pãÿùÍÿO¿�?��YÑzÿðàÿjÔ�W��G�¿aÿáñÿåg�4�¯QÿÒÿÿò!r� +*�¤7ÿºÿÿ©õ&��*û¯ÿÿ¿ÿB¥�# �nïÿöÐÿR¹�4��^ØxÿëßÿfÇ�L��E�ÈmÿáêÿvÛa��;�µVÿÐúÿër� *�¨DÿÂÿÿ£ú(��5þ´ÿÿ¶ÿ8�# �~öÿÿÉÿK³�/�zçÿðßÿ`ÈA��W�ÓiÿäæÿqÍT��=�¾ZÿÔ÷ÿ à +i�+�¨IÿÅþÿó��6þ³ÿÿªÿ/��0ùÿÿÇÿFª�0�tðÿýÕÿX¾�<��a á|ÿóÖÿkÎ M��N�ÏcÿÙöÿ}Ù +^��8�¼RÿÍ÷ÿés�%�¢Aÿ¹ÿÿö!��-÷²ÿÿ±ÿ4¡�(�&î ÿÿËÿL¶�4�læ ÿúÛÿ`Æ�C��\ +ÞrÿëìÿmÌR��L�ÌXÿØ÷ÿá_��:�EÿÇÿÿíu��6ÿ²ÿÿ°ø0�� -ô°ÿÿ¹ÿ7¥�(�rêÿÿÉÿM½�<��eá ÿøÞÿeÊ�D��PÐpÿêíÿÚ\��B�ÅRÿÏþÿán��+�©u|yu{hv~yt{{u|||}zyw|}|n|xu~~pyxv~{|i |}x~{xxvuzoxt~~uuwtsx xwwm pz~ztr{||~|}z} } ipumx h{ tzr~}xg|o{zz~ywq|~ {sw~~}{zxtrz}qu~zwo v symswou~ wtl| qo~{xp wuvy~z}{z~v|~|t~ p|~|x{oq}|~zyvv|z z}w{ ywy{vn|~x{qzuqnyw}wg~{txty{~~ syv~zzzsu||}|vx~y} {r¤µ÷ÿß�X��O�Å^ÿÞúÿèt�5�²IÿÆÿÿ¡ó#� + �0ÿ±ÿÿ¶þ6��öÿþÉÿN©�-�oâÿðØÿ[¸�D��L�ÎqÿäåÿuÛW��>�¹ZÿÕöÿên�,�IÿÉÿÿþ!� %�:ÿ»ÿÿ¶ÿ8�$�%ö£ÿÿÆÿN²�1�sïÿóÞÿ\Â�C��Z�ÖrÿäëÿtÎS��C�ÂVÿÓóÿãh��*�«DÿÂüÿðy��¢7û¸ÿÿ¬ÿ+��~$îÿÿ¾ÿ<°�1�gçÿÿÏ¡xfvyuux}t{ yp~s}~y{{zx o{~~|{ y{|{r ~z{{~v{yqttwzurrz|hyytzzx|~bzstw~zw|w~{{ o{vqxoy|}n kvosxyvy{|~~pwy | yzw|~|{~uz{{w ~}uwt}}wxvtn ~} s ~ {{jqr|s uxnpw|v{p}|v}}u{zx u}}|wxx u{{}zot x{xxvr~vxv|zzz p xz{~ws~v}tzq }yo}xrxsmxpvtwsn}sxwxxx}x}za tq~u{ vrx~y{~~qwt|y| uwyp~| ~y }~~|u Íäÿ[§�(�næ ÿóÖÿb¹�<��T�ÐpÿéåÿsÔ�V��9�¸[ÿÖóÿçz�+�¨?ÿÆÿÿ¦ý"��3ü²ÿÿ¶ÿ;¥�&� ñÿÿÑÿT·�<�fàÿðæÿiÍM��QÏfÿÝóÿuÙ_��:�¹RÿÍþÿèv�'�ª8ÿ»ÿÿ¦ö+��%ö¡ÿÿµÿ>�)��qÜÿùÐÿT»�C��\Ø{ÿòãÿfÎ�Z��FÆeÿÖõÿèc��9�°SÿÎÿÿ ï#�#�:ÿ·ÿÿ´ü3��$û¤ÿÿÌÿ<Kyz{}{}{~}|zvp~~uq~v|ys{}yzp{yr kuz~v t~t|{tz{} y~r|yy}x|xttulz nmw~x{yz uwzwtzrv{z v olx xw { yw~~||u|z}|~|z}{|{tyw u|} ~y|~ x~ n{p{s } {jws|wv~r}~~y zx~zwvx| { vsqtw~}us su}frxqy}yy{|hrtyk~~xwuqq{wyquxn s wz q}wzu{~~}o {w~r{{} s}{{y||}vrvx}ulzygíhÇ��| íÿøÑÿK»�:��eÛÿ÷ÝÿcÖ�R��PÄhÿçòÿáh��:�»SÿÎÿÿó!� $�£:ÿ·ÿÿ¨þ7�!�ù ÿÿÈÿM¨�1�méÿõÖÿ_º�7��[ÙlÿéâÿoÉ�P��@�¼_ÿÛëÿäo��'�§Pÿ¾ÿÿø ��3û±ÿÿ±ÿ5¢�(�{#ñÿÿÌÿO¶�9��fß ÿúâÿhÍ�J��X�ÇhÿæòÿyÞ`��?�½SÿÏÿÿås�-�©=ÿ½ÿÿ§ñ(��+û¥ÿÿÁÿ+@~ z~{zy|x |~|tpx{vzx~z}u}r| ytqo| }{wz||~u y o{~m|vz{|yv x|m|zzzzs}u{z|~{~ y~{|~}yy zi~|zw{wurfy}oupvzp{z{{|}{zu~sn~ ~xvvs{~}x}nv t}t x }q|~|yu~}}w| }t|~{{}tx~q~xy}u|shzxxrhtynzknt |}}stv~ z~qu ~wyy~~|x~{u~wz xvy~x|lz|s|s ~z~qvq| q}{w~ks~~vxw~zz ~{{~|v|w~ eÙ«ÿÿ~Ôg��8�¸KÿÅÿÿï#v��6ÿ®ÿÿ¬ü3��w$ïÿÿÈÿK°�2��iÝÿõÕÿQÇ�F��YÐ|ÿíèÿtàa��D�¾_ÿÜùÿër�/�GÿÃÿÿ¦ü,��/ÿ¬ÿÿÂÿ?�& +�{ôÿüÓÿU´�9��^àxÿéåÿeÀ�J��J�ÅbÿÜïÿ~Ý^��9�°PÿÍøÿìw��:üµÿÿ©ü(��*õ¬ÿÿ¸ÿ>®�+�tîÿÿÕÿU¹�A��c âÿôãÿsÓP��Q�ÌdÿßòÿÝf��<�ºOÿÊÿÿêu�&� 2ÿ¶ÿÿªô*��(ö¡ÿÿ¾ÿF£�'��xìÿÿÊÿI¶�8��\Û|ÿöÙÿaÊ�N��NÌhÿáòÿzäp��<�¸Vÿ×ÿÿéx� 0�§9ÿ³ÿÿ®õ4�"�0ÿ¡ÿÿºõ9�* +�|"íÿìÕÿG³�5�b ÐÿìßÿjÁ�\�S�Ñuÿçãÿzå_�<�½UÿÊÿÿìq�.ªSÿÆÿÿõ&��/÷¬ÿÿÂþI�.�û®ÿÿÇÿMª�2�\â ÿíÚÿ`²�5��VÒjÿÝãýWÓV��G�½G÷ÚíÿÕe�3�«FÿÓýÿú0� �Eÿ®ÿê·ÿ+��Xà¤ÿÿÂÿA¦�9�qìÿÿÒ÷g¤M��aàwÿêßÿoÉJ��Q"»bÿÜêÿyÞX��E�²QÿÑøÿÞr� �¢<û³ùÿ¤ö#��9ýÿ÷³ÿ4�!�yå ÿÿÅÿF·�,)�jÝÿÿÖîv½M��\Òxÿîæÿtâ +S�K-ÎSÿÝöÿåR��5�²BÿÇÿÿæw� "�0øªÿÿ§±eyz}gyo|m kuxxt|m} |zuywoyom q|sos}wi{y|iy~rbpwyr~qsl|~|w|{nt s{y~yv~l{}vzzd|vq{{w}qqtumuwsvexu}uxzxyhmwp|j|zvxqi~zsy|jxp~} q yuw{ q}s{ }yu}j}mxoxsz}jzjx zmp p~sxnp}{fwx|ixs|zx plx }m hwy|p|nxyrh v }|~|x|t|zysms{}otu{z{pu z}w}yyuvqt}zw{mgw|~ k~k{u|~z~euu {yttugyyxOtP;þªÿÿ¾ÿ:±�?"�xêÿÿÑÿd·�;��cÝmþðÙÿrÐ +P�TÒ`ÿåòÿ}ß`�:�EÿÁÿúå&�*�8÷ºÿÿ®ö(��#ò¬ÿÿ¼ÿ9�&�OÚÿíÊÿSÂ�F��X Õzÿéèÿ×�Y��H�ÁPóÝöÿ ãn�-�«NÿÉÿÿú9� :ÿ±ÿþ°ÿ4�"�,ä¤ÿÿÄÿE �?�} +ãÿöÚÿ^·�>�F�ÔjÿçÛÿl°I��<�ºcÿÌÛÿkåm��5�gÿ¿þÿî� + !yyx |||z}ttjwzv}|{}u}yk|x~~xslpx{|xt|{{{gxr^zhv}}}vpxoy |cx~vuw}y~w~ }yw}y{{tx{{~}zhzqv}x}x~yt {wzwx}xyx||xyw}{xh||~ru}z~|s} }}z}}r~}zx~{z}}zyy{|{x}}ss~vv|uux}zxxq~ywy}y|zz}}{~|v{~ vvxyt |zwyz|y~}~w}u}}x{|yxqnx|vt~|m{ psv x~hurjz{||nysu~uz|wut{}v mccX��RÖ}ÿöÛÿfÑ�V��H�Æiÿèîÿ~ìk�4�PÿÎÿÿ÷#�$�¢=ÿ¼ÿÿµÿ9��$÷¢ÿÿËÿM�( �réÿôÚÿ]¼�:��X�ÓjÿæçÿyÎM��A�¼YÿÔöÿâg��(�¡Aÿ½ÿÿõ&��.÷°ÿÿ¯ÿ4�(�|æÿÿËÿL¹�7��eßÿóâÿhÍ�P��TÑnÿçòÿâf��?�¿UÿÒÿÿèq�0�¨:ÿ¹ÿÿö1��)ý ÿÿÀÿ@ �'�uçÿøÌÿTµ�5��bdht|lzwsyrw~wt{rzzz tp{eqwt~spz{ ~u~uv~xx{wlzvygm||ywzxs xt qxwwu{y x xxt~zpwzxy}~z x vtw|x~{zmq zxxnw|tz}zw}{w}zx ry~|w}xyxy y|~~ t{||~wlk v| ~ ~}t|~v |u} z~ts zw ~ztvz{||yo|yysyut~yuyz{w~xx~}}}|s{xwx} r~zs zv{~x~{zw| z|vv|{ vo z~y~~||{yzzuz~xx ~u|wxz yx~|v{ {n{yxbbW��x!ÿÿÿËÿL¯�1�oçÿòÞÿeÅC��V�ÑgÿàîÿtÕ X��;�»OÿÍúÿço��(� 6ÿ»ÿÿ¤ø'��,÷©ÿÿ¶ÿ:¢�+��pèÿÿÍÿR¼�A��XÔ}ÿòâÿl×S��GÇgÿãöÿäm�1�´QÿÍÿÿî"{�!� 9ÿ²ÿÿ¸ÿ8��÷ÿúÏÿHª�*�pãÿôÖÿW½�@��S�ÎkÿãçÿpÐS��<�¾ZÿÙòÿ åq�%�¤JÿÄÿÿû!��6ý°ÿÿ·ÿ;¡�%�ao~}{{|vvsw}y~ |w~y|~y~}wux~sxy~nzx yzys~v| }yzz|~yy~w~z|z}z t~xz~~z~~uu~}{w |tz~|v|~x{~~}y~|{zqwz}vz~|{zvzr~x}x{ x|w~~{wy}w yu|z~x}{yq~z~y{{x}vz}~w||}x|t xsz~}xvr{y~|z~z{}nz|ywwx w |yx}x{z{xm|yvy|~}jwvyy}xu{xw|uw{{}x~ysz||}w~ u} sxwu}{~esywwxz{p{wy x 8õÙÿÿèy�!�¦@ÿ»ÿÿ¤ÿ+��-ô©ÿÿ¾ÿ@®�+ +�sçÿÿÑÿY¿�B��^ÜyÿïéÿuÒ^��G�É_ÿÛøÿåk��7�³Eÿ¹ÿÿñ&~�#�,ý«ÿÿ´ý4��îÿþÈÿO¬�,�dÛÿ÷×ÿZÄ�H��NÌmÿáêÿtÚ`��9�¹[ÿÙ÷ÿð~�*�¥EÿÉÿÿ¢ú%��0ÿ§ÿÿÀÿ?�$ �÷ÿþÎÿT¶�8�e +âÿîÝÿfÆI��P�ËfÿÚóÿ{Ø]��7�µPÿÌùÿèr��<ÿ¼ÿÿ£ü%��)ó§ÿÿÀÿ;©�,�r%éÿÿÎÿQ»�?��[áÿõæÿmÑR��LÉkÿáõÿÞd��?�¹MÿÊÿÿéy�(�©6ÿ¸ÿÿªö/��'ù§ÿÿ¸ÿ>�$�næÿÿÂÿS¶�6��aÔxÿòÜÿdÎ�Q��E�ÉjÿÞñÿ|æl�9�µZÿÛøÿõx�-�ªBÿ¾ÿÿ¯û-��,ÿ£ÿÿ¿ÿE�$�}ñÿüÑÿT³�3��cÛ|ÿñÙÿdÆ�E��JÏeÿàëÿw×_��5�´WÿÚòÿít�)�¤JÿÍÿÿ¤ÿ$��5ü²ÿÿµÿ9�"�"ôÿÿÐÿR²�8�mèÿóáÿfÁ�?��QÎmÿâìÿxÐQ��C�ÁVÿÔõÿàr��+�ªFÿÅÿÿï~��1ý°ÿÿ«ÿ-��.÷£ÿÿ¾ÿB§�/�péÿýØÿ[¾�A��bÝ~ÿðèÿpÆO��U�ÑaÿÞóÿvØ\��<�¼NÿÊÿÿåo�'�¦<ÿ½ÿÿö&��7úÿÿ¯ÿ1�" �ï¥ÿª£ostw{v{}zwzxsxuuveyz|oy~~p}{s~ |k}}zz{w{ {vzu z}wq{~xz~ }{} }x{}zw{~~w{ {z{{v~|nyzv {}wz| }v|z}zzz~z~}{}x|z~| vwx~y{zx ~ }~qyyz||xwzr{s{q}~srx {~zsrzx|xx}v{||x~yx w ~}y}|~xw~x}y}}|~ ~ x{v{{v}|ys~z}}zys{}wy| ~|x{wq{{s~ux}}x~|y xy|{qvz{|u}y|}|}x{zsu} ~t|{{x|uzyvzv~_ -o��~!ùÿüÓÿI®�2�hä|ÿðÝÿ`Ä�G��O�ÏdÿÞíÿ|×[��8�·MÿÍøÿèp�"�6ý»ÿÿ£û(��1øÿÿ¶ÿ9©�.�oëÿÿÍÿT¾�@��`Ü}ÿóçÿmÌR��TÒhÿâ÷ÿÚ^��9�ÀNÿÈÿÿçu�(�©4ÿ³ÿÿªö/��%ö¡ÿÿ¸ÿ:¢�#�qéÿøÐÿP¹�7��Y +×|ÿôÛÿcÐ�S��M�Àkÿæíÿ{åg��<�²VÿÓÿÿòx�*�¦BÿÀÿÿý2��(þªÿÿ¼ÿ?£�& �|ïÿúÎÿU°�,��f ß|ÿïÛÿaÆ�G��KÍgÿåæÿwÖ^��9�¹YÿÜóÿí{�+�§JÿÊÿÿ ÿ$��7ÿ²ÿÿ¹ÿ; �#� 'ûÿÿÑÿM®�1�qéÿóáÿ]»�?��Z�ÕiÿäéÿsÎS��E�Â\ÿ×òÿ Ý d��-�©MÿÉüÿð��9ÿ±ÿÿ©ÿ-� �)ò§ÿÿ¼ÿG°�5�wåÿÿÔÿXÀ�<��cÝ}ÿïèÿoËI��N�ÐfÿÝôÿ×Z��?�½MÿËþÿæo��,�£AÿÀÿÿõ$��3úªÿÿ±ÿ1�$�u íÿÿÈÿF¶�9��iâÿýÚÿ`È�J��Z +ÖxÿíìÿwÖ V��C�Æ_ÿÛùÿáe��5�¶HÿÁÿÿìy�"�2ÿ¯ÿÿ«ú.�� ,ù¢ÿÿ¾ÿA£�'��uèÿÿÈÿL¹�A��]àÿöÜÿdÔ�K��RÌpÿäðÿ{ß\��A�Â[ÿÏýÿåo�-�°AÿÁÿÿ¢ï#�"�1ÿ«ÿÿ´þ5��~ïÿÿ¾ÿG©�(�k$Ö~py}~lr{z}~vox}xsz|y~{yvzxv|y{vtt}zzyz}zx}wwm}~{n|~v|o{yyoux}w{~} y z{}}y mxx{vvyz{wsrw} x {}~wn{}}px~{uzs| ssyr {z}yyvs ~p|n~w l~t|x||wk }}}vs~~g }tt~{ }s y~x ~zy~yx}v~|v}zw}y|w~y|zyxw{{vsv~}gz|z|{}y|u}zu~|vtzx{z}}t}v}v~{~xvpVgT��v!ÿ¡ÿÿÎÿNª�1�sìÿóÝÿ`ÅB��]�Õnÿâîÿ|ÒQ��A�½[ÿÕòÿåo��,�¥?ÿ½ÿÿö'��*÷§ÿÿµÿ;�&�~!êÿûÎÿKº�?��eÙ}ÿõàÿbÎ�O��R�Äcÿâôÿàe��@�·TÿÎÿÿëy� +�¤:ÿ¸ÿÿ°ø/��$ø ÿÿÁÿC¡�%�sìÿúÐÿW¸�7��_ØyÿæãÿkÒO��E�ÃbÿÑ÷ÿ|àh�.�µOÿÌùÿó! ��?ÿ½ÿÿÿ4��)ø£ÿÿÈÿG¬�+�sêÿùØÿW¿�?��a +ãvÿëæÿnËW��K�Ê\ÿÕøÿÛc��0�«GÿÁÿÿíy� �£9þ¹ÿÿ¨ý*��*ô¨ÿÿ¹ÿ9ª�0�j çÿþÐÿVº�A��TÜÿòåÿrÊQ��H�ÇeÿãóÿÜi��:�·NÿÌÿÿëx�+�¥5ÿ³ÿÿªö.��&õ¡ÿÿÅÿ?�%�oèÿûÎÿN¹�9��\ Ù~ÿñÝÿaÍ�Q��GÉjÿäíÿ{Þg�6�¹Xÿ×üÿòz� ,�IÿÂÿÿ¬õ(��0ÿ¯ÿÿ½ÿA�"�~óÿøÒÿP²�/��g áÿñÙÿ_Ã�D��IÍoÿàêÿt×[��?�¼\ÿÚòÿít� +(�ªEÿÅÿÿú#��8ÿ¹ÿÿ¶ÿ=�"� (þÿÿÍÿM«�0�vïÿôáÿ\½�@��Z×pÿäçÿlÐR��D�½\ÿÙñÿÛ +a��.�IÿÊùÿï}�!�9ÿ´ÿÿ¦þ'��-÷©ÿÿ¾ÿC�(�wîÿÿÔÿ[¸�;��eâ}ÿïèÿnÈP��Q È~~}y }|swz~xt{y}~zts}} qxv txzxkxv~t |{|l|}z|| }z~uoy{ ~y~w{}t}}pt|yt |wwyur{v|}y{x|} y}txq }m|sm|uy x{|~w{y|~}zwww~z|zs}yy~xzy lz z{~|s|u|zyxxy|}{ zy~v{}yvk}yykzzn{ nzzuzevtx|r{{svz{v}pr}~{nzy yyx~zq} {t{xxy{{xmv}q}yyxxi{|qsyowzvyxtdB��9ÿ°ÿÿ³ý7��ùÿÿËÿG¥�,�qãÿ÷ÒÿX¿�C��RÓoÿäæÿrÓX��=�¼QÿÕôÿ år� "�¡IÿÄÿÿ÷"��6ü³ÿÿ·ÿ<£�& �}"òÿÿÑÿZ¼�?��gâÿõåÿpÌK��WÑfÿâðÿ{Û]��<�·LÿÎýÿèv�'�¥;ÿ¼ÿÿ¢÷'��$ô§ÿÿ¼ÿ9¤�(��kåÿýÆÿN¹�<��] Ø}ÿôÝÿeÒ�R��KÉkÿæñÿzée��;�µTÿÔÿÿñ"w� '�¡@ÿÀÿÿù2��'ÿÿÿÆÿG �' +�xíÿøÐÿTµ�4��_ÚxÿëÞÿiÊG��F�ÈiÿãèÿzÙb��6�¶UÿÒûÿò�#�AÿÂÿÿ¦ÿ.��1ú³ÿÿ¼ÿB§�) �}íÿÿÔÿWº�5�jà|ÿíãÿeÈ?��Q�Îaÿåéÿ|×[��<�¸PÿÓöÿév�'�£>ÿ¹ÿÿ¤ø*��2ø¤ÿÿ±ÿ.£�*�lêÿÿÇÿLµ�8��mßÿöàÿeÊ�L��WÒjÿæõÿ}ÖV��B�ÃXÿÑÿÿãl�.�¯>ÿºÿÿ¡ò&��0ý¬ÿÿ·ý4� �yìÿÿ¿ÿB¬�.��sàÿøÔÿYÅ�E��\ËvÿíåÿlÔb��BÃfÿÝòÿ ér�8�¶IÿÌÿÿï"|�(�£6ÿ·ÿÿ±ý6�� ÷ÿÿÂÿC¡�%�t åÿùÍÿc»�6��_ÕrÿìßÿhÎ�L��F�Âfÿãíÿvßk��3�°SÿËýÿô}�$�©CÿÁÿÿ«ú,��/ý°ÿÿ¼ÿ8�"�ôÿûÐÿN�)�hvrrqvw||{~o}~po}z}xs{|wp}}w} ys|~yx{|r|xwyw}zu} tyy~{m~swxx~{~m~zv |u~z}upku~xwz}j|t~xvvvzx{uu}u~yx}u{zx}{|yvy y |{z~y||zq{| z~}w {vs{fpl~~~wz}upvzw zt~m o~{}|tvwy v|v{x~t~~px}{w~z{{w xyq}}m~}yv}x{uz x }{}uvz {vwzwwq~kp~~}zwy zuyxxv qry{ p~mz}uuq|xz~sÿÇ.��kâÿÿÒÿYÇ�J��UÎpÿíëÿsÛd��B�¾_ÿÛþÿðs�0�®CÿÃÿÿ¢ô*��)ÿ¦ÿÿ»ÿ=��ðÿÿÆÿN¬�/��eÝÿï×ÿdÄ�A��JÎkÿáîÿxÒ�^��;�¼ZÿÏûÿïw� +(�§EÿÇÿÿ¡ÿ+� &�2þ²ÿÿ¹ÿC¢�'� #òÿüÐÿQ²�<��lêÿõÞÿeÇ�B��Y�ÔiÿÝôÿwÒV��<�¼YÿÛðÿäo�)�¦AÿÃÿÿó��:ÿ³ÿÿ°ÿ2��z%ò¢ÿÿÂÿP¶�6�oãÿûÙÿ^Ä�F��YÔwÿîêÿqÔc��D�Ê\ÿØùÿÞi��5�´MÿÈÿÿì!x�#�-ý²ÿÿ«ú*��#ô ÿÿ»ÿ9¦�)�tåÿÿÌÿT¼�;��d ÚÿóâÿhÍR��MÍnÿáöÿâg��B�½WÿÒÿÿî!u�0�¨<ÿÀÿÿ©ö.��$ü§ÿÿ¶ÿ@��{ìÿøÈÿG¨�3��cáÿ÷Ôÿ\Â�@��VÎrÿîåÿlÐ�]��@ÅbÿÜ÷ÿèj�0�¶QÿÌÿÿ ñ"{�%�£5ÿ¸ÿÿµü5��&ýÿÿÁþ9�%�wìÿôÓÿR°�0��^×yÿïÚÿ_Æ�D��IËoÿàëÿÝg��5�¼UÿÐ÷ÿ ñp� +/�´HÿÁÿÿ¬ü.��4ÿ³ÿÿÁü9� �$úÿÿÄÿB§�(�pè~ÿòÖÿX½�<��WÓzÿìßÿmÎP��@�¿eÿàíÿsãg�3�³KÿÊüÿõ� #�Cÿ¾ÿÿ©û-��+ù¬ÿÿ¿ÿ@¢�"�ðÿýÏÿS¹�"Phb}uzu zzru ~{}lzy| { }xr|zvw{}}p{u{}z|y{o|w~~x{~t~~}vzxy~xw~{~l}v|txw} u t}ul~vi zz{~x}z|{|zq~ty {v{{x|pq|~ms ||qy}u~y~w ~x~ ~~yf|~{~s~m|~v{z||z|sw{|z~l{ym~uw|yqz{{~i |qwrwsyps}w|zzssrx|q}xty}{wjv|vuq wypz~wpr}u|qr|~ nvt|~uy{{}}}~xy~ww z{xxxw|VrB�@ÿÅÿÿ«ú+��+þ«ÿÿÂÿJ¤�)�~óÿøÓÿW¹�7��fÞwÿéäÿgÇE��K�È`ÿÕõÿ}Úb��-�¬NÿËùÿîy� +�>ÿºÿÿªþ(��,÷¨ÿÿ¼ÿC�-�péÿþÒÿX½�?��Y +ØyÿðçÿpÔU��K�Êaÿ×ÿÿâr��8�ºPÿÃÿÿéx�+�¡6ÿ¯ÿÿ±÷0��#ó£ÿÿÀÿ:�&��kéÿøÐÿP¾�C��WØ~ÿðÞÿnÔS��G�Ã[ÿèñÿåk��1�½XÊ{w nz yyw swo }|~|}{u|~~z|uryuxzxrti}v} qrnoytwtss{w~y{xq{t{}v}~|x~~|s~yyrmxqsrtvv|{t~~yj}zl{mwwwtq{}w z|{r q{syx{s{ qt }}} ttqyuy}w~xu| ux|um|y jpw`|}zphz w p }y sx{{sk|s{zqz}tsqdn~}hx~zw{z|roq|t~}x ~nsrzl}yunstww}vhsdzwowhz{r{uzsxw}tpzkw{{vsr{~~}|{ u }lt s m¬�¯{ÿÿÖÿU¾�@�_ÚuÿçëÿtÖS��?�ÀZÿÞúÿèx�+�FÿÆÿÿ¤ÿ; �":�(ø©ÿÿ¼ÿ>�%�sîÿþ¿ÿL²�=��r%¹ÿîÝÿfÈ�E�e�Äfÿàðÿ|Å�a��2�±OÿÆØÿëv�!�?þ¹ÿÿ¦û)�&�$ñ¯ÿÿÁûDª�.�zçÿÿÒÿ]«�?��UÛuÿÛèÿpÑS��M£dÿÛøÿÜt�7�ºHÿÏÿð¨Ò.�(� 3ÿÁþÿ±þ9�#$÷ÿÿ½ÿCº0�méÿíÜÿW¾�=��Y Ën÷íæÿlÒW�T�ÂdÿßôÿØe� ,�¥PÿÊôÿô%{�%�Búºÿû´ù8�#�êÿÿÈúE�4lî ÿòÍÿ[ÌA��ZÏqÿëÃÿbÍR��CÄrÿÐòÿÚ i�6�²LÿÌ÷ÿèC� �=ÿÙÿ¢ÿ4��}/ä ÿÿÁÿ>¨�*�x#æÿþÙüc½�F��\ +åxÿïàÿp»U��MÉ\ÿ¼ðÿ|Ù_��3�½WÿÊûÿå<�Cÿ¿ÿþ©Ì1��)õÿÿ¶ÿ<¢�"�!îÿÿÔÿQ¹�6�`ÞÿîÖíLÐH��QÎíçóÿ×]�O�¾SÿÎÿÿã!h�*�¢Cÿ¸ÿÿô)u� !�4ñÿúÂòF�)�~ìÿüÆÿQ°�/�VßÿðÐÿZ±@��RÉtÿæÞÿjÕb��L · ëÖþÿæs� .�´MÿÇÿÿô=�!�=ÿþô ÿ7��'òÿÿ¾ÿH£�3�vßÿøÑÿb¸�:��fÕrÿááÿgÌ�O��IÅfÿåÙÿyåc��9µ]ÿÕüÿynawqx~ t}xyyo{o|uuvz |~h }s|lxwprzzy }kzvpxx~ztsyk ~vzwnz~x~t cv}udww }xv~p|x{}z~u{{wz~}~xb{|w}{s}{v~zy{~y|r| pwq {~mtzs~|u{d o~}g{~xm}or hr vx~xvs~ z |pros qy ~wt}|{xz}x{~}vo{~w{u ~}|m~~w {~ vy}{~vs}{|t{x|}wz~{ww }{v}v|~z{ |yu |z|w|} x tzy}s~wzt xk¢ÇÀôÿC²�6��dÜÿùÚÿbÎO��LÑnÿéïÿ|Ød�<�´VÿÕÿÿð{� ,�@ÿ¼ÿÿªÿ6��&ÿÿÿ¾ÿI¢�) +�vêÿøÑÿSµ�5��^ÖyÿîÚÿgË�K��C�ÀdÿÜîÿ|Þf��0�±MÿÒ÷ÿò� '�¡AÿÃÿÿ©ÿ-��,úÿÿÂÿ@¦�, �uîÿýØÿU´�>��^ ßvÿêìÿlÌK��N�ÉaÿÙôÿ Ú Y��5�µEÿÆüÿés��<ÿ·ÿÿ¦ú*��*ô¥ÿÿ¹ÿ7¥�)�v îÿÿÌÿP¼�>��cãÿùâÿeÌ�R��NÏnÿæòÿ}ã`��?�¼UÿÎÿÿèt�.�¬9ÿ»ÿÿ¥ñ%� �)ú©ÿÿ³ù2�!�xëÿýÄÿF°�/��eáÿöÔÿZÆ�G��UÏsÿíæÿoÙ^��H�Ãgÿãùÿçq�3�²KÿÈÿÿ¢ò%{� $�7ÿµÿÿ³ø2��øÿÿÃÿ<¢�%�qèÿòÔÿS·�8��T +ÔxÿíÜÿfË�M��C�Æhÿßðÿ{àf�9�²VÿÑÿÿñx� +*�¡CÿÅÿÿ§þ1��/ÿªÿÿÀÿ>� � ÷ÿüÏÿL²�3�i +à ÿîÛÿ]Á�@��Q�ÎpÿçäÿnÒ�W��<�º_ÿÞïÿ|æ q�-�±UÿËÿÿ÷�#�;ÿ»ÿÿ±ÿ6��,ü¥ÿÿÄÿJ¨�(�|óÿùÔÿV¶�:��eáxÿïÛÿmÊG��P�ËfÿáéÿuÕW��6�³TÿÒöÿçq�*� GÿÂÿÿû"��9ÿ¸ÿÿ°ÿ8�#�~%öÿÿÆÿJ¯�5�qæÿøäÿMYj}u{zx {vuvy|{y~ }}q}{z ty{ x~p|y|zy~ |w~~z{{wz {w{{xyt{x}rxm~ux{}ut{|{{z|r~{yz~ w{}|}zv}~~w}{ t ztr} {nzttzy y}u~~{ }|{~w}r{w}~~|v|zvry{{ } |{yvxrzx}qz{vz|vo{z}|r}|y|{ yyxt}||t}{yu{zty~w~m}~y{{| oyzt~s|r~}wxzr}|}yxx {|v~~ ~|u}t| ow ~w s~tzm`ÏU��`ÚÿõÕÿ^Æ�I��KÉmÿåéÿrÞc��=�»XÿØøÿów� "�¡EÿÄÿÿ©þ.��1þ¬ÿÿÅÿC�)�óÿûÔÿR·�5�dàwÿíãÿjÉM��O�ÐgÿÛñÿÖ +a��7�µSÿÇýÿçs��:ÿ¶ÿÿ¤û*��.õ¥ÿÿ¹ÿ;¨�,�s!ìÿÿÏÿU¾�@��bÞÿõáÿkÒN��QÏiÿæïÿÞc��A�ÅPÿÍÿÿéo�.�§8ÿ»ÿÿ§ô(� +�$÷¥ÿÿ·ÿ9�!�rêÿûÊÿN³�9��dÞÿòÝÿ\Ì�J��LËwÿçëÿwÚb��;�¾[ÿÛûÿçp�1�´IÿÅÿÿ¥÷+ � �1ÿÿÿ±ü3��öÿÿÃÿE¨�+��kæÿõÔÿ]¹�=��TÑsÿççÿlÒ�V��=�¼bÿÝñÿ|èp�,�NÿÎÿÿõ�(�¤;ÿ¼ÿÿ°ÿ2��)ú¤ÿÿÃÿC¥�&�zòÿøÑÿVµ�6��cÝ{ÿëâÿfÈ�G��K�ÆfÿÛïÿwÜ\��7�¶RÿÓõÿêt� +#�¤EÿÅÿÿü$��6ü±ÿÿ·ÿ9¢�$�$÷ ÿÿÎÿJ«�5�mìÿöÜÿ\½�@��\�ÚnÿçéÿlÉK��E�À_ÿ×óÿ|Þ`��.�«JÿÉúÿíz��:þºÿÿ§ÿ)��/ø°ÿÿ¹ÿ=¦�+�xðÿÿÐÿT¹�6�eâÿóáÿgÄH��[�Ølÿâðÿu× +Q��E�½VÿÓùÿãk��,�BÿÆÿÿï}� �:þ¹ÿÿ¬ÿ-��)ó¤ÿÿ¾ÿ?¬�.�sìÿÿÓÿXÀ�C��kD«}vjxyv}uyz }zov|t v{}}t}zw|z{zzrv} ~t{x {|~z|uz{}yzz}|r~utv{v| w xuux|~yxwzw|so~y~ {}|quwx{{pg}pgzq~xz|{wr|}}} v~xyr||uy~qt}v{~rw~|ys|qz|u v{ {|~zpzy { {~rxtmox}v|nxxmlzx|zwv}t{}wv|z|}}~zr}uzzzu}~v|xvrx}p|~|xy}{y}ry{|}y |~y{}{ szv| px~|j~r~~q{{qy ~|qu{Yka�aîÿüÉÿS¹�@��` ÕpÿëàÿfÒ�U��F�Á_ÿÜñÿço�0�±QÿÎÿÿü"�"�;ÿ»ÿÿµÿ8�#�"óÿÿÎÿM³�/�oåÿõÚÿ_ÃE��W�×jÿâðÿwÑZ��C�ÄUÿÓøÿän��'�¥Aÿ¾ÿÿ£ñ#��2úªÿÿ®ÿ5�%�{éÿÿÊÿI¶�8��bÝÿøÛÿ`Î�J��RÒtÿèîÿwÝ[��=�¼XÿÕþÿèv� ,�¥>ÿ½ÿÿªô(}��*ý«ÿÿ»ÿ?��|ïÿúÌÿP±�0��c ÚÿðÛÿZÉ�H��NÏiÿàêÿoÙ\��;�»UÿØöÿèu� ,�ªDÿÇÿÿ¦ø&��3ý²ÿÿ»ÿ9��}õÿÿÎÿO°�.�mèÿñáÿgÀ�B��V�ÏpÿâëÿxÐS��=�¿ZÿÎ÷ÿãj�%�§GÿÆýÿõ��=ÿºÿÿ³ÿ3�#�&ó¤ÿÿÇÿH´�5�méÿûØÿ`À�E��[ßvÿééÿwÓ +X��M�ÊZÿØ÷ÿàg��3�¯EÿÅÿÿëx��5ÿ±ÿÿªø(��*ó ÿÿºÿ:¦�)�rèÿüÎÿO¾�>��`Ù{ÿôãÿjÍT��QÎkÿæöÿÝ]��@�¹MÿËÿÿêt�-�©Aÿ½ÿÿ£ö-��'û§ÿÿ¸ÿ:� �tèÿüÉÿJ±�2��eÝÿöÖÿXÆ�G��PÑvÿñäÿtÚZ��E�¿]ÿßûÿèo�4�°LÿÉÿÿ¡ó(� �5ÿ¯ÿÿ²ü7��"ùÿþÇÿB£�&�råÿõÓÿW¸�9��XØwÿêßÿaÌ�P��=�Ícæks| w~ ~{sz|st~ywu|z}|}|s}{{z|}}~zys~v}vw|}{yu~pvyr yv{ztr xy{ tz{}|}|vv{|w|w}{xx}p}|y{~|zvy}|yv xy|vwxxw{zv| }}zyz{~s}~ }z vyy{zs|~}zw~w~zu{ty{z~p}y~}||r}vy{w}rv{~u{ur|t|}zyr~ww~u|y}u |ww{}~wzw|wrwx{}qyz~x~}{|{}sz}xzw|z||~~vxx{|~z~yw~ry}ux~~|rxr{u}xx{w{}~~qu{rH�gEÿÍÿÿ÷"�!�8ÿ²ÿÿµÿ6��#õ ÿÿÉÿN¯�3�kçÿóàÿaÃ�@��U�ÕlÿäéÿvÕR��@�¼MÿÑöÿåo�%�¦@ÿ¼ÿÿ¨õ#��0ø¯ÿÿ¹ÿ7£�&�tçÿÿÉÿD·�>��]ÙÿùÜÿiÌ�M��PÌoÿéòÿ}Ýf��<�·SÿÑÿÿêy�(�¡8ÿ¹ÿÿ¬ø0��#ú¢ÿÿ½ý< �"�{ëÿùÐÿR´�6��[ÖyÿíÙÿdÊ�I��LÉeÿßìÿ|Üd��;�³XÿØøÿñw� +$�GÿÄÿÿ¥ÿ-��3ÿ¯ÿÿ¼ÿ=�& �öÿþÏÿP�1�qæ~ÿñÙÿbÄ>��Z�ÑgÿäèÿvÖW��>�¼YÿÔõÿãk�,�«IÿÇÿÿ÷��9ÿ·ÿÿ«ÿ3�#�)÷§ÿÿÃÿH«�- +�yìÿûÞÿYÁ�?��bÚuÿëæÿiÌK��L�É`ÿàìÿÛb��8�µJÿÐøÿìo�&�>ÿ¿ÿÿ¢ü'��.÷³ÿÿµÿ>¦�& �y#ðÿÿÍÿN°�6�eâ ÿöâÿfÅ�F��WÔmÿäóÿ}Ñ S��D�ÄUÿÕùÿàm��.�©BÿÁÿÿ£ó({� +�/û±ÿÿý4�� &òÿÿ¿ÿ?«�3��qëÿÿÒÿP¿�A��W×ÿõâÿhÎK��NËfÿá÷ÿáa��<�ÂTÿÐÿÿét�-�«9ÿºÿÿ§ñ'� �.ú°ÿÿ´ÿ6��zïÿÿÄÿC®�3��dáÿúÕÿYÃ�I��] ÕxÿðçÿqÛW��J�Áhÿßöÿæc�7�´KÿËÿÿì z� (�§/ÿÆÿ©¦ny {z yiw~}u~{{~tuzzvy xz{ {yyzt~|yxxwx}zxvz}y{yv~t~tyxx~{{{} v{z ~wtrywzxxxo{ w{}v~vyy}r~zyr~}u{ ~y zx{~}wq}~vx~y{ yw| z w|~yv~x|zyv~ywz {s{{zvz}|w~yzov|}w|yx}t}}|| srz||u{zov y}r~|}|}{z|y~x{~ t~z r{| u}x} ytvz}w w|rv{s}wuyxyy|zz|{zws~ }w}zwyy}}|~~zzcyzu~zyhO�_þ ÿÿÀÿB¢�&��hßÿõÒÿQ¾�A��RÐuÿççÿo×�Y��?�ÃcÿÛõÿîq�/�³MÿÍÿÿ¡ø$�$�9ÿ·ÿÿºÿ;�#�%ø£ÿÿÈÿQ´�5�lèÿòÝÿa»�?��]�ÔrÿãçÿqÎT��@�¼[ÿÒõÿæj��*�¥GÿÃþÿó ��3ü¯ÿÿ¶ÿ3��ìÿÿÄÿM³�1�oèÿþÚÿaÄ�E��Y×rÿìëÿwÐY��J�Ä^ÿ×üÿáf��6�°CÿÀÿÿñ${��§@Ãl{~{x}~ps|y|xv|~|o}tyyzst{ xzp|z y}zrzyu w|{}yzrx~xy~z ty{vsq| zztwn~{x~s~|zsw}{|}uw} yvvw|un|us}n}ryv~~ {w~l ~y~z~|}uw}}}n w~yz~|{wpyphz}|yjp}~p z}~rq~uew~ow~~yslt}uzx~ytl|}~z|qz{wz~yz~} ~x}v } ~}v|ut{xzux}{ptw|dzsy~{mw~|x{nx}s{zq |t{ov||yzkzvyx}~yntx y«=ôßõÿsÒ P��I�ÇUÿÖúÿâj��1�«@ÿÀÿÿñ'��+û«ÿÿµü.� �x"ìÿþÄÿB¯�2��gÝÿø×ÿ\Í�K��PÎqÿíêÿyÚd��>�»^ÿÛüÿêr�2�¬HÿÄÿÿ¤õ*��,ÿ«ÿÿ½ÿ>��õÿüÍÿN±�5��eÞzÿìÞÿcÈ�G��J�ËdÿÞêÿtÖ]��7�ºSÿÑùÿíx�%�?ÿ¿ÿÿ£ÿ$��2ùÿÿ¾ÿ=§�* +�w îÿþÑÿV»�=��g â|ÿñçÿgÈP��P�ËcÿÞõÿÛ]��<�¹GÿËþÿço�&�6ÿ¸ÿÿ£ø*��.ö¥ÿÿ¹ÿ=¤�(�rêÿýÊÿMº�>��]Ù|ÿõÞÿjÑ�T��JÇmÿçòÿ âj�6�·[ÿÒÿÿô${�'�¨<ÿ·ÿÿ¯ù1��&ÿ¥ÿÿÁÿC¥�" +�zíÿþÉÿK±�4��[Ý}ÿñ×ÿfÄ�J��K�ÊjÿèéÿxÞf��5�²WÿÖøÿòy� +&�©@ÿÂÿÿ¥û*��1ý®ÿÿºÿ=¥�( �x óÿûÓÿO´�0�l +åzÿðÞÿcÅ�?��U�ÌhÿáéÿvÓ T��;�ºWÿÖñÿàk�(�CÿÀÿÿ÷ ��5û±ÿÿ¯ÿ4�"�}$ð ÿÿÊÿK®�1�nëÿüÞÿaÈ�F��_ÜuÿêêÿqÒ +U��H�Å`ÿ×úÿ åi��4�¯KÿÇÿÿìv��6ÿ¯ÿÿ©ü.��&ó¤ÿÿ·ÿ:«�-�oçÿÿËÿS¿�A��eÜ~ÿ÷âÿgÍQ��PÑkÿäôÿ}â`��?�½RÿÎÿÿæt��2�ª:ÿ´ÿÿ¡®h{yyx}t|{{uy ~suvnu}tzzvs~|t|~|x~rq}u{}{s}|xxuw~s~x syyy{vw{xr}{z~wz }v}u~ss w{~ov|~}y t|uo y~|| t|wxyohywr}y~|n~uzy|{{}s|wqyou}}~xrtw| surwyxy}}s|x~ } p|zvrp r~}t{{~s~t{n{| {xz w yu~o{}xy~z~~ ynzl|y z~~~sxr ywzwx ~y~y}{p{r vzzvxy|~~~|ztu ~ vzvs{| ~lq{|va~): �¨JÿÁÿÿý$��2ÿ±ÿÿ¼ÿ;�* �}îÿÿÑÿT¶�4�f Þ|ÿðçÿmÉP��P�ÔdÿÛöÿÙ\��9�¶MÿÎüÿëv�"�5ÿ³ÿÿ¬û0��#ó¥ÿÿ»ÿ?§�.��måÿýÎÿOÀ�F��RÐyÿìåÿj×[��B�ÃcÿÝøÿçv�1�±JÿÊÿÿï#�%�¡;ÿ¶ÿÿ·ÿ7��"÷ÿÿÃÿI¬�.�mçÿòÚÿ_»�:��XÑoÿååÿhÌ�T��=�»`ÿÕöÿæl�)�§IÿÈÿÿø��8û´ÿÿ¯ÿ1�"�'ô ÿÿÊÿK°�1�jèÿøÛÿaÃE��YÙpÿèéÿrÑ\��E�Å[ÿÖöÿãj��5�®KÿÀÿÿïx� +�1û¶ÿÿ¯ý1��{$ïÿÿÀÿ<«�2��kæÿù×ÿYÄ�@��V +Õ{ÿòèÿsÒY��LÊdÿÜûÿßd�6�µHÿÈÿÿí!{�(�6ÿ¶ÿÿ®÷/��(ø ÿÿ¿ÿ?¥�'�kçÿúÏÿTÀ�>��YÖ}ÿíáÿiÎ�R��KÇhÿàïÿyál�7�¶UÿÎÿÿéz�#�Cÿ¿ÿÿ®ù.��,ÿ¦ÿÿÁÿE �(�}ñÿùÎÿP´�1��h ßzÿïÜÿ`Ã�D��K�ÈcÿÛìÿqÖ]��:�»Rÿ×õÿé{�,�¨KÿÆÿÿù"�#�:ÿ´ÿÿ¶ÿ8�#�'ûÿÿÉÿO�3�pêÿõÛÿdÀ�C��\�×nÿãìÿtÒN��C�ÅZÿÓõÿàc��*�²KÿÈþÿò|� �5ýµÿÿ§ÿ)��+ö¢ÿÿ¿ÿ>¬�1�r(é}s| y~x~rs{z}qz{|y}k~rxvxvxzvv~~wunz} }}xz}u{ | ~| s y}t~z ivzryr}uqws{}y|x{~xsfu}ri}{|v{ztz}yv}bsy}u|x~zw|{}{{~v}v{}}xw|sy}wv {}||~y~u s w{~y~yv|{y{}}{yu |w|{ {x x| zy~q~|}x}}}w{ z~~|w~|~| }t|xx|my}z~np{vwzzwqy}u qxr qytws~xwv}~u~}t|wxvy { |zwxvswo k +tã¾ÿÿú*��)õªÿÿ¾ÿBª�.�wäÿÿÑÿQ½�>��dÚ}ÿôèÿsÑR��J�È`ÿÞýÿål�4�·KÿÊÿÿó&� +!�0ÿ®ÿÿû6��!õÿþÂÿC¢�(��lãÿ÷ÒÿUÀ�A��[ÐpÿèãÿkÕW��<ÃgÿÞðÿék�2�GÿÊÿÿù# �!�8þ¼ÿÿ²þ1��'ø¢ÿÿÉÿE¨�(�tñÿõÙÿb¼�;��`�ÙxÿðÚÿmÍL��A�·\ÿØñÿÜg��3�Zÿ¨z|} {vz|}}~iup}}~ozw{pzp}|yquu}z uhoyx ou}uroitw{u|x ~u|{|{vl~|s{y{ {~sp} gfv|~z zm|{o~~lvm|{zh~xu{za{_u}jvtyzudvwo|ttvx|n}~ }u}||oz~cq}rz|}xlryvlswwz{wp{x ~ syut|{{u|zx|yx y{o}{ mvz z}~x |}xghx}fzt|~tt q{tv~s}`u ~|uy{vyy|{{sx}}tz~x{qvz~t}yz|v|w{zemr r~srt{}e}z~n{yLnÿèåÿkÔ `��A�ÁSãÕúÿäe�)H�±8ÿ¼ÿÿÖ=n��.ü¢ýûÿ;� �v?×ÿúÎÿM¶�Z��[Ö}ÿù×ÿnÀR��I ÊcÿÓÙÿái�7±UÿÌóÿî� 7�Qê¿ÿÿ©÷,�B!�*ü¤ÿÿ¿ßQ�' �ówÿåÎÿVº�5��a6àoÿíàÿhÎn�C�ÃjÿäèÿÝa�5�±YÿÏøÿêv��>ÿ¿ÿÿ§þ*��1óÿú»ÿ>¦�!�#áÿÿÜÿ_³�?�hà~ÿòàÿm¼ J��E�Â_ÿÓîÿzÙP�4�¹ZÿÌ÷ÿuçq� �©6ݶùÿªò0�&�¥&ï±ÿÿ·ú=|�+�|#îÿûÎÿK¹�8��`ÙÿùÞÿhÇ�Y�bÍqÿéðÿË_�H�¹]ÿÇøÿð x�+�©Kÿ¾ÿÿ®ñ"�$�@ÿ®ÿÿ´÷9��ì¦ÿüÃÿV±�-��jé~ÿÛªÿ\º�@��O%ÞpÿêãÿlÍ�uN�¸eÿáõÿÜj��<�³Kÿ¼þÿô"|�& 8ÿ·ÿÿ¯ü8��5û¥ÿûÇÿL�/�sßÿ÷Íÿ_°�9��hÙlÿäáÿbÁ�@��CµpÿâêÿwÝ7�¸QÿÙýÿ~ì{�.�«;ÿ¶ÿÿ¥ô)��4ÿ®ÿÿ²ÿ>§$� $óÿóÔÿO«�0�iÞÿñÚÿ_½�I�[ÕeÿßäÿoÓQ�C ÁTÿÊîÿyê��*�¦TÿÏÿèö� +1�WëÁÿÿ®ÿ8�2')ü©ÿÿÁÿD®�( +�}íÿåÛÿP´�:��gÇsÿíäÿiÄ�M��T�ËnÿäåÿxÜX��A�¶[ÿ¢´t}xp}swo{}{ru¡||}j|rswy~xooy ztv o}q{wzy}y v|| {z{} u}y|x{|~ }||u| uztx{oxm{ x|~p{|} }r uzz|yr~ {yo||}~~y ~}xy~t}~x|yw|x{|ww}tx} y|qy ~xy}z||{}}}u~{|w~xvq|qv}~z{~~{~ {xx{v ztv~uw}}{yv{~hvx}y~~{uy |{|zxs||tu}}~z}mv}yyxz}y~x}y{zy{u~v~xz~~pz w~~uwy~uv|~x|k¥ÉûÿE�!�nåÿøÏÿT·�=��W×xÿëáÿvÑ�S��A�ÂeÿÙõÿé +m�+�«NÿÉÿÿý#��6ÿ¶ÿÿ·ÿ9�"�'ø¡ÿÿÍÿL±�2�géÿôßÿeÆF��V�×jÿæëÿ{Ûd��=�¾SÿÍüÿãq�'�¢Dÿ¼ÿÿ£ô%��)õ¤ÿÿ¸ÿ4�&�tëÿüÌÿH»�:��_ ÖÿóÞÿeÒ�Q��SÎmÿçðÿâd��@�»Wÿ×ÿÿñ"|� )�ª@ÿºÿÿ÷-��%þ ÿÿ¼ëR} |yyuyxzjx{y}~~yv{y~~ou|tsq{y~o~}wzt|xv{|zo { ~}p tv~u| z~~}z}xq|~yw}nl {~{pp| r~~vr uv~~z yx yq{{yn|}x||||tvys~z|s ~ w~v~v~~~pxrxzsz| kzv{ yz~u~~l{s|qz uxiy~oz{{z{~yy}|ux|sxt{s|wy}x|s||| zzxv}woo|tyv~|s{ww}}|w}z}rs}o~}rwv{x|~ouw}p}{vxxr}}~~v~ys|vrw|~}|~ww }x{}XvÉ/j��] ÛzÿëÞÿbÌ�P��B�ºVÿÜíÿ{ßf��5�ªIÿÈýÿð��=ýÿÿ®ÿ.�#�~(ö¡ÿÿÈÿO³�;��läÿøàÿ^Ë�I��]ÖlÿäöÿÜ[��>�ÀRÿÊÿÿèq�+�«=ÿºÿÿªõ*��&ø¤ÿÿ¸ÿ8�$�sêÿ÷ÐÿO³�9��X +ÖvÿíÝÿcË�Q��D�¿cÿãëÿvåh�4�®SÿÌþÿö�%�¢@ÿ»ÿÿ²ÿ6��)ú¨ÿÿÃÿH©�-�wïÿõÙÿ]¾�:��aÝlÿèãÿoÒ L��M�ÅVÿØñÿ ß_��/�ªMÿÉýÿï{� �9ÿ´ÿÿ¤þ)��%óÿÿÀÿC�/�mêÿÿÕÿXÂ�A��Z Ôyÿïêÿs× Q��K�Ì`ÿØùÿàd��8�·FÿÇÿÿí!|� �4ÿµÿÿ²ü3��&õ£ÿÿ¾ÿB£�+��iäÿûÐÿW»�>��[×wÿëåÿiÓ�T��G�ÁeÿÝöÿæ p�5�°NÿÓÿÿô"}�#�9ÿ·ÿÿ¸ý4��(ÿ¡ÿÿÁÿI«�(�wëÿøÐÿY²�4��^ÚvÿìàÿmÌ�Q��D�ÃeÿÚðÿvßd��6�³QÿÍüÿò �"�¢?ÿÀÿÿ¥ÿ+��*õ«ÿÿÄÿE¨�)�íÿþÕÿPµ�8�a +â{ÿíãÿjËL��S�Ñ_ÿÝñÿ}ØZ��<�¶PÿÎýÿêp�!�@ÿ¸ÿÿ ù&��.÷©ÿÿºÿ8¤�)�w ìÿÿÌÿM¸�<��aàÿùßÿeÏK��UÏnÿèòÿy×b��D�ÃTÿÔýÿèt��/�©=ÿ¾ÿÿ¢ò(��Kxqgzv{z xeqry}yl wuv~ wv~~ y|y {~|z{}nr}s~ow~xxxywxu}u{~wpzwt|s|~yu}v{|tw}ttuxyt|x~ wvx}|vuxvztu|s{p}mv n}yx|| wzwz}w |vnqx}~{u|zuxxw ~}x~~ v|wxp~wvw}~ y nyssy {i}p~r}q{y{ }} {xs|{{||z}v~xz}uzzq{x~v{~v t}||iy{xs q{zyuvw|}~}{xrzv|zxy{}y{{~}wu}~{zxq|u t{ {~}}s£.�ÿôÑÿXº�H��RÐmÿàèÿjÓU��>�º[ÿÕñÿã k�(�¤HÿÅÿÿù��/ö¯ÿÿ¶ÿ9£�& �x"íÿÿÎÿP°�9��iåÿôàÿ`ÇK��UÍkÿãòÿyÚ_��>�½OÿÐýÿån��+�¦:ÿºÿÿ§õ* ��)ú¨ÿÿ¹ÿ7� �yìÿûÍÿH¶�5��dÜ}ÿ÷Øÿ[É�J��TÐtÿîêÿ|Ý +X��C�µXÿÚûÿëv�2�¯GÿÅÿÿ¬õ,��0ÿ±ÿÿ·ÿ?�� ôÿÿÇÿH£�-�ißÿòÖÿYÀ�>��OÓuÿéäÿoÒ�W��<�ºaÿßòÿèp�7�´WÿÓÿÿû"�!�¡7ÿµÿÿ²ÿ9��(ÿ£ÿÿÆÿH¦�/�xîÿöØÿU±�:��ZØyÿèãÿlÌ�J��E�ÇfÿÝìÿ~Ø^��4�°TÿÏùÿíz�"�<ÿ¼ÿÿ£ý)��2û±ÿÿ´ÿ=¤�) �z ñÿÿÖÿT²�4�låÿóàÿeÁ�I��W�ÐeÿÞêÿsÖR��>�¸Xÿ×òÿáo��+�©IÿËýÿô ��2úÿÿÿ+��(ô«ÿÿÀÿD¬�3�rëÿÿÚÿ_Ã�H��cÞ{ÿïìÿfÌN��J�ÊZÿÝïÿ{ÔY��1�²GÿÈÿÿèq��&�£?ÿ¼ÿÿªö)��)öªÿÿ´ÿ6 �%�v íÿÿÄÿMº�9��såÿÿÛÿ`É�M��ZÒwÿëíÿnØ +X��I�Ã]ÿ×ýÿâe��:�¸FÿÈÿÿï �#�8ÿ´ÿÿ®ù-� �(õ£ÿÿ¸ÿ8�,��néÿûÎÿK·�:��`Ýÿ¼Ælwv|}y~{wsxukx}y|v{{vzy ppzuy{xvw~}v}yi~}ypw x|zyu y}xy{{yy{tszroyzy||q}~p|{vzvyslytyu|zx}|p z~zv}y~tu||r{} ~ uwyyysv|y~}||| {}|}z|yu{p||y~n}}y rtzx ~~~yx}|t}~x {x~~ ysy|y x~ }v|t~ uw}|}o}{w ~~ {t{~yzyztqvz{{ltz}u~z~{~x{ ty~ || ys~vww| | y{{ yy|~qxyz~{yxumyyhVô3C��cÚyÿêêÿnÕT��K�Æ\ÿÙóÿáf��5�°AÿÃÿÿ£íz� �2ü¶ÿÿ¯ÿ1� �{'ðÿÿÄÿH®�4��gáÿüÓÿXÇ�E��]ÒzÿñèÿqÛ_��E�Â`ÿÚüÿêq�/�¯FÿÁÿÿ£ñ%��.ÿ¬ÿÿ¶û6��ñÿýÅÿH§�%�iãÿôØÿ\¼�?��S�ÎnÿéåÿpÒ�W��?�¹bÿÚöÿ è r�/�¬NÿÌÿÿ û$� �3ûµÿÿ¸ÿ:� � $ö¡ÿÿÉÿR«�Gwow}w|{~~rz|wys{}qv~ ~t{zv{}x{uvqu{ytyv{p|z}j~zzpyzz~||i~wz~yz {~v}zs{x||vt}{vy}||u~~vwx{usx}zxrzm zv||kmyw{} |vu z}{zuz } x| ~v|stvq }{}|rqzv|}yyuwy~{~x{twzx|zvx ~s{ w~}{{|{w}{~{{|u}~}|{zuwwxu{v} ~x| |zy}y{w| |}x|| {x~szr}|~~t{xzyv}y }|yzt~}v{v}y {xux {p}al½H��v"íÿÿÉÿK·�;��ZÝÿôÝÿ`Í�P��MÇiÿäñÿ|àf�3�±QÿÖÿÿô"�"�£:ÿµÿÿºý5�%�&ûÿÿÅÿD³�5�pèÿô×ÿ^¾�A��V�ÔjÿææÿtÏY��8�½XÿÒöÿål��(�¡Iÿ¾ÿÿö��6ú°ÿÿ±ÿ/�% +�|!ïÿÿÈÿH·�<�kßÿöÞÿcÏI��OÎpÿæòÿÞ\��C�ÂWÿÑÿÿém�-�°?ÿ¾ÿÿ¦ñ)��)úÿÿ¶þ8� �yíÿþÈÿH²�5��fÛÿóÚÿcÊ�I��NÊmÿêçÿoãg��7�¶[ÿÔûÿòs�*�ªCÿÂÿÿ¨ø+��1ÿ®ÿÿ¿ÿ:¡�$�óÿûÏÿN¯�1��h â{ÿîÝÿdÁ�D��N�ÎcÿßîÿyÔZ��7�¹WÿÒöÿèq�(�§FÿÀÿÿû"��3û±ÿÿ¹ÿ8£�%�!îÿÿÌÿL´�5�mçÿõßÿ`ÃE��U�ØjÿçëÿtÑ +T��H�ÃYÿÕøÿäj��.�¨FÿÂÿÿñz� +�5üµÿÿ«ÿ,� +�'ñ¢ÿÿ¿ÿ@±�0�oäÿÿÓÿZÈ�C��Z×uÿîìÿlÏZ��L�Æ_ÿÜøÿßk�6�¹JÿÊÿÿév�'�¡7ÿµÿÿú3��&÷ ÿÿ¾ÿ@¦�(�tæÿüÌÿM¸�?��^ÕÿïßÿaÔ�O��NÉgÿæïÿzÞj��=�¿ZÿÓÿÿës�/�¯GÿÀÿÿ®ø.�!�,ÿ¥ÿÿ¸ÿ:��~ïÿýÇÿO±�0��dßÿñÚÿ^¿�B��QÎpÿçæÿrÙ�Z��Hd z{z{r y~ }x}xw}}yvux|~x~t rxu{v}y} yx{{{~}|}w q |{} zt {~wx}tz|y~z~x}}{}xw{}|~{|}vu|{w}xyv}{v|y{~w }{}w} zrvzoxzy|{u}}|q }~z~ tx wzy{pyl~{~uw~{|~ty~ q}yy~}~z~q|}xwz{~ |~t{}} {z{tr{y}{||~{w{}{pyxwmt{ ~w~xy}|yzxuzwy}|~{}{}|x{z|o~w |y r}||xzw~z|~v~u}hs| :�ÝpÿßóÿyØ _��A�ÂMÿÐýÿén�*�¦;ÿµÿÿ¤õ(��"õÿÿ¸ÿ7�$�réÿùÐÿS¼�=��]ÛyÿðàÿfÕ�S��KÃeÿÞóÿëq�1�²MÿÏÿÿö#�%�¢;ÿ·ÿÿµÿ3��%üÿÿËÿGª�+�rìÿôØÿ]¿�>��Z�ÓlÿèãÿkÊ�O��A�¾^ÿÖòÿß h��3�LÿÅýÿò|� �:ÿ»ÿÿªÿ-��'ò¨ÿÿÄÿDª�+ �qïÿüØÿ\¿�@��ZÝuÿêëÿqÌM��O�Ê^ÿÚøÿà`��<�µGÿÆÿÿèt�#�:ÿ¶ÿÿ£û-��,õÿÿ¶ÿ;£�(�tçÿÿÍÿO»�<��_ßÿóàÿhÇ�H��TÏjÿäôÿØ ^��=�¹VÿÐÿÿær�.�®Cÿ¿ÿÿð#��'þ«ÿÿ·ý9� +�yïÿüÉÿI«�0��i ÜÿõÙÿYÄ�J��Q +ÐwÿíãÿlÖY��C�Ä^ÿÞõÿåq�7�²OÿÌÿÿñ# �'�¤:ÿ´ÿÿ¯ý5�� üÿÿ¸ÿB�+�néÿøÐÿP²�4��Z×yÿíãÿcÇ�M��EÅpÿãêÿvÞb��=�·VÿÔüÿîy�/�©HÿÄÿÿªø)��3ÿÿÿ¼ÿ;��öÿþÍÿJª�/�pæÿôÔÿ^º�<��X�ÏqÿäçÿlÑS��?�¹aÿÜðÿ|äj��0�²OÿÊüÿñ�"� ?ÿ»ÿÿªÿ1��1ÿ¨ÿÿÂÿG§�)�{ôÿúÖÿY´�2�já}ÿòÞÿcÄ�F��R�ÌhÿÞíÿpÔZ��.�Ãh²{w~}tsx |~}}x yv~}}vr | jzuyw|t~~|{}tsxo yvv}}yzwuz t| {z{y{}{ z}}zz|u}yw}}xvz{}{}uzyr y}t{y{|| y~|{~}oy zyt~| ~zz xu{|w}{~xz{~ym xuzz~xq py|z~~xy~~uzu|}~y||}|x}{swf~||qq| { swz s}qz|w~uk|x v {{xxz|pu||~x{ t|}rztx}xyyu ry~xsx s~x sv}s|~xwz~{is}}z)^�hÿæðÿàe�6�¶QÿÌÿÿì!y� '�6ÿ´ÿÿ®ù0�� øÿÿÅÿF¥�&�rëÿøÎÿU¹�8��WÒuÿêãÿhÍ�U��B�¾aÿØóÿ~åh�.�¦NÿËþÿõw� �8þ¿ÿÿ¬ÿ0�!�%õÿÿÊÿH°�/�yìÿúÛÿaÅ@��aárÿçèÿqÈJ��H�ÇXÿÔùÿÞc��0�«KÿÆüÿîz� �6ý¹ÿÿªý-��'ï¤ÿÿµÿ9«�-�yäÿþÕÿRÁ�=��Tê`Øvj |z}{w ztxut n} x vw~yxo||x~vvzz}zr~|zq zztxz~ |~{~y x~t}w l}{xsytx~|jt uyy|rtzz{w}w|~k{xw z} sy{~y|}{~}y} z|yo{s}t~ ||}x}yjp{|}~ ~|y~yzu|z ~y~~{m u|y~|x wv{pnw}szzu|x{g {zwl{| ~}o|~{ztpvty }uv|uw~y{r} |vx~~zu{z}} v|oxxyu|}vy}y|lbzzz| }k}~fplw½C³��@ÿÅÿÿ¨ÿ/��.ú«ÿÿÂÿE¦�2�|ðÿûÚÿ_¿�=��^ÜyÿêèÿrÓ +P��M�ËYÿÕöÿÜa��3�¬JÿÄÿÿîy��3ü®ÿÿªû)��y%ð¬ÿÿÂÿB±�3��aâÿüÔÿ[Î�Q��U ÒqÿïèÿwÞ _��D�»ZÿÝýÿçq�1�¬IÿÉÿÿ«÷(��*ÿ©ÿÿÀû;¨�$�}ïÿøÐÿQ®�1��b Þ}ÿîÝÿ_Å�I��M�ÎdÿÜîÿyØ]��5�³LÿËúÿì{� +#�>ÿ¿ÿÿ¦ÿ)��+÷ªÿÿ¼ÿ@£�+ �xîÿÿÔÿR�?��g +Ü|ÿðéÿhÍL��SÑbÿÜöÿÖa��=�¾MÿÏùÿçu�%�¡7ÿ¼ÿÿ¦ø-��/ø¥ÿÿ¼ÿ9 �'�räÿÿÉÿM¶�?��]ÝÿûÛÿdË�O��UÑlÿéêÿ{Û a��C�¿ZÿÔÿÿçq�'�¨>ÿ½ÿÿ¨ò'��'ý§ÿÿ¼ü6� �vêÿ÷ÌÿM®�2��aÕ~ÿóØÿ^Ä�G��RÐnÿæêÿpÚ\��<�¹[ÿÕøÿð{� +*�£FÿÉÿÿ£÷)��3ÿ²ÿÿ»ÿ?�� !öÿÿÎÿL´�5�mçÿóÖÿ_½�>��U�ÒdÿäæÿqÑT��A�Â[ÿÒ÷ÿãh�)�Iÿ¾þÿõ��:ÿ¸ÿÿªÿ1�!�,ù§ÿÿÇÿG�.�rïÿûÕÿY¹�?��`ÝsÿïÞÿgËS��K�È\ÿÙôÿÝn��3�¯LÿÃÿÿìy� �=ÿ²ÿÿ©û)��)ô£ÿÿ·ÿ:«�0��qéÿÿËÿQÀ�2�]uru{wx~xos~x}{}w|w||~o{z v|xxz|t~{yx}xymp|tx |~zyy|¤tzvu|v|x{w|z{|tww~u~x{~|~z zu|||y}r}}~u{xtu} ~ { y}|uz {fv| { |w|yut{}r}}swvo{uxxqxx{zvkuws ~|t||n{} zr~z ypn{kzu|}~yyw|t yz|¢{|{~}yyl¢r pjxw} yqut{f qv§otl~fx ~}~s}bx|~vv}v~uzvt{u| w~|uwFÁHäûêÿiÀD�QÎ^ÿÞóÿsák��2�ÃLÿÃøÿìj�)� =ù¸ÿÿ¹î;��êüÿ¼ÿ>�0�våÿñÍÿX¥?��WÐzÿÎåømÞ]��N�¹UÿÝþÿçw�)-�«IÿÇÿÿ ô:��3ÿ¢ÿÿ²ÿ@��|=äÿÿ¿ÿG¬�F�h +Ýyÿö×ýcº�F��GÑjÿÙÞÿyÛW��8·RÿÖÞÿêx� +/�?úÇÿÿ¡ø�:�2ý³ÿÿ¹þ[ �(�z$ôyÿ÷ÈÿT³�.�r1é~ql{~y~y{yv}zt~i yush}ozh{ug}ntn }zw~u]wjm wzxy{gz`jvtsxt{q|{~f zzvv} {}su}ts{x||wzvz evquqz tui~v hnzzz }zw yzsur}{~tv gvy|xr~{{conv}{xp}qq yy }~|uuwp~uuz}wwy zo{lnw|bv~~}yzzxxkzl}}|yy]~ w hv|u}p}r{}yt}~|wtrw y| vy|u n}~ xvt nsyty~zt{qxxt{|}{vykOÔ«ýÿ§ä,x� +.�®:ýªÞÿ©ó)��0ÿ¤ÿÿ»ÿ< '�uôÿ䨸_¹�6��^ÖyÿêâÿkÈ�P�N�ÁRÿÌêÿÒ_� ++¸KÿÄôÿõq� �Jù¾ÿÿü(��:é»ÿÿÆÿM©�9eèÿ÷Üÿ\µ�?��`ÑwÿâÌÿfÕ T��J�ÃdÿÖùÿÜh�4�¯EÿÁÿÿç(x��;ÿ°ÿÿû-��,÷ÿ÷Ñÿ?¦�*�bæÿùÓÿUÃ�B��U +Òsÿôâÿtº^��G�Ä\ÿÜöÿr~{~||}}|y~~ {z{} z~ztuq~v v|u{x}{w}xwx {yzz w{z{xx~z~|k{ y{x~ rz{v tuxjz yxx}q~|~~ww|y~ qy w}ry|{}tz |~x } }xxx }}syr{z}zzw~xv| z||~ x}zt{~q}xx}w|sr~u{|}|~}~ yw~v~x}su~z~z~x{~}u{ {{}|y{{}{~v|xt|z~zwtuy} zw~y~xs}wtw{w~ ~r|s~{v{~xy|}zz ~uupx}zzv|wwxw wv||v}z~w~u z}}mzz }{|yr y`ázõ9Q��E�»WÿÐ÷ÿâe��*�¨@ÿÃýÿó"��0ö®ÿÿ¹ÿ5£�(�uìÿÿÉÿO¸�9��cßÿöãÿlÏ�P��NÍhÿæõÿäi�7�¶UÿÏÿÿët�+�¥;ÿ¶ÿÿ³û5��'üÿÿÃÿB¤�# +�qçÿó×ÿT¸�5��XÑqÿêâÿmÌ�Q��B�Åcÿâîÿ|ßo�2�¯QÿÌþÿô�!�>ÿ½ÿÿ®ÿ/��+ý¨ÿÿÊÿJ¦�2�wîÿúÙÿZ»�=��]ÞqÿçëÿvÏ�L�kp~zx|{wzpxytt{xx}}{u s|oy~|{xy{tyuu~~jy{m}|}zw}s|~ ||xux~yuu{z{|~ {z|y~y}vzo n |~vuzy||}{~}} q|v|}y~{yq{{ vyww}sq}v{ou}y~ o{t|{zq}}yq}y ||zx{vxxyz}yyo ~~}|v}~{y{uy} }{|~x| xv{x}|}~{{twzv|vz}{|{z {|r|w~r|~~xt{~}{ y {pu}y|yy~~p{x~wn|w{q|pwr~ m}|p tuº¡ÿÿxÓ]��2�¯SÿÍúÿít� +!�;ÿ·ÿÿ ÿ)��*ô¥ÿÿ¼ÿ@®�,�séÿÿÖÿX¿�D��^ Þ|ÿíìÿsÔS��I�Ë^ÿØûÿèk��7�°GÿÆÿÿ£ñ&z� �.ÿ¬ÿÿ°ü2��ñÿÿ½ÿC¨�+��dÜ ÿôÔÿV¿�E��TÍtÿçæÿkÙ`��;�Ã\ÿØöÿ ìt� +-�©FÿÈÿÿ¦û)��5ÿ³ÿÿ·ÿ7�!�öÿýÎÿM®�/�kâ{ÿòÙÿ`Ã�@��U�ÎhÿáìÿwÒS��=�¸VÿÎùÿåk�#�¤BÿÂþÿö!��2ù¯ÿÿ³ÿ4�& �|!ì§ÿÿÇÿL·�6�eáÿ÷ãÿcÂ�G��WÛqÿèïÿ~ÐW��D�ÅZÿÓüÿßl�-�«@ÿÁÿÿñ$� +�-û±ÿÿ³þ4��!ïÿÿÄÿF�2��lâÿúÕÿXÆ�C��d +×xÿòæÿqÔW��G�Écÿàüÿân��:�µLÿÈÿÿð"� �¡1ÿ°ÿÿ®ú3��÷ÿÿÀÿH¨�#�räÿöÒÿU¹�:��XÒsÿëâÿjÒ�W��@�¿dÿàïÿ}ç k�7�´OÿÌÿÿø!�%�<ÿ½ÿÿ´ÿ4�!�*ý¡ÿÿÈÿJ¦�0�tîÿõÛÿ[»�=��_�×vÿëæÿjÌ�K��D�Á^ÿ×ñÿÚ`��1�HÿÈüÿî}�!�=ÿÁÿÿ£þ+��,ö¦ÿÿ¹ÿ=¥�% �yéÿÿÔÿV»�9��f +Ý~ÿòæÿmÉF��S�ÎfÿÞóÿØ]��@�½RÿËýÿçp�(�¢4ÿºÿÿ¨ö) ��(ö©ÿÿ¾ÿ*Mx{~~x t}|u|m~u~{}x|ttxs }~u p ~tl~{ wu~wy{y {|y|{{~z|zv}~|}wxy}zv|vzw~ x|{{w~{w||| }|xwx}xxy|~{tsj{|twxl} xzxupz}ry}~t|x}{||tz~ u|{||w }z~{zx}y~ { { |~sxxr|} yt{||{{~~qr| y~vv~~mqu~~ t|~|{x }yx~{svwxx{~u|}{~wt{tqtzzu{{~w|~~}~{zyy~w|vx|q~v} x}~x{}vw{s}t{nyy v r{z}svz~yw~uv{| yuq{xyux|y {}yyx{}wqs{}v}rzzy{|s|o xw|ps{|| zv|wy|q}~~ w{~yuyzs~|r|~xvwx|h}u | z|~~s|| {}{~zuus~~y~ty|zx|}|xs~v~qt~|yw~wvwnup }n{ymx~ |v{~}~ y} z~}ux~z yv~zzzz~} y}t~z|~{vzz}y|}w ~z~w{| ~m|z{|y{zzvv~{}}~v~}t~|}|}ux}~v~~}~~{{y~z~tv~l~xv|xy { xx ~wtxww|x~}u wqzw~w }yvx} |~zv~ zvv~ ~w|wuzzz}{u|q|v x~~yt{t{uv|zz| yws~~|v{}~~|zkw{y~{}uxw qyk{zy |~zx{v}nvz{{xzqz} |rt~{st|nx~uzt~|xz}~w }u{{zyyxxsvzsyzu|{ }yuzwx~||{}x} zz~w}y|p{{z{xw ~y | zv{~uyyv~~||y~}yx~y~~{w{~}twx ~{{o|{}{| ~w}}|| y}xy}uz} z~x}wqyw{wx{w|wyx||wxyy|x|t{vzrz z|x}ysu~}{}z~||~x|~~~ {{}u~}{wnu~| r|nz~w}vxk{||~s~|{~vz{~xyrwwq}ypu|{xyv}~y{~w }x||x~ x~~z|w~zw~uu w}~wy}}~zq}~wqyv~wwryz{s~ry~p }}|x|}~w~w||~{nis~|p zyzw}xy~{~{ t yp|~z{xzy| {ztz~{v|s ~xz~~y|}}u}u~w|wyx} zz|x}v~~xp|z}uzwy{~z}}}w{|}yu|n| }yz~s| tzmvp~t}zx|~}lt}x t{{|zx| x|w{~ ~}}~}ny ~}t~v}~wy~ vsx| zyv~u}uxw{ }y|z|}y {szr{vzw~ww| zvx {~|~v}}}xy|w{ovywz|}|{z{~x}x~~~~y| wzt~~ } ~~{s}}s|~xx w~||vx{x{{{{ ~{pu{v~z|{oxsw{ruj}~u|l~yyut}y~|u x}~x ~o~{}y yx}r}| ~~wro~ y xyny{k}z~px{v {rzw}{} |}}vqqt}xxq~| vz zltuw xw| y x~|t|xs|{ uw~r~ sysx{|tt}~|i}vsyw rqztwy{tws~| |{{ov|x{z~z~~~|z|~z|zrpy|{|{vy p|x}pv~x{xv~ixyzzn{vrtzi}~w|dwu{}}ow}yyvt}p{qz {~vwm}zx{{yx xusku}}xu}vxtvo~twyyv{v|}~}ywor{{}|}yrx~ |uuzy ~sy{}{myqv}x|tuoq|~}~|ryl }z|drytsn gxrz|vzdu~xvys{t{y}{zp||x{t}l|zu{||}z}rozx|ykot~|zzur||}xywqzr| { rzy~yv}{vw}x|wymxw~{v}z~tr ~x~q{|v{~xzx~|u|y}~}{}z w{y|ks{x{{|{y{vxv~vp x{xx{}d{|w ~|wm{z|~zy|xprv}tyz}}x} }{zu}{ |su|}p}u|wu||{v nn|w{uyy ~{uwvpr{ i{zplk}~v|ygz|zy y|v~ ||{yyqy|v{ vzv|{uq ~|tzws|qzzyqw sx~~k|wv}}xtpvw{{uu tzyqimyt trw{ | znuu|vzz}v}xzv|zv}ux{|}{ ~}zqy}mw~|{{jp{}{|v~v|q~}s|rjw~}svxly qvyr{}{s| ~{yvuuxr~w}} yytz|s r|}{w~~~s{y|~ |{{{r~tw|{}x|x|~yxpp} l{v{qmy~ xz}xxz{~}h ~vwyuw|ux|ux{ty}|yyv r}}s|{ }}wp~p~y~z~~~wzy |krztxur~pq}zv{zory}}v}wuwto||swx|xwxzyoyy|~|~y{x~|sy|}|~ys|| ||vr|uqqm{t|qs|}tkqu}y{ ~yq}s t |x |{ty}| wrv}t|~}~yv~v|v~z}u~o}{u~r{uywq{w}bzl~|~~{{ nv}}zs} qwww} {|}|sp}}~x{tzv~|w ~ yy w|y}su{znz|r|xuut{z{xv~q|u|rokz||z~~zv}u r}}x{y~|szv}q|x{{||}{ ~y|~{zq~z}|p|twt p|syq~~w{szv|r~kv{qvw {~qzx{{ {x{zwz}| xx{ {{x}m{}|}||qt}xoyuuzyttzor}}~|} i} zxzwq w} |}p~o zw{s|w wvy {uy}|~}}x}|qs~{tpw}s }}l}q{lyi{p~yznx{ uw~ov|~i{~{swu{v}{xxs|~ ~wy~uytwv}{zrxz w |~{x} y{uzy {qv yw qur{{}ow~yvzrj~zq u ~w{~{r}yy{syuvqi||uxu}~xx{o|~| }y~q}wyzzzz z}~~{vzvw ~{w{q~p|}~ ~zzxzz~}wz|iu vzvuvlxxrv}{|wvvzxu} uxq| xuqv|~x~tqxlxq~~{xkxz| vw}v~g~wzpv{{ zwx{vwr|xwpu|~vwx}~}|uzs}~}}{{ xyw xv~~yt~x|zyw rw|z}{yi} xrwweo uu|rx||yt~yv yu~o| t ~zs |{{|z}y~v~npwx|{~ |zrys~w| zx ~k|tyvw~v{}|x {ty}ww| r |y~zs|}}yy}tmwxx}v{}xp}}{yw{os}}z~z{r}x|zzk{wr}{{}u q{}~{~|{y{ u~x{}yxx~{u |zw}h uj~w~yyzns|||zt}y}v~z~utr|x{yv~vtty z||{{~z pxxzxz{~|q~}~t}~vzy ~yy |}{|xxo}z{|s~y}|zzuy}v|zt}~{}}}|~||w~~x}x~suz~xwzsy}}~}l~x}{}~ }z~{~~~ qwsw|qyqzwyqwtw{nwyzsjv}uyv}ty~ uxpxrsx|w{|zww}z}}tv~{~|xurv~}t{{gw|}zv}r}{zmxxq|}|~{y sx v{}|z|nzwu~xsv{{~}~ voxq~~} zu|xnzyuwsxtruxyx}xz~wmw~y~{}zx{svx}sz}wp|x~{vvv}}~|wiz}nz~zulks~}t{x|{rk}v|x{v{zxyyk yzz| |~ x vyy wsu{{lswpyx}{wqqqv~ w|y~xup~g|}}qzttw}xr~wzzz }k~{wpjrs u}yr~dq{tqsjuqrpv|q}}wzug{zss{ l~ ~ z}px yryutyq~y r~pw|hr~tjnox}¤n~w~~qz|avnzxsv{q~rf wv~u{|t~qj{kxt{yuw~t}ywt} st}}|{h_{k~{uovyo{} zr~hzq}}|i}unt¡qy uau{ tyqc}vzyvuyz{{u}xuuw|~|~k|uril~s~qrttj~tqij~ z m}{qqv}vw}uztyoz|{]mqeh{x }~u}vz xz{g}vx n z}t yp v{}q yojnwowo||fxyvgkky{{fj|Y{y||hum~w} xwn~}y zy{v|zvw{pht|e{syy{vj z|}~x |mq rw tsxbyd{q~uysou py z}|y ~ }}s~}oz}|y|| zl~zu~ tv {xxqx}tyo{u}qt}yvzzoqjp}wzkxnpyyyp}x|fzn\~}~bwow}~x~{yz~{{|l|~m|zs~vpgmytw{y sr|v{ vrbzyv}q{|l{{~su~}zy{ nws|{rzr}v||zt}}w}pm ~w{trv sqkx{oun{}~}~x|}g{o} n~t}|}uxznuz~y|zpx{{t{^ czu ~z~ |~}|{{~ ~x q|y{z} | |~|}~ ~|uy~ uuu}xxw}{ x~zu y{xxxk{t~ ~~ tpy|w~pzxz} yv{{tx{w|yym||}x~qyly|x }}y~z~{yz~ox{y~xwv|ov{y|rz}xt~xx{ou|zzz|z}} }~p ~} yu}tx|} zx|z}wzu|sz~}|v{vwhy pp{wow~}q~||v|hq}znkzyz}{wuy~ {y|~q||}{~{{ ~|yw ~rw||~{}{~}q {~ywyvxyvw|s~z ~ t|vyv| {w ||r qz}yy}txx}~zwzx}ywszr}yv{zr~v~nq~| }}z}y{vo{zryw~q|z wt|x }w~~svx|{{x{x|t|}~yzw~z|cyzzyw v}xyts~vo||sj{ qx|w{ sv}~u~wyzvut ~}|xz}~p~{rty~{rzv|zyvvt w{u}zwrxtz x~xgzr~lzu{i}yzmvty}{|pw{~| | z~ryoyz p||~z}}z~{y|{x|wzt~| {}~y{y}}uuqyw}pptyuy~r ~t{rk }x{u{~lz{w||t nt~||{u{ y}z|{zxr~xzxx} u~}~tlzxvw|}uou{{zm~|qqs~~~|t{|}y~|||xzx||}}|~x~}}zu{ oyux| p~ww}{}z}ql|r~|ux~zw z xp xxyy} vxtz{zsp~ruz~} {{x{txs{nv}nxh} }{zzm~|w v~y~txz} zpz}{wz~~mywv yznvy{ts|pu~~{ {}vqyx}z~zt|x}| yxxy} x|vx}vy}{}}|~}{{wo~ ~zy{vv{~zz{t{x{lyn|q}zw|||j} z{n{~y|~moys|z~~~orup}yy~~}t|} uv|~xz}z~w~{ ymwsxx{ ~tm~sr|{ww{mxz}|sp~tq{x~ xi{xz zyv|yyv} {{uxvzu{w~{tqx| t|}t|pn w }cy||~x v{}uuy~yw}}t|y|s~~tv{}}e||}zx s|zsz~zz~ p }}u wp~uy xvj~~{vyn}|r|v~uuv}owq ~}{|yk | | l|~{w~qyq~yxw}ryzzvw|~~}wzpy ||yl}t~~l|w r~z}r}z{|}xv{~}m| ww~x|}{}|tm}|zsmx{ xv|~~xtjozvumvzr{zmq|{szmr~{~vx }xz}~zuyxrw}}{t{{| xql}uy}}w~l|yv }~}b{t|{ ~{{xxzwluzl~zzx{ ~xk{~|x~ |}|x~{u~w| p~~z}m{z|ysx|{zt |zxzy|ro~{ p}}r}r|tw{n x|x|w|~ vqz|ps } mzx~vtyxw|x} }}x~ }|yt}v}t}|~y|tp}|rnzz|u{}|rw{zznwnzyztm~u|s}| znv {p|{}|p{wu|stn} ~{yu~|y{~} }yzqpzz vys|zuylr|zy}|t{v|vz~ ovu{w~ }|x}v{zu}}} z}{|r{rux~h}yxz ~y~xzpyt{}|rv}}~{{~ j}u~vyxvwzx{ {z~ w{ |~yzsw}| x vw~~||zxx|{}zuu|~~w|k~{~y s xz{~} ~yuwt qz{x |w{y|szw{v}}|vzvo zut|}t}xv} }||qmul{}ztwm~ u{wqy}v~mt{x}z{wz| |~ tw } }wxxww uxz{z{z v{yvqw |x|{wqvtzsjxvp|xxzc}~wyyw}w~xx||z{yv~ y vx {{ puzztowy {~ sp krv~yurzz~zysuzx}v xzyw~yx|w~z~}~vy |rw|~r{t|}qw {x~~to{ujz} ~x}}~~|z~vzuzx~zr x zz}zzu|yw{{{w}}yv}x |ztuzry~j{wzz~n|ww} ~} {z wv~y}uw|zwwtx}r{|{x{}{ {x~}xz wn vv}vrsxo tzu|uv~y~|v ix{}o|wwy}|usty} |xu|tzzz~pz {} v xx}xup| {y}wzmz}}xw|yn~|sc~o ~}||w~}{yxyztq{ |}v }xv}s~}|}|{~uw{q zv|}t}z wh~}t|tt{xz}} }}{yv}yk|vu{~}lx~zz`vx wyrs~y|{qszv n~zzvu | ymz~~ }}~}wsyjxzru y~||}q{ ~}wruw}xvn}z{~zo~|st|}rxqw}|~y}yx{zp}uq~~zyut~}szptzyr~|ttznyzxw|q{|tut{y|u{|}yzztu}}u}~b~}|wsul~{vwuw|rwyxz{{t|z~yu{u x|yvx|vytwxsztw{ltz}~}}z~}q~~|zzwkl {wz}{~yow|uuv}|~}}p p|yyxpw{v{}{pl }w}~cz~|u{wp{y{y~{{x{|qyuzz||c}~zxwmw~oz}~{ x~z{s~}v|}w {s|~q {wzyx~{q{vrz{~|tm~ut}}iz}nt{vyt{m }xz}py}s~yt| x|{z|}uxtu~}|zy |}|zw~yq} zzj~}xs}{~vxv}|~ ziyrp ~tmsz|yyrrv~|yxx{uzxq ~yvpzo uw vxvp{}~zezuxou t y~yuw~rr{{yy{tyts~t}uuv{}}x~m y ~|yzzy}xo~ z~x{zvsgy|~{{wv}~uyx|~~twy{ |~ |rxx| s{rtwyy}}{yxy}ruzy| |q{yj uyt}}v}yms{}z {wpzz|~{{yw~}{x~z~u{}~~{vquvy{|zm}{y{{xv }x~wythyvxyt~t}x zz}~wyzt~y~w~wm|wyww{{zyx{}z~~{}nm}}l|{zzv}|u}}y ||~iptw}r{yv{~oz~pzq~fv{x~~q~u{x~v~}m}~z ~ ||xy{xqxz~~t|zyy{qy{vx{r}~zz}}|s~r{w}z}zpp{s}cyx} kzq~wytw {~xw ~| {t{wwt~vqzwvy{}t|t{wjzpu}w}zuqxks}~ x~q}~tsq pzzyzy {{w}ry~yy~|z r ~x{{z~}tytwzntwixuwvu ~q{ux{w~|}urpw zrw~ xru{oup}}n x|{zu}v {~{zrx~nyy||}~xtxy|sxzr}trwywr o |zy{uox~z|q~zvzww{}}qzqub} x{g|urs|s}}}wy {|}~s~}~tt||yxz{~yi{y}r~xopy~s~yz{~z}tjx~y~~v|{tpmzvz{yrw|woy~o~yxy~|t} } xyy~z{yx}yz } |~ z|ws|wq~{v~sq||v}z{xv{zz}v}v~k~ v r} ssy yds}|wy|vu~y|~}}|yv ~z~um{| |uoqq |}p|x|w}yw} }~}z}~}{|}x}xy|{ru yvqyv{|my|r }|v}q| g}xyttsu~s~yws~xz sxuvwuu{{q}yzw|y| z}sy~{q x{s}|vhs~w f~~{|}vs}{z~s~yy~xw~yzwxzvt s{}~lv}w{ |}yu|~|t~~}}e~} uwyqyyrv|v |p|umyh}}ttsupwvhuk~~|wl}kxu}}~~pu||~~yxx} {{|~uxw x|uzu}}tkyyo}n{{|tq{|}}{|px{{}yyhywkvv}~{{|| zy}r u{~|xysxzt|zww{{vsz{w|}zwyjku ~z~~{l|zxxqy{pzvy z ~s~y|xx}uu}|x|zx{uy{}y wy~~xz~~ zyiz~us|ytzww~ y~{}w{{{q{shwvxws|q}vxzx~|~}~w~n~u~{z|uux}~tv|~|vzz~{u{v{um~ u~wy|y~zxros~yqt yox|wwxxzq|y}|yxzqw~yxzs~w {{vw|z~}mwqq}{v {{x~|zwux|vxu}}i~{u}{}{ rm}wt|wl~{}usp}{}}||t{x |zt | x}}|}uzw|wu}ypvx~ wr~oy~~qu|x~ t{z~~fn~}~o yzm~q|y~ w}{yy~}y ||}~v }x|~~ww|z{}ok||pvzlqv~y||u{zf}t|t~wy wxz||u~~~~z~qypun~ {|~l~{|v~||l~{i~~|}~~~} w{up{ }|xy|||}|sts{{|q~|{m~|w|zvpo}z|mmy|zly{}z}y||}dqxyyuy}}zxmyy}v n{|~{sx| xywyuvztwcy{nyzww }}x||c tww|ww|yqx}y|~w rwx|rv{wr|yv~pr}ry}u~ p{}uo~wxqyw}~~zvy|wxz~y~|zws~xzr}}{su||{ ly s~uxn li}wn{~}yx|usxvztrux~wt~ }|z~~ |rx~yz |||zvu{y{wy||{|y{|{ |xyr|vxv }~kvw}}}{vzyyz w||yy|y| } z}nx{tw ~tj{ |y {vyi}~vs|vwtwx~} v ~wyz~ty~s }w}y}ymx~}vy}zxrnv jm nuxwryuysyuyud}wz~~} } |zorx~z~fxnvz~rg|v|z}~xu w}vqxrn}{~|rx v j{|pzxzywyuti }o~wzi{uzsuo~|y~|xo|w~|sy|myyvuonw~zk|r~~||s}z}y~o~ylv~{u|ovuwrs ~}~{k|xw ~p~z|sxm |r~wn{njon{{}igxu]~w |vqy~}rt{y}v{r | h~~kz~vsywvjveu}yiynqsvvix xvl~nnxyzor{h sr{o v|xroqm{} q }t}uu{ww utoluurxy|o|l ~omvt}yz~qyxk w~{~zxt}||vu~ypvqvqt~{xmwpwzy{{}uriwq{w quiv~}{sykzz~{}{s ~mz|q ~w} |{}s{vvzxswkrkr}a~wyywuvu}~xywwkxsuyz{wz tfxz~xyvntmrl~ry~zku}jpqfy s|x~~{uw~}tv{{z x|m} xuxz z m~~tyzw|uvz}u}sztzwz nx|}}}vvn wzz}}{\z}sk||n~yp}s xntwtsw~tune}{rwk{yd{y xy|qzsr{~{zpf~x{px~zyyz~eszt~~dyun| |||{qztmy zh|wa}|}cn~~vuv|x||v{w^}w|}twux|rplw}rv~oyqmy~~yrx{v~s~k}y~c{}~}~wbw x|{y~n{|}wx{ }~sz~j}}}zl|~z~iw} }zuvhu|zooigxe{u{wwux}puty}w||{x{z~yxy~xstz{xu}uyz}o}x{}tyz t~} x}zzw~}ywvx{yum{zz~ ttwv|~y|{wo}~z~p {~~yy|r} w{~r y ||~uy{|y|z s}x}{|~{lv }x~}yr |~|~suvv}~~|vpqz{|u |~{{y} z~~u{|}{y}w~ |{|y{t r~i~ }t~}||vvv~z{xw y {mt{otzn~v |yyz|t|w t{~{zvxrv~txu {~w}~~ ~{{| w{|yy|~wxkxz{q{}zrz~ t~z~p|rs}q}y~mzywxvztvm}yty~t}{}y|x xu}xyy||~t}~~v|yz~ ~~z {}kt~yw|w stzz{~l}oz w} s|{o{v|vxvuy |~v~| ~zw{w}u {|v}}{}xw|}l{~~xx}{|~}vr~ygwwktpzz}ytty|~lx~ }x~|sx lxuz{z }v~~z}{~yzyuw |s~xwqy}wly {ov{{{sx}||}{yt|t{|{|}{}vps~~|v{t}{q~sz~ ||{y}}yzx|x|zy{|~|{y|{ps~|z|w{oszv}vy|{zyupzw{~ ~zxxz{q~uuz~y{u~wx~}|ows|r~~||}{{swz{|}}yy~t{{{{~}~ }nq}ypm ur t^ xx n~}w~tnu} |y}~y{x} o t zq}w{~yp|xxrz s}wxsv|w{x{}|pv|}n}zw~}~zo~}~~xtz{|}}mr opqu{ v|{t|ymy{vr|}u}to}vp|tz}~~y{{ y~x|}~zzvt}~~~}zrpx}|x|}|}jmvv |zws|zz |qrx ~xuwszzx}~y{{x~ z~}~rzwr{y uv|vz~}zv~|x}yyys}zuwx} ~t||xuwr~wxzqqqq~{wyyu|y|x}{~yyzqz{}vz}{z|}zwwo }~w {}{wyyi ~zvwyu }wr}{wvt}n|}w| vu | ~ ~|q{yvtzx{v{zoq~xoz~nl} h|{yv zg~{{o}ppt }|~ty|}| }z}y~v yty yzxz|t z~{r|qy yrz{qrzy \ No newline at end of file diff --git a/build/src/gfile003.data b/build/src/gfile003.data new file mode 100644 index 0000000..3ef506e --- /dev/null +++ b/build/src/gfile003.data @@ -0,0 +1,65 @@ +zvpywr}~{{rz|rzxzw~vzc|{ xq}~qu{|py rq}~yx {wv|}}u~o{o{{~~yovz~~p~{s}tv{}{vu~ry~~r |~ {z wt|}v¥{~z~ zwvvwupww~o}~y| s~{zt z~~w zy~| { }|x{yywz vl|~tt}{tz{}xz~{y|qjvw |pxwh ||{qwx}~~l}zqxpztx z{uz {tsyz|~ rwq{u~~~tr{}{i}|{}y|{vts~ov|x}y|{zwyx yyy~{~ {ru ~x{suw }}~ wyx xxvzqxwwyzv}t||| s{n~ovzuw~~r}s zpv}uiuwxv |t |xjz}||suw}~sxnz {{z}}wwx~{qnz|q~z{w~yx~~{yr||v}wwzzw wx{w|wz{ {||}wyy~ xu{xu|yx{v|z~|}tsz{tu~t{ vzxv }wr{}w||}z~{{zzw|yzz|wywr{v }z|y ruy~ xrw}xxv{|z}}vl~~p ry}{vrx~zszyyz{v|{~~us}~}} |~}uxqtz u }}oz}uzlqu}spsw|}~} ~~vtyu~oszyuyzs~~jz}{vxx t~|~}ynt|s{y{oy}|}wzuy}xy{pu|y }|zpw{~~|{mn|vm}y~~~z} z}sqzo|w|x z |z | vw}}xy}xy xuxuz|y}~v} ~}~y} ~wz|uy}y zul~{zr{}{yix~tz~{|~|q}x|qpyyq~{}}}|l|{{~kq x vy |{~ }rx~xx}~}wy{v{}o z juxjxut}~zx p|wu}~urh}w{yu{f{ qz {zz~wzxv}x }|wt|{u }~x| {~}`| ~|x}i}q ~m ~{|x|{~{yytx}ny|~vvjvvu||~}~rx | w~~{u{ ryr~h ~oj}rvx{w{{ zty vt|t|quur~~|p~v||q} }{yv}ty{ pky{}x|s|{z~|z |wzv ~}y {|z y|~k|rxyy|x~|iys{zyx|z~|}|v{ tzx m wz~h||}|}x~suzulyu w|z}y}{{~ |}t}~u~|o{r~z}} tvytxy voz tuup~y}sy}pqqxg}s{ {~{t|yz{uxxtxvuw|}sxy}wz{zx~|yzs{juy ~suzyv~{ ||o s{pd}z|~xsl }~|yzr}t~vt z}|wz ||v{~~t{|uxyu{llo~wylw}}~q}zs |~s{{}qzq vryq~z~xl {mzs~}|w~y{ypv|~so}v wxx}u ~~~x}zw { ~r}ey~zw{~|{yqv}zzyv} {tz}t{t ztsztv ptuqq}wpxhq}{~~rl}xs~lry{wz}{|{ zzzxyr{}}|uorw{wu| wh|pyptywzv}q}~ }wzzpwy| dy w{}z| u}|s}yh~s{ypx|z{u}szrvrlxt{ yerf |yu~||vsw}qxx{|{x{{{ x~z} }~{s}}s}|}yz}t~|} ~t{ pz}{wy ~|v{zozuzy {~r{z~z~u|{q|zy{ }}qx~xr~}}ux {z}otz}ymu}vyw{|xxr||zi}y~tryrs~zyz ~wt}{|xn~|zszx~ v~~pyr~znyx qgy{zupz}t{pw~u{q~v}t~{~wx xw{y|t|{{}v ~ y}~u}syp|y}t|jww }{{t~uv{|v~wxzy|{y}{wx~y|{|x yzyy|y}zw~vzw}ywz r pv{}~|}zv x }vyuzt~u|wv{z }yq} |ysxm}w||y{x |~ |rwz{~z{{rz}z|{v}yor|z| yyu z}z|ys{y ys| js{}| rx y~zoy vvyuxy|wztyz }v~{~wo}xzs}ws{xvv~{uz{| {{yxxtxy}}yxyw{u|}{y puvv~ vy|x }w{u{r~~a~{j e}{ww{k {m}{{qt~| yyz~m}}{|~}}}w}}xtnw x}~ux{zyvx{k~{|||vyzq|~sxx {{~|w~ ~{zvztwyx~{}~}wr||z~zzy xz }tz~~|v ~ z|z{p{zz{z|pvx|{}~wtzq}zv|~w~v~wy}|o yyw }vy xvw|~{ yxzw|~svu{xzt}|y~wyw}r{|}p ~ x}}vq zy t{{ |}yp{yz|uy{}}yvrw{xv xyw~p}~z~|zzqv ~xv}~x~{r|zz|~}w}vyx }zvx}wr~}zp~{|~zx{s}z ow~x|zw|{}z}{|}u|}{| |yr}x{xw~xzzwuyu~|tx~y{~| ~}lxw~}u~|{z }zyv~~t~ ~ux{~t}x{xr~~x}||}uvzz} w}vm z}~{ {~nyz|vyz} ~yu}}|}zzrt|zx~{p}|{y|u~|m~~t~z{xxy |q{sw|}~} zz}{uvxzwv|~y}{|}|vt}}|u{{r{|{ }m|wor s}}l{}z{ux ~ }qpyv~wzrm{~x|}rv|}|z}~} w~{}~qyywx| }~}{{zxt}r z}z|}kzz}zyj}x}tp}uwzzr|~w~x~t}ysw~ }v}j||wzw~~zw|vw|{}|}y~w y}~~~t}uvy}l|~ty q|~|u{}yzyv~~{zr |q|z~z}v{}}qqu wzzq{zvxzyv ~tyrrtu{ |~{}y~u{{zyy|yxxy|}{}k{ z rzu|}zi{vvkg|y|v~}zw{wuy| w{~}|}w|nz|x{s~}}~|s{ }w|qu~p|~uv~v|wzx|}{}sz}nr~~ml{i~ vy}}r{}} w }w}zz}yxwv}ttyt y}~||}}ku|{}py{}}suu| ~q~{ yt|} ||u}zwto|}|v}xz}zxw{u txxt~|yl{w|tr w{xxt |{ust|}ywxxytt{d~}ozzvw| rm~suzt~x vzy}{}n~ wyz}u|~xq~}z| }}yur|t}w xy}{wyi~qy~{y|uz }{ u}yz{}|v w}uz}} } {~yz{t}u|f| z~u}uur~ }~|} |{ }}{|pz{}y|yz}} { xw|{rt~yyvv }zs wx|y{z}wx~t{{|tw|||uw~z|~wvyzv {y~|ynzy}}zr|r yp{}uzt{~q{t{~z}| zxxwz |s~}ts~wy{xyuy{nwm}p|yo~~{yzoyzwuyxzu y|x|y~t|ur{}y{~ix|{qsfu~{}}~~}su{yrvz|~z||~~|x|~||||{}}~x~}wy~y|}wzuss w{x ~}pxwwm|}~yv~y~~{tor{zv}|lt}wxt{r} qy|{uw{xr{{{}xy x} |vz~tz~~xx|} y~v{zzu}~u}u{ w ||n~ z}yr~zz~xpqzqey{z{|r|x~z}xyzuxjxuqu}wpkz}~y t ouu}f {{~tuz {y|txY o~~~vgvk~~u }ww zz}z\xfuybs}x y~mt~zwwzk{r~[u}zzxu}q|~~~ ~s~x ~{}x~o{x|xs}{u|}| vrrpy zyyxnptokz}}~¤{~twmxx|xv|t{p~{z~~y y|xzzuls~ {zxwr}~{|y|}lv}yvtqmyzf}zlxq}fzxzsr~ |ypeyu{h{~yu|gxz|y|y~zz {xfuw}zmk~}~}b } {s{s|x|{|px~xzyx{}tvu~{~ {ts|~uzrslvxg|xru{}{p{q whktm}zouu{s y||zo{v|ztn{{zv}~{z~|su|{o|tw~xy}xsnp}wz|iyt vb{wy~~zcz z}z}ksts {{|z}v}|zzx}kwpsdztvwmw|~tww y{t~u~ o}~rx|xytt{ my|}oo{yvtlx|ub{huv{yds~|ydw~qxxlx} z}~r { }~z{~muv~ryw}z}yy{gf| xwdl}mywet|v} yp{~u~`yyvwz |_||vwz~|ht~wwyw~{xpnxxowq|z{}~{woit{uyon}~ gcx{xxvv}{}~ytzwo~z~hu~x}w~w|~u {s~vtygkyxw¡qsbw|}wti|uzht~su~rz{|s~||{vvvyy |vs{|o|~r~}~{qv t gsw}rvvzo{ww~up}}{|z|n {|xzsop | {nqux}|tz|yz|}~}~~wlk~}zw vy~ztz~z{|putv}f{}xz rwqyx~qs{xj|vx}yx~wz vh}w{hyu}uwqupy|z~}}y~zw}|~| {z{}| rw{xy~xy{pq}zu}yxqlxox}kmvwx~st~hkxr|vw xyvz}l~~y{r{~ws{n}w~~}ws~ xzxuxvx|}u}{|~sp~|q|fx |uxu{}{{vt{}tv{u sxx{zt wys|~unpx~vwoz| {xv|vx{yvvv{r~}|u}~z}glv{}yv}vv|{~~w}|stm{{}qq{}~vzwvwzoq x}uzzzyqzu~sqy|~sm ~~zsz|zw}qz~ ~in } zzk}yvxl~||} hu{zip~yt|xz{tm~ z{ww{o|vu { pn t}}vx|u|n}|~}tp|y{v{|}{zqq{z|~ynx {vnntly yt|j}z|li| p~qtx{ xvy x}zrr~~{{x swxus~q w~x u~wzuxx}st~w{yz~z~}vsv{~xn~zz~hp~zxi|k|n}zyjzuyu {t}{}wy} vzq{y~||s|r }v{s}yux~z{yt}|wxtv|xzwp yw t{x{y}z{y|| y|~ {u||{wx~| qxtv{{syfn{p}nyx}xmzy~||z{zvy }z| ~ z ~x ~wys|{xxo}qoyt~o~|xy{vvvtz~v||}iuxpxx rtwv|}y~|zs~y|p|u{}zw~~w}x~} |~{|} {twgwq|w~|}|xstopz{}|~{~}x~s|vo|~yv~zq}v z{pvu z}{z|yxy~|yzoyyvq|}pmnwx}tzr u}it}|z~~yx~zru}}x~}xw~wvlt }o}y|y}z| wyxo | yzxytv~xiu~uywzx{ixx w|ulzvo}w ~~{pw xu ~}sz ox{{}wvq|z }np}~{x~t |}o|~|z~}~{w}|~r~zmzt|v|hwv} }q{zr~ }w} |x x}| otvyzq|oyzp ~}lnyt}m{pz}qqwvzyw~{}{v~~w}zt} o|xun~ r { ~uu}{y{l~sl ~{xxt{qz}z~z{}{zyy y~~rwzvw{|wypwu }gp qysv s|r{z|~r}qvv |yo}q||p~uryzqmrq|~|{zyv~wxnyz{ xv|w{uur{zvyzvo~{xit~~{z sqxn~zt r{n|kz{{~wz~xuvf v}uu~z|uz|vquvv~fx~|s}|qox~q|}wvw~p{xto}w~}rwzytv{{ }xrzz ~xt}u~}~rzx}|vwpw yqo|pw~}v~t}~vtlowvyyhx|ow|v|t|t{rw~v zp~ xzrw}w~z u n|usq~n }xyw mv~}q}nzzzxz}uw v|vz}s}y|uz|t}~mvztx{~uzs tzs}r|y~stzppy}}ziz~}zzoz|~tl}v|x{n|t~{xqwrxxw|stnqqv x ~~z{s{|px{qp}t}{xk{y{pxynxv~{y|tzq~~j { w}z{y{z~v~||x{wvwu~|qs} v|wyyir~y~w|{wwzwr q{}iowu|ry~qsyz{rvvt{rx|~|}|m{ s~~n|~| ~} xz{zynxyy~ }|v~sxux x~y} x{pxwyyxx|{|}vz{z}y|}y|ym}rkvy||xwz{ox`{vx{yw q{}u||~m}u~uz{~z |{nz w{rr|wv}o}rzwz{}uy{ `w}z}st{r{y{|x|wzy{z{~z~y zzz|z|{nxw|~ s||xwyu~z~xyy| x|z}~~| {x y| x~x~xym~v{ v }}| z~~v }q~zo~}~} wuuyp~~vw{wtyzv||~szwpv{|l~~~}l uv~{ z}xxo}z }~}w}{xw~ ss ~y}{sxsyx}}~x~ }zw|u~u|r~v }~z{|{wu|xy}}x}}zv|wxx |{x|s{{~nx}u{~zqxqxv~xxxq }}mv~~v}r||{vu}nz~}x|{z{~wzt~ w|v~ztwuur~vzzx}}yw}{|wy~o ~x}|o{t~p~wlq x}mxyyt{w{}mw~ ~}tv{~{x| xynxyyu|m|y~z zuqw~{ rtsux{wtjk|z||{wx~u~~}}ps|y}~wtw|sv| x{yzz}x}p|t}|{zi y{{}|ym{xv|{r~u}sx~y~vzwz{~vwu| yq~uu|t~vpwv ||z }vw|o{|p|wt{t}q{xrxx{~px~sw~t~vq|zlyq~ ~t~lzus{ |z{ s{ ys} ruxu}~x|~uoxlw{sl}|ltx|so}{o}s uuutz~t} zvyoy zty||zypr {}w{oxroz}}~|mxz|y~so~vo~z~|yvxy~~oyuw}ysx~ uv~~q|~~{|~y yvvz|qypqv|||sz|xun}{ uy{umz {}xo}ttu~w|m {{xzty}u|xtw}{vpsr~y|}tw~{vyy~{ ||| tzxt}xwsutpy{tox}k wy{{|t}vy}x|{u| w~x}|x|xz~|yyzo tx}~x~yzszxy yd{wytvz}r {~xw|vsvl ~xz|v{~xz{|ntw|o}}}|svs typ|vwrx }ys|o~b zyor}{x}yps{}s|koznw{~zwlux||{|~{~}}xvyxq{ yy}|{~~~s }}y~z|w~{z }}uuzxwsyv{qy {}t}v v{uyv zz{}{tzztz}{yt |{xzry yvozuw}~}~xw{u{u}~r{}}{|vw x~sv| ~z|yq yx}|~ny~ryt ~yi} {}o{sw|sv|wu}y{wzw~|vx~z x~wwo{ { z}uwt~n£z|wy|oy}| j} vqt{yu~hrszx~~xt xswwzsswtx|}ww} } y|z}w{pw v~vxz|x}r~~~~zy~z~w {z{}pm~~{q{z}x{w |toz{oxr{uwy{s|~{~kzx|xwwm} zxynu}}~~ux|swzx{wu y}|w{yxzzvjwt mtz~~}w~~y t us| v| w}w|~~t {pzy}vy}~~}~{m}z~u{swr|ztv~vv ~nmxz~u {|ytty{tu w~~ts{~y| v|zx||}}~~~yuxxtxz{ovztx| ~z~yqxzppo~w{yo{rxuywpx{ qx{pov~yw~wvq|ixu|u{w||xu}z{~z{{v}vx z{~y{{yv~ d|tpsu~yw~}s{x~{uxujvk~zuuly|{}{ps{y{tu{u ||g~sp {y{mxqx} ~zrq|q{{~wzyw{ }zt yz~{yvyn|{r zrx vx~x|yysw{qwi~sm~ssy x{yysvs}stnr~xs~{|vr~~{}v||wx{o}tz~rypyyv~| }t|~u{z}~zzfur t{zytnp|szzo}{x~wxyzmyqsx{rrxyqzxw}r}}zy}rww~xsx}{y~p}vy~oswoszqx|p~ z}zx}sws{vmy|{p{wurzzp}|ux{xy{} {{}u{tz pu~{|~t|{r~loku|~~yyv|z~j~yt y~r}wtvsmury z~|}{vvx{w{u~z{nruuy zux ~vz ~r|y |usxs{}|}~x~|m {{ipvz{rys|~ ytuzz}yrx}yx}t{|z~ |r {xzrutwv{t| x zj{~~{xw~m~w~r|oy|pwyl}{ |} }v uur}zq }xx{}}}q y|zxuk}|r|}i}{z~u{zz}ttzxxxprzz~szsuxxt|svf yz} xz{z}~z ~xz|w{| |{} ~uzmx |s}~x{|}vq ~zxhw|ztz~vbpyq~~q~x{twx }zj{}} ~y}{x{t}{t{z||{vz rx{wh}~smt||rw {}r~}zvz| qs~yv {nu~uv{yyxzyhsv}~} ~z||v|}tt~qw t{yrwyy~v|yz~||}{}yx v |z|x{~p|u}v{r oz{n~|t{nzsy}|uz{~ry}zw~|wv{r~yq~xywxx}u~wmst}}v uyz~~{~v{{{{}qx~tyy tz~wn svu}z}yxvx ~|w|tz {}y}w~s{w~{xox}y|| }vs_x{ wz~}~y|}||w r} ww}y{xtr ~ u~qx|~{w|w |q} k|}~{~vw|~x vzvlwiwm zx{z}qvw}~wwpjo q{ y~wuyp{uvwsxm} q~{vu}~v{uy~~uv{ ~~wxw ~|qnuv~{y{{ztmy} y||vtz} syu~~prwz |y}v~|~u{w~||{ z}v}q||xuw|wxs}|~~~yw{x~{}zx}~zy }x}rwu}z{z }t{}|yx||z}|||xsqtx{|y{y|rmy~sz}sww}vvx}}v~|zux}yy ~wz |{z}| ~|}szy{sv{|tz||z|p{z}|}x{x} v{}wx{xyvvz~| x~|yvxvv o}w|wzyw x~|}|vpy~u}quvtuy}uv}{ wv{zyxxznzv|zu} {~|| x~zu| n}sspzx|xrrrnpwvz}z yz}}zyutr~s{xu{x} i{xy|~}jt { tzxmqxvx|wrymz{u|w~}| yb r|tz~zlyws|~}yzvwxp}m|q}s}uwpyhzw py{~x zwv{{vrs|yzw{w||{q~}xx ywyzxuqdw}}wvnuh| mm~~{vuwjo{ }}zur{{w}{ax yj{~yw~~yq|~r we rl}yw|}yz}usun~~yow|z| t~o|{ut£}y|y~cpsyi|zwtxrzxwy|sfr~ }zqxy~r|~{z|g|}|k xn{zmm~||}d}{zyps}ounvu {v~{~ `s{}y| |}ruo}s~t~tvy u|v|wqymv |{ voz~zx~z zztx}rqw|}zqu~}b {zx} gry~lh{}||| o b{w|~}jtt}tjh{}nzt^u}~ ~ uut~ou}z{w{ rsvj{|yux~qz~w_t~|u~_tz}ozaotzlhwz }yvn |qzzozbuxy fxtxr{| |wysww{o{~t|zhl~u}||n|tt} ~rjqw}y~}}Zru{xu zw{|hvy{xz{m| s{|}ws|dts~orsw zyk~{tq |v{rxz~p|}qkpzzox~s~~|vzv{ yyzl]w|w~ zqxvxwyv {{hzw|svuusfwpyr} ~wt|izoxnzsz]sxws|}{g~t ~szl~sz}{x ns{uky|tzyuq|gok|y{v{~} zv r}v{nwy{ |zu|zrt|{xskzyy~yy{y x}yrx|tv~~t|zswz~wj}s yytx |~{dvx }}wqwhz~}yiwz|}hxzo|{|xo~y{wt |~ ow}} z{sw|xzzyw}v~|x z}}r~|{tb|{y~xxwtp}x nvvu~o}~ |~}x|z{}{|ts{ ~~~w|{|{{|}}x|rsx|~wz{s}||z{r|w|y w {}mw z}{q|v{{ ystzwh ~{z|f|{k||}syvw{z{{| z|~ uy ~{|yt{z}yw }ew |o| x~{jy}|{s t|~xyz~zv|sw|wt|}{w} o yw|vv}v |s}yg~v{v t{ nuxt~w{|v}{r|~p{|~x| }wyn}} suyov{~v{~{m}vv|yrwx Z }yuw|~~r{yynx{nt|y ~rzx |}y|}yusn~~z{~w{yv|s{z|xy~wqqu}zvz|~}t}xyvxn{q vxfwyu||}xwwuux|zz}}x~u~vuh~ pt~pxx~y |{ vy{xvru{yvpy|v nz~ xr|vzwf}~~}oqh}un d}w}}~~tz}t z}|utx wwswz}~}}~z |q}y{t| |zx}p|}wxn yq}szou{xxj vv~{sow~{} w|~ }~mwrtyz}|r}qryz {o|| yz}o|~ww|}txuyp v }v{|z}}vk~~ ov{z~s ~vvn{~vovwxvzzk~t{|yv|l||}z~wt}~t{~~n|j z}xy}|{ ~z~ywz y~}{{ ~xrtpw}|z|w{yx|w |uzu wv~s}r}}|sts pozvxrtowpx{ |{}r x{}~t{{r{xyu}~}wt|w}|}|st|tx~}nx|z}po~}}{ ow}}x}}| {yvvnqyu}q}||q|}wywww{{~t|{}y vy}w{zykxzxys|v yz~|{~ym{|}~ pnvvv~ux }wyvo{uxzxo|{} ttx}{yq} y}}vw ~z}}s~{s| ~ qnz|s xw |r }zw{ } {cy|}}qo|~~| zz}|zvuvxtw~yww~|~x}z~tw|| }~szr}xzw~ znvnzvyoqwv}yx{ ~ zw}v}{ p}x} r|~~zxwyw~vr{q s~|} zoyx}rdz q |u{xx}~ }|y|~|ovxzz~ |z zz}y~||w|} qqzo~x{uspq~}xz wpw~ ytws}}|w~yxvy~ xyuto|x|v|vz|syq~zvw}}xn~zulq}tu vynyu{~~xyly} |~|r xzr{ wxrxvy{~{t{qw~vr{~ ytbz|{wv}{}}wr~v~|yyzs{} {~y |pyx}~}my}{x{|l|y|xn|yuxxs~~~{~vy xrutyzvnpw|z|z xyv~}yy}z~y~{wt~}zw~xzv~xvx}~}|y~tl}|w} zzy }z}u~vzz~u}t}vrzuz| tu||{y{|}}u{o}}|w{}}|||||x{w|ztz v~ty~}}}~~|y~|} |{r}vxyuz}~z yz wz|uue~xzn w{}w{xww~zt swz{~x}~y {wtwx|}wlz}| z |w} y|~urw|}|}r p{r}x{}ulm~~x}s~{{w|xxuyoy|}|yz fwwvv~nt|}~~su}yuk{wwnzuw|ynxg~~t ~u~|ow| qru~|x~ty~vr n{}{ply}vptos{{vo|}}}q|~y{u{}pxk{i|l{z{y|}z{~wzy |zt||~~r|xuzx}zxwx z}~ q|}~w{q uuroouvx{y } ~n}|v wxys~v~z{q wy {|{wytty}wyr~|yvrv{ {o |~o~wupzs}}sz|bowr|lu zxx| {rxty y~y|vos{| ~~xz~r~y~z}{zkx}~{w~y|xv{uq~}z{{|yxvxpyzx|{u|~z{ytxz r}mzpryor|}} vs~x|}lv~|}y}~~up~zz uw{gw}oy| }vvy}im|}uv|v}}}|ziyyr|uu}nrxwz}zv~jzx{q~w{|~ts{s||z}}{{{w}}vvw|rzwvx{{txzw|{~{ssyy~{{~orz{{ru|}{~||}q{}nu ~u}y||zy{rz~yyzoxs{s{py{ {{yk}uyzwyvwmpt~|v|puzy u~rvwzuyxo}o|{~}r|y~w}z{{ ~v|yom}~~|||y|~w rrz{zpjpzyztzvryt|{}sp~~vyq~yv}|}z}ytz}yqw}~|}}{ j s{oiw{|ynsx~ |{wwpjxtyx|~|ztvwyy~{x{ztx|{op}~}|x{}u}z u}uu|yy~n} s~~zv{}yrx}yzl|}| y~{w}} ~|yw|{y{{ {~x}|}w|{xhyw{{ruty}{zttz x{~|zss{}{sv}r x|}}iozwpyzo|~~y|x{vyv{{ywu{t} qzs{{|x~|~}yzqszyv{y~ ~ ux vyrwvr|z |}|ys}}t|{v| z~}{tmut{t{|z{yy{uutx|~u |y~upu~{~~ytx|{|j|zz}tuz~~{ tv~xw~|y {j{}yyuxvuxyzoulrwvunp{~u~z}{|~wzxyq~s{ywwx~~}wwzv||}}xu|z||{zlz r~x~p~xy{{~{vxwuo}{u~z{|zry vw{{~wx y~v{|}zw {~zu|wy{ z|~x~zy|~} {uzrx{ {|z{~t{y|tyyw |y~}~ uv |}q}wzuyt } v{u~v||rix~n~y~x ~xr|y~xv~ {lzy}vw~zqyx|owv~wyw{yhzz{{sw|zmx~}yyzx|{ys} w |vyxut| }p}y|||s zpsyxvx{}z}}k|~ y}{ t}x|rl~{zx|y|~}} ~ }}u {w}tx{zyzwox~zszz}yvx~y|u{}||x~~y yu}}x |w|||y~ ~ z|w~~t z ty}nt zw~w| uxv|}ywyz| vvzv}syxv~~z|ws~u}~~|u sz|{r{}{sx{}~|}z~wvv|wx}zqyuytw{swsz||~xux g{w~{x|urxv}t}}s |}v~~~||}vwvxyt~xz oqyzr s}~|xvxy}~wyvw|u| st}s{pzx~}{z{zxzt y{~~~z svy ~{|}xw}~u{|}~|xs{uz|w{{vx~ ~~t{y}m|uvvq~y|~xu}{|s~ ylzyu~yzv|u|~y~zx}}||xsy~wyxu|w|y{y~{w yyyu{uz}}u vi{|xuprt}~u t|yz|{o~sz|{}kwxv{~~~q}lxzz}~~y}{}|}{wv{{{ w~ {~~~w||~{{w|u}y|w}xw}z~{ ~{ us}w~|wx{y|v| y|~|t~ rxwvw|{ty{z~t| y~y{yyz~zv}|z~ z~tw|sztw~v~zxsv~zy~~w|~wt~zx zs{|prypu| |x}y|{tsz{uqy}}||}x kwt~vuzxt~{{v }twvzyxz|zzwo{v}zw~txq ptu~v|mqqq|zr~~y~t}}~x|vk~{}{ | rv}wq}ss|y}x|szl{gyw {}~v}qzuwyzr~|wxur~}y~xlv~v {qk{z {j{y|y|w~uwu|~x}{z|v{zz{{ w|qqnpyvwvlqtv{ywyt{_u |||~} j{{v|{ow}qw zqz|~{yl|t |v|suru}z{y|{|wzuyyz}y}z| ~{tht|}|sm|} |wqs{hjwt|qu}z}yq~{z~{{qq|}pzzrw|svujj{i}yu ruv{~w}}xwusw|y |}}{|}~p{wtqxkzx{p}z}yysvx yxw|~u |~xrp}}urm~{{|wn| |w|zytvo~v}~xtx{}w}s{~uu{|o|z z{ u}zw|xz}zzxswt{sy{~z {x o{zqsw~vu}}vyy~zut|wsx}pr szvqf|~xz~rz}xy|}~wv}n}{m~|u|vszx|mx||t{w ~u{z|xx~uw~}w }rzx|y}z|yyu }u}}ukv~xy{}s qz{yoo w{ {v}|}}wxt xvs{{{~z}z}w~|}y{~zn srzwrq{~}m}yt y zzrys q zt~ }nq zz~}yxy~}~wyh||vxyxqxy~yzz~v}~|z}v w{ri y{z{ ~}vzsyll u}xtx~ |w j{}wzy|yx}~v|zz~v|}xv y}}|y|x~y}~}~h|v} zwv~}}lv z|zyw ~u|q|w~ xu z|zyv{} owill || t}z{wvxu wyyzy~z}uxx vvwxy~{ ~|z~w}~}}l~sw{z| w|y{w}x|~ sjr |zx}zz{{uz{qu~ y|||}}zzx sx}||}{zy~xy v}v xrz}}uzsy{xq}j|||uz|}vw~{sox{w|~ou~y{}zvx~sy|w| {yvz}}~qv}|~~}zxf ~x~|~vyz{z}xx{|}x{u~x~zxwzz}zy ~{zuw}|swoyy}z wzyzz xxwt p{y}z|}ux z~}m}|w{xvuz |~q}ny|~ zez x n}sh|{| } snv}{j}}~|w} ~}y ~}}u|y|}xoz}zyy|u}|z}w}}tuzqy}v }wxoywu~~~{z~p~u zyyp}} zv}xw w|z xo rx~}{t{n~~qnun}w~z}u~~rptir~py y|z~z}}x p{{ |}}~vm|uyus|vykpz szuqu{o{|{zyvsnyzu{|vyzxwt{~vjvz ry rx|}~}y {x}z}sv}||uzt~h{ z~znuu~xptnur~`zoxyr||gs~zuv} ~{xpxs}{vw|r }||||c~z~z{x{w{w~ {v{x }~tiyxr~un{rqtn{qv{y}jzfpvtwtsmwm}qyz~wcp|stzsr{~~wz~{wqsw vv~z||}~}{wwk~l{} }pszwyw ~|}yr}zy|w{~xuuu{tss{{t{ven }}fr|u|zu{|} xutxz oy|}sw xuu }zyiq}ztytlzv px|nt~m}} wxaq| x{zp k}}z{xg{ tz`yy upzx|q}~wzzy yz}}y{oswy}x ~z}v~t zw}tvcswyxh||{zyy mszqx~x{~{tzzptu{~x} h~toaz{jqxszz~[r}xrp}|}rzt¯w}vbrs }im}}{s{vst x~{ushwvv }lm{~|zxsymyq}rp w}zld~|uy}wjhwvsw{|tjryz{uxxpz{x}~{~~y vl{{uvg{w}m~w}{dv~uugr }¡lyq~ ~¡}wry¡|~vywmj~}}sh~ {}} v|~yt uzz|~izxvyo{ut|~yy|zwg}|l~qas{| x~nwy}s}~z}x|~ xu{x{z{}~}w}| vx} p|zv x}v~ur{~zu~|sytiv|y}vtyztyzuv{~y}~|lv}r~p| zs x} }zv~xux}~x}}xvz}xv{wz~{w|xx ryy~zuzvpy{{w}w qxx|}||n{{z}}} ~w}}y ~sk t z|~~|y{ ~xsuw}~ wwyut oxv||zxj~|x |~}w ybntrvjwz zkk}y~{xqv}y~y{}yp}ux|y|}y{y|sy{oyy}|uq ~nxm}turzzvi}zxwkwxytuxxwti~zgw~| yh~{zuz wuz~zzzz|~sp|t~|~}sox y yv zmu||||nry}u{ysp{xw~zyzwzuqxxu }|wvz~y| o zz{uq{u } zytstz{}wt|}z{zw{t~zyytyzxz}bz{wvso~}z~xiohwjwo}kqu{~}s~{~roxt w}y{|}~x{zyy{yry{|xyrm~zzvxtv|zsx{ppt~zs{wk{y{uwyu~~ zvyu{uq~ uwp si{y~ws|| }} n{x {xyu}}ux~{vv{{|u|~p zx|} { ~}xtyz viv{|wyp}y{~t{wvuy||zrux{uv |v}~}zymq|}xluv xy|yq||y|y~uqwst {|zywwv v |wx}|u~~xv|mz ix ~~oz|x~ q {vv}zrywsz zuyv{|}x~sy||{}sz } tx} {xut|~xk~~}qutvyz}yuyzr}}yzxyx~yxz}}xz|{t{y}{k|v}x}sv{wzlutv{u}zy w xw|}q{q{k~{z ||wp{z{z}pryv vz~n |} ~xykxzz|zyzsuy{||}uz}{vvf w{rzsz z~{ ~zv{}q}w {{~~vjoume~| sv{|w|t{p}lgs{zzqu {yz~ ~{zy~{|z{|yzz|zq{{py}}pz}}zo{i{}vsk}l}{smwv{~w~zu}v~~z~~z{|x {{}~ {yyuqr rw{~t~ xrnwy~}{i}q|z z x{zxts|~{zu~tmvyzw~q| x}ro{}{vjv utunxsv~ ~z~y}~|wpwy}~ }y}w}~{wz{wqy~|~}vwn{{|smvv~y~x{um}t~qy ~npu{qhyx}~txy|}}z{w r{{yos}wr~tq|{v|~|v{~w}r yp|zu|} wx{sp{kt~{{quyxs{}}{~{~t ||zx}z}~||~v ]}y~~tz zzw}w~uyx~~uwxz}r|yp}yv}~{{u }{ v} u~y~{w}ryn}~y{w~zpmwyyrr|¢t~| spvw}yx|tyu it}}z|w}xy~|v}~yw{{xyzz~z~z v{vy| ot|}~r}{st|~vnunkr zsjuxtpp}q~{}yjtwe{q}nqu }ynts u{ |}qyxz|wvx z y}{v{ps} xztu{zy|yprvz}w~xtu{|{wzw|x } || }}etyx|{p{y ux|yv {x}|} yxw{y{ wzym|tz{yi}ty~{wr{{~yzzy~o|zy qnj~r|y}m{ ~xw}}y}svu|vxvsqy|zu|ytnsri qyy}zuyqu~xp~v}zlv}m{zyvv{zy} x {r| {v|vw}|}}vyo} x{wwl{} }|rtfx~xt|r~|u}|qzy txm| {zy|utz~y~y qs pov{|w}u~wyqtt{~}{k u ~|t ~rzov{zn|~u~x~x} ~l~~{~ o xxwvsw~v}|{{yzzyw~|v{}vqoysx p}w| yuw}|~r |z|~}|}}mw~tz~vz{ |{xrgvz|wsz|~|wwr{spjxtjzzw{} uty{yq wt{| y{} x ~{{~z| w|x~rs}v{|sx}u~uwz{ay ~g xn}~ xys| fwfvx~~}pr {i{uy|yy xzy} zzv}|~y}{wuvpu~{tmqs}~yvz~vt}n{yyt}zvy~ |v||xvyz tz}~zwywzyuwys{nwyxzwum vxvxz{rsy}piz|~zz}{w~}rzx~ | sx y~wy zzvpyz}n~ {~tw wrv{ ~p }}tk{~}w ao~{rqt {zzx}y{| x|gys}uv y}zvuywy~xv|w~zu~z}y y xy{~|rprv z{l~os}r{q ~qvryolmy tp}}~vo|r| px }|qy ylqvp{wxz{~n{z {uy}ls~o~wx}p z}}u}yttlhz}ttw}}v to {t~ww|x zvm}{zv|~prywtv| w~~~wz{~h{ }~z{{sp| }qz~||v}z| w}rnxz}y}~ssnz{{ux|xm ixy}}|t{}xwqz||~~wq|~yuv~v{xty{|~y|zmt}z~vpx{} ~|x~}p |{}xvzz|typ| { yxz} suvt~n~w vqq{p}rzqwks{{vwy~hm x|}sy z|wrs|l{w{t wv |w | hvwxuv~u xt rs~zr|~yt{y{oz{nzz{ ~~z|tlu~}tkx w~wttzj}uywxw{{rr{|~v wtr{}~}wt lpv ~xzzvu{{v~{t qx{~|~ow~osz} w| {{~{ xu{~uyv} v{}{x yyyxwwxww~ ulw~|z{}|qxuy{sp|tqu~|y{vsu~uzx y{z |u||}yz s{v~~ z~~|z~y|w}x|oyy~ztvz~yy w~|}e{~x{{}tqyyzx~w up}yywuyw x}p|q~twj~j}sxvdy|xloxvy}{o|jhr w{{v vn||}q~|~}~{|}}u~|{t|w~x| vy~r}st uz||zk}r{|~s|vqzn}{}j}|wy|}x~|ut}yy zr{}u|w| {uzv zwt ynv{} {y{u~zy rwy{wx~| ~s~~{r~tn ywu}wzx}|nu~{we||{hmxszsv v}xorzwz }xx~m|vw{| su}{z} zw|w}{s yv}q~|}z xw{~t||w}{yxrz |y~zy}xvx y}ru~ zrl zxz~y{~qst}z~}zyyt m{~x||zmx}~v~u{}~zvx~ z}}{zrux{zwq~{yo~n}~~{ }o y|mwz zx|~z|owsqwy xx }z}|}uyuy|w zwu ~zr~~wuvy l |q|vx{z}xxj|y rtzywv }zu{{w~zz{{zy{zu~yw~w}v~}su |t {ryws~}{~lv{{}gl{r{ x}{|lyxxtx~z}phx~mw~~u|t}~s~r||r{}vz~~pxu{~| vw| wuu~y}{xuy z ~~ { py~x~ xywy}pw|t yxv y|s}{ {wyx}{ |}twvz}y~}~{{v{ o}vsz~}}~ymvr}xj~ |yvy~|p vvj~}x|||~ x x~z|y}y~y{z}xv{xw| }{q~vjy}z{} s}uk~|uswv|qkzvzlo}~ny{yz~wz}{y}ypszx x{~ztnv~t} ynz wzfr|oqx|}zw wly{uvxv}yl~{y~mrztytz ~x }}} |w{~v{|z v qzw{vjvu|wrwx}yrz|~}w|rw}}v uq}y}~~t{ln|oq|{|}yzzr t|yw|}{x|z~|w~wnz~}w}~~{}vzttz}z}}y~vpko|zy}h|{zvon}{rq|q{}zuyu n|yvxw~~tzuz|~}u|t|zt }}u~~}~pw}{x|wwuutnr {l}xw{ztq| ~|y|w|rx}}wg}~{}|wswpvr~}xzsv|{}uy~~v e~{}xu~t}{wu}{|~ su |wlx ~yovwm~{qx~pw |zo{{}||sx{x ~ztzsu~{|ytywv{v| x~{v {~}zsk|~}|vtyyxwrzs||}zxwm~ }dy||}si~ ztuz| n v~ }~~z} utz}|}~~{|o~}v~ z |{|{vp}|wzy{~ }}}zu~ut{{~zsz~z}~|x}y~p{z}|~|v~v n|x}qt{z~ z y ssynwvlm~}qt|uzrtt t ~sw}s|{t~w~{txruzn{qu| |mvxx~z{|~~xzpury x| |~p{xz{yyuyx xtwzy{yu~ op p tn xt~wzy}vp~ps ~~y}| w vz{~||awxtsww}{~} }vq|}nwnzv}}u uo~zzt|wz y|v{y{ x}nv|}{}}q~~zyy{ |r~~u wvzuwv~r{ ryzw|y|z{{u t|{||~o}yoms~}}utys}yu }}tuy{~xwz}|y t|| ~o}vv {y}yzx{zz~{~~n|}~d{y|~j|wxpzlw{wwv{x||{{ y~yw u}t|y }~}|uz szt{|z}{~m~u|uuuy}pm~ssuo{j~}}~|yx~u|{zswt~xu~rsuy}|y}z}zy |y {pzyu~u x|jw}uvxz}nk~~} rv|uwysr{~{x x|}zo |}uy~w{ s~r~} ~{qp~ f{u |x~sv|{x{zv{t}ymyy{xzz{|}wr|z ~~}|z~~}w}{|zy|zqr }~n uoxy{{}t|}xzkrpvwl~u}t|uo}}t |wwy} l~zvyxsx{~o}zz vt~rxx}qzk|xwz}{w yx}row}{q{zz}ypzxu{w{l~yr }xy izqp}y zrm}~|}{wy~~yvwz~oft {~oxy d{{rz~zutzv}}yhy~rkvw~vx{{yzy}|u x}Z|| o}zz|vr}{vne~vwhv oyn|yltz~t|~qyjtz yz{xk~|} }v~ ~t~s}sx{st|n~x~}kwse~¢tsq{c {tp}xwe ~ w|~{xs}p}{x}}rv ~ yxwf xvuwx|vr |wy}v~vvvmh{rn wy~szvrrztex}jz}nwzts}|zv}mmwz mzv~xZ} w|znut{|jwvwvvx ~rg}uj~~yoz_{v{wx}rruf|w}vkkyy|x¢jl k~ xvnw}eyvxf hn}ym~|wwy{{w }q|tv|u|}jy}ysgzw{p}w rgt |zy{o {wzr|{wfv{sivzwa}n|{{zuvznnuz{mqi {{vzxw}qwvm}zxv |sz p{w {mjt|{q{tkyu¡~nu~|yx{~z|utv~y|{so||vpyzzsur{tswxz|s z|zmumq zdmsxz~lybn kyro }{f}z|~}o||zjw|v|s~~}l{}xo~g~{~z}mt y{ tpz}k}rwyl|x}swv{uov~nuxzf}}wwu} iy}|r~|{xu|{wu}vxg~w|m~~q~wp{|s|z~nxv}wz{lp}uqozzf}ryw{}o |z}vxvxv~wyr{{~{zz~}}vxs|xwqr|s{{lq|z{ yu}}yyz{g{{ y{oxy~mzluqvw}~{ {}{tm }t~w~y{q| ~z|zxvx{~z~rz|vrxx|}{u |yyy{x{xr{oyxzz~ sxx~zvvjyq}z}|zv}|{~zz{xrv}}w}x|} uu}y}t||ztx|v y ~~~srv}xsy~q}}uyo{r oo~|}nty| |lx xynxyso v}wrx}}vxm}~}z~{}|vzs{}}u w|yyw{|xy~||~}}zuwzs{}{wyiq|eq zz}s|ir |xn|z||vy}s|}vz{~r~ykz|~}t| |zv}y l~zy~zsp|w|u{mypq|z}u{q ~{pznw}{yzzuut|yzp{|~|uzwxx~xry g h}wp }w c}x| jj~{ z{|xvzvs~~{v~k~ }{~ywr}t{y~|x}||~~v}x~}}v}q}}{t}|xsp~}yy{nn xve~y~yfxsp}z~}~t ||xx{w{w | y{l}|swu ~t~~ z|}xv| }wu~wntwuxvvs|~ytry~ o}t }uwzxu~~}x ~vy}}{zoq{{~r~z|ly}x{bxzvlywqsx {~d~yr v}swyxxqwv{|v~wt{y}y swv y{tj~ |}yt}~l||}{zuq}cqy{ xxz|}|r{yy~g y{mz{vyw~}~s}zyxku|||vvzwvw}~{uxy{{{sx~znyy}~y~xyw~vyqy|}y~y}pyxuys}tmzzztwzx{k|~n~xqxy~|ol~ vw{}{{ zx~ v|w| {v{{{tuf{{zlxysvpvwyx~h| ny|{{tom~v|ywjm~z}znyp~z||ytxz} |u~}}|r~vzr~vws}w uwx{~t~}|tk{yz }{{~y~zvu qxywuv }g}w{vv~esz { uy}}~~x|vx }}u}z~w{{|l~qpy~{~np}{vtq~yrj|qys}~}pt{||qr|u}}~w{yq myw|~ytmxur{szz{ y~{{uxuy|}~zx u~~wvz~|q{{}}xz{l}~x{z}y~ y}v}~v}|{vwguy{{zyx{wywuyw|zt}uyy|~r t~y ~ ||w~~~s}ztzyu~yu~|quuzzpz|qzz|}z{~{w}}~}w~t}y}|ytz|z{vyb}zww{}u{{~~{sy{x|}iz{t }|yy~| mxz~{kvuwqwtx~|~q} yz{y }uytq xwzv pu{}z|ex||shgzzi{~u{uwsxz ymzy}wwiup|}{|ww y}zut}}z}x u{{ywx znn|~kw~uzut zquor|}vywv~~}nvhxr|{ ~p {z}||}t {}x~{y |u }|z} yx{lxp{rzwt}w{~z hl z|z{} wyv w~rk~y}~x{t z{u }rty{}}}zu}wy ~}~zrxzzp|zwqn| y~{{|swxvpyiyx| uz~}qmyrnutx|}|}sy~{}wxz}~ |~wrq~s}y{ zqu}w~t|~{|n}|sz|u q vs| zltw~sxyo~ uw~v|x~}wx~{wwtysstz vyv~ t|svuvy||pz~rxi~}~y~z|p}twvy~zzvurx{ty|}wzz{~z~u|x{}v~s{wy|zu~{}o~x m|r{ zzw{nh~vz|{zw|t~}} ~w |y {vz{ x~w|yrpk wt|ulyvyl{{|qxt~lv jzw|qwt}{nvw{uvy x|szzxx~s|pv}zrxuuq~~| t vkyn ps w}n{v}r{{jy~n~tyw|zzzuy| |} v y} ~~zv|}}{}{ qxc yzepxronl~||~ot|sxyvv{r~s|}|}txx{{ny| t}utuzz|}wp{|ouvf~j|}|~}unzty{}sdzv~pv~|w} zh s|xs|{ s{ vz{w{|~yuxv { m{su~wqvz|ystevlvp}z{y~||nv~qyz s~s| txyx{z~zly}v |uf~xow~|}~{po{ ~g~~}xz{ wxsoy{~w{zp{ y{x||vuyz}|t |~r rwzplhv|pu}}y|x~ylxuu}{o|x}}u}yu}~|wyxyv}zps{~tum~pnpnrxpynv}sv}b}}s||zyw}¡{pt~rxxvv}z}op}k~~z{ pz|uxz{{}~v|z }qsp{w{yv}mvx~r}ztfty rv|x|}m|x{xq{}q~ql}|xw~}l}} |t{ ~n w}~vwxu {{x~pw}}{ww{e~vqxy|{~r~zo}{i~~udpn}}}{u} m }yw~}}|z }utwzx xwt~vzyp}q~~}wy|zr~wzxy}}wzz ~lmx~{r}o|yzxo}|wy~x vox z{~~ywvy~~~yrp vzx~uluu}l~xv~tyttt}{x{srrz}~ }xvou}s~|~ }~zv~yr|v} ~~y~y|z~xyjuywy} u b zzyl{{ptp ls}w}~ytq}{ ~|{rv sy{|yxs|yzu x~~}z z|~y}}xw}|~}|xtvs~}|}x~ {}}{srlu u{xi~yooyywy~zx~|ztpzxy~~kz~{{|{v|x{t }s|uk{ww|}tyxz{{wq|}rzsvw mtynz~ {v}wsx||zw wy||m{zs{h}|txz| |{yy}zvp| myr{vx}q {}ov}u}xx~~yxx{su{m ~i}ptvt|n{xzzxn{wz}{wzt }wwsy~xs~w}umwzv~t{r~uqqtzvs nzvlxtw |~qx~}yuy{yn{y}zw}w zzq }|{| w~vuu~zwtt~ust yz~l|| |}yvxy| kuww}yl~y||||}tnqy|~o~~{{|xw||m zxyywm|wxu|t}|r}uxw~ |z}z ts}zz~{z zy}}{yy w||nr~y}}y|vy~uw~{ky~xxv|~vx}{up}~~{y{y{}upw}un}{}w~p|u~{||vy}xy{q~|zz|~lyzqx|{{u ~wy y{~~|zvzu~}~ |~uqwoyz{y|p|y}p}}xz{zz{| r{zy|wxzwza|zw|{uvsn~~||py}t{~v}y||l}xvtzrzpuy snqt|xmq{|}}ry j}vyp~{|gv|t|nwzjuwq}z|vsvnm{x||w}u|w}l|}|{yuypzz}yop}{zxiwd ~z }suqz wsqqq|sk|yvxvwwx|}x t~|fx{wy{}{mmtixskvttnz~inwqmvv q}yux|yw{}{|{vzi~xr~dtz~ wuuriu} r~k|wus~ y~}r~}}{z~ztz~}{z}~zuwu~y~{y|z{xp}~t|~~~yw| xs xwvw~m {to{}{{ptsxy{}znzxy~rz q}yrpxzs|~}j}y~s| }|poy~xy{}|zwy yvw}t{vr~~ypx}y{~z|~~}~zvs{ { {xym|y~q}vyzzw f ~{} msz {~ytzyxyxw}yt{zy}|z|{f}syw}| ||l|{|zorywwvwx{t}|~oxxw{y{|y~yu{xt||p~qz~zs|yp {p} ~vy}w|~xzxz}vqzp}vz}}w}pxw|slw|w}ht{|pp|~tyvzzpxtzwwz tzxvz{tvw}}ux}xn}qwyxsxw|z||}q| rwyxzz~|~{m wyxy|zz~{~n ~xuyyps~sxyz{vzxnzn|}| nwpurv pnvzuyv qy| zyz zt{}{y zx~~w }xxu uw|||}{zwxzj}z{|{y}{r }rx ~xy|yyz~ y|y {}}vv|~st|{ziy~~ms|~zrv~tsy~|sy qph|z~yu}~}tu z wt~{w~|{zw}yn}z~|uw oqz ~oyzzx~ypxu} w~} ~lzw|~uv{}}j|vo{{ox}|z~{{|{{|{xz xyq~z u~v|{pxw}z ywsw{ skzto xzpuvw u}w}~qx~| ~vz}vx {sx|{z~ y}z}ozx{}yp}|}vvz}l|}xu~|xz~|y~|zu|z|||vx|w|{uyus{~ yzvw~ w{~{ {|}xx||u }~}{z|vwbrm|w|p x{~u xyvl{s yxv s|yr}s yz} }vzv~szz}rvx}{wv|uy t{~u }}~u s|y{szz}rs p{pqktvtou~uxj{xh~}uqv} {~yy~yy}uww}~{x|yx{~ vuz|s}tvkw{z~ty~rxxw|z{z~xw{r{wy}~xxz}}}p z}ztxzsz{x q{u|}{{}rt~z} t|~zx}w |o}zuzwl{syy{~}s |z{~ {r|~~o||zys~z~{~{ z}zr|~xz v~|zzz||}z|{{}|u ~|z~ {uu}}~}~z}~~~|~y|p||twz }{|}}{uz ~w~q{yxvsz{u{ ~vwsryzyxzv~y}t|}}ov{ww{~{zynz ut~u}yh {vytx y n wv{ww}~{yzv{~v~rns|wozuv~ w~r}|z}zr{y{}{ yxn}yyx~~yx|z}~wp}}}r~|~z}zzz ztyv|uvv~}}~v~q}szz~ y~}}x|p u{~zy}r~}}wz}zz nz}zx{~{uzzs}~qx q~uzzw~ys}xw|zx~}{ ||wx}|uw~y~yoz~sz~t{}p~xps |{ }t~}u}hskw|g |}o|yv| xjv{|livynwn | pwzq{|jo}zldsdq~s}{ eyvwu{pxyxuutuy{wztv }|||xu txu{| t~woz}~y}\ypvrt |z~rv}[yv|{oap|y |s|pxq}ll~k|i~|}}yk~y{}t}yrttzn{yo~}|qvvw}{|s|s{w|z }z~nrs}xtcxu¤{{~{vy ztw|w|x ~u\ ~ } gt omr~svt|ttxzyph~qrxyvms{~ocx|zzts|}p~ yyjvyu|yinxr}wpr|{}u}}}wuy|~u y z|xtxl rnzw{l{{svxrlpf}vzuxy]~}x|vzcaw~~}}|{fty|xlhwu}z||tz}ty}|u{|~z~x{fn ~}u}\xvgpyp|nzc~x~n{}~{¤ {y~{u|nq}{vv~k| |y vyt x~zulxlyrs{}kvy|zl zwo~tpzsxkmw}w| q v||j{xzwx}y vp }ts~|{{|wzsu~}xy}tq~tw|w~ui|~pk |xjp yfv}}xwvp|n{xx ~}}{{w~z}|ty ~wy ~~ujwv|vh|s}Vvx |}|ztw|{ |~~xxy|zxz|ow x{~xy~{ zxm}{v~u {mtzdwq}vi|zzyqy } {xvy|{|}zxvsvx{t{|uyz}~w|z||~|yxv}|wy~~{z}xzjjpxrn}z{ymz~kzxrx~{zqv{vzp } { |y}uy|w|y{ {wu}uyz|i~y~sp}rwq~po{q| k|w {yp{}}svoux ~rxv{}t{} y~ y{}wz| th {u~|twx{qf~|vh|{s{vvy|}xs}~~} f |tz|}~x|yyuy p|z{{|x zyzt}v~q~zynz||sxtt} p{w}k||s{v|jo vv}s} k}hu}|jtxyv ~zy|nz{lp{~}{x{t{t|~ {x}{ v~vxw o{z{potyl}j|{ ]~}xtqyywu~ {{vl~gwzu ttxq oszyq||ww}sw|}~y~~t}wy}|{z}uy } ~~nly|t{z}pt{{kxw sw~xqrv~} r|~yk q{s| vuzo~wxp~stozt~ ~}znz }zsl}yv}|}sxvmq} ~}s hw~{y~wts}|lvv}u~v{|s|ustuq||vyw} |yxv{uy}|{yyy}tq}wz|z}|u~v{szzo}| ~|mtpmvu }}v~r|x~ zp~x s{vw{y|{ws~{ {~{t||{tz}xl|wz{x~lx||zwwz|xtwhv}{{|x}}x|}u~tws}~x}x ~xtwxxxxwy~v{{z{{szlsywry{l}o{}zxz{y u g}yvp}v~~m}u}u~|two}~}y| v}~wz{{zx{xu yt{{~u{|~|{pozt~|yxuzt} ywv|ts|vuwkpuyzyuuv ~}rwmy{}zz}w|}}xyuv~v}{u|| ys vrv}q~~o yt}rn| yw n||gzvuvymz}x}}p~l{yustzty~x}tr~szqx{yrz}h {|uwqx{ m~ ypzxx{z}z}} }| |wvx~}vxqd {}} }{m~}yz||w~u}zg| wt~|~|ux~}y~wxrvkwy vw~zyno~{{|~r||~}vu~}yv~w{z| zx} ~|x z ~~tsr|}{||~ yq |stkx~|j{|y~||}mz|~|z{{}vxw|x{ zyqz {{~~}|xokx~tv}y}w|ws~ve |qzx~{lxvxy|}s|~{ zxznx{zxxo~uzk~~z tzx}~m }{vwvk|z{ovrzyzw~}y|o|~ } t{ wzwvy{|~|lsy}}w~p~{||z|}v|vwylw| m|ey~tz~}~~u|uy||x xv|y|rzusms~v~nptp|wy{g~xpz}h~{slxq~{ v}mw~}}|{q|r ~ {u}{ xx|}zvw|y{|zth {{w}|}|{qy}x~z|xzzy |zzw}{q~qxmz |n~w~~v}~}~ u~qzyxwqvztx l}~~s~rvw~x{zwuyxv{yqyqzw| }{z xrw}{{k}r}~v~u}~zqpwswwwxuu}l||vxwm~t~ qt xux}yu|~xs|vuwuq~ypzw{rq{pxy{|~v vrt zn{}y~xvxvzz{v{}x}s~{x~}vz wr}~~srr~| }zkyv|x{mx||z ~yz{wz tuv{}v{zwt{|zz} |wy }{}tvxw~{zfux }|~x}q~u|ud~vwyo{{}z|jq y|vr|y|~~~x~~||z||x{o y~|mqviz|k i{zuj} yuu{vxu~uy~}~zz}|s{s{}puzzz {wsww{zxwrqw~~rzo{~rz n{j}wu|thvy}wu~|xm{{{v|q{~ mxz t}wzt| yzpx | ~y~x{jx|{yu |t t} ||~y|~~|~}} }oxy{wxxy}rxsw~~yqx~v~jw{~twyoqvxmt v|rr}{ly{vtvs{|~y}rr{~w{ ~w|yzzu~yz|pyu{ z}|qln{|trn}w|xqz wy{j |tv~w|xy}{~wwuz~ v~{|z {| |}wz z~~x~u x{t|pv}v~r}t} ~}{~|zqw} y {~x~| u~} }yzvvtuw}}py}ou ypp {zr{zt{v {wvt{ tt~~|{{v}~vz~} szyw} p}y}{z |}|xz |wxz~}~jv}smvu|t~}~wz~m~ztzp yw|~y|{v|}|{}v{q~y}vuy|yx{|zzmr~b{v y~vvyy qqwz yvvp{v}~ ~y|u~tz}{tr|x z uy y}qy |m{ zxt{{~p{ |{ }xp~~}{yw}|{nu|}sxy| |{{|}y~|} vw~|w~t~||{~}~wqyy| wkp}{u|v||xzzzzzv}~t||ys ||~u~z~s~z}z}vx{{v}{y}v{ y}}|ww{wuv}{ {yt~ }z{w{y| ~u}z{}| {{ yx~|yzwyrxp u{|yvw}q~zs~tkysr|rryyu~}s ~}zx}{x y~{zvx{y||{y|} y~w}ovwy{hwx{tv l}}v|t} sypxzww||nzzu~suy|q}uwvtw}tox|~|~ysyry ~ zkt~yzog{z~qyunys|piw roj~v yr{| z~wtms{v }ysv|~w utx xu x~}yt yx{|w||w|os||vt v|d~}~~~wwsyo|k~y t}msxzz{~tuz{~ {|ry~{{y|s}{zw r~v}v|v|zzxy~vxtt|z~ q l~x}z qxyz¢ux|u |ut|w}ww}r ~w} w}}z|x}t~}w|x{}vy~w|un~v~v}~|~ u|pt}wz{tz~zt }~xy |y{ |}wr}}y}yzu{v~q{| zzzwv~}z~{{yz|yq~zqut{zyv s~~|znrvw |~~vvwz{zt|yrzw|{{yuz}}w{~svtv|xxz|t{z}{}{}{~v~~~}wqx}y{vxy{|wx|~xzu~w}y{tq{{wz| {xsx} {ut}{}w|y v x|zwzw|~ }y|qyzv{zrz{y}wzyx { yvtxzrv|uww~y}|xyxy}{g}ttz~u u}wz|xzz|{z}z z{ y~}{w{y~qw~zr~t{vy{|}|u}vv }}}~zxn}yz~x{zw}uz}v||z|} ~|z uw|fxwwxw}|x}xy}}uyyzxr}~ u}{}tt}|wrt~| x wx{} u}z|z |xyzt y{{u~}x rwzyx}{y u~~t{|s}~nuzsxt }mzqryswxon}uzv~yyv|wx}ys ujz{zuwir}x{myyu}xs|x{w~ |z|v|q zozs{|vxwx|~tqxqqz|pzm~{zwn{|~{myx{~qm~v}uz|}u}zvvz||~q wxrw ty~z{|ww}o~xz{y||~qs~z|z ~~s}} {~ su||r|s}~{w{~v|wz{}ozv|v|y{t|uzww~ysr }r~z |{}s|}w~tw}|~yom~}z}t{{t y| x xz{~zzv~xyx{zyr{vy}}~|sgw|{}}{w|v{{y~ z~wx~~wy|zzzv|~xry}}{wy~{}}yv}uu ~y{~ yw}wxxz{~{~}} xnzy z{wsz|~{u}{{w swsy~xuq{|yyw~|||t}y~svl{xsuwurz }ss{x|uxz}zy~zuytlx{{|vyx x~t}zsw uwr|tv||z{~bpxzs{|v~ s y~ywzu|~ z{zu}ss{ry|r~|x} wq}~{z }swzy|~v|}~}v~}nyzvvwz~t{v|{y~w~|~z~zy{|~zppxwrm~y}pq|~oz |||}}~s{z{~s }z|vz x u~ {~~n{x}x{y} x~x{x|y wzx{|t}|{{u}|vm {|{y~ u |x yyz}zyz|yy l{|v v~~ow|z~xs}z{| y}r~}}v{cw}z} v~q~v{ w{kw}xvyy{xu{v~|u~y~|vy{ {~z |~}vz| |}vs~|}wyy|z}xtv|vy|qxu{|{vxvx}}{rqy~y}z~uv}xxpw{ ||y~{{zx|~z|z~ytv|yy~}sx{{r}y{ tsv{ }yq~xi~}xuz}zvxzz{| uz|z~lw{y~~ xy{{|w}{} |w}x}{~|{xvwz{|p|{{ q}~x{|~u|~~|suv{}{{~ y{}t}}|z z{zl{ ls|m{{qy{ozkw uzy~w|~t||zwvs| }wyv{vk z}y {x|zu}yzzhtg j{x~uzum{x~u w~zuuws~xn|h}y }z{yovxv~zsviy x|z{p{{~osq~czu|xzlqq{|qrps~n{mxv|~~{~~||| r~vuwnym{y~ z~}|u|}yywz~~~zxyyy}n|tvyvzuzyz{w {lp{|wyo~t}ytx{xos|zjw}yhz~|ywy}|| n~m||nzx|slum}~| {pm}{yzxv|p{| ~}|~yqv{y||~~|wvzz{x|u|u{|uslyw| ~}|pw{x}|{r~||~ }~|z{|y{mpzk{|zq zsxyp}vtt|w|w{xu|yyzx}s zw}y |{y}zyv~z}|| zvos}xxxyr~z{w|z}v|xg}vr|luq }x~~{pu|}z~|~|su|zuqrvxu~|~{u q~xzyrxypu }xu~ zy|~~ wv~t|y~t}}|}}ukv~{}qx~w~}{ytu|z s}|{{ur|~ s}ty~utyy~s}v~~} }{x{r||p|| x}{yu {|w~{|~}nyuy tu }p~qqzz voz~uq u r}vyu|rxousxyiv{numuz~n}luv} wrsu}y~Zwsky }o~x{ xvzo| z}~~ m~ox|||wuxz~y}{voy}srru{zunrp}jytmrzz{|e|mrf{vmr|}~z{rmx|ypuz~|vv_ z~ {{h}|~|r}q~ox yt}}qvwp}~}~szvujrn}p|~mmq|zq{{u~yaxp|}ry_|z|m{y~~yxu}{ {yztvwy ~{|~h|}~yarvq}yjt|}h{ss~¡|surtz^|zynqru v}~ryqqz|h^|lo|zlu{gwzmytrzv|vkx~v{x~}yyyw{tjst}|v~k}ja{ }oxtmtko~{yxzd{wy{k|}|u{~xt{{ vpuv ~zwt~}c~yzuy{vq{wpp~}ui}gv}~pyx}yazvw{}y}sty}}y~tpzv m|ysowswv| rxpziy| wt|w~}xzzu}|{y~uv|~ovwu|vjzey|{{oqz|qfyyznsyw~vy~ }c}~x}jx|l{xnv{{tte{z~ } w}sx qy}~wwlw}y{`}u~wsym{oprtwx|py~wz{tzxzxut~rnz{vxy}{r}}j hvv y xkuzw~upxs^}~zzzqr{~w|¤ysxvyqz{u xo||utw~ tnvst|tys`z~wq|v|n{mwy ow{z|xyr{|sy}wz w| ~{y |}}|~v| w~|q{|wz{pwztm ~yp{|zxzv}|~y{|~txp|txvx{|~z|}{ }uo{~ }zvx{u}ux{r}zxwn|vw{u|~ uww {~uyxv{uw r|q~ umr}xtzpxt|{~~y{| zw~}}{||wq{~{ } z~y~~ v{v{y }}}tz{~ w{}}}o{z}rysz~w~}w{{u }} z{~t ~{{}}y}y{}} yuz |uqxw~{ ~mzur|}xhj}xwrw~{{{}o}xp { }}i{~~s|{{}}}{{t{~}|z~w}ex{q|ly{xux tyq|z||ozlv}||||| vv}{w~v|l ~r|w r|yw} hp{~w|{tw~uw~ wxn}}~x|s{wvqwxd}yvzw|~{u~n|o|l}lqvq|w}zp z|t|t}}y|r|wzy|x{znyrqmw}wtxtv~rvi{s}{}w~uz~~p|||ng{|~o{uvtwxw{z|nu~w~x |wvywzy{ v~u|~v~|}|u{{}v}{w| ~p|z|w~zn{~ q{|rxytux ||}u ¡{w|uyxtpwtqsx~z|uz|xu}szy|t v|zy|p zvy{t|vp tz~wzm~ }|~g}yr}~{~npz}w }}}z}~}{~|vz ~}y{ty{yz~~xy}{qp~ xi~ugvws {|m{|m}is~~y}}|cp z} xqz~ qmtw{~ }xwo}{m~s}{xrw {v p{y}uo}y}~~|| x{mt z~iwxwxu} }s |xyq{z{z}zyzx}||z}vz~~w} ~rs} ||} lum}t~z~zywz|ty|~vuxz |r~vytty{s~qn ypxpt~js~uu~y~}s~uon|zwxrywuywi~ty|wzx |{} x{zv |u rwsz|~z|y}~x{yw ~wypw~rxwyy|{||ztw~|su}| xwxts|xx|x zyr~}t w qsy{wwpw w~w ||o|~zmy}w~|{t|{yz~zyxxtw}~~v| ~wt{|~wxisw}{{xuoxwyvwsxw ~yx{w{|y~v ~ }o|~~ {zx~xyx~{{t w{o{yu|vjh}z}xti~r tvtvxy}{|u}z~~| y|wu| gx~sjmt~v|w{yvxj{ nx}us~z{x ~uwy}{y vr| }jrux{v}~xw{xz q ~~tyw}~u~y|tuxsq}|{~x}}zzt kn{y| oywxxsvuyxzoitxspjmw{yu{xr{}t{|{wmvz|}}y |}z| |w|{x}|uq{w~}y wzl~~u}}b{~~wkz~yy|{{z|sox~}v{szs~u{}z}y{qv}uy s {tysz| z}~zjp~~s}| kuvxrmq}zzoe~yy~||xyvs{~}yxm} zlw||t{}utx{ys~~}sx}|zy~{|w{zq}p|t~}{}q|x}womzu}}{rrwuvy|oy|vwwxv}}ny{n{ z ux~~|}|vyzwso{~xud~{ }{qjz{w}swy}yq}}|}{{{}}rv{pw y||z~w|} tu{x}y~v ~|y||y }x|{qnvwx~~ h |}{~{z}z{~r v{n~u{xv~sq rwwz |rx| |~w{|s{z~r i~xy{ unryw{uxtuxnxunp{qn~|y zntuyx|yzy{y~| ~{~s}wvvyp|w|oz||xu }w~~g}tyrtz{utvtx hw~ u~{uvr}~us|}{w yz v|| u~y}xz}}|{ypxu~t~vl q{~y~uo{|wxzx|yx |x}uqzv}|yz{ ~~} |vmzyvg}~ru {|{zzujzu{}|w}uz~{|z px}z zvox~|v vt~~r ~q{zt{yu|~~~wj{uvsz}} xy tzwzy z|woxlt}}uqy |y{ w|qv} vtz| u }~ s } |~|{wx~r }{ y{vz~wy}| u{sx~z{wwoum|y~ oxx|n|{ zwwisuxzyzzzhvzs{ms|~uvuywz}syy} {|u|}r|rw{sz }zz{v}f~y}w~tyu~{z|{~yv|v|zzxw}|ny{t~}tx}y|{}~z~v}||uurs| {zv|pq}lkt xxwt~}~rz}ptx~r{}zsy n{ ~yu~r~y x}x{z{|~|ussv{yvt{y wuyz{||{zl|p}t|}twwzu{z {|xxhy}x{zjwqz}yy}ovt~z{p|v skh p{wp}k}wi}||z ~uz~ ~}~|z~u|xnzyvxx}~v|osu|~my||~t~ m| ruyw}x{|~lzr{gs| }z{x wzz~|{t}x w}|z xzy|~qv|vt|wuv |r| qt}vtvz|}{{}|{}fuz }|~nx|~{{}qyx lxxzq}yv v |xzv| l{~~{}{rrsw }|nxsy }|rytx}owq~y{ {{||zt}{z|qv~{wk~{tv~|zj~ wq}~wys} {j}~vzy~v|h|x}xwzwwqwszxvy|~~}zwzz~q~ty}~}ost}tqxp q{~v i}~{|yqo~pzv}{vp| s|w{zwuv}tux~~ v}yz{zzs umz|y{vxi~ s}{a{|ypr} |xxxyl}~|}zq{{|w |xvyz|yyy}~|~|txw}~wy |~yvqktvtll|xg w|yxpwn}n} {r}v}|xu||wyw ytz~x~}|gwju|rj{ougy||arv xteotvyrw~y}zx~{~orw w}s{ }} w||}zvxnu{tt|{z~}}uz}zxwu{lwvu z~}zz u~x{oqw~ }}t~| }u|{p|x}u{}~ww{~w yox}xm}qw wrkx|}t{ w|yr|~io|~}x{wry~}yz{}sz| w }u}mqxz~wv spw{} yvp||p||}ni{}wz}yxx|q~ ~y~|{}}xx{xy z}~wxp} }w{~zzw}y~|z xxz|}g~ y zz xem|}{t}~xsq hz{w}~p}t x}yx xz uxxww~yr xus|u{xzti{muxttyx|pnxx}n{|swz|{ y ryzzmuz~xwysxszr|}}r{v{}z}}zwy w{o| z}uxu}|otqu~xs{r|rp~sz|ub~y{vqrtv|~n}vo{vwp|y{{yvo}{x n|}wy|} ~uzw v|gz }d{w yysx}{|~t|lzfj|zns{zuqp}tzt}{|{v{yu{ q{ ~z{wvxqy wmuzytyz{w~zy z ~z|z|v y|~ }|y} |wz |{}sx]zvr w~uqy { xy|}lw|v r~xy{kyz~vm}n{zy }x|~| |yz~~{~~~}o||t|~xuv{~uh {z q³zÿ�v��²�©�«�£�����|�u�p�g�c�\�V�P�J�D�8�4�0�)�$���#�+�.�7�;�D�J�P�V�[�`�j�m�s�|� ����§�¯�±�º�¿�Æ�Ê�Ð�Ô�Ú�à�å�ìóûþÿÿ&ÿ,ÿ1ÿ6ÿ;ÿAÿEÿMÿSÿ\ÿbÿjÿvÿ|ÿ ÿÿÿÿ ÿ¥ÿ«ÿ°ÿ·ÿ¾ÿÅÿÍÿÕÿÜÿãÿæùîôóïøêüæÿáÿÜÿÕÿÐÿÉÿÂÿºÿ´ÿªÿ ÿÿÿÿÿÿ|ÿuÿoÿeÿ^ÿXÿRÿ¯uy |zyz{rqw}|qyx||z||o|o~{}c{{|}v}~z|}}v~wt|~}{w||| mrz~r{kvs|~|zuvzu}xtezy~ytzrx{{ q}j{ ~|x{|{urz}~}w{yo}z s tr}~y~zzpsvwn {}xsv~ } zov~vos~~~xy ~y}yzxxyz~ r{s{~~v |ux|lvxt}z||~wwzswr{z y~~{ozw{py~v{ ~}}wnp{z}wu }y| u|}}~r~us·¬Dì�7�¢�±�«�§�¡������z�t�o�g�d�[�R�M�E�=�6�0�*�%� ���"�)�.�5�:�>�I�P�T�[�_�e�k�q�z�����£�¬�°�·�¾�Ä�É�Î�Ñ�×�Þ�ã�çïöüÿÿ!ÿ%ÿ.ÿ2ÿ7ÿ>ÿBÿHÿOÿTÿ\ÿeÿmÿxÿ~ÿÿÿÿÿ¤ÿ©ÿ¯ÿµÿºÿÂÿÇÿÏÿÒÿÜÿâüéöññöëûçÿâÿÞÿÙÿÕÿÎÿÉÿÃÿºÿ²ÿ©ÿ¡ÿÿÿÿ ÿ~ÿxÿsÿpÿfÿ°d } x~xxto}u ~ {|{z{xz{|nzv |{o~z } |r}pv} v}g~z zquvz~ }zxg{v vz}{|wqtp}tv~ n|}wr{u yv{t~p~w{u{ {}u uxx~ zvxxx}y{tvrl ~~l{uo~}{wzr|~zxzny x~ ~o~ ny~p{}s|uzqw}wwt{|~|~s~~ xzs y|x| uw|z~|{xxyy{|zt|k~zpxy{}ntyvxt}zyzqr}szq~~tpw wyyx|~}~{z|wwy yyvy~s}u¨p±Ø����¡�£�«�³�¶�º�Â�Å�Ë�Ó�×�Þ�ã�ëïôúüÿÿÿ$ÿ'ÿ.ÿ2ÿ8ÿ@ÿFÿNÿVÿaÿgÿoÿsÿzÿÿÿÿÿÿÿ£ÿ«ÿ³ÿ»ÿÄÿËÿÐÿÖÿÝÿâüêùîóôð÷ìúçÿâÿÞÿ×ÿÏÿÈÿÃÿ¹ÿ±ÿªÿ£ÿÿÿÿÿÿ|ÿxÿpÿhÿaÿYÿSÿGÿAÿ8ÿ4ÿ,ÿ(ÿ!ÿÿÿû÷ôíé�ã�Û�Ô�Ì�Å�À�º�°�¬�¦� ������y�p�h�^�U�M�K�B�=�>�&.q^¢pY{~~xwr|zy{~~|l|ozui}|qo zwu oz{kr|~~z r~wqvr } xy{xy~||uo~ }|{v|u |}wx|}{r|y{{~}rqz{~|qwyx y}}|d~tqvp w|~u|y~ ~ x{uv}}m~sw|}|y{}|}{v|zz|{y}t~ wsw}syuqwyyq w|sz}syvyuzsp|{wrzp~xx}vn|z|x{x| ~~suytxu{w}royy py~l|wzwp{wt~}{oz}}n}o|}|}~~}} }zv{y}|qi~zxzsy~ytl{_ùIÿ}ÿÙÿÊÿÇÿÁÿºÿ³ÿÿ©ÿ ÿÿÿÿÿÿÿvÿpÿ]ÿcÿ\ÿUÿRÿKÿCÿ9ÿ5ÿ+ÿ&ÿ$ÿÿÿû õðïê�æ�à�Ù�Ð�É�Ã�¹�²�¬�¥�������z�t�n�h�a�V�N�E�C�;�0�,�$�!�� �!�(�-�:�<�A�J�P�T�Z�`�f�j�q�z������©�±�¹�Ä�Â�É�Í�Ó�Ð�Ü�ã�êíô ýüýÿ)ÿ,ÿ1ÿ7ÿ=ÿCÿFÿJÿSÿZÿdÿfÿqÐr_=revum}r uypav{|{l[|wei s {st}|{{{u|r}lv~sptv}~ {v{~ }mptmw}zyaq~zynkpfvzulzx}p}{b|y| |uuy|{r~w||tr |yw|wzw{y}r{}zwqx~r{|qrw~j{y}~s}unys~w|{p}np|~zyu|etr{|}yzzgt~~x{~g~}v~}{xym }|vyxvwzsq|~|n}wq w} upxzx}{}yo oso qvzsopux}yyzsumt~w|lcn~|v||~xtw~t xw~ {|{k|{zu~xyxxy~wv~uw~xntsflûn{ÿmÿÇÿ´ÿ³ÿ®ÿ©ÿ¥ÿ ÿÿÿÿ ÿÿuÿoÿhÿQÿ^ÿWÿSÿMÿGÿAÿ=ÿ1ÿ1ÿ+ÿ%ÿÿÿú ôíè�ä�Þ�Ø�â�Ï�È�¿�À�¹�´��¦� ����|�u�n�l�b�[�W�R�G�@�B�;�2�+�"���$�+�0�3�:�A�H�S�Q�Z�j�k�v�������§�§�°�¶�º�Ä�Í�Ô�×�á�å�êñöùþÿ ÿÿ$ÿ*ÿ0ÿ2ÿ=ÿHÿMÿXÿZÿ`ÿiÿpÿyÿ}C©rcxp{{ugwup|t|zvmwv|kvw|~stt|ovp u{x{~p~{|zv vsf~{ n|lynktty{wzpyqvugxwu~bw~umqeqw{w}~wxrx d~u~nm}zxz}rsmmy~xzr{pjx{krmqhyvayzo nz{qw{zs}}}| {v~uzx| ~v~vy|x~~}|rzmv{}n{zvw|xrys|yvywyy}n zwsyx|}xyxw}pu|uspqwqpwq~wzxol|{xxqxty}qz~qyyuy|w {|u} ~o{vztrzunsh*ôÂÿÿÌÿÛÿÝÿáÿåûêöðñöíùçÿåÿÞÿ×ÿÒÿÏÿÊÿÅÿÀÿºÿ¶ÿ¯ÿ¨ÿ¢ÿÿÿÿÿ~ÿvÿnÿfÿ^ÿXÿTÿMÿHÿBÿ=ÿ8ÿ2ÿ,ÿ)ÿ!ÿÿúö ðê�â�Þ�Ú�Ó�Ï�É�Å�À�º�µ��¦�����}�v�n�g�_�X�T�O�I�E�<�7�1�(�#��"�&�+�/�6�<�B�F�O�V�_�f�n�w�~������¢�¨��³�»�Å�É�Ï�×�Þ�æ�ìñ õ öüýi=cow~u~tw|~~~|}||{v|~}twvzyx{|zv}p }zvv~v}myv|} ~s{ ~qszw}t|y}~x}~~w rux{y}|i{~y yup{} y{|j zy}r|~zzvx xx{yur|~yw~tm~yy}xyq|}z}t~dz~k{vfv{ {o ~ vnk{oy|rzxq}z~{ {zwx|u|qpu} oys~|yv}|xq} z|u }vuyu}tx~t| x~yt|zw|~|~~v~}|}z{ z~ut~~}u}}z{ |~u{prsâ¡�P�P�K�F�@�;�6�2�*�$�!���#�&�+�/�6�<�@�J�S�X�]�f�o�v�~������¢�¨�°�µ�¾�Â�É�Ð�Ø�ß�æ�éîõ ùþÿÿÿ$ÿ'ÿ.ÿ4ÿ8ÿ@ÿFÿPÿXÿbÿgÿlÿvÿ}ÿÿÿÿÿÿÿ¦ÿ°ÿµÿ½ÿÃÿËÿÔÿØÿßÿäûë÷ïôóð÷ëûçÿãÿÝÿÔÿÍÿÉÿÂÿ¼ÿ²ÿªÿ¡ÿÿÿÿÿÿ}ÿvÿrÿeÿ`ÿ[ÿTÿNÿEÿ>ÿ2ÿ,ÿ(ÿ!ÿ'ý ÿmЬ¤^r|{|txzyrv~z|}xv|w||~~~|n~t}|yukx}|{v~ tz|}szrynzv{uq}v{kvy~ {|{{{wxvx~wx}y x|sy{ w}} r~rx|r{tnq|r{sowlyyhyz~ ytuzu|p{r||~y{{lw|swz}{| uvvyr}}}|p|}y{tz|v~w{xwy~xzo{z ~|i{q}{}viyzrtzx}}v~ |r |z~j~qztv ~z}x {~|}|| }zxu{r~}{~v~ }|t~t xnzvu~|{}{nzy|~ my~{|z v~||zy|~t]¢ñ½æîÿ¶ÿÉÿÆÿÌÿÐÿÖÿÛÿáÿåûë÷ïòôìúéüâÿßÿÙÿÔÿÎÿÉÿÄÿ¿ÿ¸ÿ´ÿ¯ÿ§ÿ¤ÿÿÿÿ ÿzÿtÿmÿdÿ]ÿSÿOÿIÿDÿ?ÿ:ÿ4ÿ0ÿ(ÿ"ÿÿÿùóîè�ß�Þ�×�Ï�Ì�Æ�À�»�µ�±�«�¡�����z�p�n�f�_�W�R�M�H�C�=�8�0�)�#� �"�'�,�1�5�;�B�J�Q�X�`�h�p�v������¡�¦��²�¶�½�Å�Ë�Ð�Ù�á�çå üÐ(U] c yyxyu}{y{~v yu|y x|i|y~~s{}{{}{w}rz}xwxy| ~{y{~wz}xzw{m{z w}{|uynz{u ~} |v}wtwwy }z~m|x{}yyzy|{}}w{v|{{vwu~zyyz lfy}rx~ov|~v }yx~~pww~t|ow{pd~z ~yms|| vzwz}|~v~{||{~~{w~}{ |}z}||wz s~wr|yuhv{p}~y{| {t|zz{ }|t|}}{v{z{{zz| w}x|v~kz{}vw|vq{|m|z |r~y t~|vppwq x~yttvyv{ IÙ ö¯�Â�Ä�È�Ì�Ò�Ö�Ý�â�å�ëðöúýÿÿ ÿ'ÿ,ÿ1ÿ6ÿ;ÿ?ÿEÿLÿSÿXÿ]ÿgÿmÿuÿ}ÿÿÿÿÿÿ¨ÿÿ´ÿ¹ÿ¾ÿÃÿÈÿÎÿÕÿØÿÝÿåûêóóï÷åÿãÿÝÿÕÿÑÿËÿÇÿÀÿ¼ÿ´ÿ°ÿ©ÿ¥ÿÿÿÿÿsÿpÿlÿbÿ^ÿXÿRÿMÿGÿCÿ>ÿ6ÿ/ÿ'ÿ#ÿÿüôòí�ç�â�Ý�×�Ñ�Ï�Ê�Ã�¾�·��¨������y�p�k�f�`�\�U�P�H�B�:�3�,�$���!�$�)�0�8�A�D�N�V�Z�d�m�v�{������ �£�¬�³�º�Á�Å�Ð�Ö�Ý�ã�ç�íñ õ úþÿÿÿ%ÿ-ÿ1ÿ6ÿDÿHÿRÿXÿ`ÿfÿlÿsÿxÿ~ÿÿÿÿÿÿ¦ÿÿ·ÿ¿ÿÆÿÌÿÒÿØÿßÿäýèúí÷ðòõíùæÿâÿÝÿÕÿÍÿÈÿ¿ÿ¹ÿ±ÿªÿ¢ÿÿÿÿÿÿÿyÿtÿlÿeÿ^ÿTÿMÿEÿ>ÿ6ÿ3ÿ+ÿ'ÿ"ÿÿÿýø +òë�ç�à�Ú�Ò�Ì�Ã�À�¹�²��¦�¢������z�m�h�`�W�R�J�C�<�6�1�-�'�%���#�(�1�6�=�B�G�L�R�Y�]�d�l�s�y�����¢�©�°�¶�»�À�Å�Ê�Î�Ö�Ý�á�éëò +÷þÿÿ%ÿ)ÿ-ÿ5ÿ9ÿ?ÿDÿIÿOÿQÿYÿdÿiÿuÿ~ÿÿÿÿÿ£ÿªÿ¯ÿ´ÿ»ÿ¿ÿÂÿÊÿÑÿÙÿßþçþçôòïøëûåÿàÿÚÿÖÿÐÿÌÿÇÿÂÿºÿµÿ¬ÿ¦ÿÿÿÿ ÿÿ{ÿkÿvú¶ufqwlyzx||rsu}x||z} x}}m}yv|p wq |ywh ~{vzz~z| yw}w~~ rxv}pz|w}vy{x|uypt||p~ zx{z{ox~ pts}kuuvyr uq}x~{ | |wyzo~~{z~}w}{vwyww}xyz{ }vj~u~zt}|t{}sxqxx{ywt||{q }{~zuz}wwn||t}| ~~{ws~v|w~|v|}}hszhvvx}|yx~{|||~prlxsusyz}{py}}|q|}}x}{yy~|| z~w}wxjrx}mt{~~y~|txytz~Z¦&ÿ)åÇ�Ø�×�Ý�á�æ�ëîóøüÿÿ!ÿ&ÿ,ÿ0ÿ5ÿ:ÿ=ÿDÿIÿPÿVÿYÿ_ÿfÿoÿwÿ{ÿÿÿÿÿ¥ÿÿ¯ÿ¸ÿ½ÿÃÿÈÿÏÿÓÿØÿÜÿáÿæùíõòíøæÿãÿÜÿÖÿÏÿÉÿÂÿÁÿ¹ÿ³ÿ®ÿ¨ÿ¤ÿÿÿÿ ÿÿyÿpÿiÿaÿYÿQÿKÿDÿAÿ:ÿ6ÿ0ÿ,ÿ&ÿ ÿÿýöðê�ä�ß�Ú�Ò�Ì�Æ�Â�½�¶�²�«�¤���� �~�w�p�g�^�V�P�K�E�A�<�7�2�-����Ew^m] {~n}u|x{vtyq}~tiw}}}uxr}|tv}~ss~x ~||}tz~|u|xz vtz~n t}urz|yt~~po |zy~ v{ul{~x}zx}uuyy| zz~yyuyxy|xv}x~|{{|xv}vz|~{zxyt|| y}vy{}z~| }x}|z||~xzyvvuw{x}|sf}~~x|~vzs}wuuzy }yzu{u~w}wz|}|}{u~}{ }|x~}zz szz{m~ox~x}xa{~ }curo}}|j| v{|{{~}yr}}y}yw~uppÒqÿ�äè�â�à�Ü�Ö�Ñ�Ê�Å�À�¹�³�¬�§�¡������}�z�r�j�d�\�[�R�K�B�;�3�4�)� ����#�(�,�;�<�E�K�T�\�c�h�m�t�y�� ����£�¤�®�·�¾�Ä�Ê�Ò�Ù�ß�ã�éìðóùýÿÿ ÿ$ÿ.ÿ7ÿ>ÿFÿLÿSÿ[ÿaÿhÿmÿsÿxÿ~ÿÿÿÿÿ ÿ§ÿ¬ÿ¶ÿÀÿÇÿÎÿÒÿÙÿÞÿâÿçûìøïôóîøéýãÿÜÿÖÿÏÿÆÿ¿ÿ¶ÿ°ÿ®ÿ¦ÿ¡ÿÿÿÿÿÿ}ÿtÿmÿcÿ\ÿYÿUÿFÿAÿ8ÿ3ÿ.ÿ(ÿ%ÿ!ÿÿüøôðè�å�Ü�Ó�Ì�Ã�¾�º�²��©�¡������}�q�j�c�[�S�N�E�?�:�4�/�+�%�!� +�$�+�1�8�>�C�H�N�S�X�_�h�o�s�}�����¤�¬�²�·�¾�Á�Ç�Ì�Ñ�×�Ü�â�éïöýÿÿ!ÿ'ÿ-ÿ2ÿ8ÿ=ÿCÿHÿMÿRÿVÿaÿhÿrÿxÿÿÿÿÿÿ¦ÿ«ÿ²ÿ¶ÿ¼ÿÁÿÅÿËÿÒÿ×ÿÝÿæúìöððöéýäÿßÿÚÿÕÿÏÿÊÿÆÿÀÿºÿµÿ¯ÿ§ÿÿÿÿ ÿ}ÿvÿoÿiÿfÿ]ÿWÿQÿKÿFÿ?ÿ;ÿ4ÿ-ÿ&ÿÿþùôîé�ã�à�Ú�Õ�Ñ�Ì�Æ�Â�·�´�ª�£� ��� �|�u�n�h�d�]�W�S�M�F�?�:�4�/�&����!�&�*�/�4�<�C�N�T�\�f�j�r�x�������¢�©�¯�¸�»�Î�° +Cea{| {|{yr}~z{pxztx{x~~{{{~z|{p }wvypw{{ ~ltx~ rs|yw}||ux y}||nqr~pzuzw}zj}uy{mo|{|y }ust{{z yxz}{ov~zz|} |}}| ~w} }z{xkv}zs{z}t|| txpz}z oy|xwxy{~| rywx}|{y|~~}zxw}}{y}q~|z~|y}x ~ xu}su~|axwv~yuuw~yyt} yk~}y~n~x{|w|uy|v}q|{w|t}}{{sq{y u~yqx | }}z}|{~x}|~{ tt@÷z ÿÞúãÿäÿßÿÚÿÔÿÐÿÌÿÃÿÃÿ½ÿ·ÿ°ÿ©ÿ£ÿÿÿÿÿÿ~ÿtÿoÿfÿ_ÿZÿSÿOÿIÿDÿ>ÿ9ÿ5ÿ/ÿ)ÿ#ÿÿÿø ô +ñê�ä�Ý�Ù�Ó�Í�È�Ä�¾�·�³��§�¢�����z�o�i�c�]�T�N�H�D�?�:�5�.�)�$���$�+�1�5�:�A�F�J�N�V�`�d�l�v�}�����£�©�¯�´�¹�¾�Ã�È�Ï�Ô�Û�á�èìò +ùþÿÿ$ÿ'ÿ,ÿ2ÿ6ÿ<ÿBÿEÿPÿSÿ[ÿcÿjÿvÿÿÿÿÿÿ ÿ¥ÿ«ÿ®ÿµÿ¹ÿÀÿÇÿÎÿÓÿÙÿâþæøíñõìúçþâÿÞÿØÿÔÿÎÿÉÿÄÿ¾ÿ·ÿ±ÿªÿ ÿÿÿÿÿzÿsÿmÿgÿaÿ[ÿVÿPÿKÿEÿ@ÿ:ÿ2ÿ*ÿ%ÿÿþùôðê�å�à�Ü�×�Ó�Î�Ç�Ã�º�±�¨�¤���� �{�v�r�j�e�`�Z�R�M�I�A�9�5�+�$���"�,�,�1�8�?�G�O�V�[�e�l�t�z�������¤�¬�±�º�¾�Å�Î�Ó�Ú�â�ç�íó +õúýÿÿÿ#ÿ,ÿ/ÿ3ÿ:ÿEÿNÿUÿYÿdÿkÿqÿxÿ}ÿÿÿÿÿÿ¡ÿ©ÿ±ÿºÿ¾ÿÃÿÏÿÔÿÜÿâþèûìöñòõïøêýæÿàÿÝÿÔÿÉÿÇÿÂÿ·ÿ±ÿ§ÿÿÿÿÿÿÿ}ÿwÿoÿmÿfÿ_ÿWÿLÿEÿ@ÿ7ÿ3ÿ+ÿ%ÿ!ÿÿýúö òìé�ã�Ý�×�Î�É�Â�»�³�ª�¢�������{�u�m�h�`�V�M�G�E�,bf«nhx|v~vyx|}yzwz}v~{~~{ z~vx| zyu}u{}{{|wz m~yzwzxxx}yw vw~xz}t v |zwwy ~} }wz}uy{~~ rwoywz}uu~z}~x|tzzs|{}}w y|}yurrwroyyyvzyv~ }~xxpv}yt|o ~ |}v~|}~|zz |zzyz{suy|x~{}zxz }|yv{w|x~v{u{z{t~w}{}sxvuy~ ~{yvw r{ zr|~z}||zsywq}x{}~zt {xy~}q z}vw~zlο9á��ß�Ô�Ù�Ñ�Í�Æ�Ã�½�¶�²�©�¦�¢������{�s�k�g�b�[�Q�I�D�A�8�4�.�)�%� �� ��&�*�3�:�A�G�L�T�Z�`�d�k�n�u�z�����£�¨�°�»�À�Ç�Î�Ò�×�Ü�à�æ�éíò +øþÿÿ!ÿ(ÿ1ÿ7ÿ?ÿBÿKÿQÿXÿ]ÿbÿiÿnÿsÿzÿÿÿÿÿÿ¨ÿ°ÿµÿ¾ÿÁÿÊÿÏÿÓÿÙÿÝÿâÿæýêöñóôíùäÿàÿ×ÿÒÿËÿÄÿ¿ÿ¸ÿ²ÿ¬ÿ§ÿ¡ÿÿÿÿÿÿxÿtÿnÿgÿ[ÿRÿKÿCÿ<ÿ7ÿ1ÿ,ÿ)ÿ#ÿÿÿþ÷ôí�æ�á�Ü�Õ�Í�Ç�À�¹�³�®�©�¤������{�u�l�_�Z�U�N�H�B�;�5�1�,�(�"�� +�$�*�/�6�:�@�G�L�R�W�\�c�k�t�{������¡�®�¹�½�Â�È�Ë�Ò�Ô�Þ�â�çìñ öûÿÿ$ÿ*ÿ0ÿ6ÿ;ÿ@ÿFÿKÿPÿWÿZÿcÿiÿqÿyÿÿÿÿÿÿ¥ÿÿ³ÿºÿ¾ÿÃÿÈÿÍÿÓÿ×ÿÞÿãþç÷ïñõëúåÿÞÿÙÿÓÿÎÿÈÿÃÿ¾ÿ¸ÿ³ÿ®ÿ§ÿ¡ÿÿÿÿÿwÿoÿkÿbÿWÿZÿSÿEÿCÿ=ÿ8ÿ2ÿ.ÿ&ÿ#ÿÿüù +òë�å�Þ�Ø�Õ�Ð�Ê�Å�¿�¼�µ�°�©�£�����z�s�n�f�^�X�Q�K�C�B�<�6�1�-�$����#�'�,�1�6�<�@�E�N�R�W�a�l�s�|� ���� �¦�¬�±�µ�»�¹�Ñ�nN\`ay{w}{uu~wvz{{||z~|zvxyxy} {zr{~xxy~}yh{wtxc}t} ro{zt{uz|~yyutvz}} zx|qz||} {y}z}y x|{ x|xzpsz~{y~xz s||ww~xxry|xxxvx~u|~|}xv|}xz~ |~~ }~v{wt{{ }~x~z~zvs}|x{vprxmy~t}||tqy{m~~} {yrv s ||ju|}wyy{ rvy|{|wuwyw o}|uz}yzx|yy{| uzfr{ zxs|xx||m ys}ywuwu!JÈÿgëúüÿÿÿ#ÿ&ÿ,ÿ1ÿ7ÿ=ÿAÿHÿOÿTÿZÿbÿeÿlÿrÿwÿ}ÿÿÿÿÿÿÿªÿ¬ÿµÿ¼ÿÃÿËÿÏÿØÿÜÿáþèúìöñòõïøêüçÿáÿÛÿ×ÿÎÿÌÿÃÿºÿ²ÿ«ÿ¦ÿ ÿÿÿÿÿ}ÿzÿrÿmÿgÿaÿZÿSÿNÿDÿ;ÿ6ÿ.ÿ'ÿ ÿÿýùô ñì�è�å�ß�Ú�Õ�Í�Æ�Ä�µ�°�¨�¡���� ��z�u�o�j�c�^�X�R�I�A�8�1�,�&�!���"�'�.�5�;�A�K�Q�X�`�i�n�s�y�� �����¥�©�²�¼�Ä�É�Ñ�Õ�Ü�ä�éíò +ö úüÿÿÿ"ÿ-ÿ3ÿ<ÿAÿJÿQÿYÿ]ÿgÿlÿqÿxÿ}ÿÿÿÿÿÿ ÿ©ÿ¯ÿºÿÂÿÇÿÎÿ×ÿÚÿáÿåüêøïõòòöíúèþâÿÞÿÔÿÐÿÉÿÀÿ½ÿ³ÿ«ÿ£ÿÿÿÿÿÿÿxÿvÿnÿgÿbÿXÿNÿIÿAÿ9ÿ1ÿ*ÿ&ÿ ÿÿþû÷óíé�á�Ü�Ö�Ñ�Ç�Â�¼�²�¬�¨�¢������~�v�p�j�U�Z�Q�L�C�B�5�.�+�$�� �%�)�1�:�@�I�Q�V�\�a�f�l�s�y�}�����¢�¨�±�º�¿�Ê�Ñ�Ô�Ù�å�å�ç�ëò +ñ öýÿÿ#ÿ*ÿ0ÿ:ÿ?ÿFÿOÿTÿYÿ^ÿbÿjÿmÿtÿÿÿÿÿÿ¡ÿ¡ÿ±ÿ·ÿ½ÿÄÿËÿÑÿÖÿÖÿßÿäþèúìõòñöíùìúÝÿÙÿÑÿÊÿÉÿºÿ¶ÿ²ÿ¨ÿ¤ÿÿÿÿÿ|ÿvÿ}ÿsÿiÿ`ÿ\ÿPÿ¤¨i}iz{ vzysy{r|~v {| |nyz w|}tv|ld{ zxmovu|ux}mz wxz|zwq|z}wypnz|w{| rsxxqp{}yyv }y}x u}x~zztxr~v mt| ~zz}}|qyzyp{dvux}tj~xvt|v{tt yunsv t|~pyquw}sw~z}|~wy{p swvy}ztpwpnz}stw}}trxlvvopxxb{v|{}yy}|h{~x~r zik ~{{frq~ |{b|{z}|pwx~|vtyzt}shyyuzu|}xzv |z} ~z| p}xqvyJí¡LþëHÿ<ÿ7ÿ7ÿ-ÿ(ÿ&ÿ!ÿÿÿþöòïì�ã�á�Ó�Î�Ð�É�Â�»�¶�®�ª�£���� ��|�m�k�l�d�^�Y�R�L�F�=�3�.�(�,� ���$�(�.�5�<�D�R�U�\�`�h�o�w�~������¡�¥�°�À�µ�Â�Ê�Í�×�Þ�á�èîñ öûþÿÿ"ÿ(ÿ)ÿ0ÿ8ÿ<ÿ:ÿNÿRÿYÿcÿlÿvÿyÿÿÿÿÿÿÿ¥ÿ§ÿ°ÿ¶ÿÂÿÇÿÏÿÍÿØÿâÿåúìöñòõíúéýåÿáÿÜÿÕÿÐÿËÿÃÿ¾ÿ²ÿºÿ¥ÿÿÿÿÿÿ~ÿxÿsÿiÿaÿ`ÿXÿWÿIÿ9ÿ>ÿ4ÿ2ÿ+ÿ,ÿÿþú õ ñíê�ä�à�×�Ð�Î�Ç�½�¸�³�§�¡������z�t�n�g�d�]�U�O�E�@�8�1�'�'�� +��#�(�/�3�<�B�M�S�Z�_�g�o�u�{�� �����¥�®�µ�º�¿�É�Î�Ø�Ü�á�èìñõ øüÿÿ ÿ$ÿ*ÿ3ÿ5ÿ@ÿIÿPÿWÿ_ÿeÿkÿvÿrÿzÿ ÿÿÿÿÿ¢ÿ©ÿ²ÿ´ÿ¾ÿÈÿÍÿÔÿÛÿßÿæüëøîóôð÷ìûèþäÿÜÿ×ÿÓÿÉÿÄÿ½ÿ³ÿÿ¨ÿÿÿÿÿÿÿxÿuÿoÿiÿaÿ[ÿRÿKÿEÿ>ÿ6ÿ.ÿ)ÿ"ÿÿÿûøóïìè�â�Û�Õ�Ì�È�Á�¸�¯�¨�£������~�w�s�k�e�[�W�O�G�@�9�4�*�%�� � �'�.�4�:�B�H�O�Y�`�d�r�Mho{~n{qw~|}z|~ry~x}v~zpv|tnwl|z||xwyy |yy{{{|}yvwt|xw~zt|}~lzyz~w}{uwy|z~{yxz{xrx~}~~~}s {x|z ~}~}sz~~| yxww~}{v|y|~yr{| }y}uwx~q~tvw||| |v||pwry{|t}rxus{~nv}vv|}u{}x x~~|vz rvy{{v~py~zyzw{styyx~ o uxvx|p jz{xxiy|vknzu|vxuzyuuqtpuuq~y| y rtrwxq x}~xr{}|w~zw}u{TaËûóÿ¾ÿÿÿÿ¤ÿ¨ÿ°ÿ´ÿ¹ÿ½ÿÅÿÉÿÏÿÔÿØÿÝÿáýèùíöððöëúåÿÝÿÚÿÓÿÎÿÆÿÅÿ½ÿ·ÿ²ÿ¬ÿ¦ÿ¢ÿÿÿÿÿÿzÿvÿkÿdÿ^ÿTÿJÿFÿ@ÿ8ÿ4ÿ.ÿ)ÿ%ÿ!ÿÿþù÷ ñì�æ�Ý�Ù�Ï�É�Å�¿�·�±�ª�¤��������s�p�c�_�Y�N�D�?�9�5�/�*�$� �� +�"�&�-�3�;�@�G�P�T�[�_�e�k�q�y������¦�¬�²�»�À�Ç�Ï�Ó�Ù�Ý�á�æ�êð ôúþÿÿ%ÿ,ÿ2ÿ;ÿAÿGÿMÿRÿXÿ^ÿcÿjÿnÿuÿ{ÿÿÿÿÿ¡ÿªÿ¶ÿ¶ÿ½ÿÄÿËÿÐÿÔÿ×ÿÝÿáÿæûëõòï÷ìúæÿÝÿÙÿÏÿËÿÆÿ½ÿ·ÿ°ÿ¬ÿ¦ÿ¡ÿÿÿÿÿÿyÿrÿmÿeÿ\ÿVÿOÿEÿ<ÿ8ÿ2ÿ.ÿ)ÿ$ÿÿÿýù ôðè�à�Ù�Ò�Î�È�Ä�»�´��§�¤����� �~�z�r�j�`�X�O�G�B�;�8�2�,�(�$���!�'�+�1�9�?�F�L�R�W�\�b�g�p�v�{�����¤�ª�²�º�¾�Ä�Ì�Ð�Õ�Ú�ß�á�êîò +øþÿÿ!ÿ)ÿ/ÿ8ÿ>ÿEÿJÿOÿUÿ\ÿ_ÿfÿkÿqÿ{ÿ|ÿÿÿÿ ÿ§ÿ®ÿ¶ÿ¼ÿÀÿÈÿÌÿÑÿÖÿÚÿßÿäýéøîòõëúèýâÿÚÿÓÿÌÿÅÿ¿ÿ»ÿ³ÿ°ÿ¬ÿ¤ÿÿÿÿÿÿÿvÿnÿfÿ^ÿUÿLÿJÿ@ÿ:ÿ5ÿ0ÿ,ÿ'ÿ"ÿÿûø÷ ñê�ã�ß�×�Ò�É�Æ�¸µchm}yv |{ x|{}~y{tzx{qv}zzuw{|zl{{}{{|dqqw|n{|{~zu ~z~|~|wyxy}}{|~~{~w} }{ z{yu{}~~| z|q| sx {xz|}u{prvt{}i{npvs}u|yv~u{xu{s|{~z~|~ |xm} |qvw~|ys|v{~pu~u| {|xzvx}~}|xz}y~uz|suvv~|~||r{yu}w||w|||y~ ~t| {y{t{vxzr}vn{zzxxss~ y}~sz{{z{t~}syvyy}|tz~b|ÿ�z��¹�¬�«�§� ������~�w�q�j�e�_�V�P�L�F�B�8�1�+�'�"�� +��&�-�6�<�C�I�Q�W�\�d�m�s�y�~������¡�¤��¶�¼�Ä�Ï�Õ�Ú�ß�æ�éîóöúýÿÿÿ&ÿ-ÿ1ÿ9ÿAÿGÿOÿZÿ`ÿfÿnÿuÿzÿÿÿÿÿÿÿ£ÿ¬ÿ´ÿµÿÀÿÆÿËÿÕÿÛÿàÿçûëöñôóïøêüçÿáÿÜÿ×ÿÓÿÍÿÅÿ»ÿ²ÿÿ©ÿ£ÿÿÿÿ®¨ex|yptzusv}ruw}wzx~~~{x~wp{w q }|s}||l|qx{{~~|~x{ |~w~|}~ qupy |zwpm~~ {v}uw~~vq||{ pfvuwz{~xvwvyz~}zp{}}wq|~x{|w{zks}xp{ suw}| v} }| ~zk {w{wn}w}r|{yywt}~w {wz{| }{ tz~~y|k}}z{stmu z~zywzxu|p r| z~|}{ v~vxuxr|vrxstz|u{~|yv~o~s}{ zyxy{|{u}~{|}sy |n}Ír©ú�Ï7ÿ:ÿ7ÿ4ÿ2ÿ,ÿ%ÿ"ÿÿÿùó +ñîè�ä�Û�Ø�Ô�Ì�Å�¾�¹�³�¬�¨�£�������v�r�j�b�]�T�K�F�B�9�3�,�&�!����#�)�2�:�@�F�O�V�]�a�i�n�s�y�~������¨�®�·�Â�Å�Î�Ó�Ù�Û�ã�èëïó÷ûÿÿ!ÿ'ÿ-ÿ4ÿ8ÿBÿHÿQÿWÿ_ÿeÿkÿqÿvÿ|ÿÿÿÿÿÿ¥ÿªÿ²ÿ¸ÿÂÿÊÿÏÿÕÿÛÿÙÿíç»¶[¢vzws zt~} |}z| r}z}x}~}su ~}|y}|qo}{{~yq|tyn~}uvzxrsvp~|q}{u|}v}}}yw|}}|~xup}vzt~{ymv|m wyyxzxzz~}yf}{wy~{yr{xy|wzuz{w yvs}yz}}w{}|}|{}rvx} m| m{zr{{w|w~o||ww{wzw}}~uw{xy}|}rz{}pz|xw{x{|ztk~z~ l}z} ywzx yy{{ytxys yt}xz{xf| v~{zvvb�þ¤ûæÿÿ ÿ£ÿ¥ÿªÿ®ÿ·ÿ»ÿÀÿÆÿÉÿÍÿÖÿÙÿßÿæÿçøîóóîøêûåÿßÿØÿÓÿÍÿÇÿÂÿ½ÿ¹ÿ²ÿ«ÿ©ÿ£ÿÿÿÿÿÿzÿrÿmÿeÿ[ÿRÿJÿGÿBÿ;ÿ5ÿ1ÿ+ÿ)ÿ"ÿÿÿûö +ñë�å�Ý�Ö�Ð�È�Ä�¿�·�°�¬�¥�¡���� ��z�s�h�d�Z�R�L�D�?�8�2�.�+�%� �� + ��#�*�2�7�;�C�I�O�T�Y�_�d�j�q�z�� ����©�¯�²�·�Ã�RS{Vrrkz~tj{xy|xyw}yxrr|~yrt|}~zr}{z ||||xy{vvr{~ zqkuxv{{ |pzjy x y}qy~uj{{z~~}vyv}y|x~|lr{x|zuxu| wzmez} jpz}yiz~}w~}nw~~|x~x{zy||~n}wv|zw}~zu}{~jt} yt{ iuw{ix~wx|o~}~} |uvrv|x}yqxynwzw~}}|}~~x~~zx~n}z{}z{q|t~xysqv{{~z~ { yus~tr|z{~n{||~x x{z~~ v|yy{ w}v}m~z y|z~z ÿ2Â�Í�Î�Ó�Ø�Ý�ä�æ�ìïô÷úþÿÿ$ÿ*ÿ,ÿ/ÿ;ÿDÿGÿKÿPÿZÿ`ÿjÿoÿrÿ{ÿ~ÿ ÿÿÿÿÿ¢ÿªÿ±ÿ¹ÿ½ÿÆÿÎÿÓÿ×ÿßÿæûëõòòôîøêüåÿáÿÝÿØÿÒÿËÿÆÿ¿ÿµÿ®ÿ¦ÿ ÿÿÿÿÿ|ÿxÿqÿmÿgÿaÿ\ÿTÿLÿHÿBÿ9ÿ4ÿ+ÿ%ÿÿÿû÷ ñíé�æ�á�Ý�×�Ð�Ð�Å�¼�¶��§������~�x�q�l�g�a�Z�U�M�G�=�6�2�)�"��9Rbwrrx}|z|v|z zyzttuzwv} }{x}~|xx}qxxz y}yyvxxthqz q~|vu {}x |uv~y~ | tp{w~wupz}~ yyo} ||wv{ xzxt lx ||~l |yyydy|tzrwz~x~uty~~~wx{n~}{m~x~|}~|}x}sw}xlyq~ vuxwtusqpy~ hryvszm|xo~~~r~oy}snvx~up~xjyxsw {ss }~}{w~}s}tzz|~~~~~vzq ws~y{x}}~sy}u~|xvu}p~zyvyt}wxtz{y gÇÙ"Ó�c�Ô�¾�¿�¹�´��¤�¢������|�w�q�j�e�a�[�U�O�J�E�?�8�1�+�$�� +�!�&�+�0�5�:�A�I�L�T�Z�c�i�p�}������¡�©�¬�³�¸�½�Ã�Ç�Ï�×�ß�å�êîöûÿÿÿ$ÿ)ÿ.ÿ3ÿ7ÿ>ÿ@ÿJÿMÿTÿ[ÿcÿlÿvÿ|ÿ ÿÿÿÿÿ¥ÿ«ÿ°ÿµÿºÿ¿ÿÆÿÌÿÕÿÜÿÞÿæùíöññöêüäÿßÿÛÿÖÿÐÿÌÿÆÿÁÿ¾ÿ¹ÿ°ÿ§ÿÿÁs¬mv vu|}n z xtiy{|uwxtwww{vv |{yrw|tzqn{|~{|sswyuq|w t}zos} vyl~m {}s~{{}mv m {} twxz{ xrrz}z|zx{{}y}y||w~zv~{x|x|y{~yz~v||zzu~yzz}{uvwx| ~xv~u~~x~}}uuy~}p~y}q syw~||n}|t znt zxqn|}}or}v}{c lkr {vywzxv {~oy~sy~z{}yv{t} vv~s~t {{ }xw{uu}y}yzeÑ^ÇÝ,ÿÿÿÿÿ|ÿuÿnÿgÿeÿ^ÿWÿRÿKÿHÿBÿ=ÿ8ÿ4ÿ/ÿ*ÿ#ÿÿÿúö +òë�å�Þ�Ú�×�Ï�Ç�Â�½�¶�²�¬�¦�¢������y�o�j�c�Z�R�J�D�>�7�2�.�)�%���$�,�3�5�=�E�J�Q�V�[�`�e�k�q�{�����¡�¨�¯�±�¹�Ã�Ç�Ì�Ñ�×�Û�à�ã�éðòøÿÿÿ&ÿ,ÿ2ÿ9ÿ?ÿEÿLÿOÿVÿ\ÿ`ÿfÿnÿtÿ}ÿÿÿÿÿ¦ÿ¯ÿ³ÿ¸ÿÀÿÄÿËÿÏÿÔÿÙÿÝÿáÿçúìôóíùæÿâÿÛÿÖÿÐÿÈÿÂÿºÿµÿ²ÿ¬ÿ¦ÿ ÿÿÿÿÿ~ÿzÿpÿgÿ^ÿWÿRÿKÿFÿ=ÿ8ÿ3ÿ/ÿ)ÿ$ÿ!ÿÿüö +ñíç�ß�Ú�Õ�Ì�Ç�Â�¹�¶�°�«�¦������{�r�i�a�[�U�L�H�?�:�6�1�,�(�#� + �$�)�0�9�=�A�G�L�S�W�\�c�k�q�w����� �ª��¶�º�Á�Å�Ê�Ï�Ô�Ù�à�ä�èïöûÿÿÿ&ÿ-ÿ/ÿ8ÿ;ÿBÿIÿMÿSÿYÿbÿfÿmÿsÿ|ÿÿÿÿÿ£ÿ«ÿ²ÿ¸ÿ¿ÿÃÿÈÿÌÿÒÿ×ÿÝÿâÿçöðòôíùèýáÿÛÿÒÿÐÿÊÿÄÿ¾ÿ¸ÿ´ÿ¯ÿ©ÿ£ÿÿÿÿÿÿzÿoÿdÿaÿWÿPÿKÿEÿ@ÿ>ÿ6ÿ2ÿ+ÿ&ÿ!ÿÿüø ôëæ�ß�Û�Ó�Î�É�Ã�¾�¹�³�®�©������}�t�k�a�Z�S�L�I�C�>�9�4�.�*�%��56S¡sRxv}z}r|~zyy|}xvttfrj}z~~o}|yzw~yxz|z{{~z|w} x~~q~t~}{rlq}xy}}v}w}gq|ywv|}|y||wzzo~zzop|zs|v~xys }|}} x}w}xv~|{ }{zr}||~|{vz~wz}{|| ~|xwxu~p{}bx}|uwko}~w}vtz|s z|z~rvvrx|wx {wyy~w~ u}{wwyz|}|z} z~vvvx{}soy|zg{}s}}z}|~yyuxz{rv |w}}u|{{|{ zxszy|ZÏ#ÏÞnÿãÿÔÿÒÿÏÿÉÿÅÿÀÿ»ÿ´ÿ¯ÿ§ÿÿÿÿÿÿÿ{ÿzÿsÿkÿhÿ`ÿ\ÿUÿMÿIÿ>ÿ;ÿ8ÿ.ÿ(ÿ"ÿÿÿúóïì�æ�â�Ü�Ù�Ô�Ð�Ê�Å�»�¸�®�©�¢�����|�x�n�j�c�]�X�R�M�I�B�;�3�-�)�#� +�!�&�+�0�6�8�@�G�L�V�^�e�m�u�|������¤�ª�®�µ�»�Á�Ç�Ê�Ò�Ú�á�ã�ëòøüÿÿ ÿ$ÿ*ÿ-ÿ2ÿ7ÿ=ÿDÿJÿQÿZÿ^ÿgÿnÿvÿÿÿÿÿÿÿ¥ÿ«ÿ¯ÿ´ÿ»ÿÂÿÆÿÌÿÕÿÚÿãûêøîóôï÷èþäÿÞÿÛÿÖÿÑÿÌÿÅÿÁÿ¼ÿ²ÿ©ÿ¢ÿÿÿÿÿ|ÿrÿnÿjÿaÿ]ÿWÿQÿMÿFÿBÿ;ÿ4ÿ+ÿ$ÿÿÿöó +ñê�å�á�Ü�Ø�Ó�Í�É�Â�¿�³�¯�©�£�����|�t�m�g�b�\�V�Q�L�E�?�5�.�+�"���#�&�,�2�5�=�D�L�V�[�b�k�s�y������ �¥�«�³�¸�¿�Æ�É�Ñ�×�Ý�å�ëíôùþÿÿ ÿ&ÿ*ÿ/ÿ5ÿ8ÿAÿGÿMÿVÿZÿbÿmÿtÿzÿÿÿÿÿÿ¡ÿ§ÿ¬ÿ²ÿ¶ÿ¿ÿÃÿÉÿÓÿØÿàþçúëöðñõëûæÿâÿÞÿÙÿÕÿÐÿÉÿÅÿ¾ÿµÿ°ÿ¨ÿ£ÿÿÿÿÿyÿqÿmÿgÿ`ÿ[ÿUÿQÿJÿCÿ>ÿ9ÿ2ÿ+ÿ"ÿÿýùðëé�ã�ß�Û�×�Ñ�Î�Ç�Á�º�³�¬�£������x�r�k�e�`�[�U�N�L�:/oz®Vjkz}~|hw} u {zopo|| wx}}xs{ { w|zxm|wx}z}vx vx}x||~~hr{v}zqgv~ytst }w|~|vyw|qr p}~oy }z~z~{ls~zy}{|t~y~{|w} v{|{}|{y{ypt|wy r}|zupu~|zqn||}yz x~||txoz|{p}vxv z}yy|u~ ~}~}w x}y} sq|{vtyww|{~||v}{~{{zx~|}}v {vt~}yy {~vwq{zyzkjuzwr| } {v}yv|x{ yw{zz~}x}~v|xupz{q¢-¼1"°�Y�]�^�e�k�t�w�{������¢�§�¬�³�·�¼�Â�Ç�Î�Ó�×�à�ä�ìð ô øüÿÿ#ÿ)ÿ.ÿ2ÿ8ÿ;ÿCÿGÿMÿQÿVÿ_ÿbÿiÿxÿ{ÿÿÿÿÿ¤ÿ«ÿ±ÿ¸ÿ½ÿÂÿÇÿËÿÐÿÕÿÛÿàÿäüê÷ïðöëûâÿÝÿ×ÿÐÿËÿÆÿÀÿ¼ÿ¶ÿ±ÿ«ÿ¥ÿ ÿÿÿÿÿ|ÿtÿkÿkÿaÿUÿPÿIÿBÿ=ÿ8ÿ5ÿ/ÿ)ÿ$ÿÿÿþ÷óì�ã�Ý�Ù�Ô�Í�È�À�»�µ�±�«�¥�¡�����|�v�l�e�Z�T�Q�H�A�<�6�0�,�'�#�� + +�!�'�.�6�<�B�E�K�Q�V�]�`�i�n�t�{�����¡�«�²�¹�¿�Å�É�Ï�Ò�×�Û�â�èêð ÷úÿÿ%ÿ)ÿ0ÿ2ÿ7ÿAÿFÿLÿRÿVÿ\ÿbÿiÿqÿwÿÿ ÿÿÿÿ ÿ°ÿ¶ÿ¼ÿÃÿÅÿËÿÐÿÔÿÛÿßÿåýéûìôòêüæÿàÿÚÿÖÿÍÿÆÿÁÿ¾ÿ¶ÿ°ÿªÿ¦ÿÿÿÿÿÿ~ÿuÿmÿgÿ^ÿUÿRÿGÿEÿ>ÿ8ÿ2ÿ.ÿ(ÿ#ÿ ÿÿüö +òîê�â�Û�Ó�Ì�Ç�Á�¹�µ�±�©�§� ��§���|�v�o�c�Y�W�Q�F�@�;�6�.�4�/� � +�!�(�/�5�<�@�B�L�S�W�\�b�h�p��~�����£�ª�®�º�Á�Ã�Ê�Ï�Ô�Ý�ëß�ç�ìò +õ üÿÿ!ÿ)ÿ.ÿ3ÿ<ÿEÿGÿNÿRÿWÿ]ÿdÿfÿcÿzÿÿÿÿÿÿ¦ÿ¯ÿ´ÿÀÿÁÿÆÿÍÿÒÿÖÿÚÿßûÞÿôÕ¥]}wr||wq{d|~y~}£}|}s}imruyn~m|~kuhgw}z}pay~}jz}| }| z{{}tzwuzy}~u|y~xz~qz lzt}|r{{|t y yn |}s yzsozzmx |}h {c{xv xjo{yry~wrx~y~|y}~|y v{~ zxutzw}|~r|uwutv}z{Y}~|~g{uz q ru y{zpemyzz}rwe|~}bv wrx}~{uzoy{~v} {qus ydxwz z~}{ov rxrpy suzvv}}dw}tt d w} zsr|z~vsx~ st }mpvv¸pø�¡Üëè�â�Þ�Ý�Ó�Ð�Ä�Â�À�¸�±�±�«�¡����� ��|�q�n�g�b�X�N�W�E�:�7�2�+�%�� +�#�$�*�1�;�B�H�N�S�\�d�g�q�u�{������¢��®�³�¸�Ä�Ç�È�×�Ú�ã�ç�íñ õ øüÿÿÿ&ÿ(ÿ/ÿ2ÿ>ÿAÿIÿWÿ[ÿbÿkÿqÿwÿ}ÿÿÿÿÿÿ ÿ§ÿÿ³ÿ¾ÿÃÿÊÿÓÿØÿÝÿâýéùíôóñöìúèþäÿßÿÙÿÔÿÐÿÌÿÄÿºÿ´ÿÿ¤ÿÿÿÿÿÿ|ÿuÿpÿlÿcÿYÿZÿQÿNÿFÿ;ÿ6ÿ1ÿ,ÿ(ÿÿýøö ñìè�â�ß�Ø�Ô�Ð�È�Ä�²��®�¤���� ��y�s�n�h�b�^�W�S�I�E�=�4�/�&�!���!�'�,�1�8�?�C�M�U�\�e�c�q�{�������¡�§��¶�½�Ã�Ê�Ó�Ù�Ý�ä�êðôùüÿÿÿ"ÿ'ÿ,ÿ3ÿ9ÿ@ÿEÿMÿUÿ^ÿcÿjÿtÿ{ÿÿÿÿÿÿÿ¤ÿ¬ÿ°ÿµÿ¼ÿÃÿÔÿÕÿÙÿáÿåùíõòòõíúèþäÿßÿÛÿÕÿÏÿËÿÆÿ¾ÿ¹ÿ¬ÿªÿ¤ÿÿÿÿÿ|ÿvÿpÿkÿeÿaÿ[ÿTÿOÿIÿ@ÿ:ÿ4ÿ,ÿ)ÿ ÿÿûõ ñí�ç�ä�à�Ú�Ö�Ð�Í�Ä�¾�·�®�©�¡�����{�t�n�h�d�]�X�R�M�E�A�7�4�-�#� +��"�'�+�/�6�;�B�G�O�X�^�e�m�t�}������£�Vf|cqzn|zqvg}u|zv|ytm|~}{zuwr~n{|z~~wxzx|}zy~{vxnt|{ zv{{}~ ~z|t~|z}zqvqc~uw|{~}|s}xyx~x|x~}x~tyspzovqt~wz |yz x v|}~|zrzyx{z ~} vt{vs qxy}}zyvv|}wmqpwyu|}ss}w~}u~uxy|v}}{} xvr|w~v}wr tw~zzzxty lzturx{vxz|pry}v }zw {xsu twz n|q|s}uo|vy~zs¨]»ú#Ä�Ö�Õ�Ú�Þ�á�çëð ó÷üÿÿÿ"ÿ(ÿ0ÿ8ÿ<ÿAÿDÿLÿRÿXÿ^ÿbÿfÿoÿrÿyÿÿÿÿÿÿ¡ÿ©ÿ°ÿ¶ÿÀÿÅÿÍÿÔÿÙÿÝÿãþèûë÷ðñõð÷ëûåÿàÿ×ÿÓÿÑÿÆÿ¿ÿ·ÿ®ÿªÿ¤ÿÿÿÿÿ ÿ~ÿzÿtÿoÿgÿ`ÿWÿQÿIÿGÿ=ÿ5ÿ.ÿ(ÿ!ÿÿÿüøôðì�ç�ã�Ý�Ö�Ï�Ç�Á�»�²��¥����� ��y�v�i�e�b�\�V�L�F�9�2�0�*�!� +��$�)�1�9�=�G�N�V�a�c�h�q�x�}�������¦�¬�µ�»�Ã�É�Ò�×�Ú�ã�æ�çðõ úüÿÿÿ"ÿ*ÿ0ÿ6ÿ=ÿEÿKÿRÿXÿaÿmÿpÿvÿ|ÿÿÿÿÿÿ¡ÿ¦ÿ«ÿ´ÿ½ÿÄÿËÿÑÿÙÿÝÿäýèøîôóðöìûèþãÿÝÿÙÿÑÿÍÿÇÿ½ÿ·ÿ¯ÿ©ÿÿÿÿÿÿÿzÿtÿnÿiÿcÿ]ÿWÿOÿFÿ=ÿ;ÿ4ÿ,ÿ%ÿÿÿû÷óñë�ç�â�Ý�Ú�Õ�Í�Å�¼�¸�³�§�¡���� �~�z�t�n�i�b�[�V�Q�I�A�7�2�*�"� ��$�'�0�7�>�D�H�O�Z�c�i�q�w��������£�«�³�·�¼�È�Ï�Ö�Ü�á�èíò ÷úýÿÿÿ%ÿ*ÿ/ÿ5ÿ8ÿ@ÿKÿSÿYÿaÿiÿpÿuÿ|ÿÿÿÿÿÿÿ¥ÿÿµÿºÿÂÿÈÿÏÿÕÿÝÿäûë÷ðõñð÷ëûçÿâÿÞÿÚÿÒÿÏÿÈÿÂÿºÿ²ÿªÿ¨ÿÿ¨¾¶iz·vvw o~~vyzv }}{is}}{~|w|qz~|{y~r~xt~m~v}y||z {~|l m{|z~s psu|tpp xxuvrs{ {r|{y|wvuw}r~w}~y{~|zwy yu{w~yz}ur}~}y|tr}||} ~j|{v ~ux|yyq~~ q}xz{n|y|zv~y}~uxu y~w||}|~y~{| }{|}yq {~ {~||wz{u wpv}}p}|z~v |~z~|v{q}y}}z{z~||zyo|x} mwzwunvsq{~mt x~e~xs tlz}dÑ[Åä-ÿÿÿÿÿÿÿÿzÿsÿlÿiÿcÿZÿUÿOÿGÿBÿ>ÿ7ÿ1ÿ+ÿ&ÿ!ÿÿüø õ ñíè�ä�á�Ü�×�Ð�Ê�Â�º�²�¯�§� �����}�x�q�k�f�a�[�W�O�J�B�;�4�0�(�"���"�'�-�0�8�<�C�H�P�[�b�f�q�w�������£�©�®�´�¸�À�Ç�Í�Ö�Ü�ã�çíôúýÿÿÿ$ÿ)ÿ.ÿ3ÿ8ÿ=ÿDÿKÿSÿ[ÿ^ÿhÿpÿzÿÿÿÿÿÿÿ¥ÿ«ÿ°ÿ·ÿ¾ÿÂÿÆÿÍÿ×ÿÜÿãýè÷ðóôìúêüäÿßÿÛÿÕÿÏÿÍÿÇÿÂÿ»ÿ³ÿ®ÿ¤ÿ¡ÿÿÿ ÿÿxÿpÿkÿcÿ`ÿXÿTÿOÿJÿDÿ>ÿ7ÿ0ÿ*ÿ$ÿÿýøóì�ç�â�Ü�Ø�Ó�Î�É�Å�Á�¹�²�¯�¦� �����x�n�h�a�[�W�R�L�G�B�;�5�0�)�#� +�!�'�+�/�4�:�?�E�L�P�W�d�h�o�w�~�����¢�§�¯�±�´�½�Á�É�Ð�Õ�Û�â�çîô øþÿÿ$ÿ(ÿ+ÿ3ÿ8ÿ=ÿBÿEÿMÿQÿZÿdÿgÿqÿ{ÿÿÿÿÿÿ¥ÿªÿ¯ÿ´ÿºÿÂÿÄÿÌÿÏÿÔÿÜÿâýéøîóôìúæÿãÿÝÿÕÿÑÿËÿÇÿÂÿ½ÿ¸ÿ±ÿ¬ÿ§ÿÿÿÿÿ}ÿvÿoÿgÿbÿ\ÿUÿOÿIÿDÿ?ÿ;ÿ5ÿ.ÿ)ÿ#ÿþúùóí�æ�â�Ý�Ô�Ï�Ê�Å�À�»�µ�±�«�£�����}�u�o�f�a�Y�Q�L�H�B�<�7�3�-�(�,�8`h£mZ||y{}~}x~yzqp~}_{vx pzzviz|}~|z z~~{vwww z|wuyxzxrt~wpxz p{x~||{ w~zyhyu{y{so{}~zy}t}~u{}{wxm~}w} }~|v|~}y||}u}pzy |}z{q~| s||s|}{k {vxz~q|{ ~| um{uyw| y|{{y}|szyw|s~wyyxwvuu zwr~|}{{xlzz} |xto|| zxq~ }zz|wy{}uyx}~|{~~{}vvz~|{~zo}~~~ vru r}|zxNèBc�� ��!�'�)�1�4�7�>�H�J�S�Y�\�g�n�q�|������ �¦�¬�²�¶�»�À�Ä�Ì�Ó�×�Þ�á�éïõ ùþÿÿ ÿ(ÿ.ÿ3ÿ8ÿ<ÿAÿGÿKÿRÿ\ÿfÿcÿlÿuÿ|ÿÿÿÿÿ¤ÿ§ÿ®ÿ¶ÿºÿÀÿÅÿÉÿÏÿÕÿÚÿáÿâûêõñïöèýäÿàÿÚÿÓÿÍÿÅÿÁÿ»ÿ¶ÿ±ÿ¬ÿ¥ÿ ÿÿÿÿ ÿ|ÿsÿlÿcÿ^ÿWÿRÿKÿCÿ=ÿ7ÿ4ÿ.ÿ*ÿ%ÿÿÿþöî�î{·izq}m}{w~ vz{~xuz|~} x|txt{ {uzvxxzyo|tl|t {|zzvwq|o}yxr}v~z}y{zt vw ~ |q}zy~x|{~}x |{~z}g{~ }}utt}mw}{{yl z{ } xxwv~w wzw~zu~|{}qz}p{ zqzxzzwxv} |xxxz yy{xx xz|x~{|yzz ~~}w}{v}|z|x xz~w mvyz}{|w~}|wzy|o}zw} { { p|~vzy{~~|v || x Zq¾÷Ûíïÿ¨ÿ¿ÿ¼ÿÁÿÈÿÎÿÒÿÖÿÚÿßÿåýéùíóôðöéüåÿßÿÛÿÕÿÐÿÍÿÈÿÂÿ½ÿ·ÿ³ÿ«ÿ¡ÿ¢ÿÿÿÿÿÿxÿoÿhÿaÿYÿQÿKÿDÿ@ÿ:ÿ6ÿ1ÿ,ÿ'ÿ%ÿÿÿúôòé�ä�Þ�×�Ñ�Ë�Ä�¼�·�±�ª�¦�¢�����}�{�u�l�c�[�S�O�H�?�:�3�.�*�%� � ��&�*�4�;�D�G�M�S�Y�^�c�g�n�u�{������¨�±�¸�¿�¿�Ï�·Mq^w {m~{v{uz}~~y}|{}}zpx {}{y{ t{v yy ~}||w|r|wo~v {ptqr~vr}y ~y |~}v~}|tgnv ~~ w~|{sz}t| |z u~n|~||v} {{n~x zz}rx~ x |tz}~vyxwyzl}z y{v~|~{ } wuy|~|~vvx|}xyx~|q~|w{{}ux|{r}}yz~~o}yyzzty|wxw}}~u}u}~wx}w}}}}|{~|{zzww q~ ~{|xyv~w |x~{x hw}~v|wkw|s~ymq{xBr�ÿ¸ÿÿBÿZÿXÿ^ÿbÿjÿpÿxÿ~ÿÿÿÿÿÿ¢ÿ§ÿ¬ÿ²ÿ¸ÿ¾ÿÀÿÆÿÍÿÑÿÚÿÝÿâýèùíòôíùëúåÿÜÿØÿÑÿËÿÇÿÀÿ½ÿ¹ÿ°ÿ¬ÿ§ÿ ÿÿÿÿÿ|ÿrÿkÿdÿ^ÿVÿOÿIÿDÿ<ÿ7ÿ2ÿ.ÿ)ÿ$ÿ ÿÿüø +òì�æ�ß�Ú�Ô�Ì�Æ�¿�º�µ�¯�ª�¦�������r�o�g�\�Z�M�G�E�=�8�2�.�*�$���$�+�1�8�:�C�J�O�U�Z�`�d�j�q�z������¨�®�´�½�Ã�Ê�Í�Ó�Ø�Ý�â�å�ëðóúÿÿ!ÿ'ÿ,ÿ2ÿ:ÿ@ÿGÿMÿRÿWÿ\ÿaÿiÿmÿzÿzÿÿÿÿÿ£ÿ£ÿ°ÿ¸ÿ½ÿÄÿÉÿÍÿÓÿØÿÜÿáÿæûëöðñõìúåÿßÿÙÿÓÿÌÿÅÿ¾ÿ¸ÿ³ÿÿ§ÿ¢ÿÿÿÿÿÿ{ÿsÿlÿdÿbÿXÿMÿFÿ@ÿ9ÿ3ÿ/ÿ*ÿ%ÿÿÿþúö ñè�å�Ü�×�Ò�È�À�À�¸�¯�ª�¤�������}�r�k�c�[�T�K�C�>�:�3�.�(�$� � + � �(�.�4�;�D�I�Q�T�Y�`�e�k�q�w������¤�«�±�º�Â�È�Ï�Ó�Ö�Ý�á�æ�êïõ ÷üÿÿ"ÿ*ÿ1ÿ7ÿ>ÿEÿKÿQÿWÿ\ÿcÿhÿmÿtÿ{ÿÿ ÿÿÿÿ¤ÿ¬ÿ³ÿºÿÂÿÉÿÎÿÓÿØÿßÿáÿæüêùîôóîøéýâÿÝÿÚÿÍÿÉÿÁÿ¹ÿ´ÿ®ÿ¦ÿ£ÿÿÿÿÿÿÿyÿqÿjÿcÿ[ÿQÿHÿCÿ<ÿ6ÿ/ÿ(ÿ-ÿÿ^È«dqq{}s s~ y~w}|zx x z|s{{{o{|rux}~y~}~{u}xzsxv x~}y}v ~}{~z|}twzyxr}}w x~s}z ~yovr~|x~xzw~}| }y z ||~{xx{y}~qw~}}}ywz}tqy| ~v~{|} }ql |vtu}v sxqxv}y}yy|~vzyv{|w|q{}{~|~{q~{t{m}zv}{~ |{k}x {zuryw~| | }z{ ztz}y|xx~oyi|xzznsj {}{ z{ul|yz{~pmt +À`�o��+�)�-�2�8�;�@�G�L�S�Y�a�g�i�q�x�~������¢�¦�«�±�¹�¼�Â�Ë�Î�Õ�Ü�á�èìñ öûÿÿ!ÿ"ÿ(ÿ,ÿ3ÿ8ÿ=ÿBÿHÿMÿTÿ[ÿcÿkÿpÿxÿÿÿÿÿÿ¤ÿªÿ®ÿµÿºÿÀÿÅÿÉÿÐÿÖÿÙÿáûê÷ïóóîøéýáÿÜÿÕÿÐÿÌÿÅÿÀÿ»ÿµÿ¯ÿ«ÿ¥ÿ ÿÿÿÿÿzÿnÿjÿaÿ\ÿRÿLÿGÿCÿ>ÿ7ÿ2ÿ-ÿ(ÿ%ÿÿÿûóî�æ�å�Ý�×�Ò�Ë�Ç�Á�»�¶�°�¬�¦������|�u�k�c�X�V�P�H�A�<�7�2�.�*�"�� �#�(�+�3�9�?�F�K�Q�V�Z�`�g�p�v�|�����¤�©�³�¹�À�Å�Ê�Ï�Ó�Ù�Þ�à�çïò +öÿÿÿ ÿ.ÿ/ÿ4ÿ<ÿBÿDÿLÿQÿWÿZÿbÿiÿkÿuÿÿ ÿÿÿÿ¤ÿ¨ÿ°ÿ¶ÿ¼ÿÄÿÈÿÎÿÓÿØÿßÿâüêõñôòïöêûãÿÛÿÖÿÒÿÉÿÀÿ½ÿ·ÿ±ÿ«ÿ¦ÿ¡ÿÿÿÿÿÿ|ÿjÿkÿeÿVÿQÿKÿAÿ=ÿ;ÿ4ÿ.ÿ)ÿ&ÿ ÿÿüø +ñìç�á�Û�Ð�Î�È�Â�½�¶�²��§� ���� �~�u�o�n�_�U�V�M�C�?�8�2�/�*�%�� + ��!�-�0�5�?�F�J�Q�W�\�a�e�l�p�y����� �©�°�·�¿�Å�Ë�Î�Ó�Ø�Ü�à�ä�èñ óøÿÿÿ"ÿ.ÿ,ÿ5ÿ@ÿ?ÿIÿQÿSÿ[ÿaÿfÿlÿoÿzÿÿÿÿÿÿ£ÿº×Vvwz ~o{w||zv}xw~~{}zy s{s}zp{}usu~}w}yv~yr}x~}}xvvyzu t{| xp{zo}qzt| ~z}|} ~{}|qvvt~{~wtsxqzxx~wxt}ys{~{x}|y|j}u vx{xt~p~tx|}zoswvpsy ~zvv{{wxv{y~zq~zzw~yzz{{|{ }wovz{ |pxtyx}} v{u}~{|x{}~{x~~| w|zvxy|p}zn z}y|~xx ~uwosy { vtu}| q||~{|}{v~~hyw{~zyxvx|{Z<éCÿåÿÿ£ÿ£ÿ§ÿ°ÿ´ÿ¹ÿÂÿÈÿÉÿÎÿ×ÿÙÿÜÿãýèüêôòòôìúæÿàÿßÿÕÿÑÿÍÿÇÿ¼ÿºÿ´ÿÿ¨ÿ¡ÿÿÿÿÿ ÿÿzÿnÿjÿgÿ\ÿUÿNÿCÿCÿ<ÿ0ÿ-ÿ)ÿ ÿÿÿüøô ñí�æ�ã�Û�Ô�Ï�Å�»�¹�°�¨�¥�������y�u�h�e�d�T�O�N�C�8�6�,�&�#�� �$�'�2�6�:�J�K�N�]�`�f�p�s�x������ �¢�¬�·�¸�Â�Ì�Ì�Õ�à�á�æ�ìïô÷üÿÿÿ$ÿ'ÿ-ÿ9ÿ>ÿAÿNÿUÿXÿbÿjÿoÿvÿ|ÿÿÿÿÿÿÿ¨ÿ«ÿ±ÿ¿ÿÃÿÈÿÔÿÕÿÚÿäþçûìõòñöîùêýäÿáÿÝÿ×ÿÌÿËÿÂÿ¹ÿ¸ÿ®ÿ¤ÿ¡ÿÿÿÿÿ|ÿxÿsÿlÿfÿ_ÿ]ÿSÿLÿIÿ:ÿ8ÿ5ÿ*ÿ#ÿ"ÿþú÷ +òíê�å�á�Ü�×�Ð�É�È�¾�±��ª���� ��|�t�m�i�e�^�X�U�K�C�B�8�0�+�#���� �$�+�.�3�=�D�H�U�Y�]�h�r�s��������¦�®�°�º�¿�Â�É�Ø�Ø�Þ�êìïøûþÿÿ!ÿ%ÿ(ÿ1ÿ5ÿ7ÿBÿLÿMÿYÿdÿeÿpÿ|ÿ}ÿÿÿÿÿÿ¢ÿ§ÿÿ·ÿ¹ÿ¼ÿÉÿÏÿÐÿÝÿâÿáøîñöóôêüåÿãÿÜÿØÿÓÿÏÿÊÿÀÿ¿ÿ´ÿ¬ÿ¨ÿ¢ÿÿÿÿÿ}ÿzÿnÿhÿbÿ]ÿVÿOÿMÿEÿ@ÿ<ÿ1ÿ-ÿ*ÿ!ÿÿü õïì�æ�à�Ý�×�ѱw¢mu r|u~}} z{~{~}st}|{ qwyxxsq~q } |pto|z|~|lxt w~{{xw{k t~sw~sz } sv~x}ut~~}~wszn ~z{ww}uw|}zz{yzwx|yw} |~x|yy|v{ ~iv}|{x{r|xyw {w}xsv~ ~{s{| uotsx|s{~xu|{w}u~|x~yy|o|{}|t~zx}sy|p}y~vt|}syzz}n~ you}xwx~z~~x{yw~w~{{~s{w~ r }ys{qvrvx}~} xv}uzwpwyx y|x|}z vWûlsÿÿ±ÿÿÿÿÿÿÿ ÿxÿwÿrÿhÿdÿ`ÿSÿQÿNÿBÿ=ÿ9ÿ/ÿ+ÿ)ÿ ÿÿÿü÷ôðë�æ�ä�Ý�Õ�Ò�Ê�À�Á�¸��¬�£������z�t�o�j�e�^�X�U�F�B�A�7�-�,�"�� + +��$�*�.�1�?�F�F�T�X�\�i�o�v�{�w����� �¦�ª�¯�·�Á�Ã�Í�Ó�Ö�á�ëêð úùûÿÿÿ$ÿ+ÿ2ÿ6ÿ:ÿEÿKÿVÿZÿ`ÿeÿnÿyÿzÿÿÿÿÿÿ¢ÿ§ÿ®ÿµÿ¾ÿ¿ÿÈÿÌÿÓÿÝÿáÿäõòõññõîøæÿëúÝÿØÿÓÿÑÿÉÿÁÿÁÿ·ÿªÿªÿ ÿÿÿÿ|ÿ{ÿvÿlÿhÿbÿaÿWÿQÿMÿDÿ>ÿ8ÿ2ÿ'ÿ&ÿÿùûóîê�ä�ß�Ü�×�Ò�Ë�É�Á�¸�¹�¤� � �����v�t�n�d�b�[�Y�P�G�C�=�7�2�*�!� + �$�)�.�1�8�=�B�N�T�U�c�i�k�x�{�s���� �¦�¬�®�³�¼�Á�Ç�Ò�Ô�Ù�à�ã�ìô øûÿÿ!ÿ$ÿ)ÿ0ÿ5ÿ9ÿ?ÿGÿIÿ[ÿaÿ[ÿlÿpÿrÿ~ÿÿÿÿÿ ÿ¥ÿÿ²ÿ¸ÿ½ÿÅÿÉÿÍÿÕÿÛÿßüêøîöñìúçÿçÿÞÿØÿÖÿÐÿÊÿÄÿÁÿ»ÿµÿ²ÿ¨ÿÿÿÿÿÿrÿpÿkÿgÿ\ÿWÿRÿMÿHÿBÿ>ÿ4ÿ/ÿ,ÿ#ÿÿÿøò ðè�á�Ý�Ù�Ó�Í�Ã�Â�¾�º�¶�¤�£�¤�����y�t�f�`�b�W�O�K�E�=�8�6�1�(�&�"vXr}t]wxy~ zfwvz}x}x|||r{yx{rxo|s~{tuukpn~yy}~y} }swxsf{}} ~Rwuz }qzv||{rwpx} ~ yvrq}~ ~v z}{|}t|v|~z|p}}w|{~{|{{{~||}yx~zue{v |z~y}yy|vthuz~~{}|} zwosuz~wk w~uumdht~{{{|~nwq {ijz}y}{pq vn|~_w{wy{z y{xs|v}|~}|}vrnsz |vw~psv}v~~tu}|d|}}{}b{zvwmcì¬:ôë>ÿ7ÿ3ÿ2ÿ(ÿ$ÿ"ÿÿüüöððì�ã�á�ß�Ó�Ó�Í�Á�¼�»�±�¦�¥������~�t�w�q�e�c�X�W�P�F�E�=�3�1�-����"�(�,�0�7�?�@�J�U�U�a�j�m�u�������£�©�¬�²�º�¿�Â�Î�Ò�×�ä�å�éò +÷úÿÿÿ ÿ&ÿ,ÿ1ÿ5ÿ:ÿAÿGÿMÿWÿ]ÿbÿpÿqÿuÿ ÿÿÿÿÿ¡ÿªÿ¯ÿ´ÿ¸ÿÁÿÇÿÈÿËÿæ¹~¡lspu{|{{xw ws{}zsoxy}w~w}ow ~}uyz}}}~ |zx{w|||}nvwvx{{~qxsw} l~zxvx|zz}~~zxyz|~ xq|x|w{ywt {z~rywk|xxy{w z~u~j~~zyyyvx~xmx}|z{{{z}{wwv|}o {r u}wx{}z|w~~nz} qz||{z ~}yvov vxv x{ |q}~sty|~~~|u|y{ {~}z}~{}{zryx}~}y}ztw} {wvmyuyyzw~}{ot} ~~{~ts k¤½#Ý�^�b�d�a�V�O�M�G�?�9�4�/�'�'�"�� ��(�+�/�=�?�B�L�R�T�]�e�i�o�v�|�� ����£�£�¬�·�¾�Ê�Ë�Ñ�Õ�ß�ß�æ�ìðôøûþÿÿ#ÿ-ÿ0ÿ5ÿ>ÿ@ÿKÿVÿYÿcÿkÿnÿtÿ}ÿÿÿÿÿÿÿªÿÿ°ÿ»ÿÁÿÂÿÒÿØÿÛÿåÿåüéõòñöïøéýåÿàÿÞÿÖÿÍÿËÿÃÿºÿ¶ÿ²ÿ ÿ¡ÿÿÿÿ ÿ|ÿxÿrÿmÿeÿ_ÿ]ÿTÿNÿLÿAÿ6ÿ6ÿ,ÿ#ÿ"ÿÿúù +òîé�æ�á�Û�×�Ñ�È�Æ�Â�³�°�¨������|�s�o�k�e�^�X�U�N�E�B�;�0�,�#� + �� �$�,�/�2�<�C�F�R�Y�Y�g�q�s�|� ������¥��±�·�Â�Å�É�Ö�Ø�Û�çíð÷ûüÿÿ ÿ$ÿ*ÿ0ÿ6ÿ8ÿ?ÿJÿMÿUÿ`ÿ_ÿkÿxÿ}ÿ ÿÿÿÿÿ¢ÿ¨ÿ¬ÿ·ÿ¿ÿ½ÿÈÿÎÿÏÿÜÿãÿå÷ïôòñõêüåÿâÿÝÿÙÿÐÿÎÿÊÿ¿ÿ¾ÿ¸ÿ¬ÿ£ÿ£ÿÿÿÿÿ{ÿwÿnÿgÿbÿ\ÿWÿQÿNÿEÿ=ÿ=ÿ4ÿ)ÿ)ÿ"ÿþü÷ííé�â�Ý�×�Ó�Î�Ê�Å�½�µ�²�§�¡� ��� �y�q�p�g�`�Z�U�N�I�C�@�6�2�/�!�!� + + +��%�*�-�3�8�?�A�H�R�T�[�g�h�s������ �¥�¨�®�´�º�À�Ä�Ð�Ô�Ô�Þ�â�æ�ò÷÷ÿÿþ%ÿ&}> U£{vl|{xr{{x~z~s |z~r{x||h~w~w}|{w{ ~yxrn vzozsxw~} w{z{x|~~zx}p{}rw|zs znp{}}rmy pv|u}t~{}xnt| ~y xxzwsx{zv}vq~~y}u wpoozx kyxqyvz~~zy|~ ~ zsy q} {z}y{zww}v|}vmzz~o||zzslz}}vnsyz} ut{~uur{yv }|{yz z{x|yyvz}y{xlu }z~wiw}{|xr}yO¦-Ü������¦�¬�±�¸�º�À�Ç�Ð�Ð�Õ�Ú�Ü�ã�êëóùøþÿ"ÿ"ÿ'ÿ3ÿ6ÿ:ÿCÿGÿMÿTÿZÿ]ÿdÿkÿpÿtÿ}ÿ ÿÿÿÿÿ©ÿ±ÿ²ÿ¸ÿÁÿÆÿÎÿ×ÿØÿÞÿåþçûë÷ðòõîøëûáÿßÿÛÿÏÿÊÿÆÿºÿ³ÿ³ÿ¥ÿÿÿÿÿÿÿ|ÿvÿqÿkÿaÿ_ÿ\ÿMÿJÿBÿ6ÿ5ÿ.ÿ"ÿ#ÿÿüú ö ñîé�æ�ß�Ø�×�Í�Ä�Æ�º�®�¬�¢������~�x�p�n�h�\�S�S�G�B�>�2�.�(��� +��%�,�.�5�B�C�L�Y�]�b�n�s�x�� ����� �«�±�³�½�Å�É�Ó�Ú�Ú�â�ìîóøûþÿÿ ÿ%ÿ,ÿ5ÿ7ÿ9ÿKÿKÿPÿ^ÿeÿhÿoÿzÿ|ÿ ÿÿÿÿÿ¡ÿ¥ÿ¬ÿ¸ÿ¸ÿÃÿÍÿÍÿÕÿáÿàþç÷ðõòòõëüçþãÿßÿÙÿÔÿÒÿÅÿÂÿ½ÿ°ÿ§ÿ¦ÿÿÿÿ ÿ}ÿyÿsÿmÿhÿbÿ]ÿTÿRÿLÿ>ÿ;ÿ7ÿ)ÿ'ÿ'ÿÿûø ò ðì�å�á�Ý�Ù�Ñ�Ì�É�½�¹�µ�«�¡������w�t�o�g�b�^�X�O�I�G�;�2�3�)�#� + ���"�(�,�0�9�=�A�Q�R�U�f�g�n�}�������¦�«�¯�¶�Á�Â�É�Ù�Ò�Û�çå�ï÷÷þÿÿÿ$ÿ(ÿ/ÿ3ÿ;ÿAÿDÿHÿVÿ\ÿaÿnÿvÿtÿÿÿÿÿÿ ÿ¤ÿªÿ°ÿ¶ÿ»ÿÄÿÆÿÍÿÚÿÛÿáûëùíöðïøèýáüáÿºuzqnxy t~}w| ur}yuyw}}}{yt}}}z}~{ {z|~s~~z~x~zzpzqzzqswzy}~yun z||w} y~x}|x|t}{v~zz~w{xuo~t xr ||t~uv}~ |vv}}xzp ~yt}{ ||~z}}ptw |v}yzyuxwswx~|}xqwzvx~|{y|r }}ul~}l{r|r}ts|tzyso xz{t| {|}vx|sww{w~vz~vo z}}~vzvrqyulw~xxx|qw{k|}u~~x|sx~n`wn|u~ps tpq}rthÿ^ÿÔÿiÿ}ÿ~ÿÿÿÿÿÿ£ÿªÿ¯ÿ¶ÿ¹ÿ¾ÿÄÿËÿÎÿÓÿØÿÚÿâþèøîøïòôìúêüáÿÚÿÚÿÐÿÆÿÃÿ½ÿµÿ´ÿÿ¥ÿ ÿÿÿÿÿÿ}ÿuÿrÿcÿ_ÿ^ÿOÿIÿHÿ;ÿ5ÿ4ÿ'ÿ%ÿ!ÿÿþûøôìê�ä�Û�Ú�Ð�Â�Å�À��®�¨�������}�v�n�n�b�\�Y�M�D�A�5�,�,�$�� +���(�/�/�;�B�E�R�V�Y�e�g�p�v�|�� ����¢��ª�´�Ä�Ä�Í�Ó�×�Ý�æ�èëò õ ùüÿÿ!ÿ$ÿ,ÿ8ÿ9ÿBÿKÿKÿWÿaÿeÿlÿtÿwÿ~ÿÿÿÿÿÿ¡ÿ¦ÿ±ÿ¹ÿºÿÈÿÎÿÏÿÛÿàÿãüë÷ð÷ðñöìûåÿäÿÞÿÙÿÖÿÌÿÁÿ¾ÿ·ÿÿ¨ÿ£ÿÿÿÿÿÿ{ÿvÿpÿjÿfÿ[ÿUÿUÿFÿ>ÿ=ÿ2ÿ*ÿ*ÿ ÿÿýùôðí�è�ã�ß�Û�Ñ�Í�Æ�½�º�³�¥� ������y�s�n�f�`�^�X�K�K�C�7�4�/�!�� ��#�'�*�/�7�>�H�O�R�^�l�j�q�{�~������¤�§��º�¼�¿�È�Ð�Ó�à�ä�çñ óöýÿÿÿ!ÿ'ÿ-ÿ/ÿ8ÿ@ÿAÿNÿZÿ[ÿfÿqÿpÿxÿ ÿ ÿÿÿÿÿ£ÿ«ÿ°ÿ´ÿ¿ÿÁÿÄÿÔÿØÿÜÿåúìúìóóíùêüåÿàÿÛÿ×ÿÒÿÌÿÈÿÂÿ¹ÿ¶ÿ°ÿ¢ÿ¨ÿÿÿ ÿÿwÿrÿmÿfÿ`ÿZÿWÿQÿJÿGÿ=ÿ6ÿ4ÿ)ÿ ÿ ÿÿ÷ óë�ì·~©d~{ w|}|~utv}tyy~y |{| {||z|w x~|}~xkupt|| |v{ ws}}y|ztwwzy|yw ytz{txyx|tx w}uv~ quwrx xz uv}|~x~ ~twz|wy}{~}x{{}|v}~{|y||~z|v}zvx| ~ ~pz~v|~~tx} {{uz~|z}v{v}{zrt~ ~ t}uy~yw~oy tsw uxy~{ ~zvz{uxu{xx|x~|}xtq x zyy{t}|wfxvy}y~}ssx|zsqzznz~v\Ð#Éù®ÿÿßøêùíôóïøëüçÿâÿßÿÚÿÕÿÑÿÍÿÈÿÃÿ½ÿµÿ²ÿ®ÿ¦ÿ ÿÿÿÿÿ~ÿrÿrÿlÿ_ÿ\ÿTÿKÿFÿ@ÿ=ÿ8ÿ3ÿ/ÿ(ÿ#ÿ"ÿÿûü ðêì�à�Û�Ù�Î�Å�Ä�¼�¶�´�ª�¥�������v�s�p�i�_�V�M�F�?�7�4�-�'�$�� + +��$�,�2�:�B�G�O�W�[�`�f�k�p�u�|����� �¤�¯�·�¿�Ä�Í�Ò�Ø�Ü�à�ä�èíò +ðüì,[R`|w~ux~s~}qx|t|w~wxzyu{tr}olt w~|q|}|xxk~{| |~xs}wyy ||q |zzy| k}~x{t{} z~ toxsy|{q~ v|||v{||n px{x{ty|u}yy}qp|n ~tzx w}j}uztwozxqyxx{}zyyys}{{{|vuy|n ~}}}v{~o {zxvyxwzuu}{~myv}{xo y~w {ymztwy} sv~rzx}|zz~s~|v}yy|}{~}yqv|u{vx{z }~e~|}u pwu~}r{||zuzw{v}}| x usuS¯ÿÒþÙÿÿ©ÿ¨ÿÿ³ÿ¸ÿ¼ÿÃÿÉÿÏÿÖÿØÿÝÿãÿäúíøîôòïøêüæÿàÿÝÿ×ÿÑÿÎÿËÿÁÿ½ÿ»ÿ±ÿ¨ÿ¦ÿÿÿÿÿ|ÿzÿpÿiÿeÿ_ÿXÿQÿMÿIÿBÿ>ÿ8ÿ/ÿ(ÿ ÿÿü÷óì�æ�å�à�Ú�Õ�Î�Ê�Æ�Á�¸�³�«�¦������y�u�o�i�^�a�U�K�G�?�<�5�0�*�"� � +��$�(�.�4�:�?�C�H�N�V�\�^�p�t�s����� �¢��³�°�Æ�%Slr|pxz~{|qyz|{~{xxw}wyy}u{u }|ryu|}{ps}|y}z||xy t}{{v{qkz~x}~u x|s|zs}rx|yxl z~yvsx{y}p|}~{w |zx~|| }vx}q {tvrzumsw{~o| yy~yuwy|}|u}zu{qxw{ |roz y{}|w | y|uxyv}{~|v~xwz |~ }}x rt tqu}ov~tw}z vxsv |z~~~| y q{y x ~~~ { }{|}s~m}~y} ri{y~xvv{}ww}ww||{ ozwÂzý��Ô�Ü�Ü�Õ�Ð�Ê�Ä�¼�º�µ��¨�¦�������{�t�n�h�b�]�X�R�K�D�>�9�4�-�)�#���#�)�*�2�9�:�H�L�O�\�c�f�p�y�z� �����£�§�¯�µ�½�Å�É�Ì�Õ�Ü�ã�éêïóùÿÿÿ"ÿ(ÿ,ÿ2ÿ8ÿBÿJÿHÿKÿZÿ^ÿeÿqÿyÿ}ÿÿÿÿÿÿ£ÿ©ÿ¯ÿµÿ¹ÿÂÿÊÿÊÿÔÿÞÿÞÿåøïõñð÷èþçÿáÿÜÿ×ÿÑÿÏÿºÑ±nox| |wxq s~u{}qruxvizyxywu}~sysw q}x}|~r vws{~ }{x}rz {|w ~sw o{v|zs x vy {y|~ ~uyw|}~v}zt}p~u}{}u|{}|~xz{t{u{pzv~}}}vn}|y{y zz|zy}x }oz| {u{}|~uwzx{}~x~xquyzwztt~p|wuyw ory|||~t|q}qxy}~}~~sy{~}w~v{ y zqy{w}w|}|z}w~zxpr ty~z~~uzxv t{ ~vy{z|~wu v}yw}wgvwzw~}|mi:ýÿÕÿÔÿÕÿÍÿÈÿÇÿ¿ÿ½ÿ¸ÿ´ÿ®ÿ©ÿ¥ÿÿÿÿÿÿ|ÿuÿmÿcÿ]ÿ[ÿQÿLÿGÿ@ÿ:ÿ8ÿ2ÿ-ÿ)ÿ#ÿÿþþõîî�æ�ß�Þ�Ô�Ê�Ç�À�¹�¶�±�ª�¦�¡������y�u�c�_�`�S�J�H�=�9�8�.�)�$� ���#�+�/�4�<�A�I�O�U�Z�_�f�l�t�{������¥�¯�±�·�Ä�Ã�Ì�Ô�Ø�Ü�á�æ�éîò +ùùÿÿ$ÿ%ÿ1ÿ;ÿ;ÿEÿQtOkq{wr{x~zrzx}ty|| t ~}{|{~qx~{~x|tt~|yyu}y ~q~uhsv} y||y{{|~z~|{{|}{v}xwy z~|xq||tu~|yx~~|yy~{t~s||w j{{{h}~y~~||z}qs}z}~zz|z {r}~~uz} uyy yy|uzt~y }zuz{sss|~p~ ~n}yw~zu}~yu{yyyrsr}~~|vv}}|wns~{zsx }{~~ }z r{~}xz|xv{}z|zReÇõÛôÞÿºÿÃÿÇÿÊÿÏÿÕÿØÿÝÿáüéúì÷ïòôî÷ëúàÿßÿÛÿÓÿÍÿÈÿÃÿ½ÿ¹ÿ´ÿ®ÿ©ÿ¥ÿÿÿÿÿÿÿwÿmÿjÿ]ÿSÿSÿKÿDÿ@ÿ6ÿ2ÿ.ÿ*ÿ%ÿ ÿÿÿú ôóé�á�Ú�Õ�Î�È�Â�¼�µ�±��¦�¡������y�q�k�a�X�S�H�B�A�:�1�-�'�$����"�(�0�8�<�A�F�M�U�Z�_�e�m�r�w�� �����§�´�µ�¾�Æ�Ê�Ð�Ø�Û�à�å�éìñ øûýÿ"ÿ)ÿ.ÿ6ÿ<ÿAÿJÿQÿVÿ]ÿaÿeÿmÿqÿxÿ{ÿÿÿÿÿ¦ÿ¬ÿ³ÿ»ÿÃÿÌÿÏÿÔÿÛÿÝÿáþèûëøïóôìúëûæÿÜÿÙÿÕÿËÿÅÿÁÿ´ÿ°ÿªÿ¡ÿÿÿÿÿ ÿÿyÿlÿpÿaÿYÿ[ÿOÿGÿCÿ7ÿ0ÿ/ÿ&ÿ!ÿÿÿû÷ôðè�ç�â�Ó�Ò�Ñ�Æ�Á�º�±�©�¢������}�|�t�m�f�]�X�Q�J�A�;�5�.�(�!�� � �&�*�/�8�@�F�M�W�]�d�l�r�w�}�������¬�²�´�Á�É�É�Ó�Û�Ý�â�êîñõ ùýÿÿÿ(ÿ'ÿ4ÿ;ÿ<ÿJÿQÿQÿaÿdÿhÿrÿwÿ|ÿÿÿÿÿÿ¢ÿ§ÿ¯ÿ½ÿ¾ÿÄÿÐÿÔÿÙÿãÿåüê÷ðôóð÷ìûèþãÿÞÿ×ÿÏÿÇÿ¿ÿ·ÿÿ©ÿ¢ÿÿÿÿÿÿÿzÿtÿnÿiÿ`ÿYÿRÿKÿCÿ>ÿ5ÿ/ÿ'ÿ#ÿÿÿüøó ñì�ç�á�Ý�Ø�Ï�Ê�¿�»�¶�¬¦½Yyiw}}yu||nt{zwy zrsutzyuvyuuu y }|} | }}x}~ kzy~~wu}|w~ ~vuozx|tpyz| {to~}y}u{ qy~~xz ~n{}zp}xxx|vy}{|w||nxz{uwvj}||~y vyzlvz {{wwzxwp|| { }{ oxrvxyuqu y}u~}p{{~{|zzmt|vy{tv}uvq~zz y }yq|u~|uz}z|}|}tz}yf|}{x|o~|~{|~y{xo y|t{| rsrr}z|y}vw~ |r|x{ s{}s{}{z ~w~~ x~wyq |~z|V`¼ÿÚÿÿlÿÿ~ÿÿÿÿÿÿÿ¥ÿ¦ÿÿºÿ»ÿÀÿÊÿÁÿÓÿÙÿÛÿàþçüëùíöðð÷ëûéýâÿÚÿÚÿÒÿÊÿÉÿ¾ÿ¶ÿ·ÿªÿ ÿÿÿÿÿÿyÿtÿoÿhÿbÿ_ÿ[ÿOÿTÿPÿ9ÿ8ÿ1ÿ'ÿ!ÿÿû÷óïì�ç�å�Þ�à�Ø�Ñ�Ë�Ä�»�³�¯�¨�¢�����{�t�n�j�e�_�[�T�M�H�9�:�0�(�"���!�$�-�1�3�>�A�D�D�R�^�i�f�w�|����ª�u.Di fc{q}u|uv{vw|v~y }x zq~}u}}uvjq~z}krwx} w~vjx}}{}l{os|| {w q¥}{mmywpuwzzw~}{ w|w{|~sus~}x~t~g|xxxtwzs}|ts|wk~ u]r`s~yZqszz~t{ypZ~xZw kx{ xz{it| wujr }~wyxy~{v}zts{yyqzxzuz~trh~{`}|tn~cxz}y}ryz~|ktnqs~x~ {t{|~xzxwll}wz|}~}zyzu{}mj{r ~j|ḵWõ�¬ íèè�å�á�Ü�Ú�Ô�Ï�È�Ç�½�·�¶�±�¬�¡�����|�~�x�l�i�e�]�V�R�L�D�B�<�2�/�(�����,�-�/�8�<�>�B�M�R�[�]�d�l�t�|����� �¦�¦�±�º�¿�Â�É�Í�Ò�â�Û�â�éíôøþÿÿ$ÿ*ÿ0ÿ3ÿ>ÿ>ÿHÿ[ÿNÿYÿYÿcÿhÿqÿxÿÿÿÿÿÿ¦ÿ¯ÿ´ÿ»ÿ¼ÿÄÿÉÿËÿÓÿØÿÛþæüéøíîøíøëúÞÿØÿÒÿÖÿ»q{xkwuz|w^yxunursh{mzv~z bxx{jz~w}x~~|f vy}} myw|}st~|tjztr|l~vog~p|wxxvtu x}yq~xs~|v|yws^}z}|~~orx|~y{vyw~ozn}~wzwtxv~y~omq|tnuZv}v}vy|vy~y~}|rtx~rr|tyw|~xt| p ~{zwyxws{ sv~lzxzxyp~w|psyynzw xllvu{t}}p|z~vu{{ }qz}uy}h~y{uw}p}w~}w{op{p}s |~xywy{{{}]æÌäò7ÿ3ÿ0ÿ,ÿ#ÿ!ÿÿûø õ ñêè�á�Ü�Ú�Õ�Î�Ê�È�Á�¹�·�¬�§�£������y�s�i�c�^�U�O�K�E�@�;�8�2�-�&�!� ��&�*�2�6�;�@�D�J�O�T�Z�`�g�n�r������¨�¯�³�·�¾�Â�È�Í�Õ�×�Ú�å�çìöùüÿ!ÿ$ÿ*ÿ1ÿ5ÿ;ÿAÿGÿLÿRÿYÿ_ÿ`ÿjÿsÿtÿÿÿÿÿ¤ÿ¥ÿÿµÿ¸ÿ¿ÿÆÿËÿÏÿÓÿÜÿÖÿîÙ `¡nxzy~~|z~xxx{{vp{x}y{vxw |zvuz{sw x{|}~}zjur q~syrs| xvyxxzz }o~{yy|u~}wzxyzw} ~ |mw~w |}yq~~yn|v{}yuw~w|}z w~ wy}~p~}l}s}s}{{z~zvzo|sty` {suz~w~~}v|r}mw kxz~}zs }wq~uy~z}|w}{r u~{u|q{ti|oz{rw~v v{||ztuyp|zqpv~ nzqyzptry|{wx}~uw~~qx}yu}~{wxq~~z|cÄHÃá'ÿÿ~ÿ~ÿxÿuÿoÿiÿeÿ]ÿ\ÿTÿJÿKÿBÿ<ÿ6ÿ0ÿ%ÿ+ÿ#ÿÿýúõ +òîê�å�ß�Ý�Ö�Ï�Î�Æ�»�½�±�¢�¤���� �}�{�s�m�g�c�]�W�R�M�?�=�;�/�'�'� +��!�&�*�0�6�?�F�K�S�Y�f�k�q�y�������¤�©��µ�½�¿�Ç�Î�Ñ�Ù�ä�æ�ìöòúÿÿÿ#ÿ(ÿ-ÿ2ÿ5ÿ?ÿEÿFÿMÿUÿ^ÿgÿpÿvÿ~ÿÿÿÿÿÿ¤ÿ©ÿ®ÿ´ÿ¸ÿ½ÿÃÿÉÿÕÿÙÿâþæøîõññöêûãÿâÿÚÿ×ÿÒÿÎÿÇÿÁÿ¾ÿµÿªÿ¨ÿ£ÿÿÿÿ}ÿyÿuÿjÿcÿ`ÿXÿSÿNÿIÿDÿ?ÿ8ÿ3ÿ0ÿ)ÿ"ÿÿû õ +ñë�å�Þ�Ú�Ô�Ð�Ì�Â�Â�½�¶�²�ª� �����z�q�j�g�`�X�T�N�H�B�>�9�0�*�&����$�*�.�3�:�?�G�N�P�V�]�c�n�u�}�����¢�©�°�³�º�¿�À�Ð�Ó�Õ�ß�å�å�ð ÷øþÿÿ ÿ'ÿ.ÿ/ÿ6ÿ@ÿCÿEÿJÿTÿ]ÿ^ÿlÿsÿ}ÿÿÿÿÿÿ¤ÿ¦ÿ®ÿ³ÿ¹ÿ¿ÿÃÿÍÿÑÿÚÿÞÿäûëõñòôìúèþäÿÝÿ×ÿÒÿÐÿÊÿÂÿ¼ÿºÿ¯ÿªÿªÿÿÿÿÿ{ÿxÿnÿaÿ_ÿ[ÿRÿNÿHÿDÿ>ÿ:ÿ5ÿ.ÿ(ÿ!ÿÿú ôîè�ä�ß�Ø�Ó�Î�Ê�Å�Á�º�·�²�¬�¡�����x�x�m�n�d�X�R�P�H�C�=�;�3�+�+�!��;x[z_m{it x|{|}|y~|x~y}}xvu|{vnqs|}m} z{s{y z{~}w}nxkw|}r|v| sq~}zzw|zxzzxy{uvy{~rt}y~yx| u~ytuuxymr{} |}pu{}y|r}~t }qv~|zu|uo~s} rtv{}u{}v}|x~} uy }y~y~ox~m}|}~t}ix |vyy~{t t {{x}{xyr {x~xxq~~}}z||v{|~xt{}}}zs xwv`}|}{z yt}py| |xvgyssyowy||}{sw t{{x y xu{m græ7·üÿáÿÆÿÆÿÃÿ¿ÿ»ÿ³ÿ¯ÿ©ÿ§ÿ¢ÿÿÿÿ ÿÿ}ÿrÿnÿhÿ_ÿ\ÿVÿPÿJÿEÿ@ÿ:ÿ6ÿ1ÿ)ÿ'ÿ#ÿÿø ô +ñì�á�Ý�Ú�Ò�Î�Ç�Â�½�¸�³�®�¨�¡������u�q�n�d�\�T�O�D�C�@�7�/�0�(�"�� + + ��"�2�/�6�A�E�J�R�V�\�a�g�k�p�w�����¤�«�°�¸�½�Â�Ç�Ð�Ó�Ø�Ü�á�å�èíñ öýÿÿ#ÿ-ÿ-ÿ:ÿ@ÿDÇLrN§}|{ }{}vx|w ys}w{}~ryx~r{g{ }ho~~~|rvy}po|e|{x }s{v y~{u}|}{o ~|x}u| { {{yx~w}u ~vru qv~ wy |so ||yyzxzw{qyhuxyo}u|rz|{|ww t u|wxzyx}|mzwjt}x}{y||q{~svz~xwxty}}{vv~|y y|~wz wx|~yyy|z|yz|w|vv|~}yr}jx~|}~{{~~z|~{u}|q~|zzz|u{~|~wzzzvvz{ ~{y~v¬a�s�1�>�:�F�I�P�V�^�c�k�o�p�x�������¨�§�µ�¸�¼�Ç�Ë�Ë�Ö�Ý�à�å�ëîñ öúýÿÿ%ÿ%ÿ)ÿ7ÿ9ÿ@ÿMÿQÿSÿ]ÿeÿjÿpÿvÿ}ÿ ÿÿÿÿÿ¤ÿ¨ÿ°ÿµÿÄÿÁÿÉÿÐÿÔÿÝÿãÿæùíóôð÷ìúèþáÿÞÿÛÿÑÿÎÿÉÿÀÿ·ÿ·ÿ§ÿ¦ÿ ÿÿÿÿÿzÿzÿqÿjÿeÿ^ÿWÿRÿHÿAÿ?ÿ6ÿ*ÿ&ÿÿÿÿø õ ñëé�ã�ß�Ù�Ñ�Ë�Ä�À�·�´�¥´\¤xo y|}w}zz y v{~ v{x{~v~rj|n~v~|}w z~~}z{~x|zxxr}{w}z|}}t|xwu~~qxxz} ~c}{zymp}t{n|xu}{ws~ xyx|q|~vz{~{{~zx|vzuwx~qxuwp nz}|vn~z{ vw{{i|~z|t}yzl|}zpw|~z}}~{} ~w~|wxix ~rxpz n|z}{rzqw{wfjx~}x|}v{}z }|}zwvr{{{~xv~~|{|}t |vvy}|wxzyx}ru~{~t{~sz~vxmz~|u{q|}zy txv}~}y|}z ~}|t}}|{}xs}z}yi|iyw yxw vwsjvl uu~{ozr|~ ut{wx{{xzu pzyy~t u yupz~v|}y~s}yz s{mt~~vw{tmy{zszxx t x~q~~ }ynu}{yx}}y{}}u~}w{}{wxx{}~y|u{w~uivuxy||~{xv~rz{xusyv~{sr~www{{ss |ywz|xz ~wy}~xyx~yxz}xy|{xw~z{}|yy{zu|y y}zxy~yzx}zzutx{y|{xzt~to{~syv~|vv~q| yoq{{q}w~yv~xytzxstzxr~zx{{~~u|rn~ uw|s~yy}xzvztv}uyu~{vgzl|{twv}yx~~w{x~{t ~ ~~x{~{}{~|zxxq v~ ||yzz y w}v~~ }wuszy~}t|~|{txq|s |wr|~z zyt}sw|x}i}x}uv{x{~|w} r{~|||}zxzlxq{zzt|u}y}}~~|~~ysm|}~ x~}wz~i |x}{~x{ ywv~xur{~ zk|u}xz~~{uu|} q~~w| wy{}u{ | wt{u}{{z~z}u}~w}xp z~}ysyw{}~zz|}| }}}}||}{}{~xt{u}zy{}xxvz}ou}y}{{~n zpq~s|l~{y|yu}~ly ~{v}~}~}{zvx~x} {r{ }{ }zy ~u x vy{~kv}r|}} vv u|w}|||vz}{y}y~~{xz x}|uz}}}x}}z y}|{v}t}z{z~vytwt~|~||xxvp|yuxw|v x u v z{w||iu}}z{y{}~|{| v{{rw~~||rpz|z t~|x fyz|z{ryuxqvxz~z|x{yp um{ry|z}t~x|~{zs| q}~{lyy|| {rysy~t{x~ u yxwr qxzxy}|v{zdwyy}zz{{|v}y|~xpy}}ywpvrzmux{~~ ww}||~m~}|}y s{y|}}}~ yw|uruv~uz}~}yxw{ }wx{p~x{s~~~~w~}u} vrz} z} v|}x{vz{|{ww|}sm} {z~yw|x~x~y}v~z ~v}v}xu |r{xuz xzy|yu {z{qw|~~yzvyx ~v}~{v~ww|{ |yt|y||xyq|{s { }xv{nxtsxzzx|xwy{}qgr}zep}q~{{{ }zxtps|l}}y{u{z|x{{|yz}}|}| txu}z|~}}puw uw~ qvvqzvyyyv|rqntt |xqu~ z{} |wt}||zz}}} xy{}~ qn}~u}} {zvy}| uty{~~xu~|yt}zzwx|{}wv}~{w}{w}z | |s| ytu {~~xzz }}~}zz{~u {s}z}p{}}v}z}}v}y{|{|~~ r~|}xt~{v~{{{}wxor}zt{w}ykyz {k{tv|wuxzt|zvv} } }i{vx}w{{vv|xu~}s|}}} { ps|z}{{t{} ty}w su~pw{y }yvy}}} pyq~y}y{{xx|rn~ y~~~~}ivzrz} uyyx}www x~{ q{q}~|yz zy~~~s y sw~~q|xz|pxs~}|sz~}x{}vy~u{zll{~|| {}wz{v~y| ~~}y{}vy~}}||{p z| }|~y||r~uz~{{k{ v|tyx{{w{~ywz~~{y|yvz~q}u~tv~}~{vx wx {vxxvw|z}y{q~|}z}|v{}w|~yzqu~{{zvv~y~} ow}zpxz{{y w{y yw~y|zz~{wx{x}{z}~}| y~ ~vt~~z|w{x~ {uk~{l}ytzv yzwysry ty{ux{t| yv} yoo}z{oyy yys} y{ro}~}y}w{~} y}zrx~st wow~}zwt} y~z {z|z~}} zv|~}z{}~w|uyzwzxx|~|xxpw~v{ }z}w{}uvw~z|n}wog |xx{u} js} }~v~o||o{z}xm ~wr~{|zt~tz~ u w {{z} iu{{~{wzz~}wv~vy}wz~h~xr |vx|z}pwttzwzxzvw|u}vvz}z{y{|}rz{r~v}omo}nylu{~ zviu|}~|xywq z{vn|p u~ kzm r|~v}xx{n{~~xs{~}z~}{s} z}xs{wx ~zz~zz| zvu}{w{z y~}v{| ||wzu}y |sdzv~}{|z}|{ x{ou~|zt~u}|{y| ~~q}{~ys|yr~}py ||r}y ~qws}wtytpz~ ~{{~z}{xxrt|~}ux~uvwr} {x }}z{t} z yyp~uxw~h|~zszxz{ppspwxy |sz{ ~u srw|{~r~ |y xyvzx|ww~ry}{}{ywuu}{~~{ox|}yyy{y~{| ~{kt}s{~myzuy{{|~wx{v|||ywzt}s||~}}}t|yz|~v qyzwy}{vunsv |~|zzr}uyxz~s{z}~pt{{}z~yysy| xx ~xzs~~}zxz }x zvxv|wwyo{ znsyw}|z|{} ~zy ~z~ q {|~}}z {|}~t~~wz{{z|t vr{toqs}y~}{xx{|zr}tx ~u~ uw~y}w{|yyx{|zp}{wp{}{}y{rzxvjvp|o|}{s uuus~~ |}v} { nzo y~zzrgzlzu{ws z||y~toxtwq y~||x v}z r rzgvplu |~vuoseyyo}h~k} r}|tfu|i|oxynywnjw}ud|~~{yrrqss{~x|~vz{w} |dt~my|}st y nzuw~qpuxup|b~ w} |wwyzvy{tpmdz}v{{i ~w{zzru{x{~}~ jxoy~}|kzv}}{}tx uzk|~y}vtvm~\yvwuzo~{~iqns ]zszwwukq}y|szr{yx~x|~my|x~wq~y{iy}~p}|czysvs~k]s^{w l}||vy||xv}wx{w }yapxvxqynowx~z {{sz y{qwl~~s y~yp guyuyf| w {{{wtvxtyv}y{q~|ly|m Vx|tsv~xps| jyx}d {r{yz||~{ju w xx tu}~z}m t xvmq~wzz|z}ysxu| yxyqw|yl|ltiswwvv~jw{zqjsry|zxu}}}xv}xxo|umz~ru{~p¡rms{}h~~{~fv{nqwzsw|mvz~xw~s ~~}t|~zp~p|y{zroaz zzlxtznqt{w}yprlhu~w|wqu}|zz pu|lzaszy}l}qb|y|z|t xz|s~wywz }{pvr{opq} z}vy |{ qvx{ ytq}||vx|{{~zvxx|xts{z}{}~~~ t~~{ {o { {~mwx~wv}{~t{xz} x xzru~y}| x{sxx~ovxyt{r}z~y|q|}~|~y~wxvwoyq{u}|ot}y z~ {}~{{s~uu{} zv|~q{ y{ww {zv~~z~}t xwl}z~{ww}{~w|~zz|}~{|zy}}w|}||~v{{ x}}zw~}z|yy} {rvy {{yzz| {rna}x{uw{x zyvty{w~zzu |~wpziot}x|}zx|}ulrz~xxy yzyy~zrx~~x s{mx~x}{|wz~|{y~~}{~y}}o}~y~}yuwf~zyvv}f}w~ }rx} v}zv}~z~~ }r|{pzvyz~z~ru~ wxpu{||vw t{xu|jy||||{r}u {rm|{|z{ ~|}{zx}q ~wxxyw{~}~~}l ~b|wzyz yvz mrz}z swu~ }|vvv|{y y~ x{~ {{ uu~ {}l~}z{|{x}|~o}l zyw}|}v ||yxq |xrr|t~|vv~xmpy{ y{}z~}x~wvtxxwyxv}}}|zs~{ u~r}|ywyu~{o{y{}|~a~yxvwrwz yy}|v|x~~n| wz ~ {{ |y|} yx|}}ez|{ztwx|zv{w}~yrx|z mx{wqv}z}o{vvux~|pa`yf}||~{~y~|~xz}|{ }yu ~ w{}r||j}oz}u} uw{{xy{zi ~{y|zyx{|}y{|~ yw~~o}z~}}wsm}}{}u x~{wtw|||fr ~y}r q||} r~~tty }zq|w y{y}}}y }~|yx v|zw}w|z~~t{r~|}}}`~xwyoz{ }|uxyvk| x|w{y}y~x ty|w{yqzv~wmst}|yxz~r}o{mzw}| ~xwtu}|||x{}s|yx}~v~}lvuu~y~~qzyxuwz{v|{}v}v{|vsuw{lyj|{ x~|zu|x}~x{|x~|sz~{r~{z{xw~vu|~xzv vtzv~w~~|}wzuywytvn|xyy}s }w un~uzy~} ruw}{{~|nl}}~{{ z~~xsv zz{ vz}xxz~|zy}~~ {y|{t}{v~z zy{zzy}|~{wxvp}zox|yzz|z~~zz}wwwy{x|r}{{q zwxwy}}r}zz|uw|w|| t|vy|~{vh~x}yx|wvywuwy|| p~xuysr}t|~{|zwr}v||px |~vy~{|~vvvpy ~ywx{~{{tv{ t|r| w{x|~~{ w}|zz}wwpk{ q{ v}|~urqz~v~v{vkytz}ov{wr yy|q~ oxzw}xx} t}xy } tuu~zs{}{{n}v{{y}|}v}ux~}~wu~px~yt~ {|zhrr|~wysmy u|p|wxx y{y |tsywx~}~u|u|wy|xzzvyz~{vr wr|}}x}kz}s }wotpz ~tyvftx~~}r}~{{r~vo~ vz~{y}x|}} }xxz}xx yy|v~}nktzq~{{~xwvz| {}{~x{}r|}x|wxz} yux~{xw n}zx {y{ v}~s|x~ {{vz{y|~ ~ y{vyrur{~yu}x~z}{ ~{h}~nz|{~|~yz}rv}~tyvq }}{u|{ x}}}~{ v{yv}~zspwn{~y|szruvw{} vuy}zwuw sz|xp wzx| ~{}xn~~x}yx{||{|~wvuv}~{{p{wztyxo{zsxy{| u{{|w||~}{ywy{{|~ x|z{~zoww s {wuv{qu||| w{}otvwv~t~~{ ~~~}{~|s}~|{}~v ~w{|}{y} ~ ztu{s~ }yr x{|zwz|o{}rt yzsptw~~nyzuvz}s|v~uqz|}}wzw}w}~v~u~y~ v|xuwqpt}|w~w{}||}|z}~|{ z}|}y~ys~{yrw~z}r}|{{~ {z~|~wwwsv~ tn|~x {}w{}vyyx{rvwx~{ ~}~xxyvwzx©}}rym|r w{ {uyu} {pz}{~|{ pw{} qxw| }w~|tyy wvx}zxr~}qiw wvzo ||{~ yw{v~|yy}s|yexvyzyty}zsxo}r}~ wvx}uxvv}|}y{~mw{~ z| ~x|w |yx~vtywvnxxxwx}xvmy||y {upvsyt}|{{uxsqz{t|~yyvy{{o~vyz~~y x{t|}s~z vpxzv |z~|y~ ~||}x w~{x}y{~v{w ~ {p| xtzv~xv y}tuzx~t ~ vy vz|z}~tmyx}v}~ }wzwz|{usx{ulu ~qzvmx wz{~n }{{} z|xts~v tmkt{ pnxvsl~~qt xr m~zws}yl}|~|vhvvt|vyzt}tuv|~wxy t}~z|yw}o|~{}|y~lz {p|}ut~zq|v~|}~ |}t| ~{zz|y}}y{rs ~|w |x ~{z|{v|zuly}xzyv}~xv| }yzss~u{ }wz~~|}}rz{y|w|mut{v}y}u|t}~ru{uy{y|{~u~}tz}q{zt~xu{~|v}~x~yw{}}~v}y|tor| vz{v}s|w~ y}}ovxl}|x|y |~zyy~uxtnwxz~||}zy |}|~~ yy{{wv}t|w x~xu ~{{~}n~}txyy|x~~}x{|w|{ ||}w}xytx}~ qy{}}ozpx|pvzp{wr|}pxxu}|v~w~}v{w~}|sz |~~{xwur}z{~ ~zz~{}}~xwwx{}~ y }w|}|y|yzvw|py{zx~~uq}{}~vwq~|~yztx |}j zy{v~ q{u}sw}z~{z| z{|{xq y~~xx|{}yu{}{~} vz|u|vs }{}| tu}}zypurv{}wu~~v}x|z~y{w|}w}||wus}z~~|}xuv~~xw}yr|t}yz{z|}~~{{~}}w~n~| v~z}~rr s~| }~u{z~xy|ysyxv~y }~}t~|zx|~|s~s{}~v~y}i}~ z} yw|}}{~w ~v| ywxzwzzu|{w} }~v}x|||~{zz}{}{~{sz ~}}n x}xstxz{rs ~sz|~rzqt}{z}}|}k}y}uqq}x}{y{}w ~v~vw~~zxp}r}u}pyyzx|q{{|xwx y~xzzxzyytvv|}vxr~y |{xz|~z{}zpyyx~z~z{}}yu|z|wz ~yyy}y z||vt ~|} ~}yxzz~xs|tuw~yz x|}{m|} w~ix~~yzwquzvxqtq| |p~{}}zw}{uk~z} vs|{tx|p| zz}tyzvh}}~||~ z zx~o{wv||{~oz } zoz {| v{{p~~zq{ys }~ ~wui~yx}wp}|}{wm ~|{tww~vw~}v{w}xv}w { yz}} |{}|}{{|y}qv}}x{|}|uu zs}vr ~|} ~{ syz qyyxl|v}v~y ~wy x}{zzzz{|}u~yx}|yz s|wz}yx {|zv |u~vr{~~v}| zvzp~xrxt|{}x|v~xz}z~x{q{~y~}s y{yv~}u||}}xu ~}~|}xxyzvwq ~pz{xus|~|{ss~~ yyu~rt|{w~z|~yjzyt||~yksrm|} ny|s{v}|}~{}zyy}~|v n{~ u}|ry}xx|wqx~ty{v~{qy~~nyqs|}uw {~}~v{w|tx}}w~}}y~xw|w{~~}y~vz|~p~}s{{~}q}ywh {zu}t vp|xyy||swzz}~vv|z|~yxw| q}z{{z ~yzo||v{ tvv~v yz ~~x| u {upxy |~nzvs{nxz{|~t}zx}w~ |ryz}}ytzz{{tx|y{{ox u}z~z yx|}rxryvxx}{ ntz|yz}{~fnzz{{z xqzy}~ju}xzp}||rpyxor~u|tz}w}z~pzxq| zzjqy|~qzm ywxxs|z|ys{~}x{ p}xzxu}|s~}}|~rp ~{|nzyt}~x}}w|{|nsv |~v~u~ufw|xzxpusw|~}|~}~xrwo}{~x}~vxw~x |~t}~zyrow~||yr{qwy t~~w}zv~{|xrwu~t|~{yu ~zk{y~ {v|uj ~ yo| n~|{xyuzrv y~ z}~z | }sz|~xuxy{{y~|~xtzu|wxvxx}xxn|w|{zzrtu~ywu|ttx q|}w~u{{{rxx~v|{z q~qpp z|j{~x~|st~|xwxwzzwyv }r}~|ty{{{vl{~}{}|ytqs|z }ptn {x}|{{yy t}xz{vuyhr x| qzysz|~{~zn|u|~}~sv|t}y kzu|v|z}}y}y{uzu|zv{x~}w~ qwzmuu ~ ym}mq{q{~wy~||x|~zy|~x||~{ zw~~t wzuw|} x~ h~|vpto|wj}o}y}}v}tv{qz~zvq|{vrxm{t}uz~~~{} {xx|qxsz {{wtutyyrm{zyur|s|tz |vu}}{~uvouuz}p||yz|}z{tvv{wyp{w n~zwp{w}~ r t~{~u {wwwpy~|x} spy}}}{|wy}xsyux|x{vzuzr t|{w|} sn||wzwr|y}|wys}wozvu~|~|uy~ts pz|r{|~{s|pw{}t{|~|`lmrc~xy~tu{}y~y~qq} ki~}z}|kyyy|w}p{vszz|x|eh||\| uw}||r|zv ld~{r}wesi~ybu{iots }o{yytwhtuv}Zyw}yuq~}~v{u}y}pygxws}r|wzt}~{|qwqtm|fy~znyk cwrknwfaswo}_twn|[tyytn||lxenzy{|wrxxvohw~~zx}j}|t~z|xzn}y}oyvpru}xqr }}x op~uynywwv}{qyv~}r{~y} {w|~{~wsz|{v£qywv}tzv {}{v}g|tzlys{x wkouqx}xx{w~w ¤upr mlx~roziu|x }}|w|{v}| zyzu}}wur~p}x{ x{~ }wt{yyyyy|rs}ud~|}y{o y~|o|uyvr{ wl{}||k yzvxpx|pw }hxws}wz|zurmw{}m}v{t{x}u y zxr~zb~txzl|is}rbx qkuwyx~zo{x}k{ w ll{zxq k}|{unaz {{{vn_~||xr~x yo{uf{ sy~~zys~|u{yz}v|xvxn{{tyos}zz}{vyzyvbep{~urv~ lzvxjx| |w}t }kx|tn}ls|wwv try~uugw~~|zl kyyz|uv rswnzxqvww|{|ru¢ njmtm{{y{ t}|}~}z~u| ~x}{|y~vz}ttz{~}}z{zoyyxz{z ~z|t|z}z z r}~ z|| zyyx|}nr {{wz}|~~v{}~~}z~||{z|{{s} xzy}{|~szyyy{si{wy|~v}xx ~z uqw|ww}}~s~z{uwxqq||ss{}x{w~ o~|~yt}v}yyvs}x vywz|z|t~ }~y|x}}v}i~zuu~ uzw|s}y}i}wyv|~{ ryy }|}}p~xqxw{z~zq}zz}~{u~|{v|ox~|zhvyw| {z vxs~uy|q{wz| z{yv|{ {w z }|||xu}sv{~xx}}~y{{}{} |}~{kt~}{w~{} {{w{ x {izuy yyzwyspzy}|x}xzmx|wwy}ru|| ~y{yyz}|{xwr|x |{xupu}x}~}uzv}x~{}tny|u}ny~{{{xzm wz~}x~}{}{y~{{yl |xv|z|y~{ { |uu}|uzw yzwxwzu|~~~~srz~t{~tv||smxzvm}u~s~|us {|{n~x~|qvqs~{t~zzu}x yttz|}{tztx w}zx vyyv|~ jz yl }{v|}vz{wzuxyxqw {fvzhu ~xt| }}x~y~~{|}}~|twtzy|||t}{~xyxryzvz }}y{yyx}t}~s|{~upv|x~x ~x~~~wo|yy~~ ~y}z} ww}v|}uwz|yv~r~||~|us}y{}{~ |}z|m|vwyfxux}} nxr| my|vt}}x} o}u~~s}r}~~zsuzk ~v~|wr{ v} ~|p~rrzwx|wx }z}~t uy} {~s{xz ~yw|~ }oizoz zy~~~zysw sx~zr{xv~r y~{ynz~vsy}{rzx~}{{}u|}{|| v}{~ ~st{ys} yxt~vs{wy{z |}{vovxrwsunyxr{ {}|}~o}~|~~{} ~}~yp{ ~yux{}xzw|}u}vuy| x~~z|{ pv}tr|}}|z|i | x pu~y~{~v}{}z}{p}}wx||}y sxu~my}| vr|{}pn~dy|z} {~|v{z}vwwx o~xt uyuw{~tzt~~t}}t| |yyzxtt|ouviw}~yynn~rz{prs}}xog ||}qv}}{||rt|tyy {t}y~~{t|~z{v| {{x}t|lw|vt~ {z {y xyrsxir}~}{|q q||}|}z|vu zywu|~~zw}}}x~wz~~ zz~xw|z }zxjxxtz~uwn }z~~uuz w |~{~~|{tqroy{~yzsl||{{~ vzt~~z~{q{wxzy{q~zl~wttx~~ypstw~~|zn{jv zzuz rzfz~|zr|~z}zvx{|xyz|{z~stt}tuz}{nzvv~{y|{~|~}z} y~u y~~}wqs zy p yzs o vv}~w~}z}~w ~~~ss |x}{ow}vuw~ |qzxy {r} p~}~ly|~qq}|y||~|wzyu ~wyv~z|yy }| }z{zxynu} {} xy v ~ix~|~y|xx{|zx} }z|uv mw~w~{xt{~|{y }t |~wlxyp gvzuquvn}x}u~q}nvx}~o{{w vxw|z ||x}l| }ut~}vun~|yzv|s~~ |{xs~{rvz~uz{wyv{|~z}z }||q {z}u~r {xy~{||{sz }yx|uoz{|}{zt ~}||~}v|qy|yy|n}}y~ys~t|zx~~sz ~v zy~ }~x x~}x}} }xy} c{{{vu}{w~}}ww} |w}xww~}~y||z }}}|~zzxww } \ No newline at end of file diff --git a/build/src/gfile004.data b/build/src/gfile004.data new file mode 100644 index 0000000..efa9e35 --- /dev/null +++ b/build/src/gfile004.data @@ -0,0 +1,69 @@ +ny}t~vhzz|x}ywqsw~zy|z {lx{qrt|}s x~w y{{|zw~pwo_fxPtigg ¨ebtt©£ecjm¤vn\_§V`l¡e\ryrunk§®woerac_fu_oaa~zVhq}¤Yghd§wz^o|£¤z|SZvy²Xfvhª¥~iebx}Xkw¨a_k]¢k_ZV ¦|Ygu«`yqk¦¦mea¡zVZza¥g`jX¦lfdj ¨{plawz£_g w}{tr}vxzp|~z|{ zww {xl~w|}|y uzut{s}yuvw zw{suqs}tzw{mk{~zw|zv zy|}~x~wsw{{vtq} w~}sww~~~x~u}u }tzyzw~v~u~~y~ vt}jt~v{~|n]Yv[ayvk`fjjgNY}¡{p\kª cm]rnwYV¦¤}a]~|¡¡hstm¤¡`piX ^Zsz¢f`pd¢rbeT~¡y[cv£¢d]u]mp\a®{}YZyqe`fddjbj¦¢~bYveLpd¢tlMjm¥v}Y_u§bbdr opVa§j[Ww©`clV©jkeX ¡~~{~~qx~zz~~v~zrv||||~qsw|y~zuz{sv {t~~}{ z~~{{yu|u|xw}uwyqz{zvvu j}x~~zvyxpvyz} xxp~{ {~|{x mz }w}{w~|}}wzn{|yx|} xx|usv wx | z nwyy~|xo~vaZXhaag~v£^Wol¥aj`_{¥sq_Z ¥Z]mkeooZryb_y¦h]xqµUbochl\¦¥Y]b¶bfheut[\kguo¡¡¦_m``¢ungP¥xagxh«g_a\mo]V¢«xX\vg¨gc^X±nybVw«¥~L\w}Tice¢h`c¦ [Xn £[prur||x r|uws|st~yz}|w|hxx|{zp|}yyw}gn {~vqtuyz||sqw}{w~zsw~}wypp~|vq m |wrvu|{zstkquxuptxzwvzv}}~|rx} v|y~wzz~u~sykTjx¡¡\zid©ppaN£²}yP_ol¡Zgeggxodv¤eS ©ªhGeg]nYK|¡}xTmsTietb¯Zl^f}U[ m¡hfVvlup\¯|\Y}o¤_ffjgbh\{pU} in\]¢_oYU «udMwl£^jSjjcUp®x}]K{}ºxc]ea¦sqa¨v[{k«y}~r~i}{yu} | ut}t|~v{zwz}x}x}{jxjuvxww|z|wzzqt~~uw{}z~ |xm}~{rds{xu}qwj|~yx|kZ}~z tv}~ km{vyfusvwz~owykyk|}yo}zuwtntxzu|yxw ¨}ra[ ~Yxu¬¥YtWhudVo¦jY«°~ _dks¡t}`a¡tVz¡jjvj«¡q`c]¬ry\`xiiaoayXI ¶rt_Ti|w`ti±OkZ_¥y¢fnzx¥¨`j^~¡¦ktg]t ¬~Zbx§ofelio_lV¦vnbKq~]ebrac`dw¥nZf ©«Q_b¤hXda t~zwxzu~vvtqnp|}ww}]wpryyzxz}ymoyww~ysusqwvuysrzxz}}xstwy}yuxx}ny|~x}w{iuvvzt~z}~u{y|os x~z{}~z{y~~~ zwzv~wuvx w|}y{]qtzzxx|yr }|p~x{ v{zu}}|~x}ex|cqwly} xqvzkszjuex ~|s}{yy~|pZ|wst ~l }|s||}wxxu}y~}}u~xx~pyql}}x yz~ |}rt|xzpq~fpk¥tfg\ª¢qRe}ª¢ZTi`¦¬ olaS ¬{gX~p« \ebm¢¥XnkL§xvgbx|«abzn¥qlkR¥}{cmv§{\ivg£¢eXha¨rJ]u©¡}bDhe¢incX¦¢jQ\hd`nj¡¨¢tp_d¥mwyY|¦ªXOgmbp^W¤zqgZµ\gjl¤¡lnai¦¨qzUc}§§V`sd¡«tih`vnVT~¨}^]{c®`_]d¯xxU[¤¨[_mnªªcmeT¡¢lr\Vªyk^q|¡]v]j¦v~^Z¥z[Tjoirffª¥l}_Y~ Wgro min`³xwcp_eww£au`asw^_¢mbhg\dab£¨uvTnq¦`kry¨hgiY¤¦tz`^ v¨oeq¡^d[dsu^Xv¦y`blo lz{] ¨l{[d¦]}r`¡¡khjb xUYy« \\rk©£Z]h` ªx^_¥]e\k¦dqfi¢nvW\|u¢g^th¥ kj`^©£wi|qrx{|~y|t| {~r}wzp}tyy~ypx{o~kxnt uy~l}sw y||zru ~y szz q~ |v|r}y}~~ {~~syzz{|}}z}yx}~y~}t}~xw|o{z|}wh s yzky tzzl|v|u~~xz{~s}} }~ss{|vzzt|uzw||~~z}{xzs|~}~ }vz}u~ks}vzvq{~xn x}tvt p~uj~xszjy~ z~vxqz ~}x{ }p{yxw}y}~ywzptsz~~}||xs~z{i{wq{{or~|}o}xwpy}v|}rlx|}x~wtv{xux|}xx ~yt~xy~}yz|u~wqhz~q~zp zyn{zzt{p{h}{~ |}rls}qb¨zck_£kUb°¤gTzq«\ei^ybsX£´x}Uafª¡^`e]¥uxh`¤Xfzyf`d{tpac«{^Utkeie ¡cX[|¢ z aWs©f_l`nxbeq¢zh`yu«j`jm£de^S¢¦wZh§ aeye£ cri[£¤U\u|¬\\sfpigb¥|^\|x¨¥¡w}w|uzrp{z|p uyzl~ ws~|x~yro |ms~r ~{ottw zz~wu{~szx|r} ~~us w^j|yy ~yyv{~{ {~tkzz }}t xxx~qpv~~xytzzy{t wyw~ }sx~{v~ nyv~ xzyv|y{{{ {mw}z~~sy|s}|~yz~r~{wsvv~tzr{ }t{p|y}ziwyx}~{}~zoztm~z~uj{gw{ukpyu}z|txrzy|u{uz~yyw{t~rf|| {|w{~pvwu{w}{sx xvn~zxyqszyy~xtxzXVq¡xUb|hªm`fe¦jnJi ª{`qxu¡d`pV©©|eT®¬b[uq¡Oaaf¡¥r~bV{° Xixj¯bvhhljV`¥£Vrnxh`tW£umh[ ³Od{o cm^ txs^~¦¤ ]j~r¨bghk¦uV]y¥¢X^|~¦ b_d`©£¦c|kS|§¢N^}pyak^¡oyabs~su|~v}~| }x}iz~n~vw{wx}w~z}m}x{py}{u }y}r~~~w~ y{tz|tu}wn{ythuv|}{ ~}{r|yus{{wysp{{}{|{{~p{{wks|x{v~l{|{vwt|v|ux}{ rkb¡cgbV¥{bV ¢_Xgp¦cwa\®q|aY~Xfnf¤\pg]¡sq`Xy¢dvld ª_ohH|¥¤~uT`x}\`lj§hleY«¨vQZ|©«[`ghkgO¬«wXl¡¯X_l¨nm]k~¡gZ] ©e`jrohX\£vpW\{¢\bc`dbea¢|gZ|¥Vd{p§¢\giX¨¦xxpq{¤Xs|}«g]eX¤{yZXy¥®uZfpp©¤no[]¬ohgr£[kl~mrYc¤bq`Nu´¤]\qm sjf\~§w_^{£\^wtwh}]©yS[rª¨ __o|¨¢rggX s{udYq|sQbqg¨j}aU «o~Tm} §[You¦jsWp ¥xSb~¤iUhj¢lnKj¥yt_Rxz¥y{}~r~}sywh{ xryv~j}tw~x}uqz}ky}}{{}yzy zuts|mx~ory ~t{gu`w|~v~ z|z|}zvw}x }o}y`x}|{n{xwrpyp{u~txjz|yig rovk||| yqr vw} }xt~tt|{xj upc[^{ª^J{kifgo¡m}S\³tQiimqZo¡¥la^l°¬[`uq¡´[k_j¨]gS[¢~_]V{benbkmab§ {\Vd¡©^jld¤¤lh]Z W[m£ejdf¡snNd¬|Xmq¢§`\cy§«fvTgwªp]\pwVkhaisL^ ¢~{fGbq£]kh_§jyfaztvxx rq}{n~t }|yqv}y~~w~{zzxv{tf}zztuykw~wo n|yrxi~|x vbpx}yq~~os}wqx~x|}t}}tw{pw|v~}|x~zx}v~ ~wy t rw}orzwz|s}{zs u}|wnjm{yyq\tzkbff §dwd\§ xZS}`pco©^tZZ}Yflz¢Zgbw¡dx\`¢¢|Vnyy]gkdlk_W¥ {]^{vciod¥ifMcs^Mi¢gVkY¥fyYaª£vZYwf¦vcat¤ doQ_¦¢z{^ov d\meªke]VwfYri®`am^¦ly`h¡{vd\w~Xz}{w||{ |uqxzz~}{}p}w|dw~y{s~|}vuz| | ~x~ y} zv |{~ wz| {{|~|t|~ms o~~ swz w~}}} xvz}u}|tq s{y|y}yzpwx mxuurz{x{nxx~~}~qqj|qjyzxsn~u y}yw||s ~z~}t~y oz} w|z~lu{uv} wuyi~yzw}{o}}{{ y}~|v{uvtsq|}|} wvx|w ~{|zx{{trz}jsrrw~~}}rw } lw rp{~z~}wvlgj}Zoj~¨m[ty¡B\sznt`i§y{\^©S`mo ¤eWu\z¥pc]¤zhYvi£mark©prYgr¤[Xvy±]ddgjwaO© a\l`hl`¡g{^V¢}Jj|u aznlqpN|£~ cpil§¡_ijl¬¦jwVgw«~r^~r§lkbi£rqU_x¨o]y{£uwzr~vrtxp ~|zxv|q{ n|~wjn spu qw|zyuo|{u{~ x{u~||u{~vt yv}}ptw }k {wwyvx~{~~zrxw{kztp~}vp{}t }u~|~u~{~y{z|x{yuw}{y}{ x~}tnz||y|mpw|}}wmlp`g|`Z}z¡£kc{x¥tZg |¥¥qX\u¢nddh¡^pce« u{Z]_ljiokd^¨¢wl[pz\pe£{iicr\ow¢n\snbo^d«¥r^^ ¡`cms¡jwck£woZcyw¤bZ|i©¡i|j\¥mZ^rz¢^^gn²rxfe¤ynQ~s£QOv\¡`d_py}t}l}{~x~q~{|zux{y~y}y~z|nz }u| qwz{vs ~q{}ynzxrpxzprs wp}txp{{zsu }{m}v rt}~iq| ~tzy~u~pu||}r}{w|y{{|zk{os{}ry~y r~yu| w}l{v vqyvi¬²t]Szs¨debm¡|hh]~¥Vcyj¢«fbgc«wkc]vY\yq¤²h^jdtkgg¢¡rgmuj_ce¦¤dqi^s¦\Urz¦ L`bg©£k ePryUcv b\ja¡e}_m°z]erl£bigb¡l|hX¬£ycg}©®¥pe_¡¤mZ^b©ueHsi¢hab`¦ej\] ¢¢WP|{ j]Ui¨m^T_§}~Jzp£i\on¡¤§qtec¬¯^P ~£¥kcog¤¢¥tgi\wsW_|m© d_r_£rr\b¡zR`{©£_u\g§y|_d f\to©ªci_f¡vk`Y§^Xvo¦a_[efsa]¢ªs RQu| §isjj ¢^wXW ©|]Yiq}`jk{¤§¡otoX¡YOqi¥¤Zjtb w {x|yp}wskx}vy{ rvx }yqs tw{ |y}||yy~|wk xzo|~y|qyy~z}yzxvvxx{{~q|p ~ x|~hkww{ szwzx|ow } uqx} ~~~w{~z u|{xvz }~}sxw}{~}{} |xyp |}|~rzp}p~~}y w{x x{{uyws~~y{zzy~x|yzty~ {wtw}qg wyy~y v}xzzx{w{|x x{vw|~z~zz~yyr~~|ty| ~vw~x~} }z tt{oqs{}{}|s }|xz{mm¢\jhWrqPax¢~ XSq¥~dahd¥gm\^}U^~v¢¤`Ztj¤qnSd¤£uuNUru¤l\uf¥ gs_d ²§xgQ||¦¦\_wlgyX^£®r[^sOkjj¤[eXc£{x^c{Taqc¢lsa^§~ob]«¢^kyk¨qeb\§yyScsy¨©`^klmfWl «X`¦©daeia hb±rzaU}³© YlTw¥¦]kje¢ewaTrªR_vu `saUtyXa©Slne¤lh[i ¢qt\[ul U`si mcZc¢±kTZz|¡Qbjq£`ul`¦§¤x~Z`¨ial}¡mdjUp{fIr{Z]ikaq\[ xs]Rn¡_Ua[ ko\gzXmq¤ªdl}j_mgk£wyv~~yy} t}wsuwhyrnzt{yu|v~lx|}~|xt~u|s yuu }~v}z~ww~{|}xu}w|kzz y qyp| ~{~}ysrp |pq~}y}z e} z vv}v{w~w~}{y{qvyw sxqz x sx}|r{~x z}{~syy xw~j^Zpj¥m^hv©ptff ¥}gT}w¦jagi£ix[]{¡[\qw¡©d_c[¢bt^\§£~^_rm_gk^|lce¨|WS~qdZqY¥¥mlZg¤£tZd~u¥eflbop]m{]Uym¤eeoihv_\¢ x^_{} ¡agbjjtdV§{vb_rt¨\f\fqaid¢{RXx}v|z~z|}}tr|y|rt}|y{~~~vz|~vq}| {u{r|{z}z || ywyww}}|v|vy|vxzx}{|vzr~ |~x~wp|wwvyt}~~yy} { xvz~t}twtrxvtxv}|w~p|o{v z~kh¢©iuc]¬£}bfqp hsdh¤¥q]]¦¨}RYk~¦bssdpc[uWtc\ekh®ziPc²| gUzi¤^k`m¢xnUMt¤£wf^|m_cbk¢o|^\{°qeWg¬£lZeo¦pxgY|s¤x]arvªZcg_£rwdhwª¢~R_qr¥`nf`l`\`¬`noveuhZ¤syj }zz~}}mu{u x|}{~}gywvn}w~q~w~txvuzs|ty ~xu|xv xs}vqw|zvu}yzv xwz~}x}{ zzvy~v~z{xwxywsz{w~xwi~ tp z{}~p{}z{~t}x}yxw w~|~sv~ y|zzzn yxvvv}uvo||zuu}d|ux |xwzx{ |}x|~v| w muyzyzt~y~~z wy}r}u|xxut~l ~{y}| rx{~rr zyq vyys~zv~~y {~~wx}}yx|u| p x|{~}yy|w|sgt|¥i[cf¦kiXe £`Zlmªdkbg©fzcU¨^Vr ¥_bbl¡bkqU¨}dbs\zpr §£wlf[°q{Xhwn¬Y]f]¨ukbd§ª{Zat£¤xvbfgnWu¤ z [jg©ciYcq§qr_S©tqaSqyª Mdai¢iSi£y\Szk©|fckk£y¥fw]f¥¶u\\ur v|~e~u }{{ztywwvpr~~qyv¢p}szs vdupxyp {r{|vyyxi`}rytvz yrpruv{wx zzmgwsuzvq tjx~z}rzw}}smzpawytyqy~bw}jqzm}|sn}~|zjd{}°vi~Sz£~lxz §bbl]ª¬oqiX} ¤¡}Q^lj¥m\g\ºu{cR¡Yioke]ax}z[[~¡ygl}lLeo¡£ xcr¦ke_uª¤zcgq{¨£souW~©|ebq©¢ \loby{Te}bQ]{SSe¬k~Wo £~f\yªbkf[kVW~xªkbxk¨pdQcq]Zxv¨u~WVyp¯aEfq¢ tfe}z¨£}zd`}[¢s]]iQid §© \mybpq¢fl`q{¢dMmw²scngc¡| s{jl{ u}QowikX]¢weba} }tVmz[ZUk¢£f{Z[¯Xpq£¤plco¬^tjTv«y`u¡[\xT sqV]o¬p[[lwacgj¹xsyU~«ydqvzq|x~}{rzy }zzuztv }xw cszzu~um}m`asy yuuovwuoo}pnw ys} w|{ ww~z~s~qvz y}sy{uw}}r} x ~ s~y|owu}}l cxz}n{ }w {k{y~pwdpluw}i~~|~{uw|r utw}}{}jx¨j^[d¦¢n~dSy«jdo«]dblcn_kv\zl£«n\V\hvg]k±gmql~nblo ¥ `}bW °dtnj `qkh¡qklN¥vZ[tm±zTir`¤¥£txjXv¬©Scls§©°ahe^©csOb~t©¦scMxn¢]`mMxwgaf¤ cZv|¡dpcu£nvpW¦u_wpu¡g[umwyoz{j| ~|{~vy~w||qzt|y}v}~srx~r}x|{y~|v~ww{ t wy|y}~~}x}o}}rywukt{zzx zwu {{r} {{yyzt uww {~ w w}yz{z|~{ v| ~pyyjo}¡ oeez¤{XZji[y[b¡prh^xµzwWYyu¥jzpV¢mjK_q¨{]Xtr±dhok§uiXg}£|R_ysajlg¦®xfYa} u`]i f_\l¯ixR_}¡¥wO_l| ^`ha¡²q|fV}¢v^ext£blr]¢gy`a ¥[hdu°ecja mb]r £Oc{j§§a[gi¥p~v{ r~{~zr~{uz{~v z~~ry|}pzx}||w} p~osy|z}ru~ez|}px~nv|qvp }p y{qx{xyyq xtzy }sv~ rw~~}}{|xzopw}vw| xn{zvnp{|~}xhztyt ~|wu u}q}vzk\kn§¤lpVV¡¨~~ZZx¢Tase¦§Y`b_h|Y\}¨bdk`odgX¥¤y][~ cWvm©hxmp¡ez`W |¦§^Ucidpad¢rx``¢¦ jUjs¥lii_ ¢l`a{¢~__nu ¥fc_V¢}xZhy©[_oj¢hjg`u~f`qRTzp cne[§¡~e^zz¢Xjqvx|z|lzs} {~zm|~p|u~{z}y} tyz }rvy~x}}v}vr} | ust~ }yw ls|¡} z ~svuxy{st sl~yux{x{ vy w~s}{yz xvvvuq}zr}yruw qv|zn{uwzyrzwt |da|§ zlbWt®| f_jp¨¤]kcn¨lVV~~ ´dWt]]dR¢ª~xkYwXirr eciX¯~ubR~z¬O`lg^^n[©uO_±|RWd¦efdOv xxJa¢maci`¥¥¯ggkfª|qr]| \a|u¤hi`e¨jwf]~¨°`cw~dngg¥ivc^¬Y_nr¬ivqu~ y tt z~|s zvuu|v}z{px}}{x}~{v|w |yy~{|{uv|jtv||~ }x ~}{~~tq|vt}|}{w~~zu z}y sx s~wn{{x|{yk{yq vx}x}lv~ ~xo|{} wzgoz}|yxy{w|y|{ vf~x¨¤bMso¢fse\ªo|_Rx¥£]Ueudkc_£®tyfY~q¸ bXll¦©^gia¬§p}H`{ª¡~[no¢koiQ£tw__wmbUom¤jf_p¢vv\[vv¡¦T[pe ¢caoX£¡xox\zYIlp¢b`in rvTXv|hZhhi~ejad r\s£¤^\ve¥¨mlwh¯~oh`~¬~ zq{zxn ~}kxq|y}yzu}|{zu{z ||y}umrts|~{~}rgz~x}uxw}|v{y|wzuw}w}v{yz{y~~{ w wny{}sbrv{~{vyiz}zyl}zy~sz {~y}m yzv}z|y~|z~vt|ws| |wuty zzxyY_tw cnae¢fp\Tz§©XPx| dcbh¡ln^R¤~h^{v§¦oZsbwqjb©£`cr£¡ck}]£to`j ¡ p]fur¢gftT¤¥¡¤ljWg¥e[f x gvkc¡~t[e°¡a]u aXcmdf[v¡{\X}¢®fg_iQme]±tsU{{£giel¤|tgW Y_}r{uysw~yj~r|w |{z wljs~zu~pgw}{{shx}y {wxsz }u~w} z {~|t}|qvo}zwui|{|v}~|~yzs|hvyjxz{ztzlyv|oxyyx{wu wy~yxv~ zqu}n{{}}rjxhpYc ¯ ]Xyl^kim¤¦in^Sx_Zr ^olf¨mkagzc[ko§¡fa|fqh^t¦}Z^| gmol¨¥cwSW}¥s \i~o¡kdvmcn_T{£|si_xp£fftgf^Q¥zXWpu¡ ]pg_¥¤ggh] §q\zs\|wm ¨rg_Y§¡{~^]vw_hviXy]{t |vqvr x~sw}v~xw~{|x{r wvy~wyw}}|{{ }yyyy|~}yw|ypq|zyz z osm }thvvwmv~zv}{xz}}]qx|uzxwx|~}}y }}{~yxsvzs~ t}vv}v~|{u}}z{ |to}zrre_jv¤~\rqn mjdh¨bc~ª§pQzm¢¢ugk`£¬£qj`¬¡x^UnmcbThjcQu{¤|^`vi `t`muzk[ ¡¨\oxi¢aia]¡ ®wmQz¡Miru£¡©pooWxf^d¨Z[rs gjaUpzY[¦¤X\wp§¡Rhh] nWb¥ª eS f¡_saf¤¨swbWt¡yp~px |zpz|nx }v |wtz|~~~}xo}w}}~xvy{{yzxtx{z|}zv yu~u|x{sxwo ouln}ux u{vvr~w}vt ~ yv u~}~r~q~{}~ztv}zy ynzv{~}uzy~v~~uxx t}wyu~ nk w}t x}qkzyyv{}u~ xyep} uyv~| y|zy~r}z{ws|w~~}v}}xw{x x}wxvwvwzv{v|w|{ ~xv~xvx}lxzw ~tx}l}rlz y{w|s spzxmtzz|wyu{ | ~ZKq®}d^bv¦qypa³qbm~xbftulia]²vvX_ x¥^c\ ¦fz[eh[k¯ \Ytu¡ªkenUª|uVhy§bgxnle[f¡x_\q\to£hrmlo ]Ps¦§\[e{atij gt_Wz¨q_rªOhf[¥~\fª¡|}Vi{p¤¢flgc¥¬xvZf|§Ngujidf^}X]| _ekWmb] §pua\¥¡~aQxm rdcp£hqeV}¡x]Zqp Xg]t¥vdU|}¢¡[`so dneb¤urk_ £]lpq¥bgd_¡§twXVªaSk^b`[«tpVPxz»W\wauig`§t~_^}~¢µpWo¡eeik£xxfRs§Y[{j¥WoXo¨{ygO|b_`nbt]e§£zobV| ¦[api¦kinWuwTZu¡©d]xY£gg^c¥¤t}ii~v¡Thto¢¢bhdi¤y\X}¡\bv^~wxxx{ut{~uns }y}yuxwuytpvk|~j}{zw { {u}|w wx|s sx ~{{}z t||w y~xz{~zpur~~}|k~{ }xy}}yz}v}{{}w ruuxz z{v}pvyvs|{~y~st{|{{xwy~yz {xu~ ~y}yy~}xvrz{vtm xm{wvt sxp~z{u }~}ww{{vuzx~y xvx~t}o p~pu w{~wvy{}z~yxk}vx}|y{|~ wy~wy}~y{y x}~wy~~zzst|{e|}|m}|r|y}}lj} {ynw{zp{{||}}uzzxx|zz}~wzs~u}zyx} y} mqwTlo`ªclfj q~iZ~¡^jnr£fv[e¬xU\u¦¦~`^vmpaaf{a\w«²aTpkYtbh¡ wm]~¤®u^Unb gc\\§¨mnd[y¦¨oZdyhªp]kartSktª¡ _`}s§dbch£h`[¢wYev¨jclepm^SaWvdllxgd^y§¦vONn{||m{vr z}yklz }||} pxuv}~zyz}wx}wn~ntnvy}y {p|} |~wu}c~vsv}|~~z|y}ur||||vwqwuuaw zuszvxpz{~t{pvt{ur|{v{om zxxvz~|}~ u~n~{{}|u|}ot~~}z {}u|s|xwwuvuynvx|qs{{zvxj~|~}yy} ~|||}phtwyyt ~x|sx v{ plw~t l{ zw{z|qp{wvp||z{|}{ztw}s{|yz o}}}}}|}}xwt|~~{q~sq~}u~ u~u~kwqw}}{{w{xg¢gw\Xy°z]\qkqdhe¦qb`¡§x^buzZejd£nl`j ¬¡__w|¥¦k^oh£otag~¢}[^{q¡d_ahet^ey¢yZZq\icb¢sp]V¥oSyp¤fus`¡§ir`c¢©Z\y¤_netdtm_}raaqz¤[lfk¡upk[|¢¤ZZz¤¡coc{ ovSltyw zz~~~} y { {|q|vyyzxuz}l}{| ozv}|ss}}xl}x{{vzx}x}y{v~~|~s}sy}}|}{}q}}xz}ztyyxz}yzzvy}w~~t}{xxm|x~tu}k {yr|}~zpsz} s{~~w lmseUgade^g¦o`eu¥v eZkn ji_f a[|¥t[mcuoZ vuh\~m¢bhxo¬¢[sj[¢¤ppLV~¡Xkdcnee¡¯¡qwX\{¢Z^va¡fgbi¥}rY`£ªrY]xw¤gcfc®¡xgbTs£ cg|w ijct}¡¢u_V¬iXuo¢ {pah«poy\ ¥[Z_vlmem¬kcK¡± Ukk|¤¥nkpUo|Xcx® US{b zOs_lalx|eVyXjeeZ±vViªvhTxt¨|cr`motsRy{^dlbr`h¥qv_`wz[fo{£nnn`©t}j[}«z`Vyi¥ei`bs`Uk WciddceYsuWg¦¥ X]ld ¢[fJ^ {v{yz}|{`}w~{zyts}q~vy~{|mxp}u|yo~q~j}|yyxz|pnu vz{snxwvu}}|u~~}~}yx{vy~r~ o |v}l~vvzt lw}wg|{ wym|x{| }} sx~~vzys{}pu}|u}~n{}~{vsr~zy~ r] y£ovPX|©°¤_cewspqX«pc_© Gfnq±¦pfd^m\\wx¤¡Y[ji¦ªonmQ£¯y|Yvxu©g]qequ_i¤©zZ]{|« g[tdmp]bª¡}w[\x¤®kaoaj^q^ ªv|Yfh¢¢bfl^¤dtZdpscOvq¢ª¤S]jk ]}lMyq_j~¤^epqjj\^vwyvryv{p~~}|}w}|{zz|u{vu}u{yzvzzxz{}|x~xyyvxtz~xvvyyxcs|u|v|vzzt~vs y~| ztyy~uuxwty~ryzpxww|}|}|k ~wu}u }xv}i{}ssxuv^]mk¤ªrduT©wlZ^z¢¡{P`{d£e]]c¢xi\Q ¡\dqm£bdip¡®xzRWp¢xeUl|fsei®\|`U ¨a`oz¦jymZ£rxhc¥j\sy°^kq\¡©ip[b§¢iVwm¤`njoª~w_\x¨}X`}o¢b`bjpkaX ¡¤f_^ekbl£ psU_y«d[|rr k{ww ~xq{nxwy|sxyv{zo}oztpw{~sl{ {} |yw~{u|u|{{w~qqyu|vxyt|}sppuu{|zttz o||{zw~{~xw~{~ry}vwp {{~p~y}w tqwwuvuyrey|~z||xmvn{z|qu |v~{ |||{ ~}t} uv{xoy~ s|wlt~zx|yyyqq|xzxr} zwz}z{zzwq ytvyztzty~|tutnv}{{to~y~~ t}}y{tx~pt uww~~mow xu~~{uv}oxzyxv~~}x|y{g©\Z{ncpbnerVa ¦µaTiw£hjae¡tjcv¯^bvªUipj ¥qq[[|\^~x¢chinvnla¤xUdn `_lquo\f «u^^}i©¤zf^beghSd}ªv ei{y¤]bf{ul^c ¡wz\f~t¡£ Ubhtmu]cw¡{rc]w ¯clnZ£pXe¢{Jh~o uyzx}zuwxytyx~v|zs|w~vq{t}~y}xvy|{~{|xyjyw~x}w{|~}x|t prq}y {{ |ws | u{tuvuq y}uv}zy|~uwyjpw~s xzotpgnzrzHn²¥lqX{`bqZ¦jnne¨ o\a¥£Sfyj¥`Wt`¡¦~p``or®~O]zq ~pigfppKe¦wn`sqm`ky^`²soZPyk©[ulv¤£tv_Ns¢}]dyy|niqf\i]V¦zyLWhv°\hrl¬¢kt\b·|v\mn¥xajqhwxj¤kFQq¡ke{_ } s}t}n} ~ze w}{xq{yiur{xx{_}yvvvzhvw|~|wz{zx{czwxztoxt ~h~yovy{sur y~l|m|i~~} |u||y~~|itvuu~zuttu~q|v{mz}z¡nv~wv}{zx|zuvou|{}svs ~|swb }z| |}Jdxt¬¡{ZicygRe}LRq¥y_VwbmiSh¬noWrXcUpRomd£|£oYp§aPp\£Zw^b©rZeu ²~Udxk¨nldZ¦yylQzwkdma ©zgil|~~i`q~YmuyrtYZ |¹¥u^]vz³g^mx §uaV° Vxuo«£ dhqU¢g~h^n{__znª[bof¤jiUZ{tm`g\g{_¤lfdT¥{Wbpw´]hvq¥th^b©eb}p¢}Ws^£rxK`¢xtY{ª¥ebo^gmamvq`Z}|H\ie ¡Znhe¡WPz_¥d_oU©h|Yf£¡ yfLym¨ve]ah©zlk[w¡~b^zOedW¡r]{|¤`vy¬bifioukv^ ovzzw {upvm yzy|}teo|l|xnp|qzis ht{vtwzwz ~y|}mxx|vtw}yu{}{y{vz|r{p}t}w|vxy}s|{w~qs{||xy w|tsv|x{|~s|| | |uiq||zyss }{o{zk}}u~w|}|us{ ~yovzzx{wv|}s}~~t|x |wu}v{{ ~ |iyvnvp~t| }{zkz} o}y}}t}p|q}~uyu{}t|vzzzyv~~qu}y| |u|{{w x q{x x |v|vwt yzzhw~z}rzuqy|zz¢jpQ¢zGip²£^R^¢_oZa¦ u[c¤_Yle¦cd`a{u^bp¡^] ¨¤fles©r]Qm|deh{¦¤mpa`©omQgv}dbmk[re¬yrb]x£QdllmWef§~{_^£~_guc¦«gh^ctPdy§£\Xaq«lj`V¢unh^a]w¤Trdb¡qyfV¤n]hl¤idU_§ivX]|©©qU_pm£hfn]¢jwX]z¢^_{iftbY¡¥rk^[~©a`yd¡nk`g{¥trb_z¡][zh¢]iZi¤xVM|¦¨aWkx¡klk`{~}]Z{v¥¢_bpp`wdd¤§puc`birf¡Zibb¤¤y~^cy¢ Xapi«¡gsfvur]]uuµdix}}{cwxsrt}~azu|vt|} p||wy}x~t rw {vzr sxt}p{~~|xrvzupv~yyo zz|w|jwxssw~~t{~ywg~}sn ux{xqzqt|q~~~~~x|yz u} yuy s|{r mcmn¥gucc¨°w}_S{¤^gqw¢bl\[¤plcO| ©_[jb_lgY©sp^d}|¡¥\UpodqjT¡xq[R §xYhf¤pjXk¨¨t}YY£`Sqh¡mj_dtc_`¡kYk}¤lb`htsT}£Vwui¨¢dbjU¢¯mucf«h]tflo^[¬|UW¨Tmiw¡~x|u{ }{{wq~ }|~ztt{~ry}zg|{zv yy{x}r|y ~}}|}~~}xl}}{z} {~{y} vyt|yt }|{{ss{}t||w{pz|uw~ zs sy||w{ {vy~~|z~}yy{w|{xr|¢tba¦¢ R^vl¢¢£Vr`[¡¨xuT\¥|l]~j¨¡}ekd\¯¢rtWhª}a[l¦g]laexas~¥TVn¡|\`M§zp]Yr²®ZOvl^gc` ¨ex`b¥«^]rp\h}_noYZr£cV}§Zmfqvv]c{|®kYyn£¡dfrgurX^~¤`kojm`j©zp]^z{r{~ytx{r ~~~~~||zz|nu{x~uvyru xo uvqx|v~} ~txw~}x|}~{z{|{txvt |}uy{ly~|uvkx}{}n~{~qpxo w{||o~p|xzs}}yrx~xmn}{y|}y|}wz}}|}y}t}vvy|~w{{ oxxxpz{ytww||yo}q~xu} |v}}y {yp~x y|rp|}v ||~yin{w y~zwnfxwq}{wxvxz|y{ z}|~{utu~g~y{{zy}n~ }|}|wy| zwy~{}x~ |~sjoyt`[{t£¸zaJnn¥}me[o££|tgV{r [gn bviYrX\£_gkl¤hoi_«eU\z¢[vxc¦fcq_¥|q^Mw¤¡|T\kX Wq`U¡¥~t^d¤bWpqs`Xd§lLbx £{kqsx§o[lj¨oYmsiWek¦oj\b¨iulW¤jcjr `ce`¦ywcxv|}||szywrx|xs}y|} ~ml{zs}oq|{x j yx }v~|{z~t}|~xz~|z~x~xzyzx|u{~w||qtz| |h|y} ~|yuq{ }~~vpy zkq~u~s~~~{x|~{z~y~x{nxryxqu~{uzmp\|¦¡~xXaru¤¦jYfbpt\f|§ R^we¢aneg´ri\`w d`mt£lXu]¤ mw^T~~\Nvtªfhe_¨¦y|U\ ¦{YRsghpTcª`Sa¦}eYnkTj_ugya[{¢Nfjx£emjnurbZ¬§ [ef¨ghtfqvb^z}W[wm`a`tgh\Qv¤t[[zqgw[uhT\ª²zdkez`ltkªkyn`£©ZVtw§thiY¢zoeS}¡ |vQ\adhhi_ onk_~¢¤|Yb]{Skhe{aY¬~bX}r ¡¡tj`rr{Zb}¡¦{`avm¡j^^b~k~Z` t¤¡`Uejgi`a£uqjYs°|ZXbn¦`utbsybgu|§R_~o£§Xdkc{yvs |t{~lsytx {zv~{}|{}}~~t w}{yuy u|{{ |t~xq|~x~xyj vzszv}~wzwv{l{|}~}{ yfxz~ ~{ zx~ |ts}|{{x{wz ~vxuxyv||u {}zr {v{n nyhp¡pyk]z§vT[r¤¡ hka`¢m~Xa©¨ckizlf[g nvaX¡¦}Qekv iblljzbgwzMXk|aeff¢reV[¢ª_[|o¦lknl xt_f ¥{Uc}~¡dbc\ ¤s~ee}ªT^n©¥ kbis£gvRb£{e^uu]ehu¢mvZX¢zXcm® ZohTs~x|u ~s|u~txp}us}qvvxzwvytzzszxx~|xy}~|uyq~}}}ywux rzwzz|}y yx{wy}w~yvzyk st~~z ~{vs{n{x|t| y{|zn {z}w r}r ztw}veWv¨Wkgc£¤nqmQ¢y|WrumTj^w pa[Q¢©{Zdrz¡_brTire` ¥«qVfp¡£e]po¥puif©|T^nnª¤ `bkn¡gxca¤}cc~u¥ i\wo fjN_§{{m\}¡km\m¨¡ggbU¡²}~]ep¨Ynjb¡¡xycV³~Qbs|¢egw^|im`©TRupot}{t ~yfp~wns{{}||~}zy}}~~q{pm| {{v|zwzy|~ }v{s{ytuz{wywylyz~yvnx |z~vwy}r}x}x}~~v~ mq{{}rvx}{}}myuuu~|~vpq{t} yz|yo~ p|}tt}x}{mw]\\fk£mfau§¥sU[zgjfkpkj_T~ kwa`¨~r_zp[goS®wwHXw¬`_rbojab ª{__}¯_XediffR¦ª}a]uYtvd¢anaI ~Zgm^dt`©¡cf\e§v}_V s¬¤\`xo¨tlXc¦¥r gZx©«}[pk¡dhe^ ¥udh{¨§`}xoy|x}w|vyt}v|tz~w~}}twpxy~~}y}{yry}w}~ | }|x|nr}{v}}}l} |j}yzyw}x{|~|{{q~ vyz}w~mxl{poxztpy}p}}~x}vxwtw~x}vtyyyz~~uwyzumyeg¨ªwaNzt£a`jh£frd`¢¤udf]z|£ \jmp¤fljbx¢tw^S}u¡q\jtdhj_j¤¥oya_n§¨]Y{e£f\c`¢r~cYx¡]hkp§¤fh]b¬nuZ]s }Zggr¦¡nejlntTavª]`qljgf]¬tugb|~«£Zbpi`ji^vhaZ¤¡Wvkn£afiW}}wuzw}~}n}~}~~{~zv~zu}p~t|}|}{s{{} wx| ~ux|yrxvyx|}~}}~mzx~vtlx nyvs~t{}x{vz~| }qzws~}x~w{|}m||}}w pnyfzvw}yyriuusovS[vu§idfb¢p~n^¡u~Muq~£¤gdpq¨{t^i¯q `\tªmaph¡ h{]e¡}ygLv¤aZgo ilg_|RLtt¤^jfd£¢dbg^Z`|¡ª jmzb¥¤klfU´¢uY`~{³¢yWpjj¨ukiZ¨~]d~z¢cdj`inSo¡ w[dr¤ cVljet^[£}uq[xyyvt{{|w{sl}yz x|zwvs}mwzy}~~|opxt|wz} q||ow}r~v }~}|{ xy~~uzu}|yo|qwy|}ls|~|{{y}mm~n~{zv{yx|y{{ }uz zwy}ove hqY^ y«uqVY vcfcvdr^^®uely¢¬Q`oV¥[`kW¨sr\\w´^\vpg[q]¦{vXix³¦hWqª ljjk£tsZe¯¤~ZXxiidhl¨rtX`ª~dXwgb\Ua¤wvWJ¨¨Yao{^r_p¢yg`~¨j^ey¢¢`|iZ¤£up\_¡~Qbov¬¦bx~~vsx|{xyrm~ww}}xy{r}xrwrvz}|rz{|{~ y|yz~nyn}w~{vq{srtx|k}wrly|y{roxzz}p~qyy~|{vzy}t{u~v{{ py~x{y||yy|{ky|~x|}~}usv} zq~ww ~~{zz~~s}} || z~sX©RUwj¬bega¥wshSw `c~l¥ghjb£|q^\}X^tm£vQrhm^b~|¨¨yUfw¯hfhw nwf`¬rO`~qg}hd©`qcR ¥x`Xtgapg¡¢qwcV£¤vQRzy£gtzZemXb§R^es£¡YguWlrUwz£«_]wu«¦ [hqn°osj\ ~qvxyxsvr|{{}kxrz}orup~oto}xr{sy|{ v}}}wy{ }~{{~~|~u} yty|v | ~i{uwzqwnqz~zwu|xo~nyhzz}uy|}~~|vvrz y{wx~ w u~~fxqtzotx|||w{c¡bjyoª¤siQVw¡o}Sav ¤ eRai¡¡dpO_w ¢YZz|§^h_p_q]W}£y~T^ywc^ll ¡X{^P «{iWv¡ansifrahªyxYZ© Yjnh¢¡goha zcgzx£\p{b¢gcMu n{]j~q§][qZX|d]¢usOaycMrk¢kvgd¬ªt}bgo§aloxwv{y~ywrt|}r~r{}wy}z} |v|}yz}r~|xp{ot|}|uq{y}wsnrz~z}|l{ xvz~ux||yw~t~ }||ywst~z|~xyyuzzuy}qxuzulxxzgwwpz ~ypu uyjw}z~yw z||rt}uy~ut~~~ m{s {r|wu||vm{}o~sy}~xr~tx y{{~xw~{yv{~} }|wr|~| q}{wy~~}zv~zvqvqy| u~o~y}z}zp{yvxz~{u ~i}z|rx¢ªurZZ¢Ybvn¤vbjd¥¢s_N^z¨b`o©s^eTip`T ©©KIyrªeigpj{Uao £aTss ohab¦«i[W §tWbzx¥_kmfªqped ~Pfr¬£\iiX¢jogXv[`{¬V_nmb~WT}wlYqw¢Z[]dlp[b¨¦vbgp¤ a_hw¢ou[N µ|reV|¦Qoba ¤`{l^ªze]ww©b^ie¥nf^R¤§~x[^poa`mk¢§prYZ ¦¤k]_{ngjloknlW¦¥xYZ|p¢£bYqh¦¡kwdb§`Vtjibjnzfa jWt[dq`iy`bz ^`po¢bYeZgv]]¢ kdvi igs`¬leV¨£\Xul«¢b^p[¢¤vvTgt²¥P^vj¥¤bbke¡£oyMe uVYsmªhu]h¢kZQ~|£ eZnnpplW¶it_Y¤¬ {o^r~§d`fYrliZ¢¢it~|vxy~|}wy vw{w} uwwz z{}{ ysy }}|yu}m|z~}{x oy{xvr{t}y~zsttx|vww}~}x{zyyixs|s}tyvoz~|x|r~~z~|y}t}wy}~~}v }} op{tz~~~v{{dvfu~yw~xyuxz|uyvtlzz~td{z }|¡}{v~~]{s{l{f|xwu izcqsqn~nex}q~r p`yp|ywxzg}vnf}tzo{~t~qumz|twxn|w qs kwmoy |z{vx }}y{ye|xq{lgzuq|xs w}~k }rwxrqxr xbrpypxvd| } klu xxYsyw~ {}zoyv|tmky~~j~ |{tjkph ¢¡lakXm\^d¨wh{h{© _Qjvj[g{xXmbr^g`¡m}Y`±{|_Wjz£Iapj¤tF\¯¢|zSWm«rjem¬¦ fe^¨wSh{wªgmlgqz^u|£o|Rbvv£_kyh¡¡zw[akf|¢qquc¥pof_¦l[~xscocpoRdu¥§|Ujh©x~ex x}u~~`sx{k}~{~ ~j~quux~xvrvj|jrt~|q~|uilw~~y xfw||azon|pv~zltzvxqs}{| |km}{n}s}y}{{m{x{|x}{wvlx{xa }|}ly}x|}~}~xscuxx~x~h|{d|o~tkku}w{yz |v o }svykz|w|mh~nbzz~{ zp}uxq~}h}y|}{|| ottf~oyvvks~{{{uw~||ztw ~zr}wx z|w}s|v{ ~}n}wtl g|{kux{ms} eY¦yTkir¢ Sob`±{OZu¡[wsy¨hleO¥quY^uc_yp¦«xU[Vf£pziR{¦}Vlp|´_aajr¤k^^}¥ VKq|¤£[jheª¢{vc^££¤|\[xfjei^¤¨xcgX}idtr ¤`cn_ ªkvcX¤rXhzv afZn§fuZp£¦{_Oymª cbdf©skZXª m}yrtuy}{{wyy suvyj}}x| yr w~y}{ z~x{wxy {x~} xy|z~ yzsm~|t tt}yy | uksqz|{|~~{xy~{}zx {~{{~||ru|v|xxzxy{z~~tz}m sxxy|Theaa°{[\us±j_pv¦ªfuYc¤¢_j{§±¡igpi gibg§tomt¬¨a\_w¤aqfb´i~^V|w]^ks¢ nZ|WbnWdn§bWzb¦gimixxTgx~cdun¤ybcL_¡ ugUn{¦R\n{¨il]b¢¥\|`O~¥ ~USwo¤£Odba¡mzpS}afeo_qnd¨w{gX|wª£W\~m ddj]§buWa|¥I]fu¡jbp\¡wqSc¦\`wn¥£dljY³lT] ¥ XTmh^kis¤¡qoW`}o¬¦`_qo«ce^h suRW«_]tm`pfa§yzd^~¬¥an{iSphV¡ icakQ]mdªlkbU ¢onLc|©©[`_¢_a]Lxw]X}¢¥yym{~slyqrt{t}} vxq|yzw {tyy|z {~| |y~}v|zw y{{{} }yt}z~x mvy~x wz f{u~mxq}zp }mwzol}xxn~}}{v~xlxqp~|qwz| xr~r} yy{y~{uywwz| mz{}{yu¥p|`Tx ©¡Xmd¢iua^{¶w{Y[u}¨uU`zq¡©ptkZ¤¡_yVn~y¨ªmW c§fm`n¬y|dd ~¢gYqa¥fj[g±pnae §ianr¤¬av^^«¦r`P |¥^Ro¢£jfbeª£z][~£ªtlVkh ££`l^Z©}jPgw~¢¤`lze£¤igh`¥wwWeu¥Z`on efaU©_y\e~rz yt}okzu{vzq | vz|~~|~z|ys}w~svx{r{{}~{o{y wm{z{ {u{iv{zw~u}vypt~ tqwo }wvwtxuz~~u{}}xzw{o||s }upxhyq}x}z}v~ ksyolg¤|kf`¡§O\trª¡ddap£gxX`}¡zZb|^bffvwc_£ _[~m¢ecfj¤£nq[]ueM~x£¨vgmc¦£jt`b¡§}[[{¤fdpa¥ i_iZ wabno«TinqpoS[£ rMovªe`wljrUfg^g}{¬fRwn¢¡{[va~¦ª}vUzoh^upnym~~t{wtwz|u{~xq wx|xxu } zn{x|w~ps}~xx}sxzy{y}~{x{{~{ ~w~ rs{~vt|r{}~}qo{~s}qz{t|vu||uo|~yuzxs}qx }qvt|z{~x|o}ov|~z}}}|{yv}|t|zxqt }}|y{~w~~x ~|v{qx|u|vv} z}jn|yt|}vlpw}inswttxyxt zpx{zq~ yswn{}}|qzyr ~z~}~yw{~}wn~u w~}v}plw~u}u}y_u{ tba\¦¤bz^f¥ªt~SWtyhsseklib¡®T`nzebs_¡kiaS ¨WW|s¢dbtojm_Ytubs{¨®^hch ¤mkXZv¡}]fqlªa\izªm]d¦£wLP}x¡¤hUcu_k_c¦ª|YQy|¥¦ik^t¡^nfT¬oae£ Ohor YhgayzQawy¤\Zwe|~|rwwxzw}y}lt~v} xw}| zu~~|ru|{z ~uj{ |~||vvtuvrx{~v|~ n~}x|xz|~~k|z zu~~z~{|~~|r v|u~vqy {w~qst}rhw~thz}k{v|{x| |i}~ nx©~k`\¢¢Naro¢¥hbrgjbZ^¤§jU}¤_bdo¦ojdd|¢t\`w gkghªie`]~cPq¦]icY¡ezYV¨ªt\W}{¡dil`¢ ohPa¡³gTs¢Uegfjg`¢}]`v£dXyl§rdgl ¡e]Tvrª ibaijaP\¬xffu«bkpw¡£bldx|~{l wv}}{~zr }}zqyt|}||{~{yx~zy}x~sq|{~| }}qwy{~n|z{{xrxu|y{zo{{|}w~tu swr~x~ywzwv|zy|z r{~| w~~vqp{qwxq~ m~ ~uq|y||ws{{paup¢aeeo¤hqXc ©u~gPw¡¢aflb¡mub_¥©bTzu£{N]ppvrvS}~¦o}Xq{£chgc¬fh[W¡ n|U_tk¦ahdi¢¢cg[U¬wWbt¦c_ui¥¢htKi«§yWgv}gVqp§nnfiw na[nl¤ Venp¡¤fnf\¢ yfi|£¥cUme¤§ezaT|tbaz{¡bbp`¢nce`¥w[e|¡¡mbtdnrbe¨£{\h¡]Zh_¤hn]r¦w~b[yq PaYkmr]l{¦{a\v¢¯cdfi¤¬kwec¦}{_Vznj[ri¦¤op``¬bY{¦¤Zpf`§jmaqs Ucrr° _sej_gf[¬£Qbk¦Z`ti{fdX~¢¤rZLw} f`lk qq]ftzy|~ y ~w{x{ s~{}v p{~}} n x|{~x}}}otwvu{| zxzw|wy {|~{z|~zz{{}y|zt}z |y}rw{{|ysxz~w}wuz~}~{}}~ |u~ vtrz{| }~{zrxsv~~w~|~pm~}w~}}|u~|kl ~w mtkx{{}fttxyows{p {}w~y|z~~w} u{zyy|wwx w}s~x}}}rt}~x{c v{kvw}}zv v|~{ ryztz}t ~oux|zrwx{s|zzyxy~z|u uz{ts~y|ssU_lu£gcg]¦}}R\v£c`ni£¡kcXb«lyQ[}¨jazm_ke_¥j_T¢b_jrbucc§orbU{ zj_gn ezh]¨kvJco{ ]Rjf¡ ffqc£s^]£}Y_vp m]mZ¨xt_^v¨ Yeoq¥ hih`¨¦u[Vy¬bRofhjai¤x_a ¢¥v\Pkk_UnSinbWy¡©cfjj¤bgpl«qtcR~¨X^nn¢glfd¥~{Va{¢Seyj³¡rqktst``t]Yofµ¡ kmS`©¢x}aZ}¦¡u_ypahddt¢¢pxW`~w|cUm_£Ye_^¥pO[y¤R_sg coe`¡®~]_xs¤Vfgm¤¡mooS®ytVVt ª¨a]|g¤¡ «ye^Z¤bx vwooyxuzq {~zv~ qwtz jpzkz{ywy}| z|m{t~}qp~ytuvy{}lpi{{|ukzv||vzrhz~} }zzx ~uxozr|{z}~}~m}vvzr}~{{qu ||h {}{y|r }lpuvur}}x ||zv|wZjg[®qw]O§¨ Yc{ofam^©rp]`¨Xcrh¡igi^wv_s{ª£e\|o¦iap_¡©uyeWs±ucXzjgwgi¢m~T^¡h^sk£fda^¢jw`f«} [\tr¤bda_ §bydY¢TSsh§Z^^c£ ~i[c§\cur¨ecrd¢¤|sYU Ue~i ©£fRh{yz{~{ks}uwut}~{~zw}xv~x|qw|~vr{s{~ urxxvz|uv}vy~kr~ |u|~~~|}s ~}|}ux{xqv y~}|z { st}vzyzxo wyz|t {z|~|~qw~u}wznysxyw~}zt}qpw~vkw}x{n}vysea}¥Ymxrª¦bmomhuYe·}aZxo£§lbue£srbOr£dYzraYch«rwVT zz~]^kxV|\k¡¦jx]R¡©~Yht|££hslX¢¤{skX¡`f{f¢aglm¤nfPTxwuNX|m]vTb qYR|££|\`ry¯ª[jkmª|lYU¥~r\Vww hhld¦g|eW¦|~w|xvxu{~}}{xxmyw {yz{~n}kurw{y |y} |z~tyx}~uru}u} t~w||tz ~n ~|w~zv} |yu|opy ~nu|w{y~~vvp~{|}}y{zzy|~~{sx{sy} y |}w}s{w}z}~uw}|z}|zv{ypvt}u|~n~|xv{ yzsxx{z~nvxx~z}z|{{|{qz|uxz~syy|| x t{utvywwz~xvtx{y|}{wq}v q}}x o|x}uxvw|zuztw o}ymxuv mrw{uqzww}uhY°¥l`Ypicnk¥ £aWXª~y[S}}£`dpn¢ lm^Z¨{|R^m¢Wgua¢jcXa¡¦z}W^uk¨nYil¡lbRg¢~z`gyx§jarh¡¤iogZ¢y}YTw{ Zahiko`]¥©~f^w¦¤b\wd¢mygg¤{sdkz¡Z`mnjlaV«w^^{±¢NZwi¤¥taZ_t}~x~~ yyzz ruzyz|{~}w~|s{x}|} w}zp ~}}{~uwzzyxwt}{u} ~}yw{v}{z{z~wqy}sz }xt}x |~{y|~yh}qwzw~t~{}}uqp{}x}toyjx wxzr yr wuxotcbyi® ijzbwle^ ¦W_~u°¢{_ob¥\pck{¡¥n^^zl^d\u`v^d§´uSV{¢^bge£bu_u¥¦z^a~s¦dawi¤¬flYzg]g]Yp_ gcZazt]`}q~hntbrjag}¥~{VXwi§i^mn\yh\©§|weX}¤¡jlXq£_jh[¯xZdqy¤bcll£¦bv`c§vl`\w¡©l[l_¢«km`\¦~xVcqu¡Wap]¤¥pbhk\Yng[{c¡kq\l¥wmVm¤ _caxtli`{zV[sp³kfle¨oheb¡®qYUtx¤jlkj©dw^b¢xYYui£Zfle ¦yj_X ~}\^zs¨dig^¢gl^V£¢Z`us¡hhviy ~~yy}v|ix }sx|~v}~yzyzu}|twzvny|zx~uzf|||} |~ztzxw zyy~uwv|| y zux~oxo}x ~~sz|~~{{u{yuvtxwzhttv}~pr|m~n ~vz~~{}}}}|u}q|¦ayfdªw{QR{¦¨ ]cndfuY ¢u|`]}¤±V\s^T]]`¥xWn¦ aetW£goqq~«rmRaXUu`£jpcg¡wx\a{ fSox¡fg_ef{^I g\hx¥Xk`d¡hj`\t¤¥h\fm¢`kYijm`^qx¤£^V«gqmN¨¦rwZ_v¬¦k[^zjsSflp}x}w| |~uyr ~ u{zo}y~}}su~w}nzx{{ip~{zz}v|~|ey~n~} wzy|h| r~~vp~z}}x}u|ut||~xtw|xt{yv~ |zz~|{ym|}wv~ydv|}ul|w}|}w}lzz`mu£XZwd®qix^ p{`eo| S]fciu`q¥ x ]pu¤hhvy¡¥¥d`da² ~zec~§°|_Xxjnafd}¢¬rzdcq¥}ebqh¯hhaZ¨f\V}}¦«Pcmp¡ ¦ilrZ©¬pTX ¨j]xl£ndk` }xXV{±ªYawhsbP_¢j{\Rn¦¢r_hl¡nTi\f{Vj¦ g{|z|s}{~z{trvtz xz~~}x{m{w{}z~~{vy|}o{~r ~{{yy{~tvx}wv{zv~}y }|}z}xy|yy |tzq}~r|}}w} {izxy~x u~| wv|z}ywt||z}q|x~{t |}||omjpfrc_¢sb\p¬¡cgln]jdX¡{gR{£«dYrgjbnT¡nxlP ²¦\bm_nfgj sbY|¦®Z[ph¤dbbe¢xqUe¤h\tb¢hkak©¢m XS¤ª}_`mwnqaj¢zb^a^sq^v\_rsfTy¥Wbtenkl^¥|N\£`Yjl¦y~i~}{|~wzuyy{ u~¤vw~uvz |n|y}zyuz~do}xzomwuy{sv}~~ssy xvsnz_yzu pvly w|uumny{{w{{zpw|y}rvyvwx}ryz r vxqmqqorr|v{}~yu~{q}vjzvzn~~ec}¡kheW|°©u{e\ytdprz£n`h ¡r{Zi¡¢{YhS|pmT]º¥tZg}cYmf tnj[ ¡tZgw§¨admw¡qwdgteiXipn¦dvm]«¥~[Xwo¥·~Z^tx¦ukwc¨{sid abpX¨¢iobnpvYZ}³tTstfhTe¢¥ltRbª£zTjw|¡n{doxr~}{erq}sw{y q| q ov {rv| {qp{w}s ydys|rxo}o{~~^f}z{}zy{ |}q{w wlxzy z{{os~~l}pvyxuvh|tttl ~i uvwyu|xwmp~ ~xrx}ynznr|z{nnx||p vsox~{{kxmxWn~§¢Q[v~¥e`ei{fz[h£~bOpmdqgh¢juaU ¶ wYYu a~fkgv]¤\Qygj`nj©qf^`¦bcup£mkj ¡o`bZ~ª\Z|_¨hbpf £bq^h¥}jYt¡dgZl¢ahjnmqYy©`Un¡pqiW}}d`q]ª^mtr¤§i^[ ¯z~|yru{Rw~xp{ vyywy |suzl||s{zxu{|oz|}tlwxzo}|~uz tx v{tu~{x~joj} tq~r{ }mv|q}~~xyowm }st n~szw {{z}wz~| ~{{s{} zz{{|zz~~ww|sheov¢hkjX£¥~oeX~|¨^Ugj¥use[£ {Ta ^_d rj`X¯pWcy¤vU[zmg``^p~\^vb\nh¡rmh^¤mvUX ª Z^jv¤£otb_¡z{Vaz aYek ZfjhqXezxy`Wuejcj¡§vihW{¨ZWu[ fgcfyx`Xu£^Yqdtp{~}yuuu|y~|y ~ ~z~ |}w{s}p~ xz}o|}}py~ {xv{sjto}y{~x}syszrt}y|wy}|q{k|yn vz{vx~xt|zyzsxzwv|}}x}rn| wzumzm{y}|ry{t{yjluzx| |q{h|}vvyujw~z{pO{avZj²k{\bz©ccq{¤¢fsek mqih}«x]`qvnaff¡txch{¦£Y[i]¦_mda©nlYfu j\np¨¦gyg`|lXn¤£u d`i° iecee|eZ~¡ TPsp Y_v`{n]Tx¢ªcYloeiZg¡lr^a ¥x\[uq£XgheqtbX{X_kp§[rs ~syw|u~x{wp{rzy~} mxywu }}q xx}w z { vytys|x}}} ~ywy|yvs|v qv|y| ux}yx}pqp~xwyy|~w||~~j {~z{u y{tuyzzn|~| ~z}zywr r}}}}~~{}|y{~}zvVn{¬Lfku¦fmbSnt\j[kjfekM¡pmYaz®qbfsgge_e£¤\i¬¢enqu¢ flee¤u_[r£d]mpcc\g¢i~e]~|¥ZRz¥io[a vzmd£¨[eiqhef^vx`bz©rcpcbja\¤vthh} U[il´j^ma§¯wc\§ }~ { ~{w{yy} | p}}| ||qut|{y}wr t~ {zy~tyv y} yz{vs|~||y|xyv|~zu{{{ytu|yv{{}zzq~|{w| z{z}y}n|vz}xty{x~xwvt{}yw}vy ~w|}x~~z{k||}zny uyx y{u}t}}wz{{~x~xwzvv{~|y| y|~u~} z| |ymxwyz~u}~|tz}|py{s{vvqnz~|}us}xz}~}} |}tx|vo|y{ | m|v~|y{ |n~|o^ohya]zy«XXns£¡Xq{d¢s|]Uy¡Zeso `cZa¥xs_l~ clyecfh^¥~uSfx¬[^ui¨£\idª¥snSS ~¤xVdkr£§j\n[¢nw]_{©©i`p¤ªicbd¤¡w}ZS£¦O^np bbWe¨su`]¡cfts_em_xt]`^arodhjYeqX]y®||eWr§bdoV snS_©«e`{g¥^diX¢¢uqO\ª ]az| dmbo©rwaNz¥}`Yvk bjbl¡§xrjNv¦ ddlv¢¦c]rf©fueZ¡©X_jtXbi\¤¦~lbR¬ YZtprgck¤k\_~© u``\h¡§rSdQ¥rVf®£d[yiddcdªjVa£¤]Ssz¡ Vrg]¢¤nz_¢xeT^h¥^hgg zzhXv¤_hysgklb¤j_\x £\fnl£roed¡¦w~Vc|¯T^vpindd nZO|~r{~~|ypzs}}}yq{{} rmw~v{}zv}}zuv}|vy||wx~|u|~xqtmzow}k wsy|}wtnyy~}r}~ttq|}rzs~~ ~x{|wzy|v| }|}} }|}v{z|yt~yx~jy|{}u~}xy}xz t{m{tzp}q}wyzx{xztm{{z} ||w}}{|~y|u~~{zv}pxw{zyuqtw}{x{u{~u}w w}ztw|yo}}{zo rzn |~su}wso ~~}w~vnz} u}g| ~ vwn|y xrz}~~{z}zvw}{~}} ~w|xvy{y}{uxzx||wv zx{yztzir~}x}zvz}x|xy} }z{v|}s}~}}}svy~sXR}z¡MXnk^mbb rkWczª{Wilv¤h\fd¤w|Zh®|]c|p¤¢hbhe¢pzbU¤e]r_¬cqosqn`b}sQNwm¢ZhPevsaK³}Yoxt[mdk££nt\_q¥`di¬f[oh ¦£xnj`®o`e|k¤cZyf zu`Rm¤tYY oaihfsWg yxtry}z{~v}~szyyx|x y}y||oqz~{|z }yw{q~ }u}vw}w }|xv|y}z~}zz{y{ ~v w|ynp~{wy}wuy|}|~~}w~s~~ut p~{|w{ ~|}|xt|~ | }z~|r|xz}|p w{pyvyvshtuxy|{|{} zq{u~wwvy {}~zu{yuzzzwz~~xx| |ys}wyy}}~uwu} s|~x|}zy{~r{}vr{~yzw|y~||~z|o|{z~twwz|xouyxt}wq{|u{ {| zx{w}z{x~ z{£yiY`cekuetg_¢r|Y\{²¨]\|r ¬opV^ ¤fqX\| ^lct\k\p©m{edz£Wimp£efa\ry\]®¦XUvo¢u_]k£s{b`}£}d[~j¡ gabhmxZ] ³_\wv¡¨£hcee¤msS_ gPqp¥ gehf¡k}ad ¥¢`W|r¢bfl]©xdx}xwqvy}}{z~~v{{{||}~wyyt}}~yzx|t~{}jm~vz{szv ~t|z}ty|}x{uwzxzr}tz~tsrnx{~|} |}wxyqx~yt}u|{ry}tr}zvxyr wyy{{~spxxr}~y|s}~t\i ^p{p¯¡^l`Sxg_w¬p]oX¢blZb¥£yZSwv ¬}`Xpl¡cq[l¡V\zv«bbre¤bq^j¢¢{cck «c\ow¬jpb]wzl`o§^djo¨bih\«st[Wuq£¨Y^kr¤fwgcvzX`r¤Pbsh £liu^ mYXst£S_sw nfa^¤}|Y\ x¢£dXqmnimd}q hUz§xbY^o]yja¨mqdds[[dk¦fkXd¢¯uzY\|~ Yekmoh\[ ¢ yyVfz|£ YZ{dif\\¡p]Q~s¨SZig¢nqRe¨¡|]Z~}¡§f[og[l^a¢v~hToa]pnqwcdªxzgd| ®][sn eoee ¬sdZ}¦£d]go`pdZ~ ~~}~}uxz{| {{ sxwv~{| yx|wz u{rv}}}}t}{t }}}w jv|zu {~xx|lz|~q{ s|~kypj|u~wtz~}h~lz}{w|p}wws}{kx |pz¡r~ wvjxynr {sso{zyu}mb|}ª¤sYfvi¡nlih¬nYXw{¤¥]krerfi` ¡vdey¦¡_ciuco^j¥ª{}i[{·b`nobldZ¢¢iu^O{{Uhqo§^a`S©u]Z{yªUbtpegad¯~z_[ |«`YirnumY iXtz©`Vfy¦dgdUmyX[¤ SaxhfpWq¢sy]dxu zyz~}xyw|q{ }{~x }ssy} z }r{~}{{qt}zx|}y||rz|x{ s|{xpz~w|w}wv{|st~}~z~v{zxutr~{{oy{sywlvxwqtz||qszz y|}| swotz zyz}t}xq rq{v~zo~l©jxer¦|~ZY ¤zaWxz§«¤ ddg` g\ZS« {loVzbZQQx gmiYy£u[Tim¨Llcn©wf^TyvJhuq¨qkzl¤uykby¡ }oj~¸_Wgjug^Xw£ sMMsgtijuoiv[Jz¢{eardfdgc¦ yqaT©~LWx} bRZn³cvO]¦¦]pfsfbjd£ s~z u~}vz{s rzyiu{~toxv}wz vyzy}~ rr|x~s{yovqp~{xmxrvu}}o~}~x~{~x uv~|{ rwzx }sgz ~~}~qyut{yzwp~{svt|~q~s{|vy }c}s}~ly~{}~uxzxw{ru{x}ytu}s yvkzzmws{yw z {} }yzy{|}upuyvxnxyq|| vul|sqxzys}wrwy xqyzx{|}w|vzvzx| w{}|zz}x suwttz x{q ~{wx|ztxtr|zkx{km¢g`pf§ioY]«¢uTPp¨iarzthRi ¢uY\x£aijpkuZiª vzYZ o±£ OWhedlZ] yw^`}¢Yhdq«lbeo¢¢x\_{w£Lism `Ri]¦ Qc²§ZVtk§gae\ ©cu_it[lu j^lby Y_ {¤\Who§ctqf¦txaWs£ `ooy|{t{ zzy {z~m|x{}~{wuts|~yyzhp| xg zx|yxr} tv| u{uuym|o{~tzyt|}wwm|wy ~u~{nz~}||sx}z |yx|}zsn}t} j} tr}qs|{¡n {}rz}kn|}~v{zso {yxe |vb§¡jbdv¨hVsw£fWhc¤¡{vlVz«[`y£~UYll¤§vydVx£|[hoyz]qpg¢¬ricZ¤zH`tf¥£gSh£pxXP¤[eyk__p` oy_b ¢_Ptj¨¢\pbjbgf\¬]\xv¡¬rac]¦jo_`z¬xgUvw¢¢t]o]m«ckZ`~]cyrª¡X|osxfy{nw}}mrt|u} jf~}ir{}|{qoqyv}y~~y{u uu~| {v}| g{ }tuswy |s|vorpvzx |csuz|oqyw~~yxtttt|zx~|yr}y{|zzs~~~k~{tr~}}ywyv} w{ | }`{|zzwkr }«URr~£kNia¦vufXtwwRahz¤ª`jvZ ®lljW¤ zt[exq©b`x\dc\c|uaYwhfUfgrsXSw¨¬hb^w}¨©¡ihYl§^u[W¨xpsbt£¢^Wdmbr[L¤¦u}g[ty¦\fs_n\TyUctp¡Qfzm¨opl_ ¬yWVws¢£eWpl¦lxia©¢y|ZW}}µoibt¢wi]p¥xhMwªVid¡\oXbvx{`U|l£¨¢d^cg¥Vv_Y~x\m~sZrlbª¡tsq^{aX{p«`eo\ ¦¢ln\R ±¬ VWzs§¢gamimc``£uYKw¥f_ig p|U\½n_N~¢Mloa d\_Y£}~]jpyWbf¥lmd[¥® zXbvo¤Uec_¢[t}{}{zx|t}mrvw~sm~t{ ~x|xvx~}szx~sut{{yv~}||xzzzwv|z~}}{ w|x{vz}quxegwn~zxv oz{|}}xkl{xx|wl{{zpytsyp~puq w|x~~ x} s f jq~epv~~ svtzw|} o|z}`oxxxp{ {zpwil~tyz{p ~v{} | yw}}{ju~vvzmj rxz}o{ zyzy ~j~yyztzwgx|{~o xttt|zytztuxr~}|z}z{t}~|s y{~syaj°¢aMpy`\qd§¥yowh£z^Xvu©¨¢dsra£gie]x`gib_wadaj\©oyTW{²¤¢jlum¢itSY²{}gSu¡Ud`rnXd|§lWUy ®Wavut[l]¤|f]r¬Wwpk¡¨ihch¥~v[[§`flW¢fg\a sx^[¡ zalfmXg`§ssYb~¢ W[`k¥¨i`fa« wbX§¤fj|fgr_\¤ik_£jethm`\Z«t~_[ov§Vrlm¦¢aifP£t\[w|¡bi{h¤hjcY£{bh~y¬Pbvroc]i£{z\^wc¤e_qb¢£frca ®}u^Wu}_KkpdrZn¤¥¥w}_P¡¯ddcg¦wn`gsqZ{vcjq{|pt |swxn|{y~ypxz}{u vi w}|{xfizzv|q{|~my~suhx} }{vw~rv|ryztfu}zdusw{xxot^}{w {|zp q{y|rmxs_}w~oqu}hwszzyy}w w {n|xu|yzrvY}bhlx klhf|¥qSo~z bwv~¨jN¨§tcI¤{xycj}zkqk]¢uhyqx¨[Rzb£pflh ªmye_«« g_qfxlb^¡¢{ZRv `Xpb`d]|~ybYi©¦¢\Wvo£¨qv[]s¡§q~bPx¢Y\mkpcW¥ip_Ps«¡`ZeX inhY¢Vh~«²lt}vnms}yys} |x}zrw {xv{r} |v|}ut}yy{yvi}~xl|{zst}||ty}ww|nf||u{\q}w} | {~~ntr{xnix{|{x}{ozs~}p}|lj|u p}~vwnvw}sjp wx}{}p~ev}ageRuªljaesf^hw}¡©lcgg¢yucTx{Nnu±¢mgnWuhmn° [Osf¤}^ku¢¢jr`^rafWw vr]lw¢oqxT¨[dr²gfekw©qv`W«uxVgrtyRvr dzppª§}y_]n¡^hiY§qlc[©xP_} dpam¦cq[Zru^WpV[cuwvljgy{r~|g}} wouorh ~o||vy}}pyx|~~usvv|wv}x {}}|~~ksx}z}~|f| t||xty ~|}|tqpob~z~~gxstsX q~|tu|{}}t {ayptwixito{u myhqxw~vftztm}tt}}l} z~u ~{}{~q~t~uo}yy~|~y||ijxrtuip}nlkxzwdp}i}o~~u ~vxsxu~q~ypw{{wx t}|}}t~}{~~}ysyvsy|}{}{xp|~k|~z{q{lsx{u|}}rnpw}|s{z~qa«f^eofmUe o_M ¢§dcpq§aukiuv]Q¢I]sy\egfu`d}¦¢`[px¨\lVb£tu`sv¬ zbb~s¥§ z\fh~lU[¥«QUn£®gXo]§npXY¨§~r[Su}¡aopl£©mu`Mr~¬aNqp_eafyn[_| oR^oy¥ª\saz}fRw¦¨|aglwznx y~{t}~v}xts|t}}y{y|zz|t }}yzw|o ~uy|}{yy{qr{|~vopxsxp|x|q~oywotzzoxyuzw|~z}vn~ o~v|u xy}xlp| et}}|y~x}w~rju{ym~vw~un}wyyjol}¤¤U_jn«cNic§ko[i«YVn|¥ghgawxZh¥ªz`W{ ^o^a¬vkdS [`r~¯¢\j\f¤¡wi`Z©bZq¦`c]\dn[¡|UZ§gce`¢ j`i_¢¢xuTVu¬eh~s¨lxWb¨ª~ihyw`aai§htcbz¢`Kusª\Yic¡¢^hXd ¨ y]`mkjbkWdg\Q®°rPaj¦]kge¢«~ccP}Qk p§¦Tvazwi]Z|§y`^}u¨k_knht_^{mYWxx¯veai¤svc[°o~fVxWfuc¬¢jL[v¤¢vX_w ¢x\em^«yp]¡¢W|r¤j_kr~¡mdf]¸¦\^|¥~`koc§«pUgbdrgc_b¤~u~z~~oz{}zrun|{zwz{ov~y of~rpu}~~t}zpz}~junz|o{~x~~x{v}xp{v|y}u~{n}tuv~w{|rozy|{zmxsu}j}~zxy{rv}q~{~zpm}z~{~u ~|| }xq{ x|| }~szljhWz¥ytZYy¦{fctl©Vm`c}yMcy«¢~N`t_k\Zm ·o`Sq©~Zg|m¥ ygje§ ss_R} kf_ux¡ca]e¡t_lv£§faj_¶hqkb« uw`b¢¦e`us¡[s`[ ~bck© Niql¤hcm]©£xt]_}¦Zbyy¡£mma^£ju_f cZyb jqb|~}~lxz|~u{mxs{xy|pztrz{x}|~}y}v{|vw~y ~{w~onyz~ro|zwly{~zxvw r u}x{zjzmk}~~kx||vusxuz~}u}~}p~xpysp|x|x{ww z}}k~~zw wp|xxs~~xuyig¦vy_\{w¨[dug¥fmT]£xRs¡ªaLrncmeRªn}fY~ §¥hflkkhWS¨qoZ_~rªXapdfho\ªpz_^¤W\{k«ea]`«~vZUy}£]r{g£hjhk£pY\n zcept¨£dgai§ss`Vvp gbs£in]u ¦vsXK~k`cec¤¥`el[{wmsn~} ssv|} ~ u~zppu~r~}~}o|wvzuu}t||wznzz}z |su{xrstpgxz~}xs~ ~zy}|{}ut{x||zv~ {yxvxvy{{ z}}wyvz{u vs}ovst}{}{i|wvz{xz~{ {}}|{s}~|xupZcmpYqkl x}]V|¡¨earj£e`ea¨ z]_~¥Nevo«¢rznxuwI[¯¤`Prn¸ecul¬s}\\}¨bUm ¤[fjo£¥zyZhw ¢gVvp`jbf¢¢yq[X§¤\ivu¤ [lo`£©i{ZW~]jq Tnku wla[rZ`us«¡d`e^«ugT^¦vM^{wwxys}vwo~~}y u}u} yy }|r|~{{xs}yw|}~} yxztz{}wrzx~~y~z{}vx}vxxwryvqz{p|~{y{} xvzor~}~pyyrr{zupytx{{|x}yp{}|vn}s||o~¡ hwRZw«§a[t¯£jOkp««®lg]|¡¢whWs£ VYcklykWu`Xrhqke¥axY_¦|T_r¤]jk`p~jn¥§a]xs©Ubl\¦gdbX|©¡\Wwo¤W]o[mhSW|¢£zRYnt£¦Znp^moRr ¢§}W^{n¤ª¤jfsi ¥£dua[¯ybZxlgf]d¡££m|m}zx}z{yyppzw|er~|s||mwx}s|p }xo y|||rv {n ~yv{v~ wyy{y{{~ ~ prt{wrs~n ty w}ut}~x||zzzy ywp{{pv{yrg|x|}{zryr~}}||v}y{}tyrxw~x} xv} mZW¤bVu ¢Dhgh¡m{SX xyRidy Y[nk kidV¬{r^_rª©l`lkmbc¥^]}¦R^ufeo[y pU[g¦ cpdty«joRc©qbY t¡£U_ma¦fhcW §z|eR{uW`ikcsgT¤ª{yXVyy ©\ckp£nvdXmiR{s£zNZvjjcY\y¢}t mr~}omwz|{sh~~yn{vy }zxttz~zx~~tzx}tmy}u}{zz}z~{}~y~txx~{ryy||x uqxu~|utvl|q~yr~s o| ~{wu{~| ywy{x}|{|{{x yxtv}|rv ~vpy{twx~dgvvqo~ {}¤ pd|p£¥mig§vvYKu¨{Zbh¬tjaY¢§·rnZfxµgN`~i®a\\i§ qthe}{cTsv¥]udd¥rwjVs¥}Zfhz ¦dln_·zZ\¬©shY z]fhg©iu\b {Rdyu£X_ce £pq]^·¡wVZzw¤|]fmnª¤trYS §§ YE~u¦gen^³fr[[¨}[^n}{ztzx{tw{nyr}zv{xx~{}|xkzxwr{~v}s~t~xz|iuwwz}puwx~}rovs||uxr{q{v}|l|{wqywztvxy|{ryv{ x~q{wp sx{z vsuy}{yrlz|x~~qus}yxvur|}|}v}oyt}{ |}uvVg©hf^v¤abhuge_`¤i[Ts\[px ¡fq]g¨²nr`Zz{¡£Bamn©j`|Y¥°|r^_ ]fdl`gcd¶x~Zau«[_mp¢¨tell£vkW^[^|o¤¥efad¡¥oxec k¨¡aVxg£\c`gfmNP§®zT]i ihfR£¡p~_^w¬¡ Wbly¥Rwtb«xqx s|x|uuz~|~yw~||sx{ uw|~{rwy~~u~wzu}¡||ws{rk{zw||z{ v|wu{}{xu}wz~vy qywyx|vzu~u~s}z wxt~ {zsw~y{{|rpe~t{aryyuzvy}xpx~w lj|ywx_Vhz¥jobn ¡~yZ[ ¬xhVyo¨¢gqo[¬jma¨¢z`auo£]uqrt{U^x¤¦Ycm}ghgZ©tai~ °~UOkp__bc£¤ts^Y\Rssckbl¢eqX^¡~ X^ys¢ejei¡¥qq^_|¤bMnx¤_dik§ow_a»Oboz^ma[¡nsl]~¦¢_]so|sz~}uu~w }{}yx~wr r{q wzsxzu pyr~r~v{vhy~}sj{w z{|vy|{w}y ~~}{}v}~yz}}|{oww{zwv~}x y|w ~wr~||w~z }}yy |tyzyq}yy}}x}~vvt{r||rpyz{y~ g~~{{y~}}vsn~oz}y ywz}}yzz|u{~{~vs~s{w|xwu~{{j{{r}w|~w|{|xw}pzw~| z~u y }t} svny{}rq~zx{{~xr~wxwy~z|t}ztux ~vy}x~~|r\sxw©fW[e¡lzX_££n YVpjkdiigq]Zy£bUxshga^hiZW¥¨|lY~f_phb§±¥roc`©aVqt£¤oopd¢¬mlaV ¥¢zRft´a`n`qidcYZ|x²djhf§¬{mWb¨{yS_x{ ¦^Ok^kp`u ¢¡~a\¨^ace£¡¤oq^`ªwuf\o|«Uiee¨ craY¤ `i£ \cjd¢tbc^Zazl¢bhkc urP] ²_dl¥£jiflftfg¤m`Xx³dflp¨wseXnt\_un\r]s¡q|c` ¡z{ce} b`gk©jt_] [_vs¥hhm`¯mo_c¤¡v}Q\xw iksc¤¤ntZd±Pezl£efeh¬x[^~ ¡´cOo§|boV¥nyjfj ~\Xwi £eh_i¡¦¢g^]y£~WdndhjZ¦h|hW¤£ _c|`]gsh¥rsU^{ªUh}o¢¤§Zjr zzzzzyxu~~v }xy{rr|z~nh~{{q~|tzyq}zp}}zy yt{~zvt}~yqw|g{vv|x}y}|l}z{ j }x~{x~{zy}yut}~}jxztl{y~~ t}xyyymn}|r~zs|w}u~y{sz{~ zy~~ x}~{ xr||yq|{}z}}|}{|t|zz~ txy|ztvz{~ t }x zx~q}rwz}}z}{{ {y}|~vw{|uuyy{zq y zzxr~|| z~q|q~{ {w|}zv}}{~z~xu{yz}x|}p}{|{}v r{~v~ zzmz yyqrz }}|}t{u}~ xzwn}yxw~{r|xy~|y |{tj|||svwy|¢ eefhq|_iq}¢`_ksTgg_¡¤{za[¡wigkiTrhb¢|hh }¤£ZVye¢]cq_§uo\c}¦x ^ck]^ld¥jrRR¢~`\ygbdiX}¡£jv[\¢|eZptnZna¦bsbF §«Ygwu¡Y`bi¤xu[R|£¢[errfmmd¡mr`[y¤|Odtk¤fbv}{x|uw }os~|}}z}|{|vtyu}}z uy{w{}x}{~| z} vz{ y|p{s u ~vw}u~tw~l}otu|v{~zz{zl||~um}z~x~q~jy|yy}z~t|y~y{ {{ }wvx}|{ xzr|}zy|r vvy}wvnq}q{{ izt{wz|}xl}{p~vx xu| x||w~ yrzjpwq o uzvyx|rvz{{xw }~xyt}~}{ ytuwu}v|l~{wvk~||vtv~{ui|{{{{q~~{p~qqy t|qib{v¢[aykjk^a¤z}Wb}¦ b^nesk^j§¡vyQX~~bVav¡amej£mdV®Z_ll¦lbqi¹weU}ª¡RYri¤mk^b£vmaU¡`dtg¢¨cnnhs~Uhu°}lVys¨¢cbdd ¦s^X¢£iavx^jgh¦¨fzaM§§|u`Qq§gloU¤tt]`uuvy{{sx|~}ty~zdwt~|} zws }p {ysvvxyz{xzs}kqz ytw xy {wy}szw }p~y}mr~ rnsrwtuyx{|vzvwx~xuu~kx{yxyyxtyrk}~~|}yvz|zz~~y zr{ ~wy~}pzomXX©¥o{RTx¢O`nx¦cim_£«ny[Z{¢aguk¥ahhaos\eu«Ucq[¤agm]ªuVft¨~a]vi ge[_¥vw\Xs²¨`Wmp¤cnXdl{\Ww«©u_\xp¤coll ¦nxh?§}Z[sf¢kifawrl^N £[atp¡lcn]jpZV ¡Wfptlrj]ux``¥¥z Zaskfdanz[bw¦eXol ¤oy[c¢ipX_s®cT{c^hd_ªiqbezbYinqed^¥mhZW{ T^vs¡j`nZ¤utUgwª`Q~_ pfh_u\` ª]Tqhgrgo¢|S^{¦§ Valgc`a¡unWax¥gWwmci^]¥¦rca¡¨mox|~ux|v{s|z ~z~vy|v}wt|~{z|ys}xw|zuvyxz~{vti { ~zu~z~w}u{~{~ r||ww}}zwxhc}zwzz|v~ z ~v|~|z{vxvmvkzg s~w{ywzsyzuwtu{hm{y~}}{| v}spz|^^ «³rhd llfx¤zp\g£ ~a^pm¤otlb¦u`Zz¡[lej§chcf¨jz__§£Yp{p_m]q¦to_q]g|u¨hxZb£ wbWx£u`lasnad|¦pyZe ¦sd_nh©Ykni§¢sa¡§w^by_nZlmfbwyeaj{Yt\a£m~XJx vq~p{|x yqx x|~{yrpy|}{xsxpsz x\|}jjyw zdf|}u| yx~z ~v~~vv{{{oz|s{{e|}{yv{iv~uh|~{|uh|{{jumm}|~p}~z~fe|zx_eo~tuyp||xwa~~{u|p~{x zswcn_dg[`TSn~{¥dleVyaoU±\sqn£ZlfQªsypZ yYetm¥¨¢L_jbetFj luudd]«°dvkh¬±Ua{w©Oa^q¢¡mx^~wVZo~©^n`o¡qySWyldc\s|[ff^¨£§rpkX §¢abwx¦sXkfdt|p~£}ck`t¥annz~]oxp}px}|tlw|vv{ws~rwowz}vs|{zn {zg ssvz pl~}v|w{y q}vy_mwz} x vxjzz|xw}f}}t~s}|l{}vz|sut {~qi{u j|v{|}pr{vu|yzzpx}{~}fqlu{z~}y}|wwvq|v|xyy} |v`|nxqtwzvp~c{ xu}v¡y{u~p~rt|~tc }xz~w¥pm}~~l~h sxz {vo|}~wvt} ~ }} yyqp}pd¡£m`sddo\Z £`ar ¡f^nh¡nx]d¬ z\VthXkh§ms_]£vUQmu£¥lgflapaZ¢{}_Xuzeedbim\Z¦¨~yY_v~²¥`^riskbc¢©y{Wav£¨ddlt¤¢hs[kªWm ¨¥thdh¥hlLe©w_ors¡njfQ¡ef``pkU £v|tw|sw~zw{zuz||ys|y~v |z|urvxxxyx} {z~ z~r}|~ztsixoxoqswp~roybyry}tuky||u~{~zy}xy}}~}}yz} w~s wrv}x{}nmquyvtwx~|}|~}~wy }_czj\|zl`f`©nhdR¨®vrcX|£kgje¦¢xkd`¡³spaY|§¢Ujxk§fwbe¦¡ |Sds¬tS]wd¯t_`c¢£mRfkx¥Wgsawl^a±©x`c|©VOsknz[`«¢r~\Xygbduotn^§u]ccYal~¢dl`Y ©owYPs{ybcpbdiTf~u|zvm{~z|m~xp~{ ~y~vzy{ {v }ruypuph}} ~w{~vxs}w|x~|vzwuzv~ ~ }yzlz{}{~{r|}v|}{|~}{~{k~vz~yz {~ qw}yy}z{wy {zx||{wsb`dmrqbW «zbcz{ \lgWlic` ¤}Whp| _bqe¢n]Z{² {|]^xs¡b\jl¡qjT]¥]aym jdjsrwYey®£zZ]{x¤¡|cdb¡§¥pk`¢ubb[qbkod¡np`Y XYqqFpjY¡¨pfeUª¤Yg~{©jfsf mf\a¡¥|WMi ¢]YpoppT^¡±}~T_{vp]jh_jvV¦y}`bv¦ekjgrw`\td]yy¥_fma «qs^`©©yzabrzgccj¢isc^| ¢Qotv]kkh£nv[\m¬,ÿCÙû,ÿ�r�@ e�¿�ÿ-ÿûã²ÿWÿ +â��54��âÿ[ÿ²àÿÿ'ÿ�º�f`�Ä�ÿ-ÿøÛ²ÿVÿë��;:��çÿYÿ´×ýÿ(ÿ�À�a_�½�ÿ+ÿÿÚ®ÿ\ÿå��29��ç ÿRÿ·ßùÿ1ÿ�¾�bh�Á�ÿ0ÿþà³ÿOÿ à��44��áÿ^ÿ°Üÿ ÿ3ÿ�¹�f_�É�ÿ.ÿùÜ´ÿVÿ +ê��98��ìÿ[ÿ·Öþÿ'ÿ�À�Yh�À�ÿ,ÿÿߪÿbÿ�ÝI² ¬]zv|s|}v {xl zvsnx|wxqzxg{t~lr y|}vxwo}}|~~| z{x} ~|yiy}z{v|m ~}yz}}~|}nty |~~wwy|~yr~z~~vy}vq||{|x w||~ wwgv~rrlt{v{u{|z~{xm}{|v~ ~|||y|uxyvsvrzt x~|~x|mw}w|~|vg z|}}xp\Yq]¢bq]o¦ljeRµ ^_mpdnqeercX§|~Udsrª bbi[¥soeb{£}RXh¯§ `ZuZ¡gmga © ZWzo¢®gflf¡usYj¥¢|V`ts¦¥^ehkpoXcÅ`§$�ÿoÈÿÿ[ÿê��;-��ÛÿQÿ¨ãþÿ5ÿ�Á�kV�½�û$ÿýÕÀÿ[ÿì��F3��à�ÿSÿ¯Ýøÿ2ÿ�Ì�b Z�¶�ÿ ÿÿÕµÿ`ÿæ��83��à +ÿOÿ°æöÿ3ÿ�Æ�h_�·�ÿ-ÿ{üà¸ÿYÿç��:-��áÿYÿáþÿ'ÿ�½�g^�Á�ÿ*ÿþÖ¯ÿWÿ í��5=��ê +ÿUÿ»Øûÿ*ý�¾�_m�¼�ÿ4ÿÿ߬ÿQÿÞ��-7��æÿRÿÄÎÏ©sZ_gª¤pja_¤£vrYU~o¤md__ §jtu^szYVrujaifhbV\|©di}rn\cd£j{z|}w}o|ywut {try~ yy~}|z{zukqzux|s{sxy}~xvm} sv~us{yx||}s||~|t{ttwyt|~}y| u~ykny~}|~w vr~py |~ ~xpstzvoyjztrnz~x{|vsY[Tioj¡mldWtif|§Q[qp¤sa_^¡{ui\}n©`^kopm^h¯©syUU|}¥eY~sbf[\ rNc}w¬¦]\qoal_` ¯~i[¢¦fekj bhf[¥{y[Rx¨ {]Mhv¦oÀ�wG�ö#ÿªÿÅ×ÿ|ÿ*ÿ�¶�Zm�Ä�ÿ1ÿ ýå¯ÿOÿÝ��-;��å +ÿ`ÿ´ßÿ}ÿ*ÿ�´�\a�Ä�ÿ2ÿõß²ÿMÿä� �5?��í ÿaÿ¹Ðÿ~ÿ#ý�¼�Ui�Ä�ÿ0ÿûá©ÿUÿ�Ú��*@��ìÿ\ÿÂØÿwÿ(ý�¶�Yp�Ç�ÿ;ÿõê«ÿEÿÚ��,?�£�í ÿiÿ½Ïÿyÿÿ�¬�Q!m�Ñ�ÿ7ÿóäÿIÿ�Ü�|�*L� �÷ÿgÿÈÊÿpÿô�°�Kz�À�ÿL¾aJ©kt~}{|~|w{y {w{}~y} yw }zs}|} qy}zu{z}r|ype¦mg^o¢z~Tgwy S`nj urSf{ª¦t{cTzt[_orliee kaU~£\]co o`fR¬g]t«¤Y]w` ]qZg¥¤uwe`zu¡R^v_«bba[«lVet§Vlbj[kbk£ycf~d¡iZigwq_hw£udUs¡ Zjdx¨¡viaj¡n}^`¥ ``zkc{u|~xs uy~}{|y|yz|]w~u vutytq}{{mm}s} {v{}x} q{wx~z zv} }~{x|zyz {|}xv}s~ ~iy}~vtxu{~} }z}}}||s|v|yty|n~ZѺý +å�.�¶�êÿ]ÿ·Ùÿ}ÿ%ÿ�µ�^ +e�È�ÿ2ÿõ߯ÿMÿæ��3>��ïÿ^ÿºÑÿÿ"þ�¼�Ym�Ä�ÿ/ÿþà¨ÿUÿ�Û��)@��íÿ]ÿ¿×ÿrÿ'þ�´�Zn�Å�ÿ:ÿõéÿFÿÚ��-=��ì ÿfÿ¸Ïÿyÿÿ�¯�Sn�Ï�ÿ5ÿóä¥ÿJÿ�Ü�}�'K��öÿfÿÊÌÿpÿõ�°�Mz�Ê�ÿ?ÿòñÿEÿ�Î�| H�¬�ñÿpÿÅÌÿkÿù�¤�Y(�hI\z{{z}wqsq~rttstxvz~qux jgt´\kngehhT¤¬h{[csª [[rhwojn¤¡|^arvcarmkmcl©m__®hWvn©un_j¥¨nVSr£sqhh¡imUW}lhZYug¡\ael ¢dkYc ®txci]sjl£p^di §©wkV}¦ _btj©loef{ }vU]f«^Mtmleb`~hBd}«t } |{zq|o uxu pzz|{~z}owwy~sux~t q k}}v}u }vtywuyz|vx~ | w~zwey|{q|{~y zsn{x~~ { ~|xvtl|{{p}|xvK_ÿbËÿò�Ã��7/��ßÿSÿ¤àýÿ*ÿ�Á�iX�½�ÿ'ÿÿÒ´ÿ^ÿì��B7��åÿNÿ´Þöÿ0ÿ�Å�f +`�´�ÿ+ÿÿÛ³ÿ]ÿæ��31��ßÿPÿ±âÿÿ3ÿ�»�i_�½�ÿ-ÿúÛ»ÿTÿé��<4��åÿYÿ×ÿÿ+ÿ�¿�`c�À�ÿ'ÿþܯÿUÿå��3<��ëÿVÿ¸Ûúÿ.ÿ�Á�_k�Â�ÿ3ÿùè¯ÿQÿÜ��.:��ç ÿeÿ¸âÿwÿGòÁ¼yymGc¡¡|xlMj£][ljvh`eª~n[w¥£Whlk¡¤¢yka]¦]\ry¤^mph§ m}\n¢¥YUxn¦fat_§¨ukaWy°{~OatpªrcZkc¦re`d «rZWxp§gaip¢¢ftbS®{ndHy}«oc_t rq]\¬y_]kª¬`\ca¤kv_^¤|a]~x¡£Ydnd¢¦mor[}¡]^jm¤W__h¦jmaZa^vr ¤m}rt v |~vxwj|yzj{ k}~ ~ | y|syzz }w~{vxs xx u ot{{hty uhw{~~y wy}rwx~nu~z~~z sw}}s~{wt{z~}r}w{|yxwni x~tt ysPf!ëÿÄfÿ�Ê�©�[ i�¿�ÿ5ÿøâ±ÿNÿ +â��52��ë +ÿ]ÿ³Öÿÿ)ÿ�·�`g�Ã�ÿ*ÿùݰÿSÿç��3=��ðÿ[ÿ¸Ôýÿ)ý�º�Zp�Á�ÿ-ÿüçªÿQÿÝ��(?��æÿ^ÿ¹Úÿyÿ+ÿ�²�^ i�Ì�ÿ6ÿòæ¯ÿFÿÞ��2@��ì ÿhÿ»Ïÿ|ÿ ÿ�·�M h�Ê�ÿ3ÿùà£ÿOÿ�Ù� �(H��ñÿbÿ¿Õþoÿ#ø�µ�Rv�È�ÿBÿñí¥ÿEÿ Ö H¦ udbsj{uyyur|}zr|sy}vypu~vvg|{z~~r{sz{xw z~}{{u}zw~ ~z|| ytz|xzxzy~~zy{yz}{{xywf~|qy~w}~ht~v}}~y~~n ~}u}} xy|yuy zz y{{sz } |uy{}~|v^ªztaN´w~b]u¦Pema¦y[Wc{§ai}¨¡^}jo£sxVl¦ª[[dt¥ih_d¥nw^a}©n[t©Sbo^£eslc¥°ZXpo«^hea hjdV|£}]]gq¤¢\tlh¥¡wljW¡}Zj}f£ l_n_yz_a } ¦~`^yq¢|Ti^k©{sbk}¨§{bVxr¡¡koei¦j|o}qzyngo=ÿbÒÿö�c�?u�Ê�ÿ=ÿñî¥ÿDÿÕ��)?�¦�ïÿgÿ¾Òÿuÿþ�ª�V p�Ð�ÿ:ÿðå¨ÿEÿ�Þ�|�-H��øÿhÿÂÇÿuÿ÷�±�M +s�Ë�ÿ9ÿ÷éÿIÿ�Ö��"G�¢�óÿeÿÊÍÿmÿ!ù�©�P�y�Õ�ÿCÿíñ¢ÿ:ÿ�Ó�x$G�«�öÿsÿÅÄÿoÿù�¥�K)x�Ù�ÿ?ÿ¥ìíÿ@ÿ�Ó�s�W�«�þ!ÿpÿÓÂÿdÿí�¤�B$��Ö�ÿNÿ£èùÿ4ÿÆ©¸como°¢oHqa£`oTq¨¬ui^x§dhqt]p\_ixeX¬\cpr©qebW¯tkWYp ¬¨XYk¦acgg³|xa[}{~[cp£¤nphxu[[q±~dZnj«fjfk_~Za}¥¯_Zgv¤^eaXmxa^ ¤]_kccqa`¤ht]W}¡¥ a]on¦¢knqa¤xwae~ptwuoo{{|xvp|}}xp }uw~u}st{}n|vn{~t rxsz}u~ {xzu~~sy w~zwzvrz| k yzu~~|z{zq| t{n |~}~uy}}pz|~p~sssrw|quvuwttu~q q|uvwus}ru~xzusj}\dnlmt_b¢«uUOixá3ÿ®wÿ��N&E��öÿdÿÀÎÿwÿ!ù�´�Pw�È�ÿ4ÿøê¤ÿPÿ�Ö��%E��îÿfÿÀÖÿoÿ$ý�®�Vq�Ð�ÿ9ÿïí¨ÿBÿØ�+C�¡�íÿnÿ¿Íÿuÿý��N!m�Ó�ÿ;ÿðè ÿIÿ�Ú�~�-P�¥�ôÿdÿÓÈÿqÿõ�´�I �z�Ë�ÿBÿóïÿDÿ�Î�| F�±�òÿoÿÈËÿkÿ÷�¤�P,�|�×�ÿDÿ åïÿ<ÿ�Ô�q$U��ÿÿuÿÐÅÿbÿ8Ú°¯c{z{~vrrr}dtv~zzt~}y~y|gu vyvyyv|}utyu {l {x|vw}yv{z y{~tyx |zyzzpy}{}}|}}y{zrx}~~}qntqt|}ys~umxzwzz}vw}}{jvy¬x`hqp cdddqvcb£©{}UZto«Z_md¤wzgW¤rxeZrªmalvhxV^y ¬v[]w¤|^jhj¢cbUj©¥_fw¨Zgj_¬¦nj]^°Z]{w¤Whml£rbeY²¡}aUq«bai^¢oxX_¥x{Vjw¤c^lp¨mkV_¤w_Rv}peik¨eZ`¤³z}~w}}}wlzqxjp~x{{|x|r rsxXWP½ ÿÿ�Ç�x�Tm�Î�ÿ9ÿóå«ÿFÿß��/D��óÿfÿ½Îÿyÿú�´�Oq�É�ÿ3ÿøä¡ÿOÿ�Ö��)G��ðÿbÿÆÓÿrÿ$ù�³�Ut�Ë�ÿ=ÿðï¥ÿDÿÖ�(A�§�ðÿlÿÁÎÿtÿþ�©�Q$p�Õ�ÿ;ÿïçÿCÿ�Ú�w�)M� �ùÿkÿÌÆÿlÿò�®�G�Ñ�ÿBÿðóÿCÿ�Î�|K�´�ôÿpÿËËÿeÿö�¡�M*�~�×�ÿIÿ¢èïÿ8ÿ�Ò�m!O�¯�ÿÿwÿÏ»ÿjÿê��B-��ÚÿHÿªëòÿ8ÿ�É�r +Y�³�ÿ+ÿwþÛ»ÿ`ÿì��@-��âÿWÿ¬àüÿ'ÿ�À�f_�¿�ÿ'ÿÿÖ°ÿ[ÿé��29��éÿQÿ¼Ùýÿ.ÿ�»�_ k�¿�ÿ6ÿüã±ÿJÿ ß��/5��ìÿbÿ¶Òÿ|ÿÿ�±�U m�Ì�ÿ1ÿóä¨ÿKÿ�Ý��(J��÷ÿfÿÄÎÿrÿ ô�±�Ly�Ë�ÿAÿòñÿCÿ�Ï�}!F��òÿsÿÇÍÿkÿú�¡�L*�z�Ü�ÿCÿ¥èîÿ=ÿ�Ó�m U�ª�ÿÿuÿÕ¿ÿgÿë�¤�;)��×ÿNÿ§êùÿ7ÿ�Â�mU�»�û'ÿ}üÕ¼ÿZÿ î��>7��æÿTÿ²Ûùÿ*ÿ�Æ�^d�»�ÿ+ÿÿá¯ÿZÿß��06��äÿ\ÿºÛÿ|ÿ*ÿ�²�`h�Ê�ÿ6ÿòã®ÿHÿâ��.C��öÿfÿÀËÿyÿ÷�³�Qv�Ì�ÿ8ÿ÷êÿHÿ�Ñ�J�§�òÿjÿÈÎÿiÿù�¥�N!�w�ØaO}:f}¬}{YWzv¬¥^bjjjl^[ p]k£a^ispyMd¤eQwpYghj¤¡dmcNyz__v{Tfkr¤kk`O«x}RYy£\_pojvXjw£¥}Ua~fª`^lf¨¢preb¤¡oMWx¤¥gPnm ¦jqXm pTe{j«oaoq gyZzy|t||vy{yx|{}x}|wx{x{ywy{}x~~xuz{s{}y}~~q}yy~ s{y|xyw{yu |q }}uyzyw{~y}{tuv z zt}yz|wxn} |xu{~ytoyvmw}syrln y~~ ~avwngk¢ |¯k}pV|¤¬oLZ©_Kvwfkb}y ¤~YY¥x¤]mzïÛ ¼�ÿLÿkÿ½Øÿyÿ+ÿ�¼�Wk�Â�ÿ0ÿøè¨ÿUÿÝ��-<��å ÿbÿ¹Üÿxÿ(ÿ�¹�_g�Ì�ÿ8ÿôã¯ÿMÿ +ä��2C��ï ÿdÿ¼Óÿÿý�¸�W i�È�ÿ3ÿðçÿPÿ�Ý�O��ïÿ\ÿÆÏÿzÿ%û�±�Ws�Å�ÿ?ÿóì¢ÿHÿÛ�|(=�§�ðÿdÿ¸Ñÿtÿþ�«�V#t�Ñ�ÿ;ÿîæÿFÿ�Ù�y�(K��ùÿhÿÊÆÿrÿñ�¬�I{�ÎcTZsy{rw{ }{}}zqw}y|qmrsw|sp|ny~zttwwv}m{yww{~jl vx~}h{~~~rq~|a ~qput|wet}~x{}~krv {|v¢|}toue~ ~||}xnn|w~w svqsy|{|xlqtf{w{{~urv|rtr]f{z|m}}}xzr w|{v} py{}zv|w}{s w|{s{~~ nz ut}}| qmx|swz{{r~m_{vyz ndtx |t}gz}} yyyr{p|q }z{{vt|u¡t_[«VX~u¥ Wc^m ¦ti[Vp£yhYrktogb]~¦sdHb¢¡x^Q\ju,�J�ÿ]Ðÿÿbÿý��D-� �×�ÿJÿ§ãôÿ4ÿ�Ð�mX�®�ÿ"ÿzÿлÿkÿó�¢�</��ØÿBÿ¬çòÿ>ÿ�É�q�Y�®�ý$ÿtÿÙÂÿ`ÿï�£�A(��×�ÿNÿ¢æûÿ7ÿ�Å�sQ�¹�ú"ÿ|ÿÐÁÿ_ÿî��=4��åÿNÿªßöÿ2ÿ�Í�e _�µ�ÿ#ÿ~ÿÚµÿdÿç��32��ÞÿPÿ«êôÿ6ÿ�À�n a�¼�ÿ-ÿ}þÙ¹ÿUÿé��?.��åÿ\ÿ°Üÿÿ'ÿ�¿�b_�À�ÿ)ÿþÚ®ÿXÿæ��1>��è ÿRÿ¾Ùüÿ*ü�»�\i�Æ�ÿ9ÿûå¯ÿKÿÜ��05�¢�ëÿcÿ¸Ôÿ{ÿþ�±�] m�Ç�ÿ3ÿôã¢ÿOÿá�}�*F��÷ÿfÿÆÌÿyÿ ÷�°�M{�Ì�ÿ@ÿöîÿCÿ�Ñ�H�ª�ñÿpÿÅÌÿkÿý��J&�y�Û�ÿDÿ¦åðÿ9ÿ�Ñ�p$W�ª�ÿÿvÿѼÿdÿë�¥�<)��ØÿLÿ©èùÿ:ÿ�Á�mX�¹�ú'ÿüÖ¿ÿXÿ í��@7��èÿVÿ®Øüÿ,ÿ�Å�]e�º�ÿ)ÿÿÝÿ\ÿá��/8��æÿWÿºÛÿyÿ)ÿ�µ�bj�É�ÿ7ÿôã®ÿFÿß��0B��ôÿhÿ¿Ìÿ{ÿù�³�Lt�Ë�ÿ6ÿõêÿHÿ�Ð�M�¨�ôÿmÿÉÎÿhÿ÷�£�M!�}�Ú�ÿHÿæóÿ8ÿ�Ð�o"Q�¯�üÿzÿϼÿhÿ î�¡�</� �ÜÿIÿ«éõÿ9ÿ�Ä�l +\�º�þ*ÿzûܹÿVÿô�U©lsc{y}x~w~y}t|rvuu{ {x } }x w uqj|unyv{syi~qv}qhq }xutyyvwr~r{u |~wvxzyktx}rvw|}yyt{~~zx~vsztz~x~m|~qv~tuz}p{s{ nzz|zsxvkvsvwy yxz w~|s~w sol{~s|zt x } sxz}~}w|u} tz}{ aw~t | w u|q~{ps w}z~~~}t{x|}~t{s{{|[y¦s|Yk{¢aYqp k`pd©§pucf¨gX} bp^l«tmg] ¯~t^qz§WWXbx©mgLs}Ƕÿ�¹º�åÿ8ÿóè¢ÿLÿ�Ù��+G��ñÿbÿÃÒÿoÿ#ø�´�Qu�Ç�ÿ>ÿôì£ÿIÿÕ�&A�§�îÿhÿÀÑÿuÿþ�¬�Y �p�Ñ�ÿ<ÿîè£ÿDÿà�y�)E��ùÿkÿÆÇÿyÿõ�«�L z�Ï�ÿ=ÿ÷éÿDÿ�Õ��K�§�õÿjÿËÌÿiÿ÷�¥�N!�|�Ó�ÿGÿèóÿ8ÿ�Ï�t"Q�®�øÿxÿÉÁÿkÿô�¡�B-�{�ÜÿDÿ«çñÿ<ÿ�Í�q[�®�ÿ)ÿwÿÔÀÿ_ÿé��?(��Û�ÿSÿ¥ãþÿ1ÿ�Á�lV�½�ü#ÿÿÔ¼ÿ\ÿë��?7��è ÿRÿ´Ýøÿ/ÿ�Å�^ c�¸�ÿ/ÿþã°ÿYÿÞ��05��äÿ\ÿ¶Þÿ}ÿ&ÿ�³�] d�Ë�ÿ5ÿôà®ÿMÿâ��/D��òÿaÿÁÏÿ}ÿ÷�¶�N v�Ç�ÿ8ÿúéÿFÿ�Ó��"D�©�ïÿhÿÆÐÿlÿü�¥�Q!�w�Ö�ÿCÿèî ÿ:ÿ�Ô�t%O�ª�þÿtÿÌ¿ÿkÿï�¥�?( �×ÿDÿ¨êöÿ;ÿ�Æ�sV�¶�û'ÿwþÕÁÿZÿï��?.��åÿUÿÜûÿ*ÿ�Ä�a`�º�ÿ$ÿÿÚ¯ÿ[ÿå��09��æÿTÿ¹Üÿ{ÿ,ÿ�·�a i�Å�ÿ6ÿòæ¯ÿJÿá� �1@��ðÿfÿ¼Íÿ~ÿú�´�P +o�Í�ÿ6ÿ÷æÿJÿ�Õ��!J�¤�óÿgÿÊÌÿlÿ÷�¢�N �z�Õ�ÿIÿçóÿ6ÿ�Ð�u!O�®�þÿyÿ˺ÿiÿð� �?.��ÜÿEÿªßï¼h·uQzv£ckjS¢wuS[}§ cesw¥¦_l{pdlYfr£yKXwq¥efZm¦lqU^¨¦wQYntTp\e¤¥hwhP{¦||[Urk ]bhb®jqf_ [bxp¢[gfgª l[^{ª ^avt¨icuyxljxy{ryzp{}vvs|y|y{y{z}uqy}z| |xzyz r}}{|wqp w{y zvx {eyy{wp~}vwy{x rqx|y{wygqwys}~ztz~w|{||x}ow kutx |tz{~x~yz~osm|}y ukozebw{Yjxf¡gdff usYYr|¤ ebv_gi\V¢ [gw¢[hnr_pT£¨p|\d¯¬aXpu ¼¬|Y �po�ÿ=åíÿiÿý�«�Q p�Ô�ÿ;ÿìé¥ÿBÿ�Ù�|�*K�¡�ùÿjÿÁÈÿoÿõ�°�Iy�Î�ÿ9ÿóìÿLÿ�Ð��#K�£�ôÿjÿÇÑÿiÿ÷��Q�y�Ñ�ÿAÿìó¢ÿ?ÿ�Ò�y'H�«�óÿsÿÅÉÿpÿ÷�¦�K't�Ù�ÿ?ÿíêÿBÿ�Ø�t�%T�©�úÿmÿÓÄÿnÿí�¦�D#�Ñ�ÿJÿïóÿ=ÿ�É�rN�·�ö!ÿrÿÎÁÿdÿî��H0��Ú�ÿLÿ©áôÿ3ÿ�Ê�j V�°�ÿ%ÿ{ÿÒ·ÿdÿ +é��;0��ÜÿGÿ°ãûÿ7ÿ�Ã�l_�¶�ÿ-ÿüÜ»ÿVÿë��</��èÿXÿ®Ùÿÿ&ÿ�¿�be�À�ÿ(ÿÿÛªÿWÿä��.=��ëÿVÿÁ×ÿ|ÿ+ÿ�¶�\n�Ä�ÿ8ÿ÷èÿDÿÛ��-;�¢�ïÿfÿ»Òÿzÿÿ�®�Q m�Ï�ÿ6ÿóä¡ÿGÿ�Ù�}�'L� �ùÿgÿÉÌÿmÿõ�¬�L�Ñ�ÿEÿìõÿ<ÿ�Ì�r!I�±�óÿuÿÈÆÿhÿö��G*�{�Þ�ÿFÿ«æðÿ9ÿ�Í�j[�®�ÿ&ÿyÿÚºÿ`ÿè��:+��ÜÿQÿ©åþÿ/ÿ�¿�jZ�Ã�ÿ*ÿû׸ÿVÿë��:=��ë ÿXÿ¸Øúÿ(ý�¿�Zj�¾�ÿ.ÿýä«ÿPÿÚ��,:� �èÿdÿ½Ùÿvÿ"ÿ�¯�]k�Ô�ÿ:ÿïæ¥ÿGÿ�Ü�{�,L�¢�÷ÿhÿÉÉÿtÿô�°�F"{�Í�ÿBÿòóÿ?ÿ�Ë�xK�³�ö ÿsÿÍÅÿdÿÿ�2±Y:m¨¡ Tcxgdfca¡vokgx } WWyk¦¡kcdX¡i]Z{¤o Xaa°ebfbvsy_g ªw]dvn¥³Vhfm¤¡¡mjbhz¦³\Tnz¨ ^_WhjlQ{¡ ^ZyrZnbW twy}w||ww||v{}owoyusnzy{rt|}}xy ~qxyx~r| s}~}}wuyo}swv||u~zu||wu|ovw{zwxxjrz}t~xntzw|yq}tvbm|u{p~s£{ysy{npu| t|yv}s~t}||w}~} ~~|{u~w}}w n~f¨MTdz[eeX¢¤xxdQyw¦\Pgl¥kfdh³s|\Y¥¬}de{i Xoiiª¤qz]j£QXulª v^qVx{bbr¡c`º+Ô�ÿÄÿ¥ÿXÿå��83��ÝÿYÿ°æûÿ%ÿ�º�f\�¼�ü*ÿùÙ¶ÿUÿé��;9��éÿWÿ´Øüÿ*ÿ�Â�^c�¼�ÿ)ÿÿÚ¯ÿ[ÿå��28��æÿQÿ¸Þüÿ1ÿ�º�a i�¾�ÿ2ÿúã²ÿSÿá��48��åÿ^ÿ°Øÿÿ&ÿ�¸�` d�È�ÿ.ÿ÷Ý©ÿSÿá��1D��ðÿ]ÿÀÔýÿ$ú�¿�Up�Â�ÿ4ÿûç¤ÿJÿ×��(<�¥�å ÿtÒfV mjz yyhp}zzesy{{xz|z|zzzzzzyvoszyuzy |~}{t{zzvszq{|x~~n}u~zz p~ ~}ry|vzvr ujsxysy |}~tu{yyp~{{trw}t{v|u xq{~xto~zt~~rxw||m{v~|z}z{}rrus|v||}}zx {wu}~ wy}{u~|}|~x|szy{x~| w{}{t~ z~q{}yw¢Yueo¢¢¦kmZ[t{^Vz«gYtnpc^W¨¢{v[Vv `\g`¥mhdg¯¡w e_pVfdu £¢dZk^ty\u¢emsb¥coic£YÊ#åÑUÿ�~7�T��òÿbÿ»Ðÿÿ#þ�¸�Wj�Ä�ÿ,ÿûâ§ÿSÿ�Þ��/B��íÿ]ÿÀØý|ÿ*ý�·�Ym�Ã�ÿ1ÿùé¬ÿOÿÛ��,;��æÿeÿ¹Üÿ{ÿ$ÿ�³�]g�Ê�ÿ4ÿóâ«ÿJÿâ��1C��òÿbÿ¿Îÿ{ÿø�µ�Ro�Å�ÿ4ÿúå¡ÿKÿ�Ö��&D�¢�ïÿ_ÿÄÔÿtÿ#û�¬�Vt�Ë�ÿ?ÿïî¨ÿ@ÿ×�}'D�¤�óÿnÿÁÊÿvÿú�ª�N%t�Ô�ÿ:ÿ¢ðëÿCÿ�Õ�x�#P�¦�úÿlÿÍÈÿgÿñ�ª�F ��Ó�ÿFÿë÷ÿ8ÿ�Ë�y M�³�÷ÿxÿÊÄÿeÿ÷��E.�~�áÿIÿ©äðÿ7ÿ�Í�k^�°�ÿ$ÿyÿÔ¸ÿ]ÿ å��;,��ÜÿSÿ«æü ÿ/ÿ�¾�l[�¿�þ+ÿúÙ¶ÿXÿì��;9��çÿYÿ¸×üÿ(ÿ�Á�Yf�¾�ÿ0ÿÿà¨ÿUÿÝ��+;��çÿYÿ¾Øÿzÿ*ÿ�°�]l�Ê�ÿ;ÿòæ®ÿFÿß��-@��õÿhÿ¾Èÿxÿù�±�Q! w�Ì�ÿ8ÿõéÿJÿ�×��K�£�õÿjÿËÍÿlÿ÷�¡�M �~�Õ�ÿFÿçõÿ6ÿ�Î�v !Q��ùÿzÿʾÿjÿò��<-�|�ÝÿFÿçôÿ:ÿ�Ç�o\�³�ÿ*ÿyÿÚ½ÿZÿé��<-��âÿVÿ©Ûÿÿ.ÿ�¿�c_�¿�ÿ(ÿÿׯÿYÿæ��0?��ëÿWÿ½Ùü~ÿ,ÿ�¹�\p�Ä�ÿ9ÿ÷ç«ÿKÿÙ��.>��ø +îhaDw }y{|~s|}xwz{zr}p{ w}}g~yy~wz{yx{}x}it~~ z|}yzux}nvn|z|yt{{b|zn y vsqm ¢rn\g§¬ufQj¦¤fgnp{ay\g¦ktYXy _fbr§RskU¢¡~`ZZ¡|Z[on¡¡tgp\yubf}Zb~m© abdi«¡u|LV|®[P~o£ op[`§t[\m¢XSuo¥jjgW¨zz[P o£jScd¨Pfe[¤ib ¹hulrxs\£u~]ss¢ Wbcy¦[`ca¨gw_yte`o`ccd\¤zmbXy¡]kwx££miiV§v~`_n¥½Wlmk£·uhacr[o}r¥¥d_u[aubg¢ t{\W^dgp££bqba scSpÐß�®ÒÿLÿhÿÃÒÿuÿ!ý�°�[o�Í�ÿ;ÿóå¬ÿCÿÞ�~�.@��õÿiÿ¾Îÿ|ÿý�±�Ts�Í�ÿ8ÿ÷äÿLÿ�Û��'I��ôÿdÿÅÑÿsÿ"÷�³�Rv�É�ÿ<ÿóð£ÿFÿ�Ó�%A�©�ïÿkÿÁÎÿpÿû�©�W"�r�Õ�ÿ=ÿíè¤ÿAÿ�Ú�u�)K�£�ùÿmÿÈÅÿsÿò��F"}�Ï�ÿ@ÿóìÿDÿ�Î�|M�¬�õ!ÿmÿÍÈÿfÿö��J&��Ö�ÿEÿ¥¢Rx{b~ zzz|wkrpxxwxtuz} rv{mh|{xx ~}xr |tx p | }yx{|z{{w|{tx uuz{}nxx~z~wtwroz}rylj~}zyew}w}u xz|y{kx|}|o~y|y}{z~~} }|py|~xv }}w{|{xzx{f{w~u si|rz~{zy{u~}}y~}q|oqxmw|o}yx{ zu|r }nzwv[Swn©¬c\ngjf]^y£cxSXutZ_ep¡£qehG¨{y[WuRWl_|_vcZ°kJfyz°\l~lµrwbs²yxU^|rjc{|¤sn`^¥§t|T[vz¡©a\vg `rRr®O: �ÿªÿÚ��aa�·�ÿ(ÿÿÛ¸ÿXÿç��31��ßÿUÿãþÿ6ÿ�¼�j\�»�ý+ÿü׿ÿTÿé��?4��åÿWÿ©Ûýÿ-ÿ�Å�bY�»�ÿ#ÿÿØ·ÿ^ÿæ��:8��å ÿPÿ°âõÿ3ÿ�Å�c f�¸�ÿ)ÿ}þâ²ÿ]ÿâ��76��ßÿXÿ¯åþ ÿ*ÿ�¼�j\�Å�ÿ-ÿ÷Ü´ÿUÿ é��:2��èÿYÿ·×üÿ$ý�¿�[f�À�ÿ1ÿÿÞ´ÿAÿZɾDkenq[b© v^cu¡[Ytmptcc±uU_{¤¥{`^jh£m[W\§°}gOr¤d_cu gj~{j}e}} xksz}xq}jr ~vwu{x|z~}y xxs} yo{w~v ~z~{~t yx|l{x~myrwz| t}~tpyhws}uxq~kvdv|yv|stys~rw~ztxv{}ysp lww {bwZxUiu{ Z\t]`tgXlu[^y^\jhecXk¢\q{v© whk¤fq_p¢|}[Tu¤§ jVsfccja°cs\d¦~e_gs ¢¡xVe_¤lqaV ¥¨ X]s«¤bemb¥§ziT[~vJf@×{v�ÿ@ììºÿÿ/ÿ�»�j \�´�ÿ)ÿþ×¼ÿYÿî��=.��åÿQÿ¨Üýÿ.ÿ�Æ�lW�¹�ÿ!ÿÿÔ·ÿbÿë��>3��ãÿKÿ²ãôÿ4ÿ�Ê�f`�³�ÿ'ÿzÿÙ·ÿ_ÿæ��:+��ÚÿMÿ«åýÿ2ÿ�¿�mZ�º�ý)ÿüÙ·ÿWÿî��=1��çÿUÿ©Üüÿ+ÿ�Ã�e]�»�ÿ$ÿÿ×°ÿ[ÿè��58��æÿQÿ¶ßùÿ1ÿ�À�d g�¼�ÿ-ÿóØ«Z¥`|ut{{qr}v}{ p ss {ssp~zyxml~~z}|z xqz|w~y | ysk{~¥¤nadvw |b_n{£kf`c©´uvcWx¬W]bx¢mtdX£¯r|OZvv¤acm]£ Wa`b ¬y Y]©{\efrgak¯¡zu^ao^\nj«kbi[x§lv]gp²a[rj¢nl]d§rp__u§jR`nbhcj¦«¡teZw£·``nfvieb£{vvVx§Vgofmah¬¤tv\|o n~xt~|}~zx x} y{tv~~~~twxw|}|}vxsxu}qnu {{w|nuwuku~yu~ys}nxq{zpn~~}{~z{~}uqyxqyqrvu p{|}x ww |{~}y{zlgÜuÓô#ÿ�OA�j�º�þ$ÿ~ÿÓ¾ÿ_ÿñ��@,� �â�ÿOÿªáöÿ2ÿ�Ë�iZ�³�ÿ ÿ}ÿÑ·ÿgÿí��=0��ßÿGÿçôÿ9ÿ�Ê�o]�±�ÿ(ÿxÿÖ¿ÿ]ÿë��<+��ØÿNÿ¥çûÿ5ÿ�Ã�rV�¹�û$ÿ~ÿÏÄÿ]ÿð��A0��åÿQÿªÝøÿ/ÿ�É�d\�µ�ÿ"ÿÿÖµÿ`ÿ è��53��à +ÿNÿ²æøÿ4ÿ�¾�g +a�¾�ÿ.ÿûß¹ÿWÿæ��2<<¨kTuh}n||{{pxu~|uotxw|yxqzs~{xxVm¥ykhW¤¤|\bs¤¡f^tlnhgX±¢}aW{icTee¨lu\bxWa|ai]hd[qjcª°pZW}¤ªcbyolrgZ¡ªxVU~ ¯do|n¢Zy\i¡¢{]\¦``g`ktaape\yi£ Ubwl§gtV] ¡{dhv¥ g`tnfr[g ¤u~]a }¢¥fSmn z}xvq|v~yzomvuz}p~x~~yj~~v~uyy}~~~ztxwt~ ||~}}{x z~yy~n}|tu zpvunzstrlv| {v~t~~szrpzqxu |z{| |}~wz}q{~n |p|~{wrwm¬sî�®%�Ø ÿ}ÿùäÿSÿâ��0?��íÿZÿ¾×ýxÿ(ü�½�V m�¿�ÿ4ÿûæªÿVÿÛ��.9��æÿ^ÿ¹Ýÿ|ÿ(ÿ�¸�bh�Ê�ÿ5ÿóå°ÿKÿâ��4:��ìÿdÿ¹Öÿÿ ÿ�·�Y h�Æ�ÿ/ÿûܦÿQÿ�â��0B��ïÿ[ÿÁÕþ}ÿ&ú�¸�W +q�Ä�ÿ9ÿùé§ÿJÿÙ��)=�£�êÿbÿ¼Õÿuÿ"ÿ�®�Zm�Î�ÿ8ÿðå¬ÿEÿ�Þ�|�-E��øÿaÿȨ\©¦Tlfx¤£\ucX{¤ V]tt¥^geg¤sviZ¥«~U_tl¥¢g[vm¡x_yy§¥u\gO{ebew]xY`¯veyoczTe¡£s~bGyz V_l~acXt ]zhNv§ `pu i[if ¥s{aw¨¦zffhergsºsmXVw£fYbo« Zrz\~tgQykfQr£hoqj\jVZ}q¦}|`^wwgwdu qg|} s{w ~{zws fxs pz~q}| vux~s~}tmvr st¢mu|{nqwsvsqp} ~ziyx {|xzx~xu|dywyr nx rymopw yr~~ } ~~ x{yq ||{vvx~vZ±�vG�÷ÿËÑÿ¤ÿKÿâ��18��ë +ÿ_ÿ²Òÿÿ'ÿ�¸�_f�Ã�ÿ*ÿûÛ±ÿUÿ�á��5E��íÿXÿ¸Ùûÿ,ÿ�Ã�Xl�½�ÿ)ÿùå§ÿ\ÿß��0;��ä ÿZÿ·Üÿzÿ,ÿ�¸�dh�Â�ÿ2ÿøâµÿNÿ å��58��éÿbÿ·Üþ ÿ!ÿ�·�Xa�È�ÿ2ÿûܨÿTÿ�Þ��,C��îÿZÿÂÕþ|ÿ'û�·�W +r�Ã�ÿ8ÿúç¨ÿKÿÖ��)>�¤�êÿ`ÿ»Òÿyÿ!þ�¨�[k�Ñ�ÿ9ÿïæ©ÿGÿ�Ø�z�2G� �ùÿiÿÄÉÿvÿô�°�Jx�Í�ÿ:ÿûäÿFÿ�Ó��K�©�òÿnÿÇÔÿhÿ÷�§�O+�z�×�ÿHÿèñÿ:ÿ�Ó�r#N�®�ýÿyÿÌÀÿkÿð�£�C+��Õ�ÿ@ÿêðÿ=ÿ�É�p \�±�þ'ÿtÿØ¿ÿZÿô��A-��Ù�ÿPÿªâúÿ+ÿ�Â�fW�½�ÿ$ÿ ÿÒ¹ÿ^ÿë��<6��å ÿNÿ·Ý÷ÿ/ÿ�¿�`h�º�ÿ/ÿþä°ÿRÿ +ß��31��å +ÿ`ÿ³Ýÿÿ%ÿ�°�\ +g�Ì�ÿ3ÿõÞ±ÿMÿ�Ü��1F��õÿeÿ¾Ûötÿ#ù�º�Nv�É�ÿ;ÿöë¤ÿKÿ�Õ��#F�¨�íÿjÿÄÑÿnÿü�¨�R$�t�Ø�ÿBÿèîÿ?ÿ�Ó�w�&S�¨�ýÿtÿÎÅÿrÿí�§�A'|�Ô�ÿDÿ¤îóÿ?ÿ�Õ�sU�µ�ìÿmÿÖÀÿ`ÿð��F0��Û�ÿIÿ©à÷ÿ/ÿ�Ê�d T�¸�ÿ$ÿÿÖ²ÿkÿ�âA¬wÏvaa_z¦¨pnXjxz{tow ~ j{pz~{ypl~v piwuxvy ix}w~}|up{ }m}{s|xyyv}oy}pj|oyv|x|{y{i~uy } xz~~zjyx|y }w~y~}y{qzz~xvw~tt{y~xu}~|v ~zv~ wz c¬d_fp¡]b^b¤k{`l¡f`^mfZZcflb`U~¦ua\m¯pbYi~cmbWw¤£qV[{y¢mpsb£¢ixV_¢yW[lq lied§pwZY ¡x_ax ªauvi¥ oo`a§{wN_}i¢s©hwx]¡otURz¡ Pdv}§k`ej¢ _q]g}¤ p TZhhopo¡§u|bm| u{~L@Ú +ÿºwÿùÚ��0=��ëÿZÿ½×þÿ+þ�¾�\m�¿�ÿ1ÿþâÿTÿÝ��07��å ÿ\ÿ´Ûÿ}ÿ)ÿ�·�de�È�ÿ2ÿöß´ÿLÿ å��5;��ìÿ_ÿ¶Óÿÿ#ÿ�»�Xg�Ã�ÿ*ÿüÝ®ÿXÿ�à��-A��ìÿYÿ¿Öÿ{ÿ)ý�¸�[o�Â�ÿ5ÿ÷ë¬ÿMÿÛ��+=��é ÿgÿ¹×ÿzÿÿ�¯�Yk�Ð�ÿ5ÿòãªÿJÿá��.G��óÿeÿÂÍÿvÿö�µ�Mu�È�ÿ=ÿøéÿGÿ�Ô��!F��òÿdÿÅÐÿoÿ!ú�«�X"�w�Õ�ÿCÿëï¤ÿ;ÿ�Õ�{%M�¨�ûÿoÿÄÀÿoÿõ�¨�F(�Õÿ>ÿ¦íïÿAÿ�Í�vS�¨�ü$ÿqÿÓÄÿdÿï��E#��Ú�ÿMÿ¡ãûÿ2ÿ�Ç�lU�¹�üÿÿÒ·ÿ]ÿï��:4��æ +ÿNÿ°áôÿ5ÿ�Å�e_�²�ÿ)ÿ|ÿà·ÿZÿâ��33��áÿ\ÿ¯Þÿÿ*ÿ�·�^_�Ä�ÿ-ÿùÛ°ÿQÿæ��3?��ðÿ\ÿºÔþ}ÿ%ú�¹�Uq�Ã�ÿ5ÿúè¦ÿLÿÙ��&>�¢�êÿhÿÁÔÿsÿþ�«�W q�Ó�ÿ<ÿìé¤ÿ@ÿ�Ú�x�*K�¢�ùÿjÿÅÆÿtÿô��G!}�Ð�ÿ@ÿññÿ?ÿ�Ì�zO�±�ö!ÿvÿÍÉÿcÿô��H+��Û�ÿMÿ£âõÿ1ÿ�Ì�g +W�²�ÿ ÿÿÖ·ÿcÿ +é��91��Þ ÿPÿ°éõÿ3ÿ�¿�h a�¿�ÿ/ÿ~øß·ÿRÿè��:=�/m`ynidnvaZQq«¢P`pn¡¨ dZae ll]}¢£}\`|q§t[dbhyib e^~q§elgv¦suZ[kªª|_^mtdnah©z~n_¢ \aioªYkcwy dodTr`dry¤pgib £¨lU[¡}^Sup¤£a[t^¡sdbS¤¤}_W}f¨hfoetkRXªtaaxq¦ V_be£fx z}ku{w~}vu}}}|t|~{~ x{z~~zyxu|}s|~~u|q} }s zvy{wu~|wxzz } ~v{rtqnuyyzv{wzt {s~uzw~j~lo{u|x~wtvzt|~n |z{zpw~zm|x y}tx}nevs¡\cf¶ï$â�3�ÿ;ÿdÿ©äûÿ6ÿ�Â�kU�»�û$ÿ~ÿÑÄÿ\ÿ î��E2��á�ÿQÿ§Þøÿ3ÿ�Î�eV�´�ÿ"ÿÿÕ¹ÿeÿç��92��à ÿMÿ°éôÿ6ÿ�É�k +_�¶�ÿ)ÿzþÞ»ÿ\ÿç��=-��ÜÿWÿªâýÿ-ÿ�À�mZ�¾�þ&ÿýÖ´ÿ[ÿï��9:��çÿRÿ·Ùúÿ,ÿ�Â�_e�¹�ÿ0ÿ ÿÝ®ÿVÿà��/4��ä ÿVÿ·Ýÿ~ÿ-ÿ�¹�ce�Ä�ÿ3ÿõá±ÿNÿ å��6<��ìÿbÿ»Ñÿÿ ý�¹�Rl�Ç�ÿ2ÿûâ£ÿOÿ�Ú��&D�¡�îÿaÿÅÓÿpÿ$û�®�V�v�Ì�ÿAÿïí¥ÿ?ÿÖ�{(E�§�ôÿpÿÂÆÿtÿø�§�L&y�Ô�ÿ<ÿ¤ïëÿBÿ�Ñ�v�T�¨�û!ÿoÿÐÅÿdÿï�¡�F#��×�ÿMÿ¡éøÿ3ÿ�Æ�q S�·�ü!ÿÿϼÿbÿ í��?5� �åÿMÿ®áôÿ4ÿ�Å�ge�·�ÿ-ÿÿÞµÿTÿá��41��áÿ[ÿ®Ûÿ ÿ,ÿ�µ�` b�Å�ÿ,ÿöß°ÿRÿ�ã��4C��ïÿ^ÿ¼Òþyÿ%ú�º�Ss�Æ�ÿ7ÿöí¥ÿLÿ�Ô� &C�¤�íÿmÿÁÑÿqÿþ�¨�S"p�Ú�ÿ@ÿìéÿAÿ�×�t�&T�¦�ûÿoÿÏÂÿkÿî�©�B&��Ò�ÿHÿ¢ì÷ÿ<ÿ�Å�rP�º�ù#ÿzÿÑÂÿ_ÿñ��F3��ß�ÿQÿÝ÷ÿ1ÿ�Í�]a�·�ÿ*ÿÿâ±ÿ^ÿà��23��âÿXÿªÕÿµ©³c¤wdw~x}r{{bx|||xwu}q trp}yzvv z }{{ tuzw| s{xxyyvxpumz{z~z~xvyt~~vzo|vyv mtq~vz~~z|zz}y} w}yxxz||~t}{u|}|xp~{xs{{~x}zqy{y|qo_Xrq Wbko¢pg_^d[]p¢¢\Qeion_^ ¥]Y}|¥dcqjdx^V q}[RxuZfmnqj`^¥rraW}ªUYiqohfY¤£}g[n´¨_lur¦¨cr]h`]ro¤`cpr¡¥\kTd¦¦{hdt¥ zbasrwg^n¨xT`s¤idhp¢¥_pa`xpj|~|~}~{zm~xf£Hÿ§ÿ�Ñ�'1�f�Á�ÿ*ÿúÛ¶ÿVÿé��=6��èÿWÿ¯Øþÿ(ÿ�À�_`�½�ÿ&ÿÿÙ±ÿ\ÿæ��49��æÿQÿ¶ßùÿ1ÿ�Â�ah�»�ÿ0ÿþâ´ÿUÿá��24��áÿ[ÿ±Ùÿÿ(ÿ�¸�c`�Ç�ÿ/ÿ÷ݳÿPÿå��6>��î +ÿ^ÿ·Óþÿ%ü�½�Uk�Á�ÿ-ÿüæ§ÿRÿÝ��*?��èÿ]ÿ¾Ùÿtÿ'ÿ�²�\n�Ê�ÿ:ÿñè«ÿGÿÜ��$EJ|bl}u}y}z{~ky{yo{ }~u{x m}r}z|vp{ wvwm{|zs{s| {{xy|v{q rx}| r~|w}}o~~}|} zw{{~y}}~}vz{xy|x~jxutzx~ym} yvx}zz }n{|~sy u}{zxrvyqu¢ c]lZoifg¡|Sazr¤¤`fvh¤gd\gr{Vd{«h^oi¤k|_e£xXaz}¨ aXkl¢kfaY¨~yaV}|® ]Yii£_moY o{^]¢¢bapipcjV~tWcq{°Xdo\¡gaka¥vvY_y£©r^rflee©nVn}¦ecpb¡hlXm¤¤trdZ|}§f^jolnnl¢lq]V}ªXesr¦iizQ¦pw]lu¦\ï=Úì*ÿ�_+�D��éÿ^ÿ¶Üÿ}ÿ-ÿ�²�]d�Æ�ÿ/ÿ÷â´ÿNÿ â��79��çÿ]ÿ¯Ùÿ ÿ&ÿ�»�\]�Å�ÿ,ÿûÛ²ÿXÿæ��7@��ëÿWÿ¸Øú~ÿ*þ�Ä�Yg�¼�ÿ/ÿÿâ®ÿXÿÞ��/7��äÿXÿ¹ßÿ{ÿ*ÿ�¹�dh�Ã�ÿ5ÿôä®ÿNÿ +å��4=��í +ÿbÿ¸Óÿÿý�¶�Yg�Ç�ÿ/ÿûÞ§ÿRÿ�á��)B��ñÿYÿÅÓÿÿ'û�±�X s�Ä�ÿ=ÿùè§ÿCÿÙ�'>�¤�îÿeÿ»Íÿvÿ"ÿ�ª�V!o�Ñ�ÿ8ÿðæ©ÿCÿ�Ù�{�)M��úÿkÿÁÈÿoÿõ�²�J~�Î�ÿ?ÿôïÿCÿ�Í�}L�©�óÿnÿÊÊÿhÿø� �M&�}�Ù�ÿGÿåòÿ7ÿ�Ï�m"R�¬�ýÿwÿ̽ÿjÿï�¢�>,�ÚÿHÿ©êôÿ;ÿ�Æ�pZ�´�þ(ÿtÿÙÀÿ\ÿì��@/��ß�ÿUÿ¦Þÿÿ,ÿ�Â�eZ�½�ÿ$ÿ ÿÖ³ÿ]ÿç��6;��èÿVÿ¸Ýúÿ.ÿ�À�` i�¿�ÿ3ÿøç¯ÿOÿ Þ��16��éÿcÿ·×ÿÿÿ�³�\ +f�Ì�ÿ3ÿôâ¦ÿNÿ�ä��+F��ôÿaÿÇÍÿuÿ õ�²�Nw�È�ÿ>ÿôðÿEÿ�Ò�!F�«�ðÿnÿÅËÿkÿú�¤�O'�w�Ù�ÿ@ÿ£çíÿ;ÿ�Ï�pT�¨�ÿ ÿsÿÒ¿ÿgÿì�¥�>'��×ÿMÿ§èûÿ4ÿ�Ä�q W�º�û&ÿþÔ¾ÿ]ÿñ��?2��óß@s?© h|uvx}}v}{ w{q~y~x}x|}~{{}zqy|z}y~z}z{~{}|}~|tzzn pyyz}y x|yt}|~{uvy~ xt {t}}ls~{~}wu|y~~ wo{uzsw~wu|~~ r{ {nq¦``aiszV_~¤\]g¡£[mgi¡tlq`¡ Wbzt£¢[]o_whX_UWq¤nblh¤¬tk]^¢}V_vu¤iXjngkg_z¦¡~c`|¡£jdZijqX_|©~X_un aenhhkbZ¢v}]a}o©^gneimh^®Mj´]ntj©urhc¨¥xY[ }«y{x| w p|m|z|~|u z|x~ ~l__´ÿªÿÒ�b�H �r�Õ�ÿ=ÿíê¥ÿBÿ�×�y�)H�¡�õÿlÿÆÉÿvÿ÷�¯�J w�Î�ÿ8ÿöæÿIÿ�Õ��&K�¢�ôÿfÿÉÏÿnÿ!ö��Ox�Í�ÿAÿîó ÿBÿÓ�$C�ª�ñÿoÿÆËÿpÿû�§�T$�r�Ó�ÿ<ÿ£ëëÿAÿ�Û�r�#Q�¤�üÿoÿÏÃÿoÿñ�¬�E#}�Ð�ÿCÿñðÿCÿ�Î�{N�°�ôÿkÿÏÈÿcÿô�¡�K'��Ù�ÿJÿæôÿ6ÿ�Î�n !P�²�þÿyÿϽÿjÿî��@0��ÝÿFÿæóÿ:ÿ�É�m\�³�ÿ)ÿyÿؾÿWÿè��>)��Ú�ÿTÿ¨ßÿÿ+ÿ�À�jZ�º�ÿ&ÿÿÔ¶ÿ[ÿì��:9��éÿSÿ¶Ûøÿ-ÿ�À�^ j�º�ÿ1ÿþãÿPÿÞ��06��åÿaÿ·Ùÿ|ÿ%ÿ�±�`g�Ì�ÿ4ÿòâ«ÿJÿá��0C��õÿeÿ¾Êÿvÿ ø�±�R w�É�ÿ8ÿöî¢ÿJÿ�Ò��!F�¢�ðÿnÿÅÏÿkÿü�¢�N"�w�Ú�ÿCÿèï¢ÿ<ÿ�Ò�t&U�©�ûÿvÿÍ¿ÿlÿð�¨�=*�×ÿHÿ¦ëóÿ>ÿ�Ã�pU�·�ú'ÿxþ×ÂÿYÿë��C0��ß�ÿTÿ¨Ùþÿ0ÿ�Æ�b\�»�ÿ%ÿÿزÿ`ÿä��7:��æÿWÿ¶âûzÿ-ÿ�¼�ai�Å�ÿ5ÿõæ®ÿMÿ á��2>��ì ÿgÿ»Óÿÿü�´�Tp�Ê�ÿ4ÿõç ÿLÿ�Ú��"J�¢�óÿeÿÉÎÿlÿ ÷�¦�Q��Z|wj|{{xx{ z}syu zvl~{~hy~z v|x|qy|uyu|~y}yxy{{ {~wt{w}y}}pzz}tqoz~ww x}tzny{{~ }{yxt}|~xzywq~w| ~w}z{|zz|oVbyta[f\{s^_¡ }`\pi¨_gviewafy«Sdun¦[\kguzcT|y¢xXWiov[h´§u^_zhZ]p~¡`lb_¡gvS\ §Qbrv¥cnta©mnbV®ª]^}k§¤Yeb]¦{wiY ª|\^uz£pgpk¢ojRcz |Qar¬hgm^owWay£§][psagbeup_i¤£ zcNozbb]hhv^_nw]_xj¤¡hbgk§pjkOu Rë5êèBÿ�y�$!m�Î�ÿ6ÿöã£ÿOÿ�Ø��0G��ðÿ^ÿÄÓÿwÿ#ù�º�Qn�Ä�ÿ:ÿùê¤ÿMÿÖ��*=�¥�êÿcÿ¾×ÿtÿ$ÿ�±�_�m�É�ÿ<ÿñæ«ÿGÿß�|�.>��óÿgÿ½Ìÿ|ÿø�±�Sq�Ì�ÿ5ÿöå ÿKÿ�Û��#I��óÿcÿÈÏÿpÿ"÷��Qz�Ë�ÿBÿðï ÿAÿ�Ñ�}%C��ñÿlÿÂÈÿpÿú�¥�Q)�w�×�ÿ?ÿ ëëÿ?ÿ�×�u�%V�©�ýÿoÿÍÂÿmÿï�©�B#�Ó�ÿDÿ íöÿ<ÿ�Ê�x +P�±�÷"ÿtÿÎÅÿ`ÿô��F+��ß�ÿMÿ¨àöÿ0ÿ�Ì�h]�´�ÿ!ÿÿÒ¹ÿdÿë��71��Þ ÿJÿ±æøÿ3ÿ�Á�ja�»�ÿ,ÿ~üݹÿTÿè��:3��åÿ[ÿ¯Ùÿÿ'ÿ�½�\a�Ã�ÿ+ÿýÛ¬ÿXÿ�ã��2@��ìÿ\ÿ¼Ùýxÿ*ý�º�X +o�É�ÿ9ÿóìªÿNÿÚ��,=�£�íÿmÿ¼Òÿxÿý�¯�R"l�Ó�ÿ:ÿòåÿIÿ�Ø�|�)P�£�÷ÿgÿÍÌÿtÿñ��K!�{�Ì�ÿIÿïòÿ>ÿ�Ë�vH�´�öÿsÿÊÃÿgÿó��L/��Û�ÿHÿ¨äñÿ8ÿ�Ñ�f +X�®�ÿ&ÿyÿÖ¹ÿeÿæ��;+��ÛÿQÿ¬æûÿ2ÿ�À�p ]�º�þ,ÿúØ´ÿXÿ î��67��êÿXÿ·×ýÿ(ÿ�À�\h�½�ÿ/ÿÿá©ÿUÿÛ��,<��èÿaÿ»×ÿvÿ'ÿ�®�\a�â�D]T¡zkrx|||yxs tjxr xrxmvq}z~{w{zz}e }zw}vuy {| y| } }p}w|}yo~}xyzzv{|}yt ~}wgyuzwz~~x|{}uw~~w{{x}w}{y xumk¡¥Yeonnkf^¦yz_^¨d[nl£a\]ªwx^j¨epke¥¤eqgg£rv\\zznghh¢`gsc¡jsYO~x£¦~a\ u££bl]q¥{UYz¡ª[clq¥alXn¦w|b_ ¨Zc]r ]fh_§ ]U}z¬aayl¡§ higX juT^¥®ybZ{regV^}£¦uXV~q£W|~psr{}vzr r~{| w{{w}{vzw x w|u}}~ U[2Ý ÿ¶~ÿ�Ê� �[f�Á�ÿ'ÿûÚ±ÿUÿå��7;��çÿUÿ¸Øúÿ)ý�½�\f�½�ÿ,ÿÿá®ÿYÿá��17��ã ÿWÿ¶Þÿÿ0ÿ�¶�c e�Á�ÿ2ÿùá·ÿNÿ +â��76��èÿ_ÿ²Ùÿÿ"ÿ�¹�_a�Å�ÿ+ÿûÚ¯ÿUÿå��4?��íÿZÿ½×û~ÿ)ü�¼�Wn�À�ÿ4ÿüæ©ÿNÿÛ��+:� �èÿ]ÿºØÿ{ÿ%ÿ�±�^h�É�ÿ5ÿòåªÿIÿá��0B��ò ÿdÿÀÍÿ}ÿú�µ�P +s�Ë�ÿ8ÿùèÿJÿ�Ø��"G�¡�òÿdÿÉÐÿmÿ!ú�ª�R�z�Ò�ÿDÿíï¢ÿ:ÿ�Ô�x$H�«�öÿrÿÃÇÿsÿö�¥�I'v�Ù�ÿ>ÿ§ììÿ?ÿ�Î�u�V�¬�þ$ÿpÿÕÂÿbÿî�£�C%��Õ�ÿPÿ¤èùÿ4ÿ�Ä�n T�¸�û ÿÿÒÀÿ`ÿ +ð��?5� �æÿPÿßö ÿ1ÿ�Å�b f�¸�ÿ)ÿÿáµÿ[ÿ +á��0:��áÿ^ÿ²Øÿÿ*ÿ�´�^ _�Ê�ÿ0ÿöݯÿNÿâ��5E��ïÿ`ÿÁÑÿ|ÿ#ú�¼�N m�Ã�ÿ8ÿúè¡ÿLÿ�Ó��(A�©�íÿgÿÃÓÿoÿû�¨�V$�t�Ð�ÿBÿëìÿ?ÿ�Ú�q'M�§�ýÿrÿËÁÿmÿñ�©�F%~�ÓÿGÿ¤ðòÿ;ÿ�Ï�wP�°�ù%ÿsÿÓ¿ÿaÿò��G/� �á�ÿRÿ©ßøÿ/ÿ�Ç�e\�µ�ÿ&ÿÿײÿ`ÿç��75��âÿUÿ´àû~ÿ0ÿ�¹�e +g�Dxc}xzywz~|o{~}}~~} zu~ |}tyq|tvzo~{w{wy{w{wu|s|y|~y|yvz m}}y |~ py}~qyynxpt}~tsxvv {{y {y|vt|{l~|{^U¬[ixkcif[iYWtqY_rj^bb]rcK\¦ |MQph¡£blgW «utdX|££_Rtz£Yn]j³hxnR~ ¢Nauªcxna¨e}jT¡Xemi¦ik]Ts{_`x}¢¦ ZYoc¡W_aercp ¦¢h]iz¥dpjn~ pzX]jRsq©¢[yca¦qlXPuy~~yy}y|~~yy{}|}yz| ~ t{w wzu~}}~|}un}|}y}v v}yo}{w|wztz~dzHÿqÃÿê�CG��îÿbÿ¿Öÿxÿ&ÿ�¯�Xm�È�ÿ8ÿóëÿJÿÜ��/>��ìÿfÿ¹Õÿ{ÿ ÿ�°�W +f�Î�ÿ4ÿôá¬ÿOÿ�à��0F��ôÿbÿ¾Ñÿ~ÿ ø�¶�S o�Æ�ÿ4ÿùè¤ÿOÿ�Û��$B�¡�ìÿ_ÿÄÕÿsÿ%ÿ�¦�Mq�Í�ÿ<ÿñì«ÿBÿÙ�{+D�¡�ðÿ`ÿ¹Êÿxÿü�º�Z#q�Ð�ÿ8ÿóæÿGÿ�Ö�}�(M��÷ÿdÿÊÌÿmÿò�¼�8D=³n¡|jrTyw]g¦pWo¢ eWya¡z_m}±zZ^kdlwod¬w{]d³uOl\m¢nncqm©g[qr²anog uYd¡¢lM]m¢^rs[¢{jcWl¤Ucyw¢_cpanlfe}¦sidxr¦rlgd¦}\`u¨_cw`]~e|x}cXtª|i_vpmYridjoW |¦dctz¤ep_w ¦tz^g¬_mmk¥bbjeXvX}} }]]s\kdoi[T}¤W}|f¡ª^d\¦}og[ f²]`vq©{LSjl]nV{}¡ª]q¦ kb`F¨xxy}r}i}~v{z~y zzwx|x x~~s mjzv}x~yusrhx {wd ~r{vg p{|{oDn�ÿRà÷6ÿß�¢�P!p�Ò�ÿ:ÿ ïë¢ÿEÿ�Ú�{�)K�¥�ûÿgÿÅÉÿqÿô�®�Lx�Ê�ÿ<ÿõíÿJÿ�Ô��"G�¦�ñÿfÿÅÕÿkÿò�¬�Sv�Ñ�ÿBÿîî¥ÿ=ÿÖ�{)C�¦�òÿoÿÂÊÿuÿû�¨�U&s�Ð�ÿ<ÿðæ¡ÿDÿ�Ú�{�&M��ùÿkÿÊÊÿuÿñ��H }�Í�ÿ@ÿóïÿGÿ�Î�~� J�ª�ðÿoÿÉËÿoÿ"ü��O%�|�Û�ÿGÿçñÿ:ÿ�Ó�q"Q�«�ûÿvÿ̽ÿlÿñ�¤�A*�ØÿBÿ¨íñÿ>ÿ�Í�vW�¯�ý&ÿqÿÑÁÿcÿî��E'��Û�ÿQÿ¥äüÿ2ÿ�Æ�oW�¹�ü!ÿÿμÿ`ÿð��B2� �æÿNÿ±àôÿ2ÿ�Æ�c b�µ�ÿ,ÿÿßµÿZÿ +â��50��ãÿ\ÿæøÿ,ÿ�º�j ]�Æ�ÿ0ÿüͳÿUÿê��@<��êÿ]ÿ·Õýÿ'ÿ�¾�Wl�Â�ÿ1ÿÿß§ÿPÿ�Ü��)>�¡�èÿ[ÿ¾Øÿwÿ'ÿ�±�[o�Ê�ÿ<ÿïé«ÿCÿÛ�~�,A� �õÿkÿÀÊÿyÿø�¯�P"v�Ì�ÿ5ÿóêÿGÿ�×�~�O�§�öÿhÿÎÌÿiÿô�¢�K ��Ô�ÿHÿèöÿ6ÿ�Î�tR�±�øÿzÿʼÿiÿõ��=0��ÝÿDÿ¯åóÿ9ÿ�Å�l^�±�ÿ.ÿ}ÿÛ»ÿZÿè��:.��àÿWÿ«Ûÿÿ,ÿ�½�c^�À�ÿ'ÿüØ´ÿXÿç��6=��îÿXÿ¹Ùû}ÿ*ý�Å�Q!7bÌ]`de¥X]fn ZrfX|« rdZow£XZk^£rjde¡zSbu¨]bx`hpZa~v`[qj Xakv¤utY`¨®WXyq|jpku£¢yog\p`Stl¡dxw{k|yx{zz{ss{lyuw}{{|uu}~| z|~|| ~z~s yu~yw|z|z{s~rz |~u||z|rxoyuw~r}l}sjv|sw z{p}xg~{w iwqwvw~{yst}z{|z~yu}v}{|}nqxwy~{w x{}~~j_wb¬okcs §~wWflv¬\Xph¢snb[¥¥sWfvx¨g`]g¡exWm¡\`r§cZid¢hn\c¯£utj]w£ [[lh¤ggeR~xö?üÀVÿ��'d�¾�ÿ,ÿÿÙ©ÿUÿá��/:��èÿSÿ½Úÿ ÿ/ÿ�¹�ah�»�ÿ4ÿýâ³ÿOÿá��12��æÿVÿ°Øÿÿ*ÿ�¶�c b�Â�ÿ/ÿ÷ܶÿRÿè��7:��ìÿ\ÿ¶Ôþ ÿ%þ�¾�Zg�À�ÿ,ÿÿß«ÿYÿ�ß��,>��éÿYÿ½Ýþyÿ+ÿ�¶�[ +m�Ã�ÿ6ÿ÷æ¯ÿLÿ Þ��1;��éÿaÿ³Óÿ|ÿþ�±�W +i�Ë�ÿ3ÿõá§ÿNÿ�Þ� �0D��ôÿ`ÿÄÏÿxÿ!÷�¶�Q u�È�ÿ<ÿ÷í¡ÿHÿ�Ó�#C�©�ïÿkÿÂÒÿoÿý�§�S#�r�Ô�ÿ@ÿëë¡ÿ?ÿ�Ù�u�(M�¦�úÿpÿÉÄÿlÿñ�ª�G%|�Ñ�ÿBÿ¢óíÿBÿ�Í�xO�¨�ø"ÿrÿÐÈÿdÿñ�¡�J)��Û�ÿMÿ¢â÷ÿ3ÿ�Ë�jV�´�ýÿÿкÿgÿê��93��àÿKÿ¯æõ ÿ7ÿ�Å�i b�¸�ÿ-ÿ{þÞ·ÿXÿæ��91��áÿ_ÿ±Þÿÿ&ÿ�»�]^�Â�ÿ*ÿüÚ«ÿUÿä��7A��ëÿVÿ¼Öý}ÿ)û�»�Z n�À�ÿ:ÿøé©ÿKÿØ� �*;�¤�ìÿdÿ»Ïÿxÿÿ�¬�Y$r�Ñ�ÿ9ÿïç¡ÿGÿ�Ý�w�%J��ûÿjÿÉÈÿrÿñ�ª�G |�Ð�ÿHÿñòÿ=ÿ�É�xK�¬�õÿtÿÌÆÿdÿõ��H0�~�Þ�ÿKÿ«áóÿ5ÿ�Ì�i\�±�ÿ$ÿ|ÿ×¹ÿdÿå��6/��ÜÿQÿ¯âþÿ1ÿ�½�m^�·�ÿ4E Vvu{uxwvu{ { zw|~y{y~}~vvw|szywr~|k| r}|v~{~~}wd}|}y{ r} }uquwx{tyrsvwtx ~uyt xxr{z~v}|||p zjt|tt{||zxx~|}y}w{}ws}sz}~| ~~{~~{qtx yxs}~tpq~{|z|z{|z~ |x|u|w{ r~ ~zz~{ }y}y}wxyrrz|srzw£ddfX§¤jq\b|jZXrp¢«ncjd¢rrY_¢§}|[Rxh¥adbfiu^U~ªeO{p¦¢^jd]mh]O }]\owZji]§[upc¤ {dT[ÌIÿwÿ�Í�3G�¥�ïÿfÿÁÓÿrÿ#ÿ�©�Tp�Ï�ÿ:ÿïë¨ÿBÿÙ��-E� �ðÿiÿ¿Ëÿwÿÿ�±�R +l�Ð�ÿ7ÿóåªÿNÿ�Û��/J��óÿaÿÂÍÿrÿ!÷�³�R r�Ç�ÿ<ÿøì ÿIÿ�×� �$A�£�íÿeÿÃÔÿpÿ ý�«�Wr�Î�ÿ>ÿïê§ÿ@ÿÛ�z*D�£�öÿmÿÂÉÿvÿø�®�M#w�Ï�ÿ9ÿòéÿEÿ�Ö�}�!O�¦�÷ÿkÿÌËÿlÿ#ü�Z±hiwq}x}rz}|y}p~tt z|{{}w{uytvvzy}}}u|~z y~}~v~t~{}{} uszwy rmio£vteY¨~~bky|¥\c`b kxgS qY\|ª¤_W|Y£nr`e ©}|\_v¦bfmk¤jjTa¢smRW|«giymltee¥_f y£¨ ia[xoma`ªx[fl|¢¯Rekk¤VfZc©sxh\wz¥V^mlgrhZ¥¥jL]{u¬akfu u`eR|°¡lXY w ¦v`_rhqn^]¢¨}[dw£]]g\d~`m|±jN¢}imlr¤ql`\W[z¬t`p`dp__©§v_W{n°£|ZcseªtalZ§§x~\dqª}d`us¤°upm^°¦|{k[x ¡XaqjvH�Z �ÿLÝõÿkÿý�¨�O#o�Ô�ÿ;ÿîè¦ÿDÿ�Ô�{�)K��ùÿjÿÅÇÿuÿ÷�²�Hx�Ì�ÿ7ÿõëÿMÿ�Ó��%H�¢�òÿfÿÅÑÿpÿ#ú�¨�Rv�Ë�ÿ?ÿòî¥ÿCÿÖ�&B�¤�íÿmÿ¾Êÿqÿÿ�¨�P"p�Ò�ÿ:ÿîç¥ÿDÿ�Ú�|�)L��ùÿjÿÆÈÿvÿô�°�Kz�Ì�ÿ>ÿôíÿEÿ�Î�K�¦�òÿiÿÉÎÿhÿ÷�¦�O �z�Ø�ÿFÿêñÿ<ÿ�Ñ�s#L�«�öÿwÿÇÃÿoÿö�¥�G(y�Ùÿ@ÿ£ììÿ@ÿ�Ï�s�!V�«�þ#ÿqÿÒÃÿfÿí�¥�C$��Õ�ÿKÿ¡êøÿ4ÿ�Å�sN�´�ôÿ~ÿÎÃÿ`ÿð��D3��Ú�ÿMÿâôÿ6ÿ�Ì�g[�²�ÿ#ÿ}ÿÕ¶ÿaÿè��8.��ÞÿMÿ¯åúÿ5ÿ�½�k_�º�ÿ-ÿüÙ½ÿUÿé��<2��éÿXÿ×ÿÿ'ÿ�¾�^d�¿�ÿ&ÿýÝÿZÿä��/=��ëÿZÿ»Úýzÿ+ÿ�¸�]m�Å�ÿ7ÿõé¬ÿIÿÜ��-?��é +ÿgÿ¹Ñÿ}ÿ ÿ�±�Ti�Ï�ÿ5ÿôã¤ÿJÿ�Ý��,K��õÿbÿÇÍÿpÿ ö�³�L{�Ê�ÿ>ÿóñÿAÿ�Ñ� E�®�ñÿpÿÅËÿkÿø�£�M'�x�Ü�ÿBÿ£çîÿ;ÿ�Ñ�mW�«�þÿtÿÛ¿ÿgÿè�¢�<(��ØÿJÿ§éúÿ6ÿ�Ã�oV�»�ú%ÿ}ýÕ¾ÿYÿ î��?5��æÿTÿ¯Úúÿ5ÿ�¿;¦qm ~~z|w xy y}{ }z}y sr}yxz~ u~vz~t~u{ }{vysh`jt¨ixfWw¢ªuPPuy©]gig¬fofk¦aekgpe£kw[e£{ebyp ¡]coo¡«st^\x^Zrtaekc¦lmTl«£VYb©mako pubY¡±|lX||§¡ _gnmmze_£ua^y ¤gmend{_]£~ZVrs£`kji¦tid]¡zZ\{z]Rpl xusw}rvy u {zv}yxzy |v~{tzz~r |~y|to|xzvvvz{x} |z|}~}uw~~y~~y{zz}|y~xxvwm~}zyvz|wql^å³ÿá0s��Þ�ÿHÿ£åóÿ7ÿ�Ï�n T��ûÿyÿ̾ÿjÿò�£�F+�ÙÿAÿ¨ëïÿ@ÿ�Ì�t�W�«�ý!ÿpÿÔÃÿdÿí�£�D"��×�ÿGÿ êùÿ9ÿ�Æ�uP�³�õÿ{ÿÎÆÿbÿô��F+�~�à�ÿKÿ¥áôÿ7ÿ�Î�m![�±�þÿ|ÿÓ»ÿjÿ ì�¢�<.��ÛÿLÿ«éõÿ:ÿ�Æ�nY�¹�ý'ÿwÿÚ¿ÿZÿê��?2��Û�ÿWÿªßþÿ/ÿ�Ã�cW�¾�ÿ$ÿÿÕ´ÿ^ÿë��=9��æ ÿRÿ¶ß÷ÿ.ÿ�Å�`d�·�ÿ/ÿýã°ÿXÿ +à��42��ã ÿ]ÿ´Þÿÿ'ÿ�·�g d�È�ÿ2ÿõÞ±ÿQÿç��5?��òÿ_ÿ½Ðÿÿ#ý�º�Tq�Å�ÿ7ÿúè¤ÿOÿ�Õ��%A�¤�îÿdÿÁÔÿsÿ#ÿ�¨�Ur�Ò�ÿ?ÿíë¨ÿ@ÿÙ�}*K�¤�ùÿoÿÃÇÿtÿó�«�H#z�Óÿ=ÿ¢ñíÿCÿ�Î�yQ��ø"ÿoÿÒÆÿbÿñ��G&��Ü�ÿMÿ¢áùÿ1ÿ�É�g U�¶�ÿ!ÿÿÓ¶ÿcÿé��:4��âÿNÿ³âùÿ5ÿ�¿�hb�º�ÿ0ÿúâµÿVÿå��74��æÿ^ÿ²×ÿ ÿ"ÿ�º�`h�Æ�ÿ-ÿûܪÿSÿâ��-A��ðÿ]ÿÂÕþzÿ&ù�±�Ut�È�ÿ;ÿõì¦ÿBÿÖ�%C�¦�ðÿlÿ¿Åÿoÿý�§�M%r�Ö�ÿ:ÿ£ìëÿBÿ�Ñ�v�S�¦�ý ÿoÿÏÄÿdÿð�ª�C"��Ó�ÿFÿb©rRg ¥hUtu[dn^ pu\d©[_mu©TlhitW\ }abzp¥]rlgrucc©{yv}v tvy~yxk{ s} vp|u }zyzz } jz{~s||l ~ym{} zw}txuw{yzps}w|yx}tzy~ {}x~vv|{} oy}o{{w |}|yv}zrvx~{x{zrzzrtzvt| zmzzjW_rh ccii£vsZa ©¤ ]^|~¥¡nbed gx[`¦}T]src^ln£¡h{^Dz¡§ Z_vm¡`mi^¡¦mpXW§[hxv ^ehX§lpf` ^]{o¢ dvmaxp_Yz| ¡|ccxm¦kcg_¡´(øl¯ÿ�Ý*7�e�¼�ÿ-ÿÿÚ²ÿ^ÿæ��8.��à ÿQÿ±äýÿ0ÿ�¿�j _�¸�ÿ-ÿýÚºÿWÿê��>1��âÿXÿªÛÿÿ+ÿ�Â�dY�½�ÿ%ÿÿÕ´ÿ\ÿ í��79��è +ÿQÿ¶Ý÷ ÿ/ÿ�Å�be�¶�ÿ+ÿÿß±ÿWÿ +á��13��â +ÿUÿ²Þÿ ÿ/ÿ�·�ha�¿�ÿ/ÿ øÝ·ÿPÿ +è��8:��ëÿ\ÿ´Øÿÿ'ÿ�¿�Zg�À�ÿ(ÿþÞ¬ÿUÿã��/>��ëÿXÿ¾Ùÿ{ÿ*þ�¶�[m�Ã�ÿ5ÿõë¬ÿNÿÜ��.<��èÿfÿ·Òÿ{ÿ"ÿ�°�Zi�Î�ÿ4ÿóâ©ÿKÿ�Ý��-I��ôÿdÿÃÍÿsÿ ÷�·�Lv�Ë�ÿ8ÿóð ÿLÿ�Ï��$E�¨�îÿlÿÅÓÿlÿö�©�T#�v�Ó�ÿAÿéîÿ=ÿ�Ö�s(K�¨�ûÿsÿÏÄÿrÿó�©�A(|�ÔÿCÿ¤ðïÿ>ÿ�Î�vR�²�ù#ÿoÿÓÆÿaÿð��F(��Ø�ÿQÿ¦å÷ÿ0ÿ�É�jS�µ�ÿ!ÿ|ÿÏ·ÿdÿð��?5��àÿHÿ¶ßúÿ4ÿ�Å�h `�²�ÿ/ÿÿÜ·ÿZÿæ��8-��âÿXÿÝÿÿ'ÿ�»�e^�Ä�ÿ-ÿúÚ°ÿUÿç��5>��í ÿXÿ½Ôý}ÿ'û�º�Xn�Á�ÿ3ÿúê¨ÿMÿÙ��'>��ëÿfÿ¼Óÿuÿ ÿ�«�Wn�Ð�ÿ8ÿíç¨ÿCÿ�Ú�|�*I��ûÿlÿÆÇÿrÿô�°�I}�Î�ÿ;ÿóïÿCÿ�Ì�|N�¢�ÿ¾SuB¥vqzyz {zyv}w{{|z~ww|sv| xkRx^e~pbfjo«xsX`~§¡V]so§ve_c¦¦u~iW¡ `^vp¤wfhg¯rgZ¤ª^Tx igc]¤¨lyeX ¦]cbo¥]j\[©nj_\{~¨druu]pkd¡sm^j¦Rbmr©^mh^x`WZy¥Xdd£oisdªppY_¶ `[xjam^hq~`Yx |{{|v}{~w|y|yr|~u||z ux~y v}x}s| mwxy {{yvt{v{su{zyi|}|~x~ w~usz | vx~p}~yy~|qyx yvyiª|I�ÿ$ú×§ÿÿ-ÿ�Æ�f^�·�ÿ!ÿÿØ·ÿdÿ ì��:3��áÿKÿ¯ãõÿ:ÿ�Ç�j`�µ�ÿ(ÿzÿÙ½ÿ`ÿè��:+��ÙÿPÿ§çûÿ6ÿ�Á�j +U�¾�ú&ÿ|ýÔÁÿ[ÿî��C3��à�ÿSÿ§Ýúÿ/ÿ�É�dU�¶�ÿ"ÿÿÖ¸ÿeÿè��;4��ßÿLÿ±æô ÿ3ÿ�Ê�g`�¶�ÿ,ÿ{ÿß·ÿ`ÿç��;-��ÞÿUÿ¬ãþÿ%ÿ�¿�m\�½�þ)ÿyÿé«Á¼¤sWet¥ ]oik `p]\¢x d`z¦ ^gldkpa^¢xWf{ju t}{ny z}y}~~| n} q|} |v{z yq{wz{u}u{x wzrqu}y}~~vq|~w~{{ |~}r }|yo}}|{x~}rrzu ~w}w||v{|~|xx {uz|~{||}y|x~r ~x{ {~zzxw{ y}}|z zrytx{|z {~~q} xl~{}~ ~vx{~qow}xyy{vn~ y |z~u|zwy yvt{wyxy|mv ~ x|y uw|{|y{m}||| z}z}{x} up~~}~z~z w~~l¥dκAÿ�~S�Ü�îÿYÿ¶àù ÿ/ÿ�Â�b e�»�ÿ/ÿÿÞµÿYÿ +á��8/��ßÿVÿ¯âþÿ1ÿ�¼�l ^�º�þ-ÿùÛ·ÿXÿì��<0��èÿWÿ°Üüÿ'ÿ�À�ga�»�ÿ&ÿÿÕ®ÿ[ÿê��27��çÿPÿ·Ýùÿ0ÿ�¾�c +g�»�ÿ,ÿÿà³ÿTÿâ��31��âÿXÿ±Ýÿÿ,ÿ�·�e `�Å�ÿ,ÿ÷Ý·ÿOÿæ��6:��ïÿ[ÿ¶Ôÿÿ&ÿ�¾�[m�À�ÿ+ÿÿÝ©ÿUÿ�Ü��2>��êÿ^ÿ¼Üÿvÿ(ÿ�µ�^l�Æ�ÿ8ÿñêªÿKÿÝ��0B��íÿgÿ¼Òÿ}ÿý�±�T m�Î�ÿ7ÿöã ÿKÿ�Û��'I� �óÿbÿÊÎÿpÿ ö�®�N{�Ì�ÿAÿõî ÿ;ÿ�Ð�~"D�¯�óÿpÿÅÈÿoÿþ�¢�L(�v�Ú�ÿAÿ¤èíÿ<ÿ�Õ�p!U�§�ÿÿqÿÏ¿ÿiÿì�¤�B%�ÕÿIÿ¦íöÿ:ÿ�Æ�sU�¶�ù$ÿ{þÓ½ÿ_ÿò��D/� �äÿRÿ®Üùÿ.ÿ�Å�ea�¶�ÿ%ÿÿÞ¯ÿZÿä��.6��â ÿTÿ´Þÿÿ1ÿ�·�e e�Ã�ÿ5ÿ÷àµÿKÿ â��5<��ì ÿbÿ´Îÿÿ!þ�·�Wk�Ç�ÿ1ÿùã¥ÿRÿ�Ö� �(E��ñÿdÿÃÕÿmÿ#ú�¯�Uw�Í�ÿ>ÿìñ¤ÿ@ÿÕ�|'D�¨�öÿqÿÄÅÿqÿö�¦�G'x�Øÿ?ÿ¦ìîÿAÿ�Ð�v�V�¬�ü$ÿqÿÒÄÿaÿí��D$��Ý�ÿEÿ¯¨pnzz~x{usy||u~yvx w{}y~v{xtx{tv~wz~wru|vnvtss {tl| |q}zxq| yz}v{||{}pyz |k|u tpyz~sz ytzt }~ztx}tv{{sk} {ypp{xr}z|}yo{|o|xzvzyy|~~vt{x~yz z|w x~m|z|}w{~ }}z p |x u {{ {tv}wzr}wyvx{v}z| tx}}t~xvt|z} ~u}xx}y{tx|p|{{ozl} s~{wz~v }{wuzz~j~{ ||y|w |z{^8H¤�ÿ¬ÿ"ÿ ä�¡�G$�~�Õ�ÿHÿëóÿ;ÿ�Ï�o"J�°�÷ÿuÿÊÈÿmÿö�£�L,�y�Ú�ÿBÿ¢êìÿ>ÿ�Ö�p!P�¦�þÿpÿÏÃÿqÿï�§�G"�Ò�ÿDÿ¡óïÿ?ÿ�Î�{Q�¬�ö!ÿnÿÏÈÿfÿô� �J#��×�ÿJÿéõÿ7ÿ�Ì�v + O�°�øÿxÿɾÿiÿ÷� �B,�{�ÜÿCÿ©èïÿ;ÿ�Ì�m� Y��ÿ%ÿvÿÑ¿ÿ`ÿë�¢�=(��ØÿLÿ¥ïôÿ®tB¨]Ytr¢ihlb¢cnr xz¥x|~vq~v~ w} }w|wwtqol~|ywn{}{|~}~|m}uyt|~`y zzf||itmu}olt vqzy~du||xy¤w {t }| yw~}}syzx~ ruuzz}oxtnuy|~zu yzvxuxoy}zjx~y~{r w~~{ u|~rxw voV u~w{|yhzy|{wv ]xm|u||}{}wrw~{wl~~ y||otz u}x~yl yg z{sl}zw{z}o {tjqywx{tuxs}yq¦z¥(4ãÿ¯²ÿÿ?ÿ�Ø�y�)J�¡�õÿjÿÄËÿzÿö�¯�Q +x�Ë�ÿ4ÿòîÿIÿ�Ù��(H� �òÿaÿÉÎÿvÿ"ú�ª�]{�È�ÿ@ÿùç¥ÿEÿÕ�%@�£�îÿjÿ¬Òÿsÿ ÿ�¦�`p�Ð�ÿ;ÿïèªÿCÿÛ��/E��òÿjÿ·Éÿvÿý�°�To�Ì�ÿ5ÿöç¢ÿJÿ�Ú��)I�¡�÷ÿcÿÆÐÿmÿ"ø�±�Pw�È�ÿ=ÿòï£ÿ@ÿ�Ó�$D�¤�êÿqÿÂÍÿuÿ'ÿ�§�S$�t�À�ÿ;ÿëêÿMÿ�Ú�w�'P�¤�úÿnÿÊÁÿtÿ&ø�«�G"}�Ñ�ÿ?ÿòðÿIÿ�Í�|O�«�ôÿoÿËÌÿeÿõ�¡�K$��Ù�ÿJÿ åöÿ3ÿ�Ì�p!Q�±�üÿ{ÿÍ¿ÿjÿô��D-��ÞÿEÿ¨êíÿ>ÿ�Ï�lZ�¯�ÿ'ÿtÿÙ½ÿaÿé��<*��ÜÿQÿ¦âþÿ3ÿ�Ä�p U�¾�ý&ÿþÔ»ÿ]ÿ +í��?6��íÿQÿ³Ý÷ÿ/ÿ�È�``�º�ÿ*ÿÿß±ÿZÿâ��15��áÿTÿµàÿÿû�·�d +c�Ç�ÿ4ÿøÞ´ÿOÿ +ç� �48��çÿ`ÿ¶Ñÿÿü�¸�Ys�Á�ÿ+ÿùä£ÿQÿ�Û��#D��ïÿaÿÂÕÿrÿ'ý�¬�Us�Í�ÿ;ÿéô©ÿ>ÿÕ�*C�¤�óÿmÿ¾Çÿtÿû�«�G(p�Õ�ÿ:ÿíëÿEÿ�Ò�y�R�¥�ùÿjÿÍÈÿfÿñ��F#��Ó�ÿFÿëõÿ=ÿ�Ç�rL�´�öÿ{ÿÎÈÿnÿò«µ¶qRfapjmaicy[_¨ªTaiq£ jzra§zrTtY^l\¦¢eeckzt_Xuz¬¥zjXuf¥ink©¡q[]gq }Knhihla[¡nYg±aWxmelUb d{ZYt{eOtvok`j¤my[[w ³`bhe¦ ¢ddg\ ¦otVyª Yq^hfpek¡© xXZ}rSfji£ anlb og`~k ]||z||y}vv}x k~ k}zxyy zxzg| u| t~xskzzzp|}t{h}y}{~|zvwyy}|n}~|{yx{{zyxj |~vq~nst|ww~xn~~x l| }}w~}yvy{rww||{ tu {y}{~z|«PY�ÿ=éêkÿEÿå��88��èÿWÿ³Øýÿ+ÿ�Á�ad�¼�ÿ%ÿÿÚ³ÿ_ÿä��66��çÿSÿµâøÿ1ÿ�Ä�de�¹�ÿ)ÿ|ÿá¶ÿ^ÿ ä��83��ÛÿZÿ®äþÿ-ÿ�»�i\�Ä�ÿ+ÿúÙ¹ÿUÿ +ë��=5��âÿWÿ³Ûûÿ+ÿ�Ã�c]�¼�ÿ*ÿÿÖ¯ÿ^ÿè��28��æ ÿMÿ¶Þúÿ1ÿ�¾�de�¹�ÿ4ÿ ÿݵÿPÿá��33��æ ÿ\ÿ©×ÿîÅun¢xlt|||t|tzr{ nz~|zu}|~t| sz}zytn|t{x|tynr|qyw{|qyy wrw t vwzrvz}}}g|srz zy wqyz|wrn~~x v{xv|t}v~{{~vutlxpxm~yw} y}~} ~byd¤Wckh ¢n~ew®rrjOu¬ _`xkjib_¬uy\\z{~gZvs¢]l]e«u}`V}ª¤^rkj£u`fJs_We¥£[clq~¨itia¢zhja¦£Thbh¤n_o`~¡q}Vf ª\Urg kl\nzzS\~~§gWtm¨¨dk\]¡£s ZNz¥[Y_sVn_gv¥z\Uq¢Yhl|}x~ykryr~z{}zl?Y �ÿkÄÿï�À��51��áÿ\ÿ±ßÿÿ0ÿ�º�c\�¾�þ+ÿúظÿWÿ ì��>4��éÿWÿ¯Ûûÿ*ÿ�Æ�a\�¹�ÿ$ÿÿÓ²ÿ_ÿé��97��äÿPÿ´áöÿ2ÿ�Ã�f +`�µ�ÿ+ÿ{ÿáµÿYÿ ä��7/��ßÿTÿäýÿ/ÿ�¼�i\�¿�þ+ÿ úعÿWÿë��<8��çÿWÿ²Øýÿ(ÿ�Á�`e�¼�ÿ*ÿÿÙ®ÿ\ÿæ��08��æÿRÿ»ç÷uÿuÑ´f t{~ r|zuq~~i{pwxtyuuoqhwo{{inz~uyrs} }yr{{~ zs~qwywsol{qwzyvuy}{pvyy~{}{znz{vsvwx}}~|{~ ~ {|zz~}}|z|l~{|z~}yf¦umcc¢ Wb}t¨g`ia¡klrZ¬u_`yªeYfn_iWh¦¦tsW}¢_Zi^£axZZ¦vQWy}¢}Uclm¦ps_Qr|Qdsy`frocq_f¢^_wu[_jib{tg |z\T}k uUcnh p[hf§©maIsw©l\__nWX ©}`Z ±¦Wbpr¢_f~zt~y|wq}s ~yvp} x{q vu}§"¼�ÿ Ûÿ½ÿlÿ÷�¬�N#�z�Ï�ÿDÿëòÿBÿ�Ó�{�(@�©�îÿjÿÁÎÿtÿý�¬�V!�p�Ó�ÿ<ÿñå¥ÿBÿ�Ü�z�,G�¡�óÿkÿÃÊÿ{ÿú�²�N t�Í�ÿ6ÿ÷æÿLÿ�Ø��&I�¡�òÿ`ÿÉÏÿpÿ!ö�°�Px�Ê�ÿAÿôî¢ÿBÿÔ�|%@�«�ïÿmÿÁÎÿrÿù�§�U$�r�Ó�ÿ?ÿìéÿBÿ�Ù�{�)K�¡�ýÿkÿÄÃÿtÿñ�ª�K }�Î�ÿ=ÿóíÿAÿ�Ó�~N�§�ôÿiÿÍÊÿkÿö� �M��×�ÿGÿéóÿ7ÿ�Î�w !O�®�÷ÿzÿÉÁÿkÿ÷� �B,�|�ÜÿCÿ§èîÿ=ÿ�É�oY�«�ÿ%ÿvÿÔÀÿ_ÿë�¦�<)��ØÿKÿ£áÿÿ8ÿ�Â�o U�¸�ú#ÿ~ÿÒÃÿ\ÿî��A3� �çÿRÿ«Ýøÿ2ÿ�Ê�aa�·�ÿ#ÿÿÛ´ÿaÿã��55��áÿUÿ²ãüÿ1ÿ�»�gc�Á�ÿ0ÿ÷ß¶ÿPÿå��99��éÿ_ÿ´Õÿ ÿ#ÿ�»�Yi�Æ�ÿ/ÿýߦÿTÿ�Þ��,B��íÿ\ÿÀÖÿvÿ(ü�±�Ys�È�ÿ>ÿõë©ÿEÿ×�+@�£�ïÿmÿ¾Íÿxÿû�ª�Q%s�Ò�ÿ;ÿòæÿFÿ�Ú�x�"O�¤�ùÿlÿÏÈÿmÿñ�«�H"��Ð�ÿHÿëöÿ:ÿ�Ê�x +L�³�÷ÿyÿËÁÿgÿô��F.��áÿIÿ«âòÿ6ÿ�Ì�j_�±�ÿ(ÿ|ÿÚ·ÿ`ÿ å��:(��ÝÿQÿ¬âÿÿ0ÿ�»±¨u[fw¯¡glpjso^}¢{aUps¶Well_pc\¨mcbr~W_e\¢£bmt_£yva_xw¦][sK]l^h±{\ky¢csv^¤nsG^§{TYh¡¢~¥[gm¦jrXfªtZT{u¥¦~_Vgi al_f££~u_]y¤lfmrnurb ¦|_RswTia~ nqbi}|^Vv®Icnh¥mmN^¤qWsyª\Yeg¡tq`el}W`~l k\vg¡or]e¤¨zWXxl¦f^lm¡s|NYz©~zicn¢abkh®¥kva` £^Rxr¡¬Tcdm§ojcJ ©mWdo¢\ugn¡irdYª{\\sw^g`h¡¬nw]Vv¢ld~r¢dfg^jwqoyyy~qxxkpt|{vww}y kxtá�Ä +¼�ÿpÿÿÔ¾ÿcÿô��B/��àÿJÿªãòÿ6ÿ�Í�mW�®�ÿÿwÿϼÿhÿï�£�?*�ÙÿEÿ©íñÿ?ÿ�Í�tV�ª�ü#ÿoÿÔÃÿcÿî�¡�E$��Ô�ÿLÿ êøÿ8ÿ�É�uN�´�öÿuÿÌÅÿeÿ÷��G-��ß�ÿIÿ§äñÿ5ÿ�Ï�m X�¯�ÿÿwÿϺÿhÿì�¡�?-� �ÚÿGÿ©êôÿ:ÿ�É�rY�³�ü&ÿtÿØÁÿ]ÿí��A(��ß�ÿEÿ¸Á¤`}u}x~|zvxz|~t}ss~} {~v z~ymns|b }~ykxh~v~xrz|mux |x} xy|u}yv|z~|ys}wozyx||n }{uqqwuvpxlbsJ zUrªler\¤lrc\|¦a\r£phqj cn]_£Z^q£ oavh]ie^¯ dpy¬§fghj Yu_rfSvq£ bmle¡_y_k|z¤¬xm` ]jtn£tkc_® {jco¦Yekjelc`¨~\Ywt¤}`htd£¢ma_R £px[U¨~_mqymzcb¦{wW¦¯jscninhZ¡¦saPx¡¡bbug¡gqfU¨sUapvLa]l[r_\ÀPæÿ�¿y� �íÿcÿ¹Ùÿ|ÿ(ÿ�´�^g�É�ÿ5ÿõâ²ÿKÿà��7<��èÿcÿ¶Öÿÿ$ÿ�º�Zb�Ã�ÿ,ÿüÙ¬ÿWÿ�ã��5A��ì ÿWÿ»Ùûÿ)ý�À�Zg�»�ÿ2ÿÿàÿTÿÞ��06��äÿYÿ·Ýÿ~ÿ-ÿ�µ�b g�Â�ÿ3ÿõâ³ÿPÿã��6:��éÿ_ÿ´Òÿÿ"ÿ�º�Ve�È�ÿ,ÿúߪÿSÿ�â��+C��îÿ[ÿ¿×þuÿ'ü�º�d�:gL^p}t}sxz}z{p }oyzusx}~vy}~v}t~v{}~}|}z}vxwtrz}}uq zy~y||{|}rxsxluz|~|}znyzs~v{uzp~{}u ~sz]pe£qvRe{vjTq¦[piffl`Q{¢ ~ZUv|^dls³evnbz¨kZTuxª_Xp`«¤rWfh¥¨a^lu¡«eisn¦~f_`|¡sPr{t¥£QXnjjuc`ueh{qb_hb¤noiV¢|yfWsy¢³cdqjnab]¦¤wzUMr§£whq|bwTj ¶¨t``o jbm^¦ yxvz p~vst{~{xx{s{p|w~j{}{z}uuuzzy}}vxmz}u y|z x~wWzsð&ü×Sÿ�ª�}�81��àÿVÿâûÿ0ÿ�Ã�hW�»�ü"ÿÿÒ¸ÿ`ÿ ð��B3��âÿMÿ«áôÿ0ÿ�Ë�g X�²�ÿ"ÿ}ÿÔ·ÿfÿë��?/��ÜÿIÿªêòÿ;ÿ�Ê�pZ�²�þ&ÿtÿØ¿ÿaÿë��@'��Ú�ÿQÿ¦çúÿ7ÿ�Å�oP�¼�û$ÿzÿнÿbÿñ��F3��à�ÿNÿ®àõÿ2ÿ�Î�eX�²�ÿ%ÿ}ÿÖ´ÿeÿ +ç��:/��ÜÿJÿ±åøÿ(ÿbÃÌuaTNy±z_cvj¡doNi£¢}\U{©¤Y\sq¢ecmT£{y]]|£¬Xeym±f[hehzY`~~®u`kru^z¤ssabt¬¡gitxkb`h§brT]y¢ }__cnYlX]sr}yx} { z {yxv }| w r{}tu{}tzy~~z~~r{r~{nqrvvu{} {~{p~yx|xy{v|v~~ | ~| {x ~|{}x~{x~z|wn z{}xpsv|vo~}{~sr}||{jytuvz|~ uvwx}~{}rsx{ urx~ |sn{zq}y} xv}tr{tnrstz{z~quu}ypq~}{|L¯ +A�ÿ_Úÿÿeÿö�¤�N#�|�Ó�ÿDÿëòÿ=ÿ�Ó�y%F�ª�õÿqÿÂÉÿrÿû�¦�L$s�Ö�ÿ<ÿíèÿCÿ�Ù�w�'O�¡�ùÿkÿÅÈÿsÿö�²�Iy�Ì�ÿ:ÿôíÿGÿ�Ó�� K�£�ñÿfÿÊÍÿoÿ!ù�¨�Q�{�Î�ÿEÿïï£ÿ=ÿÓ�~$G�©�ôÿoÿÂÅÿpÿù�¦�O(x�Ó�ÿ:ÿ¡ìêÿ@ÿ�×�w�'O�£�ýÿnÿÈÅÿmÿò�«�F �Ñ�ÿ8ÿ¤äÊÒXyGq{|_f\w£ab`¢£|Zf{|«ogql£ cmc_yZe|~¦XhldªtwbY¤¥{{]fqzVgnq¢reY] zZZwr¡¢`eit ms\a yZ]vqz~{~n z| w||vnt~o~x } {xt ~rz| xz}y w{~z}||ry {}tyz~|w}zu|~}|ny|z}yly|yz ~yv} u~ }z{yt~rt|}z{}q}{{x|xx~ vwp|xu~}{ki¢£vfYw|q`Z]}YPjh¡cwok£yxb_x¡\cqf|i`bbkc[ Z^dl¡¤pmgb£mab}©Tfxl¦fam\ ~yZf{¢xIrJÓºÿ�µ$�¦�ôÿ`ÿ¾Ñÿvÿ%ÿ�¬�Xn�Æ�ÿ:ÿôä±ÿDÿÝ��/:��ïÿdÿ·Îÿ~ÿ"ÿ�´�[i�Ì�ÿ/ÿ÷ßÿPÿ�á��1@��òÿ^ÿ»Ñÿ{ÿ&ú�¼�Xp�Â�ÿ.ÿúè©ÿSÿÜ��+<��èÿ_ÿ½Üÿwÿ*ÿ�³�^l�É�ÿ7ÿôçÿKÿß��1<��ê ÿgÿ¸Óÿÿÿ�³�Xg�Ì�ÿ3ÿöá§ÿNÿ�á��-H��ðÿ]ÿÅÒÿzÿ#ù�¸�P s�Ä�ÿ:ÿúé¤ÿJÿ�Ö��&?�¥�ëÿdÿ¿Ñÿtÿ$ÿ�ª�Y�r�Î�ÿ=ÿíé§ÿEÿÞ�z�+@� �÷ÿjÿÀÆÿwÿô�¬�Q w�Ï�ÿ4ÿõèÿFÿ�Õ�}�I� �öÿiÿÌÌÿjÿõ�¬�M�}�Ó�ÿFÿíóÿ<ÿ�Ð�x"I�¯�ôÿvÿÆÇÿnÿö�¡�E*�x�Ü�ÿDÿ§éíÿ<ÿ�Ð�oX�«�ÿÿtÿÔÀÿgÿê�¢�B&��Õ�ÿLÿ£ëøÿ8ÿ�Â�nT�·�ù$ÿvþÒÀÿ^ÿñ��C2��åÿPÿ¬Þ÷ÿ-ÿ�Æ�d]�¶�ÿ%ÿÿÖ²ÿ^ÿ ç��42��âÿNÿµàþÿ1ÿ�º�e a�Â�ÿ1ÿùß¶ÿQÿæ��67��êÿ_ÿ³Õÿ ÿ#ÿ�»�Xg�Å�ÿ,ÿüÞ§ÿPÿ�Þ��*C��îÿ^ÿÁØÿsÿ%û�´�Vs�É�ÿ<ÿðî§ÿIÿ×�+A�¥�îÿnÿÁÎÿwÿú�«�U#q�Õ�ÿ<ÿñçÿFÿ�Ú�x�#Q�¥�÷ÿiÿÎÆÿmÿñ�«�G ~�Ì�ÿN¢H±Gt{]¥©swe\¢zhTtyc_[V¡xvgQz¢{Vrjp¥¦ajl_bvWf¨ Tdlp lhdL jnR`§£}Vgux¡¡b]cb¡sv^_{£¦~qwzxsz| z|}}}otuzxw~|w~~s||y}uk~v~ y h}yz} {~z~} ly|}r{xw ~|~zs~zs|} {|{|{ ysx~}xuy} x|z|uxpvtsyzj xx~wvwyrp~}{ t}osr}|vvXdx£kkdm¦¡r]^t¦wcVyr¢£q^_epwYf¡¤ZSuoesca¨®m~_Oxt¬Tak{{dgUma_}¤£dqtwlrxY¤tsXb{¯¯Vawj¨S¥x ÿܲ�ÿ$ÿKÿ¡òéÿCÿ�Ö�z� M�£�øÿfÿÏÈÿrÿô��L{�Ê�ÿCÿöíÿ@ÿ�Ò� E�§�ðÿhÿÅÎÿqÿ ý�¦�R�u�Ñ�ÿ?ÿíî¦ÿCÿÛ�~,D�¦�öÿnÿÂÊÿvÿù�¬�P"s�Ò�ÿ9ÿòæ¡ÿIÿ�Ø�{�&N� �÷ÿeÿÊÉÿoÿô�¯�L|�Ì�ÿ?ÿóðÿBÿ�Ð�!D�¬�ñÿiÿÆÎÿmÿý�¤�Q#�w�Ó�ÿCÿêî£ÿ=ÿ�×�x'M�¦�øÿqÿÅÃÿsÿõ�¨�J%y�Ô�ÿ=ÿ£ïíÿBÿ�Ñ�yR�§�ú ÿmÿÏÈÿeÿñ�¥�G ��Ô�ÿGÿëöÿ8ÿ�Ê�t L�µ�öÿxÿÊÆÿgÿö��E.�~�Þ�ÿGÿ¤äðÿ:ÿ�Ï�j^�±�ÿÿwÿؽÿkÿé�¡�;+��ÙÿMÿ§ëøÿ5ÿ�Á�p +W�¹�ü(ÿxýؾÿ\ÿî��A3��á�ÿVÿÞúÿ+ÿ�Æ�cZ�»�ÿ'ÿ ÿÖ²ÿ^ÿå��57��äÿPÿ¸âùÿ.ÿ�Á�b e�»�ÿ2ÿýàµÿOÿâ��64��è ÿ^ÿ²Ûÿÿ#ÿ�¸�b f�Ç�ÿ/ÿùܪÿSÿè��-B��ñÿ\ÿ½Òÿ~ÿ%ú�·�W t�Ä�ÿ9ÿûè¥ÿKÿÙ��'@�¡�êÿcÿ½Òÿtÿÿ�«�Vn�Ò�ÿ<ÿíè¦ÿCÿ�Û�{�)I� �ùÿjÿÇÇÿsÿó�°�H!{�Ï�ÿ=ÿóîÿ@ÿ�Ï�}M�¬�ôÿmÿÍÊÿeÿõ�¢�L$��Ø�ÿJÿ¡äõÿ7ÿ�Ð�o R�°�þÿoÿÞ¾ºÁRvy~|t z|yu~x}x~t}wtwz{l|v{pz|}||~~{z~v ~~ ~qypw}|w|n~xy|vy}}h]}u³¬eXub¤¢dzZe¢®ozYh|lodga¥¢tvYc©s}\R{{¬_`xkkeZi¡¢w _S|m¢e`s__iefzyR\~¤vrigoqo^`¦ sy_^v¥ Y^ld«sjb]¡¥ykav}ªka~\buam ¡ef{Y]dh¡zdjW«pV[~k¥b[yiiq]d¦¨sVX}y ¥w||||u||y y r}w}||vy~z}}{yww|y|zw y~zy|x t~uz}uq~}zq m{x~r|u{z}w} |xuxzyt w yu}|rwy|z|s}zt{}r}o ~z v |uyz}|wy|yqzyq pjxz|{|mm {|uq~ruoz }hiaRj¬©hUFxz¢§Zcj Yk~`³pf[i}£©hId|{[eLo£ªsmfg® W\}annitsm\£~O`}cj^]£rzUV~¦¦xU_wxe\see}[gq £eP{~¥fjas¨}u^R¦¦_X[kp k}v§rv^Zu|lc{p«^lvgzcc Ybrj`lpj yz~}|yvosy{wuysuozmsp~nv|u }vuw}dkut| }}b|xy|woy}| }uzwr~wly~}vyv|~ z~|v ~ u~{|w y}i~} tuxsjvqm}ywm{~v{rzy||weey{tzxwh{ggZ`©{Oye¥ Ymcbzn`bz c ]Vwz¥pclm¢rz`d±¨{_lut©yZVn¡cWYkyfr¤©^]t|©joijx«[a¥~`jm`¥¡geKV¡¢{}Xr·kimdsoi^§¢rzNx~¢¦ss`pXould¤e\_q ©ux]pmnSl[pPVp£n\lr¥Txl ~ykv||y~xntusozl}}~~ry{zzv{ z}y yw {zzy~xcr{ yxl~g~ ztinqny~x{rz~z{wpksz{y xuv{zu{tq{{k{n}{z}}rxsr|omtl}uzxpm|sxv}}tyy~¡w~~{zaym{vz{}tfxv¡}b_p ¤^e^j©z_Y}¤¡SYyu{Rlcª§xvUY©qfl{oymyQ¤^o_ ¥¤zUfy`©¥`Wp` ¦lr\a}£\Z|t¡ lgfn c{TTy¨}}^\oq¦ blcq¯_hRT££h^oqhbR£bzbX¨]`z£bslb°nuaX¥Wosv¡ajhd§ts\^¤¡ |z|~yx|{yy{qvqztp~ ~}zqx~l~w|vy{}w|~z}u||pyqwu ~y }z}|z ~u}usv}wyy{ztv} o}zv}z zztiyw}}{{sslx~vq|{yu ~s| {x xu~{y |Scoghrh_ª ]Zu¦£}Utlne^h[} wVX~ ¨|f]mkxi`b¡ng^s¡V]or«¡uq_f£p|^^z£«X`kv¢¢]gcU©m]]}{{]]iiXfa\}M^~z¨]Wf^imc[w¨}sUWqx£®bdzk[eS[¦s{UZw©§aUpi¨§gaa`«o]_v¨§i\ipuzt}wzxzz|ss}{tt{{{|ww}}z{{uz{~v~y~|ypzsfx{{~y{}i rw v z}{}xy~r}vy}}yy}zw~ ~x||}}| zswnr{{vzxzrzq y~ uxzsj|{~z{|{~w|w|{}z~vwwys~usz|ozt|o}vyxyzy~{ty{{~wszxyvw{}|v~ t|u{szsq|{{h|s }zo} {u~uuuwo~{zxp{}| uz~uzz} tvuxuv}{}}y~}x~ }puzx}|vvp| y tzw{xywkqzq¯nb\¢§fQoi¢£VjqZ¨¤kvc]¤y[ewwª ldqh£unb^«vY`|p¢¡sm^m§ woWg¤¡zzXUyjªa_go©ym\d²h`[qS[^jpo]e¬¢~xe[YjfjeviZ¢~ccx~«Yeqe©heeT}¡lwYjzt¨a\uattg]~¨£y~`bt®£f\ty¨uykZyusQW i¥lTej£gm_]}¡w_Z|n¢Zktj _qZetXfp¯xglit¥~c]_}¦zVfuuª_ie£dhaf~¥y`P{sª|jWsj Zd]\¨ur_P}l~a]dw¢kvWk§s\Sx¤`uaus{en°¦_Mt¬igqfhwYSywOZlx£¡Sqtrµjvdc§{`Vq¤_jok¨¡hsm``huj®¨fWp]¢plR_ ¡Zas¤¦fVdT¤ry\b¥q{g_ t£laq`¢mpS\¦§ cat¥Xbax¡lq^c©§o[|zxustmwpn~ jvvz{h{zx} yuy|ytk~yvsv|txw~zww}z wsu|~~r~zu{w|wziu{us } |~ ~{{x{~}}{|s|~|{}zvz|}zkzwqo{|}yxo}{|z|yw|xts |~wxvljqqvu}wt|~} ~}s}qy{lxtxy}|ns|~ {w~~ | {|~yx}z||y~{yv }|uv}~|~{vz~xpxxnzov{tm|{w wwzzxxeq~ qzr{t{w|~||r}} zx~z}p}||~}vu ~~{~y~{s~} u{q zv}ln}~u}} txpup w}}|zluv| v|p|m l|rxpªx~S^zt¨^\mydfed¢¡tbY|§VUap cW^[¥gwbVz¬§ }j[k¬mnd`¢¡¡s_`zt§u\lo¤£¥b_gf¨ka\PQom¢m[c_c}bav¢¢eRzm¡¡jaXZ§¬qwYY{©}`Sxi£ctXp¨¨tsSw¢Zajk¤uhbk¡|X\¢«Qiik©¡[b`^¥p{epn{~p o~}}stv~{|z}~yu||zpwm~v v}xtoytj|w|yt}swoswt w{ }r{jq|zz}m}|}utyvyy{{e}~~wyx}}{|nuqw z|mv~ywj~r{x}jvrx{{x}{~yqy{xyxvvxowwvwto}v |wms{x^zto|{yq}yl}nry ||wxx x |p~ {~z~}}x}{~vtmm}~uxqnrw|fvu}t{sz} zy{tu|qxp yx~z q{{w}qv||}}y}z} {xyz~zjnur£eomlkhr}£rKa «§eek[gbY¯{oaZx§²}dZ`aep_\§|s]`prvX]i]dim`¤oZf¨Thtb£fem`§¥{rI[}®`Mik££or^l¥pyZav¯^cli§±wpbgqSh©¥SSpx¦¢cgk[¢ªp{fW z¦gegy_ufX¥¥{qdOOv~yno| w|u}z yxx}}~rivz~}s|~ wr}}yoy{x~~}zx}}yxwrvu|x~r zxy ~x|z|x}vww{~ ~o g}ymqys~}~q~ox{|~~~ {yq|txqwxs}|}~ylrts~t||v~z~i{styl^f{© c}]cn¦zebvw£jjra§rvjRwT`~y«gamo¡qqo_{ QoqiUkkc whf`~¨|RXu{yaj`¡`ag\¦pUp°¤gfjtkrad¤{ZW¦ bbp`¡Tum[¨s\]ve¥£`eWb©jxg`¢¨Uej \bwd_sXg¦º\Vnu ¦zWpia¦©rof\¦^Ne«edqYwk]bz£¬||`L{vVj^jrzf[«sX`leyfd°crdL±}Z`rd·Tkkc£ khfR£|r\|t¥¥jXzg¡jf[[yªq}^] _ af\_ njT_| ©rNb{§[efn¡¢o|b^®¨VW|w¢¦a]__¥pnce©tVMnz®©Ufbg®{pmU |t_~p~u}}yu|}}}~u}~ryt||}w z|t z}}{opzx{x~xsth{}lkuyx{vn{y}y x~ |tr~w| r|~x|ywvzy {zy|uy~tr} ~|{q|zzu~~~rru}{zw|~}{gq}t|vx{p~~}~ur{rY_q¢_^|d¨jje_¨re]`|¦aW||audg¨yve^¥¢YRgt¤glgD¡tbTª Y^m¦pkh]p\J]¡UYiYaYz¨kSty³ZPz]rWbi§reT] r°}]P~phdbg¡{sRV|¥x`Xhv§kkdgªsyXYwf`p¤¯Wocd¡¸|iZT²nzxk|}wl{~l~|}so~q|e~s|uxw|nxyyksriytmw~l} {||oyz}o|u x t~zmzpsxxuy ~y{{py}|}vmw zz {y{l{y|~yzlw{surm~z}xuz}vvtuzz|vztltu}{{pw{wy i~z} to{ dVv|¬ ]\yjdpl[zvZcs¦ \bvm¡¬mfcl®xmVYw}q_|iunW[¢\Vy~_Rjt\ofl¢mw\\q¨£~[_i{£etbdu{fXx ©¤_S|m£¡vimfxtY]y£¡bZjojjhP}©pwa^©¡ak}lª_f^`¨mqF^{¯aNgl lvdQ §¡sYp}svy|}{~wq{zw |qv |v y sy {uw}xr}uyx}{z {ny}~w lvzvuz| zy{uvxzwv}xxys~uv~{xdr|pv}qo|r|}w~wo{}{ tcy{y~tvys}z}r|yx~z ~z|zztw|ztx}xhv {|ylv |}xzuxw |kkwzt|nxtut zq~y{{vn|}sw|}}{y ~xv}~ ~y~} x~k~~~|{{{yx}m|u}zzyx~}zx ~n|~|uu{uuysz|~z}~{v~~|yrzy{uxvqxuu suxrrnb eXxg¤\opq£§|kd^¦ T_yy¥W]ehªnlcT¡¢xTcs¯_bkjjsZfzwT\x~£{ZXjl£sh\gvjZ~w£¦ _Xgv¡¡volH¦¦u}UXq~bbff[vec©¤tuMay¢¨a[vfor]]¢xtZXvz«T]wh esh]¤x ``|©qaejg^cnfxy os~yt}}{~xyqq{u~ze|tzpy{s w}~szy}zx||y|yz|v~ u vzhqw t|zz{{w}zzu}{{ wx{zt{svx~ ~ ~zw|}tzi}~w }zqz ttuw}x||zuz{~|{ppx¦jWX{£zXOlfbo^o¢p]`{£¬}]Yuo¬ljjm¨¥qZT aWvd¥mjlh¢¬m}fj¨v[boek__[ ¨uueSr¦¨Sh~{¤rtmexv\e¬]Xxp¡eahmlpab«|hbwa¢geXk©yx]b¥ }v[]tx§\wjn¤h}WV©¨|\T°bqbi¨~}ozyu}x||mz{t{{x}vu{~|vzx{sw~|z}wu|wuxxw}}y xu}}~py~|y z}}~~~y} v|w{|xww{xq~}yq{{j}{quzxz~}xzv{v{}}rp}zr{~o |zmv~w~{y~r|s{m[mi\cdev[ew~`ksq©l\{inqZv¢§n_ a¥ ~]alk¥ goX[« o}Tex¦´ebneqh]gn{`X|chdhlt\S¢w WYyl¨¤Y]am¢eunPy ¡pp\ru ¥bf_£]jTi {{Zkog\fhgsf]¤ ecrv¬¤ Yirf¡ rrYb rVZ~l¨_mqjkiIk©v]`~seighii]dqa_zu®¡P^io aqUg® }]Pjqkiqe`o\Z¦§~_^sb_o`¢¦mqaX«£}ZRvt§£WjpginX]¦_X|o c`gklgekªWMxu¤ mafd£zs]_~¨®w^X~m¡r_bbqked§vz]]js¤ cbhp£jt`u}x |{|vw}usw }|yvz|~z~zuty}w rx}z~|wzp{ |~wy{v{iywzyx{}wr|tr~~vt{zv{s t}u|{~r| ~ox {{rwzwvzuy{uw{r}~rvyym{wx}wu nzzz|ry~|{~|xw|xz{}{xwzr|y}{{qu~swro~ |y|{yzx~y} }{{v}{|~sxuk{~}yuxw~|{||{~ vxx~vx |w{sx~u| z}{{t|q~{~|}z xu|v{ryxs| z }ww~~ohztd\© ]isg¡ma[[¡}o_^prcjlkksa_{S`q¨Wamvmmec¢zmYTuy{UYx`¡oVS^©s}\nts¢e\yZm]c] ©}VY`¡k]ln§kceV¦vm\}¤¢Veal££lriU¢{w]`{Wglm¤ZkeX¤i}W[zu«TZxikjSg¤£v}VbmzcdwnfgYa¥s~^b i¢g\ig©©nf`_¤j`Op§ªt`mn ]piU¡kre]©¨`Q`e¤¤fjaW ¦¡x|\W ¤¡Pceo mgec§{^Zvz¥Rhx[¤¢plf[qxQbxq§\QXcjqbl«Qj|{TUrl¦lp^dt\j¥°fShm¡higSª~YVwp¶i`[kt qwx|~~~s~trfz~wn} }v~w}{yy}{ ux{}~~}|s{zos~x hz~wr{{y{{yy}}tq~sp~py}mxxq}xxx~||sou~wz{vye|zw ytzkms{tu{yk}wyun~wp| |rh`£¬u\\v{¨Zd_t£ntVVªx~cKsk¢fegg qk]b±|[cypªgrf^ hk[^ ¤_gy{§¡jgli£fofd£}tS\qz Xkg_££su\az¤xAc|s¥¦k_nf¢yt`^}¥ ZVrt¦¢^Png¢ttSb¬£{z`Z{v£bm`n£¡esYZ±¥w][vw¨_qpj¡ vw_Uz°ªtazxt~{v{ {{{t}suw{w|q}ox~}m{v}~kz|z y~|~|r~y|~zr}}ts|{x~|ytxwm~u~ zy zxx~|yw}{ozm~}y|xuy t}zwrpx} zv xw}j|x{~x~ x k\ssc`pb¥£mnaj§V^v\^lp© wg[d``i oo|[¶se`gz£hTt|¥WY]a¢ts[{¥wNTªycg`j|qMt¨¢zgkkkXk¤ wt^S¦c[~] \fnhe[_ omVnj|Vas£s`c_t rYe{t¢ nf^o¤{pfi¦§tc[¨¢£tvh |zl}z~yzrr yx~_ q{~ d~qz zhsey~~yrt w Wj{yzzow}nlwy|{~} u{sz}}qztr qm} pesu}x|~zhzu|zzzouf~~xyw|{xmmouwz~z}~yu~z| {t |bzswm{twno|zv~yvxuty|przzvwyi|xy{`r{y}wtx|}{jhwx{|}vl{}ty~zlrrpzw}}mmsq}q}}f}t{xv{pqs n|u~xyju}}qvx}ww {¦}w| {wMs~~x xuw ~w~xrku nx|t t`R¢o]{ojrthqn[Zy{WZ_WomQ ®ywf` ~ugalqª°mnOq¤wikXq¦§wdere³`gcf Zmb¢}L\{nª¨c}n qjd§¤yceqy_sim¡ ²q}]\}µ¦bXju¦b}Xg ¥\rg_RZmgª\_yS¬qV]x¶°eZxi£uZecf¦lgZ¦|v}{{xtz|~u~}{}ywyx}y~u {ysqgus}pv vptyw|s}wtu~iv{|~z{xt |z{}~~||r~k|z||{~ytwsz}}}q yszn{ ~v{~vx~{~wsii~xvq~huxy}} w}t{{~ywzt u}xuwtsx{x|yyzr\\rn¡\chi£q~Nb~|¡_Lto«cm\d«¦hyaY¤ waeu¢ajZm°u|b]z ¢y_ctn`nuhppcb¡xS`qv«f_``ªr}^`¡acp§^iqdªkwb`¨£ yObkxbTmZkyadt©{jbwpe~g ¤dzVq}¢¥aXxz£_bma£\wZb ¬¡|YXyw [j\j`r_P¯u__tw§Twa`yniN ¨¢a`xiaohd|}\_¨tQbvw¤akjfª¢yo^c{¢d[xl¡ i^ke§iv`a¨b^tmgd[g¡qr]Yy}_asr a`eX¡olc^{cWyu¡¤dhqaª h[Tdhp¥¢cgsW£wsWd¥ªd^{o¦jgd\~w~x|{y~v}v|{v}v~~v~zq}zzmuxwuynpt}v~}} yg{{{{{z} }~ zr}|z}rx vxx~{unp|vy~y}y}d|sywz |{n}r}~ux { rvqzxxy z}qxv¢pv z{{u|z|z|yv~{ycZodkhlZ|©x|Y`vp¦¥ldlc®jib^©\^}~ }|eqhm|Pg|§{|b[m¤£aX[o¡©jm_X}~e`SmOZ[lhpWa¤veJwt¨bdo_au\a vvX_}gjoiimi\ ¥³}zaPsr¨¥chua¦]dhU°y[_{¨h_bnjuUn«©}k[n¦bWlt ~{}x~{tq{zpqq|}xqv|y{ y{ypy|~ {w|ru|z||~{u~ ~ts~qxrxky { |{n {~ qY~rf}t{nzi}yuyx~oq|txyx|v|| |yyy{svzw~}xbwzz~}y}z{wi~qywtb¥¥oV`ogr_dW¤fV^_¥¤}bSo¥£tWed§hr[X¥|p^x|¥¢¨k[rlrrh[¢}{eSz{bfo[¥nifQx}PZt_±£bkdi{¦en^_¢u]dw| Xvkl«uqda¡¤| Z`|i¤¢meskxi^e¢~ZXsm¡ bRhe¨qnTb£jVW{m¥bsoo¡x|cby¨®yx }owqr {v|xz~x w}wzz|uz~y}wm}zwszuxy{{o|np~u{z{zi~}~ hn{uwr~v~q} } z~z~ ~~||z{~~~{{~xk{wy|wzrw yk{|z| |x}{y{}zwx ouqvwSw|¤¦[nen¤hkmS ¨yyTX}£Ze~dxio`°v^Yv®W`|s£¡md`mgey £}NXuq«ofZf£¡n^R´ r^nnmkZc¢¥saOv¨¦mbrnnnda^_{©§^bk}¡iiwa¤¦~~TZy«¤}[ey_¡cn`\¢¥_d¸dWqf©ngcX£}bXt¢~~zosxulx}rw}kzz{yk~ { { m}~~nvw{ |{xu{}{xzz{~zm~y~wv|y~w{xzxyww}yz|yz {yw}~n|ywy{y~x{}v~oz}y}x}y}}wu}~ |ysq|y o`\gyop]a¤¦u{__|©`Spnlp[ls teX£^Zkti{[Y¢{ucZsYij` ¤omh_©nSo}¨¦]ZvqªokclpdKeU]mb£cdP`¥z_^u¬hZwq¡pmbg ¢¥XW{©ªx`vp¢gpWd£¢lcXn¨e\iv¦lybV}£®n|aOy|¨¦W[i~mzozvwz {uyyuyxyz|}x sv{k|y||um{xc}u|~zxxm{tqyw~}z~}{y|vw| u{||~}wxzy{{ z{ ~ws}zz}z{x~yynx|w~wjxr{~{ mwy~u~g~ qyp}}zt~ xj^ds][¢~}\Yvv©cnv^¢¬lopY§§w\_q}¨¤aUxb©hjbiz|Qqudª`[ud¡_lSeskeY{w¨ ^Krp hmad¥¤q{_[y¡£\jiocx_]¨|hV~¨ ^ekoln[\ ¡xwJ[v¨ ]ZfYrldd¯¡~~Zfz¤¢}c]idorie¦oaV}¢eflo¦¥srzv~uz uys~ v} zw~~z|~ ~~m|{|v{ {{|yq{m|{|~} |uq~|ys| } }}v~|w~} y}} }y {wy z{y~k{yv} ~x{y }| uz{}zwrw{ r~uvyy |~v {v{s}} \j§`fkm£nn`]wwaVv£ jImmpqX_|{b^yªgildhld`¨W\|k¡¢a]qkjmfa ¡z ``xYYki ¢csd`£rx\e{¢¢^hhb¥ttb`¨qMcm{¢£Znmy nrj^¡¢u\]t¤¯x[[qmknZ_¨¬{a\v¨\Zandp\a¢¢{]Wt¥yv{{~{}~ tz~r}qxty|~ ty{ px~ztu~|}xt~w}|x|{x{z}}z rt|uzy{v{ut}}ws}}t|zw }~ i}~} t}u|xvrww}wv{{|{~~~ywzx{x}wxy}|{~wx~tu}wx {{zj~ªa`plkiW«¥}gMu¤e]lt§sqdU s{X[s}®¢Ylj]lff^vNakp¦^jtu £pdhg£t~Uww~¡piq`¦zsfg°~ aQl ¨Wdoc¥ppH\£©r|ZW| a_ad¡bwZS©u{Y]©¤Zyap¥msd\ ¯~{`_t¡¢`elk¦l]gJ« x}Xf{¬c^br|}{xvruuzvypwt}|}m{r~zz||{{{}}q}nst |z~v{v|zy~wzzxv~yzx yy~y |t}y}w{xm xytx| |x}zu{{{||tx}u|v} |~mb~uu\qv_Y«eer¥mYg]rzZ] g`}w¢XWpd¥wqeg}f`s¡¦acofiv^r|¡X[k{cd_klk[Z L`un¤YYoWri]Mx¬§TYfsªi\pe£ wvcXuX`p¥ebkopoZ^¦oeXms¡¥jk_u`tQ[ i^qs¥_kfl¡c}}xwwxuuspz{xxzvqy~}{}qwvzwz|}~ v|wx~}{sq~xw~w}{y xwq|}y u||zwv~}~xu~zzxv |~}y~n~{ { {}{uyz ~}|} u}y}{z { {|}y}|uz| ~{y}}{{ }xwurzyy{|}||z{|{yzzuwxkyoxzuw~ sywx} {x {~zv {zvxyyy}~~wz{}yxx p| }{y |{sszyzs vywuszyty~ r|wlyx{tu{~{kw |z~}zuy~z} | {|~zz zuv|n`tw^^m[ £vnbc{ §} W^rw¦jWs[efcgxy\as~¨_fji¡uo\iªz~X[vr¬a`ai£bxQd¢§s\_vvª_lPstyg^±iP{{¥¢]url§£ajaY «Tdyw§ddd`pi_S £¢}Tb{n¬X_nl£ol_Y¢s[Yv¢£[jul~qXe¦T`~mªyYuh ¦uir[x| `Z|r£~^_g_dpXX©f}`Tyw emUf¥gwga| ¤~wXT|v¯bfdY¤v{g^k_fs¤{\fr] ¥kqUg¥`wm£ k]tn¤nfXft[Vo¢¡`nijªiv_fy¡rbUxs¦Vcll¢jV^bYbi¦gher§exqP¬SZyo¦Vej[¥¤qlX«~atstªalhi pmad¥ c`tr¤h_eY¢os]]§¨u]`yl¤ehbg¤u{kb }]O}d¥gSpbn{P]|¡°pXYte[ocdj z{ |}}x~}|}{{sww }| ~} y|~zu~ yqz~xv~|z}y zxw u{y}u|vz{z}{}}~rky|yt rxs~zxu {{vz|m}y~z u~ xtx~ yz ~|{| |n{|yzz{ }wy{}}|wz|yzn}ym{{w{vw~|y|| vx~}~ }x{||u| ~s~~~~~p}t~y|px}~}tvy}x qyvz w{||~~|~wxttvv}zy}y{vww}~z}z{}~w}wyu}}~y~s} }z~~q{ zrv|uz}t|v{lw~zzwzsz}}y}t usy{z}~| z|ry~vr~{r}{}x~ ~qr|} |z{vx{}q }zywvx {qup~~Zve§oc_f©l|_^®~wY_xr¦¥djhe|xeY §qeY{z¢cph\¢oxg^£§zebzr¥e]gbntc`ªy}Vezi £]\lhqvT_¬`Ydl`ic xqRb¥x|cY~tecjh¢eoe[£¨bcyx£[fie¡jo_dswY^vu Yin^¢tlfYz }\cs{ r z~zzw~xysz|}{||vq~y z{y~{y w}{~u{vr}zvy |{ {}w{}{y~x}wy|wyzswxs~yy ~|y{|zly}p}swy{}yyyxq} u|u|~vuzz~y z{x~|xn{t| j xwwzokq{wu{xpsz ||{xzz~xrvpx|xz}}z{w}|~umzt{r{{xyzz{~|s|}}r||}q|wuzzty {~yqwnxtxyr{u ~|~ v| }|xsq|q~xr}|{~pt{v|ywyxyy~z}xr ~xt~~u~}zu ys}x }¢m[Ty¥}`Xos©§decU ok^c§ VO{f§jbm[ylca{¨¯hVg}rehnhYY}¦wYf}u« gco_ª¡lp]b§©rXc~w¦Tej_ªypj[¨«SSd}^eoawnWl~z}W_¢ lbi[pme]§ j{^bz ]ZUv¥¤ kp`cqysaSuy¨Ujjh¡¤mkicwyyuy|x~w k{ }|y}~yzyuz{}vx||z~ux}| rlwy y}{}tz|~vu|yz~{izow ~ {| ~ z~y|x}w xzxy }}~ y{{o~ ~w} u{wv}q|||mx or~¢¦ g^ii¤er`anvea¢¡}idpo£¤cpeT w|\ey¥^gt`hkgP«xw_e¡`dx_g[b`¥{dkUkq°rigk´w{_\i¯¡b]wr¥uphb¡¬s{_Z§{mVdpa|nb[xPE«{T\dq¥¢Xncy ª`|`b}¢dh|j£jnq^§{^c´¢RXyh«dYs`zxR[¬¡ _]iq R`hh mtW`X_ss¢]hag¡§j~j\ªZmkwYk^cvt\Vy¥jik«¢eldb¡¦njf]w_Of¢¡¡hhqf¨wweU ¤«}Zlwq¤Viid£~vWX|t¨}^Rmnkdefª¢ lyi\¤d]lr¬pe]lfqbV£°~W[rk¡Tn_j{xyts~~yrzz|x}}|xyqv w||~~qz{zz|~}| |{ty~xx||~w}|y{y}q}{r~xu{~~u|z}z|~xv| {w~xs|x|tyxvzto| {~}|s xrx|g{|}~}zx w yssw{v}yyth}jhjd©¡w~bLw££]gqj«q`cb ezdWz¤qimpjpsb iz\X ¬¦d`rf_ggm²sySj¨ \ No newline at end of file diff --git a/build/src/librtlsdr.a b/build/src/librtlsdr.a new file mode 100644 index 0000000..e2774d3 Binary files /dev/null and b/build/src/librtlsdr.a differ diff --git a/build/src/librtlsdr.so b/build/src/librtlsdr.so new file mode 120000 index 0000000..3b02137 --- /dev/null +++ b/build/src/librtlsdr.so @@ -0,0 +1 @@ +librtlsdr.so.0 \ No newline at end of file diff --git a/build/src/librtlsdr.so.0 b/build/src/librtlsdr.so.0 new file mode 120000 index 0000000..8be1ee0 --- /dev/null +++ b/build/src/librtlsdr.so.0 @@ -0,0 +1 @@ +librtlsdr.so.0.0.0 \ No newline at end of file diff --git a/build/src/librtlsdr.so.0.0.0 b/build/src/librtlsdr.so.0.0.0 new file mode 100755 index 0000000..f7cbcfd Binary files /dev/null and b/build/src/librtlsdr.so.0.0.0 differ diff --git a/build/src/rtl_433 b/build/src/rtl_433 new file mode 100755 index 0000000..96b7358 Binary files /dev/null and b/build/src/rtl_433 differ diff --git a/build/src/rtl_adsb b/build/src/rtl_adsb new file mode 100755 index 0000000..85e1d4e Binary files /dev/null and b/build/src/rtl_adsb differ diff --git a/build/src/rtl_eeprom b/build/src/rtl_eeprom new file mode 100755 index 0000000..a64a004 Binary files /dev/null and b/build/src/rtl_eeprom differ diff --git a/build/src/rtl_fm b/build/src/rtl_fm new file mode 100755 index 0000000..55e3a72 Binary files /dev/null and b/build/src/rtl_fm differ diff --git a/build/src/rtl_sdr b/build/src/rtl_sdr new file mode 100755 index 0000000..14f3af6 Binary files /dev/null and b/build/src/rtl_sdr differ diff --git a/build/src/rtl_tcp b/build/src/rtl_tcp new file mode 100755 index 0000000..cd7cef7 Binary files /dev/null and b/build/src/rtl_tcp differ diff --git a/build/src/rtl_test b/build/src/rtl_test new file mode 100755 index 0000000..30551e3 Binary files /dev/null and b/build/src/rtl_test differ diff --git a/cmake/Modules/FindLibUSB.cmake b/cmake/Modules/FindLibUSB.cmake new file mode 100644 index 0000000..97f3db6 --- /dev/null +++ b/cmake/Modules/FindLibUSB.cmake @@ -0,0 +1,28 @@ +if(NOT LIBUSB_FOUND) + pkg_check_modules (LIBUSB_PKG libusb-1.0) + find_path(LIBUSB_INCLUDE_DIR NAMES libusb.h + PATHS + ${LIBUSB_PKG_INCLUDE_DIRS} + /usr/include/libusb-1.0 + /usr/include + /usr/local/include + ) + + find_library(LIBUSB_LIBRARIES NAMES usb-1.0 + PATHS + ${LIBUSB_PKG_LIBRARY_DIRS} + /usr/lib + /usr/local/lib + ) + +if(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + set(LIBUSB_FOUND TRUE CACHE INTERNAL "libusb-1.0 found") + message(STATUS "Found libusb-1.0: ${LIBUSB_INCLUDE_DIR}, ${LIBUSB_LIBRARIES}") +else(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + set(LIBUSB_FOUND FALSE CACHE INTERNAL "libusb-1.0 found") + message(STATUS "libusb-1.0 not found.") +endif(LIBUSB_INCLUDE_DIR AND LIBUSB_LIBRARIES) + +mark_as_advanced(LIBUSB_INCLUDE_DIR LIBUSB_LIBRARIES) + +endif(NOT LIBUSB_FOUND) diff --git a/cmake/Modules/FindThreads.cmake b/cmake/Modules/FindThreads.cmake new file mode 100644 index 0000000..8028b15 --- /dev/null +++ b/cmake/Modules/FindThreads.cmake @@ -0,0 +1,246 @@ +# Updated FindThreads.cmake that supports pthread-win32 +# Downloaded from http://www.vtk.org/Bug/bug_view_advanced_page.php?bug_id=6399 + +# - This module determines the thread library of the system. +# +# The following variables are set +# CMAKE_THREAD_LIBS_INIT - the thread library +# CMAKE_USE_SPROC_INIT - are we using sproc? +# CMAKE_USE_WIN32_THREADS_INIT - using WIN32 threads? +# CMAKE_USE_PTHREADS_INIT - are we using pthreads +# CMAKE_HP_PTHREADS_INIT - are we using hp pthreads +# +# If use of pthreads-win32 is desired, the following variables +# can be set. +# +# THREADS_USE_PTHREADS_WIN32 - +# Setting this to true searches for the pthreads-win32 +# port (since CMake 2.8.0) +# +# THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME +# C = no exceptions (default) +# (NOTE: This is the default scheme on most POSIX thread +# implementations and what you should probably be using) +# CE = C++ Exception Handling +# SE = Structure Exception Handling (MSVC only) +# (NOTE: Changing this option from the default may affect +# the portability of your application. See pthreads-win32 +# documentation for more details.) +# +#====================================================== +# Example usage where threading library +# is provided by the system: +# +# find_package(Threads REQUIRED) +# add_executable(foo foo.cc) +# target_link_libraries(foo ${CMAKE_THREAD_LIBS_INIT}) +# +# Example usage if pthreads-win32 is desired on Windows +# or a system provided thread library: +# +# set(THREADS_USE_PTHREADS_WIN32 true) +# find_package(Threads REQUIRED) +# include_directories(${THREADS_PTHREADS_INCLUDE_DIR}) +# +# add_executable(foo foo.cc) +# target_link_libraries(foo ${CMAKE_THREAD_LIBS_INIT}) +# + +INCLUDE (CheckIncludeFiles) +INCLUDE (CheckLibraryExists) +SET(Threads_FOUND FALSE) + +IF(WIN32 AND NOT CYGWIN AND THREADS_USE_PTHREADS_WIN32) + SET(_Threads_ptwin32 true) +ENDIF() + +# Do we have sproc? +IF(CMAKE_SYSTEM MATCHES IRIX) + CHECK_INCLUDE_FILES("sys/types.h;sys/prctl.h" CMAKE_HAVE_SPROC_H) +ENDIF() + +IF(CMAKE_HAVE_SPROC_H) + # We have sproc + SET(CMAKE_USE_SPROC_INIT 1) + +ELSEIF(_Threads_ptwin32) + + IF(NOT DEFINED THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME) + # Assign the default scheme + SET(THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME "C") + ELSE() + # Validate the scheme specified by the user + IF(NOT THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "C" AND + NOT THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "CE" AND + NOT THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "SE") + MESSAGE(FATAL_ERROR "See documentation for FindPthreads.cmake, only C, CE, and SE modes are allowed") + ENDIF() + IF(NOT MSVC AND THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "SE") + MESSAGE(FATAL_ERROR "Structured Exception Handling is only allowed for MSVC") + ENDIF(NOT MSVC AND THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME STREQUAL "SE") + ENDIF() + + FIND_PATH(THREADS_PTHREADS_INCLUDE_DIR pthread.h) + + # Determine the library filename + IF(MSVC) + SET(_Threads_pthreads_libname + pthreadV${THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME}2) + ELSEIF(MINGW) + SET(_Threads_pthreads_libname + pthreadG${THREADS_PTHREADS_WIN32_EXCEPTION_SCHEME}2) + ELSE() + MESSAGE(FATAL_ERROR "This should never happen") + ENDIF() + + # Use the include path to help find the library if possible + SET(_Threads_lib_paths "") + IF(THREADS_PTHREADS_INCLUDE_DIR) + GET_FILENAME_COMPONENT(_Threads_root_dir + ${THREADS_PTHREADS_INCLUDE_DIR} PATH) + SET(_Threads_lib_paths ${_Threads_root_dir}/lib) + ENDIF() + FIND_LIBRARY(THREADS_PTHREADS_WIN32_LIBRARY + NAMES ${_Threads_pthreads_libname} + PATHS ${_Threads_lib_paths} + DOC "The Portable Threads Library for Win32" + NO_SYSTEM_PATH + ) + + IF(THREADS_PTHREADS_INCLUDE_DIR AND THREADS_PTHREADS_WIN32_LIBRARY) + MARK_AS_ADVANCED(THREADS_PTHREADS_INCLUDE_DIR) + SET(CMAKE_THREAD_LIBS_INIT ${THREADS_PTHREADS_WIN32_LIBRARY}) + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + SET(Threads_FOUND TRUE) + ENDIF() + + MARK_AS_ADVANCED(THREADS_PTHREADS_WIN32_LIBRARY) + +ELSE() + # Do we have pthreads? + CHECK_INCLUDE_FILES("pthread.h" CMAKE_HAVE_PTHREAD_H) + IF(CMAKE_HAVE_PTHREAD_H) + + # + # We have pthread.h + # Let's check for the library now. + # + SET(CMAKE_HAVE_THREADS_LIBRARY) + IF(NOT THREADS_HAVE_PTHREAD_ARG) + + # Do we have -lpthreads + CHECK_LIBRARY_EXISTS(pthreads pthread_create "" CMAKE_HAVE_PTHREADS_CREATE) + IF(CMAKE_HAVE_PTHREADS_CREATE) + SET(CMAKE_THREAD_LIBS_INIT "-lpthreads") + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + SET(Threads_FOUND TRUE) + ENDIF() + + # Ok, how about -lpthread + CHECK_LIBRARY_EXISTS(pthread pthread_create "" CMAKE_HAVE_PTHREAD_CREATE) + IF(CMAKE_HAVE_PTHREAD_CREATE) + SET(CMAKE_THREAD_LIBS_INIT "-lpthread") + SET(Threads_FOUND TRUE) + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + ENDIF() + + IF(CMAKE_SYSTEM MATCHES "SunOS.*") + # On sun also check for -lthread + CHECK_LIBRARY_EXISTS(thread thr_create "" CMAKE_HAVE_THR_CREATE) + IF(CMAKE_HAVE_THR_CREATE) + SET(CMAKE_THREAD_LIBS_INIT "-lthread") + SET(CMAKE_HAVE_THREADS_LIBRARY 1) + SET(Threads_FOUND TRUE) + ENDIF() + ENDIF(CMAKE_SYSTEM MATCHES "SunOS.*") + + ENDIF(NOT THREADS_HAVE_PTHREAD_ARG) + + IF(NOT CMAKE_HAVE_THREADS_LIBRARY) + # If we did not found -lpthread, -lpthread, or -lthread, look for -pthread + IF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG") + MESSAGE(STATUS "Check if compiler accepts -pthread") + TRY_RUN(THREADS_PTHREAD_ARG THREADS_HAVE_PTHREAD_ARG + ${CMAKE_BINARY_DIR} + ${CMAKE_ROOT}/Modules/CheckForPthreads.c + CMAKE_FLAGS -DLINK_LIBRARIES:STRING=-pthread + COMPILE_OUTPUT_VARIABLE OUTPUT) + + IF(THREADS_HAVE_PTHREAD_ARG) + IF(THREADS_PTHREAD_ARG MATCHES "^2$") + SET(Threads_FOUND TRUE) + MESSAGE(STATUS "Check if compiler accepts -pthread - yes") + ELSE() + MESSAGE(STATUS "Check if compiler accepts -pthread - no") + FILE(APPEND + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if compiler accepts -pthread returned ${THREADS_PTHREAD_ARG} instead of 2. The compiler had the following output:\n${OUTPUT}\n\n") + ENDIF() + ELSE() + MESSAGE(STATUS "Check if compiler accepts -pthread - no") + FILE(APPEND + ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log + "Determining if compiler accepts -pthread failed with the following output:\n${OUTPUT}\n\n") + ENDIF() + + ENDIF("THREADS_HAVE_PTHREAD_ARG" MATCHES "^THREADS_HAVE_PTHREAD_ARG") + + IF(THREADS_HAVE_PTHREAD_ARG) + SET(Threads_FOUND TRUE) + SET(CMAKE_THREAD_LIBS_INIT "-pthread") + ENDIF() + + ENDIF(NOT CMAKE_HAVE_THREADS_LIBRARY) + ENDIF(CMAKE_HAVE_PTHREAD_H) +ENDIF() + +IF(CMAKE_THREAD_LIBS_INIT) + SET(CMAKE_USE_PTHREADS_INIT 1) + SET(Threads_FOUND TRUE) +ENDIF() + +IF(CMAKE_SYSTEM MATCHES "Windows" + AND NOT THREADS_USE_PTHREADS_WIN32) + SET(CMAKE_USE_WIN32_THREADS_INIT 1) + SET(Threads_FOUND TRUE) +ENDIF() + +IF(CMAKE_USE_PTHREADS_INIT) + IF(CMAKE_SYSTEM MATCHES "HP-UX-*") + # Use libcma if it exists and can be used. It provides more + # symbols than the plain pthread library. CMA threads + # have actually been deprecated: + # http://docs.hp.com/en/B3920-90091/ch12s03.html#d0e11395 + # http://docs.hp.com/en/947/d8.html + # but we need to maintain compatibility here. + # The CMAKE_HP_PTHREADS setting actually indicates whether CMA threads + # are available. + CHECK_LIBRARY_EXISTS(cma pthread_attr_create "" CMAKE_HAVE_HP_CMA) + IF(CMAKE_HAVE_HP_CMA) + SET(CMAKE_THREAD_LIBS_INIT "-lcma") + SET(CMAKE_HP_PTHREADS_INIT 1) + SET(Threads_FOUND TRUE) + ENDIF(CMAKE_HAVE_HP_CMA) + SET(CMAKE_USE_PTHREADS_INIT 1) + ENDIF() + + IF(CMAKE_SYSTEM MATCHES "OSF1-V*") + SET(CMAKE_USE_PTHREADS_INIT 0) + SET(CMAKE_THREAD_LIBS_INIT ) + ENDIF() + + IF(CMAKE_SYSTEM MATCHES "CYGWIN_NT*") + SET(CMAKE_USE_PTHREADS_INIT 1) + SET(Threads_FOUND TRUE) + SET(CMAKE_THREAD_LIBS_INIT ) + SET(CMAKE_USE_WIN32_THREADS_INIT 0) + ENDIF() +ENDIF(CMAKE_USE_PTHREADS_INIT) + +INCLUDE(FindPackageHandleStandardArgs) +IF(_Threads_ptwin32) + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Threads DEFAULT_MSG + THREADS_PTHREADS_WIN32_LIBRARY THREADS_PTHREADS_INCLUDE_DIR) +ELSE() + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Threads DEFAULT_MSG Threads_FOUND) +ENDIF() diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in new file mode 100644 index 0000000..9ae1ae4 --- /dev/null +++ b/cmake/cmake_uninstall.cmake.in @@ -0,0 +1,32 @@ +# http://www.vtk.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F + +IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") +ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") + +FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) +STRING(REGEX REPLACE "\n" ";" files "${files}") +FOREACH(file ${files}) + MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + IF(EXISTS "$ENV{DESTDIR}${file}") + EXEC_PROGRAM( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF(NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF(NOT "${rm_retval}" STREQUAL 0) + ELSEIF(IS_SYMLINK "$ENV{DESTDIR}${file}") + EXEC_PROGRAM( + "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval + ) + IF(NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + ENDIF(NOT "${rm_retval}" STREQUAL 0) + ELSE(EXISTS "$ENV{DESTDIR}${file}") + MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + ENDIF(EXISTS "$ENV{DESTDIR}${file}") +ENDFOREACH(file) diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..a947e80 --- /dev/null +++ b/configure.ac @@ -0,0 +1,76 @@ +AC_INIT([librtlsdr], + m4_esyscmd([./git-version-gen .tarball-version]), + [osmocom-sdr@lists.osmocom.org]) + +AM_INIT_AUTOMAKE([dist-bzip2]) + +dnl kernel style compile messages +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +dnl checks for programs +AC_PROG_MAKE_SET +AC_PROG_CC +AC_PROG_INSTALL +LT_INIT +AC_PROG_LIBTOOL + +PKG_CHECK_MODULES(LIBUSB, libusb-1.0 >= 1.0) +LIBS="$LIBS $LIBUSB_LIBS" +CFLAGS="$CFLAGS $LIBUSB_CFLAGS" + +AC_PATH_PROG(DOXYGEN,doxygen,false) +AM_CONDITIONAL(HAVE_DOXYGEN, test $DOXYGEN != false) + +AC_CONFIG_MACRO_DIR([m4]) + +dnl checks for header files +AC_HEADER_STDC +AC_CHECK_HEADERS(sys/types.h) +AC_CHECK_HEADERS(pthread.h,, [AC_MSG_ERROR([pthread.h required])]) + +# pc variables +AC_SUBST(RTLSDR_PC_LIBS,["$LIBS"]) +AC_SUBST(RTLSDR_PC_CFLAGS,["$CFLAGS"]) + +dnl checks for required libraries +dnl pthreads +AC_CHECK_LIB(pthread, pthread_create, [LIBS="$LIBS -lpthread"]) + +dnl libmath (for rtl_fm) +AC_CHECK_LIB(m, atan2, [LIBS="$LIBS -lm"]) + +dnl libmath (for rtl_adsb) +AC_CHECK_LIB(m, sqrt, [LIBS="$LIBS -lm"]) + +dnl librealtime (for rtl_test) +AC_CHECK_LIB(rt, clock_gettime, [LIBS="$LIBS -lrt"]) + +# The following test is taken from WebKit's webkit.m4 +saved_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -fvisibility=hidden " +AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) +AC_COMPILE_IFELSE([AC_LANG_SOURCE([char foo;])], + [ AC_MSG_RESULT([yes]) + SYMBOL_VISIBILITY="-fvisibility=hidden"], + AC_MSG_RESULT([no])) +CFLAGS="$saved_CFLAGS" +AC_SUBST(SYMBOL_VISIBILITY) + +AC_MSG_CHECKING(whether compiler understands -Wall) +old_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wall -Wextra -Wno-unused -Wsign-compare" +AC_TRY_COMPILE([],[], + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no) + CFLAGS="$old_CFLAGS") + +dnl Generate the output +AM_CONFIG_HEADER(config.h) + +AC_OUTPUT( + librtlsdr.pc + include/Makefile + src/Makefile + Makefile + Doxyfile +) diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt new file mode 100644 index 0000000..507c0c7 --- /dev/null +++ b/include/CMakeLists.txt @@ -0,0 +1,27 @@ +# Copyright 2012 OSMOCOM Project +# +# This file is part of rtl-sdr +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + +######################################################################## +# Install public header files +######################################################################## +install(FILES + rtl-sdr.h + rtl-sdr_export.h + DESTINATION include +) diff --git a/include/Makefile.am b/include/Makefile.am new file mode 100644 index 0000000..1c45b89 --- /dev/null +++ b/include/Makefile.am @@ -0,0 +1,5 @@ +rtlsdr_HEADERS = rtl-sdr.h rtl-sdr_export.h + +noinst_HEADERS = reg_field.h rtlsdr_i2c.h tuner_e4k.h tuner_fc0012.h tuner_fc0013.h tuner_fc2580.h tuner_r820t.h + +rtlsdrdir = $(includedir) diff --git a/include/reg_field.h b/include/reg_field.h new file mode 100644 index 0000000..18a6922 --- /dev/null +++ b/include/reg_field.h @@ -0,0 +1,60 @@ +#ifndef _REG_FIELD_H +#define _REG_FIELD_H + +#include <stdint.h> +#include <stdarg.h> + +enum cmd_op { + CMD_OP_GET = (1 << 0), + CMD_OP_SET = (1 << 1), + CMD_OP_EXEC = (1 << 2), +}; + +enum pstate { + ST_IN_CMD, + ST_IN_ARG, +}; + +struct strbuf { + uint8_t idx; + char buf[32]; +}; + +struct cmd_state { + struct strbuf cmd; + struct strbuf arg; + enum pstate state; + void (*out)(const char *format, va_list ap); +}; + +struct cmd { + const char *cmd; + uint32_t ops; + int (*cb)(struct cmd_state *cs, enum cmd_op op, const char *cmd, + int argc, char **argv); + const char *help; +}; + +/* structure describing a field in a register */ +struct reg_field { + uint8_t reg; + uint8_t shift; + uint8_t width; +}; + +struct reg_field_ops { + const struct reg_field *fields; + const char **field_names; + uint32_t num_fields; + void *data; + int (*write_cb)(void *data, uint32_t reg, uint32_t val); + uint32_t (*read_cb)(void *data, uint32_t reg); +}; + +uint32_t reg_field_read(struct reg_field_ops *ops, struct reg_field *field); +int reg_field_write(struct reg_field_ops *ops, struct reg_field *field, uint32_t val); +int reg_field_cmd(struct cmd_state *cs, enum cmd_op op, + const char *cmd, int argc, char **argv, + struct reg_field_ops *ops); + +#endif diff --git a/include/rtl-sdr.h b/include/rtl-sdr.h new file mode 100644 index 0000000..75bfd3f --- /dev/null +++ b/include/rtl-sdr.h @@ -0,0 +1,366 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * Copyright (C) 2012 by Dimitri Stolnikov <horiz0n@gmx.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __RTL_SDR_H +#define __RTL_SDR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> +#include <rtl-sdr_export.h> + +typedef struct rtlsdr_dev rtlsdr_dev_t; + +RTLSDR_API uint32_t rtlsdr_get_device_count(void); + +RTLSDR_API const char* rtlsdr_get_device_name(uint32_t index); + +/*! + * Get USB device strings. + * + * NOTE: The string arguments must provide space for up to 256 bytes. + * + * \param index the device index + * \param manufact manufacturer name, may be NULL + * \param product product name, may be NULL + * \param serial serial number, may be NULL + * \return 0 on success + */ +RTLSDR_API int rtlsdr_get_device_usb_strings(uint32_t index, + char *manufact, + char *product, + char *serial); + +/*! + * Get device index by USB serial string descriptor. + * + * \param serial serial string of the device + * \return device index of first device where the name matched + * \return -1 if name is NULL + * \return -2 if no devices were found at all + * \return -3 if devices were found, but none with matching name + */ +RTLSDR_API int rtlsdr_get_index_by_serial(const char *serial); + +RTLSDR_API int rtlsdr_open(rtlsdr_dev_t **dev, uint32_t index); + +RTLSDR_API int rtlsdr_close(rtlsdr_dev_t *dev); + +/* configuration functions */ + +/*! + * Set crystal oscillator frequencies used for the RTL2832 and the tuner IC. + * + * Usually both ICs use the same clock. Changing the clock may make sense if + * you are applying an external clock to the tuner or to compensate the + * frequency (and samplerate) error caused by the original (cheap) crystal. + * + * NOTE: Call this function only if you fully understand the implications. + * + * \param dev the device handle given by rtlsdr_open() + * \param rtl_freq frequency value used to clock the RTL2832 in Hz + * \param tuner_freq frequency value used to clock the tuner IC in Hz + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_xtal_freq(rtlsdr_dev_t *dev, uint32_t rtl_freq, + uint32_t tuner_freq); + +/*! + * Get crystal oscillator frequencies used for the RTL2832 and the tuner IC. + * + * Usually both ICs use the same clock. + * + * \param dev the device handle given by rtlsdr_open() + * \param rtl_freq frequency value used to clock the RTL2832 in Hz + * \param tuner_freq frequency value used to clock the tuner IC in Hz + * \return 0 on success + */ +RTLSDR_API int rtlsdr_get_xtal_freq(rtlsdr_dev_t *dev, uint32_t *rtl_freq, + uint32_t *tuner_freq); + +/*! + * Get USB device strings. + * + * NOTE: The string arguments must provide space for up to 256 bytes. + * + * \param dev the device handle given by rtlsdr_open() + * \param manufact manufacturer name, may be NULL + * \param product product name, may be NULL + * \param serial serial number, may be NULL + * \return 0 on success + */ +RTLSDR_API int rtlsdr_get_usb_strings(rtlsdr_dev_t *dev, char *manufact, + char *product, char *serial); + +/*! + * Write the device EEPROM + * + * \param dev the device handle given by rtlsdr_open() + * \param data buffer of data to be written + * \param offset address where the data should be written + * \param len length of the data + * \return 0 on success + * \return -1 if device handle is invalid + * \return -2 if EEPROM size is exceeded + * \return -3 if no EEPROM was found + */ + +RTLSDR_API int rtlsdr_write_eeprom(rtlsdr_dev_t *dev, uint8_t *data, + uint8_t offset, uint16_t len); + +/*! + * Read the device EEPROM + * + * \param dev the device handle given by rtlsdr_open() + * \param data buffer where the data should be written + * \param offset address where the data should be read from + * \param len length of the data + * \return 0 on success + * \return -1 if device handle is invalid + * \return -2 if EEPROM size is exceeded + * \return -3 if no EEPROM was found + */ + +RTLSDR_API int rtlsdr_read_eeprom(rtlsdr_dev_t *dev, uint8_t *data, + uint8_t offset, uint16_t len); + +RTLSDR_API int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq); + +/*! + * Get actual frequency the device is tuned to. + * + * \param dev the device handle given by rtlsdr_open() + * \return 0 on error, frequency in Hz otherwise + */ +RTLSDR_API uint32_t rtlsdr_get_center_freq(rtlsdr_dev_t *dev); + +/*! + * Set the frequency correction value for the device. + * + * \param dev the device handle given by rtlsdr_open() + * \param ppm correction value in parts per million (ppm) + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_freq_correction(rtlsdr_dev_t *dev, int ppm); + +/*! + * Get actual frequency correction value of the device. + * + * \param dev the device handle given by rtlsdr_open() + * \return correction value in parts per million (ppm) + */ +RTLSDR_API int rtlsdr_get_freq_correction(rtlsdr_dev_t *dev); + +enum rtlsdr_tuner { + RTLSDR_TUNER_UNKNOWN = 0, + RTLSDR_TUNER_E4000, + RTLSDR_TUNER_FC0012, + RTLSDR_TUNER_FC0013, + RTLSDR_TUNER_FC2580, + RTLSDR_TUNER_R820T +}; + +/*! + * Get the tuner type. + * + * \param dev the device handle given by rtlsdr_open() + * \return RTLSDR_TUNER_UNKNOWN on error, tuner type otherwise + */ +RTLSDR_API enum rtlsdr_tuner rtlsdr_get_tuner_type(rtlsdr_dev_t *dev); + +/*! + * Get a list of gains supported by the tuner. + * + * NOTE: The gains argument must be preallocated by the caller. If NULL is + * being given instead, the number of available gain values will be returned. + * + * \param dev the device handle given by rtlsdr_open() + * \param gains array of gain values. In tenths of a dB, 115 means 11.5 dB. + * \return <= 0 on error, number of available (returned) gain values otherwise + */ +RTLSDR_API int rtlsdr_get_tuner_gains(rtlsdr_dev_t *dev, int *gains); + +/*! + * Set the gain for the device. + * Manual gain mode must be enabled for this to work. + * + * Valid gain values (in tenths of a dB) for the E4000 tuner: + * -10, 15, 40, 65, 90, 115, 140, 165, 190, + * 215, 240, 290, 340, 420, 430, 450, 470, 490 + * + * Valid gain values may be queried with \ref rtlsdr_get_tuner_gains function. + * + * \param dev the device handle given by rtlsdr_open() + * \param gain in tenths of a dB, 115 means 11.5 dB. + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain); + +/*! + * Get actual gain the device is configured to. + * + * \param dev the device handle given by rtlsdr_open() + * \return 0 on error, gain in tenths of a dB, 115 means 11.5 dB. + */ +RTLSDR_API int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev); + +/*! + * Set the intermediate frequency gain for the device. + * + * \param dev the device handle given by rtlsdr_open() + * \param stage intermediate frequency gain stage number (1 to 6 for E4000) + * \param gain in tenths of a dB, -30 means -3.0 dB. + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_tuner_if_gain(rtlsdr_dev_t *dev, int stage, int gain); + +/*! + * Set the gain mode (automatic/manual) for the device. + * Manual gain mode must be enabled for the gain setter function to work. + * + * \param dev the device handle given by rtlsdr_open() + * \param manual gain mode, 1 means manual gain mode shall be enabled. + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_tuner_gain_mode(rtlsdr_dev_t *dev, int manual); + +/* this will select the baseband filters according to the requested sample rate */ +RTLSDR_API int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t rate); + +/*! + * Get actual sample rate the device is configured to. + * + * \param dev the device handle given by rtlsdr_open() + * \return 0 on error, sample rate in Hz otherwise + */ +RTLSDR_API uint32_t rtlsdr_get_sample_rate(rtlsdr_dev_t *dev); + +/*! + * Enable test mode that returns an 8 bit counter instead of the samples. + * The counter is generated inside the RTL2832. + * + * \param dev the device handle given by rtlsdr_open() + * \param test mode, 1 means enabled, 0 disabled + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_testmode(rtlsdr_dev_t *dev, int on); + +/*! + * Enable or disable the internal digital AGC of the RTL2832. + * + * \param dev the device handle given by rtlsdr_open() + * \param digital AGC mode, 1 means enabled, 0 disabled + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_agc_mode(rtlsdr_dev_t *dev, int on); + +/*! + * Enable or disable the direct sampling mode. When enabled, the IF mode + * of the RTL2832 is activated, and rtlsdr_set_center_freq() will control + * the IF-frequency of the DDC, which can be used to tune from 0 to 28.8 MHz + * (xtal frequency of the RTL2832). + * + * \param dev the device handle given by rtlsdr_open() + * \param on 0 means disabled, 1 I-ADC input enabled, 2 Q-ADC input enabled + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on); + +/*! + * Get state of the direct sampling mode + * + * \param dev the device handle given by rtlsdr_open() + * \return -1 on error, 0 means disabled, 1 I-ADC input enabled + * 2 Q-ADC input enabled + */ +RTLSDR_API int rtlsdr_get_direct_sampling(rtlsdr_dev_t *dev); + +/*! + * Enable or disable offset tuning for zero-IF tuners, which allows to avoid + * problems caused by the DC offset of the ADCs and 1/f noise. + * + * \param dev the device handle given by rtlsdr_open() + * \param on 0 means disabled, 1 enabled + * \return 0 on success + */ +RTLSDR_API int rtlsdr_set_offset_tuning(rtlsdr_dev_t *dev, int on); + +/*! + * Get state of the offset tuning mode + * + * \param dev the device handle given by rtlsdr_open() + * \return -1 on error, 0 means disabled, 1 enabled + */ +RTLSDR_API int rtlsdr_get_offset_tuning(rtlsdr_dev_t *dev); + +/* streaming functions */ + +RTLSDR_API int rtlsdr_reset_buffer(rtlsdr_dev_t *dev); + +RTLSDR_API int rtlsdr_read_sync(rtlsdr_dev_t *dev, void *buf, int len, int *n_read); + +typedef void(*rtlsdr_read_async_cb_t)(unsigned char *buf, uint32_t len, void *ctx); + +/*! + * Read samples from the device asynchronously. This function will block until + * it is being canceled using rtlsdr_cancel_async() + * + * NOTE: This function is deprecated and is subject for removal. + * + * \param dev the device handle given by rtlsdr_open() + * \param cb callback function to return received samples + * \param ctx user specific context to pass via the callback function + * \return 0 on success + */ +RTLSDR_API int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx); + +/*! + * Read samples from the device asynchronously. This function will block until + * it is being canceled using rtlsdr_cancel_async() + * + * \param dev the device handle given by rtlsdr_open() + * \param cb callback function to return received samples + * \param ctx user specific context to pass via the callback function + * \param buf_num optional buffer count, buf_num * buf_len = overall buffer size + * set to 0 for default buffer count (32) + * \param buf_len optional buffer length, must be multiple of 512, + * set to 0 for default buffer length (16 * 32 * 512) + * \return 0 on success + */ +RTLSDR_API int rtlsdr_read_async(rtlsdr_dev_t *dev, + rtlsdr_read_async_cb_t cb, + void *ctx, + uint32_t buf_num, + uint32_t buf_len); + +/*! + * Cancel all pending asynchronous operations on the device. + * + * \param dev the device handle given by rtlsdr_open() + * \return 0 on success + */ +RTLSDR_API int rtlsdr_cancel_async(rtlsdr_dev_t *dev); + +#ifdef __cplusplus +} +#endif + +#endif /* __RTL_SDR_H */ diff --git a/include/rtl-sdr_export.h b/include/rtl-sdr_export.h new file mode 100644 index 0000000..69e178d --- /dev/null +++ b/include/rtl-sdr_export.h @@ -0,0 +1,47 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Hoernchen <la@tfc-server.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef RTLSDR_EXPORT_H +#define RTLSDR_EXPORT_H + +#if defined __GNUC__ +# if __GNUC__ >= 4 +# define __SDR_EXPORT __attribute__((visibility("default"))) +# define __SDR_IMPORT __attribute__((visibility("default"))) +# else +# define __SDR_EXPORT +# define __SDR_IMPORT +# endif +#elif _MSC_VER +# define __SDR_EXPORT __declspec(dllexport) +# define __SDR_IMPORT __declspec(dllimport) +#else +# define __SDR_EXPORT +# define __SDR_IMPORT +#endif + +#ifndef rtlsdr_STATIC +# ifdef rtlsdr_EXPORTS +# define RTLSDR_API __SDR_EXPORT +# else +# define RTLSDR_API __SDR_IMPORT +# endif +#else +#define RTLSDR_API +#endif +#endif /* RTLSDR_EXPORT_H */ diff --git a/include/rtlsdr_i2c.h b/include/rtlsdr_i2c.h new file mode 100644 index 0000000..7676689 --- /dev/null +++ b/include/rtlsdr_i2c.h @@ -0,0 +1,8 @@ +#ifndef __I2C_H +#define __I2C_H + +uint32_t rtlsdr_get_tuner_clock(void *dev); +int rtlsdr_i2c_write_fn(void *dev, uint8_t addr, uint8_t *buf, int len); +int rtlsdr_i2c_read_fn(void *dev, uint8_t addr, uint8_t *buf, int len); + +#endif diff --git a/include/tuner_e4k.h b/include/tuner_e4k.h new file mode 100644 index 0000000..6db6b2a --- /dev/null +++ b/include/tuner_e4k.h @@ -0,0 +1,224 @@ +#ifndef _E4K_TUNER_H +#define _E4K_TUNER_H + +/* + * Elonics E4000 tuner driver + * + * (C) 2011-2012 by Harald Welte <laforge@gnumonks.org> + * (C) 2012 by Sylvain Munaut <tnt@246tNt.com> + * (C) 2012 by Hoernchen <la@tfc-server.de> + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#define E4K_I2C_ADDR 0xc8 +#define E4K_CHECK_ADDR 0x02 +#define E4K_CHECK_VAL 0x40 + +enum e4k_reg { + E4K_REG_MASTER1 = 0x00, + E4K_REG_MASTER2 = 0x01, + E4K_REG_MASTER3 = 0x02, + E4K_REG_MASTER4 = 0x03, + E4K_REG_MASTER5 = 0x04, + E4K_REG_CLK_INP = 0x05, + E4K_REG_REF_CLK = 0x06, + E4K_REG_SYNTH1 = 0x07, + E4K_REG_SYNTH2 = 0x08, + E4K_REG_SYNTH3 = 0x09, + E4K_REG_SYNTH4 = 0x0a, + E4K_REG_SYNTH5 = 0x0b, + E4K_REG_SYNTH6 = 0x0c, + E4K_REG_SYNTH7 = 0x0d, + E4K_REG_SYNTH8 = 0x0e, + E4K_REG_SYNTH9 = 0x0f, + E4K_REG_FILT1 = 0x10, + E4K_REG_FILT2 = 0x11, + E4K_REG_FILT3 = 0x12, + // gap + E4K_REG_GAIN1 = 0x14, + E4K_REG_GAIN2 = 0x15, + E4K_REG_GAIN3 = 0x16, + E4K_REG_GAIN4 = 0x17, + // gap + E4K_REG_AGC1 = 0x1a, + E4K_REG_AGC2 = 0x1b, + E4K_REG_AGC3 = 0x1c, + E4K_REG_AGC4 = 0x1d, + E4K_REG_AGC5 = 0x1e, + E4K_REG_AGC6 = 0x1f, + E4K_REG_AGC7 = 0x20, + E4K_REG_AGC8 = 0x21, + // gap + E4K_REG_AGC11 = 0x24, + E4K_REG_AGC12 = 0x25, + // gap + E4K_REG_DC1 = 0x29, + E4K_REG_DC2 = 0x2a, + E4K_REG_DC3 = 0x2b, + E4K_REG_DC4 = 0x2c, + E4K_REG_DC5 = 0x2d, + E4K_REG_DC6 = 0x2e, + E4K_REG_DC7 = 0x2f, + E4K_REG_DC8 = 0x30, + // gap + E4K_REG_QLUT0 = 0x50, + E4K_REG_QLUT1 = 0x51, + E4K_REG_QLUT2 = 0x52, + E4K_REG_QLUT3 = 0x53, + // gap + E4K_REG_ILUT0 = 0x60, + E4K_REG_ILUT1 = 0x61, + E4K_REG_ILUT2 = 0x62, + E4K_REG_ILUT3 = 0x63, + // gap + E4K_REG_DCTIME1 = 0x70, + E4K_REG_DCTIME2 = 0x71, + E4K_REG_DCTIME3 = 0x72, + E4K_REG_DCTIME4 = 0x73, + E4K_REG_PWM1 = 0x74, + E4K_REG_PWM2 = 0x75, + E4K_REG_PWM3 = 0x76, + E4K_REG_PWM4 = 0x77, + E4K_REG_BIAS = 0x78, + E4K_REG_CLKOUT_PWDN = 0x7a, + E4K_REG_CHFILT_CALIB = 0x7b, + E4K_REG_I2C_REG_ADDR = 0x7d, + // FIXME +}; + +#define E4K_MASTER1_RESET (1 << 0) +#define E4K_MASTER1_NORM_STBY (1 << 1) +#define E4K_MASTER1_POR_DET (1 << 2) + +#define E4K_SYNTH1_PLL_LOCK (1 << 0) +#define E4K_SYNTH1_BAND_SHIF 1 + +#define E4K_SYNTH7_3PHASE_EN (1 << 3) + +#define E4K_SYNTH8_VCOCAL_UPD (1 << 2) + +#define E4K_FILT3_DISABLE (1 << 5) + +#define E4K_AGC1_LIN_MODE (1 << 4) +#define E4K_AGC1_LNA_UPDATE (1 << 5) +#define E4K_AGC1_LNA_G_LOW (1 << 6) +#define E4K_AGC1_LNA_G_HIGH (1 << 7) + +#define E4K_AGC6_LNA_CAL_REQ (1 << 4) + +#define E4K_AGC7_MIX_GAIN_AUTO (1 << 0) +#define E4K_AGC7_GAIN_STEP_5dB (1 << 5) + +#define E4K_AGC8_SENS_LIN_AUTO (1 << 0) + +#define E4K_AGC11_LNA_GAIN_ENH (1 << 0) + +#define E4K_DC1_CAL_REQ (1 << 0) + +#define E4K_DC5_I_LUT_EN (1 << 0) +#define E4K_DC5_Q_LUT_EN (1 << 1) +#define E4K_DC5_RANGE_DET_EN (1 << 2) +#define E4K_DC5_RANGE_EN (1 << 3) +#define E4K_DC5_TIMEVAR_EN (1 << 4) + +#define E4K_CLKOUT_DISABLE 0x96 + +#define E4K_CHFCALIB_CMD (1 << 0) + +#define E4K_AGC1_MOD_MASK 0xF + +enum e4k_agc_mode { + E4K_AGC_MOD_SERIAL = 0x0, + E4K_AGC_MOD_IF_PWM_LNA_SERIAL = 0x1, + E4K_AGC_MOD_IF_PWM_LNA_AUTONL = 0x2, + E4K_AGC_MOD_IF_PWM_LNA_SUPERV = 0x3, + E4K_AGC_MOD_IF_SERIAL_LNA_PWM = 0x4, + E4K_AGC_MOD_IF_PWM_LNA_PWM = 0x5, + E4K_AGC_MOD_IF_DIG_LNA_SERIAL = 0x6, + E4K_AGC_MOD_IF_DIG_LNA_AUTON = 0x7, + E4K_AGC_MOD_IF_DIG_LNA_SUPERV = 0x8, + E4K_AGC_MOD_IF_SERIAL_LNA_AUTON = 0x9, + E4K_AGC_MOD_IF_SERIAL_LNA_SUPERV = 0xa, +}; + +enum e4k_band { + E4K_BAND_VHF2 = 0, + E4K_BAND_VHF3 = 1, + E4K_BAND_UHF = 2, + E4K_BAND_L = 3, +}; + +enum e4k_mixer_filter_bw { + E4K_F_MIX_BW_27M = 0, + E4K_F_MIX_BW_4M6 = 8, + E4K_F_MIX_BW_4M2 = 9, + E4K_F_MIX_BW_3M8 = 10, + E4K_F_MIX_BW_3M4 = 11, + E4K_F_MIX_BW_3M = 12, + E4K_F_MIX_BW_2M7 = 13, + E4K_F_MIX_BW_2M3 = 14, + E4K_F_MIX_BW_1M9 = 15, +}; + +enum e4k_if_filter { + E4K_IF_FILTER_MIX, + E4K_IF_FILTER_CHAN, + E4K_IF_FILTER_RC +}; +struct e4k_pll_params { + uint32_t fosc; + uint32_t intended_flo; + uint32_t flo; + uint16_t x; + uint8_t z; + uint8_t r; + uint8_t r_idx; + uint8_t threephase; +}; + +struct e4k_state { + void *i2c_dev; + uint8_t i2c_addr; + enum e4k_band band; + struct e4k_pll_params vco; + void *rtl_dev; +}; + +int e4k_init(struct e4k_state *e4k); +int e4k_if_gain_set(struct e4k_state *e4k, uint8_t stage, int8_t value); +int e4k_mixer_gain_set(struct e4k_state *e4k, int8_t value); +int e4k_commonmode_set(struct e4k_state *e4k, int8_t value); +int e4k_tune_freq(struct e4k_state *e4k, uint32_t freq); +int e4k_tune_params(struct e4k_state *e4k, struct e4k_pll_params *p); +uint32_t e4k_compute_pll_params(struct e4k_pll_params *oscp, uint32_t fosc, uint32_t intended_flo); +int e4k_if_filter_bw_get(struct e4k_state *e4k, enum e4k_if_filter filter); +int e4k_if_filter_bw_set(struct e4k_state *e4k, enum e4k_if_filter filter, + uint32_t bandwidth); +int e4k_if_filter_chan_enable(struct e4k_state *e4k, int on); +int e4k_rf_filter_set(struct e4k_state *e4k); + +int e4k_reg_write(struct e4k_state *e4k, uint8_t reg, uint8_t val); +uint8_t e4k_reg_read(struct e4k_state *e4k, uint8_t reg); + +int e4k_manual_dc_offset(struct e4k_state *e4k, int8_t iofs, int8_t irange, int8_t qofs, int8_t qrange); +int e4k_dc_offset_calibrate(struct e4k_state *e4k); +int e4k_dc_offset_gen_table(struct e4k_state *e4k); + +int e4k_set_lna_gain(struct e4k_state *e4k, int32_t gain); +int e4k_enable_manual_gain(struct e4k_state *e4k, uint8_t manual); +int e4k_set_enh_gain(struct e4k_state *e4k, int32_t gain); +#endif /* _E4K_TUNER_H */ diff --git a/include/tuner_fc0012.h b/include/tuner_fc0012.h new file mode 100644 index 0000000..9dd5356 --- /dev/null +++ b/include/tuner_fc0012.h @@ -0,0 +1,36 @@ +/* + * Fitipower FC0012 tuner driver + * + * Copyright (C) 2012 Hans-Frieder Vogt <hfvogt@gmx.net> + * + * modified for use in librtlsdr + * Copyright (C) 2012 Steve Markgraf <steve@steve-m.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef _FC0012_H_ +#define _FC0012_H_ + +#define FC0012_I2C_ADDR 0xc6 +#define FC0012_CHECK_ADDR 0x00 +#define FC0012_CHECK_VAL 0xa1 + +int fc0012_init(void *dev); +int fc0012_set_params(void *dev, uint32_t freq, uint32_t bandwidth); +int fc0012_set_gain(void *dev, int gain); + +#endif diff --git a/include/tuner_fc0013.h b/include/tuner_fc0013.h new file mode 100644 index 0000000..68a26ee --- /dev/null +++ b/include/tuner_fc0013.h @@ -0,0 +1,37 @@ +/* + * Fitipower FC0013 tuner driver + * + * Copyright (C) 2012 Hans-Frieder Vogt <hfvogt@gmx.net> + * + * modified for use in librtlsdr + * Copyright (C) 2012 Steve Markgraf <steve@steve-m.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#ifndef _FC0013_H_ +#define _FC0013_H_ + +#define FC0013_I2C_ADDR 0xc6 +#define FC0013_CHECK_ADDR 0x00 +#define FC0013_CHECK_VAL 0xa3 + +int fc0013_init(void *dev); +int fc0013_set_params(void *dev, uint32_t freq, uint32_t bandwidth); +int fc0013_set_gain_mode(void *dev, int manual); +int fc0013_set_lna_gain(void *dev, int gain); + +#endif diff --git a/include/tuner_fc2580.h b/include/tuner_fc2580.h new file mode 100644 index 0000000..9ebd935 --- /dev/null +++ b/include/tuner_fc2580.h @@ -0,0 +1,127 @@ +#ifndef __TUNER_FC2580_H +#define __TUNER_FC2580_H + +#define BORDER_FREQ 2600000 //2.6GHz : The border frequency which determines whether Low VCO or High VCO is used +#define USE_EXT_CLK 0 //0 : Use internal XTAL Oscillator / 1 : Use External Clock input +#define OFS_RSSI 57 + +#define FC2580_I2C_ADDR 0xac +#define FC2580_CHECK_ADDR 0x01 +#define FC2580_CHECK_VAL 0x56 + +typedef enum { + FC2580_UHF_BAND, + FC2580_L_BAND, + FC2580_VHF_BAND, + FC2580_NO_BAND +} fc2580_band_type; + +typedef enum { + FC2580_FCI_FAIL, + FC2580_FCI_SUCCESS +} fc2580_fci_result_type; + +enum FUNCTION_STATUS +{ + FUNCTION_SUCCESS, + FUNCTION_ERROR, +}; + +extern void fc2580_wait_msec(void *pTuner, int a); + +fc2580_fci_result_type fc2580_i2c_write(void *pTuner, unsigned char reg, unsigned char val); +fc2580_fci_result_type fc2580_i2c_read(void *pTuner, unsigned char reg, unsigned char *read_data); + +/*============================================================================== + fc2580 initial setting + + This function is a generic function which gets called to initialize + + fc2580 in DVB-H mode or L-Band TDMB mode + + <input parameter> + + ifagc_mode + type : integer + 1 : Internal AGC + 2 : Voltage Control Mode + +==============================================================================*/ +fc2580_fci_result_type fc2580_set_init(void *pTuner, int ifagc_mode, unsigned int freq_xtal ); + +/*============================================================================== + fc2580 frequency setting + + This function is a generic function which gets called to change LO Frequency + + of fc2580 in DVB-H mode or L-Band TDMB mode + + <input parameter> + + f_lo + Value of target LO Frequency in 'kHz' unit + ex) 2.6GHz = 2600000 + +==============================================================================*/ +fc2580_fci_result_type fc2580_set_freq(void *pTuner, unsigned int f_lo, unsigned int freq_xtal ); + + +/*============================================================================== + fc2580 filter BW setting + + This function is a generic function which gets called to change Bandwidth + + frequency of fc2580's channel selection filter + + <input parameter> + + filter_bw + 1 : 1.53MHz(TDMB) + 6 : 6MHz + 7 : 7MHz + 8 : 7.8MHz + + +==============================================================================*/ +fc2580_fci_result_type fc2580_set_filter( void *pTuner, unsigned char filter_bw, unsigned int freq_xtal ); + +// The following context is FC2580 tuner API source code +// Definitions + +// AGC mode +enum FC2580_AGC_MODE +{ + FC2580_AGC_INTERNAL = 1, + FC2580_AGC_EXTERNAL = 2, +}; + + +// Bandwidth mode +enum FC2580_BANDWIDTH_MODE +{ + FC2580_BANDWIDTH_1530000HZ = 1, + FC2580_BANDWIDTH_6000000HZ = 6, + FC2580_BANDWIDTH_7000000HZ = 7, + FC2580_BANDWIDTH_8000000HZ = 8, +}; + +// Manipulaing functions +int +fc2580_Initialize( + void *pTuner + ); + +int +fc2580_SetRfFreqHz( + void *pTuner, + unsigned long RfFreqHz + ); + +// Extra manipulaing functions +int +fc2580_SetBandwidthMode( + void *pTuner, + int BandwidthMode + ); + +#endif diff --git a/include/tuner_r820t.h b/include/tuner_r820t.h new file mode 100644 index 0000000..f9bd4cf --- /dev/null +++ b/include/tuner_r820t.h @@ -0,0 +1,196 @@ +#ifndef _R820T_TUNER_H +#define _R820T_TUNER_H + +#define R820T_I2C_ADDR 0x34 +#define R820T_CHECK_ADDR 0x00 +#define R820T_CHECK_VAL 0x69 + +#define R820T_IF_FREQ 3570000 + +//*************************************************************** +//* INCLUDES.H +//*************************************************************** +#define VERSION "R820T_v1.49_ASTRO" +#define VER_NUM 49 + +#define USE_16M_XTAL FALSE +#define R828_Xtal 28800 + +#define USE_DIPLEXER FALSE +#define TUNER_CLK_OUT TRUE + +#ifndef _UINT_X_ +#define _UINT_X_ 1 +typedef unsigned char UINT8; +typedef unsigned short UINT16; +typedef unsigned int UINT32; +#endif + +#define TRUE 1 +#define FALSE 0 + +#define FUNCTION_SUCCESS 0 +#define FUNCTION_ERROR -1 + +typedef enum _R828_ErrCode +{ + RT_Success, + RT_Fail +}R828_ErrCode; + +typedef enum _Rafael_Chip_Type //Don't modify chip list +{ + R828 = 0, + R828D, + R828S, + R820T, + R820C, + R620D, + R620S +}Rafael_Chip_Type; +//----------------------------------------------------------// +// R828 Parameter // +//----------------------------------------------------------// + +extern UINT8 R828_ADDRESS; + +#define DIP_FREQ 320000 +#define IMR_TRIAL 9 +#define VCO_pwr_ref 0x02 + +extern UINT32 R828_IF_khz; +extern UINT32 R828_CAL_LO_khz; +extern UINT8 R828_IMR_point_num; +extern UINT8 R828_IMR_done_flag; +extern UINT8 Rafael_Chip; + +typedef enum _R828_Standard_Type //Don't remove standand list!! +{ + NTSC_MN = 0, + PAL_I, + PAL_DK, + PAL_B_7M, //no use + PAL_BGH_8M, //for PAL B/G, PAL G/H + SECAM_L, + SECAM_L1_INV, //for SECAM L' + SECAM_L1, //no use + ATV_SIZE, + DVB_T_6M = ATV_SIZE, + DVB_T_7M, + DVB_T_7M_2, + DVB_T_8M, + DVB_T2_6M, + DVB_T2_7M, + DVB_T2_7M_2, + DVB_T2_8M, + DVB_T2_1_7M, + DVB_T2_10M, + DVB_C_8M, + DVB_C_6M, + ISDB_T, + DTMB, + R828_ATSC, + FM, + STD_SIZE +}R828_Standard_Type; + +extern UINT8 R828_Fil_Cal_flag[STD_SIZE]; + +typedef enum _R828_SetFreq_Type +{ + FAST_MODE = TRUE, + NORMAL_MODE = FALSE +}R828_SetFreq_Type; + +typedef enum _R828_LoopThrough_Type +{ + LOOP_THROUGH = TRUE, + SIGLE_IN = FALSE +}R828_LoopThrough_Type; + + +typedef enum _R828_InputMode_Type +{ + AIR_IN = 0, + CABLE_IN_1, + CABLE_IN_2 +}R828_InputMode_Type; + +typedef enum _R828_IfAgc_Type +{ + IF_AGC1 = 0, + IF_AGC2 +}R828_IfAgc_Type; + +typedef enum _R828_GPIO_Type +{ + HI_SIG = TRUE, + LO_SIG = FALSE +}R828_GPIO_Type; + +typedef struct _R828_Set_Info +{ + UINT32 RF_Hz; + UINT32 RF_KHz; + R828_Standard_Type R828_Standard; + R828_LoopThrough_Type RT_Input; + R828_InputMode_Type RT_InputMode; + R828_IfAgc_Type R828_IfAgc_Select; +}R828_Set_Info; + +typedef struct _R828_RF_Gain_Info +{ + UINT8 RF_gain1; + UINT8 RF_gain2; + UINT8 RF_gain_comb; +}R828_RF_Gain_Info; + +typedef enum _R828_RF_Gain_TYPE +{ + RF_AUTO = 0, + RF_MANUAL +}R828_RF_Gain_TYPE; + +typedef struct _R828_I2C_LEN_TYPE +{ + UINT8 RegAddr; + UINT8 Data[50]; + UINT8 Len; +}R828_I2C_LEN_TYPE; + +typedef struct _R828_I2C_TYPE +{ + UINT8 RegAddr; + UINT8 Data; +}R828_I2C_TYPE; +//----------------------------------------------------------// +// R828 Function // +//----------------------------------------------------------// +R828_ErrCode R828_Init(void *pTuner); +R828_ErrCode R828_Standby(void *pTuner, R828_LoopThrough_Type R828_LoopSwitch); +R828_ErrCode R828_GPIO(void *pTuner, R828_GPIO_Type R828_GPIO_Conrl); +R828_ErrCode R828_SetStandard(void *pTuner, R828_Standard_Type RT_Standard); +R828_ErrCode R828_SetFrequency(void *pTuner, R828_Set_Info R828_INFO, R828_SetFreq_Type R828_SetFreqMode); +R828_ErrCode R828_GetRfGain(void *pTuner, R828_RF_Gain_Info *pR828_rf_gain); +R828_ErrCode R828_SetRfGain(void *pTuner, int gain); +R828_ErrCode R828_RfGainMode(void *pTuner, int manual); + +int +r820t_SetRfFreqHz( + void *pTuner, + unsigned long RfFreqHz + ); + +int +r820t_SetStandardMode( + void *pTuner, + int StandardMode + ); + +int +r820t_SetStandby( + void *pTuner, + int LoopThroughType + ); + +#endif /* _R820T_TUNER_H */ diff --git a/librtlsdr.pc.in b/librtlsdr.pc.in new file mode 100644 index 0000000..5e55049 --- /dev/null +++ b/librtlsdr.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: RTL-SDR Library +Description: C Utility Library +Version: @VERSION@ +Cflags: -I${includedir}/ @RTLSDR_PC_CFLAGS@ +Libs: -L${libdir} -lrtlsdr -lusb-1.0 +Libs.private: @RTLSDR_PC_LIBS@ diff --git a/m4/.gitignore b/m4/.gitignore new file mode 100644 index 0000000..64d9bbc --- /dev/null +++ b/m4/.gitignore @@ -0,0 +1,2 @@ +/libtool.m4 +/lt*.m4 diff --git a/rtl-sdr.rules b/rtl-sdr.rules new file mode 100644 index 0000000..1f68c45 --- /dev/null +++ b/rtl-sdr.rules @@ -0,0 +1,101 @@ +# +# Copyright 2012 Osmocom rtl-sdr project +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +# original RTL2832U vid/pid (hama nano, for example) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2832", MODE:="0666" + +# ezcap EzTV668 (E4000) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", MODE:="0666" + +# Terratec Cinergy T Stick Black (rev 1) (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00a9", MODE:="0666" + +# Terratec NOXON rev 1 (FC0013) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b3", MODE:="0666" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b4", MODE:="0666" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00b7", MODE:="0666" +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00c6", MODE:="0666" + +# Terratec Cinergy T Stick RC (Rev.3) (E4000) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00d3", MODE:="0666" + +# Terratec T Stick PLUS (E4000) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00d7", MODE:="0666" + +# Terratec NOXON rev 2 (E4000) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0ccd", ATTRS{idProduct}=="00e0", MODE:="0666" + +# PixelView PV-DT235U(RN) (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1554", ATTRS{idProduct}=="5020", MODE:="0666" + +# Compro Videomate U620F (E4000) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0620", MODE:="0666" + +# Compro Videomate U650F (E4000) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0650", MODE:="0666" + +# Compro Videomate U680F (E4000) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="185b", ATTRS{idProduct}=="0680", MODE:="0666" + +# Sweex DVB-T USB (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="a803", MODE:="0666" + +# GTek T803 (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="b803", MODE:="0666" + +# Lifeview LV5TDeluxe (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="c803", MODE:="0666" + +# MyGica TD312 (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="d286", MODE:="0666" + +# PROlectrix DV107669 (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1f4d", ATTRS{idProduct}=="d803", MODE:="0666" + +# Zaapa ZT-MINDVBZP (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d398", MODE:="0666" + +# Twintech UT-40 (FC0013) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d3a4", MODE:="0666" + +# Dexatek DK DVB-T Dongle (Logilink VG0002A) (FC2580) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1101", MODE:="0666" + +# Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1102", MODE:="0666" + +# Dexatek DK 5217 DVB-T Dongle (FC2580) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1103", MODE:="0666" + +# MSI DigiVox Micro HD (FC2580) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d19", ATTRS{idProduct}=="1104", MODE:="0666" + +# Genius TVGo DVB-T03 USB dongle (Ver. B) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="0458", ATTRS{idProduct}=="707f", MODE:="0666" + +# GIGABYTE GT-U7300 (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d393", MODE:="0666" + +# DIKOM USB-DVBT HD +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d394", MODE:="0666" + +# Peak 102569AGPK (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d395", MODE:="0666" + +# SVEON STV20 DVB-T USB & FM (FC0012) +SUBSYSTEMS=="usb", ATTRS{idVendor}=="1b80", ATTRS{idProduct}=="d39d", MODE:="0666" + diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..66fbda8 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,140 @@ +# Copyright 2012 OSMOCOM Project +# +# This file is part of rtl-sdr +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR 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 Radio; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. + +######################################################################## +# Setup library +######################################################################## +add_library(rtlsdr_shared SHARED + librtlsdr.c + tuner_e4k.c + tuner_fc0012.c + tuner_fc0013.c + tuner_fc2580.c + tuner_r820t.c +) + +target_link_libraries(rtlsdr_shared + ${LIBUSB_LIBRARIES} +) + +set_target_properties(rtlsdr_shared PROPERTIES DEFINE_SYMBOL "rtlsdr_EXPORTS") +set_target_properties(rtlsdr_shared PROPERTIES OUTPUT_NAME rtlsdr) +set_target_properties(rtlsdr_shared PROPERTIES SOVERSION 0 VERSION 0.0.0) + +add_library(rtlsdr_static STATIC + librtlsdr.c + tuner_e4k.c + tuner_fc0012.c + tuner_fc0013.c + tuner_fc2580.c + tuner_r820t.c +) + +if(WIN32) +add_library(libgetopt_static STATIC + getopt/getopt.c +) +endif() + +target_link_libraries(rtlsdr_static + ${LIBUSB_LIBRARIES} +) + +set_property(TARGET rtlsdr_static APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) + +if(NOT WIN32) +# Force same library filename for static and shared variants of the library +set_target_properties(rtlsdr_static PROPERTIES OUTPUT_NAME rtlsdr) +endif() + +######################################################################## +# Build utility +######################################################################## +add_executable(rtl_sdr rtl_sdr.c) +add_executable(rtl_tcp rtl_tcp.c) +add_executable(rtl_test rtl_test.c) +add_executable(rtl_fm rtl_fm.c) +add_executable(rtl_eeprom rtl_eeprom.c) +add_executable(rtl_adsb rtl_adsb.c) +add_executable(rtl_433 rtl_433.c) +set(INSTALL_TARGETS rtlsdr_shared rtlsdr_static rtl_sdr rtl_tcp rtl_test rtl_fm rtl_eeprom rtl_adsb rtl_433) + +target_link_libraries(rtl_sdr rtlsdr_shared + ${LIBUSB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) +target_link_libraries(rtl_tcp rtlsdr_shared + ${LIBUSB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) +target_link_libraries(rtl_test rtlsdr_shared + ${LIBUSB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) +target_link_libraries(rtl_fm rtlsdr_shared + ${LIBUSB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) +target_link_libraries(rtl_433 rtlsdr_shared + ${LIBUSB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) +target_link_libraries(rtl_eeprom rtlsdr_shared + ${LIBUSB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) +target_link_libraries(rtl_adsb rtlsdr_shared + ${LIBUSB_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) +if(UNIX) +target_link_libraries(rtl_fm m) +target_link_libraries(rtl_433 m) +target_link_libraries(rtl_adsb m) +if(APPLE) + target_link_libraries(rtl_test m) +else() + target_link_libraries(rtl_test m rt) +endif() +endif() + +if(WIN32) +target_link_libraries(rtl_sdr libgetopt_static) +target_link_libraries(rtl_tcp libgetopt_static) +target_link_libraries(rtl_test libgetopt_static) +target_link_libraries(rtl_fm libgetopt_static) +target_link_libraries(rtl_433 libgetopt_static) +target_link_libraries(rtl_eeprom libgetopt_static) +target_link_libraries(rtl_adsb libgetopt_static) +set_property(TARGET rtl_sdr APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) +set_property(TARGET rtl_tcp APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) +set_property(TARGET rtl_test APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) +set_property(TARGET rtl_fm APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) +set_property(TARGET rtl_433 APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) +set_property(TARGET rtl_eeprom APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) +set_property(TARGET rtl_adsb APPEND PROPERTY COMPILE_DEFINITIONS "rtlsdr_STATIC" ) +endif() +######################################################################## +# Install built library files & utilities +######################################################################## +install(TARGETS ${INSTALL_TARGETS} + LIBRARY DESTINATION lib${LIB_SUFFIX} # .so/.dylib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file + RUNTIME DESTINATION bin # .dll file +) diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100755 index 0000000..be48fbd --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,34 @@ +# This is _NOT_ the library release version, it's an API version. +# Please read Chapter 6 "Library interface versions" of the libtool documentation before making any modification +LIBVERSION=0:0:0 + +INCLUDES = $(all_includes) -I$(top_srcdir)/include +AM_CFLAGS = ${CFLAGS} -fPIC ${SYMBOL_VISIBILITY} + +lib_LTLIBRARIES = librtlsdr.la + +librtlsdr_la_SOURCES = librtlsdr.c tuner_e4k.c tuner_fc0012.c tuner_fc0013.c tuner_fc2580.c tuner_r820t.c +librtlsdr_la_LDFLAGS = -version-info $(LIBVERSION) + +bin_PROGRAMS = rtl_sdr rtl_tcp rtl_test rtl_fm rtl_eeprom rtl_adsb rtl_433 + +rtl_sdr_SOURCES = rtl_sdr.c +rtl_sdr_LDADD = librtlsdr.la + +rtl_tcp_SOURCES = rtl_tcp.c +rtl_tcp_LDADD = librtlsdr.la + +rtl_test_SOURCES = rtl_test.c +rtl_test_LDADD = librtlsdr.la $(LIBM) + +rtl_fm_SOURCES = rtl_fm.c +rtl_fm_LDADD = librtlsdr.la $(LIBM) + +rtl_eeprom_SOURCES = rtl_eeprom.c +rtl_eeprom_LDADD = librtlsdr.la $(LIBM) + +rtl_adsb_SOURCES = rtl_adsb.c +rtl_adsb_LDADD = librtlsdr.la $(LIBM) + +rtl_433_SOURCES = rtl_433.c +rtl_433_LDADD = librtlsdr.la $(LIBM) diff --git a/src/getopt/getopt.c b/src/getopt/getopt.c new file mode 100644 index 0000000..f1d461a --- /dev/null +++ b/src/getopt/getopt.c @@ -0,0 +1,1059 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ +/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. + Ditto for AIX 3.2 and <stdlib.h>. */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#if !defined __STDC__ || !__STDC__ +/* This is a separate conditional since some stdc systems + reject `defined (const)'. */ +# ifndef const +# define const +# endif +#endif + +#include <stdio.h> + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include <gnu-versions.h> +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include <stdlib.h> +# include <unistd.h> +#endif /* GNU C library. */ + +#ifdef VMS +# include <unixlib.h> +# if HAVE_STRING_H - 0 +# include <string.h> +# endif +#endif + +#ifndef _ +/* This is for other GNU distributions with internationalized messages. */ +# if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC +# include <libintl.h> +# ifndef _ +# define _(msgid) gettext (msgid) +# endif +# else +# define _(msgid) (msgid) +# endif +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + +int __getopt_initialized; + +/* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + +static char *nextchar; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + +static enum +{ + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER +} ordering; + +/* Value of POSIXLY_CORRECT environment variable. */ +static char *posixly_correct; + +#ifdef __GNU_LIBRARY__ +/* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ +# include <string.h> +# define my_index strchr +#else + +# if 1 //HAVE_STRING_H +# include <string.h> +# else +# include <strings.h> +# endif + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +#ifdef _MSC_VER +// DDK will complain if you don't use the stdlib defined getenv +#include <stdlib.h> +#else +extern char *getenv (); +#endif +#endif + +static char * +my_index (str, chr) + const char *str; + int chr; +{ + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; +} + +/* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ +#ifdef __GNUC__ +/* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ +# if (!defined __STDC__ || !__STDC__) && !defined strlen +/* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ +extern int strlen (const char *); +# endif /* not __STDC__ */ +#endif /* __GNUC__ */ + +#endif /* not __GNU_LIBRARY__ */ + +/* Handle permutation of arguments. */ + +/* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + +static int first_nonopt; +static int last_nonopt; + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; + +static int nonoption_flags_max_len; +static int nonoption_flags_len; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +#if defined __STDC__ && __STDC__ +static void exchange (char **); +#endif + +static void +exchange (argv) + char **argv; +{ + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; +} + +/* Initialize the internal data when the first call is made. */ + +#if defined __STDC__ && __STDC__ +static const char *_getopt_initialize (int, char *const *, const char *); +#endif +static const char * +_getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (posixly_correct == NULL + && argc == __libc_argc && argv == __libc_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; +{ + int print_errors = opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) +#else +# define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') +#endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (print_errors) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (print_errors) + fprintf (stderr, _("\ + %s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (print_errors) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } +} + +int +getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (argc, argv) + int argc; + char **argv; +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/src/getopt/getopt.h b/src/getopt/getopt.h new file mode 100644 index 0000000..a1b8dd6 --- /dev/null +++ b/src/getopt/getopt.h @@ -0,0 +1,180 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994, 1996-1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include <features.h>, but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include <ctype.h>, which will pull in <features.h> for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include <ctype.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ +# if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; +# else + char *name; +# endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#if (defined __STDC__ && __STDC__) || defined __cplusplus +# ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int __argc, char *const *__argv, const char *__shortopts); +# else /* not __GNU_LIBRARY__ */ +extern int getopt (); +# endif /* __GNU_LIBRARY__ */ + +# ifndef __need_getopt +extern int getopt_long (int __argc, char *const *__argv, const char *__shortopts, + const struct option *__longopts, int *__longind); +extern int getopt_long_only (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + +/* Internal only. Users should not call this directly. */ +extern int _getopt_internal (int __argc, char *const *__argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); +# endif +#else /* not __STDC__ */ +extern int getopt (); +# ifndef __need_getopt +extern int getopt_long (); +extern int getopt_long_only (); + +extern int _getopt_internal (); +# endif +#endif /* __STDC__ */ + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/src/librtlsdr.c b/src/librtlsdr.c new file mode 100644 index 0000000..50c536a --- /dev/null +++ b/src/librtlsdr.c @@ -0,0 +1,1696 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * Copyright (C) 2012 by Dimitri Stolnikov <horiz0n@gmx.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#ifndef _WIN32 +#include <unistd.h> +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#include <libusb.h> + +/* + * All libusb callback functions should be marked with the LIBUSB_CALL macro + * to ensure that they are compiled with the same calling convention as libusb. + * + * If the macro isn't available in older libusb versions, we simply define it. + */ +#ifndef LIBUSB_CALL +#define LIBUSB_CALL +#endif + +/* two raised to the power of n */ +#define TWO_POW(n) ((double)(1ULL<<(n))) + +#include "rtl-sdr.h" +#include "tuner_e4k.h" +#include "tuner_fc0012.h" +#include "tuner_fc0013.h" +#include "tuner_fc2580.h" +#include "tuner_r820t.h" + +typedef struct rtlsdr_tuner_iface { + /* tuner interface */ + int (*init)(void *); + int (*exit)(void *); + int (*set_freq)(void *, uint32_t freq /* Hz */); + int (*set_bw)(void *, int bw /* Hz */); + int (*set_gain)(void *, int gain /* tenth dB */); + int (*set_if_gain)(void *, int stage, int gain /* tenth dB */); + int (*set_gain_mode)(void *, int manual); +} rtlsdr_tuner_iface_t; + +enum rtlsdr_async_status { + RTLSDR_INACTIVE = 0, + RTLSDR_CANCELING, + RTLSDR_RUNNING +}; + +struct rtlsdr_dev { + libusb_context *ctx; + struct libusb_device_handle *devh; + uint32_t xfer_buf_num; + uint32_t xfer_buf_len; + struct libusb_transfer **xfer; + unsigned char **xfer_buf; + rtlsdr_read_async_cb_t cb; + void *cb_ctx; + enum rtlsdr_async_status async_status; + /* rtl demod context */ + uint32_t rate; /* Hz */ + uint32_t rtl_xtal; /* Hz */ + int direct_sampling; + /* tuner context */ + enum rtlsdr_tuner tuner_type; + rtlsdr_tuner_iface_t *tuner; + uint32_t tun_xtal; /* Hz */ + uint32_t freq; /* Hz */ + uint32_t offs_freq; /* Hz */ + int corr; /* ppm */ + int gain; /* tenth dB */ + struct e4k_state e4k_s; +}; + +void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val); + +/* generic tuner interface functions, shall be moved to the tuner implementations */ +int e4000_init(void *dev) { + rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev; + devt->e4k_s.i2c_addr = E4K_I2C_ADDR; + rtlsdr_get_xtal_freq(devt, NULL, &devt->e4k_s.vco.fosc); + devt->e4k_s.rtl_dev = dev; + return e4k_init(&devt->e4k_s); +} +int e4000_exit(void *dev) { return 0; } +int e4000_set_freq(void *dev, uint32_t freq) { + rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev; + return e4k_tune_freq(&devt->e4k_s, freq); +} + +int e4000_set_bw(void *dev, int bw) { + int r = 0; + rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev; + + r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_MIX, bw); + r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_RC, bw); + r |= e4k_if_filter_bw_set(&devt->e4k_s, E4K_IF_FILTER_CHAN, bw); + + return r; +} + +int e4000_set_gain(void *dev, int gain) { + rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev; + int mixgain = (gain > 340) ? 12 : 4; +#if 0 + int enhgain = (gain - 420); +#endif + if(e4k_set_lna_gain(&devt->e4k_s, min(300, gain - mixgain * 10)) == -EINVAL) + return -1; + if(e4k_mixer_gain_set(&devt->e4k_s, mixgain) == -EINVAL) + return -1; +#if 0 /* enhanced mixer gain seems to have no effect */ + if(enhgain >= 0) + if(e4k_set_enh_gain(&devt->e4k_s, enhgain) == -EINVAL) + return -1; +#endif + return 0; +} +int e4000_set_if_gain(void *dev, int stage, int gain) { + rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev; + return e4k_if_gain_set(&devt->e4k_s, (uint8_t)stage, (int8_t)(gain / 10)); +} +int e4000_set_gain_mode(void *dev, int manual) { + rtlsdr_dev_t* devt = (rtlsdr_dev_t*)dev; + return e4k_enable_manual_gain(&devt->e4k_s, manual); +} + +int _fc0012_init(void *dev) { return fc0012_init(dev); } +int fc0012_exit(void *dev) { return 0; } +int fc0012_set_freq(void *dev, uint32_t freq) { + /* select V-band/U-band filter */ + rtlsdr_set_gpio_bit(dev, 6, (freq > 300000000) ? 1 : 0); + return fc0012_set_params(dev, freq, 6000000); +} +int fc0012_set_bw(void *dev, int bw) { return 0; } +int _fc0012_set_gain(void *dev, int gain) { return fc0012_set_gain(dev, gain); } +int fc0012_set_gain_mode(void *dev, int manual) { return 0; } + +int _fc0013_init(void *dev) { return fc0013_init(dev); } +int fc0013_exit(void *dev) { return 0; } +int fc0013_set_freq(void *dev, uint32_t freq) { + return fc0013_set_params(dev, freq, 6000000); +} +int fc0013_set_bw(void *dev, int bw) { return 0; } +int _fc0013_set_gain(void *dev, int gain) { return fc0013_set_lna_gain(dev, gain); } + +int fc2580_init(void *dev) { return fc2580_Initialize(dev); } +int fc2580_exit(void *dev) { return 0; } +int _fc2580_set_freq(void *dev, uint32_t freq) { + return fc2580_SetRfFreqHz(dev, freq); +} +int fc2580_set_bw(void *dev, int bw) { return fc2580_SetBandwidthMode(dev, 1); } +int fc2580_set_gain(void *dev, int gain) { return 0; } +int fc2580_set_gain_mode(void *dev, int manual) { return 0; } + +int r820t_init(void *dev) { + int r = R828_Init(dev); + r820t_SetStandardMode(dev, DVB_T_6M); + return r; +} +int r820t_exit(void *dev) { return 0; } +int r820t_set_freq(void *dev, uint32_t freq) { return r820t_SetRfFreqHz(dev, freq); } +int r820t_set_bw(void *dev, int bw) { return 0; } +int r820t_set_gain(void *dev, int gain) { return R828_SetRfGain(dev, gain); } +int r820t_set_gain_mode(void *dev, int manual) { return R828_RfGainMode(dev, manual); } + +/* definition order must match enum rtlsdr_tuner */ +static rtlsdr_tuner_iface_t tuners[] = { + { + NULL, NULL, NULL, NULL, NULL, NULL, NULL /* dummy for unknown tuners */ + }, + { + e4000_init, e4000_exit, + e4000_set_freq, e4000_set_bw, e4000_set_gain, e4000_set_if_gain, + e4000_set_gain_mode + }, + { + _fc0012_init, fc0012_exit, + fc0012_set_freq, fc0012_set_bw, _fc0012_set_gain, NULL, + fc0012_set_gain_mode + }, + { + _fc0013_init, fc0013_exit, + fc0013_set_freq, fc0013_set_bw, _fc0013_set_gain, NULL, + fc0013_set_gain_mode + }, + { + fc2580_init, fc2580_exit, + _fc2580_set_freq, fc2580_set_bw, fc2580_set_gain, NULL, + fc2580_set_gain_mode + }, + { + r820t_init, r820t_exit, + r820t_set_freq, r820t_set_bw, r820t_set_gain, NULL, + r820t_set_gain_mode + }, +}; + +typedef struct rtlsdr_dongle { + uint16_t vid; + uint16_t pid; + const char *name; +} rtlsdr_dongle_t; + +/* + * Please add your device here and send a patch to osmocom-sdr@lists.osmocom.org + */ +static rtlsdr_dongle_t known_devices[] = { + { 0x0bda, 0x2832, "Generic RTL2832U (e.g. hama nano)" }, + { 0x0bda, 0x2838, "ezcap USB 2.0 DVB-T/DAB/FM dongle" }, + { 0x0ccd, 0x00a9, "Terratec Cinergy T Stick Black (rev 1)" }, + { 0x0ccd, 0x00b3, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" }, + { 0x0ccd, 0x00b4, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" }, + { 0x0ccd, 0x00b7, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" }, + { 0x0ccd, 0x00c6, "Terratec NOXON DAB/DAB+ USB dongle (rev 1)" }, + { 0x0ccd, 0x00d3, "Terratec Cinergy T Stick RC (Rev.3)" }, + { 0x0ccd, 0x00d7, "Terratec T Stick PLUS" }, + { 0x0ccd, 0x00e0, "Terratec NOXON DAB/DAB+ USB dongle (rev 2)" }, + { 0x1554, 0x5020, "PixelView PV-DT235U(RN)" }, + { 0x185b, 0x0620, "Compro Videomate U620F"}, + { 0x185b, 0x0650, "Compro Videomate U650F"}, + { 0x185b, 0x0680, "Compro Videomate U680F"}, + { 0x1f4d, 0xa803, "Sweex DVB-T USB" }, + { 0x1f4d, 0xb803, "GTek T803" }, + { 0x1f4d, 0xc803, "Lifeview LV5TDeluxe" }, + { 0x1f4d, 0xd286, "MyGica TD312" }, + { 0x1f4d, 0xd803, "PROlectrix DV107669" }, + { 0x1b80, 0xd398, "Zaapa ZT-MINDVBZP" }, + { 0x1b80, 0xd3a4, "Twintech UT-40" }, + { 0x1d19, 0x1101, "Dexatek DK DVB-T Dongle (Logilink VG0002A)" }, + { 0x1d19, 0x1102, "Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)" }, + { 0x1d19, 0x1103, "Dexatek Technology Ltd. DK 5217 DVB-T Dongle" }, + { 0x1d19, 0x1104, "MSI DigiVox Micro HD" }, + { 0x0458, 0x707f, "Genius TVGo DVB-T03 USB dongle (Ver. B)" }, + { 0x1b80, 0xd393, "GIGABYTE GT-U7300" }, + { 0x1b80, 0xd394, "DIKOM USB-DVBT HD" }, + { 0x1b80, 0xd395, "Peak 102569AGPK" }, + { 0x1b80, 0xd39d, "SVEON STV20 DVB-T USB & FM" }, +}; + +#define DEFAULT_BUF_NUMBER 32 +#define DEFAULT_BUF_LENGTH (16 * 32 * 512) + +#define DEF_RTL_XTAL_FREQ 28800000 +#define MIN_RTL_XTAL_FREQ (DEF_RTL_XTAL_FREQ - 1000) +#define MAX_RTL_XTAL_FREQ (DEF_RTL_XTAL_FREQ + 1000) + +#define MAX_SAMP_RATE 3200000 + +#define CTRL_IN (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_IN) +#define CTRL_OUT (LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT) +#define CTRL_TIMEOUT 300 +#define BULK_TIMEOUT 0 + +#define EEPROM_ADDR 0xa0 + +enum usb_reg { + USB_SYSCTL = 0x2000, + USB_CTRL = 0x2010, + USB_STAT = 0x2014, + USB_EPA_CFG = 0x2144, + USB_EPA_CTL = 0x2148, + USB_EPA_MAXPKT = 0x2158, + USB_EPA_MAXPKT_2 = 0x215a, + USB_EPA_FIFO_CFG = 0x2160, +}; + +enum sys_reg { + DEMOD_CTL = 0x3000, + GPO = 0x3001, + GPI = 0x3002, + GPOE = 0x3003, + GPD = 0x3004, + SYSINTE = 0x3005, + SYSINTS = 0x3006, + GP_CFG0 = 0x3007, + GP_CFG1 = 0x3008, + SYSINTE_1 = 0x3009, + SYSINTS_1 = 0x300a, + DEMOD_CTL_1 = 0x300b, + IR_SUSPEND = 0x300c, +}; + +enum blocks { + DEMODB = 0, + USBB = 1, + SYSB = 2, + TUNB = 3, + ROMB = 4, + IRB = 5, + IICB = 6, +}; + +int rtlsdr_read_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len) +{ + int r; + uint16_t index = (block << 8); + + r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, array, len, CTRL_TIMEOUT); +#if 0 + if (r < 0) + fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r); +#endif + return r; +} + +int rtlsdr_write_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len) +{ + int r; + uint16_t index = (block << 8) | 0x10; + + r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, array, len, CTRL_TIMEOUT); +#if 0 + if (r < 0) + fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r); +#endif + return r; +} + +int rtlsdr_i2c_write_reg(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t reg, uint8_t val) +{ + uint16_t addr = i2c_addr; + uint8_t data[2]; + + data[0] = reg; + data[1] = val; + return rtlsdr_write_array(dev, IICB, addr, (uint8_t *)&data, 2); +} + +uint8_t rtlsdr_i2c_read_reg(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t reg) +{ + uint16_t addr = i2c_addr; + uint8_t data = 0; + + rtlsdr_write_array(dev, IICB, addr, ®, 1); + rtlsdr_read_array(dev, IICB, addr, &data, 1); + + return data; +} + +/* TODO clean this up again */ +int e4k_reg_write(struct e4k_state *e4k, uint8_t reg, uint8_t val) +{ + return rtlsdr_i2c_write_reg((rtlsdr_dev_t*)e4k->rtl_dev, e4k->i2c_addr, reg, val);} + +uint8_t e4k_reg_read(struct e4k_state *e4k, uint8_t reg) +{ + return rtlsdr_i2c_read_reg((rtlsdr_dev_t*)e4k->rtl_dev, e4k->i2c_addr, reg); +} + +int rtlsdr_i2c_write(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t *buffer, int len) +{ + uint16_t addr = i2c_addr; + + if (!dev) + return -1; + + return rtlsdr_write_array(dev, IICB, addr, buffer, len); +} + +int rtlsdr_i2c_read(rtlsdr_dev_t *dev, uint8_t i2c_addr, uint8_t *buffer, int len) +{ + uint16_t addr = i2c_addr; + + if (!dev) + return -1; + + return rtlsdr_read_array(dev, IICB, addr, buffer, len); +} + +uint16_t rtlsdr_read_reg(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t len) +{ + int r; + unsigned char data[2]; + uint16_t index = (block << 8); + uint16_t reg; + + r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, data, len, CTRL_TIMEOUT); + + if (r < 0) + fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r); + + reg = (data[1] << 8) | data[0]; + + return reg; +} + +int rtlsdr_write_reg(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint16_t val, uint8_t len) +{ + int r; + unsigned char data[2]; + + uint16_t index = (block << 8) | 0x10; + + if (len == 1) + data[0] = val & 0xff; + else + data[0] = val >> 8; + + data[1] = val & 0xff; + + r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, data, len, CTRL_TIMEOUT); + + if (r < 0) + fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r); + + return r; +} + +uint16_t rtlsdr_demod_read_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint8_t len) +{ + int r; + unsigned char data[2]; + + uint16_t index = page; + uint16_t reg; + addr = (addr << 8) | 0x20; + + r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, data, len, CTRL_TIMEOUT); + + if (r < 0) + fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r); + + reg = (data[1] << 8) | data[0]; + + return reg; +} + +int rtlsdr_demod_write_reg(rtlsdr_dev_t *dev, uint8_t page, uint16_t addr, uint16_t val, uint8_t len) +{ + int r; + unsigned char data[2]; + uint16_t index = 0x10 | page; + addr = (addr << 8) | 0x20; + + if (len == 1) + data[0] = val & 0xff; + else + data[0] = val >> 8; + + data[1] = val & 0xff; + + r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, data, len, CTRL_TIMEOUT); + + if (r < 0) + fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r); + + rtlsdr_demod_read_reg(dev, 0x0a, 0x01, 1); + + return (r == len) ? 0 : -1; +} + +void rtlsdr_set_gpio_bit(rtlsdr_dev_t *dev, uint8_t gpio, int val) +{ + uint8_t r; + + gpio = 1 << gpio; + r = rtlsdr_read_reg(dev, SYSB, GPO, 1); + r = val ? (r | gpio) : (r & ~gpio); + rtlsdr_write_reg(dev, SYSB, GPO, r, 1); +} + +void rtlsdr_set_gpio_output(rtlsdr_dev_t *dev, uint8_t gpio) +{ + int r; + gpio = 1 << gpio; + + r = rtlsdr_read_reg(dev, SYSB, GPD, 1); + rtlsdr_write_reg(dev, SYSB, GPO, r & ~gpio, 1); + r = rtlsdr_read_reg(dev, SYSB, GPOE, 1); + rtlsdr_write_reg(dev, SYSB, GPOE, r | gpio, 1); +} + +void rtlsdr_set_i2c_repeater(rtlsdr_dev_t *dev, int on) +{ + rtlsdr_demod_write_reg(dev, 1, 0x01, on ? 0x18 : 0x10, 1); +} + +void rtlsdr_init_baseband(rtlsdr_dev_t *dev) +{ + unsigned int i; + + /* default FIR coefficients used for DAB/FM by the Windows driver, + * the DVB driver uses different ones */ + uint8_t fir_coeff[] = { + 0xca, 0xdc, 0xd7, 0xd8, 0xe0, 0xf2, 0x0e, 0x35, 0x06, 0x50, + 0x9c, 0x0d, 0x71, 0x11, 0x14, 0x71, 0x74, 0x19, 0x41, 0xa5, + }; + + /* initialize USB */ + rtlsdr_write_reg(dev, USBB, USB_SYSCTL, 0x09, 1); + rtlsdr_write_reg(dev, USBB, USB_EPA_MAXPKT, 0x0002, 2); + rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x1002, 2); + + /* poweron demod */ + rtlsdr_write_reg(dev, SYSB, DEMOD_CTL_1, 0x22, 1); + rtlsdr_write_reg(dev, SYSB, DEMOD_CTL, 0xe8, 1); + + /* reset demod (bit 3, soft_rst) */ + rtlsdr_demod_write_reg(dev, 1, 0x01, 0x14, 1); + rtlsdr_demod_write_reg(dev, 1, 0x01, 0x10, 1); + + /* disable spectrum inversion and adjacent channel rejection */ + rtlsdr_demod_write_reg(dev, 1, 0x15, 0x00, 1); + rtlsdr_demod_write_reg(dev, 1, 0x16, 0x0000, 2); + + /* clear both DDC shift and IF frequency registers */ + for (i = 0; i < 6; i++) + rtlsdr_demod_write_reg(dev, 1, 0x16 + i, 0x00, 1); + + /* set FIR coefficients */ + for (i = 0; i < sizeof (fir_coeff); i++) + rtlsdr_demod_write_reg(dev, 1, 0x1c + i, fir_coeff[i], 1); + + /* enable SDR mode, disable DAGC (bit 5) */ + rtlsdr_demod_write_reg(dev, 0, 0x19, 0x05, 1); + + /* init FSM state-holding register */ + rtlsdr_demod_write_reg(dev, 1, 0x93, 0xf0, 1); + rtlsdr_demod_write_reg(dev, 1, 0x94, 0x0f, 1); + + /* disable AGC (en_dagc, bit 0) (this seems to have no effect) */ + rtlsdr_demod_write_reg(dev, 1, 0x11, 0x00, 1); + + /* disable RF and IF AGC loop */ + rtlsdr_demod_write_reg(dev, 1, 0x04, 0x00, 1); + + /* disable PID filter (enable_PID = 0) */ + rtlsdr_demod_write_reg(dev, 0, 0x61, 0x60, 1); + + /* opt_adc_iq = 0, default ADC_I/ADC_Q datapath */ + rtlsdr_demod_write_reg(dev, 0, 0x06, 0x80, 1); + + /* Enable Zero-IF mode (en_bbin bit), DC cancellation (en_dc_est), + * IQ estimation/compensation (en_iq_comp, en_iq_est) */ + rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1b, 1); + + /* disable 4.096 MHz clock output on pin TP_CK0 */ + rtlsdr_demod_write_reg(dev, 0, 0x0d, 0x83, 1); +} + +int rtlsdr_deinit_baseband(rtlsdr_dev_t *dev) +{ + int r = 0; + + if (!dev) + return -1; + + if (dev->tuner && dev->tuner->exit) { + rtlsdr_set_i2c_repeater(dev, 1); + r = dev->tuner->exit(dev); /* deinitialize tuner */ + rtlsdr_set_i2c_repeater(dev, 0); + } + + /* poweroff demodulator and ADCs */ + rtlsdr_write_reg(dev, SYSB, DEMOD_CTL, 0x20, 1); + + return r; +} + +int rtlsdr_set_if_freq(rtlsdr_dev_t *dev, uint32_t freq) +{ + uint32_t rtl_xtal; + int32_t if_freq; + uint8_t tmp; + int r; + + if (!dev) + return -1; + + /* read corrected clock value */ + if (rtlsdr_get_xtal_freq(dev, &rtl_xtal, NULL)) + return -2; + + if_freq = ((freq * TWO_POW(22)) / rtl_xtal) * (-1); + + tmp = (if_freq >> 16) & 0x3f; + r = rtlsdr_demod_write_reg(dev, 1, 0x19, tmp, 1); + tmp = (if_freq >> 8) & 0xff; + r |= rtlsdr_demod_write_reg(dev, 1, 0x1a, tmp, 1); + tmp = if_freq & 0xff; + r |= rtlsdr_demod_write_reg(dev, 1, 0x1b, tmp, 1); + + return r; +} + +int rtlsdr_set_sample_freq_correction(rtlsdr_dev_t *dev, int ppm) +{ + int r = 0; + uint8_t tmp; + int16_t offs = ppm * (-1) * TWO_POW(24) / 1000000; + + tmp = offs & 0xff; + r |= rtlsdr_demod_write_reg(dev, 1, 0x3f, tmp, 1); + tmp = (offs >> 8) & 0x3f; + r |= rtlsdr_demod_write_reg(dev, 1, 0x3e, tmp, 1); + + return r; +} + +int rtlsdr_set_xtal_freq(rtlsdr_dev_t *dev, uint32_t rtl_freq, uint32_t tuner_freq) +{ + int r = 0; + + if (!dev) + return -1; + + if (rtl_freq > 0 && + (rtl_freq < MIN_RTL_XTAL_FREQ || rtl_freq > MAX_RTL_XTAL_FREQ)) + return -2; + + if (rtl_freq > 0 && dev->rtl_xtal != rtl_freq) { + dev->rtl_xtal = rtl_freq; + + /* update xtal-dependent settings */ + if (dev->rate) + r = rtlsdr_set_sample_rate(dev, dev->rate); + } + + if (dev->tun_xtal != tuner_freq) { + if (0 == tuner_freq) + dev->tun_xtal = dev->rtl_xtal; + else + dev->tun_xtal = tuner_freq; + + /* read corrected clock value into e4k structure */ + if (rtlsdr_get_xtal_freq(dev, NULL, &dev->e4k_s.vco.fosc)) + return -3; + + /* update xtal-dependent settings */ + if (dev->freq) + r = rtlsdr_set_center_freq(dev, dev->freq); + } + + return r; +} + +int rtlsdr_get_xtal_freq(rtlsdr_dev_t *dev, uint32_t *rtl_freq, uint32_t *tuner_freq) +{ + if (!dev) + return -1; + + #define APPLY_PPM_CORR(val,ppm) (((val) * (1.0 + (ppm) / 1e6))) + + if (rtl_freq) + *rtl_freq = (uint32_t) APPLY_PPM_CORR(dev->rtl_xtal, dev->corr); + + if (tuner_freq) + *tuner_freq = (uint32_t) APPLY_PPM_CORR(dev->tun_xtal, dev->corr); + + return 0; +} + +int rtlsdr_get_usb_strings(rtlsdr_dev_t *dev, char *manufact, char *product, + char *serial) +{ + struct libusb_device_descriptor dd; + libusb_device *device = NULL; + const int buf_max = 256; + int r = 0; + + if (!dev || !dev->devh) + return -1; + + device = libusb_get_device(dev->devh); + + r = libusb_get_device_descriptor(device, &dd); + if (r < 0) + return -1; + + if (manufact) { + memset(manufact, 0, buf_max); + libusb_get_string_descriptor_ascii(dev->devh, dd.iManufacturer, + (unsigned char *)manufact, + buf_max); + } + + if (product) { + memset(product, 0, buf_max); + libusb_get_string_descriptor_ascii(dev->devh, dd.iProduct, + (unsigned char *)product, + buf_max); + } + + if (serial) { + memset(serial, 0, buf_max); + libusb_get_string_descriptor_ascii(dev->devh, dd.iSerialNumber, + (unsigned char *)serial, + buf_max); + } + + return 0; +} + +int rtlsdr_write_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16_t len) +{ + int r = 0; + int i; + uint8_t cmd[2]; + + if (!dev) + return -1; + + if ((len + offset) > 256) + return -2; + + for (i = 0; i < len; i++) { + cmd[0] = i + offset; + r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, cmd, 1); + r = rtlsdr_read_array(dev, IICB, EEPROM_ADDR, &cmd[1], 1); + + /* only write the byte if it differs */ + if (cmd[1] == data[i]) + continue; + + cmd[1] = data[i]; + r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, cmd, 2); + if (r != sizeof(cmd)) + return -3; + + /* for some EEPROMs (e.g. ATC 240LC02) we need a delay + * between write operations, otherwise they will fail */ +#ifdef _WIN32 + Sleep(5); +#else + usleep(5000); +#endif + } + + return 0; +} + +int rtlsdr_read_eeprom(rtlsdr_dev_t *dev, uint8_t *data, uint8_t offset, uint16_t len) +{ + int r = 0; + int i; + + if (!dev) + return -1; + + if ((len + offset) > 256) + return -2; + + r = rtlsdr_write_array(dev, IICB, EEPROM_ADDR, &offset, 1); + if (r < 0) + return -3; + + for (i = 0; i < len; i++) { + r = rtlsdr_read_array(dev, IICB, EEPROM_ADDR, data + i, 1); + + if (r < 0) + return -3; + } + + return r; +} + +int rtlsdr_set_center_freq(rtlsdr_dev_t *dev, uint32_t freq) +{ + int r = -1; + + if (!dev || !dev->tuner) + return -1; + + if (dev->direct_sampling) { + r = rtlsdr_set_if_freq(dev, freq); + } else if (dev->tuner && dev->tuner->set_freq) { + rtlsdr_set_i2c_repeater(dev, 1); + r = dev->tuner->set_freq(dev, freq - dev->offs_freq); + rtlsdr_set_i2c_repeater(dev, 0); + } + + if (!r) + dev->freq = freq; + else + dev->freq = 0; + + return r; +} + +uint32_t rtlsdr_get_center_freq(rtlsdr_dev_t *dev) +{ + if (!dev) + return 0; + + return dev->freq; +} + +int rtlsdr_set_freq_correction(rtlsdr_dev_t *dev, int ppm) +{ + int r = 0; + + if (!dev) + return -1; + + if (dev->corr == ppm) + return -2; + + dev->corr = ppm; + + r |= rtlsdr_set_sample_freq_correction(dev, ppm); + + /* read corrected clock value into e4k structure */ + if (rtlsdr_get_xtal_freq(dev, NULL, &dev->e4k_s.vco.fosc)) + return -3; + + if (dev->freq) /* retune to apply new correction value */ + r |= rtlsdr_set_center_freq(dev, dev->freq); + + return r; +} + +int rtlsdr_get_freq_correction(rtlsdr_dev_t *dev) +{ + if (!dev) + return 0; + + return dev->corr; +} + +enum rtlsdr_tuner rtlsdr_get_tuner_type(rtlsdr_dev_t *dev) +{ + if (!dev) + return RTLSDR_TUNER_UNKNOWN; + + return dev->tuner_type; +} + +int rtlsdr_get_tuner_gains(rtlsdr_dev_t *dev, int *gains) +{ + /* all gain values are expressed in tenths of a dB */ + const int e4k_gains[] = { -10, 15, 40, 65, 90, 115, 140, 165, 190, 215, + 240, 290, 340, 420 }; + const int fc0012_gains[] = { -99, -40, 71, 179, 192 }; + const int fc0013_gains[] = { -99, -73, -65, -63, -60, -58, -54, 58, 61, + 63, 65, 67, 68, 70, 71, 179, 181, 182, + 184, 186, 188, 191, 197 }; + const int fc2580_gains[] = { 0 /* no gain values */ }; + const int r820t_gains[] = { 0, 9, 14, 27, 37, 77, 87, 125, 144, 157, + 166, 197, 207, 229, 254, 280, 297, 328, + 338, 364, 372, 386, 402, 421, 434, 439, + 445, 480, 496 }; + const int unknown_gains[] = { 0 /* no gain values */ }; + + const int *ptr = NULL; + int len = 0; + + if (!dev) + return -1; + + switch (dev->tuner_type) { + case RTLSDR_TUNER_E4000: + ptr = e4k_gains; len = sizeof(e4k_gains); + break; + case RTLSDR_TUNER_FC0012: + ptr = fc0012_gains; len = sizeof(fc0012_gains); + break; + case RTLSDR_TUNER_FC0013: + ptr = fc0013_gains; len = sizeof(fc0013_gains); + break; + case RTLSDR_TUNER_FC2580: + ptr = fc2580_gains; len = sizeof(fc2580_gains); + break; + case RTLSDR_TUNER_R820T: + ptr = r820t_gains; len = sizeof(r820t_gains); + break; + default: + ptr = unknown_gains; len = sizeof(unknown_gains); + break; + } + + if (!gains) { /* no buffer provided, just return the count */ + return len / sizeof(int); + } else { + if (len) + memcpy(gains, ptr, len); + + return len / sizeof(int); + } +} + +int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain) +{ + int r = 0; + + if (!dev || !dev->tuner) + return -1; + + if (dev->tuner->set_gain) { + rtlsdr_set_i2c_repeater(dev, 1); + r = dev->tuner->set_gain((void *)dev, gain); + rtlsdr_set_i2c_repeater(dev, 0); + } + + if (!r) + dev->gain = gain; + else + dev->gain = 0; + + return r; +} + +int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev) +{ + if (!dev) + return 0; + + return dev->gain; +} + +int rtlsdr_set_tuner_if_gain(rtlsdr_dev_t *dev, int stage, int gain) +{ + int r = 0; + + if (!dev || !dev->tuner) + return -1; + + if (dev->tuner->set_if_gain) { + rtlsdr_set_i2c_repeater(dev, 1); + r = dev->tuner->set_if_gain(dev, stage, gain); + rtlsdr_set_i2c_repeater(dev, 0); + } + + return r; +} + +int rtlsdr_set_tuner_gain_mode(rtlsdr_dev_t *dev, int mode) +{ + int r = 0; + + if (!dev || !dev->tuner) + return -1; + + if (dev->tuner->set_gain_mode) { + rtlsdr_set_i2c_repeater(dev, 1); + r = dev->tuner->set_gain_mode((void *)dev, mode); + rtlsdr_set_i2c_repeater(dev, 0); + } + + return r; +} + +int rtlsdr_set_sample_rate(rtlsdr_dev_t *dev, uint32_t samp_rate) +{ + int r = 0; + uint16_t tmp; + uint32_t rsamp_ratio; + double real_rate; + + if (!dev) + return -1; + + /* check for the maximum rate the resampler supports */ + if (samp_rate > MAX_SAMP_RATE) + samp_rate = MAX_SAMP_RATE; + + rsamp_ratio = (dev->rtl_xtal * TWO_POW(22)) / samp_rate; + rsamp_ratio &= ~3; + + real_rate = (dev->rtl_xtal * TWO_POW(22)) / rsamp_ratio; + + if ( ((double)samp_rate) != real_rate ) + fprintf(stderr, "Exact sample rate is: %f Hz\n", real_rate); + + if (dev->tuner && dev->tuner->set_bw) { + rtlsdr_set_i2c_repeater(dev, 1); + dev->tuner->set_bw(dev, (int)real_rate); + rtlsdr_set_i2c_repeater(dev, 0); + } + + dev->rate = (uint32_t)real_rate; + + tmp = (rsamp_ratio >> 16); + r |= rtlsdr_demod_write_reg(dev, 1, 0x9f, tmp, 2); + tmp = rsamp_ratio & 0xffff; + r |= rtlsdr_demod_write_reg(dev, 1, 0xa1, tmp, 2); + + r |= rtlsdr_set_sample_freq_correction(dev, dev->corr); + + /* reset demod (bit 3, soft_rst) */ + r |= rtlsdr_demod_write_reg(dev, 1, 0x01, 0x14, 1); + r |= rtlsdr_demod_write_reg(dev, 1, 0x01, 0x10, 1); + + /* recalculate offset frequency if offset tuning is enabled */ + if (dev->offs_freq) + rtlsdr_set_offset_tuning(dev, 1); + + return r; +} + +uint32_t rtlsdr_get_sample_rate(rtlsdr_dev_t *dev) +{ + if (!dev) + return 0; + + return dev->rate; +} + +int rtlsdr_set_testmode(rtlsdr_dev_t *dev, int on) +{ + if (!dev) + return -1; + + return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x03 : 0x05, 1); +} + +int rtlsdr_set_agc_mode(rtlsdr_dev_t *dev, int on) +{ + if (!dev) + return -1; + + return rtlsdr_demod_write_reg(dev, 0, 0x19, on ? 0x25 : 0x05, 1); +} + +int rtlsdr_set_direct_sampling(rtlsdr_dev_t *dev, int on) +{ + int r = 0; + + if (!dev) + return -1; + + if (on) { + if (dev->tuner && dev->tuner->exit) { + rtlsdr_set_i2c_repeater(dev, 1); + r = dev->tuner->exit(dev); + rtlsdr_set_i2c_repeater(dev, 0); + } + + /* disable Zero-IF mode */ + r |= rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1); + + /* disable spectrum inversion */ + r |= rtlsdr_demod_write_reg(dev, 1, 0x15, 0x00, 1); + + /* only enable In-phase ADC input */ + r |= rtlsdr_demod_write_reg(dev, 0, 0x08, 0x4d, 1); + + /* swap I and Q ADC, this allows to select between two inputs */ + r |= rtlsdr_demod_write_reg(dev, 0, 0x06, (on > 1) ? 0x90 : 0x80, 1); + + fprintf(stderr, "Enabled direct sampling mode, input %i\n", on); + dev->direct_sampling = on; + } else { + if (dev->tuner && dev->tuner->init) { + rtlsdr_set_i2c_repeater(dev, 1); + r |= dev->tuner->init(dev); + rtlsdr_set_i2c_repeater(dev, 0); + } + + if (dev->tuner_type == RTLSDR_TUNER_R820T) { + r |= rtlsdr_set_if_freq(dev, R820T_IF_FREQ); + + /* enable spectrum inversion */ + r |= rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1); + } else { + r |= rtlsdr_set_if_freq(dev, 0); + + /* enable In-phase + Quadrature ADC input */ + r |= rtlsdr_demod_write_reg(dev, 0, 0x08, 0xcd, 1); + + /* Enable Zero-IF mode */ + r |= rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1b, 1); + } + + /* opt_adc_iq = 0, default ADC_I/ADC_Q datapath */ + r |= rtlsdr_demod_write_reg(dev, 0, 0x06, 0x80, 1); + + fprintf(stderr, "Disabled direct sampling mode\n"); + dev->direct_sampling = 0; + } + + r |= rtlsdr_set_center_freq(dev, dev->freq); + + return r; +} + +int rtlsdr_get_direct_sampling(rtlsdr_dev_t *dev) +{ + if (!dev) + return -1; + + return dev->direct_sampling; +} + +int rtlsdr_set_offset_tuning(rtlsdr_dev_t *dev, int on) +{ + int r = 0; + + if (!dev) + return -1; + + if (dev->tuner_type == RTLSDR_TUNER_R820T) + return -2; + + if (dev->direct_sampling) + return -3; + + /* based on keenerds 1/f noise measurements */ + dev->offs_freq = on ? ((dev->rate / 2) * 170 / 100) : 0; + r |= rtlsdr_set_if_freq(dev, dev->offs_freq); + + if (dev->tuner && dev->tuner->set_bw) { + rtlsdr_set_i2c_repeater(dev, 1); + dev->tuner->set_bw(dev, on ? (2 * dev->offs_freq) : dev->rate); + rtlsdr_set_i2c_repeater(dev, 0); + } + + if (dev->freq > dev->offs_freq) + r |= rtlsdr_set_center_freq(dev, dev->freq); + + return r; +} + +int rtlsdr_get_offset_tuning(rtlsdr_dev_t *dev) +{ + if (!dev) + return -1; + + return (dev->offs_freq) ? 1 : 0; +} + +static rtlsdr_dongle_t *find_known_device(uint16_t vid, uint16_t pid) +{ + unsigned int i; + rtlsdr_dongle_t *device = NULL; + + for (i = 0; i < sizeof(known_devices)/sizeof(rtlsdr_dongle_t); i++ ) { + if (known_devices[i].vid == vid && known_devices[i].pid == pid) { + device = &known_devices[i]; + break; + } + } + + return device; +} + +uint32_t rtlsdr_get_device_count(void) +{ + int i; + libusb_context *ctx; + libusb_device **list; + uint32_t device_count = 0; + struct libusb_device_descriptor dd; + ssize_t cnt; + + libusb_init(&ctx); + + cnt = libusb_get_device_list(ctx, &list); + + for (i = 0; i < cnt; i++) { + libusb_get_device_descriptor(list[i], &dd); + + if (find_known_device(dd.idVendor, dd.idProduct)) + device_count++; + } + + libusb_free_device_list(list, 1); + + libusb_exit(ctx); + + return device_count; +} + +const char *rtlsdr_get_device_name(uint32_t index) +{ + int i; + libusb_context *ctx; + libusb_device **list; + struct libusb_device_descriptor dd; + rtlsdr_dongle_t *device = NULL; + uint32_t device_count = 0; + ssize_t cnt; + + libusb_init(&ctx); + + cnt = libusb_get_device_list(ctx, &list); + + for (i = 0; i < cnt; i++) { + libusb_get_device_descriptor(list[i], &dd); + + device = find_known_device(dd.idVendor, dd.idProduct); + + if (device) { + device_count++; + + if (index == device_count - 1) + break; + } + } + + libusb_free_device_list(list, 1); + + libusb_exit(ctx); + + if (device) + return device->name; + else + return ""; +} + +int rtlsdr_get_device_usb_strings(uint32_t index, char *manufact, + char *product, char *serial) +{ + int r = -2; + int i; + libusb_context *ctx; + libusb_device **list; + struct libusb_device_descriptor dd; + rtlsdr_dongle_t *device = NULL; + rtlsdr_dev_t devt; + uint32_t device_count = 0; + ssize_t cnt; + + libusb_init(&ctx); + + cnt = libusb_get_device_list(ctx, &list); + + for (i = 0; i < cnt; i++) { + libusb_get_device_descriptor(list[i], &dd); + + device = find_known_device(dd.idVendor, dd.idProduct); + + if (device) { + device_count++; + + if (index == device_count - 1) { + r = libusb_open(list[i], &devt.devh); + if (!r) { + r = rtlsdr_get_usb_strings(&devt, + manufact, + product, + serial); + libusb_close(devt.devh); + } + break; + } + } + } + + libusb_free_device_list(list, 1); + + libusb_exit(ctx); + + return r; +} + +int rtlsdr_get_index_by_serial(const char *serial) +{ + int i, cnt, r; + char str[256]; + + if (!serial) + return -1; + + cnt = rtlsdr_get_device_count(); + + if (!cnt) + return -2; + + for (i = 0; i < cnt; i++) { + r = rtlsdr_get_device_usb_strings(i, NULL, NULL, str); + if (!r && !strcmp(serial, str)) + return i; + } + + return -3; +} + +int rtlsdr_open(rtlsdr_dev_t **out_dev, uint32_t index) +{ + int r; + int i; + libusb_device **list; + rtlsdr_dev_t *dev = NULL; + libusb_device *device = NULL; + uint32_t device_count = 0; + struct libusb_device_descriptor dd; + uint8_t reg; + ssize_t cnt; + + dev = malloc(sizeof(rtlsdr_dev_t)); + if (NULL == dev) + return -ENOMEM; + + memset(dev, 0, sizeof(rtlsdr_dev_t)); + + libusb_init(&dev->ctx); + + cnt = libusb_get_device_list(dev->ctx, &list); + + for (i = 0; i < cnt; i++) { + device = list[i]; + + libusb_get_device_descriptor(list[i], &dd); + + if (find_known_device(dd.idVendor, dd.idProduct)) { + device_count++; + } + + if (index == device_count - 1) + break; + + device = NULL; + } + + if (!device) { + r = -1; + goto err; + } + + r = libusb_open(device, &dev->devh); + if (r < 0) { + libusb_free_device_list(list, 1); + fprintf(stderr, "usb_open error %d\n", r); + goto err; + } + + libusb_free_device_list(list, 1); + + r = libusb_claim_interface(dev->devh, 0); + if (r < 0) { + fprintf(stderr, "usb_claim_interface error %d\n", r); + goto err; + } + + dev->rtl_xtal = DEF_RTL_XTAL_FREQ; + + /* perform a dummy write, if it fails, reset the device */ + if (rtlsdr_write_reg(dev, USBB, USB_SYSCTL, 0x09, 1) < 0) { + fprintf(stderr, "Resetting device...\n"); + libusb_reset_device(dev->devh); + } + + rtlsdr_init_baseband(dev); + + /* Probe tuners */ + rtlsdr_set_i2c_repeater(dev, 1); + + reg = rtlsdr_i2c_read_reg(dev, E4K_I2C_ADDR, E4K_CHECK_ADDR); + if (reg == E4K_CHECK_VAL) { + fprintf(stderr, "Found Elonics E4000 tuner\n"); + dev->tuner_type = RTLSDR_TUNER_E4000; + goto found; + } + + reg = rtlsdr_i2c_read_reg(dev, FC0013_I2C_ADDR, FC0013_CHECK_ADDR); + if (reg == FC0013_CHECK_VAL) { + fprintf(stderr, "Found Fitipower FC0013 tuner\n"); + dev->tuner_type = RTLSDR_TUNER_FC0013; + goto found; + } + + reg = rtlsdr_i2c_read_reg(dev, R820T_I2C_ADDR, R820T_CHECK_ADDR); + if (reg == R820T_CHECK_VAL) { + fprintf(stderr, "Found Rafael Micro R820T tuner\n"); + dev->tuner_type = RTLSDR_TUNER_R820T; + + /* disable Zero-IF mode */ + rtlsdr_demod_write_reg(dev, 1, 0xb1, 0x1a, 1); + + /* only enable In-phase ADC input */ + rtlsdr_demod_write_reg(dev, 0, 0x08, 0x4d, 1); + + /* the R820T uses 3.57 MHz IF for the DVB-T 6 MHz mode, and + * 4.57 MHz for the 8 MHz mode */ + rtlsdr_set_if_freq(dev, R820T_IF_FREQ); + + /* enable spectrum inversion */ + rtlsdr_demod_write_reg(dev, 1, 0x15, 0x01, 1); + + goto found; + } + + /* initialise GPIOs */ + rtlsdr_set_gpio_output(dev, 5); + + /* reset tuner before probing */ + rtlsdr_set_gpio_bit(dev, 5, 1); + rtlsdr_set_gpio_bit(dev, 5, 0); + + reg = rtlsdr_i2c_read_reg(dev, FC2580_I2C_ADDR, FC2580_CHECK_ADDR); + if ((reg & 0x7f) == FC2580_CHECK_VAL) { + fprintf(stderr, "Found FCI 2580 tuner\n"); + dev->tuner_type = RTLSDR_TUNER_FC2580; + goto found; + } + + reg = rtlsdr_i2c_read_reg(dev, FC0012_I2C_ADDR, FC0012_CHECK_ADDR); + if (reg == FC0012_CHECK_VAL) { + fprintf(stderr, "Found Fitipower FC0012 tuner\n"); + rtlsdr_set_gpio_output(dev, 6); + dev->tuner_type = RTLSDR_TUNER_FC0012; + goto found; + } + +found: + if (dev->tuner_type == RTLSDR_TUNER_UNKNOWN) { + fprintf(stderr, "No supported tuner found\n"); + rtlsdr_set_direct_sampling(dev, 1); + } + + dev->tuner = &tuners[dev->tuner_type]; + dev->tun_xtal = dev->rtl_xtal; /* use the rtl clock value by default */ + + if (dev->tuner->init) + r = dev->tuner->init(dev); + + rtlsdr_set_i2c_repeater(dev, 0); + + *out_dev = dev; + + return 0; +err: + if (dev) { + if (dev->ctx) + libusb_exit(dev->ctx); + + free(dev); + } + + return r; +} + +int rtlsdr_close(rtlsdr_dev_t *dev) +{ + if (!dev) + return -1; + + /* block until all async operations have been completed (if any) */ + while (RTLSDR_INACTIVE != dev->async_status) { +#ifdef _WIN32 + Sleep(1); +#else + usleep(1000); +#endif + } + + rtlsdr_deinit_baseband(dev); + + libusb_release_interface(dev->devh, 0); + libusb_close(dev->devh); + + libusb_exit(dev->ctx); + + free(dev); + + return 0; +} + +int rtlsdr_reset_buffer(rtlsdr_dev_t *dev) +{ + if (!dev) + return -1; + + rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x1002, 2); + rtlsdr_write_reg(dev, USBB, USB_EPA_CTL, 0x0000, 2); + + return 0; +} + +int rtlsdr_read_sync(rtlsdr_dev_t *dev, void *buf, int len, int *n_read) +{ + if (!dev) + return -1; + + return libusb_bulk_transfer(dev->devh, 0x81, buf, len, n_read, BULK_TIMEOUT); +} + +static void LIBUSB_CALL _libusb_callback(struct libusb_transfer *xfer) +{ + rtlsdr_dev_t *dev = (rtlsdr_dev_t *)xfer->user_data; + + if (LIBUSB_TRANSFER_COMPLETED == xfer->status) { + if (dev->cb) + dev->cb(xfer->buffer, xfer->actual_length, dev->cb_ctx); + + libusb_submit_transfer(xfer); /* resubmit transfer */ + } else if (LIBUSB_TRANSFER_CANCELLED == xfer->status) { + /* nothing to do */ + } else { + /*fprintf(stderr, "transfer status: %d\n", xfer->status);*/ + } +} + +int rtlsdr_wait_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx) +{ + return rtlsdr_read_async(dev, cb, ctx, 0, 0); +} + +static int _rtlsdr_alloc_async_buffers(rtlsdr_dev_t *dev) +{ + unsigned int i; + + if (!dev) + return -1; + + if (!dev->xfer) { + dev->xfer = malloc(dev->xfer_buf_num * + sizeof(struct libusb_transfer *)); + + for(i = 0; i < dev->xfer_buf_num; ++i) + dev->xfer[i] = libusb_alloc_transfer(0); + } + + if (!dev->xfer_buf) { + dev->xfer_buf = malloc(dev->xfer_buf_num * + sizeof(unsigned char *)); + + for(i = 0; i < dev->xfer_buf_num; ++i) + dev->xfer_buf[i] = malloc(dev->xfer_buf_len); + } + + return 0; +} + +static int _rtlsdr_free_async_buffers(rtlsdr_dev_t *dev) +{ + unsigned int i; + + if (!dev) + return -1; + + if (dev->xfer) { + for(i = 0; i < dev->xfer_buf_num; ++i) { + if (dev->xfer[i]) { + libusb_free_transfer(dev->xfer[i]); + } + } + + free(dev->xfer); + dev->xfer = NULL; + } + + if (dev->xfer_buf) { + for(i = 0; i < dev->xfer_buf_num; ++i) { + if (dev->xfer_buf[i]) + free(dev->xfer_buf[i]); + } + + free(dev->xfer_buf); + dev->xfer_buf = NULL; + } + + return 0; +} + +int rtlsdr_read_async(rtlsdr_dev_t *dev, rtlsdr_read_async_cb_t cb, void *ctx, + uint32_t buf_num, uint32_t buf_len) +{ + unsigned int i; + int r = 0; + struct timeval tv = { 1, 0 }; + enum rtlsdr_async_status next_status = RTLSDR_INACTIVE; + + if (!dev) + return -1; + + if (RTLSDR_INACTIVE != dev->async_status) + return -2; + + dev->async_status = RTLSDR_RUNNING; + + dev->cb = cb; + dev->cb_ctx = ctx; + + if (buf_num > 0) + dev->xfer_buf_num = buf_num; + else + dev->xfer_buf_num = DEFAULT_BUF_NUMBER; + + if (buf_len > 0 && buf_len % 512 == 0) /* len must be multiple of 512 */ + dev->xfer_buf_len = buf_len; + else + dev->xfer_buf_len = DEFAULT_BUF_LENGTH; + + _rtlsdr_alloc_async_buffers(dev); + + for(i = 0; i < dev->xfer_buf_num; ++i) { + libusb_fill_bulk_transfer(dev->xfer[i], + dev->devh, + 0x81, + dev->xfer_buf[i], + dev->xfer_buf_len, + _libusb_callback, + (void *)dev, + BULK_TIMEOUT); + + libusb_submit_transfer(dev->xfer[i]); + } + + while (RTLSDR_INACTIVE != dev->async_status) { + r = libusb_handle_events_timeout(dev->ctx, &tv); + if (r < 0) { + /*fprintf(stderr, "handle_events returned: %d\n", r);*/ + if (r == LIBUSB_ERROR_INTERRUPTED) /* stray signal */ + continue; + break; + } + + if (RTLSDR_CANCELING == dev->async_status) { + next_status = RTLSDR_INACTIVE; + + if (!dev->xfer) + break; + + for(i = 0; i < dev->xfer_buf_num; ++i) { + if (!dev->xfer[i]) + continue; + + if (LIBUSB_TRANSFER_CANCELLED != + dev->xfer[i]->status) { + libusb_cancel_transfer(dev->xfer[i]); + next_status = RTLSDR_CANCELING; + } + } + + if (RTLSDR_INACTIVE == next_status) + break; + } + } + + _rtlsdr_free_async_buffers(dev); + + dev->async_status = next_status; + + return r; +} + +int rtlsdr_cancel_async(rtlsdr_dev_t *dev) +{ + if (!dev) + return -1; + + /* if streaming, try to cancel gracefully */ + if (RTLSDR_RUNNING == dev->async_status) { + dev->async_status = RTLSDR_CANCELING; + return 0; + } + + /* if called while in pending state, change the state forcefully */ + if (RTLSDR_INACTIVE != dev->async_status) { + dev->async_status = RTLSDR_INACTIVE; + return 0; + } + + return -2; +} + +uint32_t rtlsdr_get_tuner_clock(void *dev) +{ + uint32_t tuner_freq; + + if (!dev) + return 0; + + /* read corrected clock value */ + if (rtlsdr_get_xtal_freq((rtlsdr_dev_t *)dev, NULL, &tuner_freq)) + return 0; + + return tuner_freq; +} + +int rtlsdr_i2c_write_fn(void *dev, uint8_t addr, uint8_t *buf, int len) +{ + if (dev) + return rtlsdr_i2c_write(((rtlsdr_dev_t *)dev), addr, buf, len); + + return -1; +} + +int rtlsdr_i2c_read_fn(void *dev, uint8_t addr, uint8_t *buf, int len) +{ + if (dev) + return rtlsdr_i2c_read(((rtlsdr_dev_t *)dev), addr, buf, len); + + return -1; +} diff --git a/src/rtl_433.c b/src/rtl_433.c new file mode 100755 index 0000000..c997acb --- /dev/null +++ b/src/rtl_433.c @@ -0,0 +1,1789 @@ +/* + * rtl_433, turns your Realtek RTL2832 based DVB dongle into a 433.92MHz generic data receiver + * Copyright (C) 2012 by Benjamin Larsson <benjamin@southpole.se> + * + * Based on rtl_sdr + * + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +/* Currently this can decode the temperature and id from Rubicson sensors + * + * the sensor sends 36 bits 12 times pwm modulated + * the data is grouped into 9 nibles + * [id0] [id1], [unk0] [temp0], [temp1] [temp2], [unk1] [unk2], [unk3] + * + * The id changes when the battery is changed in the sensor. + * unk0 is always 1 0 0 0, most likely 2 channel bits as the sensor can recevice 3 channels + * unk1-3 changes and the meaning is unknown + * temp is 12 bit signed scaled by 10 + * + * The sensor can be bought at Kjell&Co + */ + +/* Prologue sensor protocol + * + * the sensor sends 36 bits 7 times, before the first packet there is a pulse sent + * the packets are pwm modulated + * + * the data is grouped in 9 nibles + * [id0] [rid0] [rid1] [data0] [temp0] [temp1] [temp2] [humi0] [humi1] + * + * id0 is always 1001,9 + * rid is a random id that is generated when the sensor starts, could include battery status + * the same batteries often generate the same id + * data(3) is 0 the battery status, 1 ok, 0 low, first reading always say low + * data(2) is 1 when the sensor sends a reading when pressing the button on the sensor + * data(1,0)+1 forms the channel number that can be set by the sensor (1-3) + * temp is 12 bit signed scaled by 10 + * humi0 is always 1100,c if no humidity sensor is available + * humi1 is always 1100,c if no humidity sensor is available + * + * The sensor can be bought at Clas Ohlson + */ + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <time.h> + +#ifndef _WIN32 +#include <unistd.h> +#else +#include <Windows.h> +#include <io.h> +#include <fcntl.h> +#include "getopt/getopt.h" +#endif + +#include "rtl-sdr.h" + +#define DEFAULT_SAMPLE_RATE 250000 +#define DEFAULT_FREQUENCY 433920000 +#define DEFAULT_HOP_TIME (60*10) +#define DEFAULT_HOP_EVENTS 2 +#define DEFAULT_ASYNC_BUF_NUMBER 32 +#define DEFAULT_BUF_LENGTH (16 * 16384) +#define DEFAULT_LEVEL_LIMIT 10000 +#define DEFAULT_DECIMATION_LEVEL 0 +#define MINIMAL_BUF_LENGTH 512 +#define MAXIMAL_BUF_LENGTH (256 * 16384) +#define FILTER_ORDER 1 +#define MAX_PROTOCOLS 10 +#define SIGNAL_GRABBER_BUFFER (12 * DEFAULT_BUF_LENGTH) +#define BITBUF_COLS 34 +#define BITBUF_ROWS 50 + +static int do_exit = 0; +static int do_exit_async=0, frequencies=0, events=0; +uint32_t frequency[MAX_PROTOCOLS]; +time_t rawtime_old; +int flag; +uint32_t samp_rate=DEFAULT_SAMPLE_RATE; +static uint32_t bytes_to_read = 0; +static rtlsdr_dev_t *dev = NULL; +static uint16_t scaled_squares[256]; +static int debug_output = 0; +static int override_short = 0; +static int override_long = 0; + +/* Supported modulation types */ +#define OOK_PWM_D 1 /* Pulses are of the same length, the distance varies */ +#define OOK_PWM_P 2 /* The length of the pulses varies */ + + +typedef struct { + unsigned int id; + char name[256]; + unsigned int modulation; + unsigned int short_limit; + unsigned int long_limit; + unsigned int reset_limit; + int (*json_callback)(uint8_t bits_buffer[BITBUF_ROWS][BITBUF_COLS]) ; +} r_device; + +static int debug_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int i,j,k; + fprintf(stderr, "\n"); + for (i=0 ; i<BITBUF_ROWS ; i++) { + fprintf(stderr, "[%02d] ",i); + for (j=0 ; j<BITBUF_COLS ; j++) { + fprintf(stderr, "%02x ", bb[i][j]); + } + fprintf(stderr, ": "); + for (j=0 ; j<BITBUF_COLS ; j++) { + for (k=7 ; k>=0 ; k--) { + if (bb[i][j] & 1<<k) + fprintf(stderr, "1"); + else + fprintf(stderr, "0"); + } + fprintf(stderr, " "); + } + fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); + + return 0; +} + +uint8_t crc8( uint8_t *addr, uint8_t len) +{ + uint8_t crc = 0; + + // Indicated changes are from reference CRC-8 function in OneWire library + while (len--) { + uint8_t inbyte = *addr++; + int i; + for (i = 8; i; i--) { + uint8_t mix = (crc ^ inbyte) & 0x80; // changed from & 0x01 + crc <<= 1; // changed from right shift + if (mix) crc ^= 0x31;// changed from 0x8C; + inbyte <<= 1; // changed from right shift + } + } + return crc; +} + +static int wh2_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int j,k; + + uint8_t payload[4]; + uint8_t received_crc8,payload_crc8; + + int wh2_id; + float wh2_temp; + float wh2_humidity; + + if (bb[0][0] != 0xFE) return 0; + + payload[0] = bb[0][1]>>1; + payload[1] = bb[0][2]>>1 | ((bb[0][1]&1) << 7 ); + payload[2] = bb[0][3]>>1 | ((bb[0][2]&1) << 7 ); + payload[3] = bb[0][4]>>1 | ((bb[0][3]&1) << 7 ); + + received_crc8 = (bb[0][5]>>1) | ((bb[0][4]&1) << 7 ); + + payload_crc8 = crc8(payload,4); + + if (payload_crc8 != received_crc8) return 0; + + wh2_id = (payload[0] << 4) + (payload[1] >> 4); + wh2_temp = ((payload[1] & 0x7) << 8) + payload[2]; + if (payload[1] & 0x8) { + wh2_temp = -wh2_temp; + } + wh2_temp = wh2_temp/10; + + wh2_humidity = payload[3]; + + fprintf(stdout, "SENSOR:TYPE=WH2,ID=%X,HUMIDITY=%g,TEMPERATURE=%g\n",wh2_id,wh2_humidity,wh2_temp); + + return 1; +} + +static int silvercrest_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + /* FIXME validate the received message better */ + if (bb[1][0] == 0xF8 && + bb[2][0] == 0xF8 && + bb[3][0] == 0xF8 && + bb[4][0] == 0xF8 && + bb[1][1] == 0x4d && + bb[2][1] == 0x4d && + bb[3][1] == 0x4d && + bb[4][1] == 0x4d) { + /* Pretty sure this is a Silvercrest remote */ + fprintf(stdout, "BUTTON:TYPE=SILVERCREST,CODE=%02x-%02x-%02x-%02x-%02x\n",bb[1][0],bb[0][1],bb[0][2],bb[0][3],bb[0][4]); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int rubicson_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int temperature_before_dec; + int temperature_after_dec; + int16_t temp; + float ftemp; + + /* FIXME validate the received message better, figure out crc */ + if (bb[1][0] == bb[2][0] && bb[2][0] == bb[3][0] && bb[3][0] == bb[4][0] && + bb[4][0] == bb[5][0] && bb[5][0] == bb[6][0] && bb[6][0] == bb[7][0] && bb[7][0] == bb[8][0] && + bb[8][0] == bb[9][0] && (bb[5][0] != 0 && bb[5][1] != 0 && bb[5][2] != 0)) { + + /* Nible 3,4,5 contains 12 bits of temperature + * The temperature is signed and scaled by 10 */ + temp = (int16_t)((uint16_t)(bb[0][1] << 12) | (bb[0][2] << 4)); + temp = temp >> 4; + ftemp = (float)temp/10; + + fprintf(stdout, "SENSOR:TYPE=RUBICSON,ID=%X,TEMPERATURE=%f\n",bb[0][0],ftemp); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int prologue_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int rid; + + int16_t temp2; + float ftemp; + + /* FIXME validate the received message better */ + if (((bb[1][0]&0xF0) == 0x90 && (bb[2][0]&0xF0) == 0x90 && (bb[3][0]&0xF0) == 0x90 && (bb[4][0]&0xF0) == 0x90 && + (bb[5][0]&0xF0) == 0x90 && (bb[6][0]&0xF0) == 0x90) || + ((bb[1][0]&0xF0) == 0x50 && (bb[2][0]&0xF0) == 0x50 && (bb[3][0]&0xF0) == 0x50 && (bb[4][0]&0xF0) == 0x50)) { + + /* Prologue sensor */ + temp2 = (int16_t)((uint16_t)(bb[1][2] << 8) | (bb[1][3]&0xF0)); + temp2 = temp2 >> 4; + ftemp = (float)temp2/10; + rid = ((bb[1][0]&0x0F)<<4)|(bb[1][1]&0xF0)>>4; + fprintf(stdout, + "SENSOR:TYPE=PROLOGUE,BUTTON=%d,BATTERY=%s,TEMPERATURE=%f,HUMIDITY=%d,CHANNEL=%d,ID=%d,RID=%02x\n", + bb[1][1]&0x04?1:0, + bb[1][1]&0x08?"Ok":"Low", + ftemp, + ((bb[1][3]&0x0F)<<4)|(bb[1][4]>>4), + (int)((bb[1][1]&0x03)+1), + (int)((bb[1][0]&0xF0)>>4), + rid); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int waveman_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + /* Two bits map to 2 states, 0 1 -> 0 and 1 1 -> 1 */ + int i; + uint8_t nb[3] = {0}; + + if (((bb[0][0]&0x55)==0x55) && ((bb[0][1]&0x55)==0x55) && ((bb[0][2]&0x55)==0x55) && ((bb[0][3]&0x55)==0x00)) { + for (i=0 ; i<3 ; i++) { + nb[i] |= ((bb[0][i]&0xC0)==0xC0) ? 0x00 : 0x01; + nb[i] |= ((bb[0][i]&0x30)==0x30) ? 0x00 : 0x02; + nb[i] |= ((bb[0][i]&0x0C)==0x0C) ? 0x00 : 0x04; + nb[i] |= ((bb[0][i]&0x03)==0x03) ? 0x00 : 0x08; + } + + fprintf(stdout, + "BUTTON:TYPE=WAVEMAN,ID=%c,CHANNEL=%d,BUTTON=%d,STATE=%s\n", + 'A'+nb[0], + (int)((nb[1]>>2)+1), + (int)((nb[1]&3)+1), + ((nb[2]==0xe) ? "on" : "off")); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int steffen_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + + if (bb[0][0]==0x00 && ((bb[1][0]&0x07)==0x07) && bb[1][0]==bb[2][0] && bb[2][0]==bb[3][0]) { + + fprintf(stdout, "BUTTON:TYPE=STEFFAN,CODE=%d%d%d%d%d,",(bb[1][0]&0x80)>>7, (bb[1][0]&0x40)>>6, (bb[1][0]&0x20)>>5, (bb[1][0]&0x10)>>4, (bb[1][0]&0x08)>>3); + + if ((bb[1][2]&0x0f)==0x0e) + fprintf(stdout, "BUTTON=A,"); + else if ((bb[1][2]&0x0f)==0x0d) + fprintf(stdout, "BUTTON=B,"); + else if ((bb[1][2]&0x0f)==0x0b) + fprintf(stdout, "BUTTON=C,"); + else if ((bb[1][2]&0x0f)==0x07) + fprintf(stdout, "BUTTON=D,"); + else if ((bb[1][2]&0x0f)==0x0f) + fprintf(stdout, "BUTTON=ALL,"); + else + fprintf(stdout, "BUTTON=UNKNOWN,"); + + if ((bb[1][2]&0xf0)==0xf0) { + fprintf(stdout, "STATE=OFF\n"); + } else { + fprintf(stdout, "STATE=ON\n"); + } + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + + +uint16_t AD_POP(uint8_t bb[BITBUF_COLS], uint8_t bits, uint8_t bit) { + uint16_t val = 0; + uint8_t i, byte_no, bit_no; + for (i=0;i<bits;i++) { + byte_no= (bit+i)/8 ; + bit_no =7-((bit+i)%8); + if (bb[byte_no]&(1<<bit_no)) val = val | (1<<i); + } + return val; +} + +static int em1000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + // based on fs20.c + uint8_t dec[10]; + uint8_t bytes=0; + uint8_t bit=18; // preamble + uint8_t bb_p[14]; + char* types[] = {"S", "?", "GZ"}; + uint8_t checksum_calculated = 0; + uint8_t i; + uint8_t stopbit; + uint8_t checksum_received; + + // check and combine the 3 repetitions + for (i = 0; i < 14; i++) { + if(bb[0][i]==bb[1][i] || bb[0][i]==bb[2][i]) bb_p[i]=bb[0][i]; + else if(bb[1][i]==bb[2][i]) bb_p[i]=bb[1][i]; + else return 0; + } + + // read 9 bytes with stopbit ... + for (i = 0; i < 9; i++) { + dec[i] = AD_POP (bb_p, 8, bit); bit+=8; + stopbit=AD_POP (bb_p, 1, bit); bit+=1; + if (!stopbit) { +// fprintf(stderr, "!stopbit: %i\n", i); + return 0; + } + checksum_calculated ^= dec[i]; + bytes++; + } + + // Read checksum + checksum_received = AD_POP (bb_p, 8, bit); bit+=8; + if (checksum_received != checksum_calculated) { +// fprintf(stderr, "checksum_received != checksum_calculated: %d %d\n", checksum_received, checksum_calculated); + return 0; + } + +//for (i = 0; i < bytes; i++) fprintf(stderr, "%02X ", dec[i]); fprintf(stderr, "\n"); + + // based on 15_CUL_EM.pm + fprintf(stdout, "SENSOR:TYPE=ELV-EM-1000,MODEL=%s,CODE=%d,SEQNO=%d,TOTAL=%d,CURRENT=%d,PEAK=%d\n",dec[0]>=1&&dec[0]<=3?types[dec[0]-1]:"?",dec[1],dec[2],dec[3]|dec[4]<<8,dec[5]|dec[6]<<8,dec[7]|dec[8]<<8); + + return 1; +} + +static int ws2000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + // based on http://www.dc3yc.privat.t-online.de/protocol.htm + uint8_t dec[13]; + uint8_t nibbles=0; + uint8_t bit=11; // preamble + char* types[]={"!AS3", "AS2000/ASH2000/S2000/S2001A/S2001IA/ASH2200/S300IA", "!S2000R", "!S2000W", "S2001I/S2001ID", "!S2500H", "!Pyrano", "!KS200/KS300"}; + uint8_t check_calculated=0, sum_calculated=0; + uint8_t i; + uint8_t stopbit; + uint8_t sum_received; + + dec[0] = AD_POP (bb[0], 4, bit); bit+=4; + stopbit= AD_POP (bb[0], 1, bit); bit+=1; + if (!stopbit) { +//fprintf(stderr, "!stopbit\n"); + return 0; + } + check_calculated ^= dec[0]; + sum_calculated += dec[0]; + + // read nibbles with stopbit ... + for (i = 1; i <= (dec[0]==4?12:8); i++) { + dec[i] = AD_POP (bb[0], 4, bit); bit+=4; + stopbit= AD_POP (bb[0], 1, bit); bit+=1; + if (!stopbit) { +//fprintf(stderr, "!stopbit %i\n", i); + return 0; + } + check_calculated ^= dec[i]; + sum_calculated += dec[i]; + nibbles++; + } + + if (check_calculated) { +//fprintf(stderr, "check_calculated (%d) != 0\n", check_calculated); + return 0; + } + + // Read sum + sum_received = AD_POP (bb[0], 4, bit); bit+=4; + sum_calculated+=5; + sum_calculated&=0xF; + if (sum_received != sum_calculated) { +//fprintf(stderr, "sum_received (%d) != sum_calculated (%d) ", sum_received, sum_calculated); + return 0; + } + +//for (i = 0; i < nibbles; i++) fprintf(stderr, "%02X ", dec[i]); fprintf(stderr, "\n"); + + fprintf(stdout, "SENSOR:TYPE=ELV-WS-2000,MODEL=%s,CODE=%d,TEMPERATURE=%s%d.%d,HUMIDITY=%d.%d",dec[0]<=7?types[dec[0]]:"?",dec[1]&7,dec[1]&8?"-":"",dec[4]*10+dec[3],dec[2],dec[7]*10+dec[6], dec[5]); + if(dec[0]==4) { + fprintf(stdout, "PRESSURE=%d\n", 200+dec[10]*100+dec[9]*10+dec[8]); + } else { + fprintf(stdout, "\n"); + } + + return 1; +} + +// ** Acurite 5n1 functions ** + +const float acurite_winddirections[] = + { 337.5, 315.0, 292.5, 270.0, 247.5, 225.0, 202.5, 180, + 157.5, 135.0, 112.5, 90.0, 67.5, 45.0, 22.5, 0.0 }; + +static int acurite_raincounter = 0; + +static int acurite_crc(uint8_t row[BITBUF_COLS], int cols) { + // sum of first n-1 bytes modulo 256 should equal nth byte + int i; + int sum = 0; + for ( i=0; i < cols; i++) + sum += row[i]; + if ( sum % 256 == row[cols] ) + return 1; + else + return 0; +} + +static int acurite_detect(uint8_t *pRow) { + int i; + if ( pRow[0] != 0x00 ) { + // invert bits due to wierd issue + for (i = 0; i < 8; i++) + pRow[i] = ~pRow[i] & 0xFF; + pRow[0] |= pRow[8]; // fix first byte that has mashed leading bit + + if (acurite_crc(pRow, 7)) + return 1; // passes crc check + } + return 0; +} + +static float acurite_getTemp (uint8_t highbyte, uint8_t lowbyte) { + // range -40 to 158 F + int highbits = (highbyte & 0x0F) << 7 ; + int lowbits = lowbyte & 0x7F; + int rawtemp = highbits | lowbits; + float temp = (rawtemp - 400) / 10.0; + return temp; +} + +static int acurite_getWindSpeed (uint8_t highbyte, uint8_t lowbyte) { + // range: 0 to 159 kph + int highbits = ( highbyte & 0x1F) << 3; + int lowbits = ( lowbyte & 0x70 ) >> 4; + int speed = highbits | lowbits; + return speed; +} + +static float acurite_getWindDirection (uint8_t byte) { + // 16 compass points, ccw from (NNW) to 15 (N) + int direction = byte & 0x0F; + return acurite_winddirections[direction]; +} + +static int acurite_getHumidity (uint8_t byte) { + // range: 1 to 99 %RH + int humidity = byte & 0x7F; + return humidity; +} + +static int acurite_getRainfallCounter (uint8_t highbyte, uint8_t lowbyte) { + // range: 0 to 99.99 in, 0.01 in incr., rolling counter? + int highbits = (highbyte & 0x3F) << 7 ; + int lowbits = lowbyte & 0x7F; + int raincounter = highbits | lowbits; + return raincounter; +} + +static int acurite5n1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + // acurite 5n1 weather sensor decoding for rtl_433 + // Jens Jensen 2014 + int i; + uint8_t *buf = NULL; + // run through rows til we find one with good crc (brute force) + for (i=0; i < BITBUF_ROWS; i++) { + if (acurite_detect(bb[i])) { + buf = bb[i]; + break; // done + } + } + + if (buf) { + // decode packet here + fprintf(stdout, "SENSOR:TYPE=ACURITE"); + if (debug_output) { + for (i=0; i < 8; i++) + fprintf(stderr, "%02X ", buf[i]); + fprintf(stderr, "CRC OK\n"); + } + + if ((buf[2] & 0x0F) == 1) { + // wind speed, wind direction, rainfall + + float rainfall = 0.00; + int raincounter = 0; + if (acurite_raincounter > 0) { + // track rainfall difference after first run + raincounter = acurite_getRainfallCounter(buf[5], buf[6]); + rainfall = ( raincounter - acurite_raincounter ) * 0.01; + } else { + // capture starting counter + acurite_raincounter = raincounter; + } + + fprintf(stdout, ",WINDSPEED=%d", + acurite_getWindSpeed(buf[3], buf[4])); + fprintf(stdout, ",WINDDIRECTION=%0.1f", + acurite_getWindDirection(buf[4])); + fprintf(stdout, ",RAINGAUGE: %0.2f\n", rainfall); + + } else if ((buf[2] & 0x0F) == 8) { + // wind speed, temp, RH + fprintf(stdout, ",WINDSPEED=%d", + acurite_getWindSpeed(buf[3], buf[4])); + fprintf(stdout, ",TEMPERATURE=%2.1f", + acurite_getTemp(buf[4], buf[5])); + fprintf(stdout, ",HUMIDITY=%d\n", + acurite_getHumidity(buf[6])); + } + } + //if (debug_output) + // debug_callback(bb); + return 1; +} + + +// timings based on samp_rate=1024000 +r_device rubicson = { + /* .id = */ 1, + /* .name = */ "Rubicson Temperature Sensor", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 1744/4, + /* .long_limit = */ 3500/4, + /* .reset_limit = */ 5000/4, + /* .json_callback = */ &rubicson_callback, +}; + +r_device prologue = { + /* .id = */ 2, + /* .name = */ "Prologue Temperature Sensor", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 3500/4, + /* .long_limit = */ 7000/4, + /* .reset_limit = */ 15000/4, + /* .json_callback = */ &prologue_callback, +}; + +r_device silvercrest = { + /* .id = */ 3, + /* .name = */ "Silvercrest Remote Control", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 600/4, + /* .long_limit = */ 5000/4, + /* .reset_limit = */ 15000/4, + /* .json_callback = */ &silvercrest_callback, +}; + +r_device tech_line_fws_500 = { + /* .id = */ 4, + /* .name = */ "Tech Line FWS-500 Sensor", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 3500/4, + /* .long_limit = */ 7000/4, + /* .reset_limit = */ 15000/4, + // /* .json_callback = */ &rubicson_callback, +}; + +r_device generic_hx2262 = { + /* .id = */ 5, + /* .name = */ "Window/Door sensor", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 1300/4, + /* .long_limit = */ 10000/4, + /* .reset_limit = */ 40000/4, + // /* .json_callback = */ &silvercrest_callback, +}; + +r_device technoline_ws9118 = { + /* .id = */ 6, + /* .name = */ "Technoline WS9118", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 1800/4, + /* .long_limit = */ 3500/4, + /* .reset_limit = */ 15000/4, + /* .json_callback = */ &debug_callback, +}; + + +r_device elv_em1000 = { + /* .id = */ 7, + /* .name = */ "ELV EM 1000", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 750/4, + /* .long_limit = */ 7250/4, + /* .reset_limit = */ 30000/4, + /* .json_callback = */ &em1000_callback, +}; + +r_device elv_ws2000 = { + /* .id = */ 8, + /* .name = */ "ELV WS 2000", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ (602+(1155-602)/2)/4, + /* .long_limit = */ ((1755635-1655517)/2)/4, // no repetitions + /* .reset_limit = */ ((1755635-1655517)*2)/4, + /* .json_callback = */ &ws2000_callback, +}; + +r_device waveman = { + /* .id = */ 6, + /* .name = */ "Waveman Switch Transmitter", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 1000/4, + /* .long_limit = */ 8000/4, + /* .reset_limit = */ 30000/4, + /* .json_callback = */ &waveman_callback, +}; + +r_device steffen = { + /* .id = */ 9, + /* .name = */ "Steffen Switch Transmitter", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 140, + /* .long_limit = */ 270, + /* .reset_limit = */ 1500, + /* .json_callback = */ &steffen_callback, +}; + +r_device acurite5n1 = { + /* .id = */ 10, + /* .name = */ "Acurite 5n1 Weather Station", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 75, + /* .long_limit = */ 220, + /* .reset_limit = */ 20000, + /* .json_callback = */ &acurite5n1_callback, +}; + +r_device wh2 = { + /* .id = */ 11, + /* .name = */ "WH2 Weather Station", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 150, + /* .long_limit = */ 400, + /* .reset_limit = */ 20000, + /* .json_callback = */ &wh2_callback, +}; + +struct protocol_state { + int (*callback)(uint8_t bits_buffer[BITBUF_ROWS][BITBUF_COLS]); + + /* bits state */ + int bits_col_idx; + int bits_row_idx; + int bits_bit_col_idx; + uint8_t bits_buffer[BITBUF_ROWS][BITBUF_COLS]; + int16_t bits_per_row[BITBUF_ROWS]; + int bit_rows; + unsigned int modulation; + + /* demod state */ + int pulse_length; + int pulse_count; + int pulse_distance; + int sample_counter; + int start_c; + + int packet_present; + int pulse_start; + int real_bits; + int start_bit; + /* pwm limits */ + int short_limit; + int long_limit; + int reset_limit; + + +}; + + +struct dm_state { + FILE *file; + int save_data; + int32_t level_limit; + int32_t decimation_level; + int16_t filter_buffer[MAXIMAL_BUF_LENGTH+FILTER_ORDER]; + int16_t* f_buf; + int analyze; + int debug_mode; + + /* Signal grabber variables */ + int signal_grabber; + int8_t* sg_buf; + int sg_index; + int sg_len; + + + /* Protocol states */ + int r_dev_num; + struct protocol_state *r_devs[MAX_PROTOCOLS]; + +}; + +void usage(void) +{ + fprintf(stderr, + "rtl_433, an ISM band generic data receiver for RTL2832 based DVB-T receivers\n\n" + "Usage:\t[-d device_index (default: 0)]\n" + "\t[-g gain (default: 0 for auto)]\n" + "\t[-a analyze mode, print a textual description of the signal]\n" + "\t[-t signal auto save, use it together with analyze mode (-a -t)\n" + "\t[-l change the detection level used to determine pulses (0-3200) default: %i]\n" + "\t[-f [-f...] receive frequency[s], default: %i Hz]\n" + "\t[-s samplerate (default: %i Hz)]\n" + "\t[-S force sync output (default: async)]\n" + "\t[-r read data from file instead of from a receiver]\n" + "\t[-p ppm_error (default: 0)]\n" + "\t[-r test file name (indata)]\n" + "\t[-m test file mode (0 rtl_sdr data, 1 rtl_433 data)]\n" + "\t[-D print debug info on event\n" + "\t[-z override short value\n" + "\t[-x override long value\n" + "\tfilename (a '-' dumps samples to stdout)\n\n", DEFAULT_LEVEL_LIMIT, DEFAULT_FREQUENCY, DEFAULT_SAMPLE_RATE); + exit(1); +} + +#ifdef _WIN32 +BOOL WINAPI +sighandler(int signum) +{ + if (CTRL_C_EVENT == signum) { + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); + return TRUE; + } + return FALSE; +} +#else +static void sighandler(int signum) +{ + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); +} +#endif + +/* precalculate lookup table for envelope detection */ +static void calc_squares() { + int i; + for (i=0 ; i<256 ; i++) + scaled_squares[i] = (128-i) * (128-i); +} + +/** This will give a noisy envelope of OOK/ASK signals + * Subtract the bias (-128) and get an envelope estimation + * The output will be written in the input buffer + * @returns pointer to the input buffer + */ + +static void envelope_detect(unsigned char *buf, uint32_t len, int decimate) +{ + uint16_t* sample_buffer = (uint16_t*) buf; + unsigned int i; + unsigned op = 0; + unsigned int stride = 1<<decimate; + + for (i=0 ; i<len/2 ; i+=stride) { + sample_buffer[op++] = scaled_squares[buf[2*i ]]+scaled_squares[buf[2*i+1]]; + } +} + +static void demod_reset_bits_packet(struct protocol_state* p) { + memset(p->bits_buffer, 0 ,BITBUF_ROWS*BITBUF_COLS); + memset(p->bits_per_row, 0 ,BITBUF_ROWS); + p->bits_col_idx = 0; + p->bits_bit_col_idx = 7; + p->bits_row_idx = 0; + p->bit_rows = 0; +} + +static void demod_add_bit(struct protocol_state* p, int bit) { + p->bits_buffer[p->bits_row_idx][p->bits_col_idx] |= bit<<p->bits_bit_col_idx; + p->bits_bit_col_idx--; + if (p->bits_bit_col_idx<0) { + p->bits_bit_col_idx = 7; + p->bits_col_idx++; + if (p->bits_col_idx>BITBUF_COLS-1) { + p->bits_col_idx = BITBUF_COLS-1; +// fprintf(stderr, "p->bits_col_idx>%i!\n", BITBUF_COLS-1); + } + } + p->bits_per_row[p->bit_rows]++; +} + +static void demod_next_bits_packet(struct protocol_state* p) { + p->bits_col_idx = 0; + p->bits_row_idx++; + p->bits_bit_col_idx = 7; + if (p->bits_row_idx>BITBUF_ROWS-1) { + p->bits_row_idx = BITBUF_ROWS-1; + //fprintf(stderr, "p->bits_row_idx>%i!\n", BITBUF_ROWS-1); + } + p->bit_rows++; + if (p->bit_rows > BITBUF_ROWS-1) + p->bit_rows -=1; +} + +static void demod_print_bits_packet(struct protocol_state* p) { + int i,j,k; + + fprintf(stderr, "\n"); + for (i=0 ; i<p->bit_rows+1 ; i++) { + fprintf(stderr, "[%02d] {%d} ",i, p->bits_per_row[i]); + for (j=0 ; j<((p->bits_per_row[i]+8)/8) ; j++) { + fprintf(stderr, "%02x ", p->bits_buffer[i][j]); + } + fprintf(stderr, ": "); + for (j=0 ; j<((p->bits_per_row[i]+8)/8) ; j++) { + for (k=7 ; k>=0 ; k--) { + if (p->bits_buffer[i][j] & 1<<k) + fprintf(stderr, "1"); + else + fprintf(stderr, "0"); + } +// fprintf(stderr, "=0x%x ",demod->bits_buffer[i][j]); + fprintf(stderr, " "); + } + fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); + return; +} + +static void register_protocol(struct dm_state *demod, r_device *t_dev) { + struct protocol_state *p = calloc(1,sizeof(struct protocol_state)); + p->short_limit = (float)t_dev->short_limit/((float)DEFAULT_SAMPLE_RATE/(float)samp_rate); + p->long_limit = (float)t_dev->long_limit /((float)DEFAULT_SAMPLE_RATE/(float)samp_rate); + p->reset_limit = (float)t_dev->reset_limit/((float)DEFAULT_SAMPLE_RATE/(float)samp_rate); + p->modulation = t_dev->modulation; + p->callback = t_dev->json_callback; + demod_reset_bits_packet(p); + + demod->r_devs[demod->r_dev_num] = p; + demod->r_dev_num++; + + fprintf(stderr, "Registering protocol[%02d] %s\n",demod->r_dev_num, t_dev->name); + + if (demod->r_dev_num > MAX_PROTOCOLS) + fprintf(stderr, "Max number of protocols reached %d\n",MAX_PROTOCOLS); +} + + +static unsigned int counter = 0; +static unsigned int print = 1; +static unsigned int print2 = 0; +static unsigned int pulses_found = 0; +static unsigned int prev_pulse_start = 0; +static unsigned int pulse_start = 0; +static unsigned int pulse_end = 0; +static unsigned int pulse_avg = 0; +static unsigned int signal_start = 0; +static unsigned int signal_end = 0; +static unsigned int signal_pulse_data[4000][3] = {{0}}; +static unsigned int signal_pulse_counter = 0; + + +static void classify_signal() { + unsigned int i,k, max=0, min=1000000, t; + unsigned int delta, count_min, count_max, min_new, max_new, p_limit; + unsigned int a[3], b[2], a_cnt[3], a_new[3], b_new[2]; + unsigned int signal_distance_data[4000] = {0}; + struct protocol_state p = {0}; + unsigned int signal_type; + + if (!signal_pulse_data[0][0]) + return; + + for (i=0 ; i<1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { + //fprintf(stderr, "[%03d] s: %d\t e:\t %d\t l:%d\n", + //i, signal_pulse_data[i][0], signal_pulse_data[i][1], + //signal_pulse_data[i][2]); + if (signal_pulse_data[i][2] > max) + max = signal_pulse_data[i][2]; + if (signal_pulse_data[i][2] <= min) + min = signal_pulse_data[i][2]; + } + } + t=(max+min)/2; + //fprintf(stderr, "\n\nMax: %d, Min: %d t:%d\n", max, min, t); + + delta = (max - min)*(max-min); + + //TODO use Lloyd-Max quantizer instead + k=1; + while((k < 10) && (delta > 0)) { + min_new = 0; count_min = 0; + max_new = 0; count_max = 0; + + for (i=0 ; i < 1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { + if (signal_pulse_data[i][2] < t) { + min_new = min_new + signal_pulse_data[i][2]; + count_min++; + } + else { + max_new = max_new + signal_pulse_data[i][2]; + count_max++; + } + } + } + min_new = min_new / count_min; + max_new = max_new / count_max; + + delta = (min - min_new)*(min - min_new) + (max - max_new)*(max - max_new); + min = min_new; + max = max_new; + t = (min + max)/2; + + fprintf(stderr, "Iteration %d. t: %d min: %d (%d) max: %d (%d) delta %d\n", k,t, min, count_min, max, count_max, delta); + k++; + } + + for (i=0 ; i<1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { + //fprintf(stderr, "%d\n", signal_pulse_data[i][1]); + } + } + /* 50% decision limit */ + if (max/min > 1) { + fprintf(stderr, "Pulse coding: Short pulse length %d - Long pulse length %d\n", min, max); + signal_type = 2; + } else { + fprintf(stderr, "Distance coding: Pulse length %d\n", (min+max)/2); + signal_type = 1; + } + p_limit = (max+min)/2; + + /* Initial guesses */ + a[0] = 1000000; + a[2] = 0; + for (i=1 ; i<1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { +// fprintf(stderr, "[%03d] s: %d\t e:\t %d\t l:%d\t d:%d\n", +// i, signal_pulse_data[i][0], signal_pulse_data[i][1], +// signal_pulse_data[i][2], signal_pulse_data[i][0]-signal_pulse_data[i-1][1]); + signal_distance_data[i-1] = signal_pulse_data[i][0]-signal_pulse_data[i-1][1]; + if (signal_distance_data[i-1] > a[2]) + a[2] = signal_distance_data[i-1]; + if (signal_distance_data[i-1] <= a[0]) + a[0] = signal_distance_data[i-1]; + } + } + min = a[0]; + max = a[2]; + a[1] = (a[0]+a[2])/2; +// for (i=0 ; i<1 ; i++) { +// b[i] = (a[i]+a[i+1])/2; +// } + b[0] = (a[0]+a[1])/2; + b[1] = (a[1]+a[2])/2; +// fprintf(stderr, "a[0]: %d\t a[1]: %d\t a[2]: %d\t\n",a[0],a[1],a[2]); +// fprintf(stderr, "b[0]: %d\t b[1]: %d\n",b[0],b[1]); + + k=1; + delta = 10000000; + while((k < 10) && (delta > 0)) { + for (i=0 ; i<3 ; i++) { + a_new[i] = 0; + a_cnt[i] = 0; + } + + for (i=0 ; i < 1000 ; i++) { + if (signal_distance_data[i] > 0) { + if (signal_distance_data[i] < b[0]) { + a_new[0] += signal_distance_data[i]; + a_cnt[0]++; + } else if (signal_distance_data[i] < b[1] && signal_distance_data[i] >= b[0]){ + a_new[1] += signal_distance_data[i]; + a_cnt[1]++; + } else if (signal_distance_data[i] >= b[1]) { + a_new[2] += signal_distance_data[i]; + a_cnt[2]++; + } + } + } + +// fprintf(stderr, "Iteration %d.", k); + delta = 0; + for (i=0 ; i<3 ; i++) { + if (a_cnt[i]) + a_new[i] /= a_cnt[i]; + delta += (a[i]-a_new[i])*(a[i]-a_new[i]); +// fprintf(stderr, "\ta[%d]: %d (%d)", i, a_new[i], a[i]); + a[i] = a_new[i]; + } +// fprintf(stderr, " delta %d\n", delta); + + if (a[0] < min) { + a[0] = min; +// fprintf(stderr, "Fixing a[0] = %d\n", min); + } + if (a[2] > max) { + a[0] = max; +// fprintf(stderr, "Fixing a[2] = %d\n", max); + } +// if (a[1] == 0) { +// a[1] = (a[2]+a[0])/2; +// fprintf(stderr, "Fixing a[1] = %d\n", a[1]); +// } + +// fprintf(stderr, "Iteration %d.", k); + for (i=0 ; i<2 ; i++) { +// fprintf(stderr, "\tb[%d]: (%d) ", i, b[i]); + b[i] = (a[i]+a[i+1])/2; +// fprintf(stderr, "%d ", b[i]); + } +// fprintf(stderr, "\n"); + k++; + } + + if (override_short) { + p_limit = override_short; + a[0] = override_short; + } + + if (override_long) { + a[1] = override_long; + } + + if (a[1]<a[0]) { + a[1]=a[0]+1; + } + + if (a[2]<a[1]*2) { + a[2] = a[1]*2; + } + + fprintf(stderr, "\nShort distance: %d, long distance: %d, packet distance: %d\n",a[0],a[1],a[2]); + fprintf(stderr, "\np_limit: %d\n",p_limit); + + demod_reset_bits_packet(&p); + if (signal_type == 1) { + for(i=0 ; i<1000 ; i++){ + if (signal_distance_data[i] > 0) { + if (signal_distance_data[i] < (a[0]+a[1])/2) { +// fprintf(stderr, "0 [%d] %d < %d\n",i, signal_distance_data[i], (a[0]+a[1])/2); + demod_add_bit(&p, 0); + } else if ((signal_distance_data[i] > (a[0]+a[1])/2) && (signal_distance_data[i] < (a[1]+a[2])/2)) { +// fprintf(stderr, "0 [%d] %d > %d\n",i, signal_distance_data[i], (a[0]+a[1])/2); + demod_add_bit(&p, 1); + } else if (signal_distance_data[i] > (a[1]+a[2])/2) { +// fprintf(stderr, "0 [%d] %d > %d\n",i, signal_distance_data[i], (a[1]+a[2])/2); + demod_next_bits_packet(&p); + } + + } + + } + demod_print_bits_packet(&p); + } + if (signal_type == 2) { + for(i=0 ; i<1000 ; i++){ + if(signal_pulse_data[i][2] > 0) { + if (signal_pulse_data[i][2] < p_limit) { +// fprintf(stderr, "0 [%d] %d < %d\n",i, signal_pulse_data[i][2], p_limit); + demod_add_bit(&p, 0); + } else { +// fprintf(stderr, "1 [%d] %d > %d\n",i, signal_pulse_data[i][2], p_limit); + demod_add_bit(&p, 1); + } + if ((signal_distance_data[i] >= (a[1]+a[2])/2)) { +// fprintf(stderr, "\\n [%d] %d > %d\n",i, signal_distance_data[i], (a[1]+a[2])/2); + demod_next_bits_packet(&p); + } + + + } + } + demod_print_bits_packet(&p); + } + + for (i=0 ; i<1000 ; i++) { + signal_pulse_data[i][0] = 0; + signal_pulse_data[i][1] = 0; + signal_pulse_data[i][2] = 0; + signal_distance_data[i] = 0; + } + +}; + + +static void pwm_analyze(struct dm_state *demod, int16_t *buf, uint32_t len) +{ + unsigned int i; + + for (i=0 ; i<len ; i++) { + if (buf[i] > demod->level_limit) { + if (!signal_start) + signal_start = counter; + if (print) { + pulses_found++; + pulse_start = counter; + signal_pulse_data[signal_pulse_counter][0] = counter; + signal_pulse_data[signal_pulse_counter][1] = -1; + signal_pulse_data[signal_pulse_counter][2] = -1; + if (debug_output) fprintf(stderr, "pulse_distance %d\n",counter-pulse_end); + if (debug_output) fprintf(stderr, "pulse_start distance %d\n",pulse_start-prev_pulse_start); + if (debug_output) fprintf(stderr, "pulse_start[%d] found at sample %d, value = %d\n",pulses_found, counter, buf[i]); + prev_pulse_start = pulse_start; + print =0; + print2 = 1; + } + } + counter++; + if (buf[i] < demod->level_limit) { + if (print2) { + pulse_avg += counter-pulse_start; + if (debug_output) fprintf(stderr, "pulse_end [%d] found at sample %d, pulse length = %d, pulse avg length = %d\n", + pulses_found, counter, counter-pulse_start, pulse_avg/pulses_found); + pulse_end = counter; + print2 = 0; + signal_pulse_data[signal_pulse_counter][1] = counter; + signal_pulse_data[signal_pulse_counter][2] = counter-pulse_start; + signal_pulse_counter++; + if (signal_pulse_counter >= 4000) { + signal_pulse_counter = 0; + goto err; + } + } + print = 1; + if (signal_start && (pulse_end + 50000 < counter)) { + signal_end = counter - 40000; + fprintf(stderr, "*** signal_start = %d, signal_end = %d\n",signal_start-10000, signal_end); + fprintf(stderr, "signal_len = %d, pulses = %d\n", signal_end-(signal_start-10000), pulses_found); + pulses_found = 0; + classify_signal(); + + signal_pulse_counter = 0; + if (demod->sg_buf) { + int start_pos, signal_bszie, wlen, wrest=0, sg_idx, idx; + char sgf_name[256] = {0}; + FILE *sgfp; + + sprintf(sgf_name, "gfile%03d.data",demod->signal_grabber); + demod->signal_grabber++; + signal_bszie = 2*(signal_end-(signal_start-10000)); + signal_bszie = (131072-(signal_bszie%131072)) + signal_bszie; + sg_idx = demod->sg_index-demod->sg_len; + if (sg_idx < 0) + sg_idx = SIGNAL_GRABBER_BUFFER-demod->sg_len; + idx = (i-40000)*2; + start_pos = sg_idx+idx-signal_bszie; + fprintf(stderr, "signal_bszie = %d - sg_index = %d\n", signal_bszie, demod->sg_index); + fprintf(stderr, "start_pos = %d - buffer_size = %d\n", start_pos, SIGNAL_GRABBER_BUFFER); + if (signal_bszie > SIGNAL_GRABBER_BUFFER) + fprintf(stderr, "Signal bigger then buffer, signal = %d > buffer %d !!\n", signal_bszie, SIGNAL_GRABBER_BUFFER); + + if (start_pos < 0) { + start_pos = SIGNAL_GRABBER_BUFFER+start_pos; + fprintf(stderr, "restart_pos = %d\n", start_pos); + } + + fprintf(stderr, "*** Saving signal to file %s\n",sgf_name); + sgfp = fopen(sgf_name, "wb"); + if (!sgfp) { + fprintf(stderr, "Failed to open %s\n", sgf_name); + } + wlen = signal_bszie; + if (start_pos + signal_bszie > SIGNAL_GRABBER_BUFFER) { + wlen = SIGNAL_GRABBER_BUFFER - start_pos; + wrest = signal_bszie - wlen; + } + fprintf(stderr, "*** Writing data from %d, len %d\n",start_pos, wlen); + fwrite(&demod->sg_buf[start_pos], 1, wlen, sgfp); + + if (wrest) { + fprintf(stderr, "*** Writing data from %d, len %d\n",0, wrest); + fwrite(&demod->sg_buf[0], 1, wrest, sgfp); + } + + fclose(sgfp); + } + signal_start = 0; + } + } + + + } + return; + +err: + fprintf(stderr, "To many pulses detected, probably bad input data or input parameters\n"); + return; +} + +/* The distance between pulses decodes into bits */ + +static void pwm_d_decode(struct dm_state *demod, struct protocol_state* p, int16_t *buf, uint32_t len) { + unsigned int i; + + for (i=0 ; i<len ; i++) { + if (buf[i] > demod->level_limit) { + p->pulse_count = 1; + p->start_c = 1; + } + if (p->pulse_count && (buf[i] < demod->level_limit)) { + p->pulse_length = 0; + p->pulse_distance = 1; + p->sample_counter = 0; + p->pulse_count = 0; + } + if (p->start_c) p->sample_counter++; + if (p->pulse_distance && (buf[i] > demod->level_limit)) { + if (p->sample_counter < p->short_limit) { + demod_add_bit(p, 0); + } else if (p->sample_counter < p->long_limit) { + demod_add_bit(p, 1); + } else { + demod_next_bits_packet(p); + p->pulse_count = 0; + p->sample_counter = 0; + } + p->pulse_distance = 0; + } + if (p->sample_counter > p->reset_limit) { + p->start_c = 0; + p->sample_counter = 0; + p->pulse_distance = 0; + if (p->callback) + events+=p->callback(p->bits_buffer); + else + demod_print_bits_packet(p); + + demod_reset_bits_packet(p); + } + } +} + +/* The length of pulses decodes into bits */ + +static void pwm_p_decode(struct dm_state *demod, struct protocol_state* p, int16_t *buf, uint32_t len) { + unsigned int i; + + for (i=0 ; i<len ; i++) { + if (buf[i] > demod->level_limit && !p->start_bit) { + /* start bit detected */ + p->start_bit = 1; + p->start_c = 1; + p->sample_counter = 0; +// fprintf(stderr, "start bit pulse start detected\n"); + } + + if (!p->real_bits && p->start_bit && (buf[i] < demod->level_limit)) { + /* end of startbit */ + p->real_bits = 1; +// fprintf(stderr, "start bit pulse end detected\n"); + } + if (p->start_c) p->sample_counter++; + + + if (!p->pulse_start && p->real_bits && (buf[i] > demod->level_limit)) { + /* save the pulse start, it will never be zero */ + p->pulse_start = p->sample_counter; +// fprintf(stderr, "real bit pulse start detected\n"); + + } + + if (p->real_bits && p->pulse_start && (buf[i] < demod->level_limit)) { + /* end of pulse */ + + p->pulse_length = p->sample_counter-p->pulse_start; +// fprintf(stderr, "real bit pulse end detected %d\n", p->pulse_length); +// fprintf(stderr, "space duration %d\n", p->sample_counter); + + if (p->pulse_length <= p->short_limit) { + demod_add_bit(p, 1); + } else if (p->pulse_length > p->short_limit) { + demod_add_bit(p, 0); + } + p->sample_counter = 0; + p->pulse_start = 0; + } + + if (p->real_bits && p->pulse_length > p->long_limit) { + demod_next_bits_packet(p); + + p->start_bit = 0; + p->real_bits = 0; + } + + if (p->sample_counter > p->reset_limit) { + p->start_c = 0; + p->sample_counter = 0; + if (p->callback) + events+=p->callback(p->bits_buffer); + else + demod_print_bits_packet(p); + demod_reset_bits_packet(p); + + p->start_bit = 0; + p->real_bits = 0; + } + } +} + + + +/** Something that might look like a IIR lowpass filter + * + * [b,a] = butter(1, 0.01) -> quantizes nicely thus suitable for fixed point + * Q1.15*Q15.0 = Q16.15 + * Q16.15>>1 = Q15.14 + * Q15.14 + Q15.14 + Q15.14 could possibly overflow to 17.14 + * but the b coeffs are small so it wont happen + * Q15.14>>14 = Q15.0 \o/ + */ + +static uint16_t lp_xmem[FILTER_ORDER] = {0}; + +#define F_SCALE 15 +#define S_CONST (1<<F_SCALE) +#define FIX(x) ((int)(x*S_CONST)) + +int a[FILTER_ORDER+1] = {FIX(1.00000),FIX(0.96907)}; +int b[FILTER_ORDER+1] = {FIX(0.015466),FIX(0.015466)}; + +static void low_pass_filter(uint16_t *x_buf, int16_t *y_buf, uint32_t len) +{ + unsigned int i; + + /* Calculate first sample */ + y_buf[0] = ((a[1]*y_buf[-1]>>1) + (b[0]*x_buf[0]>>1) + (b[1]*lp_xmem[0]>>1)) >> (F_SCALE-1); + for (i=1 ; i<len ; i++) { + y_buf[i] = ((a[1]*y_buf[i-1]>>1) + (b[0]*x_buf[i]>>1) + (b[1]*x_buf[i-1]>>1)) >> (F_SCALE-1); + } + + /* Save last sample */ + memcpy(lp_xmem, &x_buf[len-1-FILTER_ORDER], FILTER_ORDER*sizeof(int16_t)); + memcpy(&y_buf[-FILTER_ORDER], &y_buf[len-1-FILTER_ORDER], FILTER_ORDER*sizeof(int16_t)); + //fprintf(stderr, "%d\n", y_buf[0]); +} + + +static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) +{ + struct dm_state *demod = ctx; + uint16_t* sbuf = (uint16_t*) buf; + int i; + if (demod->file || !demod->save_data) { + if (do_exit || do_exit_async) + return; + + if ((bytes_to_read > 0) && (bytes_to_read < len)) { + len = bytes_to_read; + do_exit = 1; + rtlsdr_cancel_async(dev); + } + + if (demod->signal_grabber) { + //fprintf(stderr, "[%d] sg_index - len %d\n", demod->sg_index, len ); + memcpy(&demod->sg_buf[demod->sg_index], buf, len); + demod->sg_len =len; + demod->sg_index +=len; + if (demod->sg_index+len > SIGNAL_GRABBER_BUFFER) + demod->sg_index = 0; + } + + + if (demod->debug_mode == 0) { + envelope_detect(buf, len, demod->decimation_level); + low_pass_filter(sbuf, demod->f_buf, len>>(demod->decimation_level+1)); + } else if (demod->debug_mode == 1){ + memcpy(demod->f_buf, buf, len); + } + if (demod->analyze) { + pwm_analyze(demod, demod->f_buf, len/2); + } + { + for (i=0 ; i<demod->r_dev_num ; i++) { + switch (demod->r_devs[i]->modulation) { + case OOK_PWM_D: + pwm_d_decode(demod, demod->r_devs[i], demod->f_buf, len/2); + break; + case OOK_PWM_P: + pwm_p_decode(demod, demod->r_devs[i], demod->f_buf, len/2); + break; + default: + fprintf(stderr, "Unknown modulation %d in protocol!\n", demod->r_devs[i]->modulation); + } + } + } + + if (demod->save_data) { + if (fwrite(demod->f_buf, 1, len>>demod->decimation_level, demod->file) != len>>demod->decimation_level) { + fprintf(stderr, "Short write, samples lost, exiting!\n"); + rtlsdr_cancel_async(dev); + } + } + + if (bytes_to_read > 0) + bytes_to_read -= len; + + if(frequencies>1) { + time_t rawtime; + time(&rawtime); + if(difftime(rawtime, rawtime_old)>DEFAULT_HOP_TIME || events>=DEFAULT_HOP_EVENTS) { + rawtime_old=rawtime; + events=0; + do_exit_async=1; + rtlsdr_cancel_async(dev); + } + } + } +} + +int main(int argc, char **argv) +{ +#ifndef _WIN32 + struct sigaction sigact; +#endif + char *filename = NULL; + char *test_mode_file = NULL; + FILE *test_mode; + int n_read; + int r, opt; + int i, gain = 0; + int sync_mode = 0; + int ppm_error = 0; + struct dm_state* demod; + uint8_t *buffer; + uint32_t dev_index = 0; + int frequency_current=0; + uint32_t out_block_size = DEFAULT_BUF_LENGTH; + int device_count; + char vendor[256], product[256], serial[256]; + + demod = malloc(sizeof(struct dm_state)); + memset(demod,0,sizeof(struct dm_state)); + + /* initialize tables */ + calc_squares(); + + demod->f_buf = &demod->filter_buffer[FILTER_ORDER]; + demod->decimation_level = DEFAULT_DECIMATION_LEVEL; + demod->level_limit = DEFAULT_LEVEL_LIMIT; + + + while ((opt = getopt(argc, argv, "x:z:p:Dtam:r:c:l:d:f:g:s:b:n:S::")) != -1) { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 'f': + if(frequencies<MAX_PROTOCOLS) frequency[frequencies++] = (uint32_t)atof(optarg); + else fprintf(stderr, "Max number of frequencies reached %d\n",MAX_PROTOCOLS); + break; + case 'g': + gain = (int)(atof(optarg) * 10); /* tenths of a dB */ + break; + case 'p': + ppm_error = atoi(optarg); + break; + case 's': + samp_rate = (uint32_t)atof(optarg); + break; + case 'b': + out_block_size = (uint32_t)atof(optarg); + break; + case 'l': + demod->level_limit = (uint32_t)atof(optarg); + break; + case 'n': + bytes_to_read = (uint32_t)atof(optarg) * 2; + break; + case 'c': + demod->decimation_level = (uint32_t)atof(optarg); + break; + case 'a': + demod->analyze = 1; + break; + case 'r': + test_mode_file = optarg; + break; + case 't': + demod->signal_grabber = 1; + break; + case 'm': + demod->debug_mode = atoi(optarg); + break; + case 'S': + sync_mode = 1; + break; + case 'D': + debug_output = 1; + break; + case 'z': + override_short = atoi(optarg); + break; + case 'x': + override_long = atoi(optarg); + break; + default: + usage(); + break; + } + } + + /* init protocols somewhat ok */ + register_protocol(demod, &rubicson); + register_protocol(demod, &prologue); + register_protocol(demod, &silvercrest); +// register_protocol(demod, &generic_hx2262); +// register_protocol(demod, &technoline_ws9118); + register_protocol(demod, &elv_em1000); + register_protocol(demod, &elv_ws2000); + register_protocol(demod, &waveman); + register_protocol(demod, &steffen); + register_protocol(demod, &acurite5n1); + register_protocol(demod, &wh2); + + if (argc <= optind-1) { + usage(); + } else { + filename = argv[optind]; + } + + if(out_block_size < MINIMAL_BUF_LENGTH || + out_block_size > MAXIMAL_BUF_LENGTH ){ + fprintf(stderr, + "Output block size wrong value, falling back to default\n"); + fprintf(stderr, + "Minimal length: %u\n", MINIMAL_BUF_LENGTH); + fprintf(stderr, + "Maximal length: %u\n", MAXIMAL_BUF_LENGTH); + out_block_size = DEFAULT_BUF_LENGTH; + } + + buffer = malloc(out_block_size * sizeof(uint8_t)); + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + if (!test_mode_file) + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); + } + fprintf(stderr, "\n"); + + fprintf(stderr, "Using device %d: %s\n", + dev_index, rtlsdr_get_device_name(dev_index)); + + r = rtlsdr_open(&dev, dev_index); + if (r < 0) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + if (!test_mode_file) + exit(1); + } +#ifndef _WIN32 + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGPIPE, &sigact, NULL); +#else + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#endif + /* Set the sample rate */ + r = rtlsdr_set_sample_rate(dev, samp_rate); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set sample rate.\n"); + else + fprintf(stderr, "Sample rate set to %d.\n", rtlsdr_get_sample_rate(dev)); // Unfortunately, doesn't return real rate + + fprintf(stderr, "Sample rate decimation set to %d. %d->%d\n",demod->decimation_level, samp_rate, samp_rate>>demod->decimation_level); + fprintf(stderr, "Bit detection level set to %d.\n", demod->level_limit); + + if (0 == gain) { + /* Enable automatic gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 0); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable automatic gain.\n"); + else + fprintf(stderr, "Tuner gain set to Auto.\n"); + } else { + /* Enable manual gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 1); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable manual gain.\n"); + + /* Set the tuner gain */ + r = rtlsdr_set_tuner_gain(dev, gain); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set tuner gain.\n"); + else + fprintf(stderr, "Tuner gain set to %f dB.\n", gain/10.0); + } + + r = rtlsdr_set_freq_correction(dev, ppm_error); + + demod->save_data = 1; + if (!filename) { + demod->save_data = 0; + } else if(strcmp(filename, "-") == 0) { /* Write samples to stdout */ + demod->file = stdout; +#ifdef _WIN32 + _setmode(_fileno(stdin), _O_BINARY); +#endif + } else { + demod->file = fopen(filename, "wb"); + if (!demod->file) { + fprintf(stderr, "Failed to open %s\n", filename); + goto out; + } + } + + if (demod->signal_grabber) + demod->sg_buf = malloc(SIGNAL_GRABBER_BUFFER); + + if (test_mode_file) { + int i = 0; + unsigned char test_mode_buf[DEFAULT_BUF_LENGTH]; + fprintf(stderr, "Test mode active. Reading samples from file: %s\n",test_mode_file); + test_mode = fopen(test_mode_file, "r"); + if (!test_mode) { + fprintf(stderr, "Opening file: %s failed!\n",test_mode_file); + goto out; + } + while(fread(test_mode_buf, 131072, 1, test_mode) != 0) { + rtlsdr_callback(test_mode_buf, 131072, demod); + i++; + } + //Always classify a signal at the end of the file + classify_signal(); + fprintf(stderr, "Test mode file issued %d packets\n", i); + fprintf(stderr, "Filter coeffs used:\n"); + fprintf(stderr, "a: %d %d\n", a[0], a[1]); + fprintf(stderr, "b: %d %d\n", b[0], b[1]); + exit(0); + } + + /* Reset endpoint before we start reading from it (mandatory) */ + r = rtlsdr_reset_buffer(dev); + if (r < 0) + fprintf(stderr, "WARNING: Failed to reset buffers.\n"); + + if (sync_mode) { + fprintf(stderr, "Reading samples in sync mode...\n"); + while (!do_exit) { + r = rtlsdr_read_sync(dev, buffer, out_block_size, &n_read); + if (r < 0) { + fprintf(stderr, "WARNING: sync read failed.\n"); + break; + } + + if ((bytes_to_read > 0) && (bytes_to_read < (uint32_t)n_read)) { + n_read = bytes_to_read; + do_exit = 1; + } + + if (fwrite(buffer, 1, n_read, demod->file) != (size_t)n_read) { + fprintf(stderr, "Short write, samples lost, exiting!\n"); + break; + } + + if ((uint32_t)n_read < out_block_size) { + fprintf(stderr, "Short read, samples lost, exiting!\n"); + break; + } + + if (bytes_to_read > 0) + bytes_to_read -= n_read; + } + } else { + if(frequencies==0) { + frequency[0] = DEFAULT_FREQUENCY; + frequencies=1; + } else { + time(&rawtime_old); + } + fprintf(stderr, "Reading samples in async mode...\n"); + while(!do_exit) { + /* Set the frequency */ + r = rtlsdr_set_center_freq(dev, frequency[frequency_current]); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set center freq.\n"); + else + fprintf(stderr, "Tuned to %u Hz.\n", rtlsdr_get_center_freq(dev)); + r = rtlsdr_read_async(dev, rtlsdr_callback, (void *)demod, + DEFAULT_ASYNC_BUF_NUMBER, out_block_size); + do_exit_async=0; + frequency_current++; + if(frequency_current>frequencies-1) frequency_current=0; + } + } + + if (do_exit) + fprintf(stderr, "\nUser cancel, exiting...\n"); + else + fprintf(stderr, "\nLibrary error %d, exiting...\n", r); + + if (demod->file && (demod->file != stdout)) + fclose(demod->file); + + for (i=0 ; i<demod->r_dev_num ; i++) + free(demod->r_devs[i]); + + if (demod->signal_grabber) + free(demod->sg_buf); + + if(demod) + free(demod); + + rtlsdr_close(dev); + free (buffer); +out: + return r >= 0 ? r : -r; +} diff --git a/src/rtl_433.c~ b/src/rtl_433.c~ new file mode 100755 index 0000000..7911d9e --- /dev/null +++ b/src/rtl_433.c~ @@ -0,0 +1,1789 @@ +/* + * rtl_433, turns your Realtek RTL2832 based DVB dongle into a 433.92MHz generic data receiver + * Copyright (C) 2012 by Benjamin Larsson <benjamin@southpole.se> + * + * Based on rtl_sdr + * + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +/* Currently this can decode the temperature and id from Rubicson sensors + * + * the sensor sends 36 bits 12 times pwm modulated + * the data is grouped into 9 nibles + * [id0] [id1], [unk0] [temp0], [temp1] [temp2], [unk1] [unk2], [unk3] + * + * The id changes when the battery is changed in the sensor. + * unk0 is always 1 0 0 0, most likely 2 channel bits as the sensor can recevice 3 channels + * unk1-3 changes and the meaning is unknown + * temp is 12 bit signed scaled by 10 + * + * The sensor can be bought at Kjell&Co + */ + +/* Prologue sensor protocol + * + * the sensor sends 36 bits 7 times, before the first packet there is a pulse sent + * the packets are pwm modulated + * + * the data is grouped in 9 nibles + * [id0] [rid0] [rid1] [data0] [temp0] [temp1] [temp2] [humi0] [humi1] + * + * id0 is always 1001,9 + * rid is a random id that is generated when the sensor starts, could include battery status + * the same batteries often generate the same id + * data(3) is 0 the battery status, 1 ok, 0 low, first reading always say low + * data(2) is 1 when the sensor sends a reading when pressing the button on the sensor + * data(1,0)+1 forms the channel number that can be set by the sensor (1-3) + * temp is 12 bit signed scaled by 10 + * humi0 is always 1100,c if no humidity sensor is available + * humi1 is always 1100,c if no humidity sensor is available + * + * The sensor can be bought at Clas Ohlson + */ + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <time.h> + +#ifndef _WIN32 +#include <unistd.h> +#else +#include <Windows.h> +#include <io.h> +#include <fcntl.h> +#include "getopt/getopt.h" +#endif + +#include "rtl-sdr.h" + +#define DEFAULT_SAMPLE_RATE 250000 +#define DEFAULT_FREQUENCY 433920000 +#define DEFAULT_HOP_TIME (60*10) +#define DEFAULT_HOP_EVENTS 2 +#define DEFAULT_ASYNC_BUF_NUMBER 32 +#define DEFAULT_BUF_LENGTH (16 * 16384) +#define DEFAULT_LEVEL_LIMIT 10000 +#define DEFAULT_DECIMATION_LEVEL 0 +#define MINIMAL_BUF_LENGTH 512 +#define MAXIMAL_BUF_LENGTH (256 * 16384) +#define FILTER_ORDER 1 +#define MAX_PROTOCOLS 10 +#define SIGNAL_GRABBER_BUFFER (12 * DEFAULT_BUF_LENGTH) +#define BITBUF_COLS 34 +#define BITBUF_ROWS 50 + +static int do_exit = 0; +static int do_exit_async=0, frequencies=0, events=0; +uint32_t frequency[MAX_PROTOCOLS]; +time_t rawtime_old; +int flag; +uint32_t samp_rate=DEFAULT_SAMPLE_RATE; +static uint32_t bytes_to_read = 0; +static rtlsdr_dev_t *dev = NULL; +static uint16_t scaled_squares[256]; +static int debug_output = 0; +static int override_short = 0; +static int override_long = 0; + +/* Supported modulation types */ +#define OOK_PWM_D 1 /* Pulses are of the same length, the distance varies */ +#define OOK_PWM_P 2 /* The length of the pulses varies */ + + +typedef struct { + unsigned int id; + char name[256]; + unsigned int modulation; + unsigned int short_limit; + unsigned int long_limit; + unsigned int reset_limit; + int (*json_callback)(uint8_t bits_buffer[BITBUF_ROWS][BITBUF_COLS]) ; +} r_device; + +static int debug_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int i,j,k; + fprintf(stderr, "\n"); + for (i=0 ; i<BITBUF_ROWS ; i++) { + fprintf(stderr, "[%02d] ",i); + for (j=0 ; j<BITBUF_COLS ; j++) { + fprintf(stderr, "%02x ", bb[i][j]); + } + fprintf(stderr, ": "); + for (j=0 ; j<BITBUF_COLS ; j++) { + for (k=7 ; k>=0 ; k--) { + if (bb[i][j] & 1<<k) + fprintf(stderr, "1"); + else + fprintf(stderr, "0"); + } + fprintf(stderr, " "); + } + fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); + + return 0; +} + +uint8_t crc8( uint8_t *addr, uint8_t len) +{ + uint8_t crc = 0; + + // Indicated changes are from reference CRC-8 function in OneWire library + while (len--) { + uint8_t inbyte = *addr++; + int i; + for (i = 8; i; i--) { + uint8_t mix = (crc ^ inbyte) & 0x80; // changed from & 0x01 + crc <<= 1; // changed from right shift + if (mix) crc ^= 0x31;// changed from 0x8C; + inbyte <<= 1; // changed from right shift + } + } + return crc; +} + +static int wh2_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int j,k; + + uint8_t payload[4]; + uint8_t received_crc8,payload_crc8; + + int wh2_id; + float wh2_temp; + float wh2_humidity; + + if (bb[0][0] != 0xFE) return 0; + + payload[0] = bb[0][1]>>1; + payload[1] = bb[0][2]>>1 | ((bb[0][1]&1) << 7 ); + payload[2] = bb[0][3]>>1 | ((bb[0][2]&1) << 7 ); + payload[3] = bb[0][4]>>1 | ((bb[0][3]&1) << 7 ); + + received_crc8 = (bb[0][5]>>1) | ((bb[0][4]&1) << 7 ); + + payload_crc8 = crc8(payload,4); + + if (payload_crc8 != received_crc8) return 0; + + wh2_id = (payload[0] << 4) + (payload[1] >> 4); + wh2_temp = ((payload[1] & 0x7) << 8) + payload[2]; + if (payload[1] & 0x8) { + wh2_temp = -wh2_temp; + } + wh2_temp = wh2_temp/10; + + wh2_humidity = payload[3]; + + fprintf(stdout, "SENSOR:TYPE=WH2,ID=%x,HUMIDITY=%g,TEMPERATURE=%g\n",wh2_id,wh2_humidity,wh2_temp); + + return 1; +} + +static int silvercrest_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + /* FIXME validate the received message better */ + if (bb[1][0] == 0xF8 && + bb[2][0] == 0xF8 && + bb[3][0] == 0xF8 && + bb[4][0] == 0xF8 && + bb[1][1] == 0x4d && + bb[2][1] == 0x4d && + bb[3][1] == 0x4d && + bb[4][1] == 0x4d) { + /* Pretty sure this is a Silvercrest remote */ + fprintf(stdout, "BUTTON:TYPE=SILVERCREST,CODE=%02x-%02x-%02x-%02x-%02x\n",bb[1][0],bb[0][1],bb[0][2],bb[0][3],bb[0][4]); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int rubicson_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int temperature_before_dec; + int temperature_after_dec; + int16_t temp; + float ftemp; + + /* FIXME validate the received message better, figure out crc */ + if (bb[1][0] == bb[2][0] && bb[2][0] == bb[3][0] && bb[3][0] == bb[4][0] && + bb[4][0] == bb[5][0] && bb[5][0] == bb[6][0] && bb[6][0] == bb[7][0] && bb[7][0] == bb[8][0] && + bb[8][0] == bb[9][0] && (bb[5][0] != 0 && bb[5][1] != 0 && bb[5][2] != 0)) { + + /* Nible 3,4,5 contains 12 bits of temperature + * The temperature is signed and scaled by 10 */ + temp = (int16_t)((uint16_t)(bb[0][1] << 12) | (bb[0][2] << 4)); + temp = temp >> 4; + ftemp = (float)temp/10; + + fprintf(stdout, "SENSOR:TYPE=RUBICSON,ID=%x,TEMPERATURE=%f\n",bb[0][0],ftemp); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int prologue_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + int rid; + + int16_t temp2; + float ftemp; + + /* FIXME validate the received message better */ + if (((bb[1][0]&0xF0) == 0x90 && (bb[2][0]&0xF0) == 0x90 && (bb[3][0]&0xF0) == 0x90 && (bb[4][0]&0xF0) == 0x90 && + (bb[5][0]&0xF0) == 0x90 && (bb[6][0]&0xF0) == 0x90) || + ((bb[1][0]&0xF0) == 0x50 && (bb[2][0]&0xF0) == 0x50 && (bb[3][0]&0xF0) == 0x50 && (bb[4][0]&0xF0) == 0x50)) { + + /* Prologue sensor */ + temp2 = (int16_t)((uint16_t)(bb[1][2] << 8) | (bb[1][3]&0xF0)); + temp2 = temp2 >> 4; + ftemp = (float)temp2/10; + rid = ((bb[1][0]&0x0F)<<4)|(bb[1][1]&0xF0)>>4; + fprintf(stdout, + "SENSOR:TYPE=PROLOGUE,BUTTON=%d,BATTERY=%s,TEMPERATURE=%f,HUMIDITY=%d,CHANNEL=%d,ID=%d,RID=%02x\n", + bb[1][1]&0x04?1:0, + bb[1][1]&0x08?"Ok":"Low", + ftemp, + ((bb[1][3]&0x0F)<<4)|(bb[1][4]>>4), + (int)((bb[1][1]&0x03)+1), + (int)((bb[1][0]&0xF0)>>4), + rid); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int waveman_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + /* Two bits map to 2 states, 0 1 -> 0 and 1 1 -> 1 */ + int i; + uint8_t nb[3] = {0}; + + if (((bb[0][0]&0x55)==0x55) && ((bb[0][1]&0x55)==0x55) && ((bb[0][2]&0x55)==0x55) && ((bb[0][3]&0x55)==0x00)) { + for (i=0 ; i<3 ; i++) { + nb[i] |= ((bb[0][i]&0xC0)==0xC0) ? 0x00 : 0x01; + nb[i] |= ((bb[0][i]&0x30)==0x30) ? 0x00 : 0x02; + nb[i] |= ((bb[0][i]&0x0C)==0x0C) ? 0x00 : 0x04; + nb[i] |= ((bb[0][i]&0x03)==0x03) ? 0x00 : 0x08; + } + + fprintf(stdout, + "BUTTON:TYPE=WAVEMAN,ID=%c,CHANNEL=%d,BUTTON=%d,STATE=%s\n", + 'A'+nb[0], + (int)((nb[1]>>2)+1), + (int)((nb[1]&3)+1), + ((nb[2]==0xe) ? "on" : "off")); + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + +static int steffen_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + + if (bb[0][0]==0x00 && ((bb[1][0]&0x07)==0x07) && bb[1][0]==bb[2][0] && bb[2][0]==bb[3][0]) { + + fprintf(stdout, "BUTTON:TYPE=STEFFAN,CODE=%d%d%d%d%d,",(bb[1][0]&0x80)>>7, (bb[1][0]&0x40)>>6, (bb[1][0]&0x20)>>5, (bb[1][0]&0x10)>>4, (bb[1][0]&0x08)>>3); + + if ((bb[1][2]&0x0f)==0x0e) + fprintf(stdout, "BUTTON=A,"); + else if ((bb[1][2]&0x0f)==0x0d) + fprintf(stdout, "BUTTON=B,"); + else if ((bb[1][2]&0x0f)==0x0b) + fprintf(stdout, "BUTTON=C,"); + else if ((bb[1][2]&0x0f)==0x07) + fprintf(stdout, "BUTTON=D,"); + else if ((bb[1][2]&0x0f)==0x0f) + fprintf(stdout, "BUTTON=ALL,"); + else + fprintf(stdout, "BUTTON=UNKNOWN,"); + + if ((bb[1][2]&0xf0)==0xf0) { + fprintf(stdout, "STATE=OFF\n"); + } else { + fprintf(stdout, "STATE=ON\n"); + } + + if (debug_output) + debug_callback(bb); + + return 1; + } + return 0; +} + + +uint16_t AD_POP(uint8_t bb[BITBUF_COLS], uint8_t bits, uint8_t bit) { + uint16_t val = 0; + uint8_t i, byte_no, bit_no; + for (i=0;i<bits;i++) { + byte_no= (bit+i)/8 ; + bit_no =7-((bit+i)%8); + if (bb[byte_no]&(1<<bit_no)) val = val | (1<<i); + } + return val; +} + +static int em1000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + // based on fs20.c + uint8_t dec[10]; + uint8_t bytes=0; + uint8_t bit=18; // preamble + uint8_t bb_p[14]; + char* types[] = {"S", "?", "GZ"}; + uint8_t checksum_calculated = 0; + uint8_t i; + uint8_t stopbit; + uint8_t checksum_received; + + // check and combine the 3 repetitions + for (i = 0; i < 14; i++) { + if(bb[0][i]==bb[1][i] || bb[0][i]==bb[2][i]) bb_p[i]=bb[0][i]; + else if(bb[1][i]==bb[2][i]) bb_p[i]=bb[1][i]; + else return 0; + } + + // read 9 bytes with stopbit ... + for (i = 0; i < 9; i++) { + dec[i] = AD_POP (bb_p, 8, bit); bit+=8; + stopbit=AD_POP (bb_p, 1, bit); bit+=1; + if (!stopbit) { +// fprintf(stderr, "!stopbit: %i\n", i); + return 0; + } + checksum_calculated ^= dec[i]; + bytes++; + } + + // Read checksum + checksum_received = AD_POP (bb_p, 8, bit); bit+=8; + if (checksum_received != checksum_calculated) { +// fprintf(stderr, "checksum_received != checksum_calculated: %d %d\n", checksum_received, checksum_calculated); + return 0; + } + +//for (i = 0; i < bytes; i++) fprintf(stderr, "%02X ", dec[i]); fprintf(stderr, "\n"); + + // based on 15_CUL_EM.pm + fprintf(stdout, "SENSOR:TYPE=ELV-EM-1000,MODEL=%s,CODE=%d,SEQNO=%d,TOTAL=%d,CURRENT=%d,PEAK=%d\n",dec[0]>=1&&dec[0]<=3?types[dec[0]-1]:"?",dec[1],dec[2],dec[3]|dec[4]<<8,dec[5]|dec[6]<<8,dec[7]|dec[8]<<8); + + return 1; +} + +static int ws2000_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + // based on http://www.dc3yc.privat.t-online.de/protocol.htm + uint8_t dec[13]; + uint8_t nibbles=0; + uint8_t bit=11; // preamble + char* types[]={"!AS3", "AS2000/ASH2000/S2000/S2001A/S2001IA/ASH2200/S300IA", "!S2000R", "!S2000W", "S2001I/S2001ID", "!S2500H", "!Pyrano", "!KS200/KS300"}; + uint8_t check_calculated=0, sum_calculated=0; + uint8_t i; + uint8_t stopbit; + uint8_t sum_received; + + dec[0] = AD_POP (bb[0], 4, bit); bit+=4; + stopbit= AD_POP (bb[0], 1, bit); bit+=1; + if (!stopbit) { +//fprintf(stderr, "!stopbit\n"); + return 0; + } + check_calculated ^= dec[0]; + sum_calculated += dec[0]; + + // read nibbles with stopbit ... + for (i = 1; i <= (dec[0]==4?12:8); i++) { + dec[i] = AD_POP (bb[0], 4, bit); bit+=4; + stopbit= AD_POP (bb[0], 1, bit); bit+=1; + if (!stopbit) { +//fprintf(stderr, "!stopbit %i\n", i); + return 0; + } + check_calculated ^= dec[i]; + sum_calculated += dec[i]; + nibbles++; + } + + if (check_calculated) { +//fprintf(stderr, "check_calculated (%d) != 0\n", check_calculated); + return 0; + } + + // Read sum + sum_received = AD_POP (bb[0], 4, bit); bit+=4; + sum_calculated+=5; + sum_calculated&=0xF; + if (sum_received != sum_calculated) { +//fprintf(stderr, "sum_received (%d) != sum_calculated (%d) ", sum_received, sum_calculated); + return 0; + } + +//for (i = 0; i < nibbles; i++) fprintf(stderr, "%02X ", dec[i]); fprintf(stderr, "\n"); + + fprintf(stdout, "SENSOR:TYPE=ELV-WS-2000,MODEL=%s,CODE=%d,TEMPERATURE=%s%d.%d,HUMIDITY=%d.%d",dec[0]<=7?types[dec[0]]:"?",dec[1]&7,dec[1]&8?"-":"",dec[4]*10+dec[3],dec[2],dec[7]*10+dec[6], dec[5]); + if(dec[0]==4) { + fprintf(stdout, "PRESSURE=%d\n", 200+dec[10]*100+dec[9]*10+dec[8]); + } else { + fprintf(stdout, "\n"); + } + + return 1; +} + +// ** Acurite 5n1 functions ** + +const float acurite_winddirections[] = + { 337.5, 315.0, 292.5, 270.0, 247.5, 225.0, 202.5, 180, + 157.5, 135.0, 112.5, 90.0, 67.5, 45.0, 22.5, 0.0 }; + +static int acurite_raincounter = 0; + +static int acurite_crc(uint8_t row[BITBUF_COLS], int cols) { + // sum of first n-1 bytes modulo 256 should equal nth byte + int i; + int sum = 0; + for ( i=0; i < cols; i++) + sum += row[i]; + if ( sum % 256 == row[cols] ) + return 1; + else + return 0; +} + +static int acurite_detect(uint8_t *pRow) { + int i; + if ( pRow[0] != 0x00 ) { + // invert bits due to wierd issue + for (i = 0; i < 8; i++) + pRow[i] = ~pRow[i] & 0xFF; + pRow[0] |= pRow[8]; // fix first byte that has mashed leading bit + + if (acurite_crc(pRow, 7)) + return 1; // passes crc check + } + return 0; +} + +static float acurite_getTemp (uint8_t highbyte, uint8_t lowbyte) { + // range -40 to 158 F + int highbits = (highbyte & 0x0F) << 7 ; + int lowbits = lowbyte & 0x7F; + int rawtemp = highbits | lowbits; + float temp = (rawtemp - 400) / 10.0; + return temp; +} + +static int acurite_getWindSpeed (uint8_t highbyte, uint8_t lowbyte) { + // range: 0 to 159 kph + int highbits = ( highbyte & 0x1F) << 3; + int lowbits = ( lowbyte & 0x70 ) >> 4; + int speed = highbits | lowbits; + return speed; +} + +static float acurite_getWindDirection (uint8_t byte) { + // 16 compass points, ccw from (NNW) to 15 (N) + int direction = byte & 0x0F; + return acurite_winddirections[direction]; +} + +static int acurite_getHumidity (uint8_t byte) { + // range: 1 to 99 %RH + int humidity = byte & 0x7F; + return humidity; +} + +static int acurite_getRainfallCounter (uint8_t highbyte, uint8_t lowbyte) { + // range: 0 to 99.99 in, 0.01 in incr., rolling counter? + int highbits = (highbyte & 0x3F) << 7 ; + int lowbits = lowbyte & 0x7F; + int raincounter = highbits | lowbits; + return raincounter; +} + +static int acurite5n1_callback(uint8_t bb[BITBUF_ROWS][BITBUF_COLS]) { + // acurite 5n1 weather sensor decoding for rtl_433 + // Jens Jensen 2014 + int i; + uint8_t *buf = NULL; + // run through rows til we find one with good crc (brute force) + for (i=0; i < BITBUF_ROWS; i++) { + if (acurite_detect(bb[i])) { + buf = bb[i]; + break; // done + } + } + + if (buf) { + // decode packet here + fprintf(stdout, "SENSOR:TYPE=ACURITE"); + if (debug_output) { + for (i=0; i < 8; i++) + fprintf(stderr, "%02X ", buf[i]); + fprintf(stderr, "CRC OK\n"); + } + + if ((buf[2] & 0x0F) == 1) { + // wind speed, wind direction, rainfall + + float rainfall = 0.00; + int raincounter = 0; + if (acurite_raincounter > 0) { + // track rainfall difference after first run + raincounter = acurite_getRainfallCounter(buf[5], buf[6]); + rainfall = ( raincounter - acurite_raincounter ) * 0.01; + } else { + // capture starting counter + acurite_raincounter = raincounter; + } + + fprintf(stdout, ",WINDSPEED=%d", + acurite_getWindSpeed(buf[3], buf[4])); + fprintf(stdout, ",WINDDIRECTION=%0.1f", + acurite_getWindDirection(buf[4])); + fprintf(stdout, ",RAINGAUGE: %0.2f\n", rainfall); + + } else if ((buf[2] & 0x0F) == 8) { + // wind speed, temp, RH + fprintf(stdout, ",WINDSPEED=%d", + acurite_getWindSpeed(buf[3], buf[4])); + fprintf(stdout, ",TEMPERATURE=%2.1f", + acurite_getTemp(buf[4], buf[5])); + fprintf(stdout, ",HUMIDITY=%d\n", + acurite_getHumidity(buf[6])); + } + } + //if (debug_output) + // debug_callback(bb); + return 1; +} + + +// timings based on samp_rate=1024000 +r_device rubicson = { + /* .id = */ 1, + /* .name = */ "Rubicson Temperature Sensor", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 1744/4, + /* .long_limit = */ 3500/4, + /* .reset_limit = */ 5000/4, + /* .json_callback = */ &rubicson_callback, +}; + +r_device prologue = { + /* .id = */ 2, + /* .name = */ "Prologue Temperature Sensor", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 3500/4, + /* .long_limit = */ 7000/4, + /* .reset_limit = */ 15000/4, + /* .json_callback = */ &prologue_callback, +}; + +r_device silvercrest = { + /* .id = */ 3, + /* .name = */ "Silvercrest Remote Control", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 600/4, + /* .long_limit = */ 5000/4, + /* .reset_limit = */ 15000/4, + /* .json_callback = */ &silvercrest_callback, +}; + +r_device tech_line_fws_500 = { + /* .id = */ 4, + /* .name = */ "Tech Line FWS-500 Sensor", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 3500/4, + /* .long_limit = */ 7000/4, + /* .reset_limit = */ 15000/4, + // /* .json_callback = */ &rubicson_callback, +}; + +r_device generic_hx2262 = { + /* .id = */ 5, + /* .name = */ "Window/Door sensor", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 1300/4, + /* .long_limit = */ 10000/4, + /* .reset_limit = */ 40000/4, + // /* .json_callback = */ &silvercrest_callback, +}; + +r_device technoline_ws9118 = { + /* .id = */ 6, + /* .name = */ "Technoline WS9118", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 1800/4, + /* .long_limit = */ 3500/4, + /* .reset_limit = */ 15000/4, + /* .json_callback = */ &debug_callback, +}; + + +r_device elv_em1000 = { + /* .id = */ 7, + /* .name = */ "ELV EM 1000", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 750/4, + /* .long_limit = */ 7250/4, + /* .reset_limit = */ 30000/4, + /* .json_callback = */ &em1000_callback, +}; + +r_device elv_ws2000 = { + /* .id = */ 8, + /* .name = */ "ELV WS 2000", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ (602+(1155-602)/2)/4, + /* .long_limit = */ ((1755635-1655517)/2)/4, // no repetitions + /* .reset_limit = */ ((1755635-1655517)*2)/4, + /* .json_callback = */ &ws2000_callback, +}; + +r_device waveman = { + /* .id = */ 6, + /* .name = */ "Waveman Switch Transmitter", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 1000/4, + /* .long_limit = */ 8000/4, + /* .reset_limit = */ 30000/4, + /* .json_callback = */ &waveman_callback, +}; + +r_device steffen = { + /* .id = */ 9, + /* .name = */ "Steffen Switch Transmitter", + /* .modulation = */ OOK_PWM_D, + /* .short_limit = */ 140, + /* .long_limit = */ 270, + /* .reset_limit = */ 1500, + /* .json_callback = */ &steffen_callback, +}; + +r_device acurite5n1 = { + /* .id = */ 10, + /* .name = */ "Acurite 5n1 Weather Station", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 75, + /* .long_limit = */ 220, + /* .reset_limit = */ 20000, + /* .json_callback = */ &acurite5n1_callback, +}; + +r_device wh2 = { + /* .id = */ 11, + /* .name = */ "WH2 Weather Station", + /* .modulation = */ OOK_PWM_P, + /* .short_limit = */ 150, + /* .long_limit = */ 400, + /* .reset_limit = */ 20000, + /* .json_callback = */ &wh2_callback, +}; + +struct protocol_state { + int (*callback)(uint8_t bits_buffer[BITBUF_ROWS][BITBUF_COLS]); + + /* bits state */ + int bits_col_idx; + int bits_row_idx; + int bits_bit_col_idx; + uint8_t bits_buffer[BITBUF_ROWS][BITBUF_COLS]; + int16_t bits_per_row[BITBUF_ROWS]; + int bit_rows; + unsigned int modulation; + + /* demod state */ + int pulse_length; + int pulse_count; + int pulse_distance; + int sample_counter; + int start_c; + + int packet_present; + int pulse_start; + int real_bits; + int start_bit; + /* pwm limits */ + int short_limit; + int long_limit; + int reset_limit; + + +}; + + +struct dm_state { + FILE *file; + int save_data; + int32_t level_limit; + int32_t decimation_level; + int16_t filter_buffer[MAXIMAL_BUF_LENGTH+FILTER_ORDER]; + int16_t* f_buf; + int analyze; + int debug_mode; + + /* Signal grabber variables */ + int signal_grabber; + int8_t* sg_buf; + int sg_index; + int sg_len; + + + /* Protocol states */ + int r_dev_num; + struct protocol_state *r_devs[MAX_PROTOCOLS]; + +}; + +void usage(void) +{ + fprintf(stderr, + "rtl_433, an ISM band generic data receiver for RTL2832 based DVB-T receivers\n\n" + "Usage:\t[-d device_index (default: 0)]\n" + "\t[-g gain (default: 0 for auto)]\n" + "\t[-a analyze mode, print a textual description of the signal]\n" + "\t[-t signal auto save, use it together with analyze mode (-a -t)\n" + "\t[-l change the detection level used to determine pulses (0-3200) default: %i]\n" + "\t[-f [-f...] receive frequency[s], default: %i Hz]\n" + "\t[-s samplerate (default: %i Hz)]\n" + "\t[-S force sync output (default: async)]\n" + "\t[-r read data from file instead of from a receiver]\n" + "\t[-p ppm_error (default: 0)]\n" + "\t[-r test file name (indata)]\n" + "\t[-m test file mode (0 rtl_sdr data, 1 rtl_433 data)]\n" + "\t[-D print debug info on event\n" + "\t[-z override short value\n" + "\t[-x override long value\n" + "\tfilename (a '-' dumps samples to stdout)\n\n", DEFAULT_LEVEL_LIMIT, DEFAULT_FREQUENCY, DEFAULT_SAMPLE_RATE); + exit(1); +} + +#ifdef _WIN32 +BOOL WINAPI +sighandler(int signum) +{ + if (CTRL_C_EVENT == signum) { + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); + return TRUE; + } + return FALSE; +} +#else +static void sighandler(int signum) +{ + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); +} +#endif + +/* precalculate lookup table for envelope detection */ +static void calc_squares() { + int i; + for (i=0 ; i<256 ; i++) + scaled_squares[i] = (128-i) * (128-i); +} + +/** This will give a noisy envelope of OOK/ASK signals + * Subtract the bias (-128) and get an envelope estimation + * The output will be written in the input buffer + * @returns pointer to the input buffer + */ + +static void envelope_detect(unsigned char *buf, uint32_t len, int decimate) +{ + uint16_t* sample_buffer = (uint16_t*) buf; + unsigned int i; + unsigned op = 0; + unsigned int stride = 1<<decimate; + + for (i=0 ; i<len/2 ; i+=stride) { + sample_buffer[op++] = scaled_squares[buf[2*i ]]+scaled_squares[buf[2*i+1]]; + } +} + +static void demod_reset_bits_packet(struct protocol_state* p) { + memset(p->bits_buffer, 0 ,BITBUF_ROWS*BITBUF_COLS); + memset(p->bits_per_row, 0 ,BITBUF_ROWS); + p->bits_col_idx = 0; + p->bits_bit_col_idx = 7; + p->bits_row_idx = 0; + p->bit_rows = 0; +} + +static void demod_add_bit(struct protocol_state* p, int bit) { + p->bits_buffer[p->bits_row_idx][p->bits_col_idx] |= bit<<p->bits_bit_col_idx; + p->bits_bit_col_idx--; + if (p->bits_bit_col_idx<0) { + p->bits_bit_col_idx = 7; + p->bits_col_idx++; + if (p->bits_col_idx>BITBUF_COLS-1) { + p->bits_col_idx = BITBUF_COLS-1; +// fprintf(stderr, "p->bits_col_idx>%i!\n", BITBUF_COLS-1); + } + } + p->bits_per_row[p->bit_rows]++; +} + +static void demod_next_bits_packet(struct protocol_state* p) { + p->bits_col_idx = 0; + p->bits_row_idx++; + p->bits_bit_col_idx = 7; + if (p->bits_row_idx>BITBUF_ROWS-1) { + p->bits_row_idx = BITBUF_ROWS-1; + //fprintf(stderr, "p->bits_row_idx>%i!\n", BITBUF_ROWS-1); + } + p->bit_rows++; + if (p->bit_rows > BITBUF_ROWS-1) + p->bit_rows -=1; +} + +static void demod_print_bits_packet(struct protocol_state* p) { + int i,j,k; + + fprintf(stderr, "\n"); + for (i=0 ; i<p->bit_rows+1 ; i++) { + fprintf(stderr, "[%02d] {%d} ",i, p->bits_per_row[i]); + for (j=0 ; j<((p->bits_per_row[i]+8)/8) ; j++) { + fprintf(stderr, "%02x ", p->bits_buffer[i][j]); + } + fprintf(stderr, ": "); + for (j=0 ; j<((p->bits_per_row[i]+8)/8) ; j++) { + for (k=7 ; k>=0 ; k--) { + if (p->bits_buffer[i][j] & 1<<k) + fprintf(stderr, "1"); + else + fprintf(stderr, "0"); + } +// fprintf(stderr, "=0x%x ",demod->bits_buffer[i][j]); + fprintf(stderr, " "); + } + fprintf(stderr, "\n"); + } + fprintf(stderr, "\n"); + return; +} + +static void register_protocol(struct dm_state *demod, r_device *t_dev) { + struct protocol_state *p = calloc(1,sizeof(struct protocol_state)); + p->short_limit = (float)t_dev->short_limit/((float)DEFAULT_SAMPLE_RATE/(float)samp_rate); + p->long_limit = (float)t_dev->long_limit /((float)DEFAULT_SAMPLE_RATE/(float)samp_rate); + p->reset_limit = (float)t_dev->reset_limit/((float)DEFAULT_SAMPLE_RATE/(float)samp_rate); + p->modulation = t_dev->modulation; + p->callback = t_dev->json_callback; + demod_reset_bits_packet(p); + + demod->r_devs[demod->r_dev_num] = p; + demod->r_dev_num++; + + fprintf(stderr, "Registering protocol[%02d] %s\n",demod->r_dev_num, t_dev->name); + + if (demod->r_dev_num > MAX_PROTOCOLS) + fprintf(stderr, "Max number of protocols reached %d\n",MAX_PROTOCOLS); +} + + +static unsigned int counter = 0; +static unsigned int print = 1; +static unsigned int print2 = 0; +static unsigned int pulses_found = 0; +static unsigned int prev_pulse_start = 0; +static unsigned int pulse_start = 0; +static unsigned int pulse_end = 0; +static unsigned int pulse_avg = 0; +static unsigned int signal_start = 0; +static unsigned int signal_end = 0; +static unsigned int signal_pulse_data[4000][3] = {{0}}; +static unsigned int signal_pulse_counter = 0; + + +static void classify_signal() { + unsigned int i,k, max=0, min=1000000, t; + unsigned int delta, count_min, count_max, min_new, max_new, p_limit; + unsigned int a[3], b[2], a_cnt[3], a_new[3], b_new[2]; + unsigned int signal_distance_data[4000] = {0}; + struct protocol_state p = {0}; + unsigned int signal_type; + + if (!signal_pulse_data[0][0]) + return; + + for (i=0 ; i<1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { + //fprintf(stderr, "[%03d] s: %d\t e:\t %d\t l:%d\n", + //i, signal_pulse_data[i][0], signal_pulse_data[i][1], + //signal_pulse_data[i][2]); + if (signal_pulse_data[i][2] > max) + max = signal_pulse_data[i][2]; + if (signal_pulse_data[i][2] <= min) + min = signal_pulse_data[i][2]; + } + } + t=(max+min)/2; + //fprintf(stderr, "\n\nMax: %d, Min: %d t:%d\n", max, min, t); + + delta = (max - min)*(max-min); + + //TODO use Lloyd-Max quantizer instead + k=1; + while((k < 10) && (delta > 0)) { + min_new = 0; count_min = 0; + max_new = 0; count_max = 0; + + for (i=0 ; i < 1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { + if (signal_pulse_data[i][2] < t) { + min_new = min_new + signal_pulse_data[i][2]; + count_min++; + } + else { + max_new = max_new + signal_pulse_data[i][2]; + count_max++; + } + } + } + min_new = min_new / count_min; + max_new = max_new / count_max; + + delta = (min - min_new)*(min - min_new) + (max - max_new)*(max - max_new); + min = min_new; + max = max_new; + t = (min + max)/2; + + fprintf(stderr, "Iteration %d. t: %d min: %d (%d) max: %d (%d) delta %d\n", k,t, min, count_min, max, count_max, delta); + k++; + } + + for (i=0 ; i<1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { + //fprintf(stderr, "%d\n", signal_pulse_data[i][1]); + } + } + /* 50% decision limit */ + if (max/min > 1) { + fprintf(stderr, "Pulse coding: Short pulse length %d - Long pulse length %d\n", min, max); + signal_type = 2; + } else { + fprintf(stderr, "Distance coding: Pulse length %d\n", (min+max)/2); + signal_type = 1; + } + p_limit = (max+min)/2; + + /* Initial guesses */ + a[0] = 1000000; + a[2] = 0; + for (i=1 ; i<1000 ; i++) { + if (signal_pulse_data[i][0] > 0) { +// fprintf(stderr, "[%03d] s: %d\t e:\t %d\t l:%d\t d:%d\n", +// i, signal_pulse_data[i][0], signal_pulse_data[i][1], +// signal_pulse_data[i][2], signal_pulse_data[i][0]-signal_pulse_data[i-1][1]); + signal_distance_data[i-1] = signal_pulse_data[i][0]-signal_pulse_data[i-1][1]; + if (signal_distance_data[i-1] > a[2]) + a[2] = signal_distance_data[i-1]; + if (signal_distance_data[i-1] <= a[0]) + a[0] = signal_distance_data[i-1]; + } + } + min = a[0]; + max = a[2]; + a[1] = (a[0]+a[2])/2; +// for (i=0 ; i<1 ; i++) { +// b[i] = (a[i]+a[i+1])/2; +// } + b[0] = (a[0]+a[1])/2; + b[1] = (a[1]+a[2])/2; +// fprintf(stderr, "a[0]: %d\t a[1]: %d\t a[2]: %d\t\n",a[0],a[1],a[2]); +// fprintf(stderr, "b[0]: %d\t b[1]: %d\n",b[0],b[1]); + + k=1; + delta = 10000000; + while((k < 10) && (delta > 0)) { + for (i=0 ; i<3 ; i++) { + a_new[i] = 0; + a_cnt[i] = 0; + } + + for (i=0 ; i < 1000 ; i++) { + if (signal_distance_data[i] > 0) { + if (signal_distance_data[i] < b[0]) { + a_new[0] += signal_distance_data[i]; + a_cnt[0]++; + } else if (signal_distance_data[i] < b[1] && signal_distance_data[i] >= b[0]){ + a_new[1] += signal_distance_data[i]; + a_cnt[1]++; + } else if (signal_distance_data[i] >= b[1]) { + a_new[2] += signal_distance_data[i]; + a_cnt[2]++; + } + } + } + +// fprintf(stderr, "Iteration %d.", k); + delta = 0; + for (i=0 ; i<3 ; i++) { + if (a_cnt[i]) + a_new[i] /= a_cnt[i]; + delta += (a[i]-a_new[i])*(a[i]-a_new[i]); +// fprintf(stderr, "\ta[%d]: %d (%d)", i, a_new[i], a[i]); + a[i] = a_new[i]; + } +// fprintf(stderr, " delta %d\n", delta); + + if (a[0] < min) { + a[0] = min; +// fprintf(stderr, "Fixing a[0] = %d\n", min); + } + if (a[2] > max) { + a[0] = max; +// fprintf(stderr, "Fixing a[2] = %d\n", max); + } +// if (a[1] == 0) { +// a[1] = (a[2]+a[0])/2; +// fprintf(stderr, "Fixing a[1] = %d\n", a[1]); +// } + +// fprintf(stderr, "Iteration %d.", k); + for (i=0 ; i<2 ; i++) { +// fprintf(stderr, "\tb[%d]: (%d) ", i, b[i]); + b[i] = (a[i]+a[i+1])/2; +// fprintf(stderr, "%d ", b[i]); + } +// fprintf(stderr, "\n"); + k++; + } + + if (override_short) { + p_limit = override_short; + a[0] = override_short; + } + + if (override_long) { + a[1] = override_long; + } + + if (a[1]<a[0]) { + a[1]=a[0]+1; + } + + if (a[2]<a[1]*2) { + a[2] = a[1]*2; + } + + fprintf(stderr, "\nShort distance: %d, long distance: %d, packet distance: %d\n",a[0],a[1],a[2]); + fprintf(stderr, "\np_limit: %d\n",p_limit); + + demod_reset_bits_packet(&p); + if (signal_type == 1) { + for(i=0 ; i<1000 ; i++){ + if (signal_distance_data[i] > 0) { + if (signal_distance_data[i] < (a[0]+a[1])/2) { +// fprintf(stderr, "0 [%d] %d < %d\n",i, signal_distance_data[i], (a[0]+a[1])/2); + demod_add_bit(&p, 0); + } else if ((signal_distance_data[i] > (a[0]+a[1])/2) && (signal_distance_data[i] < (a[1]+a[2])/2)) { +// fprintf(stderr, "0 [%d] %d > %d\n",i, signal_distance_data[i], (a[0]+a[1])/2); + demod_add_bit(&p, 1); + } else if (signal_distance_data[i] > (a[1]+a[2])/2) { +// fprintf(stderr, "0 [%d] %d > %d\n",i, signal_distance_data[i], (a[1]+a[2])/2); + demod_next_bits_packet(&p); + } + + } + + } + demod_print_bits_packet(&p); + } + if (signal_type == 2) { + for(i=0 ; i<1000 ; i++){ + if(signal_pulse_data[i][2] > 0) { + if (signal_pulse_data[i][2] < p_limit) { +// fprintf(stderr, "0 [%d] %d < %d\n",i, signal_pulse_data[i][2], p_limit); + demod_add_bit(&p, 0); + } else { +// fprintf(stderr, "1 [%d] %d > %d\n",i, signal_pulse_data[i][2], p_limit); + demod_add_bit(&p, 1); + } + if ((signal_distance_data[i] >= (a[1]+a[2])/2)) { +// fprintf(stderr, "\\n [%d] %d > %d\n",i, signal_distance_data[i], (a[1]+a[2])/2); + demod_next_bits_packet(&p); + } + + + } + } + demod_print_bits_packet(&p); + } + + for (i=0 ; i<1000 ; i++) { + signal_pulse_data[i][0] = 0; + signal_pulse_data[i][1] = 0; + signal_pulse_data[i][2] = 0; + signal_distance_data[i] = 0; + } + +}; + + +static void pwm_analyze(struct dm_state *demod, int16_t *buf, uint32_t len) +{ + unsigned int i; + + for (i=0 ; i<len ; i++) { + if (buf[i] > demod->level_limit) { + if (!signal_start) + signal_start = counter; + if (print) { + pulses_found++; + pulse_start = counter; + signal_pulse_data[signal_pulse_counter][0] = counter; + signal_pulse_data[signal_pulse_counter][1] = -1; + signal_pulse_data[signal_pulse_counter][2] = -1; + if (debug_output) fprintf(stderr, "pulse_distance %d\n",counter-pulse_end); + if (debug_output) fprintf(stderr, "pulse_start distance %d\n",pulse_start-prev_pulse_start); + if (debug_output) fprintf(stderr, "pulse_start[%d] found at sample %d, value = %d\n",pulses_found, counter, buf[i]); + prev_pulse_start = pulse_start; + print =0; + print2 = 1; + } + } + counter++; + if (buf[i] < demod->level_limit) { + if (print2) { + pulse_avg += counter-pulse_start; + if (debug_output) fprintf(stderr, "pulse_end [%d] found at sample %d, pulse length = %d, pulse avg length = %d\n", + pulses_found, counter, counter-pulse_start, pulse_avg/pulses_found); + pulse_end = counter; + print2 = 0; + signal_pulse_data[signal_pulse_counter][1] = counter; + signal_pulse_data[signal_pulse_counter][2] = counter-pulse_start; + signal_pulse_counter++; + if (signal_pulse_counter >= 4000) { + signal_pulse_counter = 0; + goto err; + } + } + print = 1; + if (signal_start && (pulse_end + 50000 < counter)) { + signal_end = counter - 40000; + fprintf(stderr, "*** signal_start = %d, signal_end = %d\n",signal_start-10000, signal_end); + fprintf(stderr, "signal_len = %d, pulses = %d\n", signal_end-(signal_start-10000), pulses_found); + pulses_found = 0; + classify_signal(); + + signal_pulse_counter = 0; + if (demod->sg_buf) { + int start_pos, signal_bszie, wlen, wrest=0, sg_idx, idx; + char sgf_name[256] = {0}; + FILE *sgfp; + + sprintf(sgf_name, "gfile%03d.data",demod->signal_grabber); + demod->signal_grabber++; + signal_bszie = 2*(signal_end-(signal_start-10000)); + signal_bszie = (131072-(signal_bszie%131072)) + signal_bszie; + sg_idx = demod->sg_index-demod->sg_len; + if (sg_idx < 0) + sg_idx = SIGNAL_GRABBER_BUFFER-demod->sg_len; + idx = (i-40000)*2; + start_pos = sg_idx+idx-signal_bszie; + fprintf(stderr, "signal_bszie = %d - sg_index = %d\n", signal_bszie, demod->sg_index); + fprintf(stderr, "start_pos = %d - buffer_size = %d\n", start_pos, SIGNAL_GRABBER_BUFFER); + if (signal_bszie > SIGNAL_GRABBER_BUFFER) + fprintf(stderr, "Signal bigger then buffer, signal = %d > buffer %d !!\n", signal_bszie, SIGNAL_GRABBER_BUFFER); + + if (start_pos < 0) { + start_pos = SIGNAL_GRABBER_BUFFER+start_pos; + fprintf(stderr, "restart_pos = %d\n", start_pos); + } + + fprintf(stderr, "*** Saving signal to file %s\n",sgf_name); + sgfp = fopen(sgf_name, "wb"); + if (!sgfp) { + fprintf(stderr, "Failed to open %s\n", sgf_name); + } + wlen = signal_bszie; + if (start_pos + signal_bszie > SIGNAL_GRABBER_BUFFER) { + wlen = SIGNAL_GRABBER_BUFFER - start_pos; + wrest = signal_bszie - wlen; + } + fprintf(stderr, "*** Writing data from %d, len %d\n",start_pos, wlen); + fwrite(&demod->sg_buf[start_pos], 1, wlen, sgfp); + + if (wrest) { + fprintf(stderr, "*** Writing data from %d, len %d\n",0, wrest); + fwrite(&demod->sg_buf[0], 1, wrest, sgfp); + } + + fclose(sgfp); + } + signal_start = 0; + } + } + + + } + return; + +err: + fprintf(stderr, "To many pulses detected, probably bad input data or input parameters\n"); + return; +} + +/* The distance between pulses decodes into bits */ + +static void pwm_d_decode(struct dm_state *demod, struct protocol_state* p, int16_t *buf, uint32_t len) { + unsigned int i; + + for (i=0 ; i<len ; i++) { + if (buf[i] > demod->level_limit) { + p->pulse_count = 1; + p->start_c = 1; + } + if (p->pulse_count && (buf[i] < demod->level_limit)) { + p->pulse_length = 0; + p->pulse_distance = 1; + p->sample_counter = 0; + p->pulse_count = 0; + } + if (p->start_c) p->sample_counter++; + if (p->pulse_distance && (buf[i] > demod->level_limit)) { + if (p->sample_counter < p->short_limit) { + demod_add_bit(p, 0); + } else if (p->sample_counter < p->long_limit) { + demod_add_bit(p, 1); + } else { + demod_next_bits_packet(p); + p->pulse_count = 0; + p->sample_counter = 0; + } + p->pulse_distance = 0; + } + if (p->sample_counter > p->reset_limit) { + p->start_c = 0; + p->sample_counter = 0; + p->pulse_distance = 0; + if (p->callback) + events+=p->callback(p->bits_buffer); + else + demod_print_bits_packet(p); + + demod_reset_bits_packet(p); + } + } +} + +/* The length of pulses decodes into bits */ + +static void pwm_p_decode(struct dm_state *demod, struct protocol_state* p, int16_t *buf, uint32_t len) { + unsigned int i; + + for (i=0 ; i<len ; i++) { + if (buf[i] > demod->level_limit && !p->start_bit) { + /* start bit detected */ + p->start_bit = 1; + p->start_c = 1; + p->sample_counter = 0; +// fprintf(stderr, "start bit pulse start detected\n"); + } + + if (!p->real_bits && p->start_bit && (buf[i] < demod->level_limit)) { + /* end of startbit */ + p->real_bits = 1; +// fprintf(stderr, "start bit pulse end detected\n"); + } + if (p->start_c) p->sample_counter++; + + + if (!p->pulse_start && p->real_bits && (buf[i] > demod->level_limit)) { + /* save the pulse start, it will never be zero */ + p->pulse_start = p->sample_counter; +// fprintf(stderr, "real bit pulse start detected\n"); + + } + + if (p->real_bits && p->pulse_start && (buf[i] < demod->level_limit)) { + /* end of pulse */ + + p->pulse_length = p->sample_counter-p->pulse_start; +// fprintf(stderr, "real bit pulse end detected %d\n", p->pulse_length); +// fprintf(stderr, "space duration %d\n", p->sample_counter); + + if (p->pulse_length <= p->short_limit) { + demod_add_bit(p, 1); + } else if (p->pulse_length > p->short_limit) { + demod_add_bit(p, 0); + } + p->sample_counter = 0; + p->pulse_start = 0; + } + + if (p->real_bits && p->pulse_length > p->long_limit) { + demod_next_bits_packet(p); + + p->start_bit = 0; + p->real_bits = 0; + } + + if (p->sample_counter > p->reset_limit) { + p->start_c = 0; + p->sample_counter = 0; + if (p->callback) + events+=p->callback(p->bits_buffer); + else + demod_print_bits_packet(p); + demod_reset_bits_packet(p); + + p->start_bit = 0; + p->real_bits = 0; + } + } +} + + + +/** Something that might look like a IIR lowpass filter + * + * [b,a] = butter(1, 0.01) -> quantizes nicely thus suitable for fixed point + * Q1.15*Q15.0 = Q16.15 + * Q16.15>>1 = Q15.14 + * Q15.14 + Q15.14 + Q15.14 could possibly overflow to 17.14 + * but the b coeffs are small so it wont happen + * Q15.14>>14 = Q15.0 \o/ + */ + +static uint16_t lp_xmem[FILTER_ORDER] = {0}; + +#define F_SCALE 15 +#define S_CONST (1<<F_SCALE) +#define FIX(x) ((int)(x*S_CONST)) + +int a[FILTER_ORDER+1] = {FIX(1.00000),FIX(0.96907)}; +int b[FILTER_ORDER+1] = {FIX(0.015466),FIX(0.015466)}; + +static void low_pass_filter(uint16_t *x_buf, int16_t *y_buf, uint32_t len) +{ + unsigned int i; + + /* Calculate first sample */ + y_buf[0] = ((a[1]*y_buf[-1]>>1) + (b[0]*x_buf[0]>>1) + (b[1]*lp_xmem[0]>>1)) >> (F_SCALE-1); + for (i=1 ; i<len ; i++) { + y_buf[i] = ((a[1]*y_buf[i-1]>>1) + (b[0]*x_buf[i]>>1) + (b[1]*x_buf[i-1]>>1)) >> (F_SCALE-1); + } + + /* Save last sample */ + memcpy(lp_xmem, &x_buf[len-1-FILTER_ORDER], FILTER_ORDER*sizeof(int16_t)); + memcpy(&y_buf[-FILTER_ORDER], &y_buf[len-1-FILTER_ORDER], FILTER_ORDER*sizeof(int16_t)); + //fprintf(stderr, "%d\n", y_buf[0]); +} + + +static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) +{ + struct dm_state *demod = ctx; + uint16_t* sbuf = (uint16_t*) buf; + int i; + if (demod->file || !demod->save_data) { + if (do_exit || do_exit_async) + return; + + if ((bytes_to_read > 0) && (bytes_to_read < len)) { + len = bytes_to_read; + do_exit = 1; + rtlsdr_cancel_async(dev); + } + + if (demod->signal_grabber) { + //fprintf(stderr, "[%d] sg_index - len %d\n", demod->sg_index, len ); + memcpy(&demod->sg_buf[demod->sg_index], buf, len); + demod->sg_len =len; + demod->sg_index +=len; + if (demod->sg_index+len > SIGNAL_GRABBER_BUFFER) + demod->sg_index = 0; + } + + + if (demod->debug_mode == 0) { + envelope_detect(buf, len, demod->decimation_level); + low_pass_filter(sbuf, demod->f_buf, len>>(demod->decimation_level+1)); + } else if (demod->debug_mode == 1){ + memcpy(demod->f_buf, buf, len); + } + if (demod->analyze) { + pwm_analyze(demod, demod->f_buf, len/2); + } + { + for (i=0 ; i<demod->r_dev_num ; i++) { + switch (demod->r_devs[i]->modulation) { + case OOK_PWM_D: + pwm_d_decode(demod, demod->r_devs[i], demod->f_buf, len/2); + break; + case OOK_PWM_P: + pwm_p_decode(demod, demod->r_devs[i], demod->f_buf, len/2); + break; + default: + fprintf(stderr, "Unknown modulation %d in protocol!\n", demod->r_devs[i]->modulation); + } + } + } + + if (demod->save_data) { + if (fwrite(demod->f_buf, 1, len>>demod->decimation_level, demod->file) != len>>demod->decimation_level) { + fprintf(stderr, "Short write, samples lost, exiting!\n"); + rtlsdr_cancel_async(dev); + } + } + + if (bytes_to_read > 0) + bytes_to_read -= len; + + if(frequencies>1) { + time_t rawtime; + time(&rawtime); + if(difftime(rawtime, rawtime_old)>DEFAULT_HOP_TIME || events>=DEFAULT_HOP_EVENTS) { + rawtime_old=rawtime; + events=0; + do_exit_async=1; + rtlsdr_cancel_async(dev); + } + } + } +} + +int main(int argc, char **argv) +{ +#ifndef _WIN32 + struct sigaction sigact; +#endif + char *filename = NULL; + char *test_mode_file = NULL; + FILE *test_mode; + int n_read; + int r, opt; + int i, gain = 0; + int sync_mode = 0; + int ppm_error = 0; + struct dm_state* demod; + uint8_t *buffer; + uint32_t dev_index = 0; + int frequency_current=0; + uint32_t out_block_size = DEFAULT_BUF_LENGTH; + int device_count; + char vendor[256], product[256], serial[256]; + + demod = malloc(sizeof(struct dm_state)); + memset(demod,0,sizeof(struct dm_state)); + + /* initialize tables */ + calc_squares(); + + demod->f_buf = &demod->filter_buffer[FILTER_ORDER]; + demod->decimation_level = DEFAULT_DECIMATION_LEVEL; + demod->level_limit = DEFAULT_LEVEL_LIMIT; + + + while ((opt = getopt(argc, argv, "x:z:p:Dtam:r:c:l:d:f:g:s:b:n:S::")) != -1) { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 'f': + if(frequencies<MAX_PROTOCOLS) frequency[frequencies++] = (uint32_t)atof(optarg); + else fprintf(stderr, "Max number of frequencies reached %d\n",MAX_PROTOCOLS); + break; + case 'g': + gain = (int)(atof(optarg) * 10); /* tenths of a dB */ + break; + case 'p': + ppm_error = atoi(optarg); + break; + case 's': + samp_rate = (uint32_t)atof(optarg); + break; + case 'b': + out_block_size = (uint32_t)atof(optarg); + break; + case 'l': + demod->level_limit = (uint32_t)atof(optarg); + break; + case 'n': + bytes_to_read = (uint32_t)atof(optarg) * 2; + break; + case 'c': + demod->decimation_level = (uint32_t)atof(optarg); + break; + case 'a': + demod->analyze = 1; + break; + case 'r': + test_mode_file = optarg; + break; + case 't': + demod->signal_grabber = 1; + break; + case 'm': + demod->debug_mode = atoi(optarg); + break; + case 'S': + sync_mode = 1; + break; + case 'D': + debug_output = 1; + break; + case 'z': + override_short = atoi(optarg); + break; + case 'x': + override_long = atoi(optarg); + break; + default: + usage(); + break; + } + } + + /* init protocols somewhat ok */ + register_protocol(demod, &rubicson); + register_protocol(demod, &prologue); + register_protocol(demod, &silvercrest); +// register_protocol(demod, &generic_hx2262); +// register_protocol(demod, &technoline_ws9118); + register_protocol(demod, &elv_em1000); + register_protocol(demod, &elv_ws2000); + register_protocol(demod, &waveman); + register_protocol(demod, &steffen); + register_protocol(demod, &acurite5n1); + register_protocol(demod, &wh2); + + if (argc <= optind-1) { + usage(); + } else { + filename = argv[optind]; + } + + if(out_block_size < MINIMAL_BUF_LENGTH || + out_block_size > MAXIMAL_BUF_LENGTH ){ + fprintf(stderr, + "Output block size wrong value, falling back to default\n"); + fprintf(stderr, + "Minimal length: %u\n", MINIMAL_BUF_LENGTH); + fprintf(stderr, + "Maximal length: %u\n", MAXIMAL_BUF_LENGTH); + out_block_size = DEFAULT_BUF_LENGTH; + } + + buffer = malloc(out_block_size * sizeof(uint8_t)); + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + if (!test_mode_file) + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); + } + fprintf(stderr, "\n"); + + fprintf(stderr, "Using device %d: %s\n", + dev_index, rtlsdr_get_device_name(dev_index)); + + r = rtlsdr_open(&dev, dev_index); + if (r < 0) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + if (!test_mode_file) + exit(1); + } +#ifndef _WIN32 + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGPIPE, &sigact, NULL); +#else + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#endif + /* Set the sample rate */ + r = rtlsdr_set_sample_rate(dev, samp_rate); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set sample rate.\n"); + else + fprintf(stderr, "Sample rate set to %d.\n", rtlsdr_get_sample_rate(dev)); // Unfortunately, doesn't return real rate + + fprintf(stderr, "Sample rate decimation set to %d. %d->%d\n",demod->decimation_level, samp_rate, samp_rate>>demod->decimation_level); + fprintf(stderr, "Bit detection level set to %d.\n", demod->level_limit); + + if (0 == gain) { + /* Enable automatic gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 0); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable automatic gain.\n"); + else + fprintf(stderr, "Tuner gain set to Auto.\n"); + } else { + /* Enable manual gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 1); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable manual gain.\n"); + + /* Set the tuner gain */ + r = rtlsdr_set_tuner_gain(dev, gain); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set tuner gain.\n"); + else + fprintf(stderr, "Tuner gain set to %f dB.\n", gain/10.0); + } + + r = rtlsdr_set_freq_correction(dev, ppm_error); + + demod->save_data = 1; + if (!filename) { + demod->save_data = 0; + } else if(strcmp(filename, "-") == 0) { /* Write samples to stdout */ + demod->file = stdout; +#ifdef _WIN32 + _setmode(_fileno(stdin), _O_BINARY); +#endif + } else { + demod->file = fopen(filename, "wb"); + if (!demod->file) { + fprintf(stderr, "Failed to open %s\n", filename); + goto out; + } + } + + if (demod->signal_grabber) + demod->sg_buf = malloc(SIGNAL_GRABBER_BUFFER); + + if (test_mode_file) { + int i = 0; + unsigned char test_mode_buf[DEFAULT_BUF_LENGTH]; + fprintf(stderr, "Test mode active. Reading samples from file: %s\n",test_mode_file); + test_mode = fopen(test_mode_file, "r"); + if (!test_mode) { + fprintf(stderr, "Opening file: %s failed!\n",test_mode_file); + goto out; + } + while(fread(test_mode_buf, 131072, 1, test_mode) != 0) { + rtlsdr_callback(test_mode_buf, 131072, demod); + i++; + } + //Always classify a signal at the end of the file + classify_signal(); + fprintf(stderr, "Test mode file issued %d packets\n", i); + fprintf(stderr, "Filter coeffs used:\n"); + fprintf(stderr, "a: %d %d\n", a[0], a[1]); + fprintf(stderr, "b: %d %d\n", b[0], b[1]); + exit(0); + } + + /* Reset endpoint before we start reading from it (mandatory) */ + r = rtlsdr_reset_buffer(dev); + if (r < 0) + fprintf(stderr, "WARNING: Failed to reset buffers.\n"); + + if (sync_mode) { + fprintf(stderr, "Reading samples in sync mode...\n"); + while (!do_exit) { + r = rtlsdr_read_sync(dev, buffer, out_block_size, &n_read); + if (r < 0) { + fprintf(stderr, "WARNING: sync read failed.\n"); + break; + } + + if ((bytes_to_read > 0) && (bytes_to_read < (uint32_t)n_read)) { + n_read = bytes_to_read; + do_exit = 1; + } + + if (fwrite(buffer, 1, n_read, demod->file) != (size_t)n_read) { + fprintf(stderr, "Short write, samples lost, exiting!\n"); + break; + } + + if ((uint32_t)n_read < out_block_size) { + fprintf(stderr, "Short read, samples lost, exiting!\n"); + break; + } + + if (bytes_to_read > 0) + bytes_to_read -= n_read; + } + } else { + if(frequencies==0) { + frequency[0] = DEFAULT_FREQUENCY; + frequencies=1; + } else { + time(&rawtime_old); + } + fprintf(stderr, "Reading samples in async mode...\n"); + while(!do_exit) { + /* Set the frequency */ + r = rtlsdr_set_center_freq(dev, frequency[frequency_current]); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set center freq.\n"); + else + fprintf(stderr, "Tuned to %u Hz.\n", rtlsdr_get_center_freq(dev)); + r = rtlsdr_read_async(dev, rtlsdr_callback, (void *)demod, + DEFAULT_ASYNC_BUF_NUMBER, out_block_size); + do_exit_async=0; + frequency_current++; + if(frequency_current>frequencies-1) frequency_current=0; + } + } + + if (do_exit) + fprintf(stderr, "\nUser cancel, exiting...\n"); + else + fprintf(stderr, "\nLibrary error %d, exiting...\n", r); + + if (demod->file && (demod->file != stdout)) + fclose(demod->file); + + for (i=0 ; i<demod->r_dev_num ; i++) + free(demod->r_devs[i]); + + if (demod->signal_grabber) + free(demod->sg_buf); + + if(demod) + free(demod); + + rtlsdr_close(dev); + free (buffer); +out: + return r >= 0 ? r : -r; +} diff --git a/src/rtl_adsb.c b/src/rtl_adsb.c new file mode 100644 index 0000000..2fb7418 --- /dev/null +++ b/src/rtl_adsb.c @@ -0,0 +1,512 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * Copyright (C) 2012 by Hoernchen <la@tfc-server.de> + * Copyright (C) 2012 by Kyle Keen <keenerd@gmail.com> + * Copyright (C) 2012 by Youssef Touil <youssef@sdrsharp.com> + * Copyright (C) 2012 by Ian Gilmour <ian@sdrsharp.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#ifndef _WIN32 +#include <unistd.h> +#else +#include <Windows.h> +#include <fcntl.h> +#include <io.h> +#include "getopt/getopt.h" +#endif + +#include <semaphore.h> +#include <pthread.h> +#include <libusb.h> + +#include "rtl-sdr.h" + +#ifdef _WIN32 +#define sleep Sleep +#define round(x) (x > 0.0 ? floor(x + 0.5): ceil(x - 0.5)) +#endif + +#define ADSB_RATE 2000000 +#define ADSB_FREQ 1090000000 +#define DEFAULT_ASYNC_BUF_NUMBER 12 +#define DEFAULT_BUF_LENGTH (16 * 16384) +#define AUTO_GAIN -100 + +static pthread_t demod_thread; +static sem_t data_ready; +static volatile int do_exit = 0; +static rtlsdr_dev_t *dev = NULL; + +/* look up table, could be made smaller */ +uint8_t pyth[129][129]; + +/* todo, bundle these up in a struct */ +uint8_t *buffer; +int verbose_output = 0; +int short_output = 0; +double quality = 1.0; +int allowed_errors = 5; +FILE *file; +int adsb_frame[14]; +#define preamble_len 16 +#define long_frame 112 +#define short_frame 56 + +void usage(void) +{ + fprintf(stderr, + "rtl_adsb, a simple ADS-B decoder\n\n" + "Use:\trtl_adsb [-R] [-g gain] [-p ppm] [output file]\n" + "\t[-d device_index (default: 0)]\n" + "\t[-V verbove output (default: off)]\n" + "\t[-S show short frames (default: off)]\n" + "\t[-Q quality (0: no sanity checks, 0.5: half bit, 1: one bit (default), 2: two bits)]\n" + "\t[-e allowed_errors (default: 5)]\n" + "\t[-g tuner_gain (default: automatic)]\n" + "\t[-p ppm_error (default: 0)]\n" + "\tfilename (a '-' dumps samples to stdout)\n" + "\t (omitting the filename also uses stdout)\n\n" + "Streaming with netcat:\n" + "\trtl_adsb | netcat -lp 8080\n" + "\twhile true; do rtl_adsb | nc -lp 8080; done\n" + "Streaming with socat:\n" + "\trtl_adsb | socat -u - TCP4:sdrsharp.com:47806\n" + "\n"); + exit(1); +} + +#ifdef _WIN32 +BOOL WINAPI +sighandler(int signum) +{ + if (CTRL_C_EVENT == signum) { + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); + return TRUE; + } + return FALSE; +} +#else +static void sighandler(int signum) +{ + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); +} +#endif + +void display(int *frame, int len) +{ + int i, df; + if (!short_output && len <= short_frame) { + return;} + df = (frame[0] >> 3) & 0x1f; + if (quality == 0.0 && !(df==11 || df==17 || df==18 || df==19)) { + return;} + fprintf(file, "*"); + for (i=0; i<((len+7)/8); i++) { + fprintf(file, "%02x", frame[i]);} + fprintf(file, ";\r\n"); + if (!verbose_output) { + return;} + fprintf(file, "DF=%i CA=%i\n", df, frame[0] & 0x07); + fprintf(file, "ICAO Address=%06x\n", frame[1] << 16 | frame[2] << 8 | frame[3]); + if (len <= short_frame) { + return;} + fprintf(file, "PI=0x%06x\n", frame[11] << 16 | frame[12] << 8 | frame[13]); + fprintf(file, "Type Code=%i S.Type/Ant.=%x\n", (frame[4] >> 3) & 0x1f, frame[4] & 0x07); + fprintf(file, "--------------\n"); +} + +void pyth_precompute(void) +{ + int x, y; + double scale = 1.408 ; /* use the full 8 bits */ + for (x=0; x<129; x++) { + for (y=0; y<129; y++) { + pyth[x][y] = (uint8_t)round(scale * sqrt(x*x + y*y)); + }} +} + +inline uint8_t abs8(uint8_t x) +/* do not subtract 128 from the raw iq, this handles it */ +{ + if (x >= 128) { + return x - 128;} + return 128 - x; +} + +int magnitute(uint8_t *buf, int len) +/* takes i/q, changes buf in place, returns new len */ +{ + int i; + for (i=0; i<len; i+=2) { + buf[i/2] = pyth[abs8(buf[i])][abs8(buf[i+1])]; + } + return len/2; +} + +inline uint8_t single_manchester(uint8_t a, uint8_t b, uint8_t c, uint8_t d) +/* takes 4 consecutive real samples, return 0 or 1, 255 on error */ +{ + int bit, bit_p; + bit_p = a > b; + bit = c > d; + + if (quality == 0.0) { + return bit;} + + if (quality == 0.5) { + if ( bit && bit_p && b > c) { + return 255;} + if (!bit && !bit_p && b < c) { + return 255;} + return bit; + } + + if (quality == 1.0) { + if ( bit && bit_p && c > b) { + return 1;} + if ( bit && !bit_p && d < b) { + return 1;} + if (!bit && bit_p && d > b) { + return 0;} + if (!bit && !bit_p && c < b) { + return 0;} + return 255; + } + + if ( bit && bit_p && c > b && d < a) { + return 1;} + if ( bit && !bit_p && c > a && d < b) { + return 1;} + if (!bit && bit_p && c < a && d > b) { + return 0;} + if (!bit && !bit_p && c < b && d > a) { + return 0;} + return 255; +} + +inline uint8_t min8(uint8_t a, uint8_t b) +{ + return a<b ? a : b; +} + +inline uint8_t max8(uint8_t a, uint8_t b) +{ + return a>b ? a : b; +} + +inline int preamble(uint8_t *buf, int len, int i) +/* returns 0/1 for preamble at index i */ +{ + int i2; + uint8_t low = 0; + uint8_t high = 255; + for (i2=0; i2<preamble_len; i2++) { + switch (i2) { + case 0: + case 2: + case 7: + case 9: + //high = min8(high, buf[i+i2]); + high = buf[i+i2]; + break; + default: + //low = max8(low, buf[i+i2]); + low = buf[i+i2]; + break; + } + if (high <= low) { + return 0;} + } + return 1; +} + +void manchester(uint8_t *buf, int len) +/* overwrites magnitude buffer with valid bits (255 on errors) */ +{ + /* a and b hold old values to verify local manchester */ + uint8_t a=0, b=0; + uint8_t bit; + int i, i2, start, errors; + // todo, allow wrap across buffers + i = 0; + while (i < len) { + /* find preamble */ + for ( ; i < (len - preamble_len); i++) { + if (!preamble(buf, len, i)) { + continue;} + a = buf[i]; + b = buf[i+1]; + for (i2=0; i2<preamble_len; i2++) { + buf[i+i2] = 253;} + i += preamble_len; + break; + } + i2 = start = i; + errors = 0; + /* mark bits until encoding breaks */ + for ( ; i < len; i+=2, i2++) { + bit = single_manchester(a, b, buf[i], buf[i+1]); + a = buf[i]; + b = buf[i+1]; + if (bit == 255) { + errors += 1; + if (errors > allowed_errors) { + buf[i2] = 255; + break; + } else { + bit = a > b; + /* these don't have to match the bit */ + a = 0; + b = 255; + } + } + buf[i] = buf[i+1] = 254; /* to be overwritten */ + buf[i2] = bit; + } + } +} + +void messages(uint8_t *buf, int len) +{ + int i, i2, start, preamble_found; + int data_i, index, shift, frame_len; + // todo, allow wrap across buffers + for (i=0; i<len; i++) { + if (buf[i] > 1) { + continue;} + frame_len = long_frame; + data_i = 0; + for (index=0; index<14; index++) { + adsb_frame[index] = 0;} + for(; i<len && buf[i]<=1 && data_i<frame_len; i++, data_i++) { + if (buf[i]) { + index = data_i / 8; + shift = 7 - (data_i % 8); + adsb_frame[index] |= (uint8_t)(1<<shift); + } + if (data_i == 7) { + if (adsb_frame[0] == 0) { + break;} + if (adsb_frame[0] & 0x80) { + frame_len = long_frame;} + else { + frame_len = short_frame;} + } + } + if (data_i < (frame_len-1)) { + continue;} + display(adsb_frame, frame_len); + fflush(file); + } +} + +static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) +{ + int dr_val; + if (do_exit) { + return;} + memcpy(buffer, buf, len); + sem_getvalue(&data_ready, &dr_val); + if (dr_val <= 0) { + sem_post(&data_ready);} +} + +static void *demod_thread_fn(void *arg) +{ + int len; + while (!do_exit) { + sem_wait(&data_ready); + len = magnitute(buffer, DEFAULT_BUF_LENGTH); + manchester(buffer, len); + messages(buffer, len); + } + rtlsdr_cancel_async(dev); + return 0; +} + +int main(int argc, char **argv) +{ +#ifndef _WIN32 + struct sigaction sigact; +#endif + char *filename = NULL; + int n_read, r, opt; + int i, gain = AUTO_GAIN; /* tenths of a dB */ + uint32_t dev_index = 0; + int device_count; + int ppm_error = 0; + char vendor[256], product[256], serial[256]; + sem_init(&data_ready, 0, 0); + pyth_precompute(); + + while ((opt = getopt(argc, argv, "d:g:p:e:Q:VS")) != -1) + { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 'g': + gain = (int)(atof(optarg) * 10); + break; + case 'p': + ppm_error = atoi(optarg); + break; + case 'V': + verbose_output = 1; + break; + case 'S': + short_output = 1; + break; + case 'e': + allowed_errors = atoi(optarg); + break; + case 'Q': + quality = atof(optarg); + break; + default: + usage(); + return 0; + } + } + + if (argc <= optind) { + filename = "-"; + } else { + filename = argv[optind]; + } + + buffer = malloc(DEFAULT_BUF_LENGTH * sizeof(uint8_t)); + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); + } + fprintf(stderr, "\n"); + + fprintf(stderr, "Using device %d: %s\n", + dev_index, rtlsdr_get_device_name(dev_index)); + + r = rtlsdr_open(&dev, dev_index); + if (r < 0) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + exit(1); + } +#ifndef _WIN32 + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGPIPE, &sigact, NULL); +#else + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#endif + + if (strcmp(filename, "-") == 0) { /* Write samples to stdout */ + file = stdout; + setvbuf(stdout, NULL, _IONBF, 0); +#ifdef _WIN32 + _setmode(_fileno(file), _O_BINARY); +#endif + } else { + file = fopen(filename, "wb"); + if (!file) { + fprintf(stderr, "Failed to open %s\n", filename); + exit(1); + } + } + + /* Set the tuner gain */ + if (gain == AUTO_GAIN) { + r = rtlsdr_set_tuner_gain_mode(dev, 0); + } else { + r = rtlsdr_set_tuner_gain_mode(dev, 1); + r = rtlsdr_set_tuner_gain(dev, gain); + } + if (r != 0) { + fprintf(stderr, "WARNING: Failed to set tuner gain.\n"); + } else if (gain == AUTO_GAIN) { + fprintf(stderr, "Tuner gain set to automatic.\n"); + } else { + fprintf(stderr, "Tuner gain set to %0.2f dB.\n", gain/10.0); + } + + r = rtlsdr_set_freq_correction(dev, ppm_error); + r = rtlsdr_set_agc_mode(dev, 1); + + /* Set the tuner frequency */ + r = rtlsdr_set_center_freq(dev, ADSB_FREQ); + if (r < 0) { + fprintf(stderr, "WARNING: Failed to set center freq.\n");} + else { + fprintf(stderr, "Tuned to %u Hz.\n", ADSB_FREQ);} + + /* Set the sample rate */ + fprintf(stderr, "Sampling at %u Hz.\n", ADSB_RATE); + r = rtlsdr_set_sample_rate(dev, ADSB_RATE); + if (r < 0) { + fprintf(stderr, "WARNING: Failed to set sample rate.\n");} + + /* Reset endpoint before we start reading from it (mandatory) */ + r = rtlsdr_reset_buffer(dev); + if (r < 0) { + fprintf(stderr, "WARNING: Failed to reset buffers.\n");} + + /* flush old junk */ + sleep(1); + rtlsdr_read_sync(dev, NULL, 4096, NULL); + + pthread_create(&demod_thread, NULL, demod_thread_fn, (void *)(NULL)); + rtlsdr_read_async(dev, rtlsdr_callback, (void *)(NULL), + DEFAULT_ASYNC_BUF_NUMBER, + DEFAULT_BUF_LENGTH); + + + if (do_exit) { + fprintf(stderr, "\nUser cancel, exiting...\n");} + else { + fprintf(stderr, "\nLibrary error %d, exiting...\n", r);} + rtlsdr_cancel_async(dev); + + if (file != stdout) { + fclose(file);} + + rtlsdr_close(dev); + free(buffer); + return r >= 0 ? r : -r; +} + diff --git a/src/rtl_eeprom.c b/src/rtl_eeprom.c new file mode 100644 index 0000000..35191de --- /dev/null +++ b/src/rtl_eeprom.c @@ -0,0 +1,423 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * rtl_eeprom, EEPROM modification tool + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#ifndef _WIN32 +#include <unistd.h> +#else +#include <Windows.h> +#include "getopt/getopt.h" +#endif + +#include "rtl-sdr.h" + +#define EEPROM_SIZE 256 +#define MAX_STR_SIZE 256 +#define STR_OFFSET 0x09 + +static rtlsdr_dev_t *dev = NULL; + +typedef struct rtlsdr_config { + uint16_t vendor_id; + uint16_t product_id; + char manufacturer[MAX_STR_SIZE]; + char product[MAX_STR_SIZE]; + char serial[MAX_STR_SIZE]; + int have_serial; + int enable_ir; + int remote_wakeup; +} rtlsdr_config_t; + +void dump_config(rtlsdr_config_t *conf) +{ + fprintf(stderr, "__________________________________________\n"); + fprintf(stderr, "Vendor ID:\t\t0x%04x\n", conf->vendor_id); + fprintf(stderr, "Product ID:\t\t0x%04x\n", conf->product_id); + fprintf(stderr, "Manufacturer:\t\t%s\n", conf->manufacturer); + fprintf(stderr, "Product:\t\t%s\n", conf->product); + fprintf(stderr, "Serial number:\t\t%s\n", conf->serial); + fprintf(stderr, "Serial number enabled:\t"); + fprintf(stderr, conf->have_serial ? "yes\n": "no\n"); + fprintf(stderr, "IR endpoint enabled:\t"); + fprintf(stderr, conf->enable_ir ? "yes\n": "no\n"); + fprintf(stderr, "Remote wakeup enabled:\t"); + fprintf(stderr, conf->remote_wakeup ? "yes\n": "no\n"); + fprintf(stderr, "__________________________________________\n"); +} + +void usage(void) +{ + fprintf(stderr, + "rtl_eeprom, an EEPROM programming tool for " + "RTL2832 based DVB-T receivers\n\n" + "Usage:\n" + "\t[-d device_index (default: 0)]\n" + "\t[-m <str> set manufacturer string]\n" + "\t[-p <str> set product string]\n" + "\t[-s <str> set serial number string]\n" + "\t[-i <0,1> disable/enable IR-endpoint]\n" + "\t[-g <conf> generate default config and write to device]\n" + "\t[ <conf> can be one of:]\n" + "\t[ realtek\t\tRealtek default (as without EEPROM)]\n" + "\t[ realtek_oem\t\tRealtek default OEM with EEPROM]\n" + "\t[ noxon\t\tTerratec NOXON DAB Stick]\n" + "\t[ terratec_black\tTerratec T Stick Black]\n" + "\t[ terratec_plus\tTerratec T Stick+ (DVB-T/DAB)]\n" + "\t[-w <filename> write dumped file to device]\n" + "\t[-r <filename> dump EEPROM to file]\n" + "\t[-h display this help text]\n" + "\nUse on your own risk, especially -w!\n"); + exit(1); +} + +int get_string_descriptor(int pos, uint8_t *data, char *str) +{ + int len, i, j = 0; + + len = data[pos]; + + if (data[pos + 1] != 0x03) + fprintf(stderr, "Error: invalid string descriptor!\n"); + + for (i = 2; i < len; i += 2) + str[j++] = data[pos + i]; + + str[j] = 0x00; + + return pos + i; +} + +int set_string_descriptor(int pos, uint8_t *data, char *str) +{ + int i = 0, j = 2; + + if (pos < 0) + return -1; + + data[pos + 1] = 0x03; + + while (str[i] != 0x00) { + if ((pos + j) >= 78) { + fprintf(stderr, "Error: string too long, truncated!\n"); + return -1; + } + data[pos + j++] = str[i++]; + data[pos + j++] = 0x00; + } + + data[pos] = j; + + return pos + j; +} + +int parse_eeprom_to_conf(rtlsdr_config_t *conf, uint8_t *dat) +{ + int pos; + + if ((dat[0] != 0x28) || (dat[1] != 0x32)) + fprintf(stderr, "Error: invalid RTL2832 EEPROM header!\n"); + + conf->vendor_id = dat[2] | (dat[3] << 8); + conf->product_id = dat[4] | (dat[5] << 8); + conf->have_serial = (dat[6] == 0xa5) ? 1 : 0; + conf->remote_wakeup = (dat[7] & 0x01) ? 1 : 0; + conf->enable_ir = (dat[7] & 0x02) ? 1 : 0; + + pos = get_string_descriptor(STR_OFFSET, dat, conf->manufacturer); + pos = get_string_descriptor(pos, dat, conf->product); + get_string_descriptor(pos, dat, conf->serial); + + return 0; +} + +int gen_eeprom_from_conf(rtlsdr_config_t *conf, uint8_t *dat) +{ + int pos; + + dat[0] = 0x28; + dat[1] = 0x32; + dat[2] = conf->vendor_id & 0xff; + dat[3] = (conf->vendor_id >> 8) & 0xff ; + dat[4] = conf->product_id & 0xff; + dat[5] = (conf->product_id >> 8) & 0xff; + dat[6] = conf->have_serial ? 0xa5 : 0x00; + dat[7] = 0x14; + dat[7] |= conf->remote_wakeup ? 0x01 : 0x00; + dat[7] |= conf->enable_ir ? 0x02 : 0x00; + dat[8] = 0x02; + + pos = set_string_descriptor(STR_OFFSET, dat, conf->manufacturer); + pos = set_string_descriptor(pos, dat, conf->product); + pos = set_string_descriptor(pos, dat, conf->serial); + + dat[78] = 0x00; /* length of IR config */ + + return pos; +} + +enum configs { + CONF_NONE = 0, + REALTEK, + REALTEK_EEPROM, + TERRATEC_NOXON, + TERRATEC_T_BLACK, + TERRATEC_T_PLUS, +}; + +void gen_default_conf(rtlsdr_config_t *conf, int config) +{ + switch (config) { + case REALTEK: + fprintf(stderr, "Realtek default (as without EEPROM)\n"); + conf->vendor_id = 0x0bda; + conf->product_id = 0x2832; + strcpy(conf->manufacturer, "Generic"); + strcpy(conf->product, "RTL2832U DVB-T"); + strcpy(conf->serial, "0"); + conf->have_serial = 1; + conf->enable_ir = 0; + conf->remote_wakeup = 1; + break; + case REALTEK_EEPROM: + fprintf(stderr, "Realtek default OEM with EEPROM\n"); + conf->vendor_id = 0x0bda; + conf->product_id = 0x2838; + strcpy(conf->manufacturer, "Realtek"); + strcpy(conf->product, "RTL2838UHIDIR"); + strcpy(conf->serial, "00000001"); + conf->have_serial = 1; + conf->enable_ir = 1; + conf->remote_wakeup = 0; + break; + case TERRATEC_NOXON: + fprintf(stderr, "Terratec NOXON DAB Stick\n"); + conf->vendor_id = 0x0ccd; + conf->product_id = 0x00b3; + strcpy(conf->manufacturer, "NOXON"); + strcpy(conf->product, "DAB Stick"); + strcpy(conf->serial, "0"); + conf->have_serial = 1; + conf->enable_ir = 0; + conf->remote_wakeup = 1; + break; + case TERRATEC_T_BLACK: + fprintf(stderr, "Terratec T Stick Black\n"); + conf->vendor_id = 0x0ccd; + conf->product_id = 0x00a9; + strcpy(conf->manufacturer, "Realtek"); + strcpy(conf->product, "RTL2838UHIDIR"); + strcpy(conf->serial, "00000001"); + conf->have_serial = 1; + conf->enable_ir = 1; + conf->remote_wakeup = 0; + break; + case TERRATEC_T_PLUS: + fprintf(stderr, "Terratec ran T Stick+\n"); + conf->vendor_id = 0x0ccd; + conf->product_id = 0x00d7; + strcpy(conf->manufacturer, "Realtek"); + strcpy(conf->product, "RTL2838UHIDIR"); + strcpy(conf->serial, "00000001"); + conf->have_serial = 1; + conf->enable_ir = 1; + conf->remote_wakeup = 0; + break; + default: + break; + }; +} + +int main(int argc, char **argv) +{ + int i, r, opt; + uint32_t dev_index = 0; + int device_count; + char *filename = NULL; + FILE *file = NULL; + char *manuf_str = NULL; + char *product_str = NULL; + char *serial_str = NULL; + uint8_t buf[EEPROM_SIZE]; + rtlsdr_config_t conf; + int flash_file = 0; + int default_config = 0; + int change = 0; + int ir_endpoint = 0; + char ch; + + while ((opt = getopt(argc, argv, "d:m:p:s:i:g:w:r:h?")) != -1) { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 'm': + manuf_str = optarg; + change = 1; + break; + case 'p': + product_str = optarg; + change = 1; + break; + case 's': + serial_str = optarg; + change = 1; + break; + case 'i': + ir_endpoint = (atoi(optarg) > 0) ? 1 : -1; + change = 1; + break; + case 'g': + if (!strcmp(optarg, "realtek")) + default_config = REALTEK; + else if (!strcmp(optarg, "realtek_oem")) + default_config = REALTEK_EEPROM; + else if (!strcmp(optarg, "noxon")) + default_config = TERRATEC_NOXON; + else if (!strcmp(optarg, "terratec_black")) + default_config = TERRATEC_T_BLACK; + else if (!strcmp(optarg, "terratec_plus")) + default_config = TERRATEC_T_PLUS; + + if (default_config != CONF_NONE) + change = 1; + break; + case 'w': + flash_file = 1; + change = 1; + case 'r': + filename = optarg; + break; + default: + usage(); + break; + } + } + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) + fprintf(stderr, " %d: %s\n", i, rtlsdr_get_device_name(i)); + fprintf(stderr, "\n"); + + fprintf(stderr, "Using device %d: %s\n", + dev_index, + rtlsdr_get_device_name(dev_index)); + + r = rtlsdr_open(&dev, dev_index); + if (r < 0) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + exit(1); + } + + fprintf(stderr, "\n"); + + r = rtlsdr_read_eeprom(dev, buf, 0, EEPROM_SIZE); + if (r < 0) { + if (r == -3) + fprintf(stderr, "No EEPROM has been found.\n"); + else + fprintf(stderr, "Failed to read EEPROM, err %i.\n", r); + goto exit; + } + + if (r < 0) + return -1; + + fprintf(stderr, "Current configuration:\n"); + parse_eeprom_to_conf(&conf, buf); + dump_config(&conf); + + if (filename) { + file = fopen(filename, flash_file ? "rb" : "wb"); + if (!file) { + fprintf(stderr, "Error opening file!\n"); + goto exit; + } + if (flash_file) { + if (fread(buf, 1, sizeof(buf), file) != sizeof(buf)) + fprintf(stderr, "Error reading file!\n"); + } else { + if (fwrite(buf, 1, sizeof(buf), file) != sizeof(buf)) + fprintf(stderr, "Short write, exiting!\n"); + else + fprintf(stderr, "\nDump to %s successful.\n", filename); + } + } + + if (manuf_str) + strncpy((char*)&conf.manufacturer, manuf_str, MAX_STR_SIZE); + + if (product_str) + strncpy((char*)&conf.product, product_str, MAX_STR_SIZE); + + if (serial_str) { + conf.have_serial = 1; + strncpy((char*)&conf.serial, serial_str, MAX_STR_SIZE); + } + + if (ir_endpoint != 0) + conf.enable_ir = (ir_endpoint > 0) ? 1 : 0; + + if (!change) + goto exit; + + fprintf(stderr, "\nNew configuration:\n"); + + if (default_config != CONF_NONE) + gen_default_conf(&conf, default_config); + + if (!flash_file) { + if (gen_eeprom_from_conf(&conf, buf) < 0) + goto exit; + } + + parse_eeprom_to_conf(&conf, buf); + dump_config(&conf); + + fprintf(stderr, "Write new configuration to device [y/n]? "); + + while ((ch = getchar())) { + if (ch != 'y') + goto exit; + else + break; + } + + r = rtlsdr_write_eeprom(dev, buf, 0, flash_file ? EEPROM_SIZE : 128); + if (r < 0) + fprintf(stderr, "Error while writing EEPROM: %i\n", r); + else + fprintf(stderr, "Configuration successfully written.\n"); + +exit: + if (file) + fclose(file); + + rtlsdr_close(dev); + + return r >= 0 ? r : -r; +} diff --git a/src/rtl_fm.c b/src/rtl_fm.c new file mode 100644 index 0000000..45f8e06 --- /dev/null +++ b/src/rtl_fm.c @@ -0,0 +1,838 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * Copyright (C) 2012 by Hoernchen <la@tfc-server.de> + * Copyright (C) 2012 by Kyle Keen <keenerd@gmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +/* + * written because people could not do real time + * FM demod on Atom hardware with GNU radio + * based on rtl_sdr.c and rtl_tcp.c + * todo: realtime ARMv5 + * remove float math (disqualifies complex.h) + * in-place array operations + * sanity checks + * nicer FIR than square + * scale squelch to other input parameters + * test all the demodulations + * pad output on hop + * nearest gain approx + * frequency ranges could be stored better + */ + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#ifndef _WIN32 +#include <unistd.h> +#else +#include <Windows.h> +#include <fcntl.h> +#include <io.h> +#include "getopt/getopt.h" +#define usleep(x) Sleep(x/1000) +#define round(x) (x > 0.0 ? floor(x + 0.5): ceil(x - 0.5)) +#endif + +#include <semaphore.h> +#include <pthread.h> +#include <libusb.h> + +#include "rtl-sdr.h" + +#define DEFAULT_SAMPLE_RATE 24000 +#define DEFAULT_ASYNC_BUF_NUMBER 32 +#define DEFAULT_BUF_LENGTH (1 * 16384) +#define MAXIMUM_OVERSAMPLE 16 +#define MAXIMUM_BUF_LENGTH (MAXIMUM_OVERSAMPLE * DEFAULT_BUF_LENGTH) +#define AUTO_GAIN -100 + +static pthread_t demod_thread; +static sem_t data_ready; +static int do_exit = 0; +static rtlsdr_dev_t *dev = NULL; +static int lcm_post[17] = {1,1,1,3,1,5,3,7,1,9,5,11,3,13,7,15,1}; + +struct fm_state +{ + int now_r; + int now_j; + int pre_r; + int pre_j; + int prev_index; + int downsample; /* min 1, max 256 */ + int post_downsample; + int output_scale; + int squelch_level; + int conseq_squelch; + int squelch_hits; + int terminate_on_squelch; + int exit_flag; + uint8_t buf[MAXIMUM_BUF_LENGTH]; + uint32_t buf_len; + int signal[MAXIMUM_BUF_LENGTH]; /* 16 bit signed i/q pairs */ + int16_t signal2[MAXIMUM_BUF_LENGTH]; /* signal has lowpass, signal2 has demod */ + int signal_len; + int signal2_len; + FILE *file; + int edge; + uint32_t freqs[1000]; + int freq_len; + int freq_now; + uint32_t sample_rate; + int output_rate; + int fir_enable; + int fir[256]; /* fir_len == downsample */ + int fir_sum; + int custom_atan; + int deemph; + int deemph_a; + int now_lpr; + int prev_lpr_index; + void (*mode_demod)(struct fm_state*); +}; + +void usage(void) +{ + fprintf(stderr, + "rtl_fm, a simple narrow band FM demodulator for RTL2832 based DVB-T receivers\n\n" + "Use:\trtl_fm -f freq [-options] [filename]\n" + "\t-f frequency_to_tune_to [Hz]\n" + "\t (use multiple -f for scanning, requires squelch)\n" + "\t (ranges supported, -f 118M:137M:25k)\n" + "\t[-s sample_rate (default: 24k)]\n" + "\t[-d device_index (default: 0)]\n" + "\t[-g tuner_gain (default: automatic)]\n" + "\t[-l squelch_level (default: 0/off)]\n" + "\t[-o oversampling (default: 1, 4 recommended)]\n" + "\t[-p ppm_error (default: 0)]\n" + "\t[-E sets lower edge tuning (default: center)]\n" + "\t[-N enables NBFM mode (default: on)]\n" + "\t[-W enables WBFM mode (default: off)]\n" + "\t (-N -s 170k -o 4 -A -r 32k -l 0 -D)\n" + "\tfilename (a '-' dumps samples to stdout)\n" + "\t (omitting the filename also uses stdout)\n\n" + "Experimental options:\n" + "\t[-r output_rate (default: same as -s)]\n" + "\t[-t squelch_delay (default: 20)]\n" + "\t (+values will mute/scan, -values will exit)\n" + "\t[-M enables AM mode (default: off)]\n" + "\t[-L enables LSB mode (default: off)]\n" + "\t[-U enables USB mode (default: off)]\n" + //"\t[-D enables DSB mode (default: off)]\n" + "\t[-R enables raw mode (default: off, 2x16 bit output)]\n" + "\t[-F enables high quality FIR (default: off/square)]\n" + "\t[-D enables de-emphasis (default: off)]\n" + "\t[-A enables high speed arctan (default: off)]\n\n" + "Produces signed 16 bit ints, use Sox or aplay to hear them.\n" + "\trtl_fm ... - | play -t raw -r 24k -e signed-integer -b 16 -c 1 -V1 -\n" + "\t | aplay -r 24k -f S16_LE -t raw -c 1\n" + "\t -s 22.5k - | multimon -t raw /dev/stdin\n\n"); + exit(1); +} + +#ifdef _WIN32 +BOOL WINAPI +sighandler(int signum) +{ + if (CTRL_C_EVENT == signum) { + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); + return TRUE; + } + return FALSE; +} +#else +static void sighandler(int signum) +{ + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); +} +#endif + +void rotate_90(unsigned char *buf, uint32_t len) +/* 90 rotation is 1+0j, 0+1j, -1+0j, 0-1j + or [0, 1, -3, 2, -4, -5, 7, -6] */ +{ + uint32_t i; + unsigned char tmp; + for (i=0; i<len; i+=8) { + /* uint8_t negation = 255 - x */ + tmp = 255 - buf[i+3]; + buf[i+3] = buf[i+2]; + buf[i+2] = tmp; + + buf[i+4] = 255 - buf[i+4]; + buf[i+5] = 255 - buf[i+5]; + + tmp = 255 - buf[i+6]; + buf[i+6] = buf[i+7]; + buf[i+7] = tmp; + } +} + +void low_pass(struct fm_state *fm, unsigned char *buf, uint32_t len) +/* simple square window FIR */ +{ + int i=0, i2=0; + while (i < (int)len) { + fm->now_r += ((int)buf[i] - 128); + fm->now_j += ((int)buf[i+1] - 128); + i += 2; + fm->prev_index++; + if (fm->prev_index < fm->downsample) { + continue; + } + fm->signal[i2] = fm->now_r * fm->output_scale; + fm->signal[i2+1] = fm->now_j * fm->output_scale; + fm->prev_index = 0; + fm->now_r = 0; + fm->now_j = 0; + i2 += 2; + } + fm->signal_len = i2; +} + +void build_fir(struct fm_state *fm) +/* for now, a simple triangle + * fancy FIRs are equally expensive, so use one */ +/* point = sum(sample[i] * fir[i] * fir_len / fir_sum) */ +{ + int i, len; + len = fm->downsample; + for(i = 0; i < (len/2); i++) { + fm->fir[i] = i; + } + for(i = len-1; i >= (len/2); i--) { + fm->fir[i] = len - i; + } + fm->fir_sum = 0; + for(i = 0; i < len; i++) { + fm->fir_sum += fm->fir[i]; + } +} + +void low_pass_fir(struct fm_state *fm, unsigned char *buf, uint32_t len) +/* perform an arbitrary FIR, doubles CPU use */ +// possibly bugged, or overflowing +{ + int i=0, i2=0, i3=0; + while (i < (int)len) { + i3 = fm->prev_index; + fm->now_r += ((int)buf[i] - 128) * fm->fir[i3] * fm->downsample / fm->fir_sum; + fm->now_j += ((int)buf[i+1] - 128) * fm->fir[i3] * fm->downsample / fm->fir_sum; + i += 2; + fm->prev_index++; + if (fm->prev_index < fm->downsample) { + continue; + } + fm->signal[i2] = fm->now_r * fm->output_scale; + fm->signal[i2+1] = fm->now_j * fm->output_scale; + fm->prev_index = 0; + fm->now_r = 0; + fm->now_j = 0; + i2 += 2; + } + fm->signal_len = i2; +} + +int low_pass_simple(int16_t *signal2, int len, int step) +// no wrap around, length must be multiple of step +{ + int i, i2, sum; + for(i=0; i < len; i+=step) { + sum = 0; + for(i2=0; i2<step; i2++) { + sum += (int)signal2[i + i2]; + } + //signal2[i/step] = (int16_t)(sum / step); + signal2[i/step] = (int16_t)(sum); + } + signal2[i/step + 1] = signal2[i/step]; + return len / step; +} + +void low_pass_real(struct fm_state *fm) +/* simple square window FIR */ +// add support for upsampling? +{ + int i=0, i2=0; + int fast = (int)fm->sample_rate / fm->post_downsample; + int slow = fm->output_rate; + while (i < fm->signal2_len) { + fm->now_lpr += fm->signal2[i]; + i++; + fm->prev_lpr_index += slow; + if (fm->prev_lpr_index < fast) { + continue; + } + fm->signal2[i2] = (int16_t)(fm->now_lpr / (fast/slow)); + fm->prev_lpr_index -= fast; + fm->now_lpr = 0; + i2 += 1; + } + fm->signal2_len = i2; +} + +/* define our own complex math ops + because ARMv5 has no hardware float */ + +void multiply(int ar, int aj, int br, int bj, int *cr, int *cj) +{ + *cr = ar*br - aj*bj; + *cj = aj*br + ar*bj; +} + +int polar_discriminant(int ar, int aj, int br, int bj) +{ + int cr, cj; + double angle; + multiply(ar, aj, br, -bj, &cr, &cj); + angle = atan2((double)cj, (double)cr); + return (int)(angle / 3.14159 * (1<<14)); +} + +int fast_atan2(int y, int x) +/* pre scaled for int16 */ +{ + int yabs, angle; + int pi4=(1<<12), pi34=3*(1<<12); // note pi = 1<<14 + if (x==0 && y==0) { + return 0; + } + yabs = y; + if (yabs < 0) { + yabs = -yabs; + } + if (x >= 0) { + angle = pi4 - pi4 * (x-yabs) / (x+yabs); + } else { + angle = pi34 - pi4 * (x+yabs) / (yabs-x); + } + if (y < 0) { + return -angle; + } + return angle; +} + +int polar_disc_fast(int ar, int aj, int br, int bj) +{ + int cr, cj; + multiply(ar, aj, br, -bj, &cr, &cj); + return fast_atan2(cj, cr); +} + +void fm_demod(struct fm_state *fm) +{ + int i, pcm; + pcm = polar_discriminant(fm->signal[0], fm->signal[1], + fm->pre_r, fm->pre_j); + fm->signal2[0] = (int16_t)pcm; + for (i = 2; i < (fm->signal_len); i += 2) { + if (fm->custom_atan) { + pcm = polar_disc_fast(fm->signal[i], fm->signal[i+1], + fm->signal[i-2], fm->signal[i-1]); + } else { + pcm = polar_discriminant(fm->signal[i], fm->signal[i+1], + fm->signal[i-2], fm->signal[i-1]); + } + fm->signal2[i/2] = (int16_t)pcm; + } + fm->pre_r = fm->signal[fm->signal_len - 2]; + fm->pre_j = fm->signal[fm->signal_len - 1]; + fm->signal2_len = fm->signal_len/2; +} + +void am_demod(struct fm_state *fm) +// todo, fix this extreme laziness +{ + int i, pcm; + for (i = 0; i < (fm->signal_len); i += 2) { + // hypot uses floats but won't overflow + //fm->signal2[i/2] = (int16_t)hypot(fm->signal[i], fm->signal[i+1]); + pcm = fm->signal[i] * fm->signal[i]; + pcm += fm->signal[i+1] * fm->signal[i+1]; + fm->signal2[i/2] = (int16_t)sqrt(pcm); // * fm->output_scale; + } + fm->signal2_len = fm->signal_len/2; + // lowpass? (3khz) highpass? (dc) +} + +void usb_demod(struct fm_state *fm) +{ + int i, pcm; + for (i = 0; i < (fm->signal_len); i += 2) { + pcm = fm->signal[i] + fm->signal[i+1]; + fm->signal2[i/2] = (int16_t)pcm; // * fm->output_scale; + } + fm->signal2_len = fm->signal_len/2; +} + +void lsb_demod(struct fm_state *fm) +{ + int i, pcm; + for (i = 0; i < (fm->signal_len); i += 2) { + pcm = fm->signal[i] - fm->signal[i+1]; + fm->signal2[i/2] = (int16_t)pcm; // * fm->output_scale; + } + fm->signal2_len = fm->signal_len/2; +} + +void raw_demod(struct fm_state *fm) +{ + /* hacky and pointless code */ + int i; + for (i = 0; i < (fm->signal_len); i++) { + fm->signal2[i] = (int16_t)fm->signal[i]; + } + fm->signal2_len = fm->signal_len; +} + +void deemph_filter(struct fm_state *fm) +{ + static int avg; // cheating... + int i, d; + // de-emph IIR + // avg = avg * (1 - alpha) + sample * alpha; + for (i = 0; i < fm->signal2_len; i++) { + d = fm->signal2[i] - avg; + if (d > 0) { + avg += (d + fm->deemph_a/2) / fm->deemph_a; + } else { + avg += (d - fm->deemph_a/2) / fm->deemph_a; + } + fm->signal2[i] = (int16_t)avg; + } +} + +int mad(int *samples, int len, int step) +/* mean average deviation */ +{ + int i=0, sum=0, ave=0; + if (len == 0) + {return 0;} + for (i=0; i<len; i+=step) { + sum += samples[i]; + } + ave = sum / (len * step); + sum = 0; + for (i=0; i<len; i+=step) { + sum += abs(samples[i] - ave); + } + return sum / (len / step); +} + +int post_squelch(struct fm_state *fm) +/* returns 1 for active signal, 0 for no signal */ +{ + int dev_r, dev_j, len, sq_l; + /* only for small samples, big samples need chunk processing */ + len = fm->signal_len; + sq_l = fm->squelch_level; + dev_r = mad(&(fm->signal[0]), len, 2); + dev_j = mad(&(fm->signal[1]), len, 2); + if ((dev_r > sq_l) || (dev_j > sq_l)) { + fm->squelch_hits = 0; + return 1; + } + fm->squelch_hits++; + return 0; +} + +static void optimal_settings(struct fm_state *fm, int freq, int hopping) +{ + int r, capture_freq, capture_rate; + fm->downsample = (1000000 / fm->sample_rate) + 1; + fm->freq_now = freq; + capture_rate = fm->downsample * fm->sample_rate; + capture_freq = fm->freqs[freq] + capture_rate/4; + capture_freq += fm->edge * fm->sample_rate / 2; + fm->output_scale = (1<<15) / (128 * fm->downsample); + if (fm->output_scale < 1) { + fm->output_scale = 1;} + fm->output_scale = 1; + /* Set the frequency */ + r = rtlsdr_set_center_freq(dev, (uint32_t)capture_freq); + if (hopping) { + return;} + fprintf(stderr, "Oversampling input by: %ix.\n", fm->downsample); + fprintf(stderr, "Oversampling output by: %ix.\n", fm->post_downsample); + fprintf(stderr, "Buffer size: %0.2fms\n", + 1000 * 0.5 * lcm_post[fm->post_downsample] * (float)DEFAULT_BUF_LENGTH / (float)capture_rate); + if (r < 0) { + fprintf(stderr, "WARNING: Failed to set center freq.\n");} + else { + fprintf(stderr, "Tuned to %u Hz.\n", capture_freq);} + + /* Set the sample rate */ + fprintf(stderr, "Sampling at %u Hz.\n", capture_rate); + if (fm->output_rate > 0) { + fprintf(stderr, "Output at %u Hz.\n", fm->output_rate); + } else { + fprintf(stderr, "Output at %u Hz.\n", fm->sample_rate/fm->post_downsample);} + r = rtlsdr_set_sample_rate(dev, (uint32_t)capture_rate); + if (r < 0) { + fprintf(stderr, "WARNING: Failed to set sample rate.\n");} + +} + +void full_demod(struct fm_state *fm) +{ + int i, sr, freq_next, hop = 0; + rotate_90(fm->buf, fm->buf_len); + if (fm->fir_enable) { + low_pass_fir(fm, fm->buf, fm->buf_len); + } else { + low_pass(fm, fm->buf, fm->buf_len); + } + fm->mode_demod(fm); + if (fm->mode_demod == &raw_demod) { + fwrite(fm->signal2, 2, fm->signal2_len, fm->file); + return; + } + sr = post_squelch(fm); + if (!sr && fm->squelch_hits > fm->conseq_squelch) { + if (fm->terminate_on_squelch) { + fm->exit_flag = 1;} + if (fm->freq_len == 1) { /* mute */ + for (i=0; i<fm->signal_len; i++) { + fm->signal2[i] = 0;} + } + else { + hop = 1;} + } + if (fm->post_downsample > 1) { + fm->signal2_len = low_pass_simple(fm->signal2, fm->signal2_len, fm->post_downsample);} + if (fm->output_rate > 0) { + low_pass_real(fm); + } + if (fm->deemph) { + deemph_filter(fm);} + /* ignore under runs for now */ + fwrite(fm->signal2, 2, fm->signal2_len, fm->file); + if (hop) { + freq_next = (fm->freq_now + 1) % fm->freq_len; + optimal_settings(fm, freq_next, 1); + fm->squelch_hits = fm->conseq_squelch + 1; /* hair trigger */ + /* wait for settling and flush buffer */ + usleep(5000); + rtlsdr_read_sync(dev, NULL, 4096, NULL); + } +} + +static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) +{ + struct fm_state *fm2 = ctx; + int dr_val; + if (do_exit) { + return;} + if (!ctx) { + return;} + memcpy(fm2->buf, buf, len); + fm2->buf_len = len; + /* single threaded uses 25% less CPU? */ + /* full_demod(fm2); */ + sem_getvalue(&data_ready, &dr_val); + if (dr_val <= 0) { + sem_post(&data_ready);} +} + +static void *demod_thread_fn(void *arg) +{ + struct fm_state *fm2 = arg; + while (!do_exit) { + sem_wait(&data_ready); + full_demod(fm2); + if (fm2->exit_flag) { + do_exit = 1; + rtlsdr_cancel_async(dev);} + } + return 0; +} + +double atofs(char* f) +/* standard suffixes */ +{ + char* chop; + double suff = 1.0; + chop = malloc((strlen(f)+1)*sizeof(char)); + strncpy(chop, f, strlen(f)-1); + switch (f[strlen(f)-1]) { + case 'G': + suff *= 1e3; + case 'M': + suff *= 1e3; + case 'k': + suff *= 1e3; + suff *= atof(chop);} + free(chop); + if (suff != 1.0) { + return suff;} + return atof(f); +} + +void frequency_range(struct fm_state *fm, char *arg) +{ + char *start, *stop, *step; + int i; + start = arg; + stop = strchr(start, ':') + 1; + stop[-1] = '\0'; + step = strchr(stop, ':') + 1; + step[-1] = '\0'; + for(i=(int)atofs(start); i<=(int)atofs(stop); i+=(int)atofs(step)) + { + fm->freqs[fm->freq_len] = (uint32_t)i; + fm->freq_len++; + } + stop[-1] = ':'; + step[-1] = ':'; +} + +int main(int argc, char **argv) +{ +#ifndef _WIN32 + struct sigaction sigact; +#endif + struct fm_state fm; + char *filename = NULL; + int n_read, r, opt, wb_mode = 0; + int i, gain = AUTO_GAIN; // tenths of a dB + uint8_t *buffer; + uint32_t dev_index = 0; + int device_count; + int ppm_error = 0; + char vendor[256], product[256], serial[256]; + fm.freqs[0] = 100000000; + fm.sample_rate = DEFAULT_SAMPLE_RATE; + fm.squelch_level = 0; + fm.conseq_squelch = 20; + fm.terminate_on_squelch = 0; + fm.freq_len = 0; + fm.edge = 0; + fm.fir_enable = 0; + fm.prev_index = 0; + fm.post_downsample = 1; // once this works, default = 4 + fm.custom_atan = 0; + fm.deemph = 0; + fm.output_rate = -1; // flag for disabled + fm.mode_demod = &fm_demod; + sem_init(&data_ready, 0, 0); + + while ((opt = getopt(argc, argv, "d:f:g:s:b:l:o:t:r:p:EFANWMULRD")) != -1) { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 'f': + if (strchr(optarg, ':')) + {frequency_range(&fm, optarg);} + else + { + fm.freqs[fm.freq_len] = (uint32_t)atofs(optarg); + fm.freq_len++; + } + break; + case 'g': + gain = (int)(atof(optarg) * 10); + break; + case 'l': + fm.squelch_level = (int)atof(optarg); + break; + case 's': + fm.sample_rate = (uint32_t)atofs(optarg); + break; + case 'r': + fm.output_rate = (int)atofs(optarg); + break; + case 'o': + fm.post_downsample = (int)atof(optarg); + if (fm.post_downsample < 1 || fm.post_downsample > MAXIMUM_OVERSAMPLE) { + fprintf(stderr, "Oversample must be between 1 and %i\n", MAXIMUM_OVERSAMPLE);} + break; + case 't': + fm.conseq_squelch = (int)atof(optarg); + if (fm.conseq_squelch < 0) { + fm.conseq_squelch = -fm.conseq_squelch; + fm.terminate_on_squelch = 1; + } + break; + case 'p': + ppm_error = atoi(optarg); + break; + case 'E': + fm.edge = 1; + break; + case 'F': + fm.fir_enable = 1; + break; + case 'A': + fm.custom_atan = 1; + break; + case 'D': + fm.deemph = 1; + break; + case 'N': + fm.mode_demod = &fm_demod; + break; + case 'W': + wb_mode = 1; + fm.mode_demod = &fm_demod; + fm.sample_rate = 170000; + fm.output_rate = 32000; + fm.custom_atan = 1; + fm.post_downsample = 4; + fm.deemph = 1; + fm.squelch_level = 0; + break; + case 'M': + fm.mode_demod = &am_demod; + break; + case 'U': + fm.mode_demod = &usb_demod; + break; + case 'L': + fm.mode_demod = &lsb_demod; + break; + case 'R': + fm.mode_demod = &raw_demod; + break; + default: + usage(); + break; + } + } + /* quadruple sample_rate to limit to Îθ to ±Ï/2 */ + fm.sample_rate *= fm.post_downsample; + + if (fm.freq_len > 1) { + fm.terminate_on_squelch = 0; + } + + if (argc <= optind) { + //usage(); + filename = "-"; + } else { + filename = argv[optind]; + } + + buffer = malloc(lcm_post[fm.post_downsample] * DEFAULT_BUF_LENGTH * sizeof(uint8_t)); + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); + } + fprintf(stderr, "\n"); + + fprintf(stderr, "Using device %d: %s\n", + dev_index, rtlsdr_get_device_name(dev_index)); + + r = rtlsdr_open(&dev, dev_index); + if (r < 0) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + exit(1); + } +#ifndef _WIN32 + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGPIPE, &sigact, NULL); +#else + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#endif + + /* WBFM is special */ + if (wb_mode) { + fm.freqs[0] += 16000; + } + + if (fm.deemph) { + fm.deemph_a = (int)round(1.0/((1.0-exp(-1.0/(fm.output_rate * 75e-6))))); + } + + optimal_settings(&fm, 0, 0); + build_fir(&fm); + + /* Set the tuner gain */ + if (gain == AUTO_GAIN) { + r = rtlsdr_set_tuner_gain_mode(dev, 0); + } else { + r = rtlsdr_set_tuner_gain_mode(dev, 1); + r = rtlsdr_set_tuner_gain(dev, gain); + } + if (r != 0) { + fprintf(stderr, "WARNING: Failed to set tuner gain.\n"); + } else if (gain == AUTO_GAIN) { + fprintf(stderr, "Tuner gain set to automatic.\n"); + } else { + fprintf(stderr, "Tuner gain set to %0.2f dB.\n", gain/10.0); + } + r = rtlsdr_set_freq_correction(dev, ppm_error); + + if (strcmp(filename, "-") == 0) { /* Write samples to stdout */ + fm.file = stdout; +#ifdef _WIN32 + _setmode(_fileno(fm.file), _O_BINARY); +#endif + } else { + fm.file = fopen(filename, "wb"); + if (!fm.file) { + fprintf(stderr, "Failed to open %s\n", filename); + exit(1); + } + } + + /* Reset endpoint before we start reading from it (mandatory) */ + r = rtlsdr_reset_buffer(dev); + if (r < 0) { + fprintf(stderr, "WARNING: Failed to reset buffers.\n");} + + pthread_create(&demod_thread, NULL, demod_thread_fn, (void *)(&fm)); + rtlsdr_read_async(dev, rtlsdr_callback, (void *)(&fm), + DEFAULT_ASYNC_BUF_NUMBER, + lcm_post[fm.post_downsample] * DEFAULT_BUF_LENGTH); + + if (do_exit) { + fprintf(stderr, "\nUser cancel, exiting...\n");} + else { + fprintf(stderr, "\nLibrary error %d, exiting...\n", r);} + rtlsdr_cancel_async(dev); + + if (fm.file != stdout) { + fclose(fm.file);} + + rtlsdr_close(dev); + free (buffer); + return r >= 0 ? r : -r; +} diff --git a/src/rtl_sdr.c b/src/rtl_sdr.c new file mode 100644 index 0000000..eeb6dba --- /dev/null +++ b/src/rtl_sdr.c @@ -0,0 +1,297 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#ifndef _WIN32 +#include <unistd.h> +#else +#include <Windows.h> +#include <io.h> +#include <fcntl.h> +#include "getopt/getopt.h" +#endif + +#include "rtl-sdr.h" + +#define DEFAULT_SAMPLE_RATE 2048000 +#define DEFAULT_ASYNC_BUF_NUMBER 32 +#define DEFAULT_BUF_LENGTH (16 * 16384) +#define MINIMAL_BUF_LENGTH 512 +#define MAXIMAL_BUF_LENGTH (256 * 16384) + +static int do_exit = 0; +static uint32_t bytes_to_read = 0; +static rtlsdr_dev_t *dev = NULL; + +void usage(void) +{ + fprintf(stderr, + "rtl_sdr, an I/Q recorder for RTL2832 based DVB-T receivers\n\n" + "Usage:\t -f frequency_to_tune_to [Hz]\n" + "\t[-s samplerate (default: 2048000 Hz)]\n" + "\t[-d device_index (default: 0)]\n" + "\t[-g gain (default: 0 for auto)]\n" + "\t[-b output_block_size (default: 16 * 16384)]\n" + "\t[-n number of samples to read (default: 0, infinite)]\n" + "\t[-S force sync output (default: async)]\n" + "\tfilename (a '-' dumps samples to stdout)\n\n"); + exit(1); +} + +#ifdef _WIN32 +BOOL WINAPI +sighandler(int signum) +{ + if (CTRL_C_EVENT == signum) { + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); + return TRUE; + } + return FALSE; +} +#else +static void sighandler(int signum) +{ + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); +} +#endif + +static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) +{ + if (ctx) { + if (do_exit) + return; + + if ((bytes_to_read > 0) && (bytes_to_read < len)) { + len = bytes_to_read; + do_exit = 1; + rtlsdr_cancel_async(dev); + } + + if (fwrite(buf, 1, len, (FILE*)ctx) != len) { + fprintf(stderr, "Short write, samples lost, exiting!\n"); + rtlsdr_cancel_async(dev); + } + + if (bytes_to_read > 0) + bytes_to_read -= len; + } +} + +int main(int argc, char **argv) +{ +#ifndef _WIN32 + struct sigaction sigact; +#endif + char *filename = NULL; + int n_read; + int r, opt; + int i, gain = 0; + int sync_mode = 0; + FILE *file; + uint8_t *buffer; + uint32_t dev_index = 0; + uint32_t frequency = 100000000; + uint32_t samp_rate = DEFAULT_SAMPLE_RATE; + uint32_t out_block_size = DEFAULT_BUF_LENGTH; + int device_count; + char vendor[256], product[256], serial[256]; + + while ((opt = getopt(argc, argv, "d:f:g:s:b:n:S::")) != -1) { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 'f': + frequency = (uint32_t)atof(optarg); + break; + case 'g': + gain = (int)(atof(optarg) * 10); /* tenths of a dB */ + break; + case 's': + samp_rate = (uint32_t)atof(optarg); + break; + case 'b': + out_block_size = (uint32_t)atof(optarg); + break; + case 'n': + bytes_to_read = (uint32_t)atof(optarg) * 2; + break; + case 'S': + sync_mode = 1; + break; + default: + usage(); + break; + } + } + + if (argc <= optind) { + usage(); + } else { + filename = argv[optind]; + } + + if(out_block_size < MINIMAL_BUF_LENGTH || + out_block_size > MAXIMAL_BUF_LENGTH ){ + fprintf(stderr, + "Output block size wrong value, falling back to default\n"); + fprintf(stderr, + "Minimal length: %u\n", MINIMAL_BUF_LENGTH); + fprintf(stderr, + "Maximal length: %u\n", MAXIMAL_BUF_LENGTH); + out_block_size = DEFAULT_BUF_LENGTH; + } + + buffer = malloc(out_block_size * sizeof(uint8_t)); + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) { + rtlsdr_get_device_usb_strings(i, vendor, product, serial); + fprintf(stderr, " %d: %s, %s, SN: %s\n", i, vendor, product, serial); + } + fprintf(stderr, "\n"); + + fprintf(stderr, "Using device %d: %s\n", + dev_index, rtlsdr_get_device_name(dev_index)); + + r = rtlsdr_open(&dev, dev_index); + if (r < 0) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + exit(1); + } +#ifndef _WIN32 + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGPIPE, &sigact, NULL); +#else + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#endif + /* Set the sample rate */ + r = rtlsdr_set_sample_rate(dev, samp_rate); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set sample rate.\n"); + + /* Set the frequency */ + r = rtlsdr_set_center_freq(dev, frequency); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set center freq.\n"); + else + fprintf(stderr, "Tuned to %u Hz.\n", frequency); + + if (0 == gain) { + /* Enable automatic gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 0); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable automatic gain.\n"); + } else { + /* Enable manual gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 1); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable manual gain.\n"); + + /* Set the tuner gain */ + r = rtlsdr_set_tuner_gain(dev, gain); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set tuner gain.\n"); + else + fprintf(stderr, "Tuner gain set to %f dB.\n", gain/10.0); + } + + if(strcmp(filename, "-") == 0) { /* Write samples to stdout */ + file = stdout; +#ifdef _WIN32 + _setmode(_fileno(stdin), _O_BINARY); +#endif + } else { + file = fopen(filename, "wb"); + if (!file) { + fprintf(stderr, "Failed to open %s\n", filename); + goto out; + } + } + + /* Reset endpoint before we start reading from it (mandatory) */ + r = rtlsdr_reset_buffer(dev); + if (r < 0) + fprintf(stderr, "WARNING: Failed to reset buffers.\n"); + + if (sync_mode) { + fprintf(stderr, "Reading samples in sync mode...\n"); + while (!do_exit) { + r = rtlsdr_read_sync(dev, buffer, out_block_size, &n_read); + if (r < 0) { + fprintf(stderr, "WARNING: sync read failed.\n"); + break; + } + + if ((bytes_to_read > 0) && (bytes_to_read < (uint32_t)n_read)) { + n_read = bytes_to_read; + do_exit = 1; + } + + if (fwrite(buffer, 1, n_read, file) != (size_t)n_read) { + fprintf(stderr, "Short write, samples lost, exiting!\n"); + break; + } + + if ((uint32_t)n_read < out_block_size) { + fprintf(stderr, "Short read, samples lost, exiting!\n"); + break; + } + + if (bytes_to_read > 0) + bytes_to_read -= n_read; + } + } else { + fprintf(stderr, "Reading samples in async mode...\n"); + r = rtlsdr_read_async(dev, rtlsdr_callback, (void *)file, + DEFAULT_ASYNC_BUF_NUMBER, out_block_size); + } + + if (do_exit) + fprintf(stderr, "\nUser cancel, exiting...\n"); + else + fprintf(stderr, "\nLibrary error %d, exiting...\n", r); + + if (file != stdout) + fclose(file); + + rtlsdr_close(dev); + free (buffer); +out: + return r >= 0 ? r : -r; +} diff --git a/src/rtl_tcp.c b/src/rtl_tcp.c new file mode 100644 index 0000000..13f20fa --- /dev/null +++ b/src/rtl_tcp.c @@ -0,0 +1,604 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * Copyright (C) 2012 by Hoernchen <la@tfc-server.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#ifndef _WIN32 +#include <unistd.h> +#include <arpa/inet.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/time.h> +#include <netinet/in.h> +#include <fcntl.h> +#else +#include <WinSock2.h> +#include "getopt/getopt.h" +#endif + +#include <pthread.h> + +#include "rtl-sdr.h" + +#ifdef _WIN32 +#pragma comment(lib, "ws2_32.lib") + +typedef int socklen_t; + +#else +#define closesocket close +#define SOCKADDR struct sockaddr +#define SOCKET int +#define SOCKET_ERROR -1 +#endif + +static SOCKET s; + +static pthread_t tcp_worker_thread; +static pthread_t command_thread; +static pthread_cond_t exit_cond; +static pthread_mutex_t exit_cond_lock; +static volatile int dead[2] = {0, 0}; + +static pthread_mutex_t ll_mutex; +static pthread_cond_t cond; + +struct llist { + char *data; + size_t len; + struct llist *next; +}; + +typedef struct { /* structure size must be multiple of 2 bytes */ + char magic[4]; + uint32_t tuner_type; + uint32_t tuner_gain_count; +} dongle_info_t; + +static rtlsdr_dev_t *dev = NULL; + +int global_numq = 0; +static struct llist *ll_buffers = 0; + +static int do_exit = 0; + +void usage(void) +{ + printf("rtl_tcp, an I/Q spectrum server for RTL2832 based DVB-T receivers\n\n" + "Usage:\t[-a listen address]\n" + "\t[-p listen port (default: 1234)]\n" + "\t[-f frequency to tune to [Hz]]\n" + "\t[-g gain (default: 0 for auto)]\n" + "\t[-s samplerate in Hz (default: 2048000 Hz)]\n" + "\t[-b number of buffers (default: 32, set by library)]\n" + "\t[-d device index (default: 0)]\n"); + exit(1); +} + +#ifdef _WIN32 +int gettimeofday(struct timeval *tv, void* ignored) +{ + FILETIME ft; + unsigned __int64 tmp = 0; + if (NULL != tv) { + GetSystemTimeAsFileTime(&ft); + tmp |= ft.dwHighDateTime; + tmp <<= 32; + tmp |= ft.dwLowDateTime; + tmp /= 10; + tmp -= 11644473600000000Ui64; + tv->tv_sec = (long)(tmp / 1000000UL); + tv->tv_usec = (long)(tmp % 1000000UL); + } + return 0; +} + +BOOL WINAPI +sighandler(int signum) +{ + if (CTRL_C_EVENT == signum) { + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); + return TRUE; + } + return FALSE; +} +#else +static void sighandler(int signum) +{ + fprintf(stderr, "Signal caught, exiting!\n"); + if (!do_exit) { + rtlsdr_cancel_async(dev); + do_exit = 1; + } +} +#endif + +void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) +{ + if(!do_exit) { + struct llist *rpt = (struct llist*)malloc(sizeof(struct llist)); + rpt->data = (char*)malloc(len); + memcpy(rpt->data, buf, len); + rpt->len = len; + rpt->next = NULL; + + pthread_mutex_lock(&ll_mutex); + + if (ll_buffers == NULL) { + ll_buffers = rpt; + } else { + struct llist *cur = ll_buffers; + int num_queued = 0; + + while (cur->next != NULL) { + cur = cur->next; + num_queued++; + } + cur->next = rpt; + + if (num_queued > global_numq) + printf("ll+, now %d\n", num_queued); + else if (num_queued < global_numq) + printf("ll-, now %d\n", num_queued); + + global_numq = num_queued; + } + pthread_cond_signal(&cond); + pthread_mutex_unlock(&ll_mutex); + } +} + +static void *tcp_worker(void *arg) +{ + struct llist *curelem,*prev; + int bytesleft,bytessent, index; + struct timeval tv= {1,0}; + struct timespec ts; + struct timeval tp; + fd_set writefds; + int r = 0; + + while(1) { + if(do_exit) + pthread_exit(0); + + pthread_mutex_lock(&ll_mutex); + gettimeofday(&tp, NULL); + ts.tv_sec = tp.tv_sec+5; + ts.tv_nsec = tp.tv_usec * 1000; + r = pthread_cond_timedwait(&cond, &ll_mutex, &ts); + if(r == ETIMEDOUT) { + pthread_mutex_unlock(&ll_mutex); + printf("worker cond timeout\n"); + sighandler(0); + dead[0]=1; + pthread_exit(NULL); + } + + curelem = ll_buffers; + ll_buffers = 0; + pthread_mutex_unlock(&ll_mutex); + + while(curelem != 0) { + bytesleft = curelem->len; + index = 0; + bytessent = 0; + while(bytesleft > 0) { + FD_ZERO(&writefds); + FD_SET(s, &writefds); + tv.tv_sec = 1; + tv.tv_usec = 0; + r = select(s+1, NULL, &writefds, NULL, &tv); + if(r) { + bytessent = send(s, &curelem->data[index], bytesleft, 0); + if (bytessent == SOCKET_ERROR) { + perror("worker socket error"); + sighandler(0); + dead[0]=1; + pthread_exit(NULL); + } else if (do_exit) { + printf("do_exit\n"); + dead[0]=1; + pthread_exit(NULL); + } else { + bytesleft -= bytessent; + index += bytessent; + } + } else if(do_exit) { + printf("worker socket bye\n"); + sighandler(0); + dead[0]=1; + pthread_exit(NULL); + } + } + prev = curelem; + curelem = curelem->next; + free(prev->data); + free(prev); + } + } +} + +static int set_gain_by_index(rtlsdr_dev_t *_dev, unsigned int index) +{ + int res = 0; + int* gains; + int count = rtlsdr_get_tuner_gains(_dev, NULL); + + if (count > 0 && (unsigned int)count > index) { + gains = malloc(sizeof(int) * count); + count = rtlsdr_get_tuner_gains(_dev, gains); + + res = rtlsdr_set_tuner_gain(_dev, gains[index]); + + free(gains); + } + + return res; +} + +#ifdef _WIN32 +#define __attribute__(x) +#pragma pack(push, 1) +#endif +struct command{ + unsigned char cmd; + unsigned int param; +}__attribute__((packed)); +#ifdef _WIN32 +#pragma pack(pop) +#endif +static void *command_worker(void *arg) +{ + int left, received; + fd_set readfds; + struct command cmd={0, 0}; + struct timeval tv= {1, 0}; + int r = 0; + uint32_t tmp; + + while(1) { + left=sizeof(cmd); + while(left >0) { + FD_ZERO(&readfds); + FD_SET(s, &readfds); + tv.tv_sec = 1; + tv.tv_usec = 0; + r = select(s+1, &readfds, NULL, NULL, &tv); + if(r) { + received = recv(s, (char*)&cmd+(sizeof(cmd)-left), left, 0); + if(received == SOCKET_ERROR){ + perror("comm recv socket error"); + sighandler(0); + dead[1]=1; + pthread_exit(NULL); + } else if(do_exit){ + printf("do exit\n"); + dead[1]=1; + pthread_exit(NULL); + } else { + left -= received; + } + } else if(do_exit) { + printf("comm recv bye\n"); + sighandler(0); + dead[1] = 1; + pthread_exit(NULL); + } + } + switch(cmd.cmd) { + case 0x01: + printf("set freq %d\n", ntohl(cmd.param)); + rtlsdr_set_center_freq(dev,ntohl(cmd.param)); + break; + case 0x02: + printf("set sample rate %d\n", ntohl(cmd.param)); + rtlsdr_set_sample_rate(dev, ntohl(cmd.param)); + break; + case 0x03: + printf("set gain mode %d\n", ntohl(cmd.param)); + rtlsdr_set_tuner_gain_mode(dev, ntohl(cmd.param)); + break; + case 0x04: + printf("set gain %d\n", ntohl(cmd.param)); + rtlsdr_set_tuner_gain(dev, ntohl(cmd.param)); + break; + case 0x05: + printf("set freq correction %d\n", ntohl(cmd.param)); + rtlsdr_set_freq_correction(dev, ntohl(cmd.param)); + break; + case 0x06: + tmp = ntohl(cmd.param); + printf("set if stage %d, gain %d\n", tmp >> 16, tmp & 0xffff); + rtlsdr_set_tuner_if_gain(dev, tmp >> 16, tmp & 0xffff); + break; + case 0x07: + printf("set test mode %d\n", ntohl(cmd.param)); + rtlsdr_set_testmode(dev, ntohl(cmd.param)); + break; + case 0x08: + printf("set agc mode %d\n", ntohl(cmd.param)); + rtlsdr_set_agc_mode(dev, ntohl(cmd.param)); + break; + case 0x09: + printf("set direct sampling %d\n", ntohl(cmd.param)); + rtlsdr_set_direct_sampling(dev, ntohl(cmd.param)); + break; + case 0x0a: + printf("set offset tuning %d\n", ntohl(cmd.param)); + rtlsdr_set_offset_tuning(dev, ntohl(cmd.param)); + break; + case 0x0b: + printf("set rtl xtal %d\n", ntohl(cmd.param)); + rtlsdr_set_xtal_freq(dev, ntohl(cmd.param), 0); + break; + case 0x0c: + printf("set tuner xtal %d\n", ntohl(cmd.param)); + rtlsdr_set_xtal_freq(dev, 0, ntohl(cmd.param)); + break; + case 0x0d: + printf("set tuner gain by index %d\n", ntohl(cmd.param)); + set_gain_by_index(dev, ntohl(cmd.param)); + break; + default: + break; + } + cmd.cmd = 0xff; + } +} + +int main(int argc, char **argv) +{ + int r, opt, i; + char* addr = "127.0.0.1"; + int port = 1234; + uint32_t frequency = 100000000, samp_rate = 2048000; + struct sockaddr_in local, remote; + int device_count; + uint32_t dev_index = 0, buf_num = 0; + int gain = 0; + struct llist *curelem,*prev; + pthread_attr_t attr; + void *status; + struct timeval tv = {1,0}; + struct linger ling = {1,0}; + SOCKET listensocket; + socklen_t rlen; + fd_set readfds; + u_long blockmode = 1; + dongle_info_t dongle_info; +#ifdef _WIN32 + WSADATA wsd; + i = WSAStartup(MAKEWORD(2,2), &wsd); +#else + struct sigaction sigact, sigign; +#endif + + while ((opt = getopt(argc, argv, "a:p:f:g:s:b:d:")) != -1) { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 'f': + frequency = (uint32_t)atof(optarg); + break; + case 'g': + gain = (int)(atof(optarg) * 10); /* tenths of a dB */ + break; + case 's': + samp_rate = (uint32_t)atof(optarg); + break; + case 'a': + addr = optarg; + break; + case 'p': + port = atoi(optarg); + break; + case 'b': + buf_num = atoi(optarg); + break; + default: + usage(); + break; + } + } + + if (argc < optind) + usage(); + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + exit(1); + } + + printf("Found %d device(s).\n", device_count); + + rtlsdr_open(&dev, dev_index); + if (NULL == dev) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + exit(1); + } + + printf("Using %s\n", rtlsdr_get_device_name(dev_index)); +#ifndef _WIN32 + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigign.sa_handler = SIG_IGN; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGPIPE, &sigign, NULL); +#else + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#endif + /* Set the sample rate */ + r = rtlsdr_set_sample_rate(dev, samp_rate); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set sample rate.\n"); + + /* Set the frequency */ + r = rtlsdr_set_center_freq(dev, frequency); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set center freq.\n"); + else + fprintf(stderr, "Tuned to %i Hz.\n", frequency); + + if (0 == gain) { + /* Enable automatic gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 0); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable automatic gain.\n"); + } else { + /* Enable manual gain */ + r = rtlsdr_set_tuner_gain_mode(dev, 1); + if (r < 0) + fprintf(stderr, "WARNING: Failed to enable manual gain.\n"); + + /* Set the tuner gain */ + r = rtlsdr_set_tuner_gain(dev, gain); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set tuner gain.\n"); + else + fprintf(stderr, "Tuner gain set to %f dB.\n", gain/10.0); + } + + /* Reset endpoint before we start reading from it (mandatory) */ + r = rtlsdr_reset_buffer(dev); + if (r < 0) + fprintf(stderr, "WARNING: Failed to reset buffers.\n"); + + pthread_mutex_init(&exit_cond_lock, NULL); + pthread_mutex_init(&ll_mutex, NULL); + pthread_mutex_init(&exit_cond_lock, NULL); + pthread_cond_init(&cond, NULL); + pthread_cond_init(&exit_cond, NULL); + + memset(&local,0,sizeof(local)); + local.sin_family = AF_INET; + local.sin_port = htons(port); + local.sin_addr.s_addr = inet_addr(addr); + + listensocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + r = 1; + setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, (char *)&r, sizeof(int)); + setsockopt(listensocket, SOL_SOCKET, SO_LINGER, (char *)&ling, sizeof(ling)); + bind(listensocket,(struct sockaddr *)&local,sizeof(local)); + + #ifdef _WIN32 + ioctlsocket(listensocket, FIONBIO, &blockmode); + #else + r = fcntl(listensocket, F_GETFL, 0); + r = fcntl(listensocket, F_SETFL, r | O_NONBLOCK); + #endif + + while(1) { + printf("listening...\n"); + printf("Use the device argument 'rtl_tcp=%s:%d' in OsmoSDR " + "(gr-osmosdr) source\n" + "to receive samples in GRC and control " + "rtl_tcp parameters (frequency, gain, ...).\n", + addr, port); + listen(listensocket,1); + + while(1) { + FD_ZERO(&readfds); + FD_SET(listensocket, &readfds); + tv.tv_sec = 1; + tv.tv_usec = 0; + r = select(listensocket+1, &readfds, NULL, NULL, &tv); + if(do_exit) { + goto out; + } else if(r) { + rlen = sizeof(remote); + s = accept(listensocket,(struct sockaddr *)&remote, &rlen); + break; + } + } + + setsockopt(s, SOL_SOCKET, SO_LINGER, (char *)&ling, sizeof(ling)); + + printf("client accepted!\n"); + + memset(&dongle_info, 0, sizeof(dongle_info)); + memcpy(&dongle_info.magic, "RTL0", 4); + + r = rtlsdr_get_tuner_type(dev); + if (r >= 0) + dongle_info.tuner_type = htonl(r); + + r = rtlsdr_get_tuner_gains(dev, NULL); + if (r >= 0) + dongle_info.tuner_gain_count = htonl(r); + + r = send(s, (const char *)&dongle_info, sizeof(dongle_info), 0); + if (sizeof(dongle_info) != r) + printf("failed to send dongle information\n"); + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); + r = pthread_create(&tcp_worker_thread, &attr, tcp_worker, NULL); + r = pthread_create(&command_thread, &attr, command_worker, NULL); + pthread_attr_destroy(&attr); + + r = rtlsdr_read_async(dev, rtlsdr_callback, NULL, buf_num, 0); + + if(!dead[0]) + pthread_join(tcp_worker_thread, &status); + dead[0]=0; + + if(!dead[1]) + pthread_join(command_thread, &status); + dead[1]=0; + + closesocket(s); + + printf("all threads dead..\n"); + curelem = ll_buffers; + ll_buffers = 0; + + while(curelem != 0) { + prev = curelem; + curelem = curelem->next; + free(prev->data); + free(prev); + } + + do_exit = 0; + global_numq = 0; + } + +out: + rtlsdr_close(dev); + closesocket(listensocket); + closesocket(s); + #ifdef _WIN32 + WSACleanup(); + #endif + printf("bye!\n"); + return r >= 0 ? r : -r; +} diff --git a/src/rtl_test.c b/src/rtl_test.c new file mode 100644 index 0000000..fa54628 --- /dev/null +++ b/src/rtl_test.c @@ -0,0 +1,379 @@ +/* + * rtl-sdr, turns your Realtek RTL2832 based DVB dongle into a SDR receiver + * Copyright (C) 2012 by Steve Markgraf <steve@steve-m.de> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <errno.h> +#include <signal.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#ifdef __APPLE__ +#include <sys/time.h> +#else +#include <time.h> +#endif + +#ifndef _WIN32 +#include <unistd.h> +#else +#include <Windows.h> +#include "getopt/getopt.h" +#endif + +#include "rtl-sdr.h" + +#define DEFAULT_SAMPLE_RATE 2048000 +#define DEFAULT_ASYNC_BUF_NUMBER 32 +#define DEFAULT_BUF_LENGTH (16 * 16384) +#define MINIMAL_BUF_LENGTH 512 +#define MAXIMAL_BUF_LENGTH (256 * 16384) + +#define MHZ(x) ((x)*1000*1000) + +#define PPM_DURATION 10 + +static int do_exit = 0; +static rtlsdr_dev_t *dev = NULL; + +static int ppm_benchmark = 0; +static int64_t ppm_count = 0L; +static int64_t ppm_total = 0L; + +#ifndef _WIN32 +static struct timespec ppm_start; +static struct timespec ppm_recent; +static struct timespec ppm_now; +#endif + +#ifdef __APPLE__ +static struct timeval tv; +#endif + +void usage(void) +{ + fprintf(stderr, + "rtl_test, a benchmark tool for RTL2832 based DVB-T receivers\n\n" + "Usage:\n" + "\t[-s samplerate (default: 2048000 Hz)]\n" + "\t[-d device_index (default: 0)]\n" + "\t[-t enable Elonics E4000 tuner benchmark]\n" + #ifndef _WIN32 + "\t[-p enable PPM error measurement]\n" + #endif + "\t[-b output_block_size (default: 16 * 16384)]\n" + "\t[-S force sync output (default: async)]\n"); + exit(1); +} + +#ifdef _WIN32 +BOOL WINAPI +sighandler(int signum) +{ + if (CTRL_C_EVENT == signum) { + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); + return TRUE; + } + return FALSE; +} +#else +static void sighandler(int signum) +{ + fprintf(stderr, "Signal caught, exiting!\n"); + do_exit = 1; + rtlsdr_cancel_async(dev); +} +#endif + +uint8_t bcnt, uninit = 1; + +static void rtlsdr_callback(unsigned char *buf, uint32_t len, void *ctx) +{ + uint32_t i, lost = 0; + int64_t ns; + + if (uninit) { + bcnt = buf[0]; + uninit = 0; + } + + for (i = 0; i < len; i++) { + if(bcnt != buf[i]) { + lost += (buf[i] > bcnt) ? (buf[i] - bcnt) : (bcnt - buf[i]); + bcnt = buf[i]; + } + + bcnt++; + } + + if (lost) + printf("lost at least %d bytes\n", lost); + + if (!ppm_benchmark) { + return; + } + ppm_count += (int64_t)len; +#ifndef _WIN32 + #ifndef __APPLE__ + clock_gettime(CLOCK_REALTIME, &ppm_now); + #else + gettimeofday(&tv, NULL); + ppm_now.tv_sec = tv.tv_sec; + ppm_now.tv_nsec = tv.tv_usec*1000; + #endif + if (ppm_now.tv_sec - ppm_recent.tv_sec > PPM_DURATION) { + ns = 1000000000L * (int64_t)(ppm_now.tv_sec - ppm_recent.tv_sec); + ns += (int64_t)(ppm_now.tv_nsec - ppm_recent.tv_nsec); + printf("real sample rate: %i\n", + (int)((1000000000L * ppm_count / 2L) / ns)); + #ifndef __APPLE__ + clock_gettime(CLOCK_REALTIME, &ppm_recent); + #else + gettimeofday(&tv, NULL); + ppm_recent.tv_sec = tv.tv_sec; + ppm_recent.tv_nsec = tv.tv_usec*1000; + #endif + ppm_total += ppm_count / 2L; + ppm_count = 0L; + } +#endif +} + +void e4k_benchmark(void) +{ + uint32_t freq, gap_start = 0, gap_end = 0; + uint32_t range_start = 0, range_end = 0; + + fprintf(stderr, "Benchmarking E4000 PLL...\n"); + + /* find tuner range start */ + for (freq = MHZ(70); freq > MHZ(1); freq -= MHZ(1)) { + if (rtlsdr_set_center_freq(dev, freq) < 0) { + range_start = freq; + break; + } + } + + /* find tuner range end */ + for (freq = MHZ(2000); freq < MHZ(2300UL); freq += MHZ(1)) { + if (rtlsdr_set_center_freq(dev, freq) < 0) { + range_end = freq; + break; + } + } + + /* find start of L-band gap */ + for (freq = MHZ(1000); freq < MHZ(1300); freq += MHZ(1)) { + if (rtlsdr_set_center_freq(dev, freq) < 0) { + gap_start = freq; + break; + } + } + + /* find end of L-band gap */ + for (freq = MHZ(1300); freq > MHZ(1000); freq -= MHZ(1)) { + if (rtlsdr_set_center_freq(dev, freq) < 0) { + gap_end = freq; + break; + } + } + + fprintf(stderr, "E4K range: %i to %i MHz\n", + range_start/MHZ(1) + 1, range_end/MHZ(1) - 1); + + fprintf(stderr, "E4K L-band gap: %i to %i MHz\n", + gap_start/MHZ(1), gap_end/MHZ(1)); +} + +int main(int argc, char **argv) +{ +#ifndef _WIN32 + struct sigaction sigact; +#endif + int n_read; + int r, opt; + int i, tuner_benchmark = 0; + int sync_mode = 0; + uint8_t *buffer; + uint32_t dev_index = 0; + uint32_t samp_rate = DEFAULT_SAMPLE_RATE; + uint32_t out_block_size = DEFAULT_BUF_LENGTH; + int device_count; + int count; + int gains[100]; + int real_rate; + int64_t ns; + + while ((opt = getopt(argc, argv, "d:s:b:tpS::")) != -1) { + switch (opt) { + case 'd': + dev_index = atoi(optarg); + break; + case 's': + samp_rate = (uint32_t)atof(optarg); + break; + case 'b': + out_block_size = (uint32_t)atof(optarg); + break; + case 't': + tuner_benchmark = 1; + break; + case 'p': + ppm_benchmark = PPM_DURATION; + break; + case 'S': + sync_mode = 1; + break; + default: + usage(); + break; + } + } + + if(out_block_size < MINIMAL_BUF_LENGTH || + out_block_size > MAXIMAL_BUF_LENGTH ){ + fprintf(stderr, + "Output block size wrong value, falling back to default\n"); + fprintf(stderr, + "Minimal length: %u\n", MINIMAL_BUF_LENGTH); + fprintf(stderr, + "Maximal length: %u\n", MAXIMAL_BUF_LENGTH); + out_block_size = DEFAULT_BUF_LENGTH; + } + + buffer = malloc(out_block_size * sizeof(uint8_t)); + + device_count = rtlsdr_get_device_count(); + if (!device_count) { + fprintf(stderr, "No supported devices found.\n"); + exit(1); + } + + fprintf(stderr, "Found %d device(s):\n", device_count); + for (i = 0; i < device_count; i++) + fprintf(stderr, " %d: %s\n", i, rtlsdr_get_device_name(i)); + fprintf(stderr, "\n"); + + fprintf(stderr, "Using device %d: %s\n", + dev_index, + rtlsdr_get_device_name(dev_index)); + + r = rtlsdr_open(&dev, dev_index); + if (r < 0) { + fprintf(stderr, "Failed to open rtlsdr device #%d.\n", dev_index); + exit(1); + } +#ifndef _WIN32 + sigact.sa_handler = sighandler; + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigaction(SIGINT, &sigact, NULL); + sigaction(SIGTERM, &sigact, NULL); + sigaction(SIGQUIT, &sigact, NULL); + sigaction(SIGPIPE, &sigact, NULL); +#else + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#endif + count = rtlsdr_get_tuner_gains(dev, NULL); + fprintf(stderr, "Supported gain values (%d): ", count); + + count = rtlsdr_get_tuner_gains(dev, gains); + for (i = 0; i < count; i++) + fprintf(stderr, "%.1f ", gains[i] / 10.0); + fprintf(stderr, "\n"); + + /* Set the sample rate */ + r = rtlsdr_set_sample_rate(dev, samp_rate); + if (r < 0) + fprintf(stderr, "WARNING: Failed to set sample rate.\n"); + + if (tuner_benchmark) { + if (rtlsdr_get_tuner_type(dev) == RTLSDR_TUNER_E4000) + e4k_benchmark(); + else + fprintf(stderr, "No E4000 tuner found, aborting.\n"); + + goto exit; + } + + /* Enable test mode */ + r = rtlsdr_set_testmode(dev, 1); + + /* Reset endpoint before we start reading from it (mandatory) */ + r = rtlsdr_reset_buffer(dev); + if (r < 0) + fprintf(stderr, "WARNING: Failed to reset buffers.\n"); + + if (ppm_benchmark && !sync_mode) { + fprintf(stderr, "Reporting PPM error measurement every %i seconds...\n", ppm_benchmark); + fprintf(stderr, "Press ^C after a few minutes.\n"); +#ifdef __APPLE__ + gettimeofday(&tv, NULL); + ppm_recent.tv_sec = tv.tv_sec; + ppm_recent.tv_nsec = tv.tv_usec*1000; + ppm_start.tv_sec = tv.tv_sec; + ppm_start.tv_nsec = tv.tv_usec*1000; +#elif __unix__ + clock_gettime(CLOCK_REALTIME, &ppm_recent); + clock_gettime(CLOCK_REALTIME, &ppm_start); +#endif + } + + if (sync_mode) { + fprintf(stderr, "Reading samples in sync mode...\n"); + while (!do_exit) { + r = rtlsdr_read_sync(dev, buffer, out_block_size, &n_read); + if (r < 0) { + fprintf(stderr, "WARNING: sync read failed.\n"); + break; + } + + if ((uint32_t)n_read < out_block_size) { + fprintf(stderr, "Short read, samples lost, exiting!\n"); + break; + } + } + } else { + fprintf(stderr, "Reading samples in async mode...\n"); + r = rtlsdr_read_async(dev, rtlsdr_callback, NULL, + DEFAULT_ASYNC_BUF_NUMBER, out_block_size); + } + + if (do_exit) { + fprintf(stderr, "\nUser cancel, exiting...\n"); + if (ppm_benchmark) { +#ifndef _WIN32 + ns = 1000000000L * (int64_t)(ppm_recent.tv_sec - ppm_start.tv_sec); + ns += (int64_t)(ppm_recent.tv_nsec - ppm_start.tv_nsec); + real_rate = (int)(ppm_total * 1000000000L / ns); + printf("Cumulative PPM error: %i\n", + (int)round((double)(1000000 * (real_rate - (int)samp_rate)) / (double)samp_rate)); +#endif + } + } + else + fprintf(stderr, "\nLibrary error %d, exiting...\n", r); + +exit: + rtlsdr_close(dev); + free (buffer); + + return r >= 0 ? r : -r; +} diff --git a/src/tuner_e4k.c b/src/tuner_e4k.c new file mode 100644 index 0000000..0232f88 --- /dev/null +++ b/src/tuner_e4k.c @@ -0,0 +1,978 @@ +/* + * Elonics E4000 tuner driver + * + * (C) 2011-2012 by Harald Welte <laforge@gnumonks.org> + * (C) 2012 by Sylvain Munaut <tnt@246tNt.com> + * (C) 2012 by Hoernchen <la@tfc-server.de> + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <limits.h> +#include <stdint.h> +#include <errno.h> +#include <string.h> +#include <stdio.h> + +#include <reg_field.h> +#include <tuner_e4k.h> + +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + +/* If this is defined, the limits are somewhat relaxed compared to what the + * vendor claims is possible */ +#define OUT_OF_SPEC + +#define MHZ(x) ((x)*1000*1000) +#define KHZ(x) ((x)*1000) + +uint32_t unsigned_delta(uint32_t a, uint32_t b) +{ + if (a > b) + return a - b; + else + return b - a; +} + +/* look-up table bit-width -> mask */ +static const uint8_t width2mask[] = { + 0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff +}; + +/*********************************************************************** + * Register Access */ + +#if 0 +/*! \brief Write a register of the tuner chip + * \param[in] e4k reference to the tuner + * \param[in] reg number of the register + * \param[in] val value to be written + * \returns 0 on success, negative in case of error + */ +int e4k_reg_write(struct e4k_state *e4k, uint8_t reg, uint8_t val) +{ + /* FIXME */ + return 0; +} + +/*! \brief Read a register of the tuner chip + * \param[in] e4k reference to the tuner + * \param[in] reg number of the register + * \returns positive 8bit register contents on success, negative in case of error + */ +int e4k_reg_read(struct e4k_state *e4k, uint8_t reg) +{ + /* FIXME */ + return 0; +} +#endif + +/*! \brief Set or clear some (masked) bits inside a register + * \param[in] e4k reference to the tuner + * \param[in] reg number of the register + * \param[in] mask bit-mask of the value + * \param[in] val data value to be written to register + * \returns 0 on success, negative in case of error + */ +static int e4k_reg_set_mask(struct e4k_state *e4k, uint8_t reg, + uint8_t mask, uint8_t val) +{ + uint8_t tmp = e4k_reg_read(e4k, reg); + + if ((tmp & mask) == val) + return 0; + + return e4k_reg_write(e4k, reg, (tmp & ~mask) | (val & mask)); +} + +/*! \brief Write a given field inside a register + * \param[in] e4k reference to the tuner + * \param[in] field structure describing the field + * \param[in] val value to be written + * \returns 0 on success, negative in case of error + */ +static int e4k_field_write(struct e4k_state *e4k, const struct reg_field *field, uint8_t val) +{ + int rc; + uint8_t mask; + + rc = e4k_reg_read(e4k, field->reg); + if (rc < 0) + return rc; + + mask = width2mask[field->width] << field->shift; + + return e4k_reg_set_mask(e4k, field->reg, mask, val << field->shift); +} + +/*! \brief Read a given field inside a register + * \param[in] e4k reference to the tuner + * \param[in] field structure describing the field + * \returns positive value of the field, negative in case of error + */ +static int e4k_field_read(struct e4k_state *e4k, const struct reg_field *field) +{ + int rc; + + rc = e4k_reg_read(e4k, field->reg); + if (rc < 0) + return rc; + + rc = (rc >> field->shift) & width2mask[field->width]; + + return rc; +} + +/*********************************************************************** + * Filter Control */ + +static const uint32_t rf_filt_center_uhf[] = { + MHZ(360), MHZ(380), MHZ(405), MHZ(425), + MHZ(450), MHZ(475), MHZ(505), MHZ(540), + MHZ(575), MHZ(615), MHZ(670), MHZ(720), + MHZ(760), MHZ(840), MHZ(890), MHZ(970) +}; + +static const uint32_t rf_filt_center_l[] = { + MHZ(1300), MHZ(1320), MHZ(1360), MHZ(1410), + MHZ(1445), MHZ(1460), MHZ(1490), MHZ(1530), + MHZ(1560), MHZ(1590), MHZ(1640), MHZ(1660), + MHZ(1680), MHZ(1700), MHZ(1720), MHZ(1750) +}; + +static int closest_arr_idx(const uint32_t *arr, unsigned int arr_size, uint32_t freq) +{ + unsigned int i, bi = 0; + uint32_t best_delta = 0xffffffff; + + /* iterate over the array containing a list of the center + * frequencies, selecting the closest one */ + for (i = 0; i < arr_size; i++) { + uint32_t delta = unsigned_delta(freq, arr[i]); + if (delta < best_delta) { + best_delta = delta; + bi = i; + } + } + + return bi; +} + +/* return 4-bit index as to which RF filter to select */ +static int choose_rf_filter(enum e4k_band band, uint32_t freq) +{ + int rc; + + switch (band) { + case E4K_BAND_VHF2: + case E4K_BAND_VHF3: + rc = 0; + break; + case E4K_BAND_UHF: + rc = closest_arr_idx(rf_filt_center_uhf, + ARRAY_SIZE(rf_filt_center_uhf), + freq); + break; + case E4K_BAND_L: + rc = closest_arr_idx(rf_filt_center_l, + ARRAY_SIZE(rf_filt_center_l), + freq); + break; + default: + rc = -EINVAL; + break; + } + + return rc; +} + +/* \brief Automatically select apropriate RF filter based on e4k state */ +int e4k_rf_filter_set(struct e4k_state *e4k) +{ + int rc; + + rc = choose_rf_filter(e4k->band, e4k->vco.flo); + if (rc < 0) + return rc; + + return e4k_reg_set_mask(e4k, E4K_REG_FILT1, 0xF, rc); +} + +/* Mixer Filter */ +static const uint32_t mix_filter_bw[] = { + KHZ(27000), KHZ(27000), KHZ(27000), KHZ(27000), + KHZ(27000), KHZ(27000), KHZ(27000), KHZ(27000), + KHZ(4600), KHZ(4200), KHZ(3800), KHZ(3400), + KHZ(3300), KHZ(2700), KHZ(2300), KHZ(1900) +}; + +/* IF RC Filter */ +static const uint32_t ifrc_filter_bw[] = { + KHZ(21400), KHZ(21000), KHZ(17600), KHZ(14700), + KHZ(12400), KHZ(10600), KHZ(9000), KHZ(7700), + KHZ(6400), KHZ(5300), KHZ(4400), KHZ(3400), + KHZ(2600), KHZ(1800), KHZ(1200), KHZ(1000) +}; + +/* IF Channel Filter */ +static const uint32_t ifch_filter_bw[] = { + KHZ(5500), KHZ(5300), KHZ(5000), KHZ(4800), + KHZ(4600), KHZ(4400), KHZ(4300), KHZ(4100), + KHZ(3900), KHZ(3800), KHZ(3700), KHZ(3600), + KHZ(3400), KHZ(3300), KHZ(3200), KHZ(3100), + KHZ(3000), KHZ(2950), KHZ(2900), KHZ(2800), + KHZ(2750), KHZ(2700), KHZ(2600), KHZ(2550), + KHZ(2500), KHZ(2450), KHZ(2400), KHZ(2300), + KHZ(2280), KHZ(2240), KHZ(2200), KHZ(2150) +}; + +static const uint32_t *if_filter_bw[] = { + mix_filter_bw, + ifch_filter_bw, + ifrc_filter_bw, +}; + +static const uint32_t if_filter_bw_len[] = { + ARRAY_SIZE(mix_filter_bw), + ARRAY_SIZE(ifch_filter_bw), + ARRAY_SIZE(ifrc_filter_bw), +}; + +static const struct reg_field if_filter_fields[] = { + { + E4K_REG_FILT2, 4, 4, + }, + { + E4K_REG_FILT3, 0, 5, + }, + { + E4K_REG_FILT2, 0, 4, + } +}; + +static int find_if_bw(enum e4k_if_filter filter, uint32_t bw) +{ + if (filter >= ARRAY_SIZE(if_filter_bw)) + return -EINVAL; + + return closest_arr_idx(if_filter_bw[filter], + if_filter_bw_len[filter], bw); +} + +/*! \brief Set the filter band-width of any of the IF filters + * \param[in] e4k reference to the tuner chip + * \param[in] filter filter to be configured + * \param[in] bandwidth bandwidth to be configured + * \returns positive actual filter band-width, negative in case of error + */ +int e4k_if_filter_bw_set(struct e4k_state *e4k, enum e4k_if_filter filter, + uint32_t bandwidth) +{ + int bw_idx; + const struct reg_field *field; + + if (filter >= ARRAY_SIZE(if_filter_bw)) + return -EINVAL; + + bw_idx = find_if_bw(filter, bandwidth); + + field = &if_filter_fields[filter]; + + return e4k_field_write(e4k, field, bw_idx); +} + +/*! \brief Enables / Disables the channel filter + * \param[in] e4k reference to the tuner chip + * \param[in] on 1=filter enabled, 0=filter disabled + * \returns 0 success, negative errors + */ +int e4k_if_filter_chan_enable(struct e4k_state *e4k, int on) +{ + return e4k_reg_set_mask(e4k, E4K_REG_FILT3, E4K_FILT3_DISABLE, + on ? 0 : E4K_FILT3_DISABLE); +} + +int e4k_if_filter_bw_get(struct e4k_state *e4k, enum e4k_if_filter filter) +{ + const uint32_t *arr; + int rc; + const struct reg_field *field; + + if (filter >= ARRAY_SIZE(if_filter_bw)) + return -EINVAL; + + field = &if_filter_fields[filter]; + + rc = e4k_field_read(e4k, field); + if (rc < 0) + return rc; + + arr = if_filter_bw[filter]; + + return arr[rc]; +} + + +/*********************************************************************** + * Frequency Control */ + +#define E4K_FVCO_MIN_KHZ 2600000 /* 2.6 GHz */ +#define E4K_FVCO_MAX_KHZ 3900000 /* 3.9 GHz */ +#define E4K_PLL_Y 65536 + +#ifdef OUT_OF_SPEC +#define E4K_FLO_MIN_MHZ 50 +#define E4K_FLO_MAX_MHZ 2200UL +#else +#define E4K_FLO_MIN_MHZ 64 +#define E4K_FLO_MAX_MHZ 1700 +#endif + +struct pll_settings { + uint32_t freq; + uint8_t reg_synth7; + uint8_t mult; +}; + +static const struct pll_settings pll_vars[] = { + {KHZ(72400), (1 << 3) | 7, 48}, + {KHZ(81200), (1 << 3) | 6, 40}, + {KHZ(108300), (1 << 3) | 5, 32}, + {KHZ(162500), (1 << 3) | 4, 24}, + {KHZ(216600), (1 << 3) | 3, 16}, + {KHZ(325000), (1 << 3) | 2, 12}, + {KHZ(350000), (1 << 3) | 1, 8}, + {KHZ(432000), (0 << 3) | 3, 8}, + {KHZ(667000), (0 << 3) | 2, 6}, + {KHZ(1200000), (0 << 3) | 1, 4} +}; + +static int is_fvco_valid(uint32_t fvco_z) +{ + /* check if the resulting fosc is valid */ + if (fvco_z/1000 < E4K_FVCO_MIN_KHZ || + fvco_z/1000 > E4K_FVCO_MAX_KHZ) { + fprintf(stderr, "[E4K] Fvco %u invalid\n", fvco_z); + return 0; + } + + return 1; +} + +static int is_fosc_valid(uint32_t fosc) +{ + if (fosc < MHZ(16) || fosc > MHZ(30)) { + fprintf(stderr, "[E4K] Fosc %u invalid\n", fosc); + return 0; + } + + return 1; +} + +static int is_z_valid(uint32_t z) +{ + if (z > 255) { + fprintf(stderr, "[E4K] Z %u invalid\n", z); + return 0; + } + + return 1; +} + +/*! \brief Determine if 3-phase mixing shall be used or not */ +static int use_3ph_mixing(uint32_t flo) +{ + /* this is a magic number somewhre between VHF and UHF */ + if (flo < MHZ(350)) + return 1; + + return 0; +} + +/* \brief compute Fvco based on Fosc, Z and X + * \returns positive value (Fvco in Hz), 0 in case of error */ +static uint64_t compute_fvco(uint32_t f_osc, uint8_t z, uint16_t x) +{ + uint64_t fvco_z, fvco_x, fvco; + + /* We use the following transformation in order to + * handle the fractional part with integer arithmetic: + * Fvco = Fosc * (Z + X/Y) <=> Fvco = Fosc * Z + (Fosc * X)/Y + * This avoids X/Y = 0. However, then we would overflow a 32bit + * integer, as we cannot hold e.g. 26 MHz * 65536 either. + */ + fvco_z = (uint64_t)f_osc * z; + +#if 0 + if (!is_fvco_valid(fvco_z)) + return 0; +#endif + + fvco_x = ((uint64_t)f_osc * x) / E4K_PLL_Y; + + fvco = fvco_z + fvco_x; + + return fvco; +} + +static uint32_t compute_flo(uint32_t f_osc, uint8_t z, uint16_t x, uint8_t r) +{ + uint64_t fvco = compute_fvco(f_osc, z, x); + if (fvco == 0) + return -EINVAL; + + return fvco / r; +} + +static int e4k_band_set(struct e4k_state *e4k, enum e4k_band band) +{ + int rc; + + switch (band) { + case E4K_BAND_VHF2: + case E4K_BAND_VHF3: + case E4K_BAND_UHF: + e4k_reg_write(e4k, E4K_REG_BIAS, 3); + break; + case E4K_BAND_L: + e4k_reg_write(e4k, E4K_REG_BIAS, 0); + break; + } + + /* workaround: if we don't reset this register before writing to it, + * we get a gap between 325-350 MHz */ + rc = e4k_reg_set_mask(e4k, E4K_REG_SYNTH1, 0x06, 0); + rc = e4k_reg_set_mask(e4k, E4K_REG_SYNTH1, 0x06, band << 1); + if (rc >= 0) + e4k->band = band; + + return rc; +} + +/*! \brief Compute PLL parameters for givent target frequency + * \param[out] oscp Oscillator parameters, if computation successful + * \param[in] fosc Clock input frequency applied to the chip (Hz) + * \param[in] intended_flo target tuning frequency (Hz) + * \returns actual PLL frequency, as close as possible to intended_flo, + * 0 in case of error + */ +uint32_t e4k_compute_pll_params(struct e4k_pll_params *oscp, uint32_t fosc, uint32_t intended_flo) +{ + uint32_t i; + uint8_t r = 2; + uint64_t intended_fvco, remainder; + uint64_t z = 0; + uint32_t x; + int flo; + int three_phase_mixing = 0; + oscp->r_idx = 0; + + if (!is_fosc_valid(fosc)) + return 0; + + for(i = 0; i < ARRAY_SIZE(pll_vars); ++i) { + if(intended_flo < pll_vars[i].freq) { + three_phase_mixing = (pll_vars[i].reg_synth7 & 0x08) ? 1 : 0; + oscp->r_idx = pll_vars[i].reg_synth7; + r = pll_vars[i].mult; + break; + } + } + + //fprintf(stderr, "[E4K] Fint=%u, R=%u\n", intended_flo, r); + + /* flo(max) = 1700MHz, R(max) = 48, we need 64bit! */ + intended_fvco = (uint64_t)intended_flo * r; + + /* compute integral component of multiplier */ + z = intended_fvco / fosc; + + /* compute fractional part. this will not overflow, + * as fosc(max) = 30MHz and z(max) = 255 */ + remainder = intended_fvco - (fosc * z); + /* remainder(max) = 30MHz, E4K_PLL_Y = 65536 -> 64bit! */ + x = (remainder * E4K_PLL_Y) / fosc; + /* x(max) as result of this computation is 65536 */ + + flo = compute_flo(fosc, z, x, r); + + oscp->fosc = fosc; + oscp->flo = flo; + oscp->intended_flo = intended_flo; + oscp->r = r; +// oscp->r_idx = pll_vars[i].reg_synth7 & 0x0; + oscp->threephase = three_phase_mixing; + oscp->x = x; + oscp->z = z; + + return flo; +} + +int e4k_tune_params(struct e4k_state *e4k, struct e4k_pll_params *p) +{ + uint8_t val; + + /* program R + 3phase/2phase */ + e4k_reg_write(e4k, E4K_REG_SYNTH7, p->r_idx); + /* program Z */ + e4k_reg_write(e4k, E4K_REG_SYNTH3, p->z); + /* program X */ + e4k_reg_write(e4k, E4K_REG_SYNTH4, p->x & 0xff); + e4k_reg_write(e4k, E4K_REG_SYNTH5, p->x >> 8); + + /* we're in auto calibration mode, so there's no need to trigger it */ + + memcpy(&e4k->vco, p, sizeof(e4k->vco)); + + /* set the band */ + if (e4k->vco.flo < MHZ(140)) + e4k_band_set(e4k, E4K_BAND_VHF2); + else if (e4k->vco.flo < MHZ(350)) + e4k_band_set(e4k, E4K_BAND_VHF3); + else if (e4k->vco.flo < MHZ(1135)) + e4k_band_set(e4k, E4K_BAND_UHF); + else + e4k_band_set(e4k, E4K_BAND_L); + + /* select and set proper RF filter */ + e4k_rf_filter_set(e4k); + + return e4k->vco.flo; +} + +/*! \brief High-level tuning API, just specify frquency + * + * This function will compute matching PLL parameters, program them into the + * hardware and set the band as well as RF filter. + * + * \param[in] e4k reference to tuner + * \param[in] freq frequency in Hz + * \returns actual tuned frequency, negative in case of error + */ +int e4k_tune_freq(struct e4k_state *e4k, uint32_t freq) +{ + uint32_t rc; + struct e4k_pll_params p; + + /* determine PLL parameters */ + rc = e4k_compute_pll_params(&p, e4k->vco.fosc, freq); + if (!rc) + return -EINVAL; + + /* actually tune to those parameters */ + rc = e4k_tune_params(e4k, &p); + + /* check PLL lock */ + rc = e4k_reg_read(e4k, E4K_REG_SYNTH1); + if (!(rc & 0x01)) { + fprintf(stderr, "[E4K] PLL not locked for %u Hz!\n", freq); + return -1; + } + + return 0; +} + +/*********************************************************************** + * Gain Control */ + +static const int8_t if_stage1_gain[] = { + -3, 6 +}; + +static const int8_t if_stage23_gain[] = { + 0, 3, 6, 9 +}; + +static const int8_t if_stage4_gain[] = { + 0, 1, 2, 2 +}; + +static const int8_t if_stage56_gain[] = { + 3, 6, 9, 12, 15, 15, 15, 15 +}; + +static const int8_t *if_stage_gain[] = { + 0, + if_stage1_gain, + if_stage23_gain, + if_stage23_gain, + if_stage4_gain, + if_stage56_gain, + if_stage56_gain +}; + +static const uint8_t if_stage_gain_len[] = { + 0, + ARRAY_SIZE(if_stage1_gain), + ARRAY_SIZE(if_stage23_gain), + ARRAY_SIZE(if_stage23_gain), + ARRAY_SIZE(if_stage4_gain), + ARRAY_SIZE(if_stage56_gain), + ARRAY_SIZE(if_stage56_gain) +}; + +static const struct reg_field if_stage_gain_regs[] = { + { 0, 0, 0 }, + { E4K_REG_GAIN3, 0, 1 }, + { E4K_REG_GAIN3, 1, 2 }, + { E4K_REG_GAIN3, 3, 2 }, + { E4K_REG_GAIN3, 5, 2 }, + { E4K_REG_GAIN4, 0, 3 }, + { E4K_REG_GAIN4, 3, 3 } +}; + +static const int32_t lnagain[] = { + -50, 0, + -25, 1, + 0, 4, + 25, 5, + 50, 6, + 75, 7, + 100, 8, + 125, 9, + 150, 10, + 175, 11, + 200, 12, + 250, 13, + 300, 14, +}; + +static const int32_t enhgain[] = { + 10, 30, 50, 70 +}; + +int e4k_set_lna_gain(struct e4k_state *e4k, int32_t gain) +{ + uint32_t i; + for(i = 0; i < ARRAY_SIZE(lnagain)/2; ++i) { + if(lnagain[i*2] == gain) { + e4k_reg_set_mask(e4k, E4K_REG_GAIN1, 0xf, lnagain[i*2+1]); + return gain; + } + } + return -EINVAL; +} + +int e4k_set_enh_gain(struct e4k_state *e4k, int32_t gain) +{ + uint32_t i; + for(i = 0; i < ARRAY_SIZE(enhgain); ++i) { + if(enhgain[i] == gain) { + e4k_reg_set_mask(e4k, E4K_REG_AGC11, 0x7, E4K_AGC11_LNA_GAIN_ENH | (i << 1)); + return gain; + } + } + e4k_reg_set_mask(e4k, E4K_REG_AGC11, 0x7, 0); + + /* special case: 0 = off*/ + if(0 == gain) + return 0; + else + return -EINVAL; +} + +int e4k_enable_manual_gain(struct e4k_state *e4k, uint8_t manual) +{ + if (manual) { + /* Set LNA mode to manual */ + e4k_reg_set_mask(e4k, E4K_REG_AGC1, E4K_AGC1_MOD_MASK, E4K_AGC_MOD_SERIAL); + + /* Set Mixer Gain Control to manual */ + e4k_reg_set_mask(e4k, E4K_REG_AGC7, E4K_AGC7_MIX_GAIN_AUTO, 0); + } else { + /* Set LNA mode to auto */ + e4k_reg_set_mask(e4k, E4K_REG_AGC1, E4K_AGC1_MOD_MASK, E4K_AGC_MOD_IF_SERIAL_LNA_AUTON); + /* Set Mixer Gain Control to auto */ + e4k_reg_set_mask(e4k, E4K_REG_AGC7, E4K_AGC7_MIX_GAIN_AUTO, 1); + + e4k_reg_set_mask(e4k, E4K_REG_AGC11, 0x7, 0); + } + + return 0; +} + +static int find_stage_gain(uint8_t stage, int8_t val) +{ + const int8_t *arr; + int i; + + if (stage >= ARRAY_SIZE(if_stage_gain)) + return -EINVAL; + + arr = if_stage_gain[stage]; + + for (i = 0; i < if_stage_gain_len[stage]; i++) { + if (arr[i] == val) + return i; + } + return -EINVAL; +} + +/*! \brief Set the gain of one of the IF gain stages + * \param [e4k] handle to the tuner chip + * \param [stage] number of the stage (1..6) + * \param [value] gain value in dB + * \returns 0 on success, negative in case of error + */ +int e4k_if_gain_set(struct e4k_state *e4k, uint8_t stage, int8_t value) +{ + int rc; + uint8_t mask; + const struct reg_field *field; + + rc = find_stage_gain(stage, value); + if (rc < 0) + return rc; + + /* compute the bit-mask for the given gain field */ + field = &if_stage_gain_regs[stage]; + mask = width2mask[field->width] << field->shift; + + return e4k_reg_set_mask(e4k, field->reg, mask, rc << field->shift); +} + +int e4k_mixer_gain_set(struct e4k_state *e4k, int8_t value) +{ + uint8_t bit; + + switch (value) { + case 4: + bit = 0; + break; + case 12: + bit = 1; + break; + default: + return -EINVAL; + } + + return e4k_reg_set_mask(e4k, E4K_REG_GAIN2, 1, bit); +} + +int e4k_commonmode_set(struct e4k_state *e4k, int8_t value) +{ + if(value < 0) + return -EINVAL; + else if(value > 7) + return -EINVAL; + + return e4k_reg_set_mask(e4k, E4K_REG_DC7, 7, value); +} + +/*********************************************************************** + * DC Offset */ + +int e4k_manual_dc_offset(struct e4k_state *e4k, int8_t iofs, int8_t irange, int8_t qofs, int8_t qrange) +{ + int res; + + if((iofs < 0x00) || (iofs > 0x3f)) + return -EINVAL; + if((irange < 0x00) || (irange > 0x03)) + return -EINVAL; + if((qofs < 0x00) || (qofs > 0x3f)) + return -EINVAL; + if((qrange < 0x00) || (qrange > 0x03)) + return -EINVAL; + + res = e4k_reg_set_mask(e4k, E4K_REG_DC2, 0x3f, iofs); + if(res < 0) + return res; + + res = e4k_reg_set_mask(e4k, E4K_REG_DC3, 0x3f, qofs); + if(res < 0) + return res; + + res = e4k_reg_set_mask(e4k, E4K_REG_DC4, 0x33, (qrange << 4) | irange); + return res; +} + +/*! \brief Perform a DC offset calibration right now + * \param [e4k] handle to the tuner chip + */ +int e4k_dc_offset_calibrate(struct e4k_state *e4k) +{ + /* make sure the DC range detector is enabled */ + e4k_reg_set_mask(e4k, E4K_REG_DC5, E4K_DC5_RANGE_DET_EN, E4K_DC5_RANGE_DET_EN); + + return e4k_reg_write(e4k, E4K_REG_DC1, 0x01); +} + + +static const int8_t if_gains_max[] = { + 0, 6, 9, 9, 2, 15, 15 +}; + +struct gain_comb { + int8_t mixer_gain; + int8_t if1_gain; + uint8_t reg; +}; + +static const struct gain_comb dc_gain_comb[] = { + { 4, -3, 0x50 }, + { 4, 6, 0x51 }, + { 12, -3, 0x52 }, + { 12, 6, 0x53 }, +}; + +#define TO_LUT(offset, range) (offset | (range << 6)) + +int e4k_dc_offset_gen_table(struct e4k_state *e4k) +{ + uint32_t i; + + /* FIXME: read ont current gain values and write them back + * before returning to the caller */ + + /* disable auto mixer gain */ + e4k_reg_set_mask(e4k, E4K_REG_AGC7, E4K_AGC7_MIX_GAIN_AUTO, 0); + + /* set LNA/IF gain to full manual */ + e4k_reg_set_mask(e4k, E4K_REG_AGC1, E4K_AGC1_MOD_MASK, + E4K_AGC_MOD_SERIAL); + + /* set all 'other' gains to maximum */ + for (i = 2; i <= 6; i++) + e4k_if_gain_set(e4k, i, if_gains_max[i]); + + /* iterate over all mixer + if_stage_1 gain combinations */ + for (i = 0; i < ARRAY_SIZE(dc_gain_comb); i++) { + uint8_t offs_i, offs_q, range, range_i, range_q; + + /* set the combination of mixer / if1 gain */ + e4k_mixer_gain_set(e4k, dc_gain_comb[i].mixer_gain); + e4k_if_gain_set(e4k, 1, dc_gain_comb[i].if1_gain); + + /* perform actual calibration */ + e4k_dc_offset_calibrate(e4k); + + /* extract I/Q offset and range values */ + offs_i = e4k_reg_read(e4k, E4K_REG_DC2) & 0x3f; + offs_q = e4k_reg_read(e4k, E4K_REG_DC3) & 0x3f; + range = e4k_reg_read(e4k, E4K_REG_DC4); + range_i = range & 0x3; + range_q = (range >> 4) & 0x3; + + fprintf(stderr, "[E4K] Table %u I=%u/%u, Q=%u/%u\n", + i, range_i, offs_i, range_q, offs_q); + + /* write into the table */ + e4k_reg_write(e4k, dc_gain_comb[i].reg, + TO_LUT(offs_q, range_q)); + e4k_reg_write(e4k, dc_gain_comb[i].reg + 0x10, + TO_LUT(offs_i, range_i)); + } + + return 0; +} + +/*********************************************************************** + * Initialization */ + +static int magic_init(struct e4k_state *e4k) +{ + e4k_reg_write(e4k, 0x7e, 0x01); + e4k_reg_write(e4k, 0x7f, 0xfe); + e4k_reg_write(e4k, 0x82, 0x00); + e4k_reg_write(e4k, 0x86, 0x50); /* polarity A */ + e4k_reg_write(e4k, 0x87, 0x20); + e4k_reg_write(e4k, 0x88, 0x01); + e4k_reg_write(e4k, 0x9f, 0x7f); + e4k_reg_write(e4k, 0xa0, 0x07); + + return 0; +} + +/*! \brief Initialize the E4K tuner + */ +int e4k_init(struct e4k_state *e4k) +{ + /* make a dummy i2c read or write command, will not be ACKed! */ + e4k_reg_read(e4k, 0); + + /* Make sure we reset everything and clear POR indicator */ + e4k_reg_write(e4k, E4K_REG_MASTER1, + E4K_MASTER1_RESET | + E4K_MASTER1_NORM_STBY | + E4K_MASTER1_POR_DET + ); + + /* Configure clock input */ + e4k_reg_write(e4k, E4K_REG_CLK_INP, 0x00); + + /* Disable clock output */ + e4k_reg_write(e4k, E4K_REG_REF_CLK, 0x00); + e4k_reg_write(e4k, E4K_REG_CLKOUT_PWDN, 0x96); + + /* Write some magic values into registers */ + magic_init(e4k); +#if 0 + /* Set common mode voltage a bit higher for more margin 850 mv */ + e4k_commonmode_set(e4k, 4); + + /* Initialize DC offset lookup tables */ + e4k_dc_offset_gen_table(e4k); + + /* Enable time variant DC correction */ + e4k_reg_write(e4k, E4K_REG_DCTIME1, 0x01); + e4k_reg_write(e4k, E4K_REG_DCTIME2, 0x01); +#endif + + /* Set LNA mode to manual */ + e4k_reg_write(e4k, E4K_REG_AGC4, 0x10); /* High threshold */ + e4k_reg_write(e4k, E4K_REG_AGC5, 0x04); /* Low threshold */ + e4k_reg_write(e4k, E4K_REG_AGC6, 0x1a); /* LNA calib + loop rate */ + + e4k_reg_set_mask(e4k, E4K_REG_AGC1, E4K_AGC1_MOD_MASK, + E4K_AGC_MOD_SERIAL); + + /* Set Mixer Gain Control to manual */ + e4k_reg_set_mask(e4k, E4K_REG_AGC7, E4K_AGC7_MIX_GAIN_AUTO, 0); + +#if 0 + /* Enable LNA Gain enhancement */ + e4k_reg_set_mask(e4k, E4K_REG_AGC11, 0x7, + E4K_AGC11_LNA_GAIN_ENH | (2 << 1)); + + /* Enable automatic IF gain mode switching */ + e4k_reg_set_mask(e4k, E4K_REG_AGC8, 0x1, E4K_AGC8_SENS_LIN_AUTO); +#endif + + /* Use auto-gain as default */ + e4k_enable_manual_gain(e4k, 0); + + /* Select moderate gain levels */ + e4k_if_gain_set(e4k, 1, 6); + e4k_if_gain_set(e4k, 2, 0); + e4k_if_gain_set(e4k, 3, 0); + e4k_if_gain_set(e4k, 4, 0); + e4k_if_gain_set(e4k, 5, 9); + e4k_if_gain_set(e4k, 6, 9); + + /* Set the most narrow filter we can possibly use */ + e4k_if_filter_bw_set(e4k, E4K_IF_FILTER_MIX, KHZ(1900)); + e4k_if_filter_bw_set(e4k, E4K_IF_FILTER_RC, KHZ(1000)); + e4k_if_filter_bw_set(e4k, E4K_IF_FILTER_CHAN, KHZ(2150)); + e4k_if_filter_chan_enable(e4k, 1); + + /* Disable time variant DC correction and LUT */ + e4k_reg_set_mask(e4k, E4K_REG_DC5, 0x03, 0); + e4k_reg_set_mask(e4k, E4K_REG_DCTIME1, 0x03, 0); + e4k_reg_set_mask(e4k, E4K_REG_DCTIME2, 0x03, 0); + + return 0; +} diff --git a/src/tuner_fc0012.c b/src/tuner_fc0012.c new file mode 100644 index 0000000..768cf1c --- /dev/null +++ b/src/tuner_fc0012.c @@ -0,0 +1,345 @@ +/* + * Fitipower FC0012 tuner driver + * + * Copyright (C) 2012 Hans-Frieder Vogt <hfvogt@gmx.net> + * + * modified for use in librtlsdr + * Copyright (C) 2012 Steve Markgraf <steve@steve-m.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <stdint.h> +#include <stdio.h> + +#include "rtlsdr_i2c.h" +#include "tuner_fc0012.h" + +static int fc0012_writereg(void *dev, uint8_t reg, uint8_t val) +{ + uint8_t data[2]; + data[0] = reg; + data[1] = val; + + if (rtlsdr_i2c_write_fn(dev, FC0012_I2C_ADDR, data, 2) < 0) + return -1; + + return 0; +} + +static int fc0012_readreg(void *dev, uint8_t reg, uint8_t *val) +{ + uint8_t data = reg; + + if (rtlsdr_i2c_write_fn(dev, FC0012_I2C_ADDR, &data, 1) < 0) + return -1; + + if (rtlsdr_i2c_read_fn(dev, FC0012_I2C_ADDR, &data, 1) < 0) + return -1; + + *val = data; + + return 0; +} + +/* Incomplete list of register settings: + * + * Name Reg Bits Desc + * CHIP_ID 0x00 0-7 Chip ID (constant 0xA1) + * RF_A 0x01 0-3 Number of count-to-9 cycles in RF + * divider (suggested: 2..9) + * RF_M 0x02 0-7 Total number of cycles (to-8 and to-9) + * in RF divider + * RF_K_HIGH 0x03 0-6 Bits 8..14 of fractional divider + * RF_K_LOW 0x04 0-7 Bits 0..7 of fractional RF divider + * RF_OUTDIV_A 0x05 3-7 Power of two required? + * LNA_POWER_DOWN 0x06 0 Set to 1 to switch off low noise amp + * RF_OUTDIV_B 0x06 1 Set to select 3 instead of 2 for the + * RF output divider + * VCO_SPEED 0x06 3 Select tuning range of VCO: + * 0 = Low range, (ca. 1.1 - 1.5GHz) + * 1 = High range (ca. 1.4 - 1.8GHz) + * BANDWIDTH 0x06 6-7 Set bandwidth. 6MHz = 0x80, 7MHz=0x40 + * 8MHz=0x00 + * XTAL_SPEED 0x07 5 Set to 1 for 28.8MHz Crystal input + * or 0 for 36MHz + * <agc params> 0x08 0-7 + * EN_CAL_RSSI 0x09 4 Enable calibrate RSSI + * (Receive Signal Strength Indicator) + * LNA_FORCE 0x0d 0 + * AGC_FORCE 0x0d ? + * LNA_GAIN 0x13 3-4 Low noise amp gain + * LNA_COMPS 0x15 3 ? + * VCO_CALIB 0x0e 7 Set high then low to calibrate VCO + * (fast lock?) + * VCO_VOLTAGE 0x0e 0-6 Read Control voltage of VCO + * (big value -> low freq) + */ + +int fc0012_init(void *dev) +{ + int ret = 0; + unsigned int i; + uint8_t reg[] = { + 0x00, /* dummy reg. 0 */ + 0x05, /* reg. 0x01 */ + 0x10, /* reg. 0x02 */ + 0x00, /* reg. 0x03 */ + 0x00, /* reg. 0x04 */ + 0x0f, /* reg. 0x05: may also be 0x0a */ + 0x00, /* reg. 0x06: divider 2, VCO slow */ + 0x00, /* reg. 0x07: may also be 0x0f */ + 0xff, /* reg. 0x08: AGC Clock divide by 256, AGC gain 1/256, + Loop Bw 1/8 */ + 0x6e, /* reg. 0x09: Disable LoopThrough, Enable LoopThrough: 0x6f */ + 0xb8, /* reg. 0x0a: Disable LO Test Buffer */ + 0x82, /* reg. 0x0b: Output Clock is same as clock frequency, + may also be 0x83 */ + 0xfc, /* reg. 0x0c: depending on AGC Up-Down mode, may need 0xf8 */ + 0x02, /* reg. 0x0d: AGC Not Forcing & LNA Forcing, 0x02 for DVB-T */ + 0x00, /* reg. 0x0e */ + 0x00, /* reg. 0x0f */ + 0x00, /* reg. 0x10: may also be 0x0d */ + 0x00, /* reg. 0x11 */ + 0x1f, /* reg. 0x12: Set to maximum gain */ + 0x08, /* reg. 0x13: Set to Middle Gain: 0x08, + Low Gain: 0x00, High Gain: 0x10, enable IX2: 0x80 */ + 0x00, /* reg. 0x14 */ + 0x04, /* reg. 0x15: Enable LNA COMPS */ + }; + +#if 0 + switch (rtlsdr_get_tuner_clock(dev)) { + case FC_XTAL_27_MHZ: + case FC_XTAL_28_8_MHZ: + reg[0x07] |= 0x20; + break; + case FC_XTAL_36_MHZ: + default: + break; + } +#endif + reg[0x07] |= 0x20; + +// if (priv->dual_master) + reg[0x0c] |= 0x02; + + for (i = 1; i < sizeof(reg); i++) { + ret = fc0012_writereg(dev, i, reg[i]); + if (ret) + break; + } + + return ret; +} + +int fc0012_set_params(void *dev, uint32_t freq, uint32_t bandwidth) +{ + int i, ret = 0; + uint8_t reg[7], am, pm, multi, tmp; + uint64_t f_vco; + uint32_t xtal_freq_div_2; + uint16_t xin, xdiv; + int vco_select = 0; + + xtal_freq_div_2 = rtlsdr_get_tuner_clock(dev) / 2; + + /* select frequency divider and the frequency of VCO */ + if (freq < 37084000) { /* freq * 96 < 3560000000 */ + multi = 96; + reg[5] = 0x82; + reg[6] = 0x00; + } else if (freq < 55625000) { /* freq * 64 < 3560000000 */ + multi = 64; + reg[5] = 0x82; + reg[6] = 0x02; + } else if (freq < 74167000) { /* freq * 48 < 3560000000 */ + multi = 48; + reg[5] = 0x42; + reg[6] = 0x00; + } else if (freq < 111250000) { /* freq * 32 < 3560000000 */ + multi = 32; + reg[5] = 0x42; + reg[6] = 0x02; + } else if (freq < 148334000) { /* freq * 24 < 3560000000 */ + multi = 24; + reg[5] = 0x22; + reg[6] = 0x00; + } else if (freq < 222500000) { /* freq * 16 < 3560000000 */ + multi = 16; + reg[5] = 0x22; + reg[6] = 0x02; + } else if (freq < 296667000) { /* freq * 12 < 3560000000 */ + multi = 12; + reg[5] = 0x12; + reg[6] = 0x00; + } else if (freq < 445000000) { /* freq * 8 < 3560000000 */ + multi = 8; + reg[5] = 0x12; + reg[6] = 0x02; + } else if (freq < 593334000) { /* freq * 6 < 3560000000 */ + multi = 6; + reg[5] = 0x0a; + reg[6] = 0x00; + } else { + multi = 4; + reg[5] = 0x0a; + reg[6] = 0x02; + } + + f_vco = freq * multi; + + if (f_vco >= 3060000000U) { + reg[6] |= 0x08; + vco_select = 1; + } + + /* From divided value (XDIV) determined the FA and FP value */ + xdiv = (uint16_t)(f_vco / xtal_freq_div_2); + if ((f_vco - xdiv * xtal_freq_div_2) >= (xtal_freq_div_2 / 2)) + xdiv++; + + pm = (uint8_t)(xdiv / 8); + am = (uint8_t)(xdiv - (8 * pm)); + + if (am < 2) { + am += 8; + pm--; + } + + if (pm > 31) { + reg[1] = am + (8 * (pm - 31)); + reg[2] = 31; + } else { + reg[1] = am; + reg[2] = pm; + } + + if ((reg[1] > 15) || (reg[2] < 0x0b)) { + fprintf(stderr, "[FC0012] no valid PLL combination " + "found for %u Hz!\n", freq); + return -1; + } + + /* fix clock out */ + reg[6] |= 0x20; + + /* From VCO frequency determines the XIN ( fractional part of Delta + Sigma PLL) and divided value (XDIV) */ + xin = (uint16_t)((f_vco - (f_vco / xtal_freq_div_2) * xtal_freq_div_2) / 1000); + xin = (xin << 15) / (xtal_freq_div_2 / 1000); + if (xin >= 16384) + xin += 32768; + + reg[3] = xin >> 8; /* xin with 9 bit resolution */ + reg[4] = xin & 0xff; + + reg[6] &= 0x3f; /* bits 6 and 7 describe the bandwidth */ + switch (bandwidth) { + case 6000000: + reg[6] |= 0x80; + break; + case 7000000: + reg[6] |= 0x40; + break; + case 8000000: + default: + break; + } + + /* modified for Realtek demod */ + reg[5] |= 0x07; + + for (i = 1; i <= 6; i++) { + ret = fc0012_writereg(dev, i, reg[i]); + if (ret) + goto exit; + } + + /* VCO Calibration */ + ret = fc0012_writereg(dev, 0x0e, 0x80); + if (!ret) + ret = fc0012_writereg(dev, 0x0e, 0x00); + + /* VCO Re-Calibration if needed */ + if (!ret) + ret = fc0012_writereg(dev, 0x0e, 0x00); + + if (!ret) { +// msleep(10); + ret = fc0012_readreg(dev, 0x0e, &tmp); + } + if (ret) + goto exit; + + /* vco selection */ + tmp &= 0x3f; + + if (vco_select) { + if (tmp > 0x3c) { + reg[6] &= ~0x08; + ret = fc0012_writereg(dev, 0x06, reg[6]); + if (!ret) + ret = fc0012_writereg(dev, 0x0e, 0x80); + if (!ret) + ret = fc0012_writereg(dev, 0x0e, 0x00); + } + } else { + if (tmp < 0x02) { + reg[6] |= 0x08; + ret = fc0012_writereg(dev, 0x06, reg[6]); + if (!ret) + ret = fc0012_writereg(dev, 0x0e, 0x80); + if (!ret) + ret = fc0012_writereg(dev, 0x0e, 0x00); + } + } + +exit: + return ret; +} + +int fc0012_set_gain(void *dev, int gain) +{ + int ret; + uint8_t tmp = 0; + + ret = fc0012_readreg(dev, 0x13, &tmp); + + /* mask bits off */ + tmp &= 0xe0; + + switch (gain) { + case -99: /* -9.9 dB */ + tmp |= 0x02; + break; + case -40: /* -4 dB */ + break; + case 71: + tmp |= 0x08; /* 7.1 dB */ + break; + case 179: + tmp |= 0x17; /* 17.9 dB */ + break; + case 192: + default: + tmp |= 0x10; /* 19.2 dB */ + break; + } + + ret = fc0012_writereg(dev, 0x13, tmp); + + return ret; +} diff --git a/src/tuner_fc0013.c b/src/tuner_fc0013.c new file mode 100644 index 0000000..78b696e --- /dev/null +++ b/src/tuner_fc0013.c @@ -0,0 +1,500 @@ +/* + * Fitipower FC0013 tuner driver + * + * Copyright (C) 2012 Hans-Frieder Vogt <hfvogt@gmx.net> + * partially based on driver code from Fitipower + * Copyright (C) 2010 Fitipower Integrated Technology Inc + * + * modified for use in librtlsdr + * Copyright (C) 2012 Steve Markgraf <steve@steve-m.de> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <stdint.h> +#include <stdio.h> + +#include "rtlsdr_i2c.h" +#include "tuner_fc0013.h" + +static int fc0013_writereg(void *dev, uint8_t reg, uint8_t val) +{ + uint8_t data[2]; + data[0] = reg; + data[1] = val; + + if (rtlsdr_i2c_write_fn(dev, FC0013_I2C_ADDR, data, 2) < 0) + return -1; + + return 0; +} + +static int fc0013_readreg(void *dev, uint8_t reg, uint8_t *val) +{ + uint8_t data = reg; + + if (rtlsdr_i2c_write_fn(dev, FC0013_I2C_ADDR, &data, 1) < 0) + return -1; + + if (rtlsdr_i2c_read_fn(dev, FC0013_I2C_ADDR, &data, 1) < 0) + return -1; + + *val = data; + + return 0; +} + +int fc0013_init(void *dev) +{ + int ret = 0; + unsigned int i; + uint8_t reg[] = { + 0x00, /* reg. 0x00: dummy */ + 0x09, /* reg. 0x01 */ + 0x16, /* reg. 0x02 */ + 0x00, /* reg. 0x03 */ + 0x00, /* reg. 0x04 */ + 0x17, /* reg. 0x05 */ + 0x02, /* reg. 0x06: LPF bandwidth */ + 0x0a, /* reg. 0x07: CHECK */ + 0xff, /* reg. 0x08: AGC Clock divide by 256, AGC gain 1/256, + Loop Bw 1/8 */ + 0x6e, /* reg. 0x09: Disable LoopThrough, Enable LoopThrough: 0x6f */ + 0xb8, /* reg. 0x0a: Disable LO Test Buffer */ + 0x82, /* reg. 0x0b: CHECK */ + 0xfc, /* reg. 0x0c: depending on AGC Up-Down mode, may need 0xf8 */ + 0x01, /* reg. 0x0d: AGC Not Forcing & LNA Forcing, may need 0x02 */ + 0x00, /* reg. 0x0e */ + 0x00, /* reg. 0x0f */ + 0x00, /* reg. 0x10 */ + 0x00, /* reg. 0x11 */ + 0x00, /* reg. 0x12 */ + 0x00, /* reg. 0x13 */ + 0x50, /* reg. 0x14: DVB-t High Gain, UHF. + Middle Gain: 0x48, Low Gain: 0x40 */ + 0x01, /* reg. 0x15 */ + }; +#if 0 + switch (rtlsdr_get_tuner_clock(dev)) { + case FC_XTAL_27_MHZ: + case FC_XTAL_28_8_MHZ: + reg[0x07] |= 0x20; + break; + case FC_XTAL_36_MHZ: + default: + break; + } +#endif + reg[0x07] |= 0x20; + +// if (dev->dual_master) + reg[0x0c] |= 0x02; + + for (i = 1; i < sizeof(reg); i++) { + ret = fc0013_writereg(dev, i, reg[i]); + if (ret < 0) + break; + } + + return ret; +} + +int fc0013_rc_cal_add(void *dev, int rc_val) +{ + int ret; + uint8_t rc_cal; + int val; + + /* push rc_cal value, get rc_cal value */ + ret = fc0013_writereg(dev, 0x10, 0x00); + if (ret) + goto error_out; + + /* get rc_cal value */ + ret = fc0013_readreg(dev, 0x10, &rc_cal); + if (ret) + goto error_out; + + rc_cal &= 0x0f; + + val = (int)rc_cal + rc_val; + + /* forcing rc_cal */ + ret = fc0013_writereg(dev, 0x0d, 0x11); + if (ret) + goto error_out; + + /* modify rc_cal value */ + if (val > 15) + ret = fc0013_writereg(dev, 0x10, 0x0f); + else if (val < 0) + ret = fc0013_writereg(dev, 0x10, 0x00); + else + ret = fc0013_writereg(dev, 0x10, (uint8_t)val); + +error_out: + return ret; +} + +int fc0013_rc_cal_reset(void *dev) +{ + int ret; + + ret = fc0013_writereg(dev, 0x0d, 0x01); + if (!ret) + ret = fc0013_writereg(dev, 0x10, 0x00); + + return ret; +} + +static int fc0013_set_vhf_track(void *dev, uint32_t freq) +{ + int ret; + uint8_t tmp; + + ret = fc0013_readreg(dev, 0x1d, &tmp); + if (ret) + goto error_out; + tmp &= 0xe3; + if (freq <= 177500000) { /* VHF Track: 7 */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x1c); + } else if (freq <= 184500000) { /* VHF Track: 6 */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x18); + } else if (freq <= 191500000) { /* VHF Track: 5 */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x14); + } else if (freq <= 198500000) { /* VHF Track: 4 */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x10); + } else if (freq <= 205500000) { /* VHF Track: 3 */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x0c); + } else if (freq <= 219500000) { /* VHF Track: 2 */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x08); + } else if (freq < 300000000) { /* VHF Track: 1 */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x04); + } else { /* UHF and GPS */ + ret = fc0013_writereg(dev, 0x1d, tmp | 0x1c); + } + +error_out: + return ret; +} + +int fc0013_set_params(void *dev, uint32_t freq, uint32_t bandwidth) +{ + int i, ret = 0; + uint8_t reg[7], am, pm, multi, tmp; + uint64_t f_vco; + uint32_t xtal_freq_div_2; + uint16_t xin, xdiv; + int vco_select = 0; + + xtal_freq_div_2 = rtlsdr_get_tuner_clock(dev) / 2; + + /* set VHF track */ + ret = fc0013_set_vhf_track(dev, freq); + if (ret) + goto exit; + + if (freq < 300000000) { + /* enable VHF filter */ + ret = fc0013_readreg(dev, 0x07, &tmp); + if (ret) + goto exit; + ret = fc0013_writereg(dev, 0x07, tmp | 0x10); + if (ret) + goto exit; + + /* disable UHF & disable GPS */ + ret = fc0013_readreg(dev, 0x14, &tmp); + if (ret) + goto exit; + ret = fc0013_writereg(dev, 0x14, tmp & 0x1f); + if (ret) + goto exit; + } else if (freq <= 862000000) { + /* disable VHF filter */ + ret = fc0013_readreg(dev, 0x07, &tmp); + if (ret) + goto exit; + ret = fc0013_writereg(dev, 0x07, tmp & 0xef); + if (ret) + goto exit; + + /* enable UHF & disable GPS */ + ret = fc0013_readreg(dev, 0x14, &tmp); + if (ret) + goto exit; + ret = fc0013_writereg(dev, 0x14, (tmp & 0x1f) | 0x40); + if (ret) + goto exit; + } else { + /* disable VHF filter */ + ret = fc0013_readreg(dev, 0x07, &tmp); + if (ret) + goto exit; + ret = fc0013_writereg(dev, 0x07, tmp & 0xef); + if (ret) + goto exit; + + /* disable UHF & enable GPS */ + ret = fc0013_readreg(dev, 0x14, &tmp); + if (ret) + goto exit; + ret = fc0013_writereg(dev, 0x14, (tmp & 0x1f) | 0x20); + if (ret) + goto exit; + } + + /* select frequency divider and the frequency of VCO */ + if (freq < 37084000) { /* freq * 96 < 3560000000 */ + multi = 96; + reg[5] = 0x82; + reg[6] = 0x00; + } else if (freq < 55625000) { /* freq * 64 < 3560000000 */ + multi = 64; + reg[5] = 0x02; + reg[6] = 0x02; + } else if (freq < 74167000) { /* freq * 48 < 3560000000 */ + multi = 48; + reg[5] = 0x42; + reg[6] = 0x00; + } else if (freq < 111250000) { /* freq * 32 < 3560000000 */ + multi = 32; + reg[5] = 0x82; + reg[6] = 0x02; + } else if (freq < 148334000) { /* freq * 24 < 3560000000 */ + multi = 24; + reg[5] = 0x22; + reg[6] = 0x00; + } else if (freq < 222500000) { /* freq * 16 < 3560000000 */ + multi = 16; + reg[5] = 0x42; + reg[6] = 0x02; + } else if (freq < 296667000) { /* freq * 12 < 3560000000 */ + multi = 12; + reg[5] = 0x12; + reg[6] = 0x00; + } else if (freq < 445000000) { /* freq * 8 < 3560000000 */ + multi = 8; + reg[5] = 0x22; + reg[6] = 0x02; + } else if (freq < 593334000) { /* freq * 6 < 3560000000 */ + multi = 6; + reg[5] = 0x0a; + reg[6] = 0x00; + } else if (freq < 950000000) { /* freq * 4 < 3800000000 */ + multi = 4; + reg[5] = 0x12; + reg[6] = 0x02; + } else { + multi = 2; + reg[5] = 0x0a; + reg[6] = 0x02; + } + + f_vco = freq * multi; + + if (f_vco >= 3060000000U) { + reg[6] |= 0x08; + vco_select = 1; + } + + /* From divided value (XDIV) determined the FA and FP value */ + xdiv = (uint16_t)(f_vco / xtal_freq_div_2); + if ((f_vco - xdiv * xtal_freq_div_2) >= (xtal_freq_div_2 / 2)) + xdiv++; + + pm = (uint8_t)(xdiv / 8); + am = (uint8_t)(xdiv - (8 * pm)); + + if (am < 2) { + am += 8; + pm--; + } + + if (pm > 31) { + reg[1] = am + (8 * (pm - 31)); + reg[2] = 31; + } else { + reg[1] = am; + reg[2] = pm; + } + + if ((reg[1] > 15) || (reg[2] < 0x0b)) { + fprintf(stderr, "[FC0013] no valid PLL combination " + "found for %u Hz!\n", freq); + return -1; + } + + /* fix clock out */ + reg[6] |= 0x20; + + /* From VCO frequency determines the XIN ( fractional part of Delta + Sigma PLL) and divided value (XDIV) */ + xin = (uint16_t)((f_vco - (f_vco / xtal_freq_div_2) * xtal_freq_div_2) / 1000); + xin = (xin << 15) / (xtal_freq_div_2 / 1000); + if (xin >= 16384) + xin += 32768; + + reg[3] = xin >> 8; + reg[4] = xin & 0xff; + + reg[6] &= 0x3f; /* bits 6 and 7 describe the bandwidth */ + switch (bandwidth) { + case 6000000: + reg[6] |= 0x80; + break; + case 7000000: + reg[6] |= 0x40; + break; + case 8000000: + default: + break; + } + + /* modified for Realtek demod */ + reg[5] |= 0x07; + + for (i = 1; i <= 6; i++) { + ret = fc0013_writereg(dev, i, reg[i]); + if (ret) + goto exit; + } + + ret = fc0013_readreg(dev, 0x11, &tmp); + if (ret) + goto exit; + if (multi == 64) + ret = fc0013_writereg(dev, 0x11, tmp | 0x04); + else + ret = fc0013_writereg(dev, 0x11, tmp & 0xfb); + if (ret) + goto exit; + + /* VCO Calibration */ + ret = fc0013_writereg(dev, 0x0e, 0x80); + if (!ret) + ret = fc0013_writereg(dev, 0x0e, 0x00); + + /* VCO Re-Calibration if needed */ + if (!ret) + ret = fc0013_writereg(dev, 0x0e, 0x00); + + if (!ret) { +// msleep(10); + ret = fc0013_readreg(dev, 0x0e, &tmp); + } + if (ret) + goto exit; + + /* vco selection */ + tmp &= 0x3f; + + if (vco_select) { + if (tmp > 0x3c) { + reg[6] &= ~0x08; + ret = fc0013_writereg(dev, 0x06, reg[6]); + if (!ret) + ret = fc0013_writereg(dev, 0x0e, 0x80); + if (!ret) + ret = fc0013_writereg(dev, 0x0e, 0x00); + } + } else { + if (tmp < 0x02) { + reg[6] |= 0x08; + ret = fc0013_writereg(dev, 0x06, reg[6]); + if (!ret) + ret = fc0013_writereg(dev, 0x0e, 0x80); + if (!ret) + ret = fc0013_writereg(dev, 0x0e, 0x00); + } + } + +exit: + return ret; +} + +int fc0013_set_gain_mode(void *dev, int manual) +{ + int ret = 0; + uint8_t tmp = 0; + + ret |= fc0013_readreg(dev, 0x0d, &tmp); + + if (manual) + tmp |= (1 << 3); + else + tmp &= ~(1 << 3); + + ret |= fc0013_writereg(dev, 0x0d, tmp); + + /* set a fixed IF-gain for now */ + ret |= fc0013_writereg(dev, 0x13, 0x0a); + + return ret; +} + +int fc0013_lna_gains[] ={ + -99, 0x02, + -73, 0x03, + -65, 0x05, + -63, 0x04, + -63, 0x00, + -60, 0x07, + -58, 0x01, + -54, 0x06, + 58, 0x0f, + 61, 0x0e, + 63, 0x0d, + 65, 0x0c, + 67, 0x0b, + 68, 0x0a, + 70, 0x09, + 71, 0x08, + 179, 0x17, + 181, 0x16, + 182, 0x15, + 184, 0x14, + 186, 0x13, + 188, 0x12, + 191, 0x11, + 197, 0x10 +}; + +#define GAIN_CNT (sizeof(fc0013_lna_gains) / sizeof(int) / 2) + +int fc0013_set_lna_gain(void *dev, int gain) +{ + int ret = 0; + unsigned int i; + uint8_t tmp = 0; + + ret |= fc0013_readreg(dev, 0x14, &tmp); + + /* mask bits off */ + tmp &= 0xe0; + + for (i = 0; i < GAIN_CNT; i++) { + if ((fc0013_lna_gains[i*2] >= gain) || (i+1 == GAIN_CNT)) { + tmp |= fc0013_lna_gains[i*2 + 1]; + break; + } + } + + /* set gain */ + ret |= fc0013_writereg(dev, 0x14, tmp); + + return ret; +} diff --git a/src/tuner_fc2580.c b/src/tuner_fc2580.c new file mode 100644 index 0000000..d2eeba5 --- /dev/null +++ b/src/tuner_fc2580.c @@ -0,0 +1,494 @@ +/* + * FCI FC2580 tuner driver, taken from the kernel driver that can be found + * on http://linux.terratec.de/tv_en.html + * + * This driver is a mess, and should be cleaned up/rewritten. + * + */ + +#include <stdint.h> + +#include "rtlsdr_i2c.h" +#include "tuner_fc2580.h" + +/* 16.384 MHz (at least on the Logilink VG0002A) */ +#define CRYSTAL_FREQ 16384000 + +/* glue functions to rtl-sdr code */ + +fc2580_fci_result_type fc2580_i2c_write(void *pTuner, unsigned char reg, unsigned char val) +{ + uint8_t data[2]; + + data[0] = reg; + data[1] = val; + + if (rtlsdr_i2c_write_fn(pTuner, FC2580_I2C_ADDR, data, 2) < 0) + return FC2580_FCI_FAIL; + + return FC2580_FCI_SUCCESS; +} + +fc2580_fci_result_type fc2580_i2c_read(void *pTuner, unsigned char reg, unsigned char *read_data) +{ + uint8_t data = reg; + + if (rtlsdr_i2c_write_fn(pTuner, FC2580_I2C_ADDR, &data, 1) < 0) + return FC2580_FCI_FAIL; + + if (rtlsdr_i2c_read_fn(pTuner, FC2580_I2C_ADDR, &data, 1) < 0) + return FC2580_FCI_FAIL; + + *read_data = data; + + return FC2580_FCI_SUCCESS; +} + +int +fc2580_Initialize( + void *pTuner + ) +{ + int AgcMode; + unsigned int CrystalFreqKhz; + + //TODO set AGC mode + AgcMode = FC2580_AGC_EXTERNAL; + + // Initialize tuner with AGC mode. + // Note: CrystalFreqKhz = round(CrystalFreqHz / 1000) + CrystalFreqKhz = (unsigned int)((CRYSTAL_FREQ + 500) / 1000); + + if(fc2580_set_init(pTuner, AgcMode, CrystalFreqKhz) != FC2580_FCI_SUCCESS) + goto error_status_initialize_tuner; + + + return FUNCTION_SUCCESS; + + +error_status_initialize_tuner: + return FUNCTION_ERROR; +} + +int +fc2580_SetRfFreqHz( + void *pTuner, + unsigned long RfFreqHz + ) +{ + unsigned int RfFreqKhz; + unsigned int CrystalFreqKhz; + + // Set tuner RF frequency in KHz. + // Note: RfFreqKhz = round(RfFreqHz / 1000) + // CrystalFreqKhz = round(CrystalFreqHz / 1000) + RfFreqKhz = (unsigned int)((RfFreqHz + 500) / 1000); + CrystalFreqKhz = (unsigned int)((CRYSTAL_FREQ + 500) / 1000); + + if(fc2580_set_freq(pTuner, RfFreqKhz, CrystalFreqKhz) != FC2580_FCI_SUCCESS) + goto error_status_set_tuner_rf_frequency; + + return FUNCTION_SUCCESS; + +error_status_set_tuner_rf_frequency: + return FUNCTION_ERROR; +} + +/** + +@brief Set FC2580 tuner bandwidth mode. + +*/ +int +fc2580_SetBandwidthMode( + void *pTuner, + int BandwidthMode + ) +{ + unsigned int CrystalFreqKhz; + + // Set tuner bandwidth mode. + // Note: CrystalFreqKhz = round(CrystalFreqHz / 1000) + CrystalFreqKhz = (unsigned int)((CRYSTAL_FREQ + 500) / 1000); + + if(fc2580_set_filter(pTuner, (unsigned char)BandwidthMode, CrystalFreqKhz) != FC2580_FCI_SUCCESS) + goto error_status_set_tuner_bandwidth_mode; + + return FUNCTION_SUCCESS; + + +error_status_set_tuner_bandwidth_mode: + return FUNCTION_ERROR; +} + +void fc2580_wait_msec(void *pTuner, int a) +{ + /* USB latency is enough for now ;) */ +// usleep(a * 1000); + return; +} + +/*============================================================================== + fc2580 initial setting + + This function is a generic function which gets called to initialize + + fc2580 in DVB-H mode or L-Band TDMB mode + + <input parameter> + + ifagc_mode + type : integer + 1 : Internal AGC + 2 : Voltage Control Mode + +==============================================================================*/ +fc2580_fci_result_type fc2580_set_init( void *pTuner, int ifagc_mode, unsigned int freq_xtal ) +{ + fc2580_fci_result_type result = FC2580_FCI_SUCCESS; + + result &= fc2580_i2c_write(pTuner, 0x00, 0x00); /*** Confidential ***/ + result &= fc2580_i2c_write(pTuner, 0x12, 0x86); + result &= fc2580_i2c_write(pTuner, 0x14, 0x5C); + result &= fc2580_i2c_write(pTuner, 0x16, 0x3C); + result &= fc2580_i2c_write(pTuner, 0x1F, 0xD2); + result &= fc2580_i2c_write(pTuner, 0x09, 0xD7); + result &= fc2580_i2c_write(pTuner, 0x0B, 0xD5); + result &= fc2580_i2c_write(pTuner, 0x0C, 0x32); + result &= fc2580_i2c_write(pTuner, 0x0E, 0x43); + result &= fc2580_i2c_write(pTuner, 0x21, 0x0A); + result &= fc2580_i2c_write(pTuner, 0x22, 0x82); + if( ifagc_mode == 1 ) + { + result &= fc2580_i2c_write(pTuner, 0x45, 0x10); //internal AGC + result &= fc2580_i2c_write(pTuner, 0x4C, 0x00); //HOLD_AGC polarity + } + else if( ifagc_mode == 2 ) + { + result &= fc2580_i2c_write(pTuner, 0x45, 0x20); //Voltage Control Mode + result &= fc2580_i2c_write(pTuner, 0x4C, 0x02); //HOLD_AGC polarity + } + result &= fc2580_i2c_write(pTuner, 0x3F, 0x88); + result &= fc2580_i2c_write(pTuner, 0x02, 0x0E); + result &= fc2580_i2c_write(pTuner, 0x58, 0x14); + result &= fc2580_set_filter(pTuner, 8, freq_xtal); //BW = 7.8MHz + + return result; +} + + +/*============================================================================== + fc2580 frequency setting + + This function is a generic function which gets called to change LO Frequency + + of fc2580 in DVB-H mode or L-Band TDMB mode + + <input parameter> + freq_xtal: kHz + + f_lo + Value of target LO Frequency in 'kHz' unit + ex) 2.6GHz = 2600000 + +==============================================================================*/ +fc2580_fci_result_type fc2580_set_freq( void *pTuner, unsigned int f_lo, unsigned int freq_xtal ) +{ + unsigned int f_diff, f_diff_shifted, n_val, k_val; + unsigned int f_vco, r_val, f_comp; + unsigned char pre_shift_bits = 4;// number of preshift to prevent overflow in shifting f_diff to f_diff_shifted + unsigned char data_0x18; + unsigned char data_0x02 = (USE_EXT_CLK<<5)|0x0E; + + fc2580_band_type band = ( f_lo > 1000000 )? FC2580_L_BAND : ( f_lo > 400000 )? FC2580_UHF_BAND : FC2580_VHF_BAND; + + fc2580_fci_result_type result = FC2580_FCI_SUCCESS; + + f_vco = ( band == FC2580_UHF_BAND )? f_lo * 4 : (( band == FC2580_L_BAND )? f_lo * 2 : f_lo * 12); + r_val = ( f_vco >= 2*76*freq_xtal )? 1 : ( f_vco >= 76*freq_xtal )? 2 : 4; + f_comp = freq_xtal/r_val; + n_val = ( f_vco / 2 ) / f_comp; + + f_diff = f_vco - 2* f_comp * n_val; + f_diff_shifted = f_diff << ( 20 - pre_shift_bits ); + k_val = f_diff_shifted / ( ( 2* f_comp ) >> pre_shift_bits ); + + if( f_diff_shifted - k_val * ( ( 2* f_comp ) >> pre_shift_bits ) >= ( f_comp >> pre_shift_bits ) ) + k_val = k_val + 1; + + if( f_vco >= BORDER_FREQ ) //Select VCO Band + data_0x02 = data_0x02 | 0x08; //0x02[3] = 1; + else + data_0x02 = data_0x02 & 0xF7; //0x02[3] = 0; + +// if( band != curr_band ) { + switch(band) + { + case FC2580_UHF_BAND: + data_0x02 = (data_0x02 & 0x3F); + + result &= fc2580_i2c_write(pTuner, 0x25, 0xF0); + result &= fc2580_i2c_write(pTuner, 0x27, 0x77); + result &= fc2580_i2c_write(pTuner, 0x28, 0x53); + result &= fc2580_i2c_write(pTuner, 0x29, 0x60); + result &= fc2580_i2c_write(pTuner, 0x30, 0x09); + result &= fc2580_i2c_write(pTuner, 0x50, 0x8C); + result &= fc2580_i2c_write(pTuner, 0x53, 0x50); + + if( f_lo < 538000 ) + result &= fc2580_i2c_write(pTuner, 0x5F, 0x13); + else + result &= fc2580_i2c_write(pTuner, 0x5F, 0x15); + + if( f_lo < 538000 ) + { + result &= fc2580_i2c_write(pTuner, 0x61, 0x07); + result &= fc2580_i2c_write(pTuner, 0x62, 0x06); + result &= fc2580_i2c_write(pTuner, 0x67, 0x06); + result &= fc2580_i2c_write(pTuner, 0x68, 0x08); + result &= fc2580_i2c_write(pTuner, 0x69, 0x10); + result &= fc2580_i2c_write(pTuner, 0x6A, 0x12); + } + else if( f_lo < 794000 ) + { + result &= fc2580_i2c_write(pTuner, 0x61, 0x03); + result &= fc2580_i2c_write(pTuner, 0x62, 0x03); + result &= fc2580_i2c_write(pTuner, 0x67, 0x03); //ACI improve + result &= fc2580_i2c_write(pTuner, 0x68, 0x05); //ACI improve + result &= fc2580_i2c_write(pTuner, 0x69, 0x0C); + result &= fc2580_i2c_write(pTuner, 0x6A, 0x0E); + } + else + { + result &= fc2580_i2c_write(pTuner, 0x61, 0x07); + result &= fc2580_i2c_write(pTuner, 0x62, 0x06); + result &= fc2580_i2c_write(pTuner, 0x67, 0x07); + result &= fc2580_i2c_write(pTuner, 0x68, 0x09); + result &= fc2580_i2c_write(pTuner, 0x69, 0x10); + result &= fc2580_i2c_write(pTuner, 0x6A, 0x12); + } + + result &= fc2580_i2c_write(pTuner, 0x63, 0x15); + + result &= fc2580_i2c_write(pTuner, 0x6B, 0x0B); + result &= fc2580_i2c_write(pTuner, 0x6C, 0x0C); + result &= fc2580_i2c_write(pTuner, 0x6D, 0x78); + result &= fc2580_i2c_write(pTuner, 0x6E, 0x32); + result &= fc2580_i2c_write(pTuner, 0x6F, 0x14); + result &= fc2580_set_filter(pTuner, 8, freq_xtal); //BW = 7.8MHz + break; + case FC2580_VHF_BAND: + data_0x02 = (data_0x02 & 0x3F) | 0x80; + result &= fc2580_i2c_write(pTuner, 0x27, 0x77); + result &= fc2580_i2c_write(pTuner, 0x28, 0x33); + result &= fc2580_i2c_write(pTuner, 0x29, 0x40); + result &= fc2580_i2c_write(pTuner, 0x30, 0x09); + result &= fc2580_i2c_write(pTuner, 0x50, 0x8C); + result &= fc2580_i2c_write(pTuner, 0x53, 0x50); + result &= fc2580_i2c_write(pTuner, 0x5F, 0x0F); + result &= fc2580_i2c_write(pTuner, 0x61, 0x07); + result &= fc2580_i2c_write(pTuner, 0x62, 0x00); + result &= fc2580_i2c_write(pTuner, 0x63, 0x15); + result &= fc2580_i2c_write(pTuner, 0x67, 0x03); + result &= fc2580_i2c_write(pTuner, 0x68, 0x05); + result &= fc2580_i2c_write(pTuner, 0x69, 0x10); + result &= fc2580_i2c_write(pTuner, 0x6A, 0x12); + result &= fc2580_i2c_write(pTuner, 0x6B, 0x08); + result &= fc2580_i2c_write(pTuner, 0x6C, 0x0A); + result &= fc2580_i2c_write(pTuner, 0x6D, 0x78); + result &= fc2580_i2c_write(pTuner, 0x6E, 0x32); + result &= fc2580_i2c_write(pTuner, 0x6F, 0x54); + result &= fc2580_set_filter(pTuner, 7, freq_xtal); //BW = 6.8MHz + break; + case FC2580_L_BAND: + data_0x02 = (data_0x02 & 0x3F) | 0x40; + result &= fc2580_i2c_write(pTuner, 0x2B, 0x70); + result &= fc2580_i2c_write(pTuner, 0x2C, 0x37); + result &= fc2580_i2c_write(pTuner, 0x2D, 0xE7); + result &= fc2580_i2c_write(pTuner, 0x30, 0x09); + result &= fc2580_i2c_write(pTuner, 0x44, 0x20); + result &= fc2580_i2c_write(pTuner, 0x50, 0x8C); + result &= fc2580_i2c_write(pTuner, 0x53, 0x50); + result &= fc2580_i2c_write(pTuner, 0x5F, 0x0F); + result &= fc2580_i2c_write(pTuner, 0x61, 0x0F); + result &= fc2580_i2c_write(pTuner, 0x62, 0x00); + result &= fc2580_i2c_write(pTuner, 0x63, 0x13); + result &= fc2580_i2c_write(pTuner, 0x67, 0x00); + result &= fc2580_i2c_write(pTuner, 0x68, 0x02); + result &= fc2580_i2c_write(pTuner, 0x69, 0x0C); + result &= fc2580_i2c_write(pTuner, 0x6A, 0x0E); + result &= fc2580_i2c_write(pTuner, 0x6B, 0x08); + result &= fc2580_i2c_write(pTuner, 0x6C, 0x0A); + result &= fc2580_i2c_write(pTuner, 0x6D, 0xA0); + result &= fc2580_i2c_write(pTuner, 0x6E, 0x50); + result &= fc2580_i2c_write(pTuner, 0x6F, 0x14); + result &= fc2580_set_filter(pTuner, 1, freq_xtal); //BW = 1.53MHz + break; + default: + break; + } +// curr_band = band; +// } + + //A command about AGC clock's pre-divide ratio + if( freq_xtal >= 28000 ) + result &= fc2580_i2c_write(pTuner, 0x4B, 0x22 ); + + //Commands about VCO Band and PLL setting. + result &= fc2580_i2c_write(pTuner, 0x02, data_0x02); + data_0x18 = ( ( r_val == 1 )? 0x00 : ( ( r_val == 2 )? 0x10 : 0x20 ) ) + (unsigned char)(k_val >> 16); + result &= fc2580_i2c_write(pTuner, 0x18, data_0x18); //Load 'R' value and high part of 'K' values + result &= fc2580_i2c_write(pTuner, 0x1A, (unsigned char)( k_val >> 8 ) ); //Load middle part of 'K' value + result &= fc2580_i2c_write(pTuner, 0x1B, (unsigned char)( k_val ) ); //Load lower part of 'K' value + result &= fc2580_i2c_write(pTuner, 0x1C, (unsigned char)( n_val ) ); //Load 'N' value + + //A command about UHF LNA Load Cap + if( band == FC2580_UHF_BAND ) + result &= fc2580_i2c_write(pTuner, 0x2D, ( f_lo <= (unsigned int)794000 )? 0x9F : 0x8F ); //LNA_OUT_CAP + + + return result; +} + + +/*============================================================================== + fc2580 filter BW setting + + This function is a generic function which gets called to change Bandwidth + + frequency of fc2580's channel selection filter + + <input parameter> + freq_xtal: kHz + + filter_bw + 1 : 1.53MHz(TDMB) + 6 : 6MHz (Bandwidth 6MHz) + 7 : 6.8MHz (Bandwidth 7MHz) + 8 : 7.8MHz (Bandwidth 8MHz) + + +==============================================================================*/ +fc2580_fci_result_type fc2580_set_filter( void *pTuner, unsigned char filter_bw, unsigned int freq_xtal ) +{ + unsigned char cal_mon = 0, i; + fc2580_fci_result_type result = FC2580_FCI_SUCCESS; + + if(filter_bw == 1) + { + result &= fc2580_i2c_write(pTuner, 0x36, 0x1C); + result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(4151*freq_xtal/1000000) ); + result &= fc2580_i2c_write(pTuner, 0x39, 0x00); + result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); + } + if(filter_bw == 6) + { + result &= fc2580_i2c_write(pTuner, 0x36, 0x18); + result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(4400*freq_xtal/1000000) ); + result &= fc2580_i2c_write(pTuner, 0x39, 0x00); + result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); + } + else if(filter_bw == 7) + { + result &= fc2580_i2c_write(pTuner, 0x36, 0x18); + result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(3910*freq_xtal/1000000) ); + result &= fc2580_i2c_write(pTuner, 0x39, 0x80); + result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); + } + else if(filter_bw == 8) + { + result &= fc2580_i2c_write(pTuner, 0x36, 0x18); + result &= fc2580_i2c_write(pTuner, 0x37, (unsigned char)(3300*freq_xtal/1000000) ); + result &= fc2580_i2c_write(pTuner, 0x39, 0x80); + result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); + } + + + for(i=0; i<5; i++) + { + fc2580_wait_msec(pTuner, 5);//wait 5ms + result &= fc2580_i2c_read(pTuner, 0x2F, &cal_mon); + if( (cal_mon & 0xC0) != 0xC0) + { + result &= fc2580_i2c_write(pTuner, 0x2E, 0x01); + result &= fc2580_i2c_write(pTuner, 0x2E, 0x09); + } + else + break; + } + + result &= fc2580_i2c_write(pTuner, 0x2E, 0x01); + + return result; +} + +/*============================================================================== + fc2580 RSSI function + + This function is a generic function which returns fc2580's + + current RSSI value. + + <input parameter> + none + + <return value> + int + rssi : estimated input power. + +==============================================================================*/ +//int fc2580_get_rssi(void) { +// +// unsigned char s_lna, s_rfvga, s_cfs, s_ifvga; +// int ofs_lna, ofs_rfvga, ofs_csf, ofs_ifvga, rssi; +// +// fc2580_i2c_read(0x71, &s_lna ); +// fc2580_i2c_read(0x72, &s_rfvga ); +// fc2580_i2c_read(0x73, &s_cfs ); +// fc2580_i2c_read(0x74, &s_ifvga ); +// +// +// ofs_lna = +// (curr_band==FC2580_UHF_BAND)? +// (s_lna==0)? 0 : +// (s_lna==1)? -6 : +// (s_lna==2)? -17 : +// (s_lna==3)? -22 : -30 : +// (curr_band==FC2580_VHF_BAND)? +// (s_lna==0)? 0 : +// (s_lna==1)? -6 : +// (s_lna==2)? -19 : +// (s_lna==3)? -24 : -32 : +// (curr_band==FC2580_L_BAND)? +// (s_lna==0)? 0 : +// (s_lna==1)? -6 : +// (s_lna==2)? -11 : +// (s_lna==3)? -16 : -34 : +// 0;//FC2580_NO_BAND +// ofs_rfvga = -s_rfvga+((s_rfvga>=11)? 1 : 0) + ((s_rfvga>=18)? 1 : 0); +// ofs_csf = -6*s_cfs; +// ofs_ifvga = s_ifvga/4; +// +// return rssi = ofs_lna+ofs_rfvga+ofs_csf+ofs_ifvga+OFS_RSSI; +// +//} + +/*============================================================================== + fc2580 Xtal frequency Setting + + This function is a generic function which sets + + the frequency of xtal. + + <input parameter> + + frequency + frequency value of internal(external) Xtal(clock) in kHz unit. + +==============================================================================*/ +//void fc2580_set_freq_xtal(unsigned int frequency) { +// +// freq_xtal = frequency; +// +//} + diff --git a/src/tuner_r820t.c b/src/tuner_r820t.c new file mode 100644 index 0000000..fd3188d --- /dev/null +++ b/src/tuner_r820t.c @@ -0,0 +1,3050 @@ +/* + * R820T tuner driver, taken from Realteks RTL2832U Linux Kernel Driver + * + * This driver is a mess, and should be cleaned up/rewritten. + * + */ + +#include <stdint.h> +#include <stdio.h> + +#include "rtlsdr_i2c.h" +#include "tuner_r820t.h" + +int r820t_SetRfFreqHz(void *pTuner, unsigned long RfFreqHz) +{ + R828_Set_Info R828Info; + +// if(pExtra->IsStandardModeSet==NO) +// goto error_status_set_tuner_rf_frequency; + +// R828Info.R828_Standard = (R828_Standard_Type)pExtra->StandardMode; + R828Info.R828_Standard = (R828_Standard_Type)DVB_T_6M; + R828Info.RF_Hz = (UINT32)(RfFreqHz); + R828Info.RF_KHz = (UINT32)(RfFreqHz/1000); + + if(R828_SetFrequency(pTuner, R828Info, NORMAL_MODE) != RT_Success) + return FUNCTION_ERROR; + + return FUNCTION_SUCCESS; +} + +int r820t_SetStandardMode(void *pTuner, int StandardMode) +{ + if(R828_SetStandard(pTuner, (R828_Standard_Type)StandardMode) != RT_Success) + return FUNCTION_ERROR; + + return FUNCTION_SUCCESS; +} + +int r820t_SetStandby(void *pTuner, int LoopThroughType) +{ + + if(R828_Standby(pTuner, (R828_LoopThrough_Type)LoopThroughType) != RT_Success) + return FUNCTION_ERROR; + + return FUNCTION_SUCCESS; +} + +// The following context is implemented for R820T source code. + +/* just reverses the bits of a byte */ +int +r820t_Convert(int InvertNum) +{ + int ReturnNum; + int AddNum; + int BitNum; + int CountNum; + + ReturnNum = 0; + AddNum = 0x80; + BitNum = 0x01; + + for(CountNum = 0;CountNum < 8;CountNum ++) + { + if(BitNum & InvertNum) + ReturnNum += AddNum; + + AddNum /= 2; + BitNum *= 2; + } + + return ReturnNum; +} + +R828_ErrCode +I2C_Write_Len(void *pTuner, R828_I2C_LEN_TYPE *I2C_Info) +{ + unsigned char DeviceAddr; + + unsigned int i, j; + + unsigned char RegStartAddr; + unsigned char *pWritingBytes; + unsigned long ByteNum; + + unsigned char WritingBuffer[128]; + unsigned long WritingByteNum, WritingByteNumMax, WritingByteNumRem; + unsigned char RegWritingAddr; + + // Get regiser start address, writing bytes, and byte number. + RegStartAddr = I2C_Info->RegAddr; + pWritingBytes = I2C_Info->Data; + ByteNum = (unsigned long)I2C_Info->Len; + + // Calculate maximum writing byte number. +// WritingByteNumMax = pBaseInterface->I2cWritingByteNumMax - LEN_1_BYTE; + WritingByteNumMax = 2 - 1; //9 orig + + // Set tuner register bytes with writing bytes. + // Note: Set tuner register bytes considering maximum writing byte number. + for(i = 0; i < ByteNum; i += WritingByteNumMax) + { + // Set register writing address. + RegWritingAddr = RegStartAddr + i; + + // Calculate remainder writing byte number. + WritingByteNumRem = ByteNum - i; + + // Determine writing byte number. + WritingByteNum = (WritingByteNumRem > WritingByteNumMax) ? WritingByteNumMax : WritingByteNumRem; + + // Set writing buffer. + // Note: The I2C format of tuner register byte setting is as follows: + // start_bit + (DeviceAddr | writing_bit) + RegWritingAddr + writing_bytes (WritingByteNum bytes) + + // stop_bit + WritingBuffer[0] = RegWritingAddr; + + for(j = 0; j < WritingByteNum; j++) + WritingBuffer[j+1] = pWritingBytes[i + j]; + + // Set tuner register bytes with writing buffer. +// if(pI2cBridge->ForwardI2cWritingCmd(pI2cBridge, DeviceAddr, WritingBuffer, WritingByteNum + LEN_1_BYTE) != +// FUNCTION_SUCCESS) +// goto error_status_set_tuner_registers; + + if (rtlsdr_i2c_write_fn(pTuner, R820T_I2C_ADDR, WritingBuffer, WritingByteNum + 1) < 0) + return RT_Fail; + } + + return RT_Success; +} + +R828_ErrCode +I2C_Read_Len(void *pTuner, R828_I2C_LEN_TYPE *I2C_Info) +{ + uint8_t DeviceAddr; + + unsigned int i; + + uint8_t RegStartAddr; + uint8_t ReadingBytes[128]; + unsigned long ByteNum; + + // Get regiser start address, writing bytes, and byte number. + RegStartAddr = 0x00; + ByteNum = (unsigned long)I2C_Info->Len; + + // Set tuner register reading address. + // Note: The I2C format of tuner register reading address setting is as follows: + // start_bit + (DeviceAddr | writing_bit) + RegReadingAddr + stop_bit +// if(pI2cBridge->ForwardI2cWritingCmd(pI2cBridge, DeviceAddr, &RegStartAddr, LEN_1_BYTE) != FUNCTION_SUCCESS) +// goto error_status_set_tuner_register_reading_address; + + if (rtlsdr_i2c_write_fn(pTuner, R820T_I2C_ADDR, &RegStartAddr, 1) < 0) + return RT_Fail; + + // Get tuner register bytes. + // Note: The I2C format of tuner register byte getting is as follows: + // start_bit + (DeviceAddr | reading_bit) + reading_bytes (ReadingByteNum bytes) + stop_bit +// if(pI2cBridge->ForwardI2cReadingCmd(pI2cBridge, DeviceAddr, ReadingBytes, ByteNum) != FUNCTION_SUCCESS) +// goto error_status_get_tuner_registers; + + if (rtlsdr_i2c_read_fn(pTuner, R820T_I2C_ADDR, ReadingBytes, ByteNum) < 0) + return RT_Fail; + + for(i = 0; i<ByteNum; i++) + { + I2C_Info->Data[i] = (UINT8)r820t_Convert(ReadingBytes[i]); + } + + + return RT_Success; + + +error_status_get_tuner_registers: +error_status_set_tuner_register_reading_address: + + return RT_Fail; +} + +R828_ErrCode +I2C_Write(void *pTuner, R828_I2C_TYPE *I2C_Info) +{ + uint8_t WritingBuffer[2]; + + // Set writing bytes. + // Note: The I2C format of tuner register byte setting is as follows: + // start_bit + (DeviceAddr | writing_bit) + addr + data + stop_bit + WritingBuffer[0] = I2C_Info->RegAddr; + WritingBuffer[1] = I2C_Info->Data; + + // Set tuner register bytes with writing buffer. +// if(pI2cBridge->ForwardI2cWritingCmd(pI2cBridge, DeviceAddr, WritingBuffer, LEN_2_BYTE) != FUNCTION_SUCCESS) +// goto error_status_set_tuner_registers; + +// printf("called %s: %02x -> %02x\n", __FUNCTION__, WritingBuffer[0], WritingBuffer[1]); + + if (rtlsdr_i2c_write_fn(pTuner, R820T_I2C_ADDR, WritingBuffer, 2) < 0) + return RT_Fail; + + return RT_Success; +} + +void +R828_Delay_MS( + void *pTuner, + unsigned long WaitTimeMs + ) +{ + /* simply don't wait for now */ + return; +} + +//----------------------------------------------------- +// +// Filename: R820T.c +// +// This file is R820T tuner driver +// Copyright 2011 by Rafaelmicro., Inc. +// +//----------------------------------------------------- + + +//#include "stdafx.h" +//#include "R828.h" +//#include "..\I2C_Sys.h" + + +#if(TUNER_CLK_OUT==TRUE) //enable tuner clk output for share Xtal application +UINT8 R828_iniArry[27] = {0x83, 0x32, 0x75, 0xC0, 0x40, 0xD6, 0x6C, 0xF5, 0x63, + /* 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D */ + + 0x75, 0x68, 0x6C, 0x83, 0x80, 0x00, 0x0F, 0x00, 0xC0,//xtal_check + /* 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 */ + + 0x30, 0x48, 0xCC, 0x60, 0x00, 0x54, 0xAE, 0x4A, 0xC0}; + /* 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F */ +#else +UINT8 R828_iniArry[27] = {0x83, 0x32, 0x75, 0xC0, 0x40, 0xD6, 0x6C, 0xF5, 0x63, + /* 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D */ + + 0x75, 0x78, 0x6C, 0x83, 0x80, 0x00, 0x0F, 0x00, 0xC0,//xtal_check + /* 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 */ + + 0x30, 0x48, 0xCC, 0x60, 0x00, 0x54, 0xAE, 0x4A, 0xC0}; + /* 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F */ +#endif + +UINT8 R828_ADDRESS=0x34; +UINT8 Rafael_Chip = R820T; +//----------------------------------------------------------// +// Internal Structs // +//----------------------------------------------------------// +typedef struct _R828_SectType +{ + UINT8 Phase_Y; + UINT8 Gain_X; + UINT16 Value; +}R828_SectType; + +typedef enum _BW_Type +{ + BW_6M = 0, + BW_7M, + BW_8M, + BW_1_7M, + BW_10M, + BW_200K +}BW_Type; + +typedef struct _Sys_Info_Type +{ + UINT16 IF_KHz; + BW_Type BW; + UINT32 FILT_CAL_LO; + UINT8 FILT_GAIN; + UINT8 IMG_R; + UINT8 FILT_Q; + UINT8 HP_COR; + UINT8 EXT_ENABLE; + UINT8 LOOP_THROUGH; + UINT8 LT_ATT; + UINT8 FLT_EXT_WIDEST; + UINT8 POLYFIL_CUR; +}Sys_Info_Type; + +typedef struct _Freq_Info_Type +{ + UINT8 OPEN_D; + UINT8 RF_MUX_PLOY; + UINT8 TF_C; + UINT8 XTAL_CAP20P; + UINT8 XTAL_CAP10P; + UINT8 XTAL_CAP0P; + UINT8 IMR_MEM; +}Freq_Info_Type; + +typedef struct _SysFreq_Info_Type +{ + UINT8 LNA_TOP; + UINT8 LNA_VTH_L; + UINT8 MIXER_TOP; + UINT8 MIXER_VTH_L; + UINT8 AIR_CABLE1_IN; + UINT8 CABLE2_IN; + UINT8 PRE_DECT; + UINT8 LNA_DISCHARGE; + UINT8 CP_CUR; + UINT8 DIV_BUF_CUR; + UINT8 FILTER_CUR; +}SysFreq_Info_Type; + +//----------------------------------------------------------// +// Internal Parameters // +//----------------------------------------------------------// +enum XTAL_CAP_VALUE +{ + XTAL_LOW_CAP_30P = 0, + XTAL_LOW_CAP_20P, + XTAL_LOW_CAP_10P, + XTAL_LOW_CAP_0P, + XTAL_HIGH_CAP_0P +}; +UINT8 R828_Arry[27]; +R828_SectType IMR_Data[5] = { + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0} + };//Please keep this array data for standby mode. +R828_I2C_TYPE R828_I2C; +R828_I2C_LEN_TYPE R828_I2C_Len; + +UINT32 R828_IF_khz; +UINT32 R828_CAL_LO_khz; +UINT8 R828_IMR_point_num; +UINT8 R828_IMR_done_flag = FALSE; +UINT8 R828_Fil_Cal_flag[STD_SIZE]; +static UINT8 R828_Fil_Cal_code[STD_SIZE]; + +static UINT8 Xtal_cap_sel = XTAL_LOW_CAP_0P; +static UINT8 Xtal_cap_sel_tmp = XTAL_LOW_CAP_0P; +//----------------------------------------------------------// +// Internal static struct // +//----------------------------------------------------------// +static SysFreq_Info_Type SysFreq_Info1; +static Sys_Info_Type Sys_Info1; +//static Freq_Info_Type R828_Freq_Info; +static Freq_Info_Type Freq_Info1; +//----------------------------------------------------------// +// Internal Functions // +//----------------------------------------------------------// +R828_ErrCode R828_Xtal_Check(void *pTuner); +R828_ErrCode R828_InitReg(void *pTuner); +R828_ErrCode R828_IMR_Prepare(void *pTuner); +R828_ErrCode R828_IMR(void *pTuner, UINT8 IMR_MEM, int IM_Flag); +R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Standard); +R828_ErrCode R828_MUX(void *pTuner, UINT32 RF_KHz); +R828_ErrCode R828_IQ(void *pTuner, R828_SectType* IQ_Pont); +R828_ErrCode R828_IQ_Tree(void *pTuner, UINT8 FixPot, UINT8 FlucPot, UINT8 PotReg, R828_SectType* CompareTree); +R828_ErrCode R828_CompreCor(R828_SectType* CorArry); +R828_ErrCode R828_CompreStep(void *pTuner, R828_SectType* StepArry, UINT8 Pace); +R828_ErrCode R828_Muti_Read(void *pTuner, UINT8 IMR_Reg, UINT16* IMR_Result_Data); +R828_ErrCode R828_Section(void *pTuner, R828_SectType* SectionArry); +R828_ErrCode R828_F_IMR(void *pTuner, R828_SectType* IQ_Pont); +R828_ErrCode R828_IMR_Cross(void *pTuner, R828_SectType* IQ_Pont, UINT8* X_Direct); + +Sys_Info_Type R828_Sys_Sel(R828_Standard_Type R828_Standard); +Freq_Info_Type R828_Freq_Sel(UINT32 RF_freq); +SysFreq_Info_Type R828_SysFreq_Sel(R828_Standard_Type R828_Standard,UINT32 RF_freq); + +R828_ErrCode R828_Filt_Cal(void *pTuner, UINT32 Cal_Freq,BW_Type R828_BW); +//R828_ErrCode R828_SetFrequency(void *pTuner, R828_Set_Info R828_INFO, R828_SetFreq_Type R828_SetFreqMode); + +Sys_Info_Type R828_Sys_Sel(R828_Standard_Type R828_Standard) +{ + Sys_Info_Type R828_Sys_Info; + + switch (R828_Standard) + { + + case DVB_T_6M: + case DVB_T2_6M: + R828_Sys_Info.IF_KHz=3570; + R828_Sys_Info.BW=BW_6M; + R828_Sys_Info.FILT_CAL_LO=56000; //52000->56000 + R828_Sys_Info.FILT_GAIN=0x10; //+3dB, 6MHz on + R828_Sys_Info.IMG_R=0x00; //image negative + R828_Sys_Info.FILT_Q=0x10; //R10[4]:low Q(1'b1) + R828_Sys_Info.HP_COR=0x6B; // 1.7M disable, +2cap, 1.0MHz + R828_Sys_Info.EXT_ENABLE=0x60; //R30[6]=1 ext enable; R30[5]:1 ext at LNA max-1 + R828_Sys_Info.LOOP_THROUGH=0x00; //R5[7], LT ON + R828_Sys_Info.LT_ATT=0x00; //R31[7], LT ATT enable + R828_Sys_Info.FLT_EXT_WIDEST=0x00;//R15[7]: FLT_EXT_WIDE OFF + R828_Sys_Info.POLYFIL_CUR=0x60; //R25[6:5]:Min + break; + + case DVB_T_7M: + case DVB_T2_7M: + R828_Sys_Info.IF_KHz=4070; + R828_Sys_Info.BW=BW_7M; + R828_Sys_Info.FILT_CAL_LO=60000; + R828_Sys_Info.FILT_GAIN=0x10; //+3dB, 6MHz on + R828_Sys_Info.IMG_R=0x00; //image negative + R828_Sys_Info.FILT_Q=0x10; //R10[4]:low Q(1'b1) + R828_Sys_Info.HP_COR=0x2B; // 1.7M disable, +1cap, 1.0MHz + R828_Sys_Info.EXT_ENABLE=0x60; //R30[6]=1 ext enable; R30[5]:1 ext at LNA max-1 + R828_Sys_Info.LOOP_THROUGH=0x00; //R5[7], LT ON + R828_Sys_Info.LT_ATT=0x00; //R31[7], LT ATT enable + R828_Sys_Info.FLT_EXT_WIDEST=0x00;//R15[7]: FLT_EXT_WIDE OFF + R828_Sys_Info.POLYFIL_CUR=0x60; //R25[6:5]:Min + break; + + case DVB_T_7M_2: + case DVB_T2_7M_2: + R828_Sys_Info.IF_KHz=4570; + R828_Sys_Info.BW=BW_7M; + R828_Sys_Info.FILT_CAL_LO=63000; + R828_Sys_Info.FILT_GAIN=0x10; //+3dB, 6MHz on + R828_Sys_Info.IMG_R=0x00; //image negative + R828_Sys_Info.FILT_Q=0x10; //R10[4]:low Q(1'b1) + R828_Sys_Info.HP_COR=0x2A; // 1.7M disable, +1cap, 1.25MHz + R828_Sys_Info.EXT_ENABLE=0x60; //R30[6]=1 ext enable; R30[5]:1 ext at LNA max-1 + R828_Sys_Info.LOOP_THROUGH=0x00; //R5[7], LT ON + R828_Sys_Info.LT_ATT=0x00; //R31[7], LT ATT enable + R828_Sys_Info.FLT_EXT_WIDEST=0x00;//R15[7]: FLT_EXT_WIDE OFF + R828_Sys_Info.POLYFIL_CUR=0x60; //R25[6:5]:Min + break; + + case DVB_T_8M: + case DVB_T2_8M: + R828_Sys_Info.IF_KHz=4570; + R828_Sys_Info.BW=BW_8M; + R828_Sys_Info.FILT_CAL_LO=68500; + R828_Sys_Info.FILT_GAIN=0x10; //+3dB, 6MHz on + R828_Sys_Info.IMG_R=0x00; //image negative + R828_Sys_Info.FILT_Q=0x10; //R10[4]:low Q(1'b1) + R828_Sys_Info.HP_COR=0x0B; // 1.7M disable, +0cap, 1.0MHz + R828_Sys_Info.EXT_ENABLE=0x60; //R30[6]=1 ext enable; R30[5]:1 ext at LNA max-1 + R828_Sys_Info.LOOP_THROUGH=0x00; //R5[7], LT ON + R828_Sys_Info.LT_ATT=0x00; //R31[7], LT ATT enable + R828_Sys_Info.FLT_EXT_WIDEST=0x00;//R15[7]: FLT_EXT_WIDE OFF + R828_Sys_Info.POLYFIL_CUR=0x60; //R25[6:5]:Min + break; + + case ISDB_T: + R828_Sys_Info.IF_KHz=4063; + R828_Sys_Info.BW=BW_6M; + R828_Sys_Info.FILT_CAL_LO=59000; + R828_Sys_Info.FILT_GAIN=0x10; //+3dB, 6MHz on + R828_Sys_Info.IMG_R=0x00; //image negative + R828_Sys_Info.FILT_Q=0x10; //R10[4]:low Q(1'b1) + R828_Sys_Info.HP_COR=0x6A; // 1.7M disable, +2cap, 1.25MHz + R828_Sys_Info.EXT_ENABLE=0x40; //R30[6], ext enable; R30[5]:0 ext at LNA max + R828_Sys_Info.LOOP_THROUGH=0x00; //R5[7], LT ON + R828_Sys_Info.LT_ATT=0x00; //R31[7], LT ATT enable + R828_Sys_Info.FLT_EXT_WIDEST=0x00;//R15[7]: FLT_EXT_WIDE OFF + R828_Sys_Info.POLYFIL_CUR=0x60; //R25[6:5]:Min + break; + + default: //DVB_T_8M + R828_Sys_Info.IF_KHz=4570; + R828_Sys_Info.BW=BW_8M; + R828_Sys_Info.FILT_CAL_LO=68500; + R828_Sys_Info.FILT_GAIN=0x10; //+3dB, 6MHz on + R828_Sys_Info.IMG_R=0x00; //image negative + R828_Sys_Info.FILT_Q=0x10; //R10[4]:low Q(1'b1) + R828_Sys_Info.HP_COR=0x0D; // 1.7M disable, +0cap, 0.7MHz + R828_Sys_Info.EXT_ENABLE=0x60; //R30[6]=1 ext enable; R30[5]:1 ext at LNA max-1 + R828_Sys_Info.LOOP_THROUGH=0x00; //R5[7], LT ON + R828_Sys_Info.LT_ATT=0x00; //R31[7], LT ATT enable + R828_Sys_Info.FLT_EXT_WIDEST=0x00;//R15[7]: FLT_EXT_WIDE OFF + R828_Sys_Info.POLYFIL_CUR=0x60; //R25[6:5]:Min + break; + + } + + return R828_Sys_Info; +} + +Freq_Info_Type R828_Freq_Sel(UINT32 LO_freq) +{ + Freq_Info_Type R828_Freq_Info; + + if(LO_freq<50000) + { + R828_Freq_Info.OPEN_D=0x08; // low + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0xDF; //R27[7:0] band2,band0 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + + else if(LO_freq>=50000 && LO_freq<55000) + { + R828_Freq_Info.OPEN_D=0x08; // low + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0xBE; //R27[7:0] band4,band1 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=55000 && LO_freq<60000) + { + R828_Freq_Info.OPEN_D=0x08; // low + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x8B; //R27[7:0] band7,band4 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=60000 && LO_freq<65000) + { + R828_Freq_Info.OPEN_D=0x08; // low + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x7B; //R27[7:0] band8,band4 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=65000 && LO_freq<70000) + { + R828_Freq_Info.OPEN_D=0x08; // low + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x69; //R27[7:0] band9,band6 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=70000 && LO_freq<75000) + { + R828_Freq_Info.OPEN_D=0x08; // low + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x58; //R27[7:0] band10,band7 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=75000 && LO_freq<80000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x44; //R27[7:0] band11,band11 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=80000 && LO_freq<90000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x44; //R27[7:0] band11,band11 + R828_Freq_Info.XTAL_CAP20P=0x02; //R16[1:0] 20pF (10) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=90000 && LO_freq<100000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x34; //R27[7:0] band12,band11 + R828_Freq_Info.XTAL_CAP20P=0x01; //R16[1:0] 10pF (01) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=100000 && LO_freq<110000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x34; //R27[7:0] band12,band11 + R828_Freq_Info.XTAL_CAP20P=0x01; //R16[1:0] 10pF (01) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 0; + } + else if( LO_freq>=110000 && LO_freq<120000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x24; //R27[7:0] band13,band11 + R828_Freq_Info.XTAL_CAP20P=0x01; //R16[1:0] 10pF (01) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 1; + } + else if( LO_freq>=120000 && LO_freq<140000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x24; //R27[7:0] band13,band11 + R828_Freq_Info.XTAL_CAP20P=0x01; //R16[1:0] 10pF (01) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 1; + } + else if( LO_freq>=140000 && LO_freq<180000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x14; //R27[7:0] band14,band11 + R828_Freq_Info.XTAL_CAP20P=0x01; //R16[1:0] 10pF (01) + R828_Freq_Info.XTAL_CAP10P=0x01; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 1; + } + else if( LO_freq>=180000 && LO_freq<220000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x13; //R27[7:0] band14,band12 + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 1; + } + else if( LO_freq>=220000 && LO_freq<250000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x13; //R27[7:0] band14,band12 + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 2; + } + else if( LO_freq>=250000 && LO_freq<280000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x11; //R27[7:0] highest,highest + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 2; + } + else if( LO_freq>=280000 && LO_freq<310000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x02; //R26[7:6]=0 (LPF) R26[1:0]=2 (low) + R828_Freq_Info.TF_C=0x00; //R27[7:0] highest,highest + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 2; + } + else if( LO_freq>=310000 && LO_freq<450000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x41; //R26[7:6]=1 (bypass) R26[1:0]=1 (middle) + R828_Freq_Info.TF_C=0x00; //R27[7:0] highest,highest + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 2; + } + else if( LO_freq>=450000 && LO_freq<588000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x41; //R26[7:6]=1 (bypass) R26[1:0]=1 (middle) + R828_Freq_Info.TF_C=0x00; //R27[7:0] highest,highest + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 3; + } + else if( LO_freq>=588000 && LO_freq<650000) + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x40; //R26[7:6]=1 (bypass) R26[1:0]=0 (highest) + R828_Freq_Info.TF_C=0x00; //R27[7:0] highest,highest + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 3; + } + else + { + R828_Freq_Info.OPEN_D=0x00; // high + R828_Freq_Info.RF_MUX_PLOY = 0x40; //R26[7:6]=1 (bypass) R26[1:0]=0 (highest) + R828_Freq_Info.TF_C=0x00; //R27[7:0] highest,highest + R828_Freq_Info.XTAL_CAP20P=0x00; //R16[1:0] 0pF (00) + R828_Freq_Info.XTAL_CAP10P=0x00; + R828_Freq_Info.XTAL_CAP0P=0x00; + R828_Freq_Info.IMR_MEM = 4; + } + + return R828_Freq_Info; +} + +SysFreq_Info_Type R828_SysFreq_Sel(R828_Standard_Type R828_Standard,UINT32 RF_freq) +{ + SysFreq_Info_Type R828_SysFreq_Info; + + switch(R828_Standard) + { + + case DVB_T_6M: + case DVB_T_7M: + case DVB_T_7M_2: + case DVB_T_8M: + if( (RF_freq==506000) || (RF_freq==666000) || (RF_freq==818000) ) + { + R828_SysFreq_Info.MIXER_TOP=0x14; // MIXER TOP:14 , TOP-1, low-discharge + R828_SysFreq_Info.LNA_TOP=0xE5; // Detect BW 3, LNA TOP:4, PreDet Top:2 + R828_SysFreq_Info.CP_CUR=0x28; //101, 0.2 + R828_SysFreq_Info.DIV_BUF_CUR=0x20; // 10, 200u + } + else + { + R828_SysFreq_Info.MIXER_TOP=0x24; // MIXER TOP:13 , TOP-1, low-discharge + R828_SysFreq_Info.LNA_TOP=0xE5; // Detect BW 3, LNA TOP:4, PreDet Top:2 + R828_SysFreq_Info.CP_CUR=0x38; // 111, auto + R828_SysFreq_Info.DIV_BUF_CUR=0x30; // 11, 150u + } + R828_SysFreq_Info.LNA_VTH_L=0x53; // LNA VTH 0.84 , VTL 0.64 + R828_SysFreq_Info.MIXER_VTH_L=0x75; // MIXER VTH 1.04, VTL 0.84 + R828_SysFreq_Info.AIR_CABLE1_IN=0x00; + R828_SysFreq_Info.CABLE2_IN=0x00; + R828_SysFreq_Info.PRE_DECT=0x40; + R828_SysFreq_Info.LNA_DISCHARGE=14; + R828_SysFreq_Info.FILTER_CUR=0x40; // 10, low + break; + + + case DVB_T2_6M: + case DVB_T2_7M: + case DVB_T2_7M_2: + case DVB_T2_8M: + R828_SysFreq_Info.MIXER_TOP=0x24; // MIXER TOP:13 , TOP-1, low-discharge + R828_SysFreq_Info.LNA_TOP=0xE5; // Detect BW 3, LNA TOP:4, PreDet Top:2 + R828_SysFreq_Info.LNA_VTH_L=0x53; // LNA VTH 0.84 , VTL 0.64 + R828_SysFreq_Info.MIXER_VTH_L=0x75; // MIXER VTH 1.04, VTL 0.84 + R828_SysFreq_Info.AIR_CABLE1_IN=0x00; + R828_SysFreq_Info.CABLE2_IN=0x00; + R828_SysFreq_Info.PRE_DECT=0x40; + R828_SysFreq_Info.LNA_DISCHARGE=14; + R828_SysFreq_Info.CP_CUR=0x38; // 111, auto + R828_SysFreq_Info.DIV_BUF_CUR=0x30; // 11, 150u + R828_SysFreq_Info.FILTER_CUR=0x40; // 10, low + break; + + case ISDB_T: + R828_SysFreq_Info.MIXER_TOP=0x24; // MIXER TOP:13 , TOP-1, low-discharge + R828_SysFreq_Info.LNA_TOP=0xE5; // Detect BW 3, LNA TOP:4, PreDet Top:2 + R828_SysFreq_Info.LNA_VTH_L=0x75; // LNA VTH 1.04 , VTL 0.84 + R828_SysFreq_Info.MIXER_VTH_L=0x75; // MIXER VTH 1.04, VTL 0.84 + R828_SysFreq_Info.AIR_CABLE1_IN=0x00; + R828_SysFreq_Info.CABLE2_IN=0x00; + R828_SysFreq_Info.PRE_DECT=0x40; + R828_SysFreq_Info.LNA_DISCHARGE=14; + R828_SysFreq_Info.CP_CUR=0x38; // 111, auto + R828_SysFreq_Info.DIV_BUF_CUR=0x30; // 11, 150u + R828_SysFreq_Info.FILTER_CUR=0x40; // 10, low + break; + + default: //DVB-T 8M + R828_SysFreq_Info.MIXER_TOP=0x24; // MIXER TOP:13 , TOP-1, low-discharge + R828_SysFreq_Info.LNA_TOP=0xE5; // Detect BW 3, LNA TOP:4, PreDet Top:2 + R828_SysFreq_Info.LNA_VTH_L=0x53; // LNA VTH 0.84 , VTL 0.64 + R828_SysFreq_Info.MIXER_VTH_L=0x75; // MIXER VTH 1.04, VTL 0.84 + R828_SysFreq_Info.AIR_CABLE1_IN=0x00; + R828_SysFreq_Info.CABLE2_IN=0x00; + R828_SysFreq_Info.PRE_DECT=0x40; + R828_SysFreq_Info.LNA_DISCHARGE=14; + R828_SysFreq_Info.CP_CUR=0x38; // 111, auto + R828_SysFreq_Info.DIV_BUF_CUR=0x30; // 11, 150u + R828_SysFreq_Info.FILTER_CUR=0x40; // 10, low + break; + + } //end switch + +//DTV use Diplexer +#if(USE_DIPLEXER==TRUE) +if ((Rafael_Chip==R820C) || (Rafael_Chip==R820T) || (Rafael_Chip==R828S)) +{ + // Air-in (>=DIP_FREQ) & cable-1(<DIP_FREQ) + if(RF_freq >= DIP_FREQ) + { + R828_SysFreq_Info.AIR_CABLE1_IN = 0x00; //air in, cable-1 off + R828_SysFreq_Info.CABLE2_IN = 0x00; //cable-2 off + } + else + { + R828_SysFreq_Info.AIR_CABLE1_IN = 0x60; //cable-1 in, air off + R828_SysFreq_Info.CABLE2_IN = 0x00; //cable-2 off + } +} +#endif + return R828_SysFreq_Info; + + } + +R828_ErrCode R828_Xtal_Check(void *pTuner) +{ + UINT8 ArrayNum; + + ArrayNum = 27; + for(ArrayNum=0;ArrayNum<27;ArrayNum++) + { + R828_Arry[ArrayNum] = R828_iniArry[ArrayNum]; + } + + //cap 30pF & Drive Low + R828_I2C.RegAddr = 0x10; + R828_Arry[11] = (R828_Arry[11] & 0xF4) | 0x0B ; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //set pll autotune = 128kHz + R828_I2C.RegAddr = 0x1A; + R828_Arry[21] = R828_Arry[21] & 0xF3; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //set manual initial reg = 111111; + R828_I2C.RegAddr = 0x13; + R828_Arry[14] = (R828_Arry[14] & 0x80) | 0x7F; + R828_I2C.Data = R828_Arry[14]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //set auto + R828_I2C.RegAddr = 0x13; + R828_Arry[14] = (R828_Arry[14] & 0xBF); + R828_I2C.Data = R828_Arry[14]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Delay_MS(pTuner, 5); + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 3; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + // if 30pF unlock, set to cap 20pF +#if (USE_16M_XTAL==TRUE) + //VCO=2360MHz for 16M Xtal. VCO band 26 + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) > 29) || ((R828_I2C_Len.Data[2] & 0x3F) < 23)) +#else + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) == 0x3F)) +#endif + { + //cap 20pF + R828_I2C.RegAddr = 0x10; + R828_Arry[11] = (R828_Arry[11] & 0xFC) | 0x02; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Delay_MS(pTuner, 5); + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 3; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + // if 20pF unlock, set to cap 10pF +#if (USE_16M_XTAL==TRUE) + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) > 29) || ((R828_I2C_Len.Data[2] & 0x3F) < 23)) +#else + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) == 0x3F)) +#endif + { + //cap 10pF + R828_I2C.RegAddr = 0x10; + R828_Arry[11] = (R828_Arry[11] & 0xFC) | 0x01; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Delay_MS(pTuner, 5); + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 3; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + // if 10pF unlock, set to cap 0pF +#if (USE_16M_XTAL==TRUE) + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) > 29) || ((R828_I2C_Len.Data[2] & 0x3F) < 23)) +#else + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) == 0x3F)) +#endif + { + //cap 0pF + R828_I2C.RegAddr = 0x10; + R828_Arry[11] = (R828_Arry[11] & 0xFC) | 0x00; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Delay_MS(pTuner, 5); + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 3; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + // if unlock, set to high drive +#if (USE_16M_XTAL==TRUE) + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) > 29) || ((R828_I2C_Len.Data[2] & 0x3F) < 23)) +#else + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) == 0x3F)) +#endif + { + //X'tal drive high + R828_I2C.RegAddr = 0x10; + R828_Arry[11] = (R828_Arry[11] & 0xF7) ; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //R828_Delay_MS(15); + R828_Delay_MS(pTuner, 20); + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 3; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + +#if (USE_16M_XTAL==TRUE) + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) > 29) || ((R828_I2C_Len.Data[2] & 0x3F) < 23)) +#else + if(((R828_I2C_Len.Data[2] & 0x40) == 0x00) || ((R828_I2C_Len.Data[2] & 0x3F) == 0x3F)) +#endif + { + return RT_Fail; + } + else //0p+high drive lock + { + Xtal_cap_sel_tmp = XTAL_HIGH_CAP_0P; + } + } + else //0p lock + { + Xtal_cap_sel_tmp = XTAL_LOW_CAP_0P; + } + } + else //10p lock + { + Xtal_cap_sel_tmp = XTAL_LOW_CAP_10P; + } + } + else //20p lock + { + Xtal_cap_sel_tmp = XTAL_LOW_CAP_20P; + } + } + else // 30p lock + { + Xtal_cap_sel_tmp = XTAL_LOW_CAP_30P; + } + + return RT_Success; +} +R828_ErrCode R828_Init(void *pTuner) +{ +// R820T_EXTRA_MODULE *pExtra; + UINT8 i; + + // Get tuner extra module. +// pExtra = &(pTuner->Extra.R820t); + + //write initial reg + //if(R828_InitReg(pTuner) != RT_Success) + // return RT_Fail; + + if(R828_IMR_done_flag==FALSE) + { + + //write initial reg +// if(R828_InitReg(pTuner) != RT_Success) +// return RT_Fail; + + //Do Xtal check + if((Rafael_Chip==R820T) || (Rafael_Chip==R828S) || (Rafael_Chip==R820C)) + { + Xtal_cap_sel = XTAL_HIGH_CAP_0P; + } + else + { + if(R828_Xtal_Check(pTuner) != RT_Success) //1st + return RT_Fail; + + Xtal_cap_sel = Xtal_cap_sel_tmp; + + if(R828_Xtal_Check(pTuner) != RT_Success) //2nd + return RT_Fail; + + if(Xtal_cap_sel_tmp > Xtal_cap_sel) + { + Xtal_cap_sel = Xtal_cap_sel_tmp; + } + + if(R828_Xtal_Check(pTuner) != RT_Success) //3rd + return RT_Fail; + + if(Xtal_cap_sel_tmp > Xtal_cap_sel) + { + Xtal_cap_sel = Xtal_cap_sel_tmp; + } + + } + + //reset filter cal. + for (i=0; i<STD_SIZE; i++) + { + R828_Fil_Cal_flag[i] = FALSE; + R828_Fil_Cal_code[i] = 0; + } + +#if 0 + //start imr cal. + if(R828_InitReg(pTuner) != RT_Success) //write initial reg before doing cal + return RT_Fail; + + if(R828_IMR_Prepare(pTuner) != RT_Success) + return RT_Fail; + + if(R828_IMR(pTuner, 3, TRUE) != RT_Success) //Full K node 3 + return RT_Fail; + + if(R828_IMR(pTuner, 1, FALSE) != RT_Success) + return RT_Fail; + + if(R828_IMR(pTuner, 0, FALSE) != RT_Success) + return RT_Fail; + + if(R828_IMR(pTuner, 2, FALSE) != RT_Success) + return RT_Fail; + + if(R828_IMR(pTuner, 4, FALSE) != RT_Success) + return RT_Fail; + + R828_IMR_done_flag = TRUE; +#endif + } + + //write initial reg + if(R828_InitReg(pTuner) != RT_Success) + return RT_Fail; + + return RT_Success; +} + + + +R828_ErrCode R828_InitReg(void *pTuner) +{ + UINT8 InitArryCount; + UINT8 InitArryNum; + + InitArryCount = 0; + InitArryNum = 27; + + //UINT32 LO_KHz = 0; + + //Write Full Table + R828_I2C_Len.RegAddr = 0x05; + R828_I2C_Len.Len = InitArryNum; + for(InitArryCount = 0;InitArryCount < InitArryNum;InitArryCount ++) + { + R828_I2C_Len.Data[InitArryCount] = R828_iniArry[InitArryCount]; + } + if(I2C_Write_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + return RT_Success; +} + + +R828_ErrCode R828_IMR_Prepare(void *pTuner) + +{ + UINT8 ArrayNum; + + ArrayNum=27; + + for(ArrayNum=0;ArrayNum<27;ArrayNum++) + { + R828_Arry[ArrayNum] = R828_iniArry[ArrayNum]; + } + //IMR Preparation + //lna off (air-in off) + R828_I2C.RegAddr = 0x05; + R828_Arry[0] = R828_Arry[0] | 0x20; + R828_I2C.Data = R828_Arry[0]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //mixer gain mode = manual + R828_I2C.RegAddr = 0x07; + R828_Arry[2] = (R828_Arry[2] & 0xEF); + R828_I2C.Data = R828_Arry[2]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //filter corner = lowest + R828_I2C.RegAddr = 0x0A; + R828_Arry[5] = R828_Arry[5] | 0x0F; + R828_I2C.Data = R828_Arry[5]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //filter bw=+2cap, hp=5M + R828_I2C.RegAddr = 0x0B; + R828_Arry[6] = (R828_Arry[6] & 0x90) | 0x60; + R828_I2C.Data = R828_Arry[6]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //adc=on, vga code mode, gain = 26.5dB + R828_I2C.RegAddr = 0x0C; + R828_Arry[7] = (R828_Arry[7] & 0x60) | 0x0B; + R828_I2C.Data = R828_Arry[7]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //ring clk = on + R828_I2C.RegAddr = 0x0F; + R828_Arry[10] &= 0xF7; + R828_I2C.Data = R828_Arry[10]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //ring power = on + R828_I2C.RegAddr = 0x18; + R828_Arry[19] = R828_Arry[19] | 0x10; + R828_I2C.Data = R828_Arry[19]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //from ring = ring pll in + R828_I2C.RegAddr = 0x1C; + R828_Arry[23] = R828_Arry[23] | 0x02; + R828_I2C.Data = R828_Arry[23]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //sw_pdect = det3 + R828_I2C.RegAddr = 0x1E; + R828_Arry[25] = R828_Arry[25] | 0x80; + R828_I2C.Data = R828_Arry[25]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + // Set filt_3dB + R828_Arry[1] = R828_Arry[1] | 0x20; + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; +} + +R828_ErrCode R828_IMR(void *pTuner, UINT8 IMR_MEM, int IM_Flag) +{ + + UINT32 RingVCO; + UINT32 RingFreq; + UINT32 RingRef; + UINT8 n_ring; + UINT8 n; + + R828_SectType IMR_POINT; + + + RingVCO = 0; + RingFreq = 0; + RingRef = 0; + n_ring = 0; + + if (R828_Xtal>24000) + RingRef = R828_Xtal /2; + else + RingRef = R828_Xtal; + + for(n=0;n<16;n++) + { + if((16+n)* 8 * RingRef >= 3100000) + { + n_ring=n; + break; + } + + if(n==15) //n_ring not found + { + //return RT_Fail; + n_ring=n; + } + + } + + R828_Arry[19] &= 0xF0; //set ring[3:0] + R828_Arry[19] |= n_ring; + RingVCO = (16+n_ring)* 8 * RingRef; + R828_Arry[19]&=0xDF; //clear ring_se23 + R828_Arry[20]&=0xFC; //clear ring_seldiv + R828_Arry[26]&=0xFC; //clear ring_att + + switch(IMR_MEM) + { + case 0: + RingFreq = RingVCO/48; + R828_Arry[19]|=0x20; // ring_se23 = 1 + R828_Arry[20]|=0x03; // ring_seldiv = 3 + R828_Arry[26]|=0x02; // ring_att 10 + break; + case 1: + RingFreq = RingVCO/16; + R828_Arry[19]|=0x00; // ring_se23 = 0 + R828_Arry[20]|=0x02; // ring_seldiv = 2 + R828_Arry[26]|=0x00; // pw_ring 00 + break; + case 2: + RingFreq = RingVCO/8; + R828_Arry[19]|=0x00; // ring_se23 = 0 + R828_Arry[20]|=0x01; // ring_seldiv = 1 + R828_Arry[26]|=0x03; // pw_ring 11 + break; + case 3: + RingFreq = RingVCO/6; + R828_Arry[19]|=0x20; // ring_se23 = 1 + R828_Arry[20]|=0x00; // ring_seldiv = 0 + R828_Arry[26]|=0x03; // pw_ring 11 + break; + case 4: + RingFreq = RingVCO/4; + R828_Arry[19]|=0x00; // ring_se23 = 0 + R828_Arry[20]|=0x00; // ring_seldiv = 0 + R828_Arry[26]|=0x01; // pw_ring 01 + break; + default: + RingFreq = RingVCO/4; + R828_Arry[19]|=0x00; // ring_se23 = 0 + R828_Arry[20]|=0x00; // ring_seldiv = 0 + R828_Arry[26]|=0x01; // pw_ring 01 + break; + } + + + //write pw_ring,n_ring,ringdiv2 to I2C + + //------------n_ring,ring_se23----------// + R828_I2C.RegAddr = 0x18; + R828_I2C.Data = R828_Arry[19]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //------------ring_sediv----------------// + R828_I2C.RegAddr = 0x19; + R828_I2C.Data = R828_Arry[20]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + //------------pw_ring-------------------// + R828_I2C.RegAddr = 0x1f; + R828_I2C.Data = R828_Arry[26]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Must do before PLL() + if(R828_MUX(pTuner, RingFreq - 5300) != RT_Success) //MUX input freq ~ RF_in Freq + return RT_Fail; + + if(R828_PLL(pTuner, (RingFreq - 5300) * 1000, STD_SIZE) != RT_Success) //set pll freq = ring freq - 6M + return RT_Fail; + + if(IM_Flag == TRUE) + { + if(R828_IQ(pTuner, &IMR_POINT) != RT_Success) + return RT_Fail; + } + else + { + IMR_POINT.Gain_X = IMR_Data[3].Gain_X; + IMR_POINT.Phase_Y = IMR_Data[3].Phase_Y; + IMR_POINT.Value = IMR_Data[3].Value; + if(R828_F_IMR(pTuner, &IMR_POINT) != RT_Success) + return RT_Fail; + } + + //Save IMR Value + switch(IMR_MEM) + { + case 0: + IMR_Data[0].Gain_X = IMR_POINT.Gain_X; + IMR_Data[0].Phase_Y = IMR_POINT.Phase_Y; + IMR_Data[0].Value = IMR_POINT.Value; + break; + case 1: + IMR_Data[1].Gain_X = IMR_POINT.Gain_X; + IMR_Data[1].Phase_Y = IMR_POINT.Phase_Y; + IMR_Data[1].Value = IMR_POINT.Value; + break; + case 2: + IMR_Data[2].Gain_X = IMR_POINT.Gain_X; + IMR_Data[2].Phase_Y = IMR_POINT.Phase_Y; + IMR_Data[2].Value = IMR_POINT.Value; + break; + case 3: + IMR_Data[3].Gain_X = IMR_POINT.Gain_X; + IMR_Data[3].Phase_Y = IMR_POINT.Phase_Y; + IMR_Data[3].Value = IMR_POINT.Value; + break; + case 4: + IMR_Data[4].Gain_X = IMR_POINT.Gain_X; + IMR_Data[4].Phase_Y = IMR_POINT.Phase_Y; + IMR_Data[4].Value = IMR_POINT.Value; + break; + default: + IMR_Data[4].Gain_X = IMR_POINT.Gain_X; + IMR_Data[4].Phase_Y = IMR_POINT.Phase_Y; + IMR_Data[4].Value = IMR_POINT.Value; + break; + } + return RT_Success; +} + +R828_ErrCode R828_PLL(void *pTuner, UINT32 LO_Freq, R828_Standard_Type R828_Standard) +{ + +// R820T_EXTRA_MODULE *pExtra; + + UINT8 MixDiv; + UINT8 DivBuf; + UINT8 Ni; + UINT8 Si; + UINT8 DivNum; + UINT8 Nint; + UINT32 VCO_Min_kHz; + UINT32 VCO_Max_kHz; + uint64_t VCO_Freq; + UINT32 PLL_Ref; //Max 24000 (kHz) + UINT32 VCO_Fra; //VCO contribution by SDM (kHz) + UINT16 Nsdm; + UINT16 SDM; + UINT16 SDM16to9; + UINT16 SDM8to1; + //UINT8 Judge = 0; + UINT8 VCO_fine_tune; + + MixDiv = 2; + DivBuf = 0; + Ni = 0; + Si = 0; + DivNum = 0; + Nint = 0; + VCO_Min_kHz = 1770000; + VCO_Max_kHz = VCO_Min_kHz*2; + VCO_Freq = 0; + PLL_Ref = 0; //Max 24000 (kHz) + VCO_Fra = 0; //VCO contribution by SDM (kHz) + Nsdm = 2; + SDM = 0; + SDM16to9 = 0; + SDM8to1 = 0; + //UINT8 Judge = 0; + VCO_fine_tune = 0; + +#if 0 + if ((Rafael_Chip==R620D) || (Rafael_Chip==R828D) || (Rafael_Chip==R828)) //X'tal can't not exceed 20MHz for ATV + { + if(R828_Standard <= SECAM_L1) //ref set refdiv2, reffreq = Xtal/2 on ATV application + { + R828_Arry[11] |= 0x10; //b4=1 + PLL_Ref = R828_Xtal /2; + } + else //DTV, FilCal, IMR + { + R828_Arry[11] &= 0xEF; + PLL_Ref = R828_Xtal; + } + } + else + { + if(R828_Xtal > 24000) + { + R828_Arry[11] |= 0x10; //b4=1 + PLL_Ref = R828_Xtal /2; + } + else + { + R828_Arry[11] &= 0xEF; + PLL_Ref = R828_Xtal; + } + } +#endif + //FIXME hack + R828_Arry[11] &= 0xEF; + PLL_Ref = rtlsdr_get_tuner_clock(pTuner); + + R828_I2C.RegAddr = 0x10; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //set pll autotune = 128kHz + R828_I2C.RegAddr = 0x1A; + R828_Arry[21] = R828_Arry[21] & 0xF3; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Set VCO current = 100 + R828_I2C.RegAddr = 0x12; + R828_Arry[13] = (R828_Arry[13] & 0x1F) | 0x80; + R828_I2C.Data = R828_Arry[13]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Divider + while(MixDiv <= 64) + { + if((((LO_Freq/1000) * MixDiv) >= VCO_Min_kHz) && (((LO_Freq/1000) * MixDiv) < VCO_Max_kHz)) + { + DivBuf = MixDiv; + while(DivBuf > 2) + { + DivBuf = DivBuf >> 1; + DivNum ++; + } + break; + } + MixDiv = MixDiv << 1; + } + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 5; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + VCO_fine_tune = (R828_I2C_Len.Data[4] & 0x30)>>4; + + if(VCO_fine_tune > VCO_pwr_ref) + DivNum = DivNum - 1; + else if(VCO_fine_tune < VCO_pwr_ref) + DivNum = DivNum + 1; + + R828_I2C.RegAddr = 0x10; + R828_Arry[11] &= 0x1F; + R828_Arry[11] |= (DivNum << 5); + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + VCO_Freq = (uint64_t)(LO_Freq * (uint64_t)MixDiv); + Nint = (UINT8) (VCO_Freq / 2 / PLL_Ref); + VCO_Fra = (UINT16) ((VCO_Freq - 2 * PLL_Ref * Nint) / 1000); + + //FIXME hack + PLL_Ref /= 1000; + +// printf("VCO_Freq = %lu, Nint= %u, VCO_Fra= %lu, LO_Freq= %u, MixDiv= %u\n", VCO_Freq, Nint, VCO_Fra, LO_Freq, MixDiv); + + //boundary spur prevention + if (VCO_Fra < PLL_Ref/64) //2*PLL_Ref/128 + VCO_Fra = 0; + else if (VCO_Fra > PLL_Ref*127/64) //2*PLL_Ref*127/128 + { + VCO_Fra = 0; + Nint ++; + } + else if((VCO_Fra > PLL_Ref*127/128) && (VCO_Fra < PLL_Ref)) //> 2*PLL_Ref*127/256, < 2*PLL_Ref*128/256 + VCO_Fra = PLL_Ref*127/128; // VCO_Fra = 2*PLL_Ref*127/256 + else if((VCO_Fra > PLL_Ref) && (VCO_Fra < PLL_Ref*129/128)) //> 2*PLL_Ref*128/256, < 2*PLL_Ref*129/256 + VCO_Fra = PLL_Ref*129/128; // VCO_Fra = 2*PLL_Ref*129/256 + else + VCO_Fra = VCO_Fra; + + if (Nint > 63) { + fprintf(stderr, "[R820T] No valid PLL values for %u Hz!\n", LO_Freq); + return RT_Fail; + } + + //N & S + Ni = (Nint - 13) / 4; + Si = Nint - 4 *Ni - 13; + R828_I2C.RegAddr = 0x14; + R828_Arry[15] = 0x00; + R828_Arry[15] |= (Ni + (Si << 6)); + R828_I2C.Data = R828_Arry[15]; + + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //pw_sdm + R828_I2C.RegAddr = 0x12; + R828_Arry[13] &= 0xF7; + if(VCO_Fra == 0) + R828_Arry[13] |= 0x08; + R828_I2C.Data = R828_Arry[13]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //SDM calculator + while(VCO_Fra > 1) + { + if (VCO_Fra > (2*PLL_Ref / Nsdm)) + { + SDM = SDM + 32768 / (Nsdm/2); + VCO_Fra = VCO_Fra - 2*PLL_Ref / Nsdm; + if (Nsdm >= 0x8000) + break; + } + Nsdm = Nsdm << 1; + } + + SDM16to9 = SDM >> 8; + SDM8to1 = SDM - (SDM16to9 << 8); + + R828_I2C.RegAddr = 0x16; + R828_Arry[17] = (UINT8) SDM16to9; + R828_I2C.Data = R828_Arry[17]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + R828_I2C.RegAddr = 0x15; + R828_Arry[16] = (UINT8) SDM8to1; + R828_I2C.Data = R828_Arry[16]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + +// R828_Delay_MS(10); + + if ((Rafael_Chip==R620D) || (Rafael_Chip==R828D) || (Rafael_Chip==R828)) + { + if(R828_Standard <= SECAM_L1) + R828_Delay_MS(pTuner, 20); + else + R828_Delay_MS(pTuner, 10); + } + else + { + R828_Delay_MS(pTuner, 10); + } + + //check PLL lock status + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 3; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + if( (R828_I2C_Len.Data[2] & 0x40) == 0x00 ) + { + fprintf(stderr, "[R820T] PLL not locked for %u Hz!\n", LO_Freq); + R828_I2C.RegAddr = 0x12; + R828_Arry[13] = (R828_Arry[13] & 0x1F) | 0x60; //increase VCO current + R828_I2C.Data = R828_Arry[13]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Fail; + } + + //set pll autotune = 8kHz + R828_I2C.RegAddr = 0x1A; + R828_Arry[21] = R828_Arry[21] | 0x08; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; +} + +R828_ErrCode R828_MUX(void *pTuner, UINT32 RF_KHz) +{ + UINT8 RT_Reg08; + UINT8 RT_Reg09; + + RT_Reg08 = 0; + RT_Reg09 = 0; + + //Freq_Info_Type Freq_Info1; + Freq_Info1 = R828_Freq_Sel(RF_KHz); + + // Open Drain + R828_I2C.RegAddr = 0x17; + R828_Arry[18] = (R828_Arry[18] & 0xF7) | Freq_Info1.OPEN_D; + R828_I2C.Data = R828_Arry[18]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // RF_MUX,Polymux + R828_I2C.RegAddr = 0x1A; + R828_Arry[21] = (R828_Arry[21] & 0x3C) | Freq_Info1.RF_MUX_PLOY; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // TF BAND + R828_I2C.RegAddr = 0x1B; + R828_Arry[22] &= 0x00; + R828_Arry[22] |= Freq_Info1.TF_C; + R828_I2C.Data = R828_Arry[22]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // XTAL CAP & Drive + R828_I2C.RegAddr = 0x10; + R828_Arry[11] &= 0xF4; + switch(Xtal_cap_sel) + { + case XTAL_LOW_CAP_30P: + case XTAL_LOW_CAP_20P: + R828_Arry[11] = R828_Arry[11] | Freq_Info1.XTAL_CAP20P | 0x08; + break; + + case XTAL_LOW_CAP_10P: + R828_Arry[11] = R828_Arry[11] | Freq_Info1.XTAL_CAP10P | 0x08; + break; + + case XTAL_LOW_CAP_0P: + R828_Arry[11] = R828_Arry[11] | Freq_Info1.XTAL_CAP0P | 0x08; + break; + + case XTAL_HIGH_CAP_0P: + R828_Arry[11] = R828_Arry[11] | Freq_Info1.XTAL_CAP0P | 0x00; + break; + + default: + R828_Arry[11] = R828_Arry[11] | Freq_Info1.XTAL_CAP0P | 0x08; + break; + } + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Set_IMR + if(R828_IMR_done_flag == TRUE) + { + RT_Reg08 = IMR_Data[Freq_Info1.IMR_MEM].Gain_X & 0x3F; + RT_Reg09 = IMR_Data[Freq_Info1.IMR_MEM].Phase_Y & 0x3F; + } + else + { + RT_Reg08 = 0; + RT_Reg09 = 0; + } + + R828_I2C.RegAddr = 0x08; + R828_Arry[3] = R828_iniArry[3] & 0xC0; + R828_Arry[3] = R828_Arry[3] | RT_Reg08; + R828_I2C.Data = R828_Arry[3]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x09; + R828_Arry[4] = R828_iniArry[4] & 0xC0; + R828_Arry[4] = R828_Arry[4] | RT_Reg09; + R828_I2C.Data =R828_Arry[4] ; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; +} + +R828_ErrCode R828_IQ(void *pTuner, R828_SectType* IQ_Pont) +{ + R828_SectType Compare_IQ[3]; +// R828_SectType CompareTemp; +// UINT8 IQ_Count = 0; + UINT8 VGA_Count; + UINT16 VGA_Read; + UINT8 X_Direction; // 1:X, 0:Y + + VGA_Count = 0; + VGA_Read = 0; + + // increase VGA power to let image significant + for(VGA_Count = 12;VGA_Count < 16;VGA_Count ++) + { + R828_I2C.RegAddr = 0x0C; + R828_I2C.Data = (R828_Arry[7] & 0xF0) + VGA_Count; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Delay_MS(pTuner, 10); // + + if(R828_Muti_Read(pTuner, 0x01, &VGA_Read) != RT_Success) + return RT_Fail; + + if(VGA_Read > 40*4) + break; + } + + //initial 0x08, 0x09 + //Compare_IQ[0].Gain_X = 0x40; //should be 0xC0 in R828, Jason + //Compare_IQ[0].Phase_Y = 0x40; //should be 0x40 in R828 + Compare_IQ[0].Gain_X = R828_iniArry[3] & 0xC0; // Jason modified, clear b[5], b[4:0] + Compare_IQ[0].Phase_Y = R828_iniArry[4] & 0xC0; // + + //while(IQ_Count < 3) + //{ + // Determine X or Y + if(R828_IMR_Cross(pTuner, &Compare_IQ[0], &X_Direction) != RT_Success) + return RT_Fail; + + //if(X_Direction==1) + //{ + // if(R828_IQ_Tree(Compare_IQ[0].Phase_Y, Compare_IQ[0].Gain_X, 0x09, &Compare_IQ[0]) != RT_Success) //X + // return RT_Fail; + //} + //else + //{ + // if(R828_IQ_Tree(Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) //Y + // return RT_Fail; + //} + + /* + //--- X direction ---// + //X: 3 points + if(R828_IQ_Tree(Compare_IQ[0].Phase_Y, Compare_IQ[0].Gain_X, 0x09, &Compare_IQ[0]) != RT_Success) // + return RT_Fail; + + //compare and find min of 3 points. determine I/Q direction + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + //increase step to find min value of this direction + if(R828_CompreStep(&Compare_IQ[0], 0x08) != RT_Success) + return RT_Fail; + */ + + if(X_Direction==1) + { + //compare and find min of 3 points. determine I/Q direction + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + //increase step to find min value of this direction + if(R828_CompreStep(pTuner, &Compare_IQ[0], 0x08) != RT_Success) //X + return RT_Fail; + } + else + { + //compare and find min of 3 points. determine I/Q direction + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + //increase step to find min value of this direction + if(R828_CompreStep(pTuner, &Compare_IQ[0], 0x09) != RT_Success) //Y + return RT_Fail; + } + /* + //--- Y direction ---// + //Y: 3 points + if(R828_IQ_Tree(Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) // + return RT_Fail; + + //compare and find min of 3 points. determine I/Q direction + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + //increase step to find min value of this direction + if(R828_CompreStep(&Compare_IQ[0], 0x09) != RT_Success) + return RT_Fail; + */ + + //Another direction + if(X_Direction==1) + { + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) //Y + return RT_Fail; + + //compare and find min of 3 points. determine I/Q direction + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + //increase step to find min value of this direction + if(R828_CompreStep(pTuner, &Compare_IQ[0], 0x09) != RT_Success) //Y + return RT_Fail; + } + else + { + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Phase_Y, Compare_IQ[0].Gain_X, 0x09, &Compare_IQ[0]) != RT_Success) //X + return RT_Fail; + + //compare and find min of 3 points. determine I/Q direction + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + //increase step to find min value of this direction + if(R828_CompreStep(pTuner, &Compare_IQ[0], 0x08) != RT_Success) //X + return RT_Fail; + } + //CompareTemp = Compare_IQ[0]; + + //--- Check 3 points again---// + if(X_Direction==1) + { + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Phase_Y, Compare_IQ[0].Gain_X, 0x09, &Compare_IQ[0]) != RT_Success) //X + return RT_Fail; + } + else + { + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) //Y + return RT_Fail; + } + + //if(R828_IQ_Tree(Compare_IQ[0].Phase_Y, Compare_IQ[0].Gain_X, 0x09, &Compare_IQ[0]) != RT_Success) // + // return RT_Fail; + + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + //if((CompareTemp.Gain_X == Compare_IQ[0].Gain_X) && (CompareTemp.Phase_Y == Compare_IQ[0].Phase_Y))//Ben Check + // break; + + //IQ_Count ++; + //} + //if(IQ_Count == 3) + // return RT_Fail; + + //Section-4 Check + /* + CompareTemp = Compare_IQ[0]; + for(IQ_Count = 0;IQ_Count < 5;IQ_Count ++) + { + if(R828_Section(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + if((CompareTemp.Gain_X == Compare_IQ[0].Gain_X) && (CompareTemp.Phase_Y == Compare_IQ[0].Phase_Y)) + break; + } + */ + + //Section-9 check + //if(R828_F_IMR(&Compare_IQ[0]) != RT_Success) + if(R828_Section(pTuner, &Compare_IQ[0]) != RT_Success) + return RT_Fail; + + *IQ_Pont = Compare_IQ[0]; + + //reset gain/phase control setting + R828_I2C.RegAddr = 0x08; + R828_I2C.Data = R828_iniArry[3] & 0xC0; //Jason + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x09; + R828_I2C.Data = R828_iniArry[4] & 0xC0; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; +} + +//-------------------------------------------------------------------------------------------- +// Purpose: record IMC results by input gain/phase location +// then adjust gain or phase positive 1 step and negtive 1 step, both record results +// input: FixPot: phase or gain +// FlucPot phase or gain +// PotReg: 0x08 or 0x09 +// CompareTree: 3 IMR trace and results +// output: TREU or FALSE +//-------------------------------------------------------------------------------------------- +R828_ErrCode R828_IQ_Tree(void *pTuner, UINT8 FixPot, UINT8 FlucPot, UINT8 PotReg, R828_SectType* CompareTree) +{ + UINT8 TreeCount; + UINT8 TreeTimes; + UINT8 TempPot; + UINT8 PntReg; + + TreeCount = 0; + TreeTimes = 3; + TempPot = 0; + PntReg = 0; + + if(PotReg == 0x08) + PntReg = 0x09; //phase control + else + PntReg = 0x08; //gain control + + for(TreeCount = 0;TreeCount < TreeTimes;TreeCount ++) + { + R828_I2C.RegAddr = PotReg; + R828_I2C.Data = FixPot; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = PntReg; + R828_I2C.Data = FlucPot; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + if(R828_Muti_Read(pTuner, 0x01, &CompareTree[TreeCount].Value) != RT_Success) + return RT_Fail; + + if(PotReg == 0x08) + { + CompareTree[TreeCount].Gain_X = FixPot; + CompareTree[TreeCount].Phase_Y = FlucPot; + } + else + { + CompareTree[TreeCount].Phase_Y = FixPot; + CompareTree[TreeCount].Gain_X = FlucPot; + } + + if(TreeCount == 0) //try right-side point + FlucPot ++; + else if(TreeCount == 1) //try left-side point + { + if((FlucPot & 0x1F) < 0x02) //if absolute location is 1, change I/Q direction + { + TempPot = 2 - (FlucPot & 0x1F); + if(FlucPot & 0x20) //b[5]:I/Q selection. 0:Q-path, 1:I-path + { + FlucPot &= 0xC0; + FlucPot |= TempPot; + } + else + { + FlucPot |= (0x20 | TempPot); + } + } + else + FlucPot -= 2; + } + } + + return RT_Success; +} + +//-----------------------------------------------------------------------------------/ +// Purpose: compare IMC result aray [0][1][2], find min value and store to CorArry[0] +// input: CorArry: three IMR data array +// output: TRUE or FALSE +//-----------------------------------------------------------------------------------/ +R828_ErrCode R828_CompreCor(R828_SectType* CorArry) +{ + UINT8 CompCount; + R828_SectType CorTemp; + + CompCount = 0; + + for(CompCount = 3;CompCount > 0;CompCount --) + { + if(CorArry[0].Value > CorArry[CompCount - 1].Value) //compare IMC result [0][1][2], find min value + { + CorTemp = CorArry[0]; + CorArry[0] = CorArry[CompCount - 1]; + CorArry[CompCount - 1] = CorTemp; + } + } + + return RT_Success; +} + +//-------------------------------------------------------------------------------------// +// Purpose: if (Gain<9 or Phase<9), Gain+1 or Phase+1 and compare with min value +// new < min => update to min and continue +// new > min => Exit +// input: StepArry: three IMR data array +// Pace: gain or phase register +// output: TRUE or FALSE +//-------------------------------------------------------------------------------------// +R828_ErrCode R828_CompreStep(void *pTuner, R828_SectType* StepArry, UINT8 Pace) +{ + //UINT8 StepCount = 0; + R828_SectType StepTemp; + + //min value already saved in StepArry[0] + StepTemp.Phase_Y = StepArry[0].Phase_Y; + StepTemp.Gain_X = StepArry[0].Gain_X; + + while(((StepTemp.Gain_X & 0x1F) < IMR_TRIAL) && ((StepTemp.Phase_Y & 0x1F) < IMR_TRIAL)) //5->10 + { + if(Pace == 0x08) + StepTemp.Gain_X ++; + else + StepTemp.Phase_Y ++; + + R828_I2C.RegAddr = 0x08; + R828_I2C.Data = StepTemp.Gain_X ; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x09; + R828_I2C.Data = StepTemp.Phase_Y; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + if(R828_Muti_Read(pTuner, 0x01, &StepTemp.Value) != RT_Success) + return RT_Fail; + + if(StepTemp.Value <= StepArry[0].Value) + { + StepArry[0].Gain_X = StepTemp.Gain_X; + StepArry[0].Phase_Y = StepTemp.Phase_Y; + StepArry[0].Value = StepTemp.Value; + } + else + { + break; + } + + } //end of while() + + return RT_Success; +} + +//-----------------------------------------------------------------------------------/ +// Purpose: read multiple IMC results for stability +// input: IMR_Reg: IMC result address +// IMR_Result_Data: result +// output: TRUE or FALSE +//-----------------------------------------------------------------------------------/ +R828_ErrCode R828_Muti_Read(void *pTuner, UINT8 IMR_Reg, UINT16* IMR_Result_Data) //jason modified +{ + UINT8 ReadCount; + UINT16 ReadAmount; + UINT8 ReadMax; + UINT8 ReadMin; + UINT8 ReadData; + + ReadCount = 0; + ReadAmount = 0; + ReadMax = 0; + ReadMin = 255; + ReadData = 0; + + R828_Delay_MS(pTuner, 5); + + for(ReadCount = 0;ReadCount < 6;ReadCount ++) + { + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = IMR_Reg + 1; //IMR_Reg = 0x01 + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + ReadData = R828_I2C_Len.Data[1]; + + ReadAmount = ReadAmount + (UINT16)ReadData; + + if(ReadData < ReadMin) + ReadMin = ReadData; + + if(ReadData > ReadMax) + ReadMax = ReadData; + } + *IMR_Result_Data = ReadAmount - (UINT16)ReadMax - (UINT16)ReadMin; + + return RT_Success; +} + +R828_ErrCode R828_Section(void *pTuner, R828_SectType* IQ_Pont) +{ + R828_SectType Compare_IQ[3]; + R828_SectType Compare_Bet[3]; + + //Try X-1 column and save min result to Compare_Bet[0] + if((IQ_Pont->Gain_X & 0x1F) == 0x00) + { + /* + if((IQ_Pont->Gain_X & 0xE0) == 0x40) //bug => only compare b[5], + Compare_IQ[0].Gain_X = 0x61; // Gain=1, I-path //Jason + else + Compare_IQ[0].Gain_X = 0x41; // Gain=1, Q-path + */ + Compare_IQ[0].Gain_X = ((IQ_Pont->Gain_X) & 0xDF) + 1; //Q-path, Gain=1 + } + else + Compare_IQ[0].Gain_X = IQ_Pont->Gain_X - 1; //left point + Compare_IQ[0].Phase_Y = IQ_Pont->Phase_Y; + + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) // y-direction + return RT_Fail; + + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + Compare_Bet[0].Gain_X = Compare_IQ[0].Gain_X; + Compare_Bet[0].Phase_Y = Compare_IQ[0].Phase_Y; + Compare_Bet[0].Value = Compare_IQ[0].Value; + + //Try X column and save min result to Compare_Bet[1] + Compare_IQ[0].Gain_X = IQ_Pont->Gain_X; + Compare_IQ[0].Phase_Y = IQ_Pont->Phase_Y; + + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) + return RT_Fail; + + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + Compare_Bet[1].Gain_X = Compare_IQ[0].Gain_X; + Compare_Bet[1].Phase_Y = Compare_IQ[0].Phase_Y; + Compare_Bet[1].Value = Compare_IQ[0].Value; + + //Try X+1 column and save min result to Compare_Bet[2] + if((IQ_Pont->Gain_X & 0x1F) == 0x00) + Compare_IQ[0].Gain_X = ((IQ_Pont->Gain_X) | 0x20) + 1; //I-path, Gain=1 + else + Compare_IQ[0].Gain_X = IQ_Pont->Gain_X + 1; + Compare_IQ[0].Phase_Y = IQ_Pont->Phase_Y; + + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) + return RT_Fail; + + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + Compare_Bet[2].Gain_X = Compare_IQ[0].Gain_X; + Compare_Bet[2].Phase_Y = Compare_IQ[0].Phase_Y; + Compare_Bet[2].Value = Compare_IQ[0].Value; + + if(R828_CompreCor(&Compare_Bet[0]) != RT_Success) + return RT_Fail; + + *IQ_Pont = Compare_Bet[0]; + + return RT_Success; +} + +R828_ErrCode R828_IMR_Cross(void *pTuner, R828_SectType* IQ_Pont, UINT8* X_Direct) +{ + + R828_SectType Compare_Cross[5]; //(0,0)(0,Q-1)(0,I-1)(Q-1,0)(I-1,0) + R828_SectType Compare_Temp; + UINT8 CrossCount; + UINT8 Reg08; + UINT8 Reg09; + + CrossCount = 0; + Reg08 = R828_iniArry[3] & 0xC0; + Reg09 = R828_iniArry[4] & 0xC0; + + //memset(&Compare_Temp,0, sizeof(R828_SectType)); + Compare_Temp.Gain_X = 0; + Compare_Temp.Phase_Y = 0; + Compare_Temp.Value = 0; + + Compare_Temp.Value = 255; + + for(CrossCount=0; CrossCount<5; CrossCount++) + { + + if(CrossCount==0) + { + Compare_Cross[CrossCount].Gain_X = Reg08; + Compare_Cross[CrossCount].Phase_Y = Reg09; + } + else if(CrossCount==1) + { + Compare_Cross[CrossCount].Gain_X = Reg08; //0 + Compare_Cross[CrossCount].Phase_Y = Reg09 + 1; //Q-1 + } + else if(CrossCount==2) + { + Compare_Cross[CrossCount].Gain_X = Reg08; //0 + Compare_Cross[CrossCount].Phase_Y = (Reg09 | 0x20) + 1; //I-1 + } + else if(CrossCount==3) + { + Compare_Cross[CrossCount].Gain_X = Reg08 + 1; //Q-1 + Compare_Cross[CrossCount].Phase_Y = Reg09; + } + else + { + Compare_Cross[CrossCount].Gain_X = (Reg08 | 0x20) + 1; //I-1 + Compare_Cross[CrossCount].Phase_Y = Reg09; + } + + R828_I2C.RegAddr = 0x08; + R828_I2C.Data = Compare_Cross[CrossCount].Gain_X; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x09; + R828_I2C.Data = Compare_Cross[CrossCount].Phase_Y; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + if(R828_Muti_Read(pTuner, 0x01, &Compare_Cross[CrossCount].Value) != RT_Success) + return RT_Fail; + + if( Compare_Cross[CrossCount].Value < Compare_Temp.Value) + { + Compare_Temp.Value = Compare_Cross[CrossCount].Value; + Compare_Temp.Gain_X = Compare_Cross[CrossCount].Gain_X; + Compare_Temp.Phase_Y = Compare_Cross[CrossCount].Phase_Y; + } + } //end for loop + + + if((Compare_Temp.Phase_Y & 0x1F)==1) //y-direction + { + *X_Direct = (UINT8) 0; + IQ_Pont[0].Gain_X = Compare_Cross[0].Gain_X; + IQ_Pont[0].Phase_Y = Compare_Cross[0].Phase_Y; + IQ_Pont[0].Value = Compare_Cross[0].Value; + + IQ_Pont[1].Gain_X = Compare_Cross[1].Gain_X; + IQ_Pont[1].Phase_Y = Compare_Cross[1].Phase_Y; + IQ_Pont[1].Value = Compare_Cross[1].Value; + + IQ_Pont[2].Gain_X = Compare_Cross[2].Gain_X; + IQ_Pont[2].Phase_Y = Compare_Cross[2].Phase_Y; + IQ_Pont[2].Value = Compare_Cross[2].Value; + } + else //(0,0) or x-direction + { + *X_Direct = (UINT8) 1; + IQ_Pont[0].Gain_X = Compare_Cross[0].Gain_X; + IQ_Pont[0].Phase_Y = Compare_Cross[0].Phase_Y; + IQ_Pont[0].Value = Compare_Cross[0].Value; + + IQ_Pont[1].Gain_X = Compare_Cross[3].Gain_X; + IQ_Pont[1].Phase_Y = Compare_Cross[3].Phase_Y; + IQ_Pont[1].Value = Compare_Cross[3].Value; + + IQ_Pont[2].Gain_X = Compare_Cross[4].Gain_X; + IQ_Pont[2].Phase_Y = Compare_Cross[4].Phase_Y; + IQ_Pont[2].Value = Compare_Cross[4].Value; + } + return RT_Success; +} + +//----------------------------------------------------------------------------------------// +// purpose: search surrounding points from previous point +// try (x-1), (x), (x+1) columns, and find min IMR result point +// input: IQ_Pont: previous point data(IMR Gain, Phase, ADC Result, RefRreq) +// will be updated to final best point +// output: TRUE or FALSE +//----------------------------------------------------------------------------------------// +R828_ErrCode R828_F_IMR(void *pTuner, R828_SectType* IQ_Pont) +{ + R828_SectType Compare_IQ[3]; + R828_SectType Compare_Bet[3]; + UINT8 VGA_Count; + UINT16 VGA_Read; + + VGA_Count = 0; + VGA_Read = 0; + + //VGA + for(VGA_Count = 12;VGA_Count < 16;VGA_Count ++) + { + R828_I2C.RegAddr = 0x0C; + R828_I2C.Data = (R828_Arry[7] & 0xF0) + VGA_Count; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Delay_MS(pTuner, 10); + + if(R828_Muti_Read(pTuner, 0x01, &VGA_Read) != RT_Success) + return RT_Fail; + + if(VGA_Read > 40*4) + break; + } + + //Try X-1 column and save min result to Compare_Bet[0] + if((IQ_Pont->Gain_X & 0x1F) == 0x00) + { + Compare_IQ[0].Gain_X = ((IQ_Pont->Gain_X) & 0xDF) + 1; //Q-path, Gain=1 + } + else + Compare_IQ[0].Gain_X = IQ_Pont->Gain_X - 1; //left point + Compare_IQ[0].Phase_Y = IQ_Pont->Phase_Y; + + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) // y-direction + return RT_Fail; + + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + Compare_Bet[0].Gain_X = Compare_IQ[0].Gain_X; + Compare_Bet[0].Phase_Y = Compare_IQ[0].Phase_Y; + Compare_Bet[0].Value = Compare_IQ[0].Value; + + //Try X column and save min result to Compare_Bet[1] + Compare_IQ[0].Gain_X = IQ_Pont->Gain_X; + Compare_IQ[0].Phase_Y = IQ_Pont->Phase_Y; + + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) + return RT_Fail; + + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + Compare_Bet[1].Gain_X = Compare_IQ[0].Gain_X; + Compare_Bet[1].Phase_Y = Compare_IQ[0].Phase_Y; + Compare_Bet[1].Value = Compare_IQ[0].Value; + + //Try X+1 column and save min result to Compare_Bet[2] + if((IQ_Pont->Gain_X & 0x1F) == 0x00) + Compare_IQ[0].Gain_X = ((IQ_Pont->Gain_X) | 0x20) + 1; //I-path, Gain=1 + else + Compare_IQ[0].Gain_X = IQ_Pont->Gain_X + 1; + Compare_IQ[0].Phase_Y = IQ_Pont->Phase_Y; + + if(R828_IQ_Tree(pTuner, Compare_IQ[0].Gain_X, Compare_IQ[0].Phase_Y, 0x08, &Compare_IQ[0]) != RT_Success) + return RT_Fail; + + if(R828_CompreCor(&Compare_IQ[0]) != RT_Success) + return RT_Fail; + + Compare_Bet[2].Gain_X = Compare_IQ[0].Gain_X; + Compare_Bet[2].Phase_Y = Compare_IQ[0].Phase_Y; + Compare_Bet[2].Value = Compare_IQ[0].Value; + + if(R828_CompreCor(&Compare_Bet[0]) != RT_Success) + return RT_Fail; + + *IQ_Pont = Compare_Bet[0]; + + return RT_Success; +} + +R828_ErrCode R828_GPIO(void *pTuner, R828_GPIO_Type R828_GPIO_Conrl) +{ + if(R828_GPIO_Conrl == HI_SIG) + R828_Arry[10] |= 0x01; + else + R828_Arry[10] &= 0xFE; + + R828_I2C.RegAddr = 0x0F; + R828_I2C.Data = R828_Arry[10]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; +} + +R828_ErrCode R828_SetStandard(void *pTuner, R828_Standard_Type RT_Standard) +{ + + // Used Normal Arry to Modify + UINT8 ArrayNum; + + ArrayNum = 27; + for(ArrayNum=0;ArrayNum<27;ArrayNum++) + { + R828_Arry[ArrayNum] = R828_iniArry[ArrayNum]; + } + + + // Record Init Flag & Xtal_check Result + if(R828_IMR_done_flag == TRUE) + R828_Arry[7] = (R828_Arry[7] & 0xF0) | 0x01 | (Xtal_cap_sel<<1); + else + R828_Arry[7] = (R828_Arry[7] & 0xF0) | 0x00; + + R828_I2C.RegAddr = 0x0C; + R828_I2C.Data = R828_Arry[7]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // Record version + R828_I2C.RegAddr = 0x13; + R828_Arry[14] = (R828_Arry[14] & 0xC0) | VER_NUM; + R828_I2C.Data = R828_Arry[14]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + //for LT Gain test + if(RT_Standard > SECAM_L1) + { + R828_I2C.RegAddr = 0x1D; //[5:3] LNA TOP + R828_I2C.Data = (R828_Arry[24] & 0xC7) | 0x00; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //R828_Delay_MS(1); + } + + // Look Up System Dependent Table + Sys_Info1 = R828_Sys_Sel(RT_Standard); + R828_IF_khz = Sys_Info1.IF_KHz; + R828_CAL_LO_khz = Sys_Info1.FILT_CAL_LO; + + // Filter Calibration + if(R828_Fil_Cal_flag[RT_Standard] == FALSE) + { + // do filter calibration + if(R828_Filt_Cal(pTuner, Sys_Info1.FILT_CAL_LO,Sys_Info1.BW) != RT_Success) + return RT_Fail; + + + // read and set filter code + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 5; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + R828_Fil_Cal_code[RT_Standard] = R828_I2C_Len.Data[4] & 0x0F; + + //Filter Cali. Protection + if(R828_Fil_Cal_code[RT_Standard]==0 || R828_Fil_Cal_code[RT_Standard]==15) + { + if(R828_Filt_Cal(pTuner, Sys_Info1.FILT_CAL_LO,Sys_Info1.BW) != RT_Success) + return RT_Fail; + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 5; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + R828_Fil_Cal_code[RT_Standard] = R828_I2C_Len.Data[4] & 0x0F; + + if(R828_Fil_Cal_code[RT_Standard]==15) //narrowest + R828_Fil_Cal_code[RT_Standard] = 0; + + } + R828_Fil_Cal_flag[RT_Standard] = TRUE; + } + + // Set Filter Q + R828_Arry[5] = (R828_Arry[5] & 0xE0) | Sys_Info1.FILT_Q | R828_Fil_Cal_code[RT_Standard]; + R828_I2C.RegAddr = 0x0A; + R828_I2C.Data = R828_Arry[5]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // Set BW, Filter_gain, & HP corner + R828_Arry[6]= (R828_Arry[6] & 0x10) | Sys_Info1.HP_COR; + R828_I2C.RegAddr = 0x0B; + R828_I2C.Data = R828_Arry[6]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // Set Img_R + R828_Arry[2] = (R828_Arry[2] & 0x7F) | Sys_Info1.IMG_R; + R828_I2C.RegAddr = 0x07; + R828_I2C.Data = R828_Arry[2]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + // Set filt_3dB, V6MHz + R828_Arry[1] = (R828_Arry[1] & 0xCF) | Sys_Info1.FILT_GAIN; + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //channel filter extension + R828_Arry[25] = (R828_Arry[25] & 0x9F) | Sys_Info1.EXT_ENABLE; + R828_I2C.RegAddr = 0x1E; + R828_I2C.Data = R828_Arry[25]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + //Loop through + R828_Arry[0] = (R828_Arry[0] & 0x7F) | Sys_Info1.LOOP_THROUGH; + R828_I2C.RegAddr = 0x05; + R828_I2C.Data = R828_Arry[0]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Loop through attenuation + R828_Arry[26] = (R828_Arry[26] & 0x7F) | Sys_Info1.LT_ATT; + R828_I2C.RegAddr = 0x1F; + R828_I2C.Data = R828_Arry[26]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //filter extention widest + R828_Arry[10] = (R828_Arry[10] & 0x7F) | Sys_Info1.FLT_EXT_WIDEST; + R828_I2C.RegAddr = 0x0F; + R828_I2C.Data = R828_Arry[10]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //RF poly filter current + R828_Arry[20] = (R828_Arry[20] & 0x9F) | Sys_Info1.POLYFIL_CUR; + R828_I2C.RegAddr = 0x19; + R828_I2C.Data = R828_Arry[20]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; +} + +R828_ErrCode R828_Filt_Cal(void *pTuner, UINT32 Cal_Freq,BW_Type R828_BW) +{ + //set in Sys_sel() + /* + if(R828_BW == BW_8M) + { + //set filt_cap = no cap + R828_I2C.RegAddr = 0x0B; //reg11 + R828_Arry[6] &= 0x9F; //filt_cap = no cap + R828_I2C.Data = R828_Arry[6]; + } + else if(R828_BW == BW_7M) + { + //set filt_cap = +1 cap + R828_I2C.RegAddr = 0x0B; //reg11 + R828_Arry[6] &= 0x9F; //filt_cap = no cap + R828_Arry[6] |= 0x20; //filt_cap = +1 cap + R828_I2C.Data = R828_Arry[6]; + } + else if(R828_BW == BW_6M) + { + //set filt_cap = +2 cap + R828_I2C.RegAddr = 0x0B; //reg11 + R828_Arry[6] &= 0x9F; //filt_cap = no cap + R828_Arry[6] |= 0x60; //filt_cap = +2 cap + R828_I2C.Data = R828_Arry[6]; + } + + + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; +*/ + + // Set filt_cap + R828_I2C.RegAddr = 0x0B; + R828_Arry[6]= (R828_Arry[6] & 0x9F) | (Sys_Info1.HP_COR & 0x60); + R828_I2C.Data = R828_Arry[6]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + //set cali clk =on + R828_I2C.RegAddr = 0x0F; //reg15 + R828_Arry[10] |= 0x04; //calibration clk=on + R828_I2C.Data = R828_Arry[10]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //X'tal cap 0pF for PLL + R828_I2C.RegAddr = 0x10; + R828_Arry[11] = (R828_Arry[11] & 0xFC) | 0x00; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Set PLL Freq = Filter Cali Freq + if(R828_PLL(pTuner, Cal_Freq * 1000, STD_SIZE) != RT_Success) + return RT_Fail; + + //Start Trigger + R828_I2C.RegAddr = 0x0B; //reg11 + R828_Arry[6] |= 0x10; //vstart=1 + R828_I2C.Data = R828_Arry[6]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //delay 0.5ms + R828_Delay_MS(pTuner, 1); + + //Stop Trigger + R828_I2C.RegAddr = 0x0B; + R828_Arry[6] &= 0xEF; //vstart=0 + R828_I2C.Data = R828_Arry[6]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + //set cali clk =off + R828_I2C.RegAddr = 0x0F; //reg15 + R828_Arry[10] &= 0xFB; //calibration clk=off + R828_I2C.Data = R828_Arry[10]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; + +} + +R828_ErrCode R828_SetFrequency(void *pTuner, R828_Set_Info R828_INFO, R828_SetFreq_Type R828_SetFreqMode) +{ + UINT32 LO_Hz; + +#if 0 + // Check Input Frequency Range + if((R828_INFO.RF_KHz<40000) || (R828_INFO.RF_KHz>900000)) + { + return RT_Fail; + } +#endif + + if(R828_INFO.R828_Standard==SECAM_L1) + LO_Hz = R828_INFO.RF_Hz - (Sys_Info1.IF_KHz * 1000); + else + LO_Hz = R828_INFO.RF_Hz + (Sys_Info1.IF_KHz * 1000); + + //Set MUX dependent var. Must do before PLL( ) + if(R828_MUX(pTuner, LO_Hz/1000) != RT_Success) + return RT_Fail; + + //Set PLL + if(R828_PLL(pTuner, LO_Hz, R828_INFO.R828_Standard) != RT_Success) + return RT_Fail; + + R828_IMR_point_num = Freq_Info1.IMR_MEM; + + + //Set TOP,VTH,VTL + SysFreq_Info1 = R828_SysFreq_Sel(R828_INFO.R828_Standard, R828_INFO.RF_KHz); + + + // write DectBW, pre_dect_TOP + R828_Arry[24] = (R828_Arry[24] & 0x38) | (SysFreq_Info1.LNA_TOP & 0xC7); + R828_I2C.RegAddr = 0x1D; + R828_I2C.Data = R828_Arry[24]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // write MIXER TOP, TOP+-1 + R828_Arry[23] = (R828_Arry[23] & 0x07) | (SysFreq_Info1.MIXER_TOP & 0xF8); + R828_I2C.RegAddr = 0x1C; + R828_I2C.Data = R828_Arry[23]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + // write LNA VTHL + R828_Arry[8] = (R828_Arry[8] & 0x00) | SysFreq_Info1.LNA_VTH_L; + R828_I2C.RegAddr = 0x0D; + R828_I2C.Data = R828_Arry[8]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // write MIXER VTHL + R828_Arry[9] = (R828_Arry[9] & 0x00) | SysFreq_Info1.MIXER_VTH_L; + R828_I2C.RegAddr = 0x0E; + R828_I2C.Data = R828_Arry[9]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // Cable-1/Air in + R828_I2C.RegAddr = 0x05; + R828_Arry[0] &= 0x9F; + R828_Arry[0] |= SysFreq_Info1.AIR_CABLE1_IN; + R828_I2C.Data = R828_Arry[0]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // Cable-2 in + R828_I2C.RegAddr = 0x06; + R828_Arry[1] &= 0xF7; + R828_Arry[1] |= SysFreq_Info1.CABLE2_IN; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //CP current + R828_I2C.RegAddr = 0x11; + R828_Arry[12] &= 0xC7; + R828_Arry[12] |= SysFreq_Info1.CP_CUR; + R828_I2C.Data = R828_Arry[12]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //div buffer current + R828_I2C.RegAddr = 0x17; + R828_Arry[18] &= 0xCF; + R828_Arry[18] |= SysFreq_Info1.DIV_BUF_CUR; + R828_I2C.Data = R828_Arry[18]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // Set channel filter current + R828_I2C.RegAddr = 0x0A; + R828_Arry[5] = (R828_Arry[5] & 0x9F) | SysFreq_Info1.FILTER_CUR; + R828_I2C.Data = R828_Arry[5]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Air-In only for Astrometa + R828_Arry[0] = (R828_Arry[0] & 0x9F) | 0x00; + R828_Arry[1] = (R828_Arry[1] & 0xF7) | 0x00; + + R828_I2C.RegAddr = 0x05; + R828_I2C.Data = R828_Arry[0]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Set LNA + if(R828_INFO.R828_Standard > SECAM_L1) + { + + if(R828_SetFreqMode==FAST_MODE) //FAST mode + { + //R828_Arry[24] = (R828_Arry[24] & 0xC7) | 0x20; //LNA TOP:4 + R828_Arry[24] = (R828_Arry[24] & 0xC7) | 0x00; //LNA TOP:lowest + R828_I2C.RegAddr = 0x1D; + R828_I2C.Data = R828_Arry[24]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Arry[23] = (R828_Arry[23] & 0xFB); // 0: normal mode + R828_I2C.RegAddr = 0x1C; + R828_I2C.Data = R828_Arry[23]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Arry[1] = (R828_Arry[1] & 0xBF); //0: PRE_DECT off + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //agc clk 250hz + R828_Arry[21] = (R828_Arry[21] & 0xCF) | 0x30; + R828_I2C.RegAddr = 0x1A; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + } + else //NORMAL mode + { + + R828_Arry[24] = (R828_Arry[24] & 0xC7) | 0x00; //LNA TOP:lowest + R828_I2C.RegAddr = 0x1D; + R828_I2C.Data = R828_Arry[24]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Arry[23] = (R828_Arry[23] & 0xFB); // 0: normal mode + R828_I2C.RegAddr = 0x1C; + R828_I2C.Data = R828_Arry[23]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Arry[1] = (R828_Arry[1] & 0xBF); //0: PRE_DECT off + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //agc clk 250hz + R828_Arry[21] = (R828_Arry[21] & 0xCF) | 0x30; //250hz + R828_I2C.RegAddr = 0x1A; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Delay_MS(pTuner, 250); + + // PRE_DECT on + /* + R828_Arry[1] = (R828_Arry[1] & 0xBF) | SysFreq_Info1.PRE_DECT; + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + */ + // write LNA TOP = 3 + //R828_Arry[24] = (R828_Arry[24] & 0xC7) | (SysFreq_Info1.LNA_TOP & 0x38); + R828_Arry[24] = (R828_Arry[24] & 0xC7) | 0x18; //TOP=3 + R828_I2C.RegAddr = 0x1D; + R828_I2C.Data = R828_Arry[24]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // write discharge mode + R828_Arry[23] = (R828_Arry[23] & 0xFB) | (SysFreq_Info1.MIXER_TOP & 0x04); + R828_I2C.RegAddr = 0x1C; + R828_I2C.Data = R828_Arry[23]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // LNA discharge current + R828_Arry[25] = (R828_Arry[25] & 0xE0) | SysFreq_Info1.LNA_DISCHARGE; + R828_I2C.RegAddr = 0x1E; + R828_I2C.Data = R828_Arry[25]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //agc clk 60hz + R828_Arry[21] = (R828_Arry[21] & 0xCF) | 0x20; + R828_I2C.RegAddr = 0x1A; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + } + } + else + { + if(R828_SetFreqMode==NORMAL_MODE || R828_SetFreqMode==FAST_MODE) + { + /* + // PRE_DECT on + R828_Arry[1] = (R828_Arry[1] & 0xBF) | SysFreq_Info1.PRE_DECT; + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + */ + // PRE_DECT off + R828_Arry[1] = (R828_Arry[1] & 0xBF); //0: PRE_DECT off + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = R828_Arry[1]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // write LNA TOP + R828_Arry[24] = (R828_Arry[24] & 0xC7) | (SysFreq_Info1.LNA_TOP & 0x38); + R828_I2C.RegAddr = 0x1D; + R828_I2C.Data = R828_Arry[24]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // write discharge mode + R828_Arry[23] = (R828_Arry[23] & 0xFB) | (SysFreq_Info1.MIXER_TOP & 0x04); + R828_I2C.RegAddr = 0x1C; + R828_I2C.Data = R828_Arry[23]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // LNA discharge current + R828_Arry[25] = (R828_Arry[25] & 0xE0) | SysFreq_Info1.LNA_DISCHARGE; + R828_I2C.RegAddr = 0x1E; + R828_I2C.Data = R828_Arry[25]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + // agc clk 1Khz, external det1 cap 1u + R828_Arry[21] = (R828_Arry[21] & 0xCF) | 0x00; + R828_I2C.RegAddr = 0x1A; + R828_I2C.Data = R828_Arry[21]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_Arry[11] = (R828_Arry[11] & 0xFB) | 0x00; + R828_I2C.RegAddr = 0x10; + R828_I2C.Data = R828_Arry[11]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + } + } + + return RT_Success; + +} + +R828_ErrCode R828_Standby(void *pTuner, R828_LoopThrough_Type R828_LoopSwitch) +{ + if(R828_LoopSwitch == LOOP_THROUGH) + { + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = 0xB1; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + R828_I2C.RegAddr = 0x05; + R828_I2C.Data = 0x03; + + + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + } + else + { + R828_I2C.RegAddr = 0x05; + R828_I2C.Data = 0xA3; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x06; + R828_I2C.Data = 0xB1; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + } + + R828_I2C.RegAddr = 0x07; + R828_I2C.Data = 0x3A; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x08; + R828_I2C.Data = 0x40; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x09; + R828_I2C.Data = 0xC0; //polyfilter off + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x0A; + R828_I2C.Data = 0x36; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x0C; + R828_I2C.Data = 0x35; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x0F; + R828_I2C.Data = 0x78; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x11; + R828_I2C.Data = 0x03; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x17; + R828_I2C.Data = 0xF4; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C.RegAddr = 0x19; + R828_I2C.Data = 0x0C; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + return RT_Success; +} + +R828_ErrCode R828_GetRfGain(void *pTuner, R828_RF_Gain_Info *pR828_rf_gain) +{ + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 4; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + pR828_rf_gain->RF_gain1 = (R828_I2C_Len.Data[3] & 0x0F); + pR828_rf_gain->RF_gain2 = ((R828_I2C_Len.Data[3] & 0xF0) >> 4); + pR828_rf_gain->RF_gain_comb = pR828_rf_gain->RF_gain1*2 + pR828_rf_gain->RF_gain2; + + return RT_Success; +} + + +/* measured with a Racal 6103E GSM test set at 928 MHz with -60 dBm + * input power, for raw results see: + * http://steve-m.de/projects/rtl-sdr/gain_measurement/r820t/ + */ + +#define VGA_BASE_GAIN -47 +static const int r820t_vga_gain_steps[] = { + 0, 26, 26, 30, 42, 35, 24, 13, 14, 32, 36, 34, 35, 37, 35, 36 +}; + +static const int r820t_lna_gain_steps[] = { + 0, 9, 13, 40, 38, 13, 31, 22, 26, 31, 26, 14, 19, 5, 35, 13 +}; + +static const int r820t_mixer_gain_steps[] = { + 0, 5, 10, 10, 19, 9, 10, 25, 17, 10, 8, 16, 13, 6, 3, -8 +}; + +R828_ErrCode R828_SetRfGain(void *pTuner, int gain) +{ + int i, total_gain = 0; + uint8_t mix_index = 0, lna_index = 0; + + for (i = 0; i < 15; i++) { + if (total_gain >= gain) + break; + + total_gain += r820t_lna_gain_steps[++lna_index]; + + if (total_gain >= gain) + break; + + total_gain += r820t_mixer_gain_steps[++mix_index]; + } + + /* set LNA gain */ + R828_I2C.RegAddr = 0x05; + R828_Arry[0] = (R828_Arry[0] & 0xF0) | lna_index; + R828_I2C.Data = R828_Arry[0]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + /* set Mixer gain */ + R828_I2C.RegAddr = 0x07; + R828_Arry[2] = (R828_Arry[2] & 0xF0) | mix_index; + R828_I2C.Data = R828_Arry[2]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + return RT_Success; +} + +R828_ErrCode R828_RfGainMode(void *pTuner, int manual) +{ + UINT8 MixerGain; + UINT8 LnaGain; + + MixerGain = 0; + LnaGain = 0; + + if (manual) { + //LNA auto off + R828_I2C.RegAddr = 0x05; + R828_Arry[0] = R828_Arry[0] | 0x10; + R828_I2C.Data = R828_Arry[0]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Mixer auto off + R828_I2C.RegAddr = 0x07; + R828_Arry[2] = R828_Arry[2] & 0xEF; + R828_I2C.Data = R828_Arry[2]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + R828_I2C_Len.RegAddr = 0x00; + R828_I2C_Len.Len = 4; + if(I2C_Read_Len(pTuner, &R828_I2C_Len) != RT_Success) + return RT_Fail; + + /* set fixed VGA gain for now (16.3 dB) */ + R828_I2C.RegAddr = 0x0C; + R828_Arry[7] = (R828_Arry[7] & 0x60) | 0x08; + R828_I2C.Data = R828_Arry[7]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + + } else { + //LNA + R828_I2C.RegAddr = 0x05; + R828_Arry[0] = R828_Arry[0] & 0xEF; + R828_I2C.Data = R828_Arry[0]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + //Mixer + R828_I2C.RegAddr = 0x07; + R828_Arry[2] = R828_Arry[2] | 0x10; + R828_I2C.Data = R828_Arry[2]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + + /* set fixed VGA gain for now (26.5 dB) */ + R828_I2C.RegAddr = 0x0C; + R828_Arry[7] = (R828_Arry[7] & 0x60) | 0x0B; + R828_I2C.Data = R828_Arry[7]; + if(I2C_Write(pTuner, &R828_I2C) != RT_Success) + return RT_Fail; + } + + return RT_Success; +}