diff options
author | Sebastian Koslowski <koslowski@kit.edu> | 2016-08-09 21:15:56 +0200 |
---|---|---|
committer | Sebastian Koslowski <koslowski@kit.edu> | 2016-08-09 21:18:29 +0200 |
commit | 8e2886dc6b45b4e3f68d84887f728483fd2d1538 (patch) | |
tree | e682bbea9e329c80ebc66233d58a01a1306bddbd | |
parent | cbe1e43b0f0d1ee0d356b7110700400578855ac6 (diff) | |
parent | fc1a6a88483120921936e415aba4d5d1a9b42d96 (diff) |
Merge remote-tracking branch 'upstream/next' into gtk3
454 files changed, 8432 insertions, 42198 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fc01f27f4..38041d58f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,9 +72,9 @@ ELSE() ENDIF() IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "Clang") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") ELSEIF(CMAKE_C_COMPILER_ID STREQUAL "MSVC") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") ELSE() @@ -302,27 +302,6 @@ GR_REGISTER_COMPONENT("testing-support" ENABLE_TESTING ) ######################################################################## -# Add optional dlls specified in DLL_PATHS -######################################################################## -foreach(path ${DLL_PATHS}) - file(GLOB _dlls "${path}/*.dll") - list(APPEND ALL_DLL_FILES ${_dlls}) -endforeach(path) -if(DEFINED ALL_DLL_FILES) - include(GrPackage) - CPACK_COMPONENT("extra_dlls" - DISPLAY_NAME "Extra DLLs" - DESCRIPTION "Extra DLLs for runtime dependency requirements" - ) - message(STATUS "") - message(STATUS "Including the following dlls into the install:") - foreach(_dll ${ALL_DLL_FILES}) - message(STATUS " ${_dll}") - endforeach(_dll) - install(FILES ${ALL_DLL_FILES} DESTINATION ${GR_RUNTIME_DIR} COMPONENT "extra_dlls") -endif() - -######################################################################## # Setup volk as a subproject ######################################################################## message(STATUS "") @@ -372,25 +351,6 @@ if(NOT VOLK_FOUND) set(VOLK_INSTALL_LIBRARY_DIR ${CMAKE_INSTALL_PREFIX}/lib) set(VOLK_INSTALL_INCLUDE_DIR ${CMAKE_INSTALL_PREFIX}/include) - - if(ENABLE_VOLK) - - include(GrPackage) - CPACK_SET(CPACK_COMPONENT_GROUP_VOLK_DESCRIPTION "Vector optimized library of kernels") - - CPACK_COMPONENT("volk_runtime" - GROUP "Volk" - DISPLAY_NAME "Runtime" - DESCRIPTION "Dynamic link libraries" - ) - - CPACK_COMPONENT("volk_devel" - GROUP "Volk" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - ) - - endif(ENABLE_VOLK) else() message(STATUS " An external VOLK has been found and will be used for build.") set(ENABLE_VOLK TRUE) @@ -401,8 +361,8 @@ endif(NOT VOLK_FOUND) message(STATUS " Override with -DENABLE_INTERNAL_VOLK=ON/OFF") -# Handle gr_log enable/disable -GR_LOGGING() +# Handle logging +find_package(Log4cpp) ######################################################################## # Distribute the README file @@ -410,7 +370,6 @@ GR_LOGGING() install( FILES README README.hacking DESTINATION ${GR_PKG_DOC_DIR} - COMPONENT "docs" ) ######################################################################## @@ -501,12 +460,8 @@ list(REMOVE_ITEM cmake_others install( FILES ${cmake_configs} ${cmake_others} DESTINATION ${CMAKE_MODULES_DIR}/gnuradio - COMPONENT "runtime_devel" ) -#finalize cpack after subdirs processed -include(GrPackage) -CPACK_FINALIZE() ######################################################################## # Print summary @@ -533,5 +488,4 @@ install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-runtime/include/gnuradio/config.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio - COMPONENT "runtime_devel" ) diff --git a/cmake/Modules/FindCodec2.cmake b/cmake/Modules/FindCodec2.cmake new file mode 100644 index 0000000000..1c917fed5b --- /dev/null +++ b/cmake/Modules/FindCodec2.cmake @@ -0,0 +1,67 @@ +# Copyright 2016 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# 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. + +############################## +# Check for system libcodec2 # +############################## + +INCLUDE(FindPkgConfig) +INCLUDE(FindPackageHandleStandardArgs) + +pkg_check_modules(LIBCODEC2_PKG QUIET codec2) + +find_path(LIBCODEC2_INCLUDE_DIR NAMES codec2.h + PATHS + ${LIBCODEC2_PKG_INCLUDE_DIRS} + /usr/include/codec2 + /usr/include + /usr/local/include/codec2 + /usr/local/include + ) + +find_library(LIBCODEC2_LIBRARIES NAMES codec2 + PATHS + ${LIBCODEC2_PKG_LIBRARY_DIRS} + /usr/lib + /usr/local/lib + ) + +if(LIBCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) + set(LIBCODEC2_FOUND TRUE) + set(LIBCODEC2_INCLUDE_DIRS ${LIBCODEC2_INCLUDE_DIR}) + set(LIBCODEC2_LIBRARIES ${LIBCODEC2_LIBRARIES} ${LIBCODEC2_LIBRARY}) + file(READ "${LIBCODEC2_INCLUDE_DIR}/codec2.h" _CODEC2_H_CONTENTS) + string(REGEX MATCHALL "CODEC2_MODE[_a-z0-9A-Z]+" CODEC2_MODES "${_CODEC2_H_CONTENTS}") + foreach(mode ${CODEC2_MODES}) + set(LIBCODEC2_HAS_${mode} True) + endforeach() + if(EXISTS "${LIBCODEC2_INCLUDE_DIR}/freedv_api.h") + set(LIBCODEC2_HAS_FREEDV_API True) + file(READ "${LIBCODEC2_INCLUDE_DIR}/freedv_api.h" _FREEDV_API_H_CONTENTS) + string(REGEX MATCHALL "FREEDV_MODE[_a-z0-9A-Z]+" FREEDV_MODES "${_FREEDV_API_H_CONTENTS}") + foreach(mode ${FREEDV_MODES}) + set(LIBCODEC2_HAS_${mode} True) + endforeach() + else() + set(LIBCODEC2_HAS_FREEDV_API false) + endif() +endif(LIBCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBCODEC2 DEFAULT_MSG LIBCODEC2_LIBRARIES LIBCODEC2_INCLUDE_DIRS) +mark_as_advanced(LIBCODEC2_INCLUDE_DIR LIBCODEC2_LIBRARIES) diff --git a/cmake/Modules/FindGSM.cmake b/cmake/Modules/FindGSM.cmake new file mode 100644 index 0000000000..7db2adae18 --- /dev/null +++ b/cmake/Modules/FindGSM.cmake @@ -0,0 +1,52 @@ +# Copyright 2016 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# 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. + +########################### +# Check for system libgsm # +########################### + +INCLUDE(FindPkgConfig) +INCLUDE(FindPackageHandleStandardArgs) + +pkg_check_modules(LIBGSM_PKG QUIET gsm) + +find_path(LIBGSM_INCLUDE_DIR NAMES gsm.h + PATHS + ${LIBGSM_PKG_INCLUDE_DIRS} + /usr/local/include/gsm + /usr/local/include + /usr/include/gsm + /usr/include + ) + +find_library(LIBGSM_LIBRARIES NAMES gsm + PATHS + ${LIBGSM_PKG_LIBRARY_DIRS} + /usr/local/lib + /usr/lib + ) + +if(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) + set(LIBGSM_FOUND TRUE) + set(LIBGSM_INCLUDE_DIRS ${LIBGSM_INCLUDE_DIR}) + set(LIBGSM_LIBRARIES ${LIBGSM_LIBRARIES} ${LIBGSM_LIBRARY}) +endif(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIBGSM DEFAULT_MSG LIBGSM_LIBRARIES LIBGSM_INCLUDE_DIRS) +mark_as_advanced(LIBGSM_INCLUDE_DIR LIBGSM_LIBRARIES) diff --git a/cmake/Modules/GrMiscUtils.cmake b/cmake/Modules/GrMiscUtils.cmake index 188c40480b..b158a08d07 100644 --- a/cmake/Modules/GrMiscUtils.cmake +++ b/cmake/Modules/GrMiscUtils.cmake @@ -108,7 +108,6 @@ endmacro(GR_ADD_CXX_COMPILER_FLAG_IF_AVAILABLE) # Generates the .la libtool file # This appears to generate libtool files that cannot be used by auto*. # Usage GR_LIBTOOL(TARGET [target] DESTINATION [dest]) -# Notice: there is not COMPONENT option, these will not get distributed. ######################################################################## function(GR_LIBTOOL) if(NOT DEFINED GENERATE_LIBTOOL) @@ -135,18 +134,14 @@ endfunction(GR_LIBTOOL) # Also handle gnuradio custom naming conventions w/ extras mode. ######################################################################## function(GR_LIBRARY_FOO target) - #parse the arguments for component names - include(CMakeParseArgumentsCopy) - CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN}) - #set additional target properties set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER}) #install the generated files like so... install(TARGETS ${target} - LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file - ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT} # .lib file - RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file + LIBRARY DESTINATION ${GR_LIBRARY_DIR} # .so/.dylib file + ARCHIVE DESTINATION ${GR_LIBRARY_DIR} # .lib file + RUNTIME DESTINATION ${GR_RUNTIME_DIR} # .dll file ) #extras mode enabled automatically on linux @@ -178,7 +173,7 @@ function(GR_LIBRARY_FOO target) FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0 - DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} + DESTINATION ${GR_LIBRARY_DIR} ) endif(LIBRARY_EXTRAS) @@ -216,49 +211,6 @@ function(GR_GEN_TARGET_DEPS name var) endfunction(GR_GEN_TARGET_DEPS) ######################################################################## -# Control use of gr_logger -# Usage: -# GR_LOGGING() -# -# Will set ENABLE_GR_LOG to 1 by default. -# Can manually set with -DENABLE_GR_LOG=0|1 -######################################################################## -function(GR_LOGGING) - find_package(Log4cpp) - - OPTION(ENABLE_GR_LOG "Use gr_logger" ON) - if(ENABLE_GR_LOG) - # If gr_logger is enabled, make it usable - add_definitions( -DENABLE_GR_LOG ) - - # also test LOG4CPP; if we have it, use this version of the logger - # otherwise, default to the stdout/stderr model. - if(LOG4CPP_FOUND) - SET(HAVE_LOG4CPP True CACHE INTERNAL "" FORCE) - add_definitions( -DHAVE_LOG4CPP ) - else(not LOG4CPP_FOUND) - SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE) - SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE) - endif(LOG4CPP_FOUND) - - SET(ENABLE_GR_LOG ${ENABLE_GR_LOG} CACHE INTERNAL "" FORCE) - - else(ENABLE_GR_LOG) - SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE) - SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE) - endif(ENABLE_GR_LOG) - - message(STATUS "ENABLE_GR_LOG set to ${ENABLE_GR_LOG}.") - message(STATUS "HAVE_LOG4CPP set to ${HAVE_LOG4CPP}.") - message(STATUS "LOG4CPP_LIBRARIES set to ${LOG4CPP_LIBRARIES}.") - -endfunction(GR_LOGGING) - -######################################################################## # Run GRCC to compile .grc files into .py files. # # Usage: GRCC(filename, directory) diff --git a/cmake/Modules/GrPackage.cmake b/cmake/Modules/GrPackage.cmake deleted file mode 100644 index 54a752661d..0000000000 --- a/cmake/Modules/GrPackage.cmake +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright 2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# 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. - -if(DEFINED __INCLUDED_GR_PACKAGE_CMAKE) - return() -endif() -set(__INCLUDED_GR_PACKAGE_CMAKE TRUE) - -include(GrVersion) #sets version information -include(GrPlatform) #sets platform information - -#set the cpack generator based on the platform type -if(CPACK_GENERATOR) - #already set by user -elseif(APPLE) - set(CPACK_GENERATOR PackageMaker) -elseif(WIN32) - set(CPACK_GENERATOR NSIS) -elseif(DEBIAN) - set(CPACK_GENERATOR DEB) -elseif(REDHAT) - set(CPACK_GENERATOR RPM) -else() - set(CPACK_GENERATOR TGZ) -endif() - -######################################################################## -# CPACK_SET - set a global variable and record the variable name -######################################################################## -function(CPACK_SET var) - set(${var} ${ARGN} CACHE INTERNAL "") - list(APPEND _cpack_vars ${var}) - list(REMOVE_DUPLICATES _cpack_vars) - set(_cpack_vars ${_cpack_vars} CACHE INTERNAL "") -endfunction(CPACK_SET) - -######################################################################## -# CPACK_FINALIZE - include cpack and the unset all the cpack variables -######################################################################## -function(CPACK_FINALIZE) - - #set the package depends for monolithic package - foreach(comp ${CPACK_COMPONENTS_ALL}) - string(TOUPPER "PACKAGE_DEPENDS_${comp}" package_depends_var) - list(APPEND PACKAGE_DEPENDS_ALL ${${package_depends_var}}) - endforeach(comp) - string(REPLACE ";" ", " CPACK_DEBIAN_PACKAGE_DEPENDS "${PACKAGE_DEPENDS_ALL}") - string(REPLACE ";" ", " CPACK_RPM_PACKAGE_REQUIRES "${PACKAGE_DEPENDS_ALL}") - - include(CPack) #finalize the cpack settings configured throughout the build system - foreach(var ${_cpack_vars}) - unset(${var} CACHE) - endforeach(var) - unset(_cpack_vars CACHE) -endfunction(CPACK_FINALIZE) - -######################################################################## -# CPACK_COMPONENT - convenience function to create a cpack component -# -# Usage: CPACK_COMPONENT( -# name -# [GROUP group] -# [DISPLAY_NAME display_name] -# [DESCRIPTION description] -# [DEPENDS depends] -# ) -######################################################################## -function(CPACK_COMPONENT name) - include(CMakeParseArgumentsCopy) - set(_options GROUP DISPLAY_NAME DESCRIPTION DEPENDS) - CMAKE_PARSE_ARGUMENTS(CPACK_COMPONENT "" "${_options}" "" ${ARGN}) - - string(TOUPPER "${name}" name_upper) - foreach(_option ${_options}) - if(CPACK_COMPONENT_${_option}) - CPACK_SET(CPACK_COMPONENT_${name_upper}_${_option} "${CPACK_COMPONENT_${_option}}") - endif() - endforeach(_option) - - CPACK_SET(CPACK_COMPONENTS_ALL "${CPACK_COMPONENTS_ALL};${name}") - -endfunction(CPACK_COMPONENT) - -######################################################################## -# Setup CPack -######################################################################## -set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GNU Radio - The GNU Software Radio") -set(CPACK_PACKAGE_VENDOR "Free Software Foundation, Inc.") -set(CPACK_PACKAGE_CONTACT "Discuss GNURadio <discuss-gnuradio@gnu.org>") -string(REPLACE "v" "" CPACK_PACKAGE_VERSION ${VERSION}) -set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/README) -set(CPACK_RESOURCE_FILE_README ${CMAKE_SOURCE_DIR}/README) -set(CPACK_RESOURCE_FILE_WELCOME ${CMAKE_SOURCE_DIR}/README) - -find_program(LSB_RELEASE_EXECUTABLE lsb_release) - -if((DEBIAN OR REDHAT) AND LSB_RELEASE_EXECUTABLE) - - #extract system information by executing the commands - execute_process( - COMMAND ${LSB_RELEASE_EXECUTABLE} --short --id - OUTPUT_VARIABLE LSB_ID OUTPUT_STRIP_TRAILING_WHITESPACE - ) - execute_process( - COMMAND ${LSB_RELEASE_EXECUTABLE} --short --release - OUTPUT_VARIABLE LSB_RELEASE OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - #set a more sensible package name for this system - SET(CPACK_PACKAGE_FILE_NAME "gnuradio_${CPACK_PACKAGE_VERSION}_${LSB_ID}-${LSB_RELEASE}-${CMAKE_SYSTEM_PROCESSOR}") - - #now try to include the component based dependencies - set(package_deps_file "${CMAKE_SOURCE_DIR}/cmake/Packaging/${LSB_ID}-${LSB_RELEASE}.cmake") - if (EXISTS ${package_deps_file}) - include(${package_deps_file}) - endif() - -endif() - -if(${CPACK_GENERATOR} STREQUAL NSIS) - - ENABLE_LANGUAGE(C) - - include(CheckTypeSize) - check_type_size("void*[8]" BIT_WIDTH BUILTIN_TYPES_ONLY) - SET(CPACK_PACKAGE_FILE_NAME "gnuradio_${CPACK_PACKAGE_VERSION}_Win${BIT_WIDTH}") - - set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_NAME}") -endif() - -######################################################################## -# DEB package specific -######################################################################## -foreach(filename preinst postinst prerm postrm) - list(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_BINARY_DIR}/Packaging/${filename}) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Packaging) - configure_file( - ${CMAKE_SOURCE_DIR}/cmake/Packaging/${filename}.in - ${CMAKE_BINARY_DIR}/Packaging/${filename} - @ONLY) -endforeach(filename) - -######################################################################## -# RPM package specific -######################################################################## -foreach(filename post_install post_uninstall pre_install pre_uninstall) - string(TOUPPER ${filename} filename_upper) - list(APPEND CPACK_RPM_${filename_upper}_SCRIPT_FILE ${CMAKE_BINARY_DIR}/Packaging/${filename}) - file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Packaging) - configure_file( - ${CMAKE_SOURCE_DIR}/cmake/Packaging/${filename}.in - ${CMAKE_BINARY_DIR}/Packaging/${filename} - @ONLY) -endforeach(filename) - -######################################################################## -# NSIS package specific -######################################################################## -set(CPACK_NSIS_MODIFY_PATH ON) - -set(HLKM_ENV "\\\"SYSTEM\\\\CurrentControlSet\\\\Control\\\\Session Manager\\\\Environment\\\"") - -IF(WIN32) - #Install necessary runtime DLL's - INCLUDE(InstallRequiredSystemLibraries) -ENDIF(WIN32) diff --git a/cmake/Modules/GrPython.cmake b/cmake/Modules/GrPython.cmake index 06e061e212..0bfa92db8d 100644 --- a/cmake/Modules/GrPython.cmake +++ b/cmake/Modules/GrPython.cmake @@ -130,7 +130,7 @@ endfunction(GR_UNIQUE_TARGET) ######################################################################## function(GR_PYTHON_INSTALL) include(CMakeParseArgumentsCopy) - CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN}) + CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION" "FILES;PROGRAMS" ${ARGN}) #################################################################### if(GR_PYTHON_INSTALL_FILES) @@ -182,7 +182,6 @@ function(GR_PYTHON_INSTALL) set(python_install_gen_targets ${pycfiles} ${pyofiles}) install(FILES ${python_install_gen_targets} DESTINATION ${GR_PYTHON_INSTALL_DESTINATION} - COMPONENT ${GR_PYTHON_INSTALL_COMPONENT} ) #################################################################### @@ -219,7 +218,6 @@ function(GR_PYTHON_INSTALL) install(PROGRAMS ${pyexefile} RENAME ${pyfile_name} DESTINATION ${GR_PYTHON_INSTALL_DESTINATION} - COMPONENT ${GR_PYTHON_INSTALL_COMPONENT} ) endforeach(pyfile) diff --git a/cmake/Modules/GrSwig.cmake b/cmake/Modules/GrSwig.cmake index ef3a76eb4c..400cde295d 100644 --- a/cmake/Modules/GrSwig.cmake +++ b/cmake/Modules/GrSwig.cmake @@ -202,24 +202,21 @@ endmacro(GR_SWIG_MAKE) # GR_SWIG_INSTALL( # TARGETS target target target... # [DESTINATION destination] -# [COMPONENT component] # ) ######################################################################## macro(GR_SWIG_INSTALL) include(CMakeParseArgumentsCopy) - CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN}) + CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION" "TARGETS" ${ARGN}) foreach(name ${GR_SWIG_INSTALL_TARGETS}) install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME} DESTINATION ${GR_SWIG_INSTALL_DESTINATION} - COMPONENT ${GR_SWIG_INSTALL_COMPONENT} ) include(GrPython) GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py DESTINATION ${GR_SWIG_INSTALL_DESTINATION} - COMPONENT ${GR_SWIG_INSTALL_COMPONENT} ) GR_LIBTOOL( diff --git a/cmake/Modules/GrVersion.cmake b/cmake/Modules/GrVersion.cmake index dceac67bab..414c34d64f 100644 --- a/cmake/Modules/GrVersion.cmake +++ b/cmake/Modules/GrVersion.cmake @@ -33,6 +33,16 @@ set(MAINT_VERSION ${VERSION_INFO_MAINT_VERSION}) ######################################################################## find_package(Git) +MACRO(create_manual_git_describe) + if(NOT GR_GIT_COUNT) + set(GR_GIT_COUNT "compat-xxx") + endif() + if(NOT GR_GIT_HASH) + set(GR_GIT_HASH "xunknown") + endif() + set(GIT_DESCRIBE "v${MAJOR_VERSION}.${API_COMPAT}-${GR_GIT_COUNT}-${GR_GIT_HASH}") +ENDMACRO() + if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git) message(STATUS "Extracting version information from git describe...") execute_process( @@ -40,14 +50,11 @@ if(GIT_FOUND AND EXISTS ${CMAKE_SOURCE_DIR}/.git) OUTPUT_VARIABLE GIT_DESCRIBE OUTPUT_STRIP_TRAILING_WHITESPACE WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) -else() - if(NOT GR_GIT_COUNT) - set(GR_GIT_COUNT "compat-xxx") - endif() - if(NOT GR_GIT_HASH) - set(GR_GIT_HASH "xunknown") + if(GIT_DESCRIBE STREQUAL "") + create_manual_git_describe() endif() - set(GIT_DESCRIBE "v${MAJOR_VERSION}.${API_COMPAT}-${GR_GIT_COUNT}-${GR_GIT_HASH}") +else() + create_manual_git_describe() endif() ######################################################################## diff --git a/cmake/Modules/NSIS.InstallOptions.ini.in b/cmake/Modules/NSIS.InstallOptions.ini.in deleted file mode 100644 index 46b6c1605b..0000000000 --- a/cmake/Modules/NSIS.InstallOptions.ini.in +++ /dev/null @@ -1,37 +0,0 @@ -[Settings] -NumFields=4 - -[Field 1] -Type=label -Text=By default GNU Radio does not add its directory to the system PATH. -Left=0 -Right=-1 -Top=0 -Bottom=20 - -[Field 2] -Type=radiobutton -Text=Do not add GNU Radio to the system PATH -Left=0 -Right=-1 -Top=30 -Bottom=40 -State=1 - -[Field 3] -Type=radiobutton -Text=Add GNU Radio to the system PATH for all users -Left=0 -Right=-1 -Top=40 -Bottom=50 -State=0 - -[Field 4] -Type=radiobutton -Text=Add GNU Radio to the system PATH for current user -Left=0 -Right=-1 -Top=50 -Bottom=60 -State=0 diff --git a/cmake/Modules/NSIS.template.in b/cmake/Modules/NSIS.template.in deleted file mode 100644 index 910fafdedd..0000000000 --- a/cmake/Modules/NSIS.template.in +++ /dev/null @@ -1,951 +0,0 @@ -; CPack install script designed for a nmake build - -;-------------------------------- -; You must define these values - - !define VERSION "@CPACK_PACKAGE_VERSION@" - !define PATCH "@CPACK_PACKAGE_VERSION_PATCH@" - !define INST_DIR "@CPACK_TEMPORARY_DIRECTORY@" - -;-------------------------------- -;Variables - - Var MUI_TEMP - Var STARTMENU_FOLDER - Var SV_ALLUSERS - Var START_MENU - Var DO_NOT_ADD_TO_PATH - Var ADD_TO_PATH_ALL_USERS - Var ADD_TO_PATH_CURRENT_USER - Var INSTALL_DESKTOP - Var IS_DEFAULT_INSTALLDIR -;-------------------------------- -;Include Modern UI - - !include "MUI.nsh" - - ;Default installation folder - InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" - -;-------------------------------- -;General - - ;Name and file - Name "GNU Radio" - OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" - - ;Set compression - SetCompressor @CPACK_NSIS_COMPRESSOR@ - -@CPACK_NSIS_DEFINES@ - - !include Sections.nsh - -;--- Component support macros: --- -; The code for the add/remove functionality is from: -; http://nsis.sourceforge.net/Add/Remove_Functionality -; It has been modified slightly and extended to provide -; inter-component dependencies. -Var AR_SecFlags -Var AR_RegFlags -@CPACK_NSIS_SECTION_SELECTED_VARS@ - -; Loads the "selected" flag for the section named SecName into the -; variable VarName. -!macro LoadSectionSelectedIntoVar SecName VarName - SectionGetFlags ${${SecName}} $${VarName} - IntOp $${VarName} $${VarName} & ${SF_SELECTED} ;Turn off all other bits -!macroend - -; Loads the value of a variable... can we get around this? -!macro LoadVar VarName - IntOp $R0 0 + $${VarName} -!macroend - -; Sets the value of a variable -!macro StoreVar VarName IntValue - IntOp $${VarName} 0 + ${IntValue} -!macroend - -!macro InitSection SecName - ; This macro reads component installed flag from the registry and - ;changes checked state of the section on the components page. - ;Input: section index constant name specified in Section command. - - ClearErrors - ;Reading component status from registry - ReadRegDWORD $AR_RegFlags HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" "Installed" - IfErrors "default_${SecName}" - ;Status will stay default if registry value not found - ;(component was never installed) - IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits - SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading default section flags - IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE ;Turn lowest (enabled) bit off - IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags ;Change lowest bit - - ; Note whether this component was installed before - !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags - IntOp $R0 $AR_RegFlags & $AR_RegFlags - - ;Writing modified flags - SectionSetFlags ${${SecName}} $AR_SecFlags - - "default_${SecName}:" - !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected -!macroend - -!macro FinishSection SecName - ; This macro reads section flag set by user and removes the section - ;if it is not selected. - ;Then it writes component installed flag to registry - ;Input: section index constant name specified in Section command. - - SectionGetFlags ${${SecName}} $AR_SecFlags ;Reading section flags - ;Checking lowest bit: - IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED} - IntCmp $AR_SecFlags 1 "leave_${SecName}" - ;Section is not selected: - ;Calling Section uninstall macro and writing zero installed flag - !insertmacro "Remove_${${SecName}}" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ - "Installed" 0 - Goto "exit_${SecName}" - - "leave_${SecName}:" - ;Section is selected: - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\Components\${SecName}" \ - "Installed" 1 - - "exit_${SecName}:" -!macroend - -!macro RemoveSection SecName - ; This macro is used to call section's Remove_... macro - ;from the uninstaller. - ;Input: section index constant name specified in Section command. - - !insertmacro "Remove_${${SecName}}" -!macroend - -; Determine whether the selection of SecName changed -!macro MaybeSelectionChanged SecName - !insertmacro LoadVar ${SecName}_selected - SectionGetFlags ${${SecName}} $R1 - IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits - - ; See if the status has changed: - IntCmp $R0 $R1 "${SecName}_unchanged" - !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected - - IntCmp $R1 ${SF_SELECTED} "${SecName}_was_selected" - !insertmacro "Deselect_required_by_${SecName}" - goto "${SecName}_unchanged" - - "${SecName}_was_selected:" - !insertmacro "Select_${SecName}_depends" - - "${SecName}_unchanged:" -!macroend -;--- End of Add/Remove macros --- - -;-------------------------------- -;Interface Settings - - !define MUI_HEADERIMAGE - !define MUI_ABORTWARNING - -;-------------------------------- -; path functions - -!verbose 3 -!include "WinMessages.NSH" -!verbose 4 - -;---------------------------------------- -; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02" -;---------------------------------------- -!verbose 3 -!include "WinMessages.NSH" -!verbose 4 -;==================================================== -; get_NT_environment -; Returns: the selected environment -; Output : head of the stack -;==================================================== -!macro select_NT_profile UN -Function ${UN}select_NT_profile - StrCmp $ADD_TO_PATH_ALL_USERS "1" 0 environment_single - DetailPrint "Selected environment for all users" - Push "all" - Return - environment_single: - DetailPrint "Selected environment for current user only." - Push "current" - Return -FunctionEnd -!macroend -!insertmacro select_NT_profile "" -!insertmacro select_NT_profile "un." -;---------------------------------------------------- -!define NT_current_env 'HKCU "Environment"' -!define NT_all_env 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' - -!ifndef WriteEnvStr_RegKey - !ifdef ALL_USERS - !define WriteEnvStr_RegKey \ - 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"' - !else - !define WriteEnvStr_RegKey 'HKCU "Environment"' - !endif -!endif - -; AddToPath - Adds the given dir to the search path. -; Input - head of the stack -; Note - Win9x systems requires reboot - -Function AddToPath - Exch $0 - Push $1 - Push $2 - Push $3 - - # don't add if the path doesn't exist - IfFileExists "$0\*.*" "" AddToPath_done - - ReadEnvStr $1 PATH - ; if the path is too long for a NSIS variable NSIS will return a 0 - ; length string. If we find that, then warn and skip any path - ; modification as it will trash the existing path. - StrLen $2 $1 - IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done - CheckPathLength_ShowPathWarning: - Messagebox MB_OK|MB_ICONEXCLAMATION "Warning! PATH too long installer unable to modify PATH!" - Goto AddToPath_done - CheckPathLength_Done: - Push "$1;" - Push "$0;" - Call StrStr - Pop $2 - StrCmp $2 "" "" AddToPath_done - Push "$1;" - Push "$0\;" - Call StrStr - Pop $2 - StrCmp $2 "" "" AddToPath_done - GetFullPathName /SHORT $3 $0 - Push "$1;" - Push "$3;" - Call StrStr - Pop $2 - StrCmp $2 "" "" AddToPath_done - Push "$1;" - Push "$3\;" - Call StrStr - Pop $2 - StrCmp $2 "" "" AddToPath_done - - Call IsNT - Pop $1 - StrCmp $1 1 AddToPath_NT - ; Not on NT - StrCpy $1 $WINDIR 2 - FileOpen $1 "$1\autoexec.bat" a - FileSeek $1 -1 END - FileReadByte $1 $2 - IntCmp $2 26 0 +2 +2 # DOS EOF - FileSeek $1 -1 END # write over EOF - FileWrite $1 "$\r$\nSET PATH=%PATH%;$3$\r$\n" - FileClose $1 - SetRebootFlag true - Goto AddToPath_done - - AddToPath_NT: - StrCmp $ADD_TO_PATH_ALL_USERS "1" ReadAllKey - ReadRegStr $1 ${NT_current_env} "PATH" - Goto DoTrim - ReadAllKey: - ReadRegStr $1 ${NT_all_env} "PATH" - DoTrim: - StrCmp $1 "" AddToPath_NTdoIt - Push $1 - Call Trim - Pop $1 - StrCpy $0 "$1;$0" - AddToPath_NTdoIt: - StrCmp $ADD_TO_PATH_ALL_USERS "1" WriteAllKey - WriteRegExpandStr ${NT_current_env} "PATH" $0 - Goto DoSend - WriteAllKey: - WriteRegExpandStr ${NT_all_env} "PATH" $0 - DoSend: - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - - AddToPath_done: - Pop $3 - Pop $2 - Pop $1 - Pop $0 -FunctionEnd - - -; RemoveFromPath - Remove a given dir from the path -; Input: head of the stack - -Function un.RemoveFromPath - Exch $0 - Push $1 - Push $2 - Push $3 - Push $4 - Push $5 - Push $6 - - IntFmt $6 "%c" 26 # DOS EOF - - Call un.IsNT - Pop $1 - StrCmp $1 1 unRemoveFromPath_NT - ; Not on NT - StrCpy $1 $WINDIR 2 - FileOpen $1 "$1\autoexec.bat" r - GetTempFileName $4 - FileOpen $2 $4 w - GetFullPathName /SHORT $0 $0 - StrCpy $0 "SET PATH=%PATH%;$0" - Goto unRemoveFromPath_dosLoop - - unRemoveFromPath_dosLoop: - FileRead $1 $3 - StrCpy $5 $3 1 -1 # read last char - StrCmp $5 $6 0 +2 # if DOS EOF - StrCpy $3 $3 -1 # remove DOS EOF so we can compare - StrCmp $3 "$0$\r$\n" unRemoveFromPath_dosLoopRemoveLine - StrCmp $3 "$0$\n" unRemoveFromPath_dosLoopRemoveLine - StrCmp $3 "$0" unRemoveFromPath_dosLoopRemoveLine - StrCmp $3 "" unRemoveFromPath_dosLoopEnd - FileWrite $2 $3 - Goto unRemoveFromPath_dosLoop - unRemoveFromPath_dosLoopRemoveLine: - SetRebootFlag true - Goto unRemoveFromPath_dosLoop - - unRemoveFromPath_dosLoopEnd: - FileClose $2 - FileClose $1 - StrCpy $1 $WINDIR 2 - Delete "$1\autoexec.bat" - CopyFiles /SILENT $4 "$1\autoexec.bat" - Delete $4 - Goto unRemoveFromPath_done - - unRemoveFromPath_NT: - StrCmp $ADD_TO_PATH_ALL_USERS "1" unReadAllKey - ReadRegStr $1 ${NT_current_env} "PATH" - Goto unDoTrim - unReadAllKey: - ReadRegStr $1 ${NT_all_env} "PATH" - unDoTrim: - StrCpy $5 $1 1 -1 # copy last char - StrCmp $5 ";" +2 # if last char != ; - StrCpy $1 "$1;" # append ; - Push $1 - Push "$0;" - Call un.StrStr ; Find `$0;` in $1 - Pop $2 ; pos of our dir - StrCmp $2 "" unRemoveFromPath_done - ; else, it is in path - # $0 - path to add - # $1 - path var - StrLen $3 "$0;" - StrLen $4 $2 - StrCpy $5 $1 -$4 # $5 is now the part before the path to remove - StrCpy $6 $2 "" $3 # $6 is now the part after the path to remove - StrCpy $3 $5$6 - - StrCpy $5 $3 1 -1 # copy last char - StrCmp $5 ";" 0 +2 # if last char == ; - StrCpy $3 $3 -1 # remove last char - - StrCmp $ADD_TO_PATH_ALL_USERS "1" unWriteAllKey - WriteRegExpandStr ${NT_current_env} "PATH" $3 - Goto unDoSend - unWriteAllKey: - WriteRegExpandStr ${NT_all_env} "PATH" $3 - unDoSend: - SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000 - - unRemoveFromPath_done: - Pop $6 - Pop $5 - Pop $4 - Pop $3 - Pop $2 - Pop $1 - Pop $0 -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Uninstall sutff -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -########################################### -# Utility Functions # -########################################### - -;==================================================== -; IsNT - Returns 1 if the current system is NT, 0 -; otherwise. -; Output: head of the stack -;==================================================== -; IsNT -; no input -; output, top of the stack = 1 if NT or 0 if not -; -; Usage: -; Call IsNT -; Pop $R0 -; ($R0 at this point is 1 or 0) - -!macro IsNT un -Function ${un}IsNT - Push $0 - ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - StrCmp $0 "" 0 IsNT_yes - ; we are not NT. - Pop $0 - Push 0 - Return - - IsNT_yes: - ; NT!!! - Pop $0 - Push 1 -FunctionEnd -!macroend -!insertmacro IsNT "" -!insertmacro IsNT "un." - -; StrStr -; input, top of stack = string to search for -; top of stack-1 = string to search in -; output, top of stack (replaces with the portion of the string remaining) -; modifies no other variables. -; -; Usage: -; Push "this is a long ass string" -; Push "ass" -; Call StrStr -; Pop $R0 -; ($R0 at this point is "ass string") - -!macro StrStr un -Function ${un}StrStr -Exch $R1 ; st=haystack,old$R1, $R1=needle - Exch ; st=old$R1,haystack - Exch $R2 ; st=old$R1,old$R2, $R2=haystack - Push $R3 - Push $R4 - Push $R5 - StrLen $R3 $R1 - StrCpy $R4 0 - ; $R1=needle - ; $R2=haystack - ; $R3=len(needle) - ; $R4=cnt - ; $R5=tmp - loop: - StrCpy $R5 $R2 $R3 $R4 - StrCmp $R5 $R1 done - StrCmp $R5 "" done - IntOp $R4 $R4 + 1 - Goto loop -done: - StrCpy $R1 $R2 "" $R4 - Pop $R5 - Pop $R4 - Pop $R3 - Pop $R2 - Exch $R1 -FunctionEnd -!macroend -!insertmacro StrStr "" -!insertmacro StrStr "un." - -Function Trim ; Added by Pelaca - Exch $R1 - Push $R2 -Loop: - StrCpy $R2 "$R1" 1 -1 - StrCmp "$R2" " " RTrim - StrCmp "$R2" "$\n" RTrim - StrCmp "$R2" "$\r" RTrim - StrCmp "$R2" ";" RTrim - GoTo Done -RTrim: - StrCpy $R1 "$R1" -1 - Goto Loop -Done: - Pop $R2 - Exch $R1 -FunctionEnd - -Function ConditionalAddToRegisty - Pop $0 - Pop $1 - StrCmp "$0" "" ConditionalAddToRegisty_EmptyString - WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" \ - "$1" "$0" - ;MessageBox MB_OK "Set Registry: '$1' to '$0'" - DetailPrint "Set install registry entry: '$1' to '$0'" - ConditionalAddToRegisty_EmptyString: -FunctionEnd - -;-------------------------------- - -!ifdef CPACK_USES_DOWNLOAD -Function DownloadFile - IfFileExists $INSTDIR\* +2 - CreateDirectory $INSTDIR - Pop $0 - - ; Skip if already downloaded - IfFileExists $INSTDIR\$0 0 +2 - Return - - StrCpy $1 "@CPACK_DOWNLOAD_SITE@" - - try_again: - NSISdl::download "$1/$0" "$INSTDIR\$0" - - Pop $1 - StrCmp $1 "success" success - StrCmp $1 "Cancelled" cancel - MessageBox MB_OK "Download failed: $1" - cancel: - Return - success: -FunctionEnd -!endif - -;-------------------------------- -; Installation types -@CPACK_NSIS_INSTALLATION_TYPES@ - -;-------------------------------- -; Component sections -@CPACK_NSIS_COMPONENT_SECTIONS@ - -;-------------------------------- -; Define some macro setting for the gui -@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@ -@CPACK_NSIS_INSTALLER_ICON_CODE@ -@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@ -@CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@ - -;-------------------------------- -;Pages - !insertmacro MUI_PAGE_WELCOME - - !insertmacro MUI_PAGE_LICENSE "@CPACK_RESOURCE_FILE_LICENSE@" - Page custom InstallOptionsPage - !insertmacro MUI_PAGE_DIRECTORY - - ;Start Menu Folder Page Configuration - !define MUI_STARTMENUPAGE_REGISTRY_ROOT "SHCTX" - !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" - !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" - !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER - - @CPACK_NSIS_PAGE_COMPONENTS@ - - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_PAGE_FINISH - - !insertmacro MUI_UNPAGE_CONFIRM - !insertmacro MUI_UNPAGE_INSTFILES - -;-------------------------------- -;Languages - - !insertmacro MUI_LANGUAGE "English" ;first language is the default language - !insertmacro MUI_LANGUAGE "Albanian" - !insertmacro MUI_LANGUAGE "Arabic" - !insertmacro MUI_LANGUAGE "Basque" - !insertmacro MUI_LANGUAGE "Belarusian" - !insertmacro MUI_LANGUAGE "Bosnian" - !insertmacro MUI_LANGUAGE "Breton" - !insertmacro MUI_LANGUAGE "Bulgarian" - !insertmacro MUI_LANGUAGE "Croatian" - !insertmacro MUI_LANGUAGE "Czech" - !insertmacro MUI_LANGUAGE "Danish" - !insertmacro MUI_LANGUAGE "Dutch" - !insertmacro MUI_LANGUAGE "Estonian" - !insertmacro MUI_LANGUAGE "Farsi" - !insertmacro MUI_LANGUAGE "Finnish" - !insertmacro MUI_LANGUAGE "French" - !insertmacro MUI_LANGUAGE "German" - !insertmacro MUI_LANGUAGE "Greek" - !insertmacro MUI_LANGUAGE "Hebrew" - !insertmacro MUI_LANGUAGE "Hungarian" - !insertmacro MUI_LANGUAGE "Icelandic" - !insertmacro MUI_LANGUAGE "Indonesian" - !insertmacro MUI_LANGUAGE "Irish" - !insertmacro MUI_LANGUAGE "Italian" - !insertmacro MUI_LANGUAGE "Japanese" - !insertmacro MUI_LANGUAGE "Korean" - !insertmacro MUI_LANGUAGE "Kurdish" - !insertmacro MUI_LANGUAGE "Latvian" - !insertmacro MUI_LANGUAGE "Lithuanian" - !insertmacro MUI_LANGUAGE "Luxembourgish" - !insertmacro MUI_LANGUAGE "Macedonian" - !insertmacro MUI_LANGUAGE "Malay" - !insertmacro MUI_LANGUAGE "Mongolian" - !insertmacro MUI_LANGUAGE "Norwegian" - !insertmacro MUI_LANGUAGE "Polish" - !insertmacro MUI_LANGUAGE "Portuguese" - !insertmacro MUI_LANGUAGE "PortugueseBR" - !insertmacro MUI_LANGUAGE "Romanian" - !insertmacro MUI_LANGUAGE "Russian" - !insertmacro MUI_LANGUAGE "Serbian" - !insertmacro MUI_LANGUAGE "SerbianLatin" - !insertmacro MUI_LANGUAGE "SimpChinese" - !insertmacro MUI_LANGUAGE "Slovak" - !insertmacro MUI_LANGUAGE "Slovenian" - !insertmacro MUI_LANGUAGE "Spanish" - !insertmacro MUI_LANGUAGE "Swedish" - !insertmacro MUI_LANGUAGE "Thai" - !insertmacro MUI_LANGUAGE "TradChinese" - !insertmacro MUI_LANGUAGE "Turkish" - !insertmacro MUI_LANGUAGE "Ukrainian" - !insertmacro MUI_LANGUAGE "Welsh" - - -;-------------------------------- -;Reserve Files - - ;These files should be inserted before other files in the data block - ;Keep these lines before any File command - ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA) - - ReserveFile "NSIS.InstallOptions.ini" - !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - -;-------------------------------- -;Installer Sections - -Section "-Core installation" - ;Use the entire tree produced by the INSTALL target. Keep the - ;list of directories here in sync with the RMDir commands below. - SetOutPath "$INSTDIR" - @CPACK_NSIS_FULL_INSTALL@ - - ;Store installation folder - WriteRegStr SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "" $INSTDIR - - ;Create uninstaller - WriteUninstaller "$INSTDIR\Uninstall.exe" - Push "DisplayName" - Push "@CPACK_NSIS_DISPLAY_NAME@" - Call ConditionalAddToRegisty - Push "DisplayVersion" - Push "@CPACK_PACKAGE_VERSION@" - Call ConditionalAddToRegisty - Push "Publisher" - Push "@CPACK_PACKAGE_VENDOR@" - Call ConditionalAddToRegisty - Push "UninstallString" - Push "$INSTDIR\Uninstall.exe" - Call ConditionalAddToRegisty - Push "NoRepair" - Push "1" - Call ConditionalAddToRegisty - - !ifdef CPACK_NSIS_ADD_REMOVE - ;Create add/remove functionality - Push "ModifyPath" - Push "$INSTDIR\AddRemove.exe" - Call ConditionalAddToRegisty - !else - Push "NoModify" - Push "1" - Call ConditionalAddToRegisty - !endif - - ; Optional registration - Push "DisplayIcon" - Push "$INSTDIR\@CPACK_NSIS_INSTALLED_ICON_NAME@" - Call ConditionalAddToRegisty - Push "HelpLink" - Push "@CPACK_NSIS_HELP_LINK@" - Call ConditionalAddToRegisty - Push "URLInfoAbout" - Push "@CPACK_NSIS_URL_INFO_ABOUT@" - Call ConditionalAddToRegisty - Push "Contact" - Push "@CPACK_NSIS_CONTACT@" - Call ConditionalAddToRegisty - !insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP "NSIS.InstallOptions.ini" "Field 5" "State" - !insertmacro MUI_STARTMENU_WRITE_BEGIN Application - - ;Create shortcuts - CreateDirectory "$SMPROGRAMS\$STARTMENU_FOLDER" -@CPACK_NSIS_CREATE_ICONS@ -@CPACK_NSIS_CREATE_ICONS_EXTRA@ - CreateShortCut "$SMPROGRAMS\$STARTMENU_FOLDER\Uninstall.lnk" "$INSTDIR\Uninstall.exe" - CreateShortcut "$SMPROGRAMS\$STARTMENU_FOLDER\GNU Radio Companion.lnk" "$INSTDIR\bin\gnuradio-companion.py" "" "" "" SW_SHOWMINIMIZED - - ;Read a value from an InstallOptions INI file - !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH "NSIS.InstallOptions.ini" "Field 2" "State" - !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS "NSIS.InstallOptions.ini" "Field 3" "State" - !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER "NSIS.InstallOptions.ini" "Field 4" "State" - - ; Write special uninstall registry entries - Push "StartMenu" - Push "$STARTMENU_FOLDER" - Call ConditionalAddToRegisty - Push "DoNotAddToPath" - Push "$DO_NOT_ADD_TO_PATH" - Call ConditionalAddToRegisty - Push "AddToPathAllUsers" - Push "$ADD_TO_PATH_ALL_USERS" - Call ConditionalAddToRegisty - Push "AddToPathCurrentUser" - Push "$ADD_TO_PATH_CURRENT_USER" - Call ConditionalAddToRegisty - Push "InstallToDesktop" - Push "$INSTALL_DESKTOP" - Call ConditionalAddToRegisty - - !insertmacro MUI_STARTMENU_WRITE_END - -@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@ - -SectionEnd - -Section "-Add to path" - Push $INSTDIR\bin - StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 doNotAddToPath - StrCmp $DO_NOT_ADD_TO_PATH "1" doNotAddToPath 0 - Call AddToPath - doNotAddToPath: -SectionEnd - -;-------------------------------- -; Create custom pages -Function InstallOptionsPage - !insertmacro MUI_HEADER_TEXT "Install Options" "Choose options for installing GNU Radio" - !insertmacro MUI_INSTALLOPTIONS_DISPLAY "NSIS.InstallOptions.ini" - -FunctionEnd - -;-------------------------------- -; determine admin versus local install -Function un.onInit - - ClearErrors - UserInfo::GetName - IfErrors noLM - Pop $0 - UserInfo::GetAccountType - Pop $1 - StrCmp $1 "Admin" 0 +3 - SetShellVarContext all - ;MessageBox MB_OK 'User "$0" is in the Admin group' - Goto done - StrCmp $1 "Power" 0 +3 - SetShellVarContext all - ;MessageBox MB_OK 'User "$0" is in the Power Users group' - Goto done - - noLM: - ;Get installation folder from registry if available - - done: - -FunctionEnd - -;--- Add/Remove callback functions: --- -!macro SectionList MacroName - ;This macro used to perform operation on multiple sections. - ;List all of your components in following manner here. -@CPACK_NSIS_COMPONENT_SECTION_LIST@ -!macroend - -Section -FinishComponents - ;Removes unselected components and writes component status to registry - !insertmacro SectionList "FinishSection" - -!ifdef CPACK_NSIS_ADD_REMOVE - ; Get the name of the installer executable - System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1' - StrCpy $R3 $R0 - - ; Strip off the last 13 characters, to see if we have AddRemove.exe - StrLen $R1 $R0 - IntOp $R1 $R0 - 13 - StrCpy $R2 $R0 13 $R1 - StrCmp $R2 "AddRemove.exe" addremove_installed - - ; We're not running AddRemove.exe, so install it - CopyFiles $R3 $INSTDIR\AddRemove.exe - - addremove_installed: -!endif -SectionEnd -;--- End of Add/Remove callback functions --- - -;-------------------------------- -; Component dependencies -Function .onSelChange - !insertmacro SectionList MaybeSelectionChanged -FunctionEnd - -;-------------------------------- -;Uninstaller Section - -Section "Uninstall" - ReadRegStr $START_MENU SHCTX \ - "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "StartMenu" - ;MessageBox MB_OK "Start menu is in: $START_MENU" - ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \ - "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "DoNotAddToPath" - ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \ - "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathAllUsers" - ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \ - "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "AddToPathCurrentUser" - ;MessageBox MB_OK "Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS" - ReadRegStr $INSTALL_DESKTOP SHCTX \ - "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" "InstallToDesktop" - ;MessageBox MB_OK "Install to desktop: $INSTALL_DESKTOP " - -@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@ - - ;Remove files we installed. - ;Keep the list of directories here in sync with the File commands above. -@CPACK_NSIS_DELETE_FILES@ -@CPACK_NSIS_DELETE_DIRECTORIES@ - -!ifdef CPACK_NSIS_ADD_REMOVE - ;Remove the add/remove program - Delete "$INSTDIR\AddRemove.exe" -!endif - - ;Remove the uninstaller itself. - Delete "$INSTDIR\Uninstall.exe" - DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" - - ;Remove the installation directory if it is empty. - RMDir "$INSTDIR" - - ; Remove the registry entries. - DeleteRegKey SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" - - ; Removes all optional components - !insertmacro SectionList "RemoveSection" - - !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP - - Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" -@CPACK_NSIS_DELETE_ICONS@ -@CPACK_NSIS_DELETE_ICONS_EXTRA@ - - ;Delete empty start menu parent diretories - StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" - - startMenuDeleteLoop: - ClearErrors - RMDir $MUI_TEMP - GetFullPathName $MUI_TEMP "$MUI_TEMP\.." - - IfErrors startMenuDeleteLoopDone - - StrCmp "$MUI_TEMP" "$SMPROGRAMS" startMenuDeleteLoopDone startMenuDeleteLoop - startMenuDeleteLoopDone: - - ; If the user changed the shortcut, then untinstall may not work. This should - ; try to fix it. - StrCpy $MUI_TEMP "$START_MENU" - Delete "$SMPROGRAMS\$MUI_TEMP\Uninstall.lnk" - Delete "$SMPROGRAMS\$MUI_TEMP\GNU Radio Companion.lnk" -@CPACK_NSIS_DELETE_ICONS_EXTRA@ - - ;Delete empty start menu parent diretories - StrCpy $MUI_TEMP "$SMPROGRAMS\$MUI_TEMP" - - secondStartMenuDeleteLoop: - ClearErrors - RMDir $MUI_TEMP - GetFullPathName $MUI_TEMP "$MUI_TEMP\.." - - IfErrors secondStartMenuDeleteLoopDone - - StrCmp "$MUI_TEMP" "$SMPROGRAMS" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop - secondStartMenuDeleteLoopDone: - - DeleteRegKey /ifempty SHCTX "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" - - Push $INSTDIR\bin - StrCmp $DO_NOT_ADD_TO_PATH_ "1" doNotRemoveFromPath 0 - Call un.RemoveFromPath - doNotRemoveFromPath: -SectionEnd - -;-------------------------------- -; determine admin versus local install -; Is install for "AllUsers" or "JustMe"? -; Default to "JustMe" - set to "AllUsers" if admin or on Win9x -; This function is used for the very first "custom page" of the installer. -; This custom page does not show up visibly, but it executes prior to the -; first visible page and sets up $INSTDIR properly... -; Choose different default installation folder based on SV_ALLUSERS... -; "Program Files" for AllUsers, "My Documents" for JustMe... - -Function .onInit - ; Reads components status for registry - !insertmacro SectionList "InitSection" - - ; check to see if /D has been used to change - ; the install directory by comparing it to the - ; install directory that is expected to be the - ; default - StrCpy $IS_DEFAULT_INSTALLDIR 0 - StrCmp "$INSTDIR" "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" 0 +2 - StrCpy $IS_DEFAULT_INSTALLDIR 1 - - StrCpy $SV_ALLUSERS "JustMe" - ; if default install dir then change the default - ; if it is installed for JustMe - StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 - StrCpy $INSTDIR "$DOCUMENTS\@CPACK_PACKAGE_INSTALL_DIRECTORY@" - - ClearErrors - UserInfo::GetName - IfErrors noLM - Pop $0 - UserInfo::GetAccountType - Pop $1 - StrCmp $1 "Admin" 0 +3 - SetShellVarContext all - ;MessageBox MB_OK 'User "$0" is in the Admin group' - StrCpy $SV_ALLUSERS "AllUsers" - Goto done - StrCmp $1 "Power" 0 +3 - SetShellVarContext all - ;MessageBox MB_OK 'User "$0" is in the Power Users group' - StrCpy $SV_ALLUSERS "AllUsers" - Goto done - - noLM: - StrCpy $SV_ALLUSERS "AllUsers" - ;Get installation folder from registry if available - - done: - StrCmp $SV_ALLUSERS "AllUsers" 0 +3 - StrCmp "$IS_DEFAULT_INSTALLDIR" "1" 0 +2 - StrCpy $INSTDIR "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" - - StrCmp "@CPACK_NSIS_MODIFY_PATH@" "ON" 0 noOptionsPage - !insertmacro MUI_INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini" - - noOptionsPage: -FunctionEnd diff --git a/cmake/Packaging/Fedora-15.cmake b/cmake/Packaging/Fedora-15.cmake deleted file mode 100644 index 4e648486e1..0000000000 --- a/cmake/Packaging/Fedora-15.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "fftw-libs") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "qt" "qwt") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "PyQt4") -SET(PACKAGE_DEPENDS_GRC "python" "numpy" "gtk2" "python-lxml" "python-cheetah" "python-mako") -SET(PACKAGE_DEPENDS_WXGUI "wxGTK" "python" "numpy") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "SDL") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "pulseaudio" "alsa-lib" "jack-audio-connection-kit") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "gsl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "numpy") diff --git a/cmake/Packaging/Fedora-16.cmake b/cmake/Packaging/Fedora-16.cmake deleted file mode 100644 index 4e648486e1..0000000000 --- a/cmake/Packaging/Fedora-16.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "fftw-libs") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "qt" "qwt") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "PyQt4") -SET(PACKAGE_DEPENDS_GRC "python" "numpy" "gtk2" "python-lxml" "python-cheetah" "python-mako") -SET(PACKAGE_DEPENDS_WXGUI "wxGTK" "python" "numpy") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "SDL") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "pulseaudio" "alsa-lib" "jack-audio-connection-kit") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "gsl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "numpy") diff --git a/cmake/Packaging/Fedora-17.cmake b/cmake/Packaging/Fedora-17.cmake deleted file mode 100644 index 4e7ff51f9f..0000000000 --- a/cmake/Packaging/Fedora-17.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "fftw-libs") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "qt" "qwt") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "PyQt4") -SET(PACKAGE_DEPENDS_GRC "python" "numpy" "gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "wxGTK" "python" "numpy" "PyOpenGL") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "SDL") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "pulseaudio" "alsa-lib" "jack-audio-connection-kit") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "gsl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "numpy") diff --git a/cmake/Packaging/Fedora-18.cmake b/cmake/Packaging/Fedora-18.cmake deleted file mode 100644 index 4e7ff51f9f..0000000000 --- a/cmake/Packaging/Fedora-18.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "fftw-libs") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "qt" "qwt") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "PyQt4") -SET(PACKAGE_DEPENDS_GRC "python" "numpy" "gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "wxGTK" "python" "numpy" "PyOpenGL") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "SDL") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "pulseaudio" "alsa-lib" "jack-audio-connection-kit") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "gsl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "numpy") diff --git a/cmake/Packaging/Ubuntu-10.04.cmake b/cmake/Packaging/Ubuntu-10.04.cmake deleted file mode 100644 index 7f0fe82211..0000000000 --- a/cmake/Packaging/Ubuntu-10.04.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt5-qt4") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8" "python" "python-numpy") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/Ubuntu-10.10.cmake b/cmake/Packaging/Ubuntu-10.10.cmake deleted file mode 100644 index 7f0fe82211..0000000000 --- a/cmake/Packaging/Ubuntu-10.10.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt5-qt4") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8" "python" "python-numpy") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/Ubuntu-11.04.cmake b/cmake/Packaging/Ubuntu-11.04.cmake deleted file mode 100644 index b72ff46e70..0000000000 --- a/cmake/Packaging/Ubuntu-11.04.cmake +++ /dev/null @@ -1,12 +0,0 @@ -#set the debian package dependencies (parsed by our deb component maker) -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt5-qt4") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/Ubuntu-11.10.cmake b/cmake/Packaging/Ubuntu-11.10.cmake deleted file mode 100644 index 952eeb6026..0000000000 --- a/cmake/Packaging/Ubuntu-11.10.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt6") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/Ubuntu-12.04.cmake b/cmake/Packaging/Ubuntu-12.04.cmake deleted file mode 100644 index 8d4b8d18d1..0000000000 --- a/cmake/Packaging/Ubuntu-12.04.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt6") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8" "python-opengl") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/Ubuntu-12.10.cmake b/cmake/Packaging/Ubuntu-12.10.cmake deleted file mode 100644 index 8d4b8d18d1..0000000000 --- a/cmake/Packaging/Ubuntu-12.10.cmake +++ /dev/null @@ -1,11 +0,0 @@ -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt6") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8" "python-opengl") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/Ubuntu-13.04.cmake b/cmake/Packaging/Ubuntu-13.04.cmake deleted file mode 100644 index ed14b1ab22..0000000000 --- a/cmake/Packaging/Ubuntu-13.04.cmake +++ /dev/null @@ -1,13 +0,0 @@ -SET(PACKAGE_DEPENDS_GRUEL_RUNTIME "libboost-all-dev" "libc6") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_GRUEL_PYTHON "python" "python-numpy") -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt6") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8" "python-opengl") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/Ubuntu-15.10.cmake b/cmake/Packaging/Ubuntu-15.10.cmake deleted file mode 100644 index ed14b1ab22..0000000000 --- a/cmake/Packaging/Ubuntu-15.10.cmake +++ /dev/null @@ -1,13 +0,0 @@ -SET(PACKAGE_DEPENDS_GRUEL_RUNTIME "libboost-all-dev" "libc6") -SET(PACKAGE_DEPENDS_UTILS "python-mako") -SET(PACKAGE_DEPENDS_GRUEL_PYTHON "python" "python-numpy") -SET(PACKAGE_DEPENDS_CORE_RUNTIME "libfftw3-3") -SET(PACKAGE_DEPENDS_QTGUI_RUNTIME "libqtcore4" "libqwt6") -SET(PACKAGE_DEPENDS_QTGUI_PYTHON "python-qt4" "python-qwt5-qt4") -SET(PACKAGE_DEPENDS_GRC "python" "python-numpy" "python-gtk2" "python-lxml" "python-cheetah") -SET(PACKAGE_DEPENDS_WXGUI "python-wxgtk2.8" "python-opengl") -SET(PACKAGE_DEPENDS_VIDEO_SDL_RUNTIME "libsdl1.2debian") -SET(PACKAGE_DEPENDS_UHD_RUNTIME "uhd") -SET(PACKAGE_DEPENDS_AUDIO_RUNTIME "libpulse0" "alsa-base" "libjack0") -SET(PACKAGE_DEPENDS_WAVELET_RUNTIME "libgsl0ldbl") -SET(PACKAGE_DEPENDS_WAVELET_PYTHON "python" "python-numpy") diff --git a/cmake/Packaging/post_install.in b/cmake/Packaging/post_install.in deleted file mode 100755 index e7245f0320..0000000000 --- a/cmake/Packaging/post_install.in +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -@CMAKE_INSTALL_PREFIX@/libexec/gnuradio/grc_setup_freedesktop install -ldconfig diff --git a/cmake/Packaging/post_uninstall.in b/cmake/Packaging/post_uninstall.in deleted file mode 100755 index 2d1871b1df..0000000000 --- a/cmake/Packaging/post_uninstall.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -ldconfig diff --git a/cmake/Packaging/postinst.in b/cmake/Packaging/postinst.in deleted file mode 100755 index 7fef2accf4..0000000000 --- a/cmake/Packaging/postinst.in +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -if [ "$1" = "configure" ]; then - @CMAKE_INSTALL_PREFIX@/libexec/gnuradio/grc_setup_freedesktop install - ldconfig -fi diff --git a/cmake/Packaging/postrm.in b/cmake/Packaging/postrm.in deleted file mode 100755 index b780602a7b..0000000000 --- a/cmake/Packaging/postrm.in +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -if [ "$1" = "remove" ]; then - ldconfig -fi diff --git a/cmake/Packaging/pre_install.in b/cmake/Packaging/pre_install.in deleted file mode 100755 index 1a2485251c..0000000000 --- a/cmake/Packaging/pre_install.in +++ /dev/null @@ -1 +0,0 @@ -#!/bin/sh diff --git a/cmake/Packaging/pre_uninstall.in b/cmake/Packaging/pre_uninstall.in deleted file mode 100755 index c5e085e895..0000000000 --- a/cmake/Packaging/pre_uninstall.in +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -@CMAKE_INSTALL_PREFIX@/libexec/gnuradio/grc_setup_freedesktop uninstall diff --git a/cmake/Packaging/preinst.in b/cmake/Packaging/preinst.in deleted file mode 100755 index cb7ee1bc40..0000000000 --- a/cmake/Packaging/preinst.in +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -if [ "$1" = "install" ]; then - echo -fi diff --git a/cmake/Packaging/prerm.in b/cmake/Packaging/prerm.in deleted file mode 100755 index d098878503..0000000000 --- a/cmake/Packaging/prerm.in +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh - -if [ "$1" = "remove" ]; then - @CMAKE_INSTALL_PREFIX@/libexec/gnuradio/grc_setup_freedesktop uninstall -fi diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt index 98d7d1c419..b9eb977a3a 100644 --- a/docs/CMakeLists.txt +++ b/docs/CMakeLists.txt @@ -36,15 +36,6 @@ GR_REGISTER_COMPONENT("sphinx" ENABLE_SPHINX SPHINX_FOUND) if(ENABLE_DOXYGEN) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_COMPONENT("docs" - DISPLAY_NAME "Documentation" - DESCRIPTION "Doxygen generated documentation" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(doxygen) @@ -58,14 +49,6 @@ endif(ENABLE_DOXYGEN) ######################################################################## if(ENABLE_SPHINX) -######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_COMPONENT("docs" - DISPLAY_NAME "Documentation" - DESCRIPTION "Sphinx generated documentation" -) ######################################################################## # Add subdirectories diff --git a/docs/doxygen/CMakeLists.txt b/docs/doxygen/CMakeLists.txt index a837bd8e11..d22f9d9f62 100644 --- a/docs/doxygen/CMakeLists.txt +++ b/docs/doxygen/CMakeLists.txt @@ -74,4 +74,4 @@ add_custom_command( add_custom_target(doxygen_target ALL DEPENDS ${BUILT_DIRS}) -install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR} COMPONENT "docs") +install(DIRECTORY ${BUILT_DIRS} DESTINATION ${GR_PKG_DOC_DIR}) diff --git a/docs/exploring-gnuradio/CMakeLists.txt b/docs/exploring-gnuradio/CMakeLists.txt index 5f5e2113cd..422b1ce85c 100644 --- a/docs/exploring-gnuradio/CMakeLists.txt +++ b/docs/exploring-gnuradio/CMakeLists.txt @@ -26,5 +26,4 @@ install( fm_rx.grc fm_demod.py DESTINATION ${GR_PKG_DOC_DIR} - COMPONENT "docs" ) diff --git a/docs/sphinx/source/blocks_blocks.rst b/docs/sphinx/source/blocks_blocks.rst index 056e9efe9a..f214e01c47 100644 --- a/docs/sphinx/source/blocks_blocks.rst +++ b/docs/sphinx/source/blocks_blocks.rst @@ -185,6 +185,7 @@ gnuradio.blocks .. autoblock:: gnuradio.blocks.tagged_stream_mux .. autoblock:: gnuradio.blocks.tagged_stream_to_pdu .. autoblock:: gnuradio.blocks.tags_strobe +.. autoblock:: gnuradio.blocks.tcp_server_sink .. autoblock:: gnuradio.blocks.threshold_ff .. autoblock:: gnuradio.blocks.throttle .. autoblock:: gnuradio.blocks.transcendental diff --git a/docs/sphinx/source/index.rst b/docs/sphinx/source/index.rst index 7bba2f8e32..5c14d22cce 100644 --- a/docs/sphinx/source/index.rst +++ b/docs/sphinx/source/index.rst @@ -854,6 +854,7 @@ Networking Tools Blocks :nosignatures: gnuradio.blocks.socket_pdu + gnuradio.blocks.tcp_server_sink gnuradio.blocks.udp_sink gnuradio.blocks.udp_source diff --git a/gnuradio-runtime/CMakeLists.txt b/gnuradio-runtime/CMakeLists.txt index 7660642509..d24c17a3f9 100644 --- a/gnuradio-runtime/CMakeLists.txt +++ b/gnuradio-runtime/CMakeLists.txt @@ -37,6 +37,7 @@ GR_REGISTER_COMPONENT("gnuradio-runtime" ENABLE_GNURADIO_RUNTIME Boost_FOUND ENABLE_VOLK PYTHONINTERP_FOUND + LOG4CPP_FOUND ) GR_SET_GLOBAL(GNURADIO_RUNTIME_INCLUDE_DIRS @@ -89,39 +90,6 @@ get_filename_component(GR_RUNTIME_PYTHONPATH ) GR_SET_GLOBAL(GR_RUNTIME_PYTHONPATH ${GR_RUNTIME_PYTHONPATH}) -######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_RUNTIME_DESCRIPTION "GNU Radio Runtime") - -CPACK_COMPONENT("runtime_runtime" - GROUP "Runtime" - DISPLAY_NAME "Runtime" - DESCRIPTION "Dynamic link libraries" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("runtime_devel" - GROUP "Runtime" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("runtime_python" - GROUP "Runtime" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime" - DEPENDS "runtime_python;runtime_runtime" -) - -CPACK_COMPONENT("runtime_swig" - GROUP "Runtime" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;runtime_python;runtime_devel" -) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/gnuradio-runtime.conf.in ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-runtime.conf @@ -130,16 +98,12 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-runtime.conf DESTINATION ${GR_PREFSDIR} - COMPONENT "runtime_runtime" ) -if(ENABLE_GR_LOG AND HAVE_LOG4CPP) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gr_log_default.conf DESTINATION ${GR_PREFSDIR} - COMPONENT "runtime_runtime" ) -endif(ENABLE_GR_LOG AND HAVE_LOG4CPP) ######################################################################## # Add subdirectories @@ -166,7 +130,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-runtime.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "runtime_devel" ) endif(ENABLE_GNURADIO_RUNTIME) diff --git a/gnuradio-runtime/apps/CMakeLists.txt b/gnuradio-runtime/apps/CMakeLists.txt index 3dea7268ff..4a73f3c18f 100644 --- a/gnuradio-runtime/apps/CMakeLists.txt +++ b/gnuradio-runtime/apps/CMakeLists.txt @@ -37,5 +37,4 @@ target_link_libraries(gnuradio-config-info gnuradio-runtime ${Boost_LIBRARIES}) install( TARGETS gnuradio-config-info DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "runtime_runtime" ) diff --git a/gnuradio-runtime/examples/mp-sched/CMakeLists.txt b/gnuradio-runtime/examples/mp-sched/CMakeLists.txt index 863cfa733a..4e07366d4f 100644 --- a/gnuradio-runtime/examples/mp-sched/CMakeLists.txt +++ b/gnuradio-runtime/examples/mp-sched/CMakeLists.txt @@ -26,11 +26,9 @@ GR_PYTHON_INSTALL(PROGRAMS synthetic.py wfm_rcv_pll_to_wav.py DESTINATION ${GR_PKG_DATA_DIR}/examples/mp-sched - COMPONENT "runtime_python" ) install( FILES README DESTINATION ${GR_PKG_DATA_DIR}/examples/mp-sched - COMPONENT "runtime_python" ) diff --git a/gnuradio-runtime/examples/network/CMakeLists.txt b/gnuradio-runtime/examples/network/CMakeLists.txt index 92eb734768..08f498b469 100644 --- a/gnuradio-runtime/examples/network/CMakeLists.txt +++ b/gnuradio-runtime/examples/network/CMakeLists.txt @@ -25,6 +25,4 @@ GR_PYTHON_INSTALL(PROGRAMS vector_sink.py vector_source.py DESTINATION ${GR_PKG_DATA_DIR}/examples/network - COMPONENT "runtime_python" ) - diff --git a/gnuradio-runtime/examples/volk_benchmark/CMakeLists.txt b/gnuradio-runtime/examples/volk_benchmark/CMakeLists.txt index f56675e556..076ef359e8 100644 --- a/gnuradio-runtime/examples/volk_benchmark/CMakeLists.txt +++ b/gnuradio-runtime/examples/volk_benchmark/CMakeLists.txt @@ -25,11 +25,9 @@ GR_PYTHON_INSTALL(PROGRAMS volk_test_funcs.py volk_types.py DESTINATION ${GR_PKG_DATA_DIR}/examples/volk_benchmark - COMPONENT "runtime_python" ) install( FILES README DESTINATION ${GR_PKG_DATA_DIR}/examples/volk_benchmark - COMPONENT "runtime_python" ) diff --git a/gnuradio-runtime/include/gnuradio/CMakeLists.txt b/gnuradio-runtime/include/gnuradio/CMakeLists.txt index 472f91847b..230f8d6e6d 100644 --- a/gnuradio-runtime/include/gnuradio/CMakeLists.txt +++ b/gnuradio-runtime/include/gnuradio/CMakeLists.txt @@ -44,6 +44,7 @@ install(FILES hier_block2.h high_res_timer.h io_signature.h + logger.h math.h message.h misc.h @@ -81,9 +82,7 @@ install(FILES rpcserver_booter_aggregator.h rpcserver_booter_base.h rpcserver_selector.h - ${CMAKE_CURRENT_BINARY_DIR}/logger.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio - COMPONENT "runtime_devel" ) if(THRIFT_FOUND) @@ -92,14 +91,5 @@ install(FILES thrift_application_base.h thrift_server_template.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio - COMPONENT "runtime_devel" ) endif(THRIFT_FOUND) - -########################################################################## -# Configure logger -########################################################################## -CONFIGURE_FILE( - ${CMAKE_CURRENT_SOURCE_DIR}/logger.h.in - ${CMAKE_CURRENT_BINARY_DIR}/logger.h -) diff --git a/gnuradio-runtime/include/gnuradio/attributes.h b/gnuradio-runtime/include/gnuradio/attributes.h index 0102c110c2..250683f248 100644 --- a/gnuradio-runtime/include/gnuradio/attributes.h +++ b/gnuradio-runtime/include/gnuradio/attributes.h @@ -81,12 +81,10 @@ //////////////////////////////////////////////////////////////////////// // implement cross-compiler VLA macros //////////////////////////////////////////////////////////////////////// -#ifdef C99 -# define __GR_VLA(TYPE, buf, size) TYPE buf[size] -# define __GR_VLA2D(TYPE, buf, size, size2) TYPE buf[size][size2] -#else +#ifdef _MSC_VER # define __GR_VLA(TYPE, buf, size) TYPE * buf = (TYPE *) alloca(sizeof(TYPE) * (size)) -# define __GR_VLA2D(TYPE, buf, size, size2) TYPE ** buf = (TYPE **) alloca(sizeof(TYPE) * (size) * (size2)) +#else +# define __GR_VLA(TYPE, buf, size) TYPE buf[size] #endif #endif /* INCLUDED_GNURADIO_ATTRIBUTES_H */ diff --git a/gnuradio-runtime/include/gnuradio/basic_block.h b/gnuradio-runtime/include/gnuradio/basic_block.h index fa454c95ed..8d7308efe2 100644 --- a/gnuradio-runtime/include/gnuradio/basic_block.h +++ b/gnuradio-runtime/include/gnuradio/basic_block.h @@ -377,6 +377,12 @@ namespace gr { virtual std::vector<int> processor_affinity() { throw std::runtime_error("processor_affinity not overloaded in child class."); } + + virtual void set_log_level(std::string level) + { throw std::runtime_error("set_log_level not overloaded in child class."); } + + virtual std::string log_level() + { throw std::runtime_error("log_level not overloaded in child class."); } }; inline bool operator<(basic_block_sptr lhs, basic_block_sptr rhs) diff --git a/gnuradio-runtime/include/gnuradio/block.h b/gnuradio-runtime/include/gnuradio/block.h index 3e85f22823..21d41c0b63 100644 --- a/gnuradio-runtime/include/gnuradio/block.h +++ b/gnuradio-runtime/include/gnuradio/block.h @@ -633,6 +633,30 @@ namespace gr { */ void system_handler(pmt::pmt_t msg); + /*! + * \brief Set the logger's output level. + * + * Sets the level of the logger. This takes a string that is + * translated to the standard levels and can be (case insensitive): + * + * \li off , notset + * \li debug + * \li info + * \li notice + * \li warn + * \li error + * \li crit + * \li alert + * \li fatal + * \li emerg + */ + void set_log_level(std::string level); + + /*! + * \brief Get the logger's output level + */ + std::string log_level(); + /*! * \brief returns true when execution has completed due to a message connection */ diff --git a/gnuradio-runtime/include/gnuradio/hier_block2.h b/gnuradio-runtime/include/gnuradio/hier_block2.h index 08a5389e96..b7c6be2441 100644 --- a/gnuradio-runtime/include/gnuradio/hier_block2.h +++ b/gnuradio-runtime/include/gnuradio/hier_block2.h @@ -267,6 +267,31 @@ namespace gr { std::vector<int> processor_affinity(); /*! + * \brief Set the logger's output level. + * + * Sets the level of the logger for all connected blocks. This takes + * a string that is translated to the standard levels and can be + * (case insensitive): + * + * \li off , notset + * \li debug + * \li info + * \li notice + * \li warn + * \li error + * \li crit + * \li alert + * \li fatal + * \li emerg + */ + void set_log_level(std::string level); + + /*! + * \brief Get the logger's output level + */ + std::string log_level(); + + /*! * \brief Get if all block min buffers should be set. * * \details this returns whether all the block min output buffers diff --git a/gnuradio-runtime/include/gnuradio/logger.h.in b/gnuradio-runtime/include/gnuradio/logger.h index 08cb209c7b..4299a11beb 100644 --- a/gnuradio-runtime/include/gnuradio/logger.h.in +++ b/gnuradio-runtime/include/gnuradio/logger.h @@ -20,12 +20,6 @@ * Boston, MA 02110-1301, USA. */ -/******************************************************************************* -* Author: Mark Plett -* Description: -* The gr::logger module wraps the log4cpp library for logging in gnuradio -*******************************************************************************/ - #ifndef INCLUDED_GR_LOGGER_H #define INCLUDED_GR_LOGGER_H @@ -35,13 +29,6 @@ * */ -#ifndef ENABLE_GR_LOG -#cmakedefine ENABLE_GR_LOG -#endif -#ifndef HAVE_LOG4CPP -#cmakedefine HAVE_LOG4CPP -#endif - #ifdef _MSC_VER typedef unsigned short mode_t; #else @@ -56,71 +43,6 @@ typedef unsigned short mode_t; #include <boost/thread.hpp> #include <boost/format.hpp> #include <pmt/pmt.h> - -#ifdef ENABLE_GR_LOG - -// We have three configurations... first logging to stdout/stderr -#ifndef HAVE_LOG4CPP - -namespace gr { - //#warning GR logging Enabled and using std::cout - typedef std::string logger_ptr; -} /* namespace gr */ - -#define GR_LOG_DECLARE_LOGPTR(logger) -#define GR_LOG_ASSIGN_LOGPTR(logger,name) -#define GR_CONFIG_LOGGER(config) -#define GR_CONFIG_AND_WATCH_LOGGER(config,period) -#define GR_LOG_GETLOGGER(logger, name) -#define GR_SET_LEVEL(name, level) -#define GR_LOG_SET_LEVEL(logger, level) -#define GR_GET_LEVEL(name, level) -#define GR_LOG_GET_LEVEL(logger, level) -#define GR_ADD_APPENDER(name,appender) -#define GR_LOG_ADD_APPENDER(logger,appender) -#define GR_SET_APPENDER(name,appender) -#define GR_LOG_SET_APPENDER(logger,appender) -#define GR_ADD_CONSOLE_APPENDER(logger,target,pattern) -#define GR_LOG_ADD_CONSOLE_APPENDER(logger,target,pattern) -#define GR_SET_CONSOLE_APPENDER(logger,target,pattern) -#define GR_LOG_SET_CONSOLE_APPENDER(logger,target,pattern) -#define GR_ADD_FILE_APPENDER(name,filename,append,pattern) -#define GR_LOG_ADD_FILE_APPENDER(logger,filename,append,pattern) -#define GR_SET_FILE_APPENDER(name,filename,append,pattern) -#define GR_LOG_SET_FILE_APPENDER(logger,filename,append,pattern) -#define GR_ADD_ROLLINGFILE_APPENDER(name,filename,filesize,bkup_index,append,mode,pattern) -#define GR_LOG_ADD_ROLLINGFILE_APPENDER(logger,filename,filesize,bkup_index,append,mode,pattern) -#define GR_GET_LOGGER_NAMES(names) -#define GR_RESET_CONFIGURATION() -#define GR_DEBUG(name, msg) std::cout<<"DEBUG: "<<msg<<std::endl -#define GR_INFO(name, msg) std::cout<<"INFO: "<<msg<<std::endl -#define GR_NOTICE(name, msg) std::cout<<"NOTICE: "<<msg<<std::endl -#define GR_WARN(name, msg) std::cerr<<"WARN: "<<msg<<std::endl -#define GR_ERROR(name, msg) std::cerr<<"ERROR: "<<msg<<std::endl -#define GR_ALERT(name, msg) std::cerr<<"ERROR: "<<msg<<std::endl -#define GR_CRIT(name, msg) std::cerr<<"ERROR: "<<msg<<std::endl -#define GR_FATAL(name, msg) std::cerr<<"FATAL: "<<msg<<std::endl -#define GR_EMERG(name, msg) std::cerr<<"EMERG: "<<msg<<std::endl -#define GR_ERRORIF(name, cond, msg) {if((cond)) std::cerr<<"ERROR: "<<msg<<std::endl;} -#define GR_ASSERT(name, cond, msg) {if(!(cond)) std::cerr<<"FATAL: "<<msg<<std::endl; assert(cond);} -#define GR_LOG_DEBUG(logger, msg) std::cout<<"DEBUG: "<<msg<<std::endl -#define GR_LOG_INFO(logger, msg) std::cout<<"INFO: "<<msg<<std::endl -#define GR_LOG_NOTICE(logger, msg) std::cout<<"NOTICE: "<<msg<<std::endl -#define GR_LOG_WARN(logger, msg) std::cerr<<"WARN: "<<msg<<std::endl -#define GR_LOG_ERROR(logger, msg) std::cerr<<"ERROR: "<<msg<<std::endl -#define GR_LOG_ALERT(logger, msg) std::cerr<<"ALERT: "<<msg<<std::endl -#define GR_LOG_CRIT(logger, msg) std::cerr<<"CRIT: "<<msg<<std::endl -#define GR_LOG_FATAL(logger, msg) std::cerr<<"FATAL: "<<msg<<std::endl -#define GR_LOG_EMERG(logger, msg) std::cerr<<"EMERG: "<<msg<<std::endl -#define GR_LOG_ERRORIF(logger, cond, msg) { \ - if((cond)) std::cerr<<"ERROR: "<<msg<<std::endl;} -#define GR_LOG_ASSERT(logger, cond, msg) { \ - if(!(cond)) {std::cerr<<"FATAL: "<<msg<<std::endl; assert(cond);};} - - -#else /* HAVE_LOG4CPP */ - -// Second configuration...logging to log4cpp #include <log4cpp/Category.hh> #include <log4cpp/PropertyConfigurator.hh> #include <log4cpp/FileAppender.hh> @@ -640,69 +562,8 @@ namespace gr { } /* namespace gr */ -#endif /* HAVE_LOG4CPP */ - // If Logger disable do nothing -#else /* ENABLE_GR_LOG */ - namespace gr { - typedef void* logger_ptr; -} /* namespace gr */ - -#define GR_LOG_DECLARE_LOGPTR(logger) -#define GR_LOG_ASSIGN_LOGPTR(logger,name) -#define GR_CONFIG_LOGGER(config) -#define GR_CONFIG_AND_WATCH_LOGGER(config,period) -#define GR_LOG_GETLOGGER(logger, name) -#define GR_SET_LEVEL(name, level) -#define GR_LOG_SET_LEVEL(logger, level) -#define GR_GET_LEVEL(name, level) -#define GR_LOG_GET_LEVEL(logger, level) -#define GR_ADD_APPENDER(name,appender) -#define GR_LOG_ADD_APPENDER(logger,appender) -#define GR_SET_APPENDER(name,appender) -#define GR_LOG_SET_APPENDER(logger,appender) -#define GR_ADD_CONSOLE_APPENDER(logger,target,pattern) -#define GR_LOG_ADD_CONSOLE_APPENDER(logger,target,pattern) -#define GR_SET_CONSOLE_APPENDER(logger,target,pattern) -#define GR_LOG_SET_CONSOLE_APPENDER(logger,target,pattern) -#define GR_ADD_FILE_APPENDER(name,filename,append,pattern) -#define GR_LOG_ADD_FILE_APPENDER(logger,filename,append,pattern) -#define GR_SET_FILE_APPENDER(name,filename,append,pattern) -#define GR_LOG_SET_FILE_APPENDER(logger,filename,append,pattern) -#define GR_ADD_ROLLINGFILE_APPENDER(name,filename,filesize,bkup_index,append,mode,pattern) -#define GR_LOG_ADD_ROLLINGFILE_APPENDER(logger,filename,filesize,bkup_index,append,mode,pattern) -#define GR_GET_LOGGER_NAMES(names) -#define GR_RESET_CONFIGURATION() -#define GR_DEBUG(name, msg) -#define GR_INFO(name, msg) -#define GR_NOTICE(name, msg) -#define GR_WARN(name, msg) -#define GR_ERROR(name, msg) -#define GR_ALERT(name, msg) -#define GR_CRIT(name, msg) -#define GR_FATAL(name, msg) -#define GR_EMERG(name, msg) -#define GR_ERRORIF(name, cond, msg) -#define GR_ASSERT(name, cond, msg) -#define GR_LOG_DEBUG(logger, msg) -#define GR_LOG_INFO(logger, msg) -#define GR_LOG_NOTICE(logger, msg) -#define GR_LOG_WARN(logger, msg) -#define GR_LOG_ERROR(logger, msg) -#define GR_LOG_ALERT(logger, msg) -#define GR_LOG_CRIT(logger, msg) -#define GR_LOG_FATAL(logger, msg) -#define GR_LOG_EMERG(logger, msg) -#define GR_LOG_ERRORIF(logger, cond, msg) -#define GR_LOG_ASSERT(logger, cond, msg) - -#endif /* ENABLE_GR_LOG */ - -namespace gr { - - // Even if logger is disabled we'll need for methods below to exist in python. - // The macros these call will be disabled if ENABLE_GR_LOG is undefined /********************* Start Classes and Methods for Python ******************/ /*! @@ -853,5 +714,4 @@ namespace gr { } /* namespace gr */ - #endif /* INCLUDED_GR_LOGGER_H */ diff --git a/gnuradio-runtime/include/gnuradio/messages/CMakeLists.txt b/gnuradio-runtime/include/gnuradio/messages/CMakeLists.txt index f79f2bd24f..7504cfeeb1 100644 --- a/gnuradio-runtime/include/gnuradio/messages/CMakeLists.txt +++ b/gnuradio-runtime/include/gnuradio/messages/CMakeLists.txt @@ -27,5 +27,4 @@ install(FILES msg_producer.h msg_queue.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/messages - COMPONENT "runtime_devel" ) diff --git a/gnuradio-runtime/include/gnuradio/thread/CMakeLists.txt b/gnuradio-runtime/include/gnuradio/thread/CMakeLists.txt index 8ea4bfc66e..b9a4a98c13 100644 --- a/gnuradio-runtime/include/gnuradio/thread/CMakeLists.txt +++ b/gnuradio-runtime/include/gnuradio/thread/CMakeLists.txt @@ -25,5 +25,4 @@ install(FILES thread_body_wrapper.h thread_group.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/thread - COMPONENT "runtime_devel" ) diff --git a/gnuradio-runtime/include/pmt/CMakeLists.txt b/gnuradio-runtime/include/pmt/CMakeLists.txt index 4ae0e22431..f4a541e0dd 100644 --- a/gnuradio-runtime/include/pmt/CMakeLists.txt +++ b/gnuradio-runtime/include/pmt/CMakeLists.txt @@ -26,4 +26,4 @@ install(FILES pmt_pool.h pmt_sugar.h DESTINATION ${GR_INCLUDE_DIR}/pmt - COMPONENT "runtime_devel") +) diff --git a/gnuradio-runtime/lib/CMakeLists.txt b/gnuradio-runtime/lib/CMakeLists.txt index 3da550d37b..e0196b669a 100644 --- a/gnuradio-runtime/lib/CMakeLists.txt +++ b/gnuradio-runtime/lib/CMakeLists.txt @@ -203,7 +203,7 @@ endif(TRY_SHM_VMCIRCBUF) ####################################################### add_library(gnuradio-runtime SHARED ${gnuradio_runtime_sources}) target_link_libraries(gnuradio-runtime ${gnuradio_runtime_libs}) -GR_LIBRARY_FOO(gnuradio-runtime RUNTIME_COMPONENT "runtime_runtime" DEVEL_COMPONENT "runtime_devel") +GR_LIBRARY_FOO(gnuradio-runtime) add_dependencies(gnuradio-runtime pmt_generated runtime_generated_includes @@ -241,7 +241,7 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-runtime_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "runtime_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gnuradio-runtime/lib/block.cc b/gnuradio-runtime/lib/block.cc index e329e0657a..4c408ab7ed 100644 --- a/gnuradio-runtime/lib/block.cc +++ b/gnuradio-runtime/lib/block.cc @@ -715,6 +715,20 @@ namespace gr { } void + block::set_log_level(std::string level) + { + logger_set_level(d_logger, level); + } + + std::string + block::log_level() + { + std::string level; + logger_get_level(d_logger, level); + return level; + } + + void block::notify_msg_neighbors() { size_t len = pmt::length(d_message_subscribers); diff --git a/gnuradio-runtime/lib/controlport/CMakeLists.txt b/gnuradio-runtime/lib/controlport/CMakeLists.txt index c9bdeb949e..80d31fc721 100644 --- a/gnuradio-runtime/lib/controlport/CMakeLists.txt +++ b/gnuradio-runtime/lib/controlport/CMakeLists.txt @@ -84,7 +84,6 @@ list(APPEND gnuradio_runtime_libs install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/thrift/thrift.conf.example DESTINATION ${SYSCONFDIR}/${CMAKE_PROJECT_NAME} - COMPONENT "runtime_runtime" ) endif(THRIFT_FOUND) diff --git a/gnuradio-runtime/lib/hier_block2.cc b/gnuradio-runtime/lib/hier_block2.cc index 597ae032ec..8ebbbda587 100644 --- a/gnuradio-runtime/lib/hier_block2.cc +++ b/gnuradio-runtime/lib/hier_block2.cc @@ -178,6 +178,18 @@ namespace gr { return d_detail->processor_affinity(); } + void + hier_block2::set_log_level(std::string level) + { + d_detail->set_log_level(level); + } + + std::string + hier_block2::log_level() + { + return d_detail->log_level(); + } + std::string dot_graph(hier_block2_sptr hierblock2) { diff --git a/gnuradio-runtime/lib/hier_block2_detail.cc b/gnuradio-runtime/lib/hier_block2_detail.cc index 0d0ddf55ba..e6d867b269 100644 --- a/gnuradio-runtime/lib/hier_block2_detail.cc +++ b/gnuradio-runtime/lib/hier_block2_detail.cc @@ -956,4 +956,22 @@ namespace gr { return tmp[0]->processor_affinity(); } + void + hier_block2_detail::set_log_level(std::string level) + { + basic_block_vector_t tmp = d_fg->calc_used_blocks(); + for(basic_block_viter_t p = tmp.begin(); p != tmp.end(); p++) { + (*p)->set_log_level(level); + } + } + + std::string + hier_block2_detail::log_level() + { + // Assume that log_level was set for all hier_block2 blocks + basic_block_vector_t tmp = d_fg->calc_used_blocks(); + return tmp[0]->log_level(); + } + + } /* namespace gr */ diff --git a/gnuradio-runtime/lib/hier_block2_detail.h b/gnuradio-runtime/lib/hier_block2_detail.h index a5584fe92a..aa419c49bd 100644 --- a/gnuradio-runtime/lib/hier_block2_detail.h +++ b/gnuradio-runtime/lib/hier_block2_detail.h @@ -57,6 +57,9 @@ namespace gr { void set_processor_affinity(const std::vector<int> &mask); void unset_processor_affinity(); std::vector<int> processor_affinity(); + + void set_log_level(std::string level); + std::string log_level(); // Track output buffer min/max settings std::vector<size_t> d_max_output_buffer; diff --git a/gnuradio-runtime/lib/logger.cc b/gnuradio-runtime/lib/logger.cc index fd9a482c94..0bb898833b 100644 --- a/gnuradio-runtime/lib/logger.cc +++ b/gnuradio-runtime/lib/logger.cc @@ -35,10 +35,6 @@ #include <stdexcept> #include <algorithm> - -#ifdef ENABLE_GR_LOG -#ifdef HAVE_LOG4CPP - namespace gr { bool logger_config::logger_configured(false); @@ -311,8 +307,6 @@ namespace gr { } /* namespace gr */ -#endif /* HAVE_LOG4CPP */ - /****** Start Methods to provide Python the capabilities of the macros ********/ void gr_logger_config(const std::string config_filename, unsigned int watch_period) @@ -336,38 +330,12 @@ gr_logger_reset_config(void) // Remaining capability provided by gr::logger class in gnuradio/logger.h -#else /* ENABLE_GR_LOG */ - -/****** Start Methods to provide Python the capabilities of the macros ********/ -void -gr_logger_config(const std::string config_filename, unsigned int watch_period) -{ - //NOP -} - -std::vector<std::string> -gr_logger_get_logger_names(void) -{ - return std::vector<std::string>(1, ""); -} - -void -gr_logger_reset_config(void) -{ - //NOP -} - -#endif /* ENABLE_GR_LOG */ - - namespace gr { bool configure_default_loggers(gr::logger_ptr &l, gr::logger_ptr &d, const std::string name) { -#ifdef ENABLE_GR_LOG -#ifdef HAVE_LOG4CPP prefs *p = prefs::singleton(); std::string config_file = p->get_string("LOG", "log_config", ""); std::string log_level = p->get_string("LOG", "log_level", "off"); @@ -407,21 +375,11 @@ namespace gr { } d = DLOG; return true; -#endif /* HAVE_LOG4CPP */ - -#else /* ENABLE_GR_LOG */ - l = NULL; - d = NULL; - return false; -#endif /* ENABLE_GR_LOG */ - return false; } bool update_logger_alias(const std::string &name, const std::string &alias) { -#ifdef ENABLE_GR_LOG -#ifdef HAVE_LOG4CPP prefs *p = prefs::singleton(); std::string log_file = p->get_string("LOG", "log_file", ""); std::string debug_file = p->get_string("LOG", "debug_file", ""); @@ -442,10 +400,6 @@ namespace gr { } } return true; -#endif /* HAVE_LOG4CPP */ -#endif /* ENABLE_GR_LOG */ - - return false; } } /* namespace gr */ diff --git a/gnuradio-runtime/lib/pmt/CMakeLists.txt b/gnuradio-runtime/lib/pmt/CMakeLists.txt index 32c0e57a6a..e5c8f2f47e 100644 --- a/gnuradio-runtime/lib/pmt/CMakeLists.txt +++ b/gnuradio-runtime/lib/pmt/CMakeLists.txt @@ -44,7 +44,6 @@ add_custom_command( install( FILES ${PMT_SERIAL_TAGS_H} DESTINATION ${GR_INCLUDE_DIR}/pmt - COMPONENT "runtime_devel" ) include(AddFileDependencies) @@ -108,7 +107,7 @@ endif(MSVC) add_library(gnuradio-pmt SHARED ${pmt_sources}) target_link_libraries(gnuradio-pmt ${gnuradio_pmt_libs}) -GR_LIBRARY_FOO(gnuradio-pmt RUNTIME_COMPONENT "runtime_runtime" DEVEL_COMPONENT "runtime_devel") +GR_LIBRARY_FOO(gnuradio-pmt) add_dependencies(gnuradio-pmt pmt_generated @@ -125,7 +124,7 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-pmt_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "runtime_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gnuradio-runtime/lib/prefs.cc b/gnuradio-runtime/lib/prefs.cc index 341028eba8..18acae0124 100644 --- a/gnuradio-runtime/lib/prefs.cc +++ b/gnuradio-runtime/lib/prefs.cc @@ -30,6 +30,7 @@ #include <algorithm> #include <fstream> +#include <iostream> #include <boost/filesystem/operations.hpp> #include <boost/filesystem/path.hpp> @@ -113,7 +114,7 @@ namespace gr { std::string value = o.value[0]; d_config_map[section][key] = value; } - } catch(const boost::program_options::invalid_config_file_syntax & e) { + } catch(std::exception e) { std::cerr << "WARNING: Config file '" << fname << "' failed to parse:" << std::endl; std::cerr << e.what() << std::endl; std::cerr << "Skipping it" << std::endl; diff --git a/gnuradio-runtime/lib/qa_logger.cc b/gnuradio-runtime/lib/qa_logger.cc index 904893cc4d..20d7392143 100644 --- a/gnuradio-runtime/lib/qa_logger.cc +++ b/gnuradio-runtime/lib/qa_logger.cc @@ -35,10 +35,6 @@ void qa_logger::t1() { -#ifdef ENABLE_GR_LOG - // This doesn't really test anything, more just - // making sure nothing's gone horribly wrong. - GR_LOG_GETLOGGER(LOG,"main"); GR_ADD_CONSOLE_APPENDER("main","cout","%d{%H:%M:%S} : %m%n"); GR_LOG_NOTICE(LOG,"test from c++ NOTICE"); @@ -48,5 +44,4 @@ qa_logger::t1() GR_LOG_ERROR(LOG,"test from c++ ERROR"); GR_LOG_FATAL(LOG,"test from c++ FATAL"); CPPUNIT_ASSERT(true); -#endif } diff --git a/gnuradio-runtime/lib/tpb_thread_body.cc b/gnuradio-runtime/lib/tpb_thread_body.cc index 32c846d8a4..59f1d3162e 100644 --- a/gnuradio-runtime/lib/tpb_thread_body.cc +++ b/gnuradio-runtime/lib/tpb_thread_body.cc @@ -55,8 +55,6 @@ namespace gr { size_t max_nmsgs = static_cast<size_t>(p->get_long("DEFAULT", "max_messages", 100)); // Setup the logger for the scheduler -#ifdef ENABLE_GR_LOG -#ifdef HAVE_LOG4CPP #undef LOG std::string config_file = p->get_string("LOG", "log_config", ""); std::string log_level = p->get_string("LOG", "log_level", "off"); @@ -75,9 +73,6 @@ namespace gr { GR_LOG_SET_FILE_APPENDER(LOG, log_file , true,"%r :%p: %c{1} - %m%n"); } } -#endif /* HAVE_LOG4CPP */ -#endif /* ENABLE_GR_LOG */ - // Set thread affinity if it was set before fg was started. if(block->processor_affinity().size() > 0) { diff --git a/gnuradio-runtime/python/gnuradio/CMakeLists.txt b/gnuradio-runtime/python/gnuradio/CMakeLists.txt index d29e6aa9d2..736db499dc 100644 --- a/gnuradio-runtime/python/gnuradio/CMakeLists.txt +++ b/gnuradio-runtime/python/gnuradio/CMakeLists.txt @@ -35,5 +35,4 @@ GR_PYTHON_INSTALL(FILES gr_unittest.py gr_xmlrunner.py DESTINATION ${GR_PYTHON_DIR}/gnuradio - COMPONENT "runtime_python" ) diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt b/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt index f40f253a72..ecf24178f9 100644 --- a/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt +++ b/gnuradio-runtime/python/gnuradio/ctrlport/CMakeLists.txt @@ -24,7 +24,6 @@ install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/icon.png DESTINATION ${GR_PYTHON_DIR}/gnuradio/ctrlport - COMPONENT "runtime_python" ) @@ -36,7 +35,6 @@ GR_PYTHON_INSTALL( ${CMAKE_CURRENT_SOURCE_DIR}/GNURadioControlPortClient.py ${CMAKE_CURRENT_SOURCE_DIR}/RPCConnection.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/ctrlport/ - COMPONENT "runtime_python" ) GR_PYTHON_INSTALL( @@ -45,7 +43,6 @@ GR_PYTHON_INSTALL( ${CMAKE_CURRENT_SOURCE_DIR}/gr-ctrlport-monitor DESTINATION ${GR_RUNTIME_DIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - COMPONENT "runtime_python" ) if(THRIFT_FOUND) @@ -60,7 +57,6 @@ GR_PYTHON_INSTALL( FILES ${CMAKE_CURRENT_SOURCE_DIR}/RPCConnectionThrift.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/ctrlport/ - COMPONENT "runtime_python" ) GR_PYTHON_INSTALL( @@ -73,7 +69,6 @@ GR_PYTHON_INSTALL( ${CMAKE_CURRENT_BINARY_DIR}/GNURadio/StreamReceiver-remote ${CMAKE_CURRENT_BINARY_DIR}/GNURadio/ttypes.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/ctrlport/GNURadio - COMPONENT "runtime_python" ) endif(THRIFT_FOUND) diff --git a/gnuradio-runtime/python/gnuradio/gr/CMakeLists.txt b/gnuradio-runtime/python/gnuradio/gr/CMakeLists.txt index ddad2c448a..fc966b8ece 100644 --- a/gnuradio-runtime/python/gnuradio/gr/CMakeLists.txt +++ b/gnuradio-runtime/python/gnuradio/gr/CMakeLists.txt @@ -32,7 +32,6 @@ GR_PYTHON_INSTALL(FILES top_block.py pubsub.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/gr - COMPONENT "runtime_python" ) ######################################################################## diff --git a/gnuradio-runtime/python/gnuradio/gru/CMakeLists.txt b/gnuradio-runtime/python/gnuradio/gru/CMakeLists.txt index f0276a8d53..c1d7b701a9 100644 --- a/gnuradio-runtime/python/gnuradio/gru/CMakeLists.txt +++ b/gnuradio-runtime/python/gnuradio/gru/CMakeLists.txt @@ -32,5 +32,4 @@ GR_PYTHON_INSTALL(FILES socket_stuff.py daemon.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/gru - COMPONENT "runtime_python" ) diff --git a/gnuradio-runtime/python/pmt/CMakeLists.txt b/gnuradio-runtime/python/pmt/CMakeLists.txt index f4cba41d34..1ddfc2a46f 100644 --- a/gnuradio-runtime/python/pmt/CMakeLists.txt +++ b/gnuradio-runtime/python/pmt/CMakeLists.txt @@ -26,7 +26,6 @@ GR_PYTHON_INSTALL(FILES __init__.py pmt_to_python.py DESTINATION ${GR_PYTHON_DIR}/pmt - COMPONENT "runtime_python" ) ######################################################################## diff --git a/gnuradio-runtime/swig/CMakeLists.txt b/gnuradio-runtime/swig/CMakeLists.txt index ca9ddd4039..1b6921fb07 100644 --- a/gnuradio-runtime/swig/CMakeLists.txt +++ b/gnuradio-runtime/swig/CMakeLists.txt @@ -52,7 +52,6 @@ GR_SWIG_MAKE(pmt_swig pmt_swig.i) GR_SWIG_INSTALL( TARGETS pmt_swig DESTINATION ${GR_PYTHON_DIR}/pmt - COMPONENT "runtime_python" ) add_custom_target(pmt_swig DEPENDS ${SWIG_MODULE_pmt_swig_REAL_NAME}) @@ -61,12 +60,6 @@ add_custom_target(pmt_swig DEPENDS ${SWIG_MODULE_pmt_swig_REAL_NAME}) # Build gnuradio-runtime swig ############################################################### -# Only use if log4cpp is installed -# Define ENABLE_GR_LOG for the .i file to ignore it. -if(ENABLE_GR_LOG) - SET(GR_SWIG_FLAGS "-DENABLE_GR_LOG") -endif(ENABLE_GR_LOG) - if(ENABLE_GR_CTRLPORT) ADD_DEFINITIONS(-DGR_CTRLPORT) list(APPEND GR_SWIG_FLAGS -DGR_CTRLPORT) @@ -82,7 +75,6 @@ GR_SWIG_MAKE(runtime_swig runtime_swig.i) GR_SWIG_INSTALL( TARGETS runtime_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/gr - COMPONENT "runtime_python" ) install( @@ -124,5 +116,4 @@ install( ${CMAKE_CURRENT_BINARY_DIR}/runtime_swig_doc.i ${CMAKE_CURRENT_BINARY_DIR}/pmt_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "runtime_swig" ) diff --git a/gnuradio-runtime/swig/block.i b/gnuradio-runtime/swig/block.i index 945cea79b2..64500575fb 100644 --- a/gnuradio-runtime/swig/block.i +++ b/gnuradio-runtime/swig/block.i @@ -57,6 +57,9 @@ class gr::block : public gr::basic_block uint64_t nitems_read(unsigned int which_input); uint64_t nitems_written(unsigned int which_output); + void set_log_level(std::string level); + std::string log_level(); + // Methods to manage the block's max_noutput_items size. int max_noutput_items(); void set_max_noutput_items(int m); diff --git a/gnuradio-runtime/swig/hier_block2.i b/gnuradio-runtime/swig/hier_block2.i index 12190d0452..6e964db8a1 100644 --- a/gnuradio-runtime/swig/hier_block2.i +++ b/gnuradio-runtime/swig/hier_block2.i @@ -91,6 +91,9 @@ namespace gr { void unset_processor_affinity(); std::vector<int> processor_affinity(); + void set_log_level(std::string level); + std::string log_level(); + // Methods to manage block's min/max buffer sizes. size_t max_output_buffer(int i); void set_max_output_buffer(size_t max_output_buffer); diff --git a/gr-analog/CMakeLists.txt b/gr-analog/CMakeLists.txt index e0be42a0a5..3be716d7ab 100644 --- a/gr-analog/CMakeLists.txt +++ b/gr-analog/CMakeLists.txt @@ -51,40 +51,6 @@ SET(GR_PKG_ANALOG_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/analog) if(ENABLE_GR_ANALOG) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_ANALOG_DESCRIPTION "GNU Radio Analog Blocks") - -CPACK_COMPONENT("analog_runtime" - GROUP "Analog" - DISPLAY_NAME "Runtime" - DESCRIPTION "Dynamic link libraries" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("analog_devel" - GROUP "Analog" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("analog_python" - GROUP "Analog" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime" - DEPENDS "runtime_python;analog_runtime" -) - -CPACK_COMPONENT("analog_swig" - GROUP "Analog" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;analog_python;analog_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/analog) @@ -109,7 +75,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-analog.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "analog_devel" ) endif(ENABLE_GR_ANALOG) diff --git a/gr-analog/examples/CMakeLists.txt b/gr-analog/examples/CMakeLists.txt index acb0656b7f..fb23bdf4a0 100644 --- a/gr-analog/examples/CMakeLists.txt +++ b/gr-analog/examples/CMakeLists.txt @@ -23,12 +23,10 @@ include(GrPython) GR_PYTHON_INSTALL(PROGRAMS fmtest.py DESTINATION ${GR_PKG_ANALOG_EXAMPLES_DIR} - COMPONENT "analog_python" ) install( FILES noise_power.grc DESTINATION ${GR_PKG_ANALOG_EXAMPLES_DIR} - COMPONENT "analog_python" ) diff --git a/gr-analog/examples/tags/CMakeLists.txt b/gr-analog/examples/tags/CMakeLists.txt index ba95100665..9e51cee16a 100644 --- a/gr-analog/examples/tags/CMakeLists.txt +++ b/gr-analog/examples/tags/CMakeLists.txt @@ -22,5 +22,4 @@ include(GrPython) GR_PYTHON_INSTALL(PROGRAMS uhd_burst_detector.py DESTINATION ${GR_PKG_DATA_DIR}/examples/tags - COMPONENT "runtime_python" ) diff --git a/gr-analog/grc/CMakeLists.txt b/gr-analog/grc/CMakeLists.txt index a699d7c2fa..1251af5b83 100644 --- a/gr-analog/grc/CMakeLists.txt +++ b/gr-analog/grc/CMakeLists.txt @@ -18,5 +18,4 @@ # Boston, MA 02110-1301, USA. file(GLOB xml_files "*.xml") -install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "analog_python") - +install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR}) diff --git a/gr-analog/include/gnuradio/analog/CMakeLists.txt b/gr-analog/include/gnuradio/analog/CMakeLists.txt index b5333639d6..24b9ad95d1 100644 --- a/gr-analog/include/gnuradio/analog/CMakeLists.txt +++ b/gr-analog/include/gnuradio/analog/CMakeLists.txt @@ -68,6 +68,5 @@ install(FILES sig_source_waveform.h simple_squelch_cc.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/analog - COMPONENT "analog_devel" ) diff --git a/gr-analog/lib/CMakeLists.txt b/gr-analog/lib/CMakeLists.txt index a75d70337b..a3b279f900 100644 --- a/gr-analog/lib/CMakeLists.txt +++ b/gr-analog/lib/CMakeLists.txt @@ -106,7 +106,7 @@ list(APPEND analog_libs add_library(gnuradio-analog SHARED ${analog_sources}) target_link_libraries(gnuradio-analog ${analog_libs}) -GR_LIBRARY_FOO(gnuradio-analog RUNTIME_COMPONENT "analog_runtime" DEVEL_COMPONENT "analog_devel") +GR_LIBRARY_FOO(gnuradio-analog) add_dependencies(gnuradio-analog analog_generated_includes analog_generated_swigs gnuradio-filter) if(ENABLE_STATIC_LIBS) @@ -122,7 +122,7 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-analog_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "analog_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-analog/lib/fmdet_cf_impl.cc b/gr-analog/lib/fmdet_cf_impl.cc index 2c48ff07e2..38496d189b 100644 --- a/gr-analog/lib/fmdet_cf_impl.cc +++ b/gr-analog/lib/fmdet_cf_impl.cc @@ -106,7 +106,7 @@ namespace gr { while(size-- > 0) { S0 = *iptr++; - Sdot = d_scl * (-S0+d_8*S1-d_8*S1+S4); + Sdot = d_scl * (-S0+d_8*S1-d_8*S2+S4); d_freq = (S2.real()*Sdot.imag()-S2.imag()*Sdot.real()) / (S2.real()*S2.real()+S2.imag()*S2.imag()); diff --git a/gr-analog/python/analog/CMakeLists.txt b/gr-analog/python/analog/CMakeLists.txt index 2da8273c6c..1fed9d1890 100644 --- a/gr-analog/python/analog/CMakeLists.txt +++ b/gr-analog/python/analog/CMakeLists.txt @@ -36,7 +36,6 @@ GR_PYTHON_INSTALL( wfm_rcv_pll.py wfm_tx.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/analog - COMPONENT "analog_python" ) ######################################################################## diff --git a/gr-analog/swig/CMakeLists.txt b/gr-analog/swig/CMakeLists.txt index 38fef3a236..3636cce16d 100644 --- a/gr-analog/swig/CMakeLists.txt +++ b/gr-analog/swig/CMakeLists.txt @@ -50,7 +50,6 @@ GR_SWIG_MAKE(analog_swig analog_swig.i) GR_SWIG_INSTALL( TARGETS analog_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/analog - COMPONENT "analog_python" ) install( @@ -58,5 +57,4 @@ install( analog_swig.i ${CMAKE_CURRENT_BINARY_DIR}/analog_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "analog_swig" ) diff --git a/gr-audio/CMakeLists.txt b/gr-audio/CMakeLists.txt index 99e0bc174b..2185fd3690 100644 --- a/gr-audio/CMakeLists.txt +++ b/gr-audio/CMakeLists.txt @@ -43,47 +43,6 @@ SET(GR_PKG_AUDIO_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/audio) if(ENABLE_GR_AUDIO) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_AUDIO_DESCRIPTION "GNU Radio Audio Blocks") - -CPACK_COMPONENT("audio_runtime" - GROUP "Audio" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("audio_devel" - GROUP "Audio" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("audio_python" - GROUP "Audio" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;audio_runtime" -) - -CPACK_COMPONENT("audio_examples" - GROUP "Audio" - DISPLAY_NAME "Examples" - DESCRIPTION "Example programs" - DEPENDS "audio_runtime" -) - -CPACK_COMPONENT("audio_swig" - GROUP "Audio" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;audio_python;audio_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(lib) @@ -112,7 +71,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-audio.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "audio_devel" ) endif(ENABLE_GR_AUDIO) diff --git a/gr-audio/examples/c++/CMakeLists.txt b/gr-audio/examples/c++/CMakeLists.txt index 205bdeb287..202a79afe7 100644 --- a/gr-audio/examples/c++/CMakeLists.txt +++ b/gr-audio/examples/c++/CMakeLists.txt @@ -31,5 +31,4 @@ target_link_libraries(dial_tone INSTALL(TARGETS dial_tone DESTINATION ${GR_PKG_AUDIO_EXAMPLES_DIR} - COMPONENT "audio_examples" ) diff --git a/gr-audio/examples/grc/CMakeLists.txt b/gr-audio/examples/grc/CMakeLists.txt index 179b42fcc7..d0d0d568c7 100644 --- a/gr-audio/examples/grc/CMakeLists.txt +++ b/gr-audio/examples/grc/CMakeLists.txt @@ -22,6 +22,5 @@ install( cvsd_sweep.grc dial_tone.grc DESTINATION ${GR_PKG_AUDIO_EXAMPLES_DIR} - COMPONENT "audio_python" ) diff --git a/gr-audio/examples/python/CMakeLists.txt b/gr-audio/examples/python/CMakeLists.txt index 24e29e2348..01a03fefcd 100644 --- a/gr-audio/examples/python/CMakeLists.txt +++ b/gr-audio/examples/python/CMakeLists.txt @@ -33,5 +33,4 @@ GR_PYTHON_INSTALL(PROGRAMS spectrum_inversion.py test_resampler.py DESTINATION ${GR_PKG_AUDIO_EXAMPLES_DIR} - COMPONENT "audio_python" ) diff --git a/gr-audio/grc/CMakeLists.txt b/gr-audio/grc/CMakeLists.txt index 35c540ad3c..7da5fbc352 100644 --- a/gr-audio/grc/CMakeLists.txt +++ b/gr-audio/grc/CMakeLists.txt @@ -19,4 +19,4 @@ ######################################################################## file(GLOB xml_files "*.xml") -install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "audio_python") +install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR}) diff --git a/gr-audio/include/gnuradio/audio/CMakeLists.txt b/gr-audio/include/gnuradio/audio/CMakeLists.txt index 7e068e3f32..754da454f7 100644 --- a/gr-audio/include/gnuradio/audio/CMakeLists.txt +++ b/gr-audio/include/gnuradio/audio/CMakeLists.txt @@ -29,5 +29,4 @@ endif(OSX_AUDIO_VALID) install(FILES ${gr_audio_install_files} DESTINATION ${GR_INCLUDE_DIR}/gnuradio/audio - COMPONENT "audio_devel" ) diff --git a/gr-audio/lib/CMakeLists.txt b/gr-audio/lib/CMakeLists.txt index 944b1599b1..0534ddd86d 100644 --- a/gr-audio/lib/CMakeLists.txt +++ b/gr-audio/lib/CMakeLists.txt @@ -201,9 +201,9 @@ endif(WIN32) ######################################################################## add_library(gnuradio-audio SHARED ${gr_audio_sources}) target_link_libraries(gnuradio-audio ${gr_audio_libs}) -GR_LIBRARY_FOO(gnuradio-audio RUNTIME_COMPONENT "audio_runtime" DEVEL_COMPONENT "audio_devel") +GR_LIBRARY_FOO(gnuradio-audio) -install(FILES ${gr_audio_confs} DESTINATION ${GR_PREFSDIR} COMPONENT "audio_runtime") +install(FILES ${gr_audio_confs} DESTINATION ${GR_PREFSDIR}) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -225,6 +225,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-audio_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "audio_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-audio/python/audio/CMakeLists.txt b/gr-audio/python/audio/CMakeLists.txt index 11409e4323..2edbf21cf4 100644 --- a/gr-audio/python/audio/CMakeLists.txt +++ b/gr-audio/python/audio/CMakeLists.txt @@ -24,7 +24,6 @@ GR_PYTHON_INSTALL( FILES __init__.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/audio - COMPONENT "audio_python" ) ######################################################################## diff --git a/gr-audio/swig/CMakeLists.txt b/gr-audio/swig/CMakeLists.txt index f9dabfd8c4..4c67f5bd58 100644 --- a/gr-audio/swig/CMakeLists.txt +++ b/gr-audio/swig/CMakeLists.txt @@ -44,12 +44,10 @@ GR_SWIG_MAKE(audio_swig audio_swig.i) GR_SWIG_INSTALL( TARGETS audio_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/audio - COMPONENT "audio_python" ) install( FILES audio_swig.i ${CMAKE_CURRENT_BINARY_DIR}/audio_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "audio_swig" ) diff --git a/gr-blocks/CMakeLists.txt b/gr-blocks/CMakeLists.txt index 685f5736fb..6f573a09b1 100644 --- a/gr-blocks/CMakeLists.txt +++ b/gr-blocks/CMakeLists.txt @@ -44,40 +44,6 @@ GR_SET_GLOBAL(GR_BLOCKS_INCLUDE_DIRS if(ENABLE_GR_BLOCKS) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_BLOCKS_DESCRIPTION "GNU Radio Basic Blocks") - -CPACK_COMPONENT("blocks_runtime" - GROUP "Blocks" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("blocks_devel" - GROUP "Blocks" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("blocks_python" - GROUP "Blocks" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;blocks_runtime" -) - -CPACK_COMPONENT("blocks_swig" - GROUP "Blocks" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;blocks_python;blocks_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/blocks) @@ -105,7 +71,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-blocks.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "blocks_devel" ) endif(ENABLE_GR_BLOCKS) diff --git a/gr-blocks/examples/CMakeLists.txt b/gr-blocks/examples/CMakeLists.txt index 8be56d0b9d..850672e404 100644 --- a/gr-blocks/examples/CMakeLists.txt +++ b/gr-blocks/examples/CMakeLists.txt @@ -22,9 +22,8 @@ install( matrix_multiplexer.grc peak_detector2.grc vector_source_with_tags.grc - test_stream_mux_tags.grc + test_stream_mux_tags.grc DESTINATION ${GR_PKG_DATA_DIR}/examples/blocks - COMPONENT "runtime_python" ) add_subdirectory(metadata) diff --git a/gr-blocks/examples/ctrlport/CMakeLists.txt b/gr-blocks/examples/ctrlport/CMakeLists.txt index 23d2db129f..c9b39bcaaa 100644 --- a/gr-blocks/examples/ctrlport/CMakeLists.txt +++ b/gr-blocks/examples/ctrlport/CMakeLists.txt @@ -26,12 +26,10 @@ install( simple_copy.grc usrp_source_control.grc DESTINATION ${GR_PKG_DATA_DIR}/examples/ctrlport - COMPONENT "runtime_python" ) GR_PYTHON_INSTALL(PROGRAMS simple_copy_controller.py usrp_source_controller.py DESTINATION ${GR_PKG_DATA_DIR}/examples/ctrlport - COMPONENT "runtime_python" ) diff --git a/gr-blocks/examples/metadata/CMakeLists.txt b/gr-blocks/examples/metadata/CMakeLists.txt index 8d7bbe79e0..418b2d2594 100644 --- a/gr-blocks/examples/metadata/CMakeLists.txt +++ b/gr-blocks/examples/metadata/CMakeLists.txt @@ -26,5 +26,4 @@ install( file_metadata_vector_sink.grc file_metadata_vector_source.grc DESTINATION ${GR_PKG_DATA_DIR}/examples/metadata - COMPONENT "runtime_python" ) diff --git a/gr-blocks/examples/msg_passing/CMakeLists.txt b/gr-blocks/examples/msg_passing/CMakeLists.txt index 9c24355f7f..9965ce878a 100644 --- a/gr-blocks/examples/msg_passing/CMakeLists.txt +++ b/gr-blocks/examples/msg_passing/CMakeLists.txt @@ -23,5 +23,4 @@ install( FILES strobe.grc DESTINATION ${GR_PKG_DATA_DIR}/examples/msg_passing - COMPONENT "runtime_python" ) diff --git a/gr-blocks/examples/tags/CMakeLists.txt b/gr-blocks/examples/tags/CMakeLists.txt index 142b5cde6c..52cf4662bb 100644 --- a/gr-blocks/examples/tags/CMakeLists.txt +++ b/gr-blocks/examples/tags/CMakeLists.txt @@ -22,6 +22,4 @@ include(GrPython) GR_PYTHON_INSTALL(PROGRAMS test_file_tags.py DESTINATION ${GR_PKG_DATA_DIR}/examples/tags - COMPONENT "blocks_python" ) - diff --git a/gr-blocks/grc/CMakeLists.txt b/gr-blocks/grc/CMakeLists.txt index 96a715a7e4..2dd1481a47 100644 --- a/gr-blocks/grc/CMakeLists.txt +++ b/gr-blocks/grc/CMakeLists.txt @@ -28,4 +28,4 @@ if(NOT ENABLE_GR_CTRLPORT) ) endif(NOT ENABLE_GR_CTRLPORT) -install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "blocks_python") +install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR}) diff --git a/gr-blocks/grc/blocks_block_tree.xml b/gr-blocks/grc/blocks_block_tree.xml index c4857f3b3a..644773f686 100644 --- a/gr-blocks/grc/blocks_block_tree.xml +++ b/gr-blocks/grc/blocks_block_tree.xml @@ -158,6 +158,7 @@ <name>Networking Tools</name> <block>blocks_tuntap_pdu</block> <block>blocks_socket_pdu</block> + <block>blocks_tcp_server_sink</block> <block>blocks_udp_source</block> <block>blocks_udp_sink</block> </cat> diff --git a/gr-blocks/grc/blocks_tcp_server_sink.xml b/gr-blocks/grc/blocks_tcp_server_sink.xml new file mode 100644 index 0000000000..644027da65 --- /dev/null +++ b/gr-blocks/grc/blocks_tcp_server_sink.xml @@ -0,0 +1,77 @@ +<?xml version="1.0"?> +<!-- +################################################### +##TCP Server Sink +################################################### + --> +<block> + <name>TCP Server Sink</name> + <key>blocks_tcp_server_sink</key> + <import>from gnuradio import blocks</import> + <make>blocks.tcp_server_sink($type.size*$vlen, $ipaddr, $port, $noblock)</make> + <param> + <name>Input Type</name> + <key>type</key> + <type>enum</type> + <option> + <name>Complex</name> + <key>complex</key> + <opt>size:gr.sizeof_gr_complex</opt> + </option> + <option> + <name>Float</name> + <key>float</key> + <opt>size:gr.sizeof_float</opt> + </option> + <option> + <name>Int</name> + <key>int</key> + <opt>size:gr.sizeof_int</opt> + </option> + <option> + <name>Short</name> + <key>short</key> + <opt>size:gr.sizeof_short</opt> + </option> + <option> + <name>Byte</name> + <key>byte</key> + <opt>size:gr.sizeof_char</opt> + </option> + </param> + <param> + <name>Destination IP Address</name> + <key>ipaddr</key> + <type>string</type> + </param> + <param> + <name>Destination Port</name> + <key>port</key> + <type>int</type> + </param> + <param> + <name>Nonblocking Mode</name> + <key>noblock</key> + <type>enum</type> + <option> + <name>On</name> + <key>True</key> + </option> + <option> + <name>Off</name> + <key>False</key> + </option> + </param> + <param> + <name>Vec Length</name> + <key>vlen</key> + <value>1</value> + <type>int</type> + </param> + <check>$vlen > 0</check> + <sink> + <name>in</name> + <type>$type</type> + <vlen>$vlen</vlen> + </sink> +</block> diff --git a/gr-blocks/include/gnuradio/blocks/CMakeLists.txt b/gr-blocks/include/gnuradio/blocks/CMakeLists.txt index 38c79d60f3..5a748acc19 100644 --- a/gr-blocks/include/gnuradio/blocks/CMakeLists.txt +++ b/gr-blocks/include/gnuradio/blocks/CMakeLists.txt @@ -174,6 +174,7 @@ install(FILES tagged_stream_multiply_length.h tagged_stream_to_pdu.h tags_strobe.h + tcp_server_sink.h test_tag_variable_rate_ff.h threshold_ff.h throttle.h @@ -191,7 +192,6 @@ install(FILES wavfile_sink.h wavfile_source.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/blocks - COMPONENT "blocks_devel" ) if(ENABLE_GR_CTRLPORT) @@ -203,6 +203,5 @@ install(FILES ctrlport_probe2_i.h ctrlport_probe2_b.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/blocks - COMPONENT "blocks_devel" ) endif(ENABLE_GR_CTRLPORT) diff --git a/gr-blocks/include/gnuradio/blocks/stream_to_vector.h b/gr-blocks/include/gnuradio/blocks/stream_to_vector.h index 10e0b2bf91..ca96bdd7fe 100644 --- a/gr-blocks/include/gnuradio/blocks/stream_to_vector.h +++ b/gr-blocks/include/gnuradio/blocks/stream_to_vector.h @@ -43,7 +43,7 @@ namespace gr { * Make a stream-to-vector block. * * \param itemsize the item size of the stream - * \param nitems_per_block number of items to but into each vector (vector size) + * \param nitems_per_block number of items to put into each vector (vector size) */ static sptr make(size_t itemsize, size_t nitems_per_block); }; diff --git a/gr-blocks/include/gnuradio/blocks/tcp_server_sink.h b/gr-blocks/include/gnuradio/blocks/tcp_server_sink.h new file mode 100644 index 0000000000..6d951a8e67 --- /dev/null +++ b/gr-blocks/include/gnuradio/blocks/tcp_server_sink.h @@ -0,0 +1,66 @@ +/* -*- c++ -*- */ +/* + * Copyright 2014 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * 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. + */ + +#ifndef INCLUDED_BLOCKS_TCP_SERVER_SINK_H +#define INCLUDED_BLOCKS_TCP_SERVER_SINK_H + +#include <gnuradio/blocks/api.h> +#include <gnuradio/sync_block.h> + +namespace gr { + namespace blocks { + + /*! + * \brief Send stream trought an TCP socket. + * \ingroup networking_tools_blk + * + * \details + * Listen for incomming TCP connection(s). Duplicate data for each + * opened connection. Optionaly can wait until first client connects + * before streaming starts. + */ + class BLOCKS_API tcp_server_sink : virtual public gr::sync_block + { + public: + // gr::blocks::tcp_server_sink::sptr + typedef boost::shared_ptr<tcp_server_sink> sptr; + + /*! + * \brief TCP Server Sink Constructor + * + * \param itemsize The size (in bytes) of the item datatype + * \param host The name or IP address of interface to bind to. + * \param port Port where to listen. + * \param noblock If false, wait until first client connects before + * streaming starts. In non blocking mode + * (noblock=true), drop data onto floor if no client + * is connected. + */ + static sptr make(size_t itemsize, + const std::string &host, int port, + bool noblock = false); + }; + + } /* namespace blocks */ +} /* namespace gr */ + +#endif /* INCLUDED_BLOCKS_TCP_SERVER_SINK_H */ diff --git a/gr-blocks/lib/CMakeLists.txt b/gr-blocks/lib/CMakeLists.txt index 643190c2ee..da6bc9bf89 100644 --- a/gr-blocks/lib/CMakeLists.txt +++ b/gr-blocks/lib/CMakeLists.txt @@ -199,6 +199,7 @@ list(APPEND gr_blocks_sources throttle_impl.cc transcendental_impl.cc tcp_connection.cc + tcp_server_sink_impl.cc tuntap_pdu_impl.cc tag_gate_impl.cc tagged_stream_align_impl.cc @@ -258,7 +259,7 @@ add_library(gnuradio-blocks SHARED ${gr_blocks_sources}) add_dependencies(gnuradio-blocks blocks_generated_includes) target_link_libraries(gnuradio-blocks ${blocks_libs}) -GR_LIBRARY_FOO(gnuradio-blocks RUNTIME_COMPONENT "blocks_runtime" DEVEL_COMPONENT "blocks_devel") +GR_LIBRARY_FOO(gnuradio-blocks) if(ENABLE_STATIC_LIBS) # Remove controlport-specific source files from staticlibs build @@ -289,7 +290,7 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-blocks_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "blocks_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-blocks/lib/tcp_server_sink_impl.cc b/gr-blocks/lib/tcp_server_sink_impl.cc new file mode 100644 index 0000000000..329e798ca8 --- /dev/null +++ b/gr-blocks/lib/tcp_server_sink_impl.cc @@ -0,0 +1,161 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007-2010,2013 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "tcp_server_sink_impl.h" +#include <gnuradio/io_signature.h> +#include <algorithm> +#include <boost/array.hpp> +#include <boost/asio.hpp> +#include <boost/format.hpp> +#include <gnuradio/thread/thread.h> +#include <stdexcept> +#include <stdio.h> +#include <string.h> + +namespace gr { + namespace blocks { + + tcp_server_sink::sptr + tcp_server_sink::make(size_t itemsize, + const std::string &host, int port, + bool noblock) + { + return gnuradio::get_initial_sptr + (new tcp_server_sink_impl(itemsize, host, port, noblock)); + } + + tcp_server_sink_impl::tcp_server_sink_impl(size_t itemsize, + const std::string &host, int port, + bool noblock) + : sync_block("tcp_server_sink", + io_signature::make(1, 1, itemsize), + io_signature::make(0, 0, 0)), + d_itemsize(itemsize), + d_acceptor(d_io_service), + d_buf(new uint8_t[BUF_SIZE]), + d_writing(0) + { + std::string s_port = (boost::format("%d") % port).str(); + std::string s_host = host.empty() ? std::string("localhost") : host; + boost::asio::ip::tcp::resolver resolver(d_io_service); + boost::asio::ip::tcp::resolver::query query(s_host, s_port, + boost::asio::ip::resolver_query_base::passive); + d_endpoint = *resolver.resolve(query); + + d_acceptor.open(d_endpoint.protocol()); + d_acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true)); + d_acceptor.bind(d_endpoint); + d_acceptor.listen(); + + if (!noblock) { + d_socket.reset(new boost::asio::ip::tcp::socket(d_io_service)); + d_acceptor.accept(*d_socket, d_endpoint); + d_sockets.insert(d_socket.release()); + } + + d_socket.reset(new boost::asio::ip::tcp::socket(d_io_service)); + d_acceptor.async_accept(*d_socket, boost::bind(&tcp_server_sink_impl::do_accept, + this, boost::asio::placeholders::error)); + d_io_serv_thread = boost::thread( + boost::bind(&boost::asio::io_service::run, &d_io_service)); + } + + void + tcp_server_sink_impl::do_accept(const boost::system::error_code& error) + { + if (!error) { + gr::thread::scoped_lock guard(d_writing_mut); + d_sockets.insert(d_socket.release()); + d_socket.reset(new boost::asio::ip::tcp::socket(d_io_service)); + d_acceptor.async_accept(*d_socket, boost::bind(&tcp_server_sink_impl::do_accept, + this, boost::asio::placeholders::error)); + } + } + + void + tcp_server_sink_impl::do_write(const boost::system::error_code& error, + size_t len, std::set<boost::asio::ip::tcp::socket *>::iterator i) + { + { + gr::thread::scoped_lock guard(d_writing_mut); + --d_writing; + if (error) { + delete *i; + d_sockets.erase(i); + } + } + d_writing_cond.notify_one(); + } + + tcp_server_sink_impl::~tcp_server_sink_impl() + { + gr::thread::scoped_lock guard(d_writing_mut); + while (d_writing) { + d_writing_cond.wait(guard); + } + + for (std::set<boost::asio::ip::tcp::socket *>::iterator i = d_sockets.begin(); + i != d_sockets.end(); ++i ) { + delete *i; + } + d_sockets.clear(); + + d_io_service.reset(); + d_io_service.stop(); + d_io_serv_thread.join(); + } + + int + tcp_server_sink_impl::work (int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + const char *in = (const char *) input_items[0]; + + gr::thread::scoped_lock guard(d_writing_mut); + while (d_writing) { + d_writing_cond.wait(guard); + } + + size_t data_len = std::min(size_t(BUF_SIZE), noutput_items * d_itemsize); + data_len -= data_len % d_itemsize; + memcpy(d_buf.get(), in, data_len); + for (std::set<boost::asio::ip::tcp::socket *>::iterator i = d_sockets.begin(); + i != d_sockets.end(); ++i ) { + boost::asio::async_write(**i, boost::asio::buffer(d_buf.get(), data_len), + boost::bind(&tcp_server_sink_impl::do_write, this, + boost::asio::placeholders::error, + boost::asio::placeholders::bytes_transferred, + i)); + } + d_writing = d_sockets.size(); + + return data_len / d_itemsize; + } + + } /* namespace blocks */ +} /* namespace gr */ + diff --git a/gr-blocks/lib/tcp_server_sink_impl.h b/gr-blocks/lib/tcp_server_sink_impl.h new file mode 100644 index 0000000000..d10f3b95b8 --- /dev/null +++ b/gr-blocks/lib/tcp_server_sink_impl.h @@ -0,0 +1,73 @@ +/* -*- c++ -*- */ +/* + * Copyright 2014 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * 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. + */ + +#ifndef INCLUDED_GR_TCP_SERVER_SINK_IMPL_H +#define INCLUDED_GR_TCP_SERVER_SINK_IMPL_H + +#include <gnuradio/blocks/tcp_server_sink.h> +#include <boost/asio.hpp> +#include <set> +#include <boost/ptr_container/ptr_vector.hpp> + +namespace gr { + namespace blocks { + + class tcp_server_sink_impl : public tcp_server_sink + { + private: + size_t d_itemsize; + + boost::asio::io_service d_io_service; + gr::thread::thread d_io_serv_thread; + boost::asio::ip::tcp::endpoint d_endpoint; + std::auto_ptr<boost::asio::ip::tcp::socket> d_socket; + std::set<boost::asio::ip::tcp::socket *> d_sockets; + boost::asio::ip::tcp::acceptor d_acceptor; + + boost::shared_ptr<uint8_t> d_buf; + enum { + BUF_SIZE = 256 * 1024, + }; + + int d_writing; + boost::condition_variable d_writing_cond; + boost::mutex d_writing_mut; + + void do_accept(const boost::system::error_code& error); + void do_write(const boost::system::error_code& error, std::size_t len, + std::set<boost::asio::ip::tcp::socket *>::iterator); + + public: + tcp_server_sink_impl(size_t itemsize, + const std::string &host, int port, + bool noblock); + ~tcp_server_sink_impl(); + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + + } /* namespace blocks */ +} /* namespace gr */ + +#endif /* INCLUDED_GR_TCP_SERVER_SINK_IMPL_H */ diff --git a/gr-blocks/python/blocks/CMakeLists.txt b/gr-blocks/python/blocks/CMakeLists.txt index 19d808b1dd..afb860a075 100644 --- a/gr-blocks/python/blocks/CMakeLists.txt +++ b/gr-blocks/python/blocks/CMakeLists.txt @@ -26,7 +26,6 @@ GR_PYTHON_INSTALL( parse_file_metadata.py stream_to_vector_decimator.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/blocks - COMPONENT "blocks_python" ) ######################################################################## diff --git a/gr-blocks/python/blocks/qa_logger.py b/gr-blocks/python/blocks/qa_logger.py new file mode 100644 index 0000000000..d2b6b3ee5e --- /dev/null +++ b/gr-blocks/python/blocks/qa_logger.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# +# Copyright 2016 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# 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. +# + +from gnuradio import gr, gr_unittest, blocks + +class test_logger (gr_unittest.TestCase): + + def setUp(self): + pass + + def tearDown(self): + pass + + def set_and_assert_log_level(self, block, level): + block.set_log_level(level) + self.assertEqual(block.log_level(), level) + + def test_log_level_for_block(self): + # Test the python API for getting and setting log levels of individual block + # go through all of the documented log_levels + ns = blocks.null_source(1) + self.set_and_assert_log_level(ns, "notset") + self.set_and_assert_log_level(ns, "debug") + self.set_and_assert_log_level(ns, "info") + self.set_and_assert_log_level(ns, "notice") + self.set_and_assert_log_level(ns, "warn") + self.set_and_assert_log_level(ns, "error") + self.set_and_assert_log_level(ns, "crit") + self.set_and_assert_log_level(ns, "alert") + self.set_and_assert_log_level(ns, "emerg") + # There's a couple of special cases. "off" == "notset" (specific to gr) + # and "fatal" == "emerg" (built in to log4cpp) + ns.set_log_level("off") + self.assertEqual(ns.log_level(), "notset") + ns.set_log_level("fatal") + self.assertEqual(ns.log_level(), "emerg") + # Make sure exception is throw on bogus data + self.assertRaises(RuntimeError, ns.set_log_level, "11") + + + def test_log_level_for_tb(self): + # Test the python API for getting and setting log levels for a top_block + nsrc = blocks.null_source(4) + nsnk = blocks.null_sink(4) + # Set all log levels to a known state + nsrc.set_log_level("debug") + nsnk.set_log_level("debug") + tb = gr.top_block() + tb.connect(nsrc, nsnk) + # confirm that the tb has log_level of first block + self.assertEqual(tb.log_level(), "debug") + # confirm that changing tb log_level propagates to connected blocks + tb.set_log_level("alert") + self.assertEqual(tb.log_level(), "alert") + self.assertEqual(nsrc.log_level(), "alert") + self.assertEqual(nsnk.log_level(), "alert") + + def test_log_level_for_hier_block(self): + # Test the python API for getting and setting log levels for hier blocks + nsrc = blocks.null_source(4) + nsnk = blocks.null_sink(4) + b = blocks.stream_to_vector_decimator(4, 1, 1, 1) # just a random hier block that exists + tb = gr.top_block() + tb.connect(nsrc, b, nsnk) + tb.set_log_level("debug") + self.assertEqual(tb.log_level(), "debug") + self.assertEqual(nsrc.log_level(), "debug") + self.assertEqual(nsnk.log_level(), "debug") + self.assertEqual(b.one_in_n.log_level(), "debug") + tb.set_log_level("alert") + self.assertEqual(tb.log_level(), "alert") + self.assertEqual(nsrc.log_level(), "alert") + self.assertEqual(nsnk.log_level(), "alert") + self.assertEqual(b.one_in_n.log_level(), "alert") + +if __name__ == '__main__': + gr_unittest.run(test_logger, "test_logger.xml") diff --git a/gr-blocks/python/blocks/qa_tcp_server_sink.py b/gr-blocks/python/blocks/qa_tcp_server_sink.py new file mode 100644 index 0000000000..f7d3a0af92 --- /dev/null +++ b/gr-blocks/python/blocks/qa_tcp_server_sink.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python +# +# Copyright 2014 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# 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. +# + +from gnuradio import gr, gr_unittest, blocks +import os +import socket +from time import sleep + +from threading import Timer +from multiprocessing import Process + +class test_tcp_sink(gr_unittest.TestCase): + + def setUp(self): + os.environ['GR_CONF_CONTROLPORT_ON'] = 'False' + self.tb_snd = gr.top_block() + self.tb_rcv = gr.top_block() + + def tearDown(self): + self.tb_rcv = None + self.tb_snd = None + + def _tcp_client(self): + dst = blocks.vector_sink_s() + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + for t in (0, 0.2): +# wait until server listens + sleep(t) + try: + sock.connect((self.addr, self.port)) + except socket.error as e: + if e.errno != 111: + raise + continue + break + fd = os.dup(sock.fileno()) + self.tb_rcv.connect(blocks.file_descriptor_source(self.itemsize, fd), dst) + self.tb_rcv.run() + self.assertEqual(self.data, dst.data()) + + def test_001(self): + self.addr = '127.0.0.1' + self.port = 65510 + self.itemsize = gr.sizeof_short + n_data = 16 + self.data = tuple([x for x in range(n_data)]) + +# tcp_server_sink blocks until client does not connect, start client process first + p = Process(target=self._tcp_client) + p.start() + + src = blocks.vector_source_s(self.data, False) + tcp_snd = blocks.tcp_server_sink(self.itemsize, self.addr, self.port, False) + self.tb_snd.connect(src, tcp_snd) + + self.tb_snd.run() + del tcp_snd + self.tb_snd = None + p.join() + + def stop_rcv(self): + self.timeout = True + self.tb_rcv.stop() + #print "tb_rcv stopped by Timer" + +if __name__ == '__main__': + gr_unittest.run(test_tcp_sink, "test_tcp_server_sink.xml") + diff --git a/gr-blocks/python/grc_gnuradio/CMakeLists.txt b/gr-blocks/python/grc_gnuradio/CMakeLists.txt index 9ff1240997..33c7560ea6 100644 --- a/gr-blocks/python/grc_gnuradio/CMakeLists.txt +++ b/gr-blocks/python/grc_gnuradio/CMakeLists.txt @@ -24,7 +24,6 @@ include(GrPython) GR_PYTHON_INSTALL( FILES __init__.py DESTINATION ${GR_PYTHON_DIR}/grc_gnuradio - COMPONENT "blocks_python" ) GR_PYTHON_INSTALL(FILES @@ -33,5 +32,4 @@ GR_PYTHON_INSTALL(FILES blks2/selector.py blks2/tcp.py DESTINATION ${GR_PYTHON_DIR}/grc_gnuradio/blks2 - COMPONENT "blocks_python" ) diff --git a/gr-blocks/swig/CMakeLists.txt b/gr-blocks/swig/CMakeLists.txt index c128a9b26c..5aec00ae92 100644 --- a/gr-blocks/swig/CMakeLists.txt +++ b/gr-blocks/swig/CMakeLists.txt @@ -68,8 +68,7 @@ foreach(swigfile ${GR_SWIG_BLOCK_IFILES}) GR_SWIG_INSTALL( TARGETS ${swigfile} DESTINATION ${GR_PYTHON_DIR}/gnuradio/blocks - COMPONENT "blocks_python") - + ) list(APPEND SWIGFILES ${swigfile}.i) list(APPEND SWIGDOCFILES ${CMAKE_CURRENT_BINARY_DIR}/${swigfile}_doc.i) endforeach(swigfile) @@ -79,12 +78,10 @@ install( ${SWIGFILES} ${SWIGDOCFILES} DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "blocks_swig" ) # Install the Python file that pulls in the swig built files. GR_PYTHON_INSTALL( FILES ${CMAKE_CURRENT_BINARY_DIR}/blocks_swig.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/blocks - COMPONENT "blocks_python" ) diff --git a/gr-blocks/swig/blocks_swig5.i b/gr-blocks/swig/blocks_swig5.i index 51601a8c30..761b0a855a 100644 --- a/gr-blocks/swig/blocks_swig5.i +++ b/gr-blocks/swig/blocks_swig5.i @@ -56,6 +56,7 @@ #include "gnuradio/blocks/tagged_stream_multiply_length.h" #include "gnuradio/blocks/tagged_stream_to_pdu.h" #include "gnuradio/blocks/tags_strobe.h" +#include "gnuradio/blocks/tcp_server_sink.h" #include "gnuradio/blocks/test_tag_variable_rate_ff.h" #include "gnuradio/blocks/threshold_ff.h" #include "gnuradio/blocks/transcendental.h" @@ -100,6 +101,7 @@ %include "gnuradio/blocks/tagged_stream_multiply_length.h" %include "gnuradio/blocks/tagged_stream_to_pdu.h" %include "gnuradio/blocks/tags_strobe.h" +%include "gnuradio/blocks/tcp_server_sink.h" %include "gnuradio/blocks/test_tag_variable_rate_ff.h" %include "gnuradio/blocks/threshold_ff.h" %include "gnuradio/blocks/transcendental.h" @@ -143,6 +145,7 @@ GR_SWIG_BLOCK_MAGIC2(blocks, tagged_stream_mux); GR_SWIG_BLOCK_MAGIC2(blocks, tagged_stream_multiply_length); GR_SWIG_BLOCK_MAGIC2(blocks, tagged_stream_to_pdu); GR_SWIG_BLOCK_MAGIC2(blocks, tags_strobe); +GR_SWIG_BLOCK_MAGIC2(blocks, tcp_server_sink); GR_SWIG_BLOCK_MAGIC2(blocks, test_tag_variable_rate_ff); GR_SWIG_BLOCK_MAGIC2(blocks, threshold_ff); GR_SWIG_BLOCK_MAGIC2(blocks, transcendental); diff --git a/gr-channels/CMakeLists.txt b/gr-channels/CMakeLists.txt index 2b5b4cd7d5..9e5deeedcf 100644 --- a/gr-channels/CMakeLists.txt +++ b/gr-channels/CMakeLists.txt @@ -50,40 +50,6 @@ SET(GR_PKG_CHANNELS_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/channels) if(ENABLE_GR_CHANNELS) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_CHANNELS_DESCRIPTION "GNU Radio Channel Model Blocks") - -CPACK_COMPONENT("channels_runtime" - GROUP "Channel Models" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("channels_devel" - GROUP "Channel Models" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("channels_python" - GROUP "Channel Models" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;channels_runtime" -) - -CPACK_COMPONENT("channels_swig" - GROUP "Channel Models" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;channels_python;channels_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/channels) @@ -107,7 +73,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-channels.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "channels_devel" ) endif(ENABLE_GR_CHANNELS) diff --git a/gr-channels/examples/CMakeLists.txt b/gr-channels/examples/CMakeLists.txt index af33a8f66f..caf7677830 100644 --- a/gr-channels/examples/CMakeLists.txt +++ b/gr-channels/examples/CMakeLists.txt @@ -29,5 +29,4 @@ install( demo_qam.grc demo_ofdm.grc DESTINATION ${GR_PKG_CHANNELS_EXAMPLES_DIR} - COMPONENT "channels_python" ) diff --git a/gr-channels/grc/CMakeLists.txt b/gr-channels/grc/CMakeLists.txt index 75e2bc0ddd..c85170b4ea 100644 --- a/gr-channels/grc/CMakeLists.txt +++ b/gr-channels/grc/CMakeLists.txt @@ -19,5 +19,5 @@ file(GLOB xml_files "*.xml") install(FILES ${xml_files} - DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "channels_python" + DESTINATION ${GRC_BLOCKS_DIR} ) diff --git a/gr-channels/include/gnuradio/channels/CMakeLists.txt b/gr-channels/include/gnuradio/channels/CMakeLists.txt index 6fac10e306..e41c7cc927 100644 --- a/gr-channels/include/gnuradio/channels/CMakeLists.txt +++ b/gr-channels/include/gnuradio/channels/CMakeLists.txt @@ -28,6 +28,5 @@ install(FILES selective_fading_model.h selective_fading_model2.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/channels - COMPONENT "channels_devel" ) diff --git a/gr-channels/lib/CMakeLists.txt b/gr-channels/lib/CMakeLists.txt index 34726c1715..d025889edb 100644 --- a/gr-channels/lib/CMakeLists.txt +++ b/gr-channels/lib/CMakeLists.txt @@ -77,7 +77,7 @@ list(APPEND channels_libs add_library(gnuradio-channels SHARED ${channels_sources}) target_link_libraries(gnuradio-channels ${channels_libs}) -GR_LIBRARY_FOO(gnuradio-channels RUNTIME_COMPONENT "channels_runtime" DEVEL_COMPONENT "channels_devel") +GR_LIBRARY_FOO(gnuradio-channels) add_dependencies(gnuradio-channels channels_generated_includes channels_generated_swigs gnuradio-runtime gnuradio-filter gnuradio-analog gnuradio-blocks) @@ -109,6 +109,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-channels_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "channels_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-channels/python/channels/CMakeLists.txt b/gr-channels/python/channels/CMakeLists.txt index 0e36b94a90..a91033df75 100644 --- a/gr-channels/python/channels/CMakeLists.txt +++ b/gr-channels/python/channels/CMakeLists.txt @@ -33,7 +33,6 @@ GR_PYTHON_INSTALL( phase_noise_gen.py quantizer.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/channels - COMPONENT "channels_python" ) ######################################################################## diff --git a/gr-channels/swig/CMakeLists.txt b/gr-channels/swig/CMakeLists.txt index 3a85626e98..55b7ea7a47 100644 --- a/gr-channels/swig/CMakeLists.txt +++ b/gr-channels/swig/CMakeLists.txt @@ -44,7 +44,6 @@ GR_SWIG_MAKE(channels_swig channels_swig.i) GR_SWIG_INSTALL( TARGETS channels_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/channels - COMPONENT "channels_python" ) install( @@ -52,5 +51,4 @@ install( channels_swig.i ${CMAKE_CURRENT_BINARY_DIR}/channels_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "channels_swig" ) diff --git a/gr-comedi/CMakeLists.txt b/gr-comedi/CMakeLists.txt index caf46ee5e8..b457971264 100644 --- a/gr-comedi/CMakeLists.txt +++ b/gr-comedi/CMakeLists.txt @@ -51,40 +51,6 @@ SET(GR_PKG_COMEDI_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/comedi) if(ENABLE_GR_COMEDI) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_COMEDI_DESCRIPTION "GNU Radio Comedi Blocks") - -CPACK_COMPONENT("comedi_runtime" - GROUP "Comedi" - DISPLAY_NAME "Runtime" - DESCRIPTION "Dynamic link libraries" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("comedi_devel" - GROUP "Comedi" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("comedi_python" - GROUP "Comedi" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime" - DEPENDS "runtime_python;comedi_runtime" -) - -CPACK_COMPONENT("comedi_swig" - GROUP "Comedi" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;comedi_python;comedi_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/comedi) @@ -105,7 +71,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-comedi.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "comedi_devel" ) endif(ENABLE_GR_COMEDI) diff --git a/gr-comedi/include/gnuradio/comedi/CMakeLists.txt b/gr-comedi/include/gnuradio/comedi/CMakeLists.txt index 51a609e421..601c1fb91d 100644 --- a/gr-comedi/include/gnuradio/comedi/CMakeLists.txt +++ b/gr-comedi/include/gnuradio/comedi/CMakeLists.txt @@ -25,6 +25,5 @@ install(FILES sink_s.h source_s.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/comedi - COMPONENT "comedi_devel" ) diff --git a/gr-comedi/lib/CMakeLists.txt b/gr-comedi/lib/CMakeLists.txt index e6e58dc8c4..38f51fcd1b 100644 --- a/gr-comedi/lib/CMakeLists.txt +++ b/gr-comedi/lib/CMakeLists.txt @@ -54,7 +54,7 @@ list(APPEND comedi_libs add_library(gnuradio-comedi SHARED ${comedi_sources}) target_link_libraries(gnuradio-comedi ${comedi_libs}) -GR_LIBRARY_FOO(gnuradio-comedi RUNTIME_COMPONENT "comedi_runtime" DEVEL_COMPONENT "comedi_devel") +GR_LIBRARY_FOO(gnuradio-comedi) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -76,6 +76,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-comedi_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "comedi_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-comedi/python/comedi/CMakeLists.txt b/gr-comedi/python/comedi/CMakeLists.txt index 5ac692f995..e3f7031a23 100644 --- a/gr-comedi/python/comedi/CMakeLists.txt +++ b/gr-comedi/python/comedi/CMakeLists.txt @@ -26,7 +26,6 @@ GR_PYTHON_INSTALL( FILES __init__.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/comedi - COMPONENT "comedi_python" ) ######################################################################## diff --git a/gr-comedi/swig/CMakeLists.txt b/gr-comedi/swig/CMakeLists.txt index b31e4e87eb..d406a3002e 100644 --- a/gr-comedi/swig/CMakeLists.txt +++ b/gr-comedi/swig/CMakeLists.txt @@ -46,7 +46,6 @@ GR_SWIG_MAKE(comedi_swig comedi_swig.i) GR_SWIG_INSTALL( TARGETS comedi_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/comedi - COMPONENT "comedi_python" ) install( @@ -54,5 +53,4 @@ install( comedi_swig.i ${CMAKE_CURRENT_BINARY_DIR}/comedi_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "comedi_swig" ) diff --git a/gr-digital/CMakeLists.txt b/gr-digital/CMakeLists.txt index c6fa0798d1..cafadf68d1 100644 --- a/gr-digital/CMakeLists.txt +++ b/gr-digital/CMakeLists.txt @@ -55,40 +55,6 @@ SET(GR_PKG_DIGITAL_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/digital) if(ENABLE_GR_DIGITAL) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_DIGITAL_DESCRIPTION "GNU Radio Digital Blocks") - -CPACK_COMPONENT("digital_runtime" - GROUP "Digital" - DISPLAY_NAME "Runtime" - DESCRIPTION "Dynamic link libraries" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("digital_devel" - GROUP "Digital" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("digital_python" - GROUP "Digital" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime" - DEPENDS "runtime_python;digital_runtime" -) - -CPACK_COMPONENT("digital_swig" - GROUP "Digital" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;digital_python;digital_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/digital) @@ -113,7 +79,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-digital.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "digital_devel" ) endif(ENABLE_GR_DIGITAL) diff --git a/gr-digital/examples/CMakeLists.txt b/gr-digital/examples/CMakeLists.txt index 5f1adf08ab..7f388fceda 100644 --- a/gr-digital/examples/CMakeLists.txt +++ b/gr-digital/examples/CMakeLists.txt @@ -28,14 +28,12 @@ GR_PYTHON_INSTALL(PROGRAMS gen_whitener.py snr_estimators.py DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR} - COMPONENT "digital_python" ) install( FILES burst_shaper.grc DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR} - COMPONENT "digital_python" ) # Narrowband @@ -51,7 +49,6 @@ GR_PYTHON_INSTALL(PROGRAMS narrowband/digital_bert_tx.py narrowband/tunnel.py DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR}/narrowband - COMPONENT "digital_python" ) # OFDM @@ -65,7 +62,6 @@ GR_PYTHON_INSTALL(PROGRAMS ofdm/tunnel.py ofdm/uhd_interface.py DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR}/ofdm - COMPONENT "digital_python" ) install( @@ -74,7 +70,6 @@ install( ofdm/rx_ofdm.grc ofdm/ofdm_loopback.grc DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR}/ofdm - COMPONENT "digital_python" ) # DEMOD @@ -93,7 +88,6 @@ install( demod/uhd_corr_and_sync_tx.grc demod/uhd_corr_and_sync_rx.grc DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR}/demod - COMPONENT "digital_python" ) @@ -124,5 +118,4 @@ install( packet/uhd_packet_tx.grc packet/uhd_packet_tx_tun.grc DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR}/packet - COMPONENT "digital_python" ) diff --git a/gr-digital/grc/CMakeLists.txt b/gr-digital/grc/CMakeLists.txt index 9888247ca2..a3d0223290 100644 --- a/gr-digital/grc/CMakeLists.txt +++ b/gr-digital/grc/CMakeLists.txt @@ -19,5 +19,5 @@ file(GLOB xml_files "*.xml") install(FILES ${xml_files} - DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "digital_python" + DESTINATION ${GRC_BLOCKS_DIR} ) diff --git a/gr-digital/include/gnuradio/digital/CMakeLists.txt b/gr-digital/include/gnuradio/digital/CMakeLists.txt index 1b22265853..4756d281f4 100644 --- a/gr-digital/include/gnuradio/digital/CMakeLists.txt +++ b/gr-digital/include/gnuradio/digital/CMakeLists.txt @@ -115,5 +115,4 @@ install(FILES simple_framer_sync.h header_payload_demux.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/digital - COMPONENT "digital_devel" ) diff --git a/gr-digital/lib/CMakeLists.txt b/gr-digital/lib/CMakeLists.txt index 84f53ec4f3..05160be9a5 100644 --- a/gr-digital/lib/CMakeLists.txt +++ b/gr-digital/lib/CMakeLists.txt @@ -156,7 +156,7 @@ list(APPEND digital_libs add_library(gnuradio-digital SHARED ${digital_sources}) target_link_libraries(gnuradio-digital ${digital_libs}) -GR_LIBRARY_FOO(gnuradio-digital RUNTIME_COMPONENT "digital_runtime" DEVEL_COMPONENT "digital_devel") +GR_LIBRARY_FOO(gnuradio-digital) add_dependencies( gnuradio-digital @@ -195,7 +195,7 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-digital_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "digital_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-digital/python/digital/CMakeLists.txt b/gr-digital/python/digital/CMakeLists.txt index 091bd883b3..8f88948a2e 100644 --- a/gr-digital/python/digital/CMakeLists.txt +++ b/gr-digital/python/digital/CMakeLists.txt @@ -51,7 +51,6 @@ GR_PYTHON_INSTALL( qpsk.py soft_dec_lut_gen.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/digital - COMPONENT "digital_python" ) GR_PYTHON_INSTALL( @@ -62,7 +61,6 @@ GR_PYTHON_INSTALL( utils/alignment.py utils/tagged_streams.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/digital/utils - COMPONENT "digital_python" ) ######################################################################## diff --git a/gr-digital/python/grc_gnuradio/CMakeLists.txt b/gr-digital/python/grc_gnuradio/CMakeLists.txt index f021299f1a..7284573775 100644 --- a/gr-digital/python/grc_gnuradio/CMakeLists.txt +++ b/gr-digital/python/grc_gnuradio/CMakeLists.txt @@ -26,5 +26,4 @@ include(GrPython) GR_PYTHON_INSTALL(FILES blks2/packet.py DESTINATION ${GR_PYTHON_DIR}/grc_gnuradio/blks2 - COMPONENT "digital_python" ) diff --git a/gr-digital/swig/CMakeLists.txt b/gr-digital/swig/CMakeLists.txt index 2f00dc14a3..0f1138ff30 100644 --- a/gr-digital/swig/CMakeLists.txt +++ b/gr-digital/swig/CMakeLists.txt @@ -55,7 +55,6 @@ GR_SWIG_MAKE(digital_swig digital_swig.i) GR_SWIG_INSTALL( TARGETS digital_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/digital - COMPONENT "digital_python" ) install( @@ -66,5 +65,4 @@ install( packet_header.i ${CMAKE_CURRENT_BINARY_DIR}/digital_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "digital_swig" ) diff --git a/gr-dtv/CMakeLists.txt b/gr-dtv/CMakeLists.txt index 5a23482b26..f045af5ef8 100644 --- a/gr-dtv/CMakeLists.txt +++ b/gr-dtv/CMakeLists.txt @@ -49,40 +49,6 @@ SET(GR_PKG_DTV_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/dtv) if(ENABLE_GR_DTV) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_DTV_DESCRIPTION "GNU Radio DTV Blocks") - -CPACK_COMPONENT("dtv_runtime" - GROUP "DTV" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("dtv_devel" - GROUP "DTV" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("dtv_python" - GROUP "DTV" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;dtv_runtime" -) - -CPACK_COMPONENT("dtv_swig" - GROUP "DTV" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;dtv_python;dtv_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/dtv) @@ -107,7 +73,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-dtv.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "dtv_devel" ) endif(ENABLE_GR_DTV) diff --git a/gr-dtv/apps/CMakeLists.txt b/gr-dtv/apps/CMakeLists.txt index f328234e3d..6de0ccec74 100644 --- a/gr-dtv/apps/CMakeLists.txt +++ b/gr-dtv/apps/CMakeLists.txt @@ -25,5 +25,4 @@ include(GrPython) GR_PYTHON_INSTALL( PROGRAMS DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "dtv_python" ) diff --git a/gr-dtv/examples/CMakeLists.txt b/gr-dtv/examples/CMakeLists.txt index 8f209bce4f..884d1daafa 100644 --- a/gr-dtv/examples/CMakeLists.txt +++ b/gr-dtv/examples/CMakeLists.txt @@ -23,7 +23,6 @@ GR_PYTHON_INSTALL( PROGRAMS atsc_ctrlport_monitor.py DESTINATION ${GR_PKG_DTV_EXAMPLES_DIR} - COMPONENT "dtv_python" ) install( @@ -47,5 +46,4 @@ install( vv018-miso.grc catv_tx_64qam.grc DESTINATION ${GR_PKG_DTV_EXAMPLES_DIR} - COMPONENT "dtv_python" ) diff --git a/gr-dtv/examples/README.atsc b/gr-dtv/examples/README.atsc new file mode 100644 index 0000000000..29f5abeccb --- /dev/null +++ b/gr-dtv/examples/README.atsc @@ -0,0 +1,7 @@ +A test Transport Stream (19.392658 Mbps) for the example transmit +flow graphs is available here: + +http://www.w6rz.net/advatsc.ts + +It is 256,952,572 bytes. + diff --git a/gr-dtv/examples/file_atsc_tx.grc b/gr-dtv/examples/file_atsc_tx.grc index f212ab35c6..3a7124127b 100644 --- a/gr-dtv/examples/file_atsc_tx.grc +++ b/gr-dtv/examples/file_atsc_tx.grc @@ -1,23 +1,23 @@ -<?xml version='1.0' encoding='ASCII'?> -<?grc format='1' created='3.7.7'?> +<?xml version='1.0' encoding='utf-8'?> +<?grc format='1' created='3.7.11'?> <flow_graph> - <timestamp>Sat Jan 17 12:37:25 2015</timestamp> + <timestamp>Sat Dec 20 12:18:33 2014</timestamp> <block> <key>options</key> <param> - <key>id</key> - <value>file_atsc_tx</value> + <key>author</key> + <value></value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>window_size</key> + <value>1280, 1024</value> </param> <param> - <key>title</key> - <value></value> + <key>category</key> + <value>Custom</value> </param> <param> - <key>author</key> + <key>comment</key> <value></value> </param> <param> @@ -25,16 +25,44 @@ <value></value> </param> <param> - <key>window_size</key> - <value>1280, 1024</value> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(368, 19)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> </param> <param> <key>generate_options</key> - <value>wx_gui</value> + <value>qt_gui</value> </param> <param> - <key>category</key> - <value>Custom</value> + <key>hier_block_src_path</key> + <value>.:</value> + </param> + <param> + <key>id</key> + <value>file_atsc_tx</value> + </param> + <param> + <key>max_nouts</key> + <value>0</value> + </param> + <param> + <key>qt_qss_theme</key> + <value></value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>run_command</key> + <value>{python} -u {filename}</value> </param> <param> <key>run_options</key> @@ -45,92 +73,107 @@ <value>True</value> </param> <param> - <key>max_nouts</key> - <value>0</value> + <key>thread_safe_setters</key> + <value></value> </param> <param> - <key>realtime_scheduling</key> + <key>title</key> <value></value> </param> + </block> + <block> + <key>variable</key> <param> - <key>alias</key> + <key>comment</key> <value></value> </param> <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> <key>_coordinate</key> - <value>(584, 19)</value> + <value>(808, 20)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> + <param> + <key>id</key> + <value>center_freq</value> + </param> + <param> + <key>value</key> + <value>429e6</value> + </param> </block> <block> <key>variable</key> <param> - <key>id</key> - <value>symbol_rate</value> + <key>comment</key> + <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>value</key> - <value>4500000.0 / 286 * 684</value> + <key>_coordinate</key> + <value>(680, 20)</value> </param> <param> - <key>alias</key> - <value></value> + <key>_rotation</key> + <value>0</value> </param> <param> - <key>_coordinate</key> - <value>(360, 19)</value> + <key>id</key> + <value>pilot_freq</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>value</key> + <value>(6000000.0 - (symbol_rate / 2)) / 2</value> </param> </block> <block> <key>variable</key> <param> - <key>id</key> - <value>pilot_freq</value> + <key>comment</key> + <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>value</key> - <value>309441</value> + <key>_coordinate</key> + <value>(552, 19)</value> </param> <param> - <key>alias</key> - <value></value> + <key>_rotation</key> + <value>0</value> </param> <param> - <key>_coordinate</key> - <value>(472, 19)</value> + <key>id</key> + <value>symbol_rate</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>value</key> + <value>4500000.0 / 286 * 684</value> </param> </block> <block> - <key>dtv_atsc_pad</key> + <key>blocks_file_sink</key> <param> - <key>id</key> - <value>dtv_atsc_pad_0</value> + <key>append</key> + <value>False</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>alias</key> + <value></value> </param> <param> - <key>alias</key> + <key>comment</key> <value></value> </param> <param> @@ -138,804 +181,1028 @@ <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>1</value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>file</key> + <value>atsc.cfile</value> </param> <param> <key>_coordinate</key> - <value>(96, 112)</value> + <value>(1048, 236)</value> </param> <param> <key>_rotation</key> - <value>180</value> + <value>0</value> </param> - </block> - <block> - <key>dtv_atsc_randomizer</key> <param> <key>id</key> - <value>dtv_atsc_randomizer_0</value> + <value>blocks_file_sink_0</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>type</key> + <value>complex</value> </param> <param> + <key>unbuffered</key> + <value>False</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>blocks_file_source</key> + <param> <key>alias</key> <value></value> </param> <param> + <key>comment</key> + <value></value> + </param> + <param> <key>affinity</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>True</value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>file</key> + <value>advatsc.ts</value> </param> <param> <key>_coordinate</key> - <value>(72, 168)</value> + <value>(64, 19)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> - </block> - <block> - <key>dtv_atsc_rs_encoder</key> <param> <key>id</key> - <value>dtv_atsc_rs_encoder_0</value> + <value>blocks_file_source_0</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>repeat</key> + <value>False</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>blocks_keep_m_in_n</key> + <param> <key>alias</key> <value></value> </param> <param> - <key>affinity</key> + <key>comment</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>affinity</key> + <value></value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>True</value> </param> <param> <key>_coordinate</key> - <value>(72, 224)</value> + <value>(104, 451)</value> </param> <param> <key>_rotation</key> - <value>180</value> + <value>0</value> </param> - </block> - <block> - <key>blocks_keep_m_in_n</key> <param> <key>id</key> <value>blocks_keep_m_in_n_0</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>m</key> + <value>832</value> </param> <param> - <key>type</key> - <value>byte</value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> - <key>m</key> - <value>832</value> + <key>minoutbuf</key> + <value>0</value> </param> <param> <key>n</key> <value>1024</value> </param> <param> + <key>type</key> + <value>byte</value> + </param> + <param> <key>offset</key> <value>4</value> </param> + </block> + <block> + <key>blocks_rotator_cc</key> <param> <key>alias</key> <value></value> </param> <param> + <key>comment</key> + <value></value> + </param> + <param> <key>affinity</key> <value></value> </param> <param> - <key>minoutbuf</key> + <key>_enabled</key> + <value>1</value> + </param> + <param> + <key>_coordinate</key> + <value>(336, 332)</value> + </param> + <param> + <key>_rotation</key> <value>0</value> </param> <param> + <key>id</key> + <value>blocks_rotator_cc_0</value> + </param> + <param> <key>maxoutbuf</key> <value>0</value> </param> <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>phase_inc</key> + <value>((-3000000.0 + pilot_freq) / symbol_rate) * (math.pi * 2)</value> + </param> + </block> + <block> + <key>blocks_throttle</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> <key>_coordinate</key> - <value>(80, 515)</value> + <value>(824, 332)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> - </block> - <block> - <key>digital_chunks_to_symbols_xx</key> <param> <key>id</key> - <value>digital_chunks_to_symbols_xx_0</value> + <value>blocks_throttle_0</value> </param> <param> - <key>_enabled</key> + <key>ignoretag</key> <value>True</value> </param> <param> - <key>in_type</key> - <value>byte</value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> - <key>out_type</key> - <value>complex</value> + <key>minoutbuf</key> + <value>0</value> </param> <param> - <key>symbol_table</key> - <value>[symbol + 1.25 for symbol in [-7,-5,-3,-1,1,3,5,7]]</value> + <key>samples_per_second</key> + <value>symbol_rate</value> </param> <param> - <key>dimension</key> - <value>1</value> + <key>type</key> + <value>complex</value> </param> <param> - <key>num_ports</key> + <key>vlen</key> <value>1</value> </param> + </block> + <block> + <key>blocks_vector_to_stream</key> <param> <key>alias</key> <value></value> </param> <param> - <key>affinity</key> + <key>comment</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>affinity</key> + <value></value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>True</value> </param> <param> <key>_coordinate</key> - <value>(360, 523)</value> + <value>(96, 387)</value> </param> <param> <key>_rotation</key> - <value>0</value> + <value>180</value> </param> - </block> - <block> - <key>blocks_multiply_xx</key> <param> <key>id</key> - <value>blocks_multiply_xx_0</value> + <value>blocks_vector_to_stream_1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>type</key> + <value>byte</value> </param> <param> - <key>type</key> - <value>complex</value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> - <key>num_inputs</key> - <value>2</value> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>num_items</key> + <value>1024</value> </param> <param> <key>vlen</key> <value>1</value> </param> + </block> + <block> + <key>dtv_atsc_field_sync_mux</key> <param> <key>alias</key> <value></value> </param> <param> - <key>affinity</key> + <key>comment</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>affinity</key> + <value></value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>True</value> </param> <param> <key>_coordinate</key> - <value>(376, 296)</value> + <value>(80, 337)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> + <param> + <key>id</key> + <value>dtv_atsc_field_sync_mux_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> </block> <block> - <key>analog_sig_source_x</key> + <key>dtv_atsc_interleaver</key> <param> - <key>id</key> - <value>analog_sig_source_x_0</value> + <key>alias</key> + <value></value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>comment</key> + <value></value> </param> <param> - <key>type</key> - <value>complex</value> + <key>affinity</key> + <value></value> </param> <param> - <key>samp_rate</key> - <value>symbol_rate</value> + <key>_enabled</key> + <value>True</value> </param> <param> - <key>waveform</key> - <value>analog.GR_COS_WAVE</value> + <key>_coordinate</key> + <value>(88, 241)</value> </param> <param> - <key>freq</key> - <value>-3000000+pilot_freq</value> + <key>_rotation</key> + <value>0</value> </param> <param> - <key>amp</key> - <value>0.9</value> + <key>id</key> + <value>dtv_atsc_interleaver_0</value> </param> <param> - <key>offset</key> + <key>maxoutbuf</key> <value>0</value> </param> <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>dtv_atsc_pad</key> + <param> <key>alias</key> <value></value> </param> <param> - <key>affinity</key> + <key>comment</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>affinity</key> + <value></value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>True</value> </param> <param> <key>_coordinate</key> - <value>(416, 131)</value> + <value>(112, 97)</value> </param> <param> <key>_rotation</key> <value>180</value> </param> + <param> + <key>id</key> + <value>dtv_atsc_pad_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> </block> <block> - <key>fft_filter_xxx</key> + <key>dtv_atsc_randomizer</key> <param> - <key>id</key> - <value>fft_filter_xxx_0</value> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>type</key> - <value>ccc</value> + <key>_coordinate</key> + <value>(88, 145)</value> </param> <param> - <key>decim</key> - <value>1</value> + <key>_rotation</key> + <value>0</value> </param> <param> - <key>taps</key> - <value>firdes.root_raised_cosine(0.1, symbol_rate, symbol_rate/2, 0.1152, 100)</value> + <key>id</key> + <value>dtv_atsc_randomizer_0</value> </param> <param> - <key>samp_delay</key> + <key>maxoutbuf</key> <value>0</value> </param> <param> - <key>nthreads</key> - <value>1</value> + <key>minoutbuf</key> + <value>0</value> </param> + </block> + <block> + <key>dtv_atsc_rs_encoder</key> <param> <key>alias</key> <value></value> </param> <param> - <key>affinity</key> + <key>comment</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>affinity</key> + <value></value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>True</value> </param> <param> <key>_coordinate</key> - <value>(576, 291)</value> + <value>(88, 193)</value> </param> <param> <key>_rotation</key> + <value>180</value> + </param> + <param> + <key>id</key> + <value>dtv_atsc_rs_encoder_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> <value>0</value> </param> </block> <block> - <key>wxgui_fftsink2</key> + <key>dtv_atsc_trellis_encoder</key> <param> - <key>id</key> - <value>wxgui_fftsink2_0</value> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> </param> <param> <key>_enabled</key> <value>True</value> </param> <param> - <key>type</key> - <value>complex</value> + <key>_coordinate</key> + <value>(80, 289)</value> </param> <param> - <key>title</key> - <value>FFT Plot</value> + <key>_rotation</key> + <value>180</value> </param> <param> - <key>samp_rate</key> - <value>symbol_rate</value> + <key>id</key> + <value>dtv_atsc_trellis_encoder_0</value> </param> <param> - <key>baseband_freq</key> - <value>429000000</value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> - <key>y_per_div</key> - <value>10</value> + <key>minoutbuf</key> + <value>0</value> </param> + </block> + <block> + <key>dtv_dvbs2_modulator_bc</key> <param> - <key>y_divs</key> - <value>10</value> + <key>interpolation</key> + <value>INTERPOLATION_OFF</value> </param> <param> - <key>ref_level</key> - <value>-10</value> + <key>alias</key> + <value></value> </param> <param> - <key>ref_scale</key> - <value>2.0</value> + <key>rate1</key> + <value>C1_4</value> </param> <param> - <key>fft_size</key> - <value>1024</value> + <key>rate2</key> + <value>C1_5_MEDIUM</value> </param> <param> - <key>fft_rate</key> - <value>15</value> + <key>rate3</key> + <value>C1_4</value> </param> <param> - <key>peak_hold</key> - <value>False</value> + <key>comment</key> + <value></value> </param> <param> - <key>average</key> + <key>constellation</key> + <value>MOD_8VSB</value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> <value>True</value> </param> <param> - <key>avg_alpha</key> - <value>0.1333</value> + <key>framesize</key> + <value>FECFRAME_NORMAL</value> </param> <param> - <key>win</key> - <value>None</value> + <key>_coordinate</key> + <value>(80, 556)</value> </param> <param> - <key>win_size</key> - <value>800,600</value> + <key>_rotation</key> + <value>0</value> </param> <param> - <key>grid_pos</key> - <value></value> + <key>id</key> + <value>dtv_dvbs2_modulator_bc_0</value> </param> <param> - <key>notebook</key> - <value></value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> - <key>freqvar</key> - <value>None</value> + <key>minoutbuf</key> + <value>0</value> </param> + </block> + <block> + <key>fft_filter_xxx</key> <param> <key>alias</key> <value></value> </param> <param> + <key>comment</key> + <value></value> + </param> + <param> <key>affinity</key> <value></value> </param> <param> + <key>decim</key> + <value>1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> <key>_coordinate</key> - <value>(1048, 331)</value> + <value>(576, 316)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> - </block> - <block> - <key>dtv_atsc_interleaver</key> <param> <key>id</key> - <value>dtv_atsc_interleaver_0</value> + <value>fft_filter_xxx_0</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>maxoutbuf</key> + <value>0</value> </param> <param> - <key>alias</key> - <value></value> + <key>minoutbuf</key> + <value>0</value> </param> <param> - <key>affinity</key> - <value></value> + <key>nthreads</key> + <value>1</value> </param> <param> - <key>minoutbuf</key> + <key>samp_delay</key> <value>0</value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>taps</key> + <value>firdes.root_raised_cosine(0.11, symbol_rate, symbol_rate/2, 0.1152, 200)</value> + </param> + <param> + <key>type</key> + <value>ccc</value> + </param> + </block> + <block> + <key>import</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> </param> <param> <key>_coordinate</key> - <value>(72, 280)</value> + <value>(368, 91)</value> </param> <param> <key>_rotation</key> <value>0</value> </param> + <param> + <key>id</key> + <value>import_0</value> + </param> + <param> + <key>import</key> + <value>import math</value> + </param> </block> <block> - <key>blocks_throttle</key> + <key>qtgui_freq_sink_x</key> <param> - <key>id</key> - <value>blocks_throttle_0</value> + <key>autoscale</key> + <value>False</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>average</key> + <value>0.1</value> </param> <param> - <key>type</key> - <value>complex</value> + <key>axislabels</key> + <value>True</value> </param> <param> - <key>samples_per_second</key> + <key>bw</key> <value>symbol_rate</value> </param> <param> - <key>vlen</key> - <value>1</value> + <key>alias</key> + <value></value> </param> <param> - <key>ignoretag</key> - <value>True</value> + <key>fc</key> + <value>center_freq</value> </param> <param> - <key>alias</key> + <key>comment</key> <value></value> </param> <param> + <key>ctrlpanel</key> + <value>False</value> + </param> + <param> <key>affinity</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>_enabled</key> + <value>True</value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>fftsize</key> + <value>1024</value> </param> <param> <key>_coordinate</key> - <value>(808, 307)</value> + <value>(1048, 396)</value> + </param> + <param> + <key>gui_hint</key> + <value></value> </param> <param> <key>_rotation</key> <value>0</value> </param> - </block> - <block> - <key>blocks_file_sink</key> + <param> + <key>grid</key> + <value>False</value> + </param> <param> <key>id</key> - <value>blocks_file_sink_0</value> + <value>qtgui_freq_sink_x_0</value> </param> <param> - <key>_enabled</key> + <key>legend</key> <value>True</value> </param> <param> - <key>file</key> - <value>atsc.cfile</value> + <key>alpha1</key> + <value>1.0</value> </param> <param> - <key>type</key> - <value>complex</value> + <key>color1</key> + <value>"blue"</value> </param> <param> - <key>vlen</key> + <key>label1</key> + <value></value> + </param> + <param> + <key>width1</key> <value>1</value> </param> <param> - <key>unbuffered</key> - <value>False</value> + <key>alpha10</key> + <value>1.0</value> </param> <param> - <key>append</key> - <value>False</value> + <key>color10</key> + <value>"dark blue"</value> </param> <param> - <key>alias</key> + <key>label10</key> <value></value> </param> <param> - <key>affinity</key> - <value></value> + <key>width10</key> + <value>1</value> </param> <param> - <key>_coordinate</key> - <value>(1048, 171)</value> + <key>alpha2</key> + <value>1.0</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>color2</key> + <value>"red"</value> </param> - </block> - <block> - <key>dtv_atsc_trellis_encoder</key> <param> - <key>id</key> - <value>dtv_atsc_trellis_encoder_0</value> + <key>label2</key> + <value></value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>width2</key> + <value>1</value> </param> <param> - <key>alias</key> - <value></value> + <key>alpha3</key> + <value>1.0</value> </param> <param> - <key>affinity</key> + <key>color3</key> + <value>"green"</value> + </param> + <param> + <key>label3</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>width3</key> + <value>1</value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>alpha4</key> + <value>1.0</value> </param> <param> - <key>_coordinate</key> - <value>(64, 336)</value> + <key>color4</key> + <value>"black"</value> </param> <param> - <key>_rotation</key> - <value>180</value> + <key>label4</key> + <value></value> </param> - </block> - <block> - <key>blocks_vector_to_stream</key> <param> - <key>id</key> - <value>blocks_vector_to_stream_1</value> + <key>width4</key> + <value>1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>alpha5</key> + <value>1.0</value> </param> <param> - <key>type</key> - <value>byte</value> + <key>color5</key> + <value>"cyan"</value> </param> <param> - <key>num_items</key> - <value>1024</value> + <key>label5</key> + <value></value> </param> <param> - <key>vlen</key> + <key>width5</key> <value>1</value> </param> <param> - <key>alias</key> - <value></value> + <key>alpha6</key> + <value>1.0</value> </param> <param> - <key>affinity</key> + <key>color6</key> + <value>"magenta"</value> + </param> + <param> + <key>label6</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>width6</key> + <value>1</value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>alpha7</key> + <value>1.0</value> </param> <param> - <key>_coordinate</key> - <value>(72, 451)</value> + <key>color7</key> + <value>"yellow"</value> </param> <param> - <key>_rotation</key> - <value>180</value> + <key>label7</key> + <value></value> </param> - </block> - <block> - <key>dtv_atsc_field_sync_mux</key> <param> - <key>id</key> - <value>dtv_atsc_field_sync_mux_0</value> + <key>width7</key> + <value>1</value> </param> <param> - <key>_enabled</key> - <value>True</value> + <key>alpha8</key> + <value>1.0</value> </param> <param> - <key>alias</key> + <key>color8</key> + <value>"dark red"</value> + </param> + <param> + <key>label8</key> <value></value> </param> <param> - <key>affinity</key> + <key>width8</key> + <value>1</value> + </param> + <param> + <key>alpha9</key> + <value>1.0</value> + </param> + <param> + <key>color9</key> + <value>"dark green"</value> + </param> + <param> + <key>label9</key> <value></value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>width9</key> + <value>1</value> </param> <param> <key>maxoutbuf</key> <value>0</value> </param> <param> - <key>_coordinate</key> - <value>(64, 392)</value> + <key>minoutbuf</key> + <value>0</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>name</key> + <value>""</value> </param> - </block> - <block> - <key>blocks_file_source</key> <param> - <key>id</key> - <value>blocks_file_source_0</value> + <key>nconnections</key> + <value>1</value> </param> <param> - <key>_enabled</key> + <key>showports</key> <value>True</value> </param> <param> - <key>file</key> - <value>test.ts</value> + <key>freqhalf</key> + <value>True</value> </param> <param> - <key>type</key> - <value>byte</value> + <key>tr_chan</key> + <value>0</value> </param> <param> - <key>repeat</key> - <value>False</value> + <key>tr_level</key> + <value>0.0</value> </param> <param> - <key>vlen</key> - <value>1</value> + <key>tr_mode</key> + <value>qtgui.TRIG_MODE_FREE</value> </param> <param> - <key>alias</key> - <value></value> + <key>tr_tag</key> + <value>""</value> </param> <param> - <key>affinity</key> - <value></value> + <key>type</key> + <value>complex</value> </param> <param> - <key>minoutbuf</key> - <value>0</value> + <key>update_time</key> + <value>0.10</value> </param> <param> - <key>maxoutbuf</key> - <value>0</value> + <key>wintype</key> + <value>firdes.WIN_BLACKMAN_hARRIS</value> </param> <param> - <key>_coordinate</key> - <value>(48, 19)</value> + <key>label</key> + <value>Relative Gain</value> </param> <param> - <key>_rotation</key> - <value>0</value> + <key>ymax</key> + <value>10</value> + </param> + <param> + <key>ymin</key> + <value>-140</value> + </param> + <param> + <key>units</key> + <value>dB</value> </param> </block> <connection> - <source_block_id>blocks_vector_to_stream_1</source_block_id> - <sink_block_id>blocks_keep_m_in_n_0</sink_block_id> + <source_block_id>blocks_file_source_0</source_block_id> + <sink_block_id>dtv_atsc_pad_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> <source_block_id>blocks_keep_m_in_n_0</source_block_id> - <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id> + <sink_block_id>dtv_dvbs2_modulator_bc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>blocks_multiply_xx_0</source_block_id> + <source_block_id>blocks_rotator_cc_0</source_block_id> <sink_block_id>fft_filter_xxx_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>analog_sig_source_x_0</source_block_id> - <sink_block_id>blocks_multiply_xx_0</sink_block_id> + <source_block_id>blocks_throttle_0</source_block_id> + <sink_block_id>blocks_file_sink_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id> - <sink_block_id>blocks_multiply_xx_0</sink_block_id> + <source_block_id>blocks_throttle_0</source_block_id> + <sink_block_id>qtgui_freq_sink_x_0</sink_block_id> <source_key>0</source_key> - <sink_key>1</sink_key> + <sink_key>0</sink_key> </connection> <connection> - <source_block_id>fft_filter_xxx_0</source_block_id> - <sink_block_id>blocks_throttle_0</sink_block_id> + <source_block_id>blocks_vector_to_stream_1</source_block_id> + <sink_block_id>blocks_keep_m_in_n_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>blocks_throttle_0</source_block_id> - <sink_block_id>wxgui_fftsink2_0</sink_block_id> + <source_block_id>dtv_atsc_field_sync_mux_0</source_block_id> + <sink_block_id>blocks_vector_to_stream_1</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>blocks_file_source_0</source_block_id> - <sink_block_id>dtv_atsc_pad_0</sink_block_id> + <source_block_id>dtv_atsc_interleaver_0</source_block_id> + <sink_block_id>dtv_atsc_trellis_encoder_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> @@ -958,26 +1225,20 @@ <sink_key>0</sink_key> </connection> <connection> - <source_block_id>dtv_atsc_interleaver_0</source_block_id> - <sink_block_id>dtv_atsc_trellis_encoder_0</sink_block_id> - <source_key>0</source_key> - <sink_key>0</sink_key> - </connection> - <connection> - <source_block_id>blocks_throttle_0</source_block_id> - <sink_block_id>blocks_file_sink_0</sink_block_id> + <source_block_id>dtv_atsc_trellis_encoder_0</source_block_id> + <sink_block_id>dtv_atsc_field_sync_mux_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>dtv_atsc_trellis_encoder_0</source_block_id> - <sink_block_id>dtv_atsc_field_sync_mux_0</sink_block_id> + <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id> + <sink_block_id>blocks_rotator_cc_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> <connection> - <source_block_id>dtv_atsc_field_sync_mux_0</source_block_id> - <sink_block_id>blocks_vector_to_stream_1</sink_block_id> + <source_block_id>fft_filter_xxx_0</source_block_id> + <sink_block_id>blocks_throttle_0</sink_block_id> <source_key>0</source_key> <sink_key>0</sink_key> </connection> diff --git a/gr-dtv/examples/uhd_atsc_tx.grc b/gr-dtv/examples/uhd_atsc_tx.grc new file mode 100644 index 0000000000..24b451e474 --- /dev/null +++ b/gr-dtv/examples/uhd_atsc_tx.grc @@ -0,0 +1,3166 @@ +<?xml version='1.0' encoding='utf-8'?> +<?grc format='1' created='3.7.11'?> +<flow_graph> + <timestamp>Sat Dec 20 12:18:33 2014</timestamp> + <block> + <key>options</key> + <param> + <key>author</key> + <value></value> + </param> + <param> + <key>window_size</key> + <value>1280, 1024</value> + </param> + <param> + <key>category</key> + <value>Custom</value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>description</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(368, 19)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>generate_options</key> + <value>qt_gui</value> + </param> + <param> + <key>hier_block_src_path</key> + <value>.:</value> + </param> + <param> + <key>id</key> + <value>uhd_atsc_tx</value> + </param> + <param> + <key>max_nouts</key> + <value>0</value> + </param> + <param> + <key>qt_qss_theme</key> + <value></value> + </param> + <param> + <key>realtime_scheduling</key> + <value></value> + </param> + <param> + <key>run_command</key> + <value>{python} -u {filename}</value> + </param> + <param> + <key>run_options</key> + <value>prompt</value> + </param> + <param> + <key>run</key> + <value>True</value> + </param> + <param> + <key>thread_safe_setters</key> + <value></value> + </param> + <param> + <key>title</key> + <value></value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(808, 20)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>center_freq</value> + </param> + <param> + <key>value</key> + <value>429e6</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(680, 20)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>pilot_freq</value> + </param> + <param> + <key>value</key> + <value>(6000000.0 - (symbol_rate / 2)) / 2</value> + </param> + </block> + <block> + <key>variable</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(552, 19)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>symbol_rate</value> + </param> + <param> + <key>value</key> + <value>4500000.0 / 286 * 684</value> + </param> + </block> + <block> + <key>variable_qtgui_range</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>value</key> + <value>50</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(808, 88)</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>tx_gain</value> + </param> + <param> + <key>label</key> + <value></value> + </param> + <param> + <key>min_len</key> + <value>200</value> + </param> + <param> + <key>orient</key> + <value>Qt.Horizontal</value> + </param> + <param> + <key>start</key> + <value>0</value> + </param> + <param> + <key>step</key> + <value>1</value> + </param> + <param> + <key>stop</key> + <value>89</value> + </param> + <param> + <key>rangeType</key> + <value>float</value> + </param> + <param> + <key>widget</key> + <value>counter_slider</value> + </param> + </block> + <block> + <key>variable_qtgui_range</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>value</key> + <value>-8</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(552, 88)</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>vga1_gain</value> + </param> + <param> + <key>label</key> + <value></value> + </param> + <param> + <key>min_len</key> + <value>200</value> + </param> + <param> + <key>orient</key> + <value>Qt.Horizontal</value> + </param> + <param> + <key>start</key> + <value>-35</value> + </param> + <param> + <key>step</key> + <value>1</value> + </param> + <param> + <key>stop</key> + <value>-4</value> + </param> + <param> + <key>rangeType</key> + <value>int</value> + </param> + <param> + <key>widget</key> + <value>counter_slider</value> + </param> + </block> + <block> + <key>variable_qtgui_range</key> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>value</key> + <value>10</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(680, 88)</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>vga2_gain</value> + </param> + <param> + <key>label</key> + <value></value> + </param> + <param> + <key>min_len</key> + <value>200</value> + </param> + <param> + <key>orient</key> + <value>Qt.Horizontal</value> + </param> + <param> + <key>start</key> + <value>0</value> + </param> + <param> + <key>step</key> + <value>1</value> + </param> + <param> + <key>stop</key> + <value>25</value> + </param> + <param> + <key>rangeType</key> + <value>int</value> + </param> + <param> + <key>widget</key> + <value>counter_slider</value> + </param> + </block> + <block> + <key>blocks_file_source</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>file</key> + <value>advatsc.ts</value> + </param> + <param> + <key>_coordinate</key> + <value>(64, 19)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>blocks_file_source_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>repeat</key> + <value>True</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>blocks_keep_m_in_n</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(104, 451)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>blocks_keep_m_in_n_0</value> + </param> + <param> + <key>m</key> + <value>832</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>n</key> + <value>1024</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>offset</key> + <value>4</value> + </param> + </block> + <block> + <key>blocks_rotator_cc</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>1</value> + </param> + <param> + <key>_coordinate</key> + <value>(336, 332)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>blocks_rotator_cc_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>phase_inc</key> + <value>((-3000000.0 + pilot_freq) / symbol_rate) * (math.pi * 2)</value> + </param> + </block> + <block> + <key>blocks_vector_to_stream</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(96, 387)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + <param> + <key>id</key> + <value>blocks_vector_to_stream_1</value> + </param> + <param> + <key>type</key> + <value>byte</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>num_items</key> + <value>1024</value> + </param> + <param> + <key>vlen</key> + <value>1</value> + </param> + </block> + <block> + <key>dtv_atsc_field_sync_mux</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(80, 337)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>dtv_atsc_field_sync_mux_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>dtv_atsc_interleaver</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(88, 241)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>dtv_atsc_interleaver_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>dtv_atsc_pad</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(112, 97)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + <param> + <key>id</key> + <value>dtv_atsc_pad_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>dtv_atsc_randomizer</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(88, 145)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>dtv_atsc_randomizer_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>dtv_atsc_rs_encoder</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(88, 193)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + <param> + <key>id</key> + <value>dtv_atsc_rs_encoder_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>dtv_atsc_trellis_encoder</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(80, 289)</value> + </param> + <param> + <key>_rotation</key> + <value>180</value> + </param> + <param> + <key>id</key> + <value>dtv_atsc_trellis_encoder_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>dtv_dvbs2_modulator_bc</key> + <param> + <key>interpolation</key> + <value>INTERPOLATION_OFF</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>rate1</key> + <value>C1_4</value> + </param> + <param> + <key>rate2</key> + <value>C1_5_MEDIUM</value> + </param> + <param> + <key>rate3</key> + <value>C1_4</value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>constellation</key> + <value>MOD_8VSB</value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>framesize</key> + <value>FECFRAME_NORMAL</value> + </param> + <param> + <key>_coordinate</key> + <value>(80, 556)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>dtv_dvbs2_modulator_bc_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + </block> + <block> + <key>fft_filter_xxx</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>decim</key> + <value>1</value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(576, 316)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>fft_filter_xxx_0</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>nthreads</key> + <value>1</value> + </param> + <param> + <key>samp_delay</key> + <value>0</value> + </param> + <param> + <key>taps</key> + <value>firdes.root_raised_cosine(0.11, symbol_rate, symbol_rate/2, 0.1152, 200)</value> + </param> + <param> + <key>type</key> + <value>ccc</value> + </param> + </block> + <block> + <key>import</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>_coordinate</key> + <value>(368, 91)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>import_0</value> + </param> + <param> + <key>import</key> + <value>import math</value> + </param> + </block> + <block> + <key>osmosdr_sink</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>ant0</key> + <value></value> + </param> + <param> + <key>bb_gain0</key> + <value>vga1_gain</value> + </param> + <param> + <key>bw0</key> + <value>6000000</value> + </param> + <param> + <key>corr0</key> + <value>0</value> + </param> + <param> + <key>freq0</key> + <value>center_freq</value> + </param> + <param> + <key>if_gain0</key> + <value>0</value> + </param> + <param> + <key>gain0</key> + <value>vga2_gain</value> + </param> + <param> + <key>ant10</key> + <value></value> + </param> + <param> + <key>bb_gain10</key> + <value>20</value> + </param> + <param> + <key>bw10</key> + <value>0</value> + </param> + <param> + <key>corr10</key> + <value>0</value> + </param> + <param> + <key>freq10</key> + <value>100e6</value> + </param> + <param> + <key>if_gain10</key> + <value>20</value> + </param> + <param> + <key>gain10</key> + <value>10</value> + </param> + <param> + <key>ant11</key> + <value></value> + </param> + <param> + <key>bb_gain11</key> + <value>20</value> + </param> + <param> + <key>bw11</key> + <value>0</value> + </param> + <param> + <key>corr11</key> + <value>0</value> + </param> + <param> + <key>freq11</key> + <value>100e6</value> + </param> + <param> + <key>if_gain11</key> + <value>20</value> + </param> + <param> + <key>gain11</key> + <value>10</value> + </param> + <param> + <key>ant12</key> + <value></value> + </param> + <param> + <key>bb_gain12</key> + <value>20</value> + </param> + <param> + <key>bw12</key> + <value>0</value> + </param> + <param> + <key>corr12</key> + <value>0</value> + </param> + <param> + <key>freq12</key> + <value>100e6</value> + </param> + <param> + <key>if_gain12</key> + <value>20</value> + </param> + <param> + <key>gain12</key> + <value>10</value> + </param> + <param> + <key>ant13</key> + <value></value> + </param> + <param> + <key>bb_gain13</key> + <value>20</value> + </param> + <param> + <key>bw13</key> + <value>0</value> + </param> + <param> + <key>corr13</key> + <value>0</value> + </param> + <param> + <key>freq13</key> + <value>100e6</value> + </param> + <param> + <key>if_gain13</key> + <value>20</value> + </param> + <param> + <key>gain13</key> + <value>10</value> + </param> + <param> + <key>ant14</key> + <value></value> + </param> + <param> + <key>bb_gain14</key> + <value>20</value> + </param> + <param> + <key>bw14</key> + <value>0</value> + </param> + <param> + <key>corr14</key> + <value>0</value> + </param> + <param> + <key>freq14</key> + <value>100e6</value> + </param> + <param> + <key>if_gain14</key> + <value>20</value> + </param> + <param> + <key>gain14</key> + <value>10</value> + </param> + <param> + <key>ant15</key> + <value></value> + </param> + <param> + <key>bb_gain15</key> + <value>20</value> + </param> + <param> + <key>bw15</key> + <value>0</value> + </param> + <param> + <key>corr15</key> + <value>0</value> + </param> + <param> + <key>freq15</key> + <value>100e6</value> + </param> + <param> + <key>if_gain15</key> + <value>20</value> + </param> + <param> + <key>gain15</key> + <value>10</value> + </param> + <param> + <key>ant16</key> + <value></value> + </param> + <param> + <key>bb_gain16</key> + <value>20</value> + </param> + <param> + <key>bw16</key> + <value>0</value> + </param> + <param> + <key>corr16</key> + <value>0</value> + </param> + <param> + <key>freq16</key> + <value>100e6</value> + </param> + <param> + <key>if_gain16</key> + <value>20</value> + </param> + <param> + <key>gain16</key> + <value>10</value> + </param> + <param> + <key>ant17</key> + <value></value> + </param> + <param> + <key>bb_gain17</key> + <value>20</value> + </param> + <param> + <key>bw17</key> + <value>0</value> + </param> + <param> + <key>corr17</key> + <value>0</value> + </param> + <param> + <key>freq17</key> + <value>100e6</value> + </param> + <param> + <key>if_gain17</key> + <value>20</value> + </param> + <param> + <key>gain17</key> + <value>10</value> + </param> + <param> + <key>ant18</key> + <value></value> + </param> + <param> + <key>bb_gain18</key> + <value>20</value> + </param> + <param> + <key>bw18</key> + <value>0</value> + </param> + <param> + <key>corr18</key> + <value>0</value> + </param> + <param> + <key>freq18</key> + <value>100e6</value> + </param> + <param> + <key>if_gain18</key> + <value>20</value> + </param> + <param> + <key>gain18</key> + <value>10</value> + </param> + <param> + <key>ant19</key> + <value></value> + </param> + <param> + <key>bb_gain19</key> + <value>20</value> + </param> + <param> + <key>bw19</key> + <value>0</value> + </param> + <param> + <key>corr19</key> + <value>0</value> + </param> + <param> + <key>freq19</key> + <value>100e6</value> + </param> + <param> + <key>if_gain19</key> + <value>20</value> + </param> + <param> + <key>gain19</key> + <value>10</value> + </param> + <param> + <key>ant1</key> + <value></value> + </param> + <param> + <key>bb_gain1</key> + <value>20</value> + </param> + <param> + <key>bw1</key> + <value>0</value> + </param> + <param> + <key>corr1</key> + <value>0</value> + </param> + <param> + <key>freq1</key> + <value>100e6</value> + </param> + <param> + <key>if_gain1</key> + <value>20</value> + </param> + <param> + <key>gain1</key> + <value>10</value> + </param> + <param> + <key>ant20</key> + <value></value> + </param> + <param> + <key>bb_gain20</key> + <value>20</value> + </param> + <param> + <key>bw20</key> + <value>0</value> + </param> + <param> + <key>corr20</key> + <value>0</value> + </param> + <param> + <key>freq20</key> + <value>100e6</value> + </param> + <param> + <key>if_gain20</key> + <value>20</value> + </param> + <param> + <key>gain20</key> + <value>10</value> + </param> + <param> + <key>ant21</key> + <value></value> + </param> + <param> + <key>bb_gain21</key> + <value>20</value> + </param> + <param> + <key>bw21</key> + <value>0</value> + </param> + <param> + <key>corr21</key> + <value>0</value> + </param> + <param> + <key>freq21</key> + <value>100e6</value> + </param> + <param> + <key>if_gain21</key> + <value>20</value> + </param> + <param> + <key>gain21</key> + <value>10</value> + </param> + <param> + <key>ant22</key> + <value></value> + </param> + <param> + <key>bb_gain22</key> + <value>20</value> + </param> + <param> + <key>bw22</key> + <value>0</value> + </param> + <param> + <key>corr22</key> + <value>0</value> + </param> + <param> + <key>freq22</key> + <value>100e6</value> + </param> + <param> + <key>if_gain22</key> + <value>20</value> + </param> + <param> + <key>gain22</key> + <value>10</value> + </param> + <param> + <key>ant23</key> + <value></value> + </param> + <param> + <key>bb_gain23</key> + <value>20</value> + </param> + <param> + <key>bw23</key> + <value>0</value> + </param> + <param> + <key>corr23</key> + <value>0</value> + </param> + <param> + <key>freq23</key> + <value>100e6</value> + </param> + <param> + <key>if_gain23</key> + <value>20</value> + </param> + <param> + <key>gain23</key> + <value>10</value> + </param> + <param> + <key>ant24</key> + <value></value> + </param> + <param> + <key>bb_gain24</key> + <value>20</value> + </param> + <param> + <key>bw24</key> + <value>0</value> + </param> + <param> + <key>corr24</key> + <value>0</value> + </param> + <param> + <key>freq24</key> + <value>100e6</value> + </param> + <param> + <key>if_gain24</key> + <value>20</value> + </param> + <param> + <key>gain24</key> + <value>10</value> + </param> + <param> + <key>ant25</key> + <value></value> + </param> + <param> + <key>bb_gain25</key> + <value>20</value> + </param> + <param> + <key>bw25</key> + <value>0</value> + </param> + <param> + <key>corr25</key> + <value>0</value> + </param> + <param> + <key>freq25</key> + <value>100e6</value> + </param> + <param> + <key>if_gain25</key> + <value>20</value> + </param> + <param> + <key>gain25</key> + <value>10</value> + </param> + <param> + <key>ant26</key> + <value></value> + </param> + <param> + <key>bb_gain26</key> + <value>20</value> + </param> + <param> + <key>bw26</key> + <value>0</value> + </param> + <param> + <key>corr26</key> + <value>0</value> + </param> + <param> + <key>freq26</key> + <value>100e6</value> + </param> + <param> + <key>if_gain26</key> + <value>20</value> + </param> + <param> + <key>gain26</key> + <value>10</value> + </param> + <param> + <key>ant27</key> + <value></value> + </param> + <param> + <key>bb_gain27</key> + <value>20</value> + </param> + <param> + <key>bw27</key> + <value>0</value> + </param> + <param> + <key>corr27</key> + <value>0</value> + </param> + <param> + <key>freq27</key> + <value>100e6</value> + </param> + <param> + <key>if_gain27</key> + <value>20</value> + </param> + <param> + <key>gain27</key> + <value>10</value> + </param> + <param> + <key>ant28</key> + <value></value> + </param> + <param> + <key>bb_gain28</key> + <value>20</value> + </param> + <param> + <key>bw28</key> + <value>0</value> + </param> + <param> + <key>corr28</key> + <value>0</value> + </param> + <param> + <key>freq28</key> + <value>100e6</value> + </param> + <param> + <key>if_gain28</key> + <value>20</value> + </param> + <param> + <key>gain28</key> + <value>10</value> + </param> + <param> + <key>ant29</key> + <value></value> + </param> + <param> + <key>bb_gain29</key> + <value>20</value> + </param> + <param> + <key>bw29</key> + <value>0</value> + </param> + <param> + <key>corr29</key> + <value>0</value> + </param> + <param> + <key>freq29</key> + <value>100e6</value> + </param> + <param> + <key>if_gain29</key> + <value>20</value> + </param> + <param> + <key>gain29</key> + <value>10</value> + </param> + <param> + <key>ant2</key> + <value></value> + </param> + <param> + <key>bb_gain2</key> + <value>20</value> + </param> + <param> + <key>bw2</key> + <value>0</value> + </param> + <param> + <key>corr2</key> + <value>0</value> + </param> + <param> + <key>freq2</key> + <value>100e6</value> + </param> + <param> + <key>if_gain2</key> + <value>20</value> + </param> + <param> + <key>gain2</key> + <value>10</value> + </param> + <param> + <key>ant30</key> + <value></value> + </param> + <param> + <key>bb_gain30</key> + <value>20</value> + </param> + <param> + <key>bw30</key> + <value>0</value> + </param> + <param> + <key>corr30</key> + <value>0</value> + </param> + <param> + <key>freq30</key> + <value>100e6</value> + </param> + <param> + <key>if_gain30</key> + <value>20</value> + </param> + <param> + <key>gain30</key> + <value>10</value> + </param> + <param> + <key>ant31</key> + <value></value> + </param> + <param> + <key>bb_gain31</key> + <value>20</value> + </param> + <param> + <key>bw31</key> + <value>0</value> + </param> + <param> + <key>corr31</key> + <value>0</value> + </param> + <param> + <key>freq31</key> + <value>100e6</value> + </param> + <param> + <key>if_gain31</key> + <value>20</value> + </param> + <param> + <key>gain31</key> + <value>10</value> + </param> + <param> + <key>ant3</key> + <value></value> + </param> + <param> + <key>bb_gain3</key> + <value>20</value> + </param> + <param> + <key>bw3</key> + <value>0</value> + </param> + <param> + <key>corr3</key> + <value>0</value> + </param> + <param> + <key>freq3</key> + <value>100e6</value> + </param> + <param> + <key>if_gain3</key> + <value>20</value> + </param> + <param> + <key>gain3</key> + <value>10</value> + </param> + <param> + <key>ant4</key> + <value></value> + </param> + <param> + <key>bb_gain4</key> + <value>20</value> + </param> + <param> + <key>bw4</key> + <value>0</value> + </param> + <param> + <key>corr4</key> + <value>0</value> + </param> + <param> + <key>freq4</key> + <value>100e6</value> + </param> + <param> + <key>if_gain4</key> + <value>20</value> + </param> + <param> + <key>gain4</key> + <value>10</value> + </param> + <param> + <key>ant5</key> + <value></value> + </param> + <param> + <key>bb_gain5</key> + <value>20</value> + </param> + <param> + <key>bw5</key> + <value>0</value> + </param> + <param> + <key>corr5</key> + <value>0</value> + </param> + <param> + <key>freq5</key> + <value>100e6</value> + </param> + <param> + <key>if_gain5</key> + <value>20</value> + </param> + <param> + <key>gain5</key> + <value>10</value> + </param> + <param> + <key>ant6</key> + <value></value> + </param> + <param> + <key>bb_gain6</key> + <value>20</value> + </param> + <param> + <key>bw6</key> + <value>0</value> + </param> + <param> + <key>corr6</key> + <value>0</value> + </param> + <param> + <key>freq6</key> + <value>100e6</value> + </param> + <param> + <key>if_gain6</key> + <value>20</value> + </param> + <param> + <key>gain6</key> + <value>10</value> + </param> + <param> + <key>ant7</key> + <value></value> + </param> + <param> + <key>bb_gain7</key> + <value>20</value> + </param> + <param> + <key>bw7</key> + <value>0</value> + </param> + <param> + <key>corr7</key> + <value>0</value> + </param> + <param> + <key>freq7</key> + <value>100e6</value> + </param> + <param> + <key>if_gain7</key> + <value>20</value> + </param> + <param> + <key>gain7</key> + <value>10</value> + </param> + <param> + <key>ant8</key> + <value></value> + </param> + <param> + <key>bb_gain8</key> + <value>20</value> + </param> + <param> + <key>bw8</key> + <value>0</value> + </param> + <param> + <key>corr8</key> + <value>0</value> + </param> + <param> + <key>freq8</key> + <value>100e6</value> + </param> + <param> + <key>if_gain8</key> + <value>20</value> + </param> + <param> + <key>gain8</key> + <value>10</value> + </param> + <param> + <key>ant9</key> + <value></value> + </param> + <param> + <key>bb_gain9</key> + <value>20</value> + </param> + <param> + <key>bw9</key> + <value>0</value> + </param> + <param> + <key>corr9</key> + <value>0</value> + </param> + <param> + <key>freq9</key> + <value>100e6</value> + </param> + <param> + <key>if_gain9</key> + <value>20</value> + </param> + <param> + <key>gain9</key> + <value>10</value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>args</key> + <value>bladerf=0,buffers=128,buflen=32768</value> + </param> + <param> + <key>_enabled</key> + <value>0</value> + </param> + <param> + <key>_coordinate</key> + <value>(944, 468)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>osmosdr_sink_0</value> + </param> + <param> + <key>type</key> + <value>fc32</value> + </param> + <param> + <key>clock_source0</key> + <value></value> + </param> + <param> + <key>time_source0</key> + <value></value> + </param> + <param> + <key>clock_source1</key> + <value></value> + </param> + <param> + <key>time_source1</key> + <value></value> + </param> + <param> + <key>clock_source2</key> + <value></value> + </param> + <param> + <key>time_source2</key> + <value></value> + </param> + <param> + <key>clock_source3</key> + <value></value> + </param> + <param> + <key>time_source3</key> + <value></value> + </param> + <param> + <key>clock_source4</key> + <value></value> + </param> + <param> + <key>time_source4</key> + <value></value> + </param> + <param> + <key>clock_source5</key> + <value></value> + </param> + <param> + <key>time_source5</key> + <value></value> + </param> + <param> + <key>clock_source6</key> + <value></value> + </param> + <param> + <key>time_source6</key> + <value></value> + </param> + <param> + <key>clock_source7</key> + <value></value> + </param> + <param> + <key>time_source7</key> + <value></value> + </param> + <param> + <key>nchan</key> + <value>1</value> + </param> + <param> + <key>num_mboards</key> + <value>1</value> + </param> + <param> + <key>sample_rate</key> + <value>symbol_rate</value> + </param> + <param> + <key>sync</key> + <value></value> + </param> + </block> + <block> + <key>qtgui_freq_sink_x</key> + <param> + <key>autoscale</key> + <value>False</value> + </param> + <param> + <key>average</key> + <value>0.1</value> + </param> + <param> + <key>axislabels</key> + <value>True</value> + </param> + <param> + <key>bw</key> + <value>symbol_rate</value> + </param> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>fc</key> + <value>center_freq</value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>ctrlpanel</key> + <value>False</value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>_enabled</key> + <value>True</value> + </param> + <param> + <key>fftsize</key> + <value>1024</value> + </param> + <param> + <key>_coordinate</key> + <value>(944, 364)</value> + </param> + <param> + <key>gui_hint</key> + <value></value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>grid</key> + <value>True</value> + </param> + <param> + <key>id</key> + <value>qtgui_freq_sink_x_0</value> + </param> + <param> + <key>legend</key> + <value>True</value> + </param> + <param> + <key>alpha1</key> + <value>1.0</value> + </param> + <param> + <key>color1</key> + <value>"blue"</value> + </param> + <param> + <key>label1</key> + <value></value> + </param> + <param> + <key>width1</key> + <value>1</value> + </param> + <param> + <key>alpha10</key> + <value>1.0</value> + </param> + <param> + <key>color10</key> + <value>"dark blue"</value> + </param> + <param> + <key>label10</key> + <value></value> + </param> + <param> + <key>width10</key> + <value>1</value> + </param> + <param> + <key>alpha2</key> + <value>1.0</value> + </param> + <param> + <key>color2</key> + <value>"red"</value> + </param> + <param> + <key>label2</key> + <value></value> + </param> + <param> + <key>width2</key> + <value>1</value> + </param> + <param> + <key>alpha3</key> + <value>1.0</value> + </param> + <param> + <key>color3</key> + <value>"green"</value> + </param> + <param> + <key>label3</key> + <value></value> + </param> + <param> + <key>width3</key> + <value>1</value> + </param> + <param> + <key>alpha4</key> + <value>1.0</value> + </param> + <param> + <key>color4</key> + <value>"black"</value> + </param> + <param> + <key>label4</key> + <value></value> + </param> + <param> + <key>width4</key> + <value>1</value> + </param> + <param> + <key>alpha5</key> + <value>1.0</value> + </param> + <param> + <key>color5</key> + <value>"cyan"</value> + </param> + <param> + <key>label5</key> + <value></value> + </param> + <param> + <key>width5</key> + <value>1</value> + </param> + <param> + <key>alpha6</key> + <value>1.0</value> + </param> + <param> + <key>color6</key> + <value>"magenta"</value> + </param> + <param> + <key>label6</key> + <value></value> + </param> + <param> + <key>width6</key> + <value>1</value> + </param> + <param> + <key>alpha7</key> + <value>1.0</value> + </param> + <param> + <key>color7</key> + <value>"yellow"</value> + </param> + <param> + <key>label7</key> + <value></value> + </param> + <param> + <key>width7</key> + <value>1</value> + </param> + <param> + <key>alpha8</key> + <value>1.0</value> + </param> + <param> + <key>color8</key> + <value>"dark red"</value> + </param> + <param> + <key>label8</key> + <value></value> + </param> + <param> + <key>width8</key> + <value>1</value> + </param> + <param> + <key>alpha9</key> + <value>1.0</value> + </param> + <param> + <key>color9</key> + <value>"dark green"</value> + </param> + <param> + <key>label9</key> + <value></value> + </param> + <param> + <key>width9</key> + <value>1</value> + </param> + <param> + <key>maxoutbuf</key> + <value>0</value> + </param> + <param> + <key>minoutbuf</key> + <value>0</value> + </param> + <param> + <key>name</key> + <value>""</value> + </param> + <param> + <key>nconnections</key> + <value>1</value> + </param> + <param> + <key>showports</key> + <value>True</value> + </param> + <param> + <key>freqhalf</key> + <value>True</value> + </param> + <param> + <key>tr_chan</key> + <value>0</value> + </param> + <param> + <key>tr_level</key> + <value>0.0</value> + </param> + <param> + <key>tr_mode</key> + <value>qtgui.TRIG_MODE_FREE</value> + </param> + <param> + <key>tr_tag</key> + <value>""</value> + </param> + <param> + <key>type</key> + <value>complex</value> + </param> + <param> + <key>update_time</key> + <value>0.10</value> + </param> + <param> + <key>wintype</key> + <value>firdes.WIN_BLACKMAN_hARRIS</value> + </param> + <param> + <key>label</key> + <value>Relative Gain</value> + </param> + <param> + <key>ymax</key> + <value>10</value> + </param> + <param> + <key>ymin</key> + <value>-140</value> + </param> + <param> + <key>units</key> + <value>dB</value> + </param> + </block> + <block> + <key>uhd_usrp_sink</key> + <param> + <key>alias</key> + <value></value> + </param> + <param> + <key>ant0</key> + <value></value> + </param> + <param> + <key>bw0</key> + <value>0</value> + </param> + <param> + <key>center_freq0</key> + <value>center_freq</value> + </param> + <param> + <key>norm_gain0</key> + <value>False</value> + </param> + <param> + <key>gain0</key> + <value>50</value> + </param> + <param> + <key>ant10</key> + <value></value> + </param> + <param> + <key>bw10</key> + <value>0</value> + </param> + <param> + <key>center_freq10</key> + <value>0</value> + </param> + <param> + <key>norm_gain10</key> + <value>False</value> + </param> + <param> + <key>gain10</key> + <value>0</value> + </param> + <param> + <key>ant11</key> + <value></value> + </param> + <param> + <key>bw11</key> + <value>0</value> + </param> + <param> + <key>center_freq11</key> + <value>0</value> + </param> + <param> + <key>norm_gain11</key> + <value>False</value> + </param> + <param> + <key>gain11</key> + <value>0</value> + </param> + <param> + <key>ant12</key> + <value></value> + </param> + <param> + <key>bw12</key> + <value>0</value> + </param> + <param> + <key>center_freq12</key> + <value>0</value> + </param> + <param> + <key>norm_gain12</key> + <value>False</value> + </param> + <param> + <key>gain12</key> + <value>0</value> + </param> + <param> + <key>ant13</key> + <value></value> + </param> + <param> + <key>bw13</key> + <value>0</value> + </param> + <param> + <key>center_freq13</key> + <value>0</value> + </param> + <param> + <key>norm_gain13</key> + <value>False</value> + </param> + <param> + <key>gain13</key> + <value>0</value> + </param> + <param> + <key>ant14</key> + <value></value> + </param> + <param> + <key>bw14</key> + <value>0</value> + </param> + <param> + <key>center_freq14</key> + <value>0</value> + </param> + <param> + <key>norm_gain14</key> + <value>False</value> + </param> + <param> + <key>gain14</key> + <value>0</value> + </param> + <param> + <key>ant15</key> + <value></value> + </param> + <param> + <key>bw15</key> + <value>0</value> + </param> + <param> + <key>center_freq15</key> + <value>0</value> + </param> + <param> + <key>norm_gain15</key> + <value>False</value> + </param> + <param> + <key>gain15</key> + <value>0</value> + </param> + <param> + <key>ant16</key> + <value></value> + </param> + <param> + <key>bw16</key> + <value>0</value> + </param> + <param> + <key>center_freq16</key> + <value>0</value> + </param> + <param> + <key>norm_gain16</key> + <value>False</value> + </param> + <param> + <key>gain16</key> + <value>0</value> + </param> + <param> + <key>ant17</key> + <value></value> + </param> + <param> + <key>bw17</key> + <value>0</value> + </param> + <param> + <key>center_freq17</key> + <value>0</value> + </param> + <param> + <key>norm_gain17</key> + <value>False</value> + </param> + <param> + <key>gain17</key> + <value>0</value> + </param> + <param> + <key>ant18</key> + <value></value> + </param> + <param> + <key>bw18</key> + <value>0</value> + </param> + <param> + <key>center_freq18</key> + <value>0</value> + </param> + <param> + <key>norm_gain18</key> + <value>False</value> + </param> + <param> + <key>gain18</key> + <value>0</value> + </param> + <param> + <key>ant19</key> + <value></value> + </param> + <param> + <key>bw19</key> + <value>0</value> + </param> + <param> + <key>center_freq19</key> + <value>0</value> + </param> + <param> + <key>norm_gain19</key> + <value>False</value> + </param> + <param> + <key>gain19</key> + <value>0</value> + </param> + <param> + <key>ant1</key> + <value></value> + </param> + <param> + <key>bw1</key> + <value>0</value> + </param> + <param> + <key>center_freq1</key> + <value>0</value> + </param> + <param> + <key>norm_gain1</key> + <value>False</value> + </param> + <param> + <key>gain1</key> + <value>0</value> + </param> + <param> + <key>ant20</key> + <value></value> + </param> + <param> + <key>bw20</key> + <value>0</value> + </param> + <param> + <key>center_freq20</key> + <value>0</value> + </param> + <param> + <key>norm_gain20</key> + <value>False</value> + </param> + <param> + <key>gain20</key> + <value>0</value> + </param> + <param> + <key>ant21</key> + <value></value> + </param> + <param> + <key>bw21</key> + <value>0</value> + </param> + <param> + <key>center_freq21</key> + <value>0</value> + </param> + <param> + <key>norm_gain21</key> + <value>False</value> + </param> + <param> + <key>gain21</key> + <value>0</value> + </param> + <param> + <key>ant22</key> + <value></value> + </param> + <param> + <key>bw22</key> + <value>0</value> + </param> + <param> + <key>center_freq22</key> + <value>0</value> + </param> + <param> + <key>norm_gain22</key> + <value>False</value> + </param> + <param> + <key>gain22</key> + <value>0</value> + </param> + <param> + <key>ant23</key> + <value></value> + </param> + <param> + <key>bw23</key> + <value>0</value> + </param> + <param> + <key>center_freq23</key> + <value>0</value> + </param> + <param> + <key>norm_gain23</key> + <value>False</value> + </param> + <param> + <key>gain23</key> + <value>0</value> + </param> + <param> + <key>ant24</key> + <value></value> + </param> + <param> + <key>bw24</key> + <value>0</value> + </param> + <param> + <key>center_freq24</key> + <value>0</value> + </param> + <param> + <key>norm_gain24</key> + <value>False</value> + </param> + <param> + <key>gain24</key> + <value>0</value> + </param> + <param> + <key>ant25</key> + <value></value> + </param> + <param> + <key>bw25</key> + <value>0</value> + </param> + <param> + <key>center_freq25</key> + <value>0</value> + </param> + <param> + <key>norm_gain25</key> + <value>False</value> + </param> + <param> + <key>gain25</key> + <value>0</value> + </param> + <param> + <key>ant26</key> + <value></value> + </param> + <param> + <key>bw26</key> + <value>0</value> + </param> + <param> + <key>center_freq26</key> + <value>0</value> + </param> + <param> + <key>norm_gain26</key> + <value>False</value> + </param> + <param> + <key>gain26</key> + <value>0</value> + </param> + <param> + <key>ant27</key> + <value></value> + </param> + <param> + <key>bw27</key> + <value>0</value> + </param> + <param> + <key>center_freq27</key> + <value>0</value> + </param> + <param> + <key>norm_gain27</key> + <value>False</value> + </param> + <param> + <key>gain27</key> + <value>0</value> + </param> + <param> + <key>ant28</key> + <value></value> + </param> + <param> + <key>bw28</key> + <value>0</value> + </param> + <param> + <key>center_freq28</key> + <value>0</value> + </param> + <param> + <key>norm_gain28</key> + <value>False</value> + </param> + <param> + <key>gain28</key> + <value>0</value> + </param> + <param> + <key>ant29</key> + <value></value> + </param> + <param> + <key>bw29</key> + <value>0</value> + </param> + <param> + <key>center_freq29</key> + <value>0</value> + </param> + <param> + <key>norm_gain29</key> + <value>False</value> + </param> + <param> + <key>gain29</key> + <value>0</value> + </param> + <param> + <key>ant2</key> + <value></value> + </param> + <param> + <key>bw2</key> + <value>0</value> + </param> + <param> + <key>center_freq2</key> + <value>0</value> + </param> + <param> + <key>norm_gain2</key> + <value>False</value> + </param> + <param> + <key>gain2</key> + <value>0</value> + </param> + <param> + <key>ant30</key> + <value></value> + </param> + <param> + <key>bw30</key> + <value>0</value> + </param> + <param> + <key>center_freq30</key> + <value>0</value> + </param> + <param> + <key>norm_gain30</key> + <value>False</value> + </param> + <param> + <key>gain30</key> + <value>0</value> + </param> + <param> + <key>ant31</key> + <value></value> + </param> + <param> + <key>bw31</key> + <value>0</value> + </param> + <param> + <key>center_freq31</key> + <value>0</value> + </param> + <param> + <key>norm_gain31</key> + <value>False</value> + </param> + <param> + <key>gain31</key> + <value>0</value> + </param> + <param> + <key>ant3</key> + <value></value> + </param> + <param> + <key>bw3</key> + <value>0</value> + </param> + <param> + <key>center_freq3</key> + <value>0</value> + </param> + <param> + <key>norm_gain3</key> + <value>False</value> + </param> + <param> + <key>gain3</key> + <value>0</value> + </param> + <param> + <key>ant4</key> + <value></value> + </param> + <param> + <key>bw4</key> + <value>0</value> + </param> + <param> + <key>center_freq4</key> + <value>0</value> + </param> + <param> + <key>norm_gain4</key> + <value>False</value> + </param> + <param> + <key>gain4</key> + <value>0</value> + </param> + <param> + <key>ant5</key> + <value></value> + </param> + <param> + <key>bw5</key> + <value>0</value> + </param> + <param> + <key>center_freq5</key> + <value>0</value> + </param> + <param> + <key>norm_gain5</key> + <value>False</value> + </param> + <param> + <key>gain5</key> + <value>0</value> + </param> + <param> + <key>ant6</key> + <value></value> + </param> + <param> + <key>bw6</key> + <value>0</value> + </param> + <param> + <key>center_freq6</key> + <value>0</value> + </param> + <param> + <key>norm_gain6</key> + <value>False</value> + </param> + <param> + <key>gain6</key> + <value>0</value> + </param> + <param> + <key>ant7</key> + <value></value> + </param> + <param> + <key>bw7</key> + <value>0</value> + </param> + <param> + <key>center_freq7</key> + <value>0</value> + </param> + <param> + <key>norm_gain7</key> + <value>False</value> + </param> + <param> + <key>gain7</key> + <value>0</value> + </param> + <param> + <key>ant8</key> + <value></value> + </param> + <param> + <key>bw8</key> + <value>0</value> + </param> + <param> + <key>center_freq8</key> + <value>0</value> + </param> + <param> + <key>norm_gain8</key> + <value>False</value> + </param> + <param> + <key>gain8</key> + <value>0</value> + </param> + <param> + <key>ant9</key> + <value></value> + </param> + <param> + <key>bw9</key> + <value>0</value> + </param> + <param> + <key>center_freq9</key> + <value>0</value> + </param> + <param> + <key>norm_gain9</key> + <value>False</value> + </param> + <param> + <key>gain9</key> + <value>0</value> + </param> + <param> + <key>clock_rate</key> + <value>0.0</value> + </param> + <param> + <key>comment</key> + <value></value> + </param> + <param> + <key>affinity</key> + <value></value> + </param> + <param> + <key>dev_addr</key> + <value>"send_frame_size=65536,num_send_frames=128,master_clock_rate=" + str(symbol_rate*4)</value> + </param> + <param> + <key>dev_args</key> + <value>""</value> + </param> + <param> + <key>_enabled</key> + <value>1</value> + </param> + <param> + <key>_coordinate</key> + <value>(944, 232)</value> + </param> + <param> + <key>_rotation</key> + <value>0</value> + </param> + <param> + <key>id</key> + <value>uhd_usrp_sink_0</value> + </param> + <param> + <key>type</key> + <value>fc32</value> + </param> + <param> + <key>clock_source0</key> + <value></value> + </param> + <param> + <key>sd_spec0</key> + <value></value> + </param> + <param> + <key>time_source0</key> + <value></value> + </param> + <param> + <key>clock_source1</key> + <value></value> + </param> + <param> + <key>sd_spec1</key> + <value></value> + </param> + <param> + <key>time_source1</key> + <value></value> + </param> + <param> + <key>clock_source2</key> + <value></value> + </param> + <param> + <key>sd_spec2</key> + <value></value> + </param> + <param> + <key>time_source2</key> + <value></value> + </param> + <param> + <key>clock_source3</key> + <value></value> + </param> + <param> + <key>sd_spec3</key> + <value></value> + </param> + <param> + <key>time_source3</key> + <value></value> + </param> + <param> + <key>clock_source4</key> + <value></value> + </param> + <param> + <key>sd_spec4</key> + <value></value> + </param> + <param> + <key>time_source4</key> + <value></value> + </param> + <param> + <key>clock_source5</key> + <value></value> + </param> + <param> + <key>sd_spec5</key> + <value></value> + </param> + <param> + <key>time_source5</key> + <value></value> + </param> + <param> + <key>clock_source6</key> + <value></value> + </param> + <param> + <key>sd_spec6</key> + <value></value> + </param> + <param> + <key>time_source6</key> + <value></value> + </param> + <param> + <key>clock_source7</key> + <value></value> + </param> + <param> + <key>sd_spec7</key> + <value></value> + </param> + <param> + <key>time_source7</key> + <value></value> + </param> + <param> + <key>nchan</key> + <value>1</value> + </param> + <param> + <key>num_mboards</key> + <value>1</value> + </param> + <param> + <key>samp_rate</key> + <value>symbol_rate</value> + </param> + <param> + <key>hide_cmd_port</key> + <value>False</value> + </param> + <param> + <key>hide_lo_controls</key> + <value>True</value> + </param> + <param> + <key>stream_args</key> + <value></value> + </param> + <param> + <key>stream_chans</key> + <value>[]</value> + </param> + <param> + <key>sync</key> + <value></value> + </param> + <param> + <key>len_tag_name</key> + <value></value> + </param> + <param> + <key>otw</key> + <value></value> + </param> + </block> + <connection> + <source_block_id>blocks_file_source_0</source_block_id> + <sink_block_id>dtv_atsc_pad_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_keep_m_in_n_0</source_block_id> + <sink_block_id>dtv_dvbs2_modulator_bc_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_rotator_cc_0</source_block_id> + <sink_block_id>fft_filter_xxx_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>blocks_vector_to_stream_1</source_block_id> + <sink_block_id>blocks_keep_m_in_n_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>dtv_atsc_field_sync_mux_0</source_block_id> + <sink_block_id>blocks_vector_to_stream_1</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>dtv_atsc_interleaver_0</source_block_id> + <sink_block_id>dtv_atsc_trellis_encoder_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>dtv_atsc_pad_0</source_block_id> + <sink_block_id>dtv_atsc_randomizer_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>dtv_atsc_randomizer_0</source_block_id> + <sink_block_id>dtv_atsc_rs_encoder_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>dtv_atsc_rs_encoder_0</source_block_id> + <sink_block_id>dtv_atsc_interleaver_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>dtv_atsc_trellis_encoder_0</source_block_id> + <sink_block_id>dtv_atsc_field_sync_mux_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id> + <sink_block_id>blocks_rotator_cc_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>fft_filter_xxx_0</source_block_id> + <sink_block_id>osmosdr_sink_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>fft_filter_xxx_0</source_block_id> + <sink_block_id>qtgui_freq_sink_x_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> + <connection> + <source_block_id>fft_filter_xxx_0</source_block_id> + <sink_block_id>uhd_usrp_sink_0</sink_block_id> + <source_key>0</source_key> + <sink_key>0</sink_key> + </connection> +</flow_graph> diff --git a/gr-dtv/grc/CMakeLists.txt b/gr-dtv/grc/CMakeLists.txt index a1386c5adf..e226d09976 100644 --- a/gr-dtv/grc/CMakeLists.txt +++ b/gr-dtv/grc/CMakeLists.txt @@ -74,5 +74,4 @@ install(FILES dtv_catv_frame_sync_enc_bb.xml dtv_catv_trellis_enc_bb.xml DESTINATION ${GRC_BLOCKS_DIR} - COMPONENT "dtv_python" ) diff --git a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml index 5f848ec82d..28284169fd 100644 --- a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml +++ b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml @@ -21,6 +21,7 @@ $constellation.val, $interpolation.val)</make> <name>FECFRAME size</name> <key>framesize</key> <type>enum</type> + <hide>$constellation.hide_dvb</hide> <option> <name>Normal</name> <key>FECFRAME_NORMAL</key> @@ -50,7 +51,7 @@ $constellation.val, $interpolation.val)</make> <name>Code rate</name> <key>rate1</key> <type>enum</type> - <hide>$framesize.hide_normal</hide> + <hide>#if str($constellation) == 'MOD_8VSB' or str($constellation) == 'MOD_64QAM' then $constellation.hide_dvb else $framesize.hide_normal</hide> <option> <name>1/4</name> <key>C1_4</key> @@ -231,7 +232,7 @@ $constellation.val, $interpolation.val)</make> <name>Code rate</name> <key>rate2</key> <type>enum</type> - <hide>$framesize.hide_medium</hide> + <hide>#if str($constellation) == 'MOD_8VSB' or str($constellation) == 'MOD_64QAM' then $constellation.hide_dvb else $framesize.hide_medium</hide> <option> <name>1/5</name> <key>C1_5_MEDIUM</key> @@ -252,7 +253,7 @@ $constellation.val, $interpolation.val)</make> <name>Code rate</name> <key>rate3</key> <type>enum</type> - <hide>$framesize.hide_short</hide> + <hide>#if str($constellation) == 'MOD_8VSB' or str($constellation) == 'MOD_64QAM' then $constellation.hide_dvb else $framesize.hide_short</hide> <option> <name>1/4</name> <key>C1_4</key> @@ -372,81 +373,103 @@ $constellation.val, $interpolation.val)</make> <name>QPSK</name> <key>MOD_QPSK</key> <opt>val:dtv.MOD_QPSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>8PSK</name> <key>MOD_8PSK</key> <opt>val:dtv.MOD_8PSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>8APSK</name> <key>MOD_8APSK</key> <opt>val:dtv.MOD_8APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>16APSK</name> <key>MOD_16APSK</key> <opt>val:dtv.MOD_16APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>8+8APSK</name> <key>MOD_8_8APSK</key> <opt>val:dtv.MOD_8_8APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>32APSK</name> <key>MOD_32APSK</key> <opt>val:dtv.MOD_32APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>4+12+16rbAPSK</name> <key>MOD_4_12_16APSK</key> <opt>val:dtv.MOD_4_12_16APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>4+8+4+16APSK</name> <key>MOD_4_8_4_16APSK</key> <opt>val:dtv.MOD_4_8_4_16APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>64APSK</name> <key>MOD_64APSK</key> <opt>val:dtv.MOD_64APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>8+16+20+20APSK</name> <key>MOD_8_16_20_20APSK</key> <opt>val:dtv.MOD_8_16_20_20APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>4+12+20+28APSK</name> <key>MOD_4_12_20_28APSK</key> <opt>val:dtv.MOD_4_12_20_28APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>128APSK</name> <key>MOD_128APSK</key> <opt>val:dtv.MOD_128APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>256APSK</name> <key>MOD_256APSK</key> <opt>val:dtv.MOD_256APSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>64QAM (ITU-T J.83B)</name> <key>MOD_64QAM</key> <opt>val:dtv.MOD_64QAM</opt> + <opt>hide_dvb:all</opt> </option> <option> <name>PI/2 BPSK</name> <key>MOD_BPSK</key> <opt>val:dtv.MOD_BPSK</opt> + <opt>hide_dvb:</opt> </option> <option> <name>PI/2 BPSK-SF2</name> <key>MOD_BPSK_SF2</key> <opt>val:dtv.MOD_BPSK_SF2</opt> + <opt>hide_dvb:</opt> + </option> + <option> + <name>8VSB (ATSC)</name> + <key>MOD_8VSB</key> + <opt>val:dtv.MOD_8VSB</opt> + <opt>hide_dvb:all</opt> </option> </param> <param> diff --git a/gr-dtv/include/gnuradio/dtv/CMakeLists.txt b/gr-dtv/include/gnuradio/dtv/CMakeLists.txt index 620dd55879..ce15d99a3f 100644 --- a/gr-dtv/include/gnuradio/dtv/CMakeLists.txt +++ b/gr-dtv/include/gnuradio/dtv/CMakeLists.txt @@ -81,5 +81,4 @@ install(FILES catv_trellis_enc_bb.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/dtv - COMPONENT "dtv_devel" ) diff --git a/gr-dtv/include/gnuradio/dtv/dvb_config.h b/gr-dtv/include/gnuradio/dtv/dvb_config.h index 601fd5c569..68010e43b6 100644 --- a/gr-dtv/include/gnuradio/dtv/dvb_config.h +++ b/gr-dtv/include/gnuradio/dtv/dvb_config.h @@ -107,6 +107,7 @@ namespace gr { MOD_256APSK, MOD_BPSK, MOD_BPSK_SF2, + MOD_8VSB, MOD_OTHER, }; diff --git a/gr-dtv/lib/CMakeLists.txt b/gr-dtv/lib/CMakeLists.txt index fec48990a2..7ffcc435de 100644 --- a/gr-dtv/lib/CMakeLists.txt +++ b/gr-dtv/lib/CMakeLists.txt @@ -38,27 +38,9 @@ if(ENABLE_GR_CTRLPORT) endif(ENABLE_GR_CTRLPORT) ######################################################################## -# Generate viterbi mux source -# http://www.vtk.org/Wiki/CMake_Cross_Compiling#Using_executables_in_the_build_created_during_the_build -######################################################################## -if(NOT CMAKE_CROSSCOMPILING) - add_executable(atsc_viterbi_gen atsc/atsc_viterbi_gen.cc) - export(TARGETS atsc_viterbi_gen APPEND FILE ${EXPORT_FILE}) -endif() - -set(atsc_viterbi_mux_cc ${CMAKE_CURRENT_BINARY_DIR}/atsc_viterbi_mux.cc) - -add_custom_command( - OUTPUT ${atsc_viterbi_mux_cc} - DEPENDS atsc_viterbi_gen - COMMAND atsc_viterbi_gen -o ${atsc_viterbi_mux_cc} -) - -######################################################################## # Setup library ######################################################################## list(APPEND dtv_sources - ${atsc_viterbi_mux_cc} atsc/atsc_deinterleaver_impl.cc atsc/atsc_depad_impl.cc atsc/atsc_derandomizer_impl.cc @@ -134,7 +116,7 @@ list(APPEND dtv_libs include (CheckCCompilerFlag) if (MSVC) - # 64-bit MSVC always supports SSE2 + # 64-bit MSVC always supports SSE2 if (CMAKE_SIZEOF_VOID_P EQUAL 8) set(SSE2_SUPPORTED true) else () @@ -171,4 +153,4 @@ endif(MSVC) add_library(gnuradio-dtv SHARED ${dtv_sources}) target_link_libraries(gnuradio-dtv ${dtv_libs}) -GR_LIBRARY_FOO(gnuradio-dtv RUNTIME_COMPONENT "dtv_runtime" DEVEL_COMPONENT "dtv_devel") +GR_LIBRARY_FOO(gnuradio-dtv) diff --git a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc index 2284372dfb..bf1e86c9f8 100644 --- a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc +++ b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc @@ -27,7 +27,7 @@ #include <gnuradio/io_signature.h> #include "atsc_viterbi_decoder_impl.h" #include "atsc_types.h" -#include <atsc_viterbi_mux.cc> // machine generated +#include "atsc_viterbi_mux.h" namespace gr { namespace dtv { diff --git a/gr-dtv/lib/atsc/atsc_viterbi_mux.h b/gr-dtv/lib/atsc/atsc_viterbi_mux.h new file mode 100644 index 0000000000..07ec557544 --- /dev/null +++ b/gr-dtv/lib/atsc/atsc_viterbi_mux.h @@ -0,0 +1,2539 @@ +/* + * Data structures for knowing which symbols are fed to which + * Viterbi decoders, and then where to put the resulting output dibits. + * + * Generated by 'atsc_viterbi_gen.cc'. + */ + +const unsigned int sync_symbol_indices_max = 12; +const unsigned int sync_symbol_indices[12] = { + 0, 832, 1664, 2496, 3328, 4160, 4992, 5824, + 6656, 7488, 8320, 9152, }; + +const unsigned int enco_which_max = 828; +const unsigned int enco_which_syms[12][828] = { + /* 0 */ + {4, 16, 28, 40, 52, 64, 76, 88, + 100, 112, 124, 136, 148, 160, 172, 184, + 196, 208, 220, 232, 244, 256, 268, 280, + 292, 304, 316, 328, 340, 352, 364, 376, + 388, 400, 412, 424, 436, 448, 460, 472, + 484, 496, 508, 520, 532, 544, 556, 568, + 580, 592, 604, 616, 628, 640, 652, 664, + 676, 688, 700, 712, 724, 736, 748, 760, + 772, 784, 796, 808, 820, 844, 856, 868, + 880, 892, 904, 916, 928, 940, 952, 964, + 976, 988, 1000, 1012, 1024, 1036, 1048, 1060, + 1072, 1084, 1096, 1108, 1120, 1132, 1144, 1156, + 1168, 1180, 1192, 1204, 1216, 1228, 1240, 1252, + 1264, 1276, 1288, 1300, 1312, 1324, 1336, 1348, + 1360, 1372, 1384, 1396, 1408, 1420, 1432, 1444, + 1456, 1468, 1480, 1492, 1504, 1516, 1528, 1540, + 1552, 1564, 1576, 1588, 1600, 1612, 1624, 1636, + 1648, 1660, 1672, 1684, 1696, 1708, 1720, 1732, + 1744, 1756, 1768, 1780, 1792, 1804, 1816, 1828, + 1840, 1852, 1864, 1876, 1888, 1900, 1912, 1924, + 1936, 1948, 1960, 1972, 1984, 1996, 2008, 2020, + 2032, 2044, 2056, 2068, 2080, 2092, 2104, 2116, + 2128, 2140, 2152, 2164, 2176, 2188, 2200, 2212, + 2224, 2236, 2248, 2260, 2272, 2284, 2296, 2308, + 2320, 2332, 2344, 2356, 2368, 2380, 2392, 2404, + 2416, 2428, 2440, 2452, 2464, 2476, 2488, 2500, + 2512, 2524, 2536, 2548, 2560, 2572, 2584, 2596, + 2608, 2620, 2632, 2644, 2656, 2668, 2680, 2692, + 2704, 2716, 2728, 2740, 2752, 2764, 2776, 2788, + 2800, 2812, 2824, 2836, 2848, 2860, 2872, 2884, + 2896, 2908, 2920, 2932, 2944, 2956, 2968, 2980, + 2992, 3004, 3016, 3028, 3040, 3052, 3064, 3076, + 3088, 3100, 3112, 3124, 3136, 3148, 3160, 3172, + 3184, 3196, 3208, 3220, 3232, 3244, 3256, 3268, + 3280, 3292, 3304, 3316, 3340, 3352, 3364, 3376, + 3388, 3400, 3412, 3424, 3436, 3448, 3460, 3472, + 3484, 3496, 3508, 3520, 3532, 3544, 3556, 3568, + 3580, 3592, 3604, 3616, 3628, 3640, 3652, 3664, + 3676, 3688, 3700, 3712, 3724, 3736, 3748, 3760, + 3772, 3784, 3796, 3808, 3820, 3832, 3844, 3856, + 3868, 3880, 3892, 3904, 3916, 3928, 3940, 3952, + 3964, 3976, 3988, 4000, 4012, 4024, 4036, 4048, + 4060, 4072, 4084, 4096, 4108, 4120, 4132, 4144, + 4156, 4168, 4180, 4192, 4204, 4216, 4228, 4240, + 4252, 4264, 4276, 4288, 4300, 4312, 4324, 4336, + 4348, 4360, 4372, 4384, 4396, 4408, 4420, 4432, + 4444, 4456, 4468, 4480, 4492, 4504, 4516, 4528, + 4540, 4552, 4564, 4576, 4588, 4600, 4612, 4624, + 4636, 4648, 4660, 4672, 4684, 4696, 4708, 4720, + 4732, 4744, 4756, 4768, 4780, 4792, 4804, 4816, + 4828, 4840, 4852, 4864, 4876, 4888, 4900, 4912, + 4924, 4936, 4948, 4960, 4972, 4984, 4996, 5008, + 5020, 5032, 5044, 5056, 5068, 5080, 5092, 5104, + 5116, 5128, 5140, 5152, 5164, 5176, 5188, 5200, + 5212, 5224, 5236, 5248, 5260, 5272, 5284, 5296, + 5308, 5320, 5332, 5344, 5356, 5368, 5380, 5392, + 5404, 5416, 5428, 5440, 5452, 5464, 5476, 5488, + 5500, 5512, 5524, 5536, 5548, 5560, 5572, 5584, + 5596, 5608, 5620, 5632, 5644, 5656, 5668, 5680, + 5692, 5704, 5716, 5728, 5740, 5752, 5764, 5776, + 5788, 5800, 5812, 5836, 5848, 5860, 5872, 5884, + 5896, 5908, 5920, 5932, 5944, 5956, 5968, 5980, + 5992, 6004, 6016, 6028, 6040, 6052, 6064, 6076, + 6088, 6100, 6112, 6124, 6136, 6148, 6160, 6172, + 6184, 6196, 6208, 6220, 6232, 6244, 6256, 6268, + 6280, 6292, 6304, 6316, 6328, 6340, 6352, 6364, + 6376, 6388, 6400, 6412, 6424, 6436, 6448, 6460, + 6472, 6484, 6496, 6508, 6520, 6532, 6544, 6556, + 6568, 6580, 6592, 6604, 6616, 6628, 6640, 6652, + 6664, 6676, 6688, 6700, 6712, 6724, 6736, 6748, + 6760, 6772, 6784, 6796, 6808, 6820, 6832, 6844, + 6856, 6868, 6880, 6892, 6904, 6916, 6928, 6940, + 6952, 6964, 6976, 6988, 7000, 7012, 7024, 7036, + 7048, 7060, 7072, 7084, 7096, 7108, 7120, 7132, + 7144, 7156, 7168, 7180, 7192, 7204, 7216, 7228, + 7240, 7252, 7264, 7276, 7288, 7300, 7312, 7324, + 7336, 7348, 7360, 7372, 7384, 7396, 7408, 7420, + 7432, 7444, 7456, 7468, 7480, 7492, 7504, 7516, + 7528, 7540, 7552, 7564, 7576, 7588, 7600, 7612, + 7624, 7636, 7648, 7660, 7672, 7684, 7696, 7708, + 7720, 7732, 7744, 7756, 7768, 7780, 7792, 7804, + 7816, 7828, 7840, 7852, 7864, 7876, 7888, 7900, + 7912, 7924, 7936, 7948, 7960, 7972, 7984, 7996, + 8008, 8020, 8032, 8044, 8056, 8068, 8080, 8092, + 8104, 8116, 8128, 8140, 8152, 8164, 8176, 8188, + 8200, 8212, 8224, 8236, 8248, 8260, 8272, 8284, + 8296, 8308, 8332, 8344, 8356, 8368, 8380, 8392, + 8404, 8416, 8428, 8440, 8452, 8464, 8476, 8488, + 8500, 8512, 8524, 8536, 8548, 8560, 8572, 8584, + 8596, 8608, 8620, 8632, 8644, 8656, 8668, 8680, + 8692, 8704, 8716, 8728, 8740, 8752, 8764, 8776, + 8788, 8800, 8812, 8824, 8836, 8848, 8860, 8872, + 8884, 8896, 8908, 8920, 8932, 8944, 8956, 8968, + 8980, 8992, 9004, 9016, 9028, 9040, 9052, 9064, + 9076, 9088, 9100, 9112, 9124, 9136, 9148, 9160, + 9172, 9184, 9196, 9208, 9220, 9232, 9244, 9256, + 9268, 9280, 9292, 9304, 9316, 9328, 9340, 9352, + 9364, 9376, 9388, 9400, 9412, 9424, 9436, 9448, + 9460, 9472, 9484, 9496, 9508, 9520, 9532, 9544, + 9556, 9568, 9580, 9592, 9604, 9616, 9628, 9640, + 9652, 9664, 9676, 9688, 9700, 9712, 9724, 9736, + 9748, 9760, 9772, 9784, 9796, 9808, 9820, 9832, + 9844, 9856, 9868, 9880, 9892, 9904, 9916, 9928, + 9940, 9952, 9964, 9976, }, + /* 1 */ + {5, 17, 29, 41, 53, 65, 77, 89, + 101, 113, 125, 137, 149, 161, 173, 185, + 197, 209, 221, 233, 245, 257, 269, 281, + 293, 305, 317, 329, 341, 353, 365, 377, + 389, 401, 413, 425, 437, 449, 461, 473, + 485, 497, 509, 521, 533, 545, 557, 569, + 581, 593, 605, 617, 629, 641, 653, 665, + 677, 689, 701, 713, 725, 737, 749, 761, + 773, 785, 797, 809, 821, 845, 857, 869, + 881, 893, 905, 917, 929, 941, 953, 965, + 977, 989, 1001, 1013, 1025, 1037, 1049, 1061, + 1073, 1085, 1097, 1109, 1121, 1133, 1145, 1157, + 1169, 1181, 1193, 1205, 1217, 1229, 1241, 1253, + 1265, 1277, 1289, 1301, 1313, 1325, 1337, 1349, + 1361, 1373, 1385, 1397, 1409, 1421, 1433, 1445, + 1457, 1469, 1481, 1493, 1505, 1517, 1529, 1541, + 1553, 1565, 1577, 1589, 1601, 1613, 1625, 1637, + 1649, 1661, 1673, 1685, 1697, 1709, 1721, 1733, + 1745, 1757, 1769, 1781, 1793, 1805, 1817, 1829, + 1841, 1853, 1865, 1877, 1889, 1901, 1913, 1925, + 1937, 1949, 1961, 1973, 1985, 1997, 2009, 2021, + 2033, 2045, 2057, 2069, 2081, 2093, 2105, 2117, + 2129, 2141, 2153, 2165, 2177, 2189, 2201, 2213, + 2225, 2237, 2249, 2261, 2273, 2285, 2297, 2309, + 2321, 2333, 2345, 2357, 2369, 2381, 2393, 2405, + 2417, 2429, 2441, 2453, 2465, 2477, 2489, 2501, + 2513, 2525, 2537, 2549, 2561, 2573, 2585, 2597, + 2609, 2621, 2633, 2645, 2657, 2669, 2681, 2693, + 2705, 2717, 2729, 2741, 2753, 2765, 2777, 2789, + 2801, 2813, 2825, 2837, 2849, 2861, 2873, 2885, + 2897, 2909, 2921, 2933, 2945, 2957, 2969, 2981, + 2993, 3005, 3017, 3029, 3041, 3053, 3065, 3077, + 3089, 3101, 3113, 3125, 3137, 3149, 3161, 3173, + 3185, 3197, 3209, 3221, 3233, 3245, 3257, 3269, + 3281, 3293, 3305, 3317, 3341, 3353, 3365, 3377, + 3389, 3401, 3413, 3425, 3437, 3449, 3461, 3473, + 3485, 3497, 3509, 3521, 3533, 3545, 3557, 3569, + 3581, 3593, 3605, 3617, 3629, 3641, 3653, 3665, + 3677, 3689, 3701, 3713, 3725, 3737, 3749, 3761, + 3773, 3785, 3797, 3809, 3821, 3833, 3845, 3857, + 3869, 3881, 3893, 3905, 3917, 3929, 3941, 3953, + 3965, 3977, 3989, 4001, 4013, 4025, 4037, 4049, + 4061, 4073, 4085, 4097, 4109, 4121, 4133, 4145, + 4157, 4169, 4181, 4193, 4205, 4217, 4229, 4241, + 4253, 4265, 4277, 4289, 4301, 4313, 4325, 4337, + 4349, 4361, 4373, 4385, 4397, 4409, 4421, 4433, + 4445, 4457, 4469, 4481, 4493, 4505, 4517, 4529, + 4541, 4553, 4565, 4577, 4589, 4601, 4613, 4625, + 4637, 4649, 4661, 4673, 4685, 4697, 4709, 4721, + 4733, 4745, 4757, 4769, 4781, 4793, 4805, 4817, + 4829, 4841, 4853, 4865, 4877, 4889, 4901, 4913, + 4925, 4937, 4949, 4961, 4973, 4985, 4997, 5009, + 5021, 5033, 5045, 5057, 5069, 5081, 5093, 5105, + 5117, 5129, 5141, 5153, 5165, 5177, 5189, 5201, + 5213, 5225, 5237, 5249, 5261, 5273, 5285, 5297, + 5309, 5321, 5333, 5345, 5357, 5369, 5381, 5393, + 5405, 5417, 5429, 5441, 5453, 5465, 5477, 5489, + 5501, 5513, 5525, 5537, 5549, 5561, 5573, 5585, + 5597, 5609, 5621, 5633, 5645, 5657, 5669, 5681, + 5693, 5705, 5717, 5729, 5741, 5753, 5765, 5777, + 5789, 5801, 5813, 5837, 5849, 5861, 5873, 5885, + 5897, 5909, 5921, 5933, 5945, 5957, 5969, 5981, + 5993, 6005, 6017, 6029, 6041, 6053, 6065, 6077, + 6089, 6101, 6113, 6125, 6137, 6149, 6161, 6173, + 6185, 6197, 6209, 6221, 6233, 6245, 6257, 6269, + 6281, 6293, 6305, 6317, 6329, 6341, 6353, 6365, + 6377, 6389, 6401, 6413, 6425, 6437, 6449, 6461, + 6473, 6485, 6497, 6509, 6521, 6533, 6545, 6557, + 6569, 6581, 6593, 6605, 6617, 6629, 6641, 6653, + 6665, 6677, 6689, 6701, 6713, 6725, 6737, 6749, + 6761, 6773, 6785, 6797, 6809, 6821, 6833, 6845, + 6857, 6869, 6881, 6893, 6905, 6917, 6929, 6941, + 6953, 6965, 6977, 6989, 7001, 7013, 7025, 7037, + 7049, 7061, 7073, 7085, 7097, 7109, 7121, 7133, + 7145, 7157, 7169, 7181, 7193, 7205, 7217, 7229, + 7241, 7253, 7265, 7277, 7289, 7301, 7313, 7325, + 7337, 7349, 7361, 7373, 7385, 7397, 7409, 7421, + 7433, 7445, 7457, 7469, 7481, 7493, 7505, 7517, + 7529, 7541, 7553, 7565, 7577, 7589, 7601, 7613, + 7625, 7637, 7649, 7661, 7673, 7685, 7697, 7709, + 7721, 7733, 7745, 7757, 7769, 7781, 7793, 7805, + 7817, 7829, 7841, 7853, 7865, 7877, 7889, 7901, + 7913, 7925, 7937, 7949, 7961, 7973, 7985, 7997, + 8009, 8021, 8033, 8045, 8057, 8069, 8081, 8093, + 8105, 8117, 8129, 8141, 8153, 8165, 8177, 8189, + 8201, 8213, 8225, 8237, 8249, 8261, 8273, 8285, + 8297, 8309, 8333, 8345, 8357, 8369, 8381, 8393, + 8405, 8417, 8429, 8441, 8453, 8465, 8477, 8489, + 8501, 8513, 8525, 8537, 8549, 8561, 8573, 8585, + 8597, 8609, 8621, 8633, 8645, 8657, 8669, 8681, + 8693, 8705, 8717, 8729, 8741, 8753, 8765, 8777, + 8789, 8801, 8813, 8825, 8837, 8849, 8861, 8873, + 8885, 8897, 8909, 8921, 8933, 8945, 8957, 8969, + 8981, 8993, 9005, 9017, 9029, 9041, 9053, 9065, + 9077, 9089, 9101, 9113, 9125, 9137, 9149, 9161, + 9173, 9185, 9197, 9209, 9221, 9233, 9245, 9257, + 9269, 9281, 9293, 9305, 9317, 9329, 9341, 9353, + 9365, 9377, 9389, 9401, 9413, 9425, 9437, 9449, + 9461, 9473, 9485, 9497, 9509, 9521, 9533, 9545, + 9557, 9569, 9581, 9593, 9605, 9617, 9629, 9641, + 9653, 9665, 9677, 9689, 9701, 9713, 9725, 9737, + 9749, 9761, 9773, 9785, 9797, 9809, 9821, 9833, + 9845, 9857, 9869, 9881, 9893, 9905, 9917, 9929, + 9941, 9953, 9965, 9977, }, + /* 2 */ + {6, 18, 30, 42, 54, 66, 78, 90, + 102, 114, 126, 138, 150, 162, 174, 186, + 198, 210, 222, 234, 246, 258, 270, 282, + 294, 306, 318, 330, 342, 354, 366, 378, + 390, 402, 414, 426, 438, 450, 462, 474, + 486, 498, 510, 522, 534, 546, 558, 570, + 582, 594, 606, 618, 630, 642, 654, 666, + 678, 690, 702, 714, 726, 738, 750, 762, + 774, 786, 798, 810, 822, 846, 858, 870, + 882, 894, 906, 918, 930, 942, 954, 966, + 978, 990, 1002, 1014, 1026, 1038, 1050, 1062, + 1074, 1086, 1098, 1110, 1122, 1134, 1146, 1158, + 1170, 1182, 1194, 1206, 1218, 1230, 1242, 1254, + 1266, 1278, 1290, 1302, 1314, 1326, 1338, 1350, + 1362, 1374, 1386, 1398, 1410, 1422, 1434, 1446, + 1458, 1470, 1482, 1494, 1506, 1518, 1530, 1542, + 1554, 1566, 1578, 1590, 1602, 1614, 1626, 1638, + 1650, 1662, 1674, 1686, 1698, 1710, 1722, 1734, + 1746, 1758, 1770, 1782, 1794, 1806, 1818, 1830, + 1842, 1854, 1866, 1878, 1890, 1902, 1914, 1926, + 1938, 1950, 1962, 1974, 1986, 1998, 2010, 2022, + 2034, 2046, 2058, 2070, 2082, 2094, 2106, 2118, + 2130, 2142, 2154, 2166, 2178, 2190, 2202, 2214, + 2226, 2238, 2250, 2262, 2274, 2286, 2298, 2310, + 2322, 2334, 2346, 2358, 2370, 2382, 2394, 2406, + 2418, 2430, 2442, 2454, 2466, 2478, 2490, 2502, + 2514, 2526, 2538, 2550, 2562, 2574, 2586, 2598, + 2610, 2622, 2634, 2646, 2658, 2670, 2682, 2694, + 2706, 2718, 2730, 2742, 2754, 2766, 2778, 2790, + 2802, 2814, 2826, 2838, 2850, 2862, 2874, 2886, + 2898, 2910, 2922, 2934, 2946, 2958, 2970, 2982, + 2994, 3006, 3018, 3030, 3042, 3054, 3066, 3078, + 3090, 3102, 3114, 3126, 3138, 3150, 3162, 3174, + 3186, 3198, 3210, 3222, 3234, 3246, 3258, 3270, + 3282, 3294, 3306, 3318, 3342, 3354, 3366, 3378, + 3390, 3402, 3414, 3426, 3438, 3450, 3462, 3474, + 3486, 3498, 3510, 3522, 3534, 3546, 3558, 3570, + 3582, 3594, 3606, 3618, 3630, 3642, 3654, 3666, + 3678, 3690, 3702, 3714, 3726, 3738, 3750, 3762, + 3774, 3786, 3798, 3810, 3822, 3834, 3846, 3858, + 3870, 3882, 3894, 3906, 3918, 3930, 3942, 3954, + 3966, 3978, 3990, 4002, 4014, 4026, 4038, 4050, + 4062, 4074, 4086, 4098, 4110, 4122, 4134, 4146, + 4158, 4170, 4182, 4194, 4206, 4218, 4230, 4242, + 4254, 4266, 4278, 4290, 4302, 4314, 4326, 4338, + 4350, 4362, 4374, 4386, 4398, 4410, 4422, 4434, + 4446, 4458, 4470, 4482, 4494, 4506, 4518, 4530, + 4542, 4554, 4566, 4578, 4590, 4602, 4614, 4626, + 4638, 4650, 4662, 4674, 4686, 4698, 4710, 4722, + 4734, 4746, 4758, 4770, 4782, 4794, 4806, 4818, + 4830, 4842, 4854, 4866, 4878, 4890, 4902, 4914, + 4926, 4938, 4950, 4962, 4974, 4986, 4998, 5010, + 5022, 5034, 5046, 5058, 5070, 5082, 5094, 5106, + 5118, 5130, 5142, 5154, 5166, 5178, 5190, 5202, + 5214, 5226, 5238, 5250, 5262, 5274, 5286, 5298, + 5310, 5322, 5334, 5346, 5358, 5370, 5382, 5394, + 5406, 5418, 5430, 5442, 5454, 5466, 5478, 5490, + 5502, 5514, 5526, 5538, 5550, 5562, 5574, 5586, + 5598, 5610, 5622, 5634, 5646, 5658, 5670, 5682, + 5694, 5706, 5718, 5730, 5742, 5754, 5766, 5778, + 5790, 5802, 5814, 5838, 5850, 5862, 5874, 5886, + 5898, 5910, 5922, 5934, 5946, 5958, 5970, 5982, + 5994, 6006, 6018, 6030, 6042, 6054, 6066, 6078, + 6090, 6102, 6114, 6126, 6138, 6150, 6162, 6174, + 6186, 6198, 6210, 6222, 6234, 6246, 6258, 6270, + 6282, 6294, 6306, 6318, 6330, 6342, 6354, 6366, + 6378, 6390, 6402, 6414, 6426, 6438, 6450, 6462, + 6474, 6486, 6498, 6510, 6522, 6534, 6546, 6558, + 6570, 6582, 6594, 6606, 6618, 6630, 6642, 6654, + 6666, 6678, 6690, 6702, 6714, 6726, 6738, 6750, + 6762, 6774, 6786, 6798, 6810, 6822, 6834, 6846, + 6858, 6870, 6882, 6894, 6906, 6918, 6930, 6942, + 6954, 6966, 6978, 6990, 7002, 7014, 7026, 7038, + 7050, 7062, 7074, 7086, 7098, 7110, 7122, 7134, + 7146, 7158, 7170, 7182, 7194, 7206, 7218, 7230, + 7242, 7254, 7266, 7278, 7290, 7302, 7314, 7326, + 7338, 7350, 7362, 7374, 7386, 7398, 7410, 7422, + 7434, 7446, 7458, 7470, 7482, 7494, 7506, 7518, + 7530, 7542, 7554, 7566, 7578, 7590, 7602, 7614, + 7626, 7638, 7650, 7662, 7674, 7686, 7698, 7710, + 7722, 7734, 7746, 7758, 7770, 7782, 7794, 7806, + 7818, 7830, 7842, 7854, 7866, 7878, 7890, 7902, + 7914, 7926, 7938, 7950, 7962, 7974, 7986, 7998, + 8010, 8022, 8034, 8046, 8058, 8070, 8082, 8094, + 8106, 8118, 8130, 8142, 8154, 8166, 8178, 8190, + 8202, 8214, 8226, 8238, 8250, 8262, 8274, 8286, + 8298, 8310, 8334, 8346, 8358, 8370, 8382, 8394, + 8406, 8418, 8430, 8442, 8454, 8466, 8478, 8490, + 8502, 8514, 8526, 8538, 8550, 8562, 8574, 8586, + 8598, 8610, 8622, 8634, 8646, 8658, 8670, 8682, + 8694, 8706, 8718, 8730, 8742, 8754, 8766, 8778, + 8790, 8802, 8814, 8826, 8838, 8850, 8862, 8874, + 8886, 8898, 8910, 8922, 8934, 8946, 8958, 8970, + 8982, 8994, 9006, 9018, 9030, 9042, 9054, 9066, + 9078, 9090, 9102, 9114, 9126, 9138, 9150, 9162, + 9174, 9186, 9198, 9210, 9222, 9234, 9246, 9258, + 9270, 9282, 9294, 9306, 9318, 9330, 9342, 9354, + 9366, 9378, 9390, 9402, 9414, 9426, 9438, 9450, + 9462, 9474, 9486, 9498, 9510, 9522, 9534, 9546, + 9558, 9570, 9582, 9594, 9606, 9618, 9630, 9642, + 9654, 9666, 9678, 9690, 9702, 9714, 9726, 9738, + 9750, 9762, 9774, 9786, 9798, 9810, 9822, 9834, + 9846, 9858, 9870, 9882, 9894, 9906, 9918, 9930, + 9942, 9954, 9966, 9978, }, + /* 3 */ + {7, 19, 31, 43, 55, 67, 79, 91, + 103, 115, 127, 139, 151, 163, 175, 187, + 199, 211, 223, 235, 247, 259, 271, 283, + 295, 307, 319, 331, 343, 355, 367, 379, + 391, 403, 415, 427, 439, 451, 463, 475, + 487, 499, 511, 523, 535, 547, 559, 571, + 583, 595, 607, 619, 631, 643, 655, 667, + 679, 691, 703, 715, 727, 739, 751, 763, + 775, 787, 799, 811, 823, 847, 859, 871, + 883, 895, 907, 919, 931, 943, 955, 967, + 979, 991, 1003, 1015, 1027, 1039, 1051, 1063, + 1075, 1087, 1099, 1111, 1123, 1135, 1147, 1159, + 1171, 1183, 1195, 1207, 1219, 1231, 1243, 1255, + 1267, 1279, 1291, 1303, 1315, 1327, 1339, 1351, + 1363, 1375, 1387, 1399, 1411, 1423, 1435, 1447, + 1459, 1471, 1483, 1495, 1507, 1519, 1531, 1543, + 1555, 1567, 1579, 1591, 1603, 1615, 1627, 1639, + 1651, 1663, 1675, 1687, 1699, 1711, 1723, 1735, + 1747, 1759, 1771, 1783, 1795, 1807, 1819, 1831, + 1843, 1855, 1867, 1879, 1891, 1903, 1915, 1927, + 1939, 1951, 1963, 1975, 1987, 1999, 2011, 2023, + 2035, 2047, 2059, 2071, 2083, 2095, 2107, 2119, + 2131, 2143, 2155, 2167, 2179, 2191, 2203, 2215, + 2227, 2239, 2251, 2263, 2275, 2287, 2299, 2311, + 2323, 2335, 2347, 2359, 2371, 2383, 2395, 2407, + 2419, 2431, 2443, 2455, 2467, 2479, 2491, 2503, + 2515, 2527, 2539, 2551, 2563, 2575, 2587, 2599, + 2611, 2623, 2635, 2647, 2659, 2671, 2683, 2695, + 2707, 2719, 2731, 2743, 2755, 2767, 2779, 2791, + 2803, 2815, 2827, 2839, 2851, 2863, 2875, 2887, + 2899, 2911, 2923, 2935, 2947, 2959, 2971, 2983, + 2995, 3007, 3019, 3031, 3043, 3055, 3067, 3079, + 3091, 3103, 3115, 3127, 3139, 3151, 3163, 3175, + 3187, 3199, 3211, 3223, 3235, 3247, 3259, 3271, + 3283, 3295, 3307, 3319, 3343, 3355, 3367, 3379, + 3391, 3403, 3415, 3427, 3439, 3451, 3463, 3475, + 3487, 3499, 3511, 3523, 3535, 3547, 3559, 3571, + 3583, 3595, 3607, 3619, 3631, 3643, 3655, 3667, + 3679, 3691, 3703, 3715, 3727, 3739, 3751, 3763, + 3775, 3787, 3799, 3811, 3823, 3835, 3847, 3859, + 3871, 3883, 3895, 3907, 3919, 3931, 3943, 3955, + 3967, 3979, 3991, 4003, 4015, 4027, 4039, 4051, + 4063, 4075, 4087, 4099, 4111, 4123, 4135, 4147, + 4159, 4171, 4183, 4195, 4207, 4219, 4231, 4243, + 4255, 4267, 4279, 4291, 4303, 4315, 4327, 4339, + 4351, 4363, 4375, 4387, 4399, 4411, 4423, 4435, + 4447, 4459, 4471, 4483, 4495, 4507, 4519, 4531, + 4543, 4555, 4567, 4579, 4591, 4603, 4615, 4627, + 4639, 4651, 4663, 4675, 4687, 4699, 4711, 4723, + 4735, 4747, 4759, 4771, 4783, 4795, 4807, 4819, + 4831, 4843, 4855, 4867, 4879, 4891, 4903, 4915, + 4927, 4939, 4951, 4963, 4975, 4987, 4999, 5011, + 5023, 5035, 5047, 5059, 5071, 5083, 5095, 5107, + 5119, 5131, 5143, 5155, 5167, 5179, 5191, 5203, + 5215, 5227, 5239, 5251, 5263, 5275, 5287, 5299, + 5311, 5323, 5335, 5347, 5359, 5371, 5383, 5395, + 5407, 5419, 5431, 5443, 5455, 5467, 5479, 5491, + 5503, 5515, 5527, 5539, 5551, 5563, 5575, 5587, + 5599, 5611, 5623, 5635, 5647, 5659, 5671, 5683, + 5695, 5707, 5719, 5731, 5743, 5755, 5767, 5779, + 5791, 5803, 5815, 5839, 5851, 5863, 5875, 5887, + 5899, 5911, 5923, 5935, 5947, 5959, 5971, 5983, + 5995, 6007, 6019, 6031, 6043, 6055, 6067, 6079, + 6091, 6103, 6115, 6127, 6139, 6151, 6163, 6175, + 6187, 6199, 6211, 6223, 6235, 6247, 6259, 6271, + 6283, 6295, 6307, 6319, 6331, 6343, 6355, 6367, + 6379, 6391, 6403, 6415, 6427, 6439, 6451, 6463, + 6475, 6487, 6499, 6511, 6523, 6535, 6547, 6559, + 6571, 6583, 6595, 6607, 6619, 6631, 6643, 6655, + 6667, 6679, 6691, 6703, 6715, 6727, 6739, 6751, + 6763, 6775, 6787, 6799, 6811, 6823, 6835, 6847, + 6859, 6871, 6883, 6895, 6907, 6919, 6931, 6943, + 6955, 6967, 6979, 6991, 7003, 7015, 7027, 7039, + 7051, 7063, 7075, 7087, 7099, 7111, 7123, 7135, + 7147, 7159, 7171, 7183, 7195, 7207, 7219, 7231, + 7243, 7255, 7267, 7279, 7291, 7303, 7315, 7327, + 7339, 7351, 7363, 7375, 7387, 7399, 7411, 7423, + 7435, 7447, 7459, 7471, 7483, 7495, 7507, 7519, + 7531, 7543, 7555, 7567, 7579, 7591, 7603, 7615, + 7627, 7639, 7651, 7663, 7675, 7687, 7699, 7711, + 7723, 7735, 7747, 7759, 7771, 7783, 7795, 7807, + 7819, 7831, 7843, 7855, 7867, 7879, 7891, 7903, + 7915, 7927, 7939, 7951, 7963, 7975, 7987, 7999, + 8011, 8023, 8035, 8047, 8059, 8071, 8083, 8095, + 8107, 8119, 8131, 8143, 8155, 8167, 8179, 8191, + 8203, 8215, 8227, 8239, 8251, 8263, 8275, 8287, + 8299, 8311, 8335, 8347, 8359, 8371, 8383, 8395, + 8407, 8419, 8431, 8443, 8455, 8467, 8479, 8491, + 8503, 8515, 8527, 8539, 8551, 8563, 8575, 8587, + 8599, 8611, 8623, 8635, 8647, 8659, 8671, 8683, + 8695, 8707, 8719, 8731, 8743, 8755, 8767, 8779, + 8791, 8803, 8815, 8827, 8839, 8851, 8863, 8875, + 8887, 8899, 8911, 8923, 8935, 8947, 8959, 8971, + 8983, 8995, 9007, 9019, 9031, 9043, 9055, 9067, + 9079, 9091, 9103, 9115, 9127, 9139, 9151, 9163, + 9175, 9187, 9199, 9211, 9223, 9235, 9247, 9259, + 9271, 9283, 9295, 9307, 9319, 9331, 9343, 9355, + 9367, 9379, 9391, 9403, 9415, 9427, 9439, 9451, + 9463, 9475, 9487, 9499, 9511, 9523, 9535, 9547, + 9559, 9571, 9583, 9595, 9607, 9619, 9631, 9643, + 9655, 9667, 9679, 9691, 9703, 9715, 9727, 9739, + 9751, 9763, 9775, 9787, 9799, 9811, 9823, 9835, + 9847, 9859, 9871, 9883, 9895, 9907, 9919, 9931, + 9943, 9955, 9967, 9979, }, + /* 4 */ + {8, 20, 32, 44, 56, 68, 80, 92, + 104, 116, 128, 140, 152, 164, 176, 188, + 200, 212, 224, 236, 248, 260, 272, 284, + 296, 308, 320, 332, 344, 356, 368, 380, + 392, 404, 416, 428, 440, 452, 464, 476, + 488, 500, 512, 524, 536, 548, 560, 572, + 584, 596, 608, 620, 632, 644, 656, 668, + 680, 692, 704, 716, 728, 740, 752, 764, + 776, 788, 800, 812, 824, 836, 848, 860, + 872, 884, 896, 908, 920, 932, 944, 956, + 968, 980, 992, 1004, 1016, 1028, 1040, 1052, + 1064, 1076, 1088, 1100, 1112, 1124, 1136, 1148, + 1160, 1172, 1184, 1196, 1208, 1220, 1232, 1244, + 1256, 1268, 1280, 1292, 1304, 1316, 1328, 1340, + 1352, 1364, 1376, 1388, 1400, 1412, 1424, 1436, + 1448, 1460, 1472, 1484, 1496, 1508, 1520, 1532, + 1544, 1556, 1568, 1580, 1592, 1604, 1616, 1628, + 1640, 1652, 1676, 1688, 1700, 1712, 1724, 1736, + 1748, 1760, 1772, 1784, 1796, 1808, 1820, 1832, + 1844, 1856, 1868, 1880, 1892, 1904, 1916, 1928, + 1940, 1952, 1964, 1976, 1988, 2000, 2012, 2024, + 2036, 2048, 2060, 2072, 2084, 2096, 2108, 2120, + 2132, 2144, 2156, 2168, 2180, 2192, 2204, 2216, + 2228, 2240, 2252, 2264, 2276, 2288, 2300, 2312, + 2324, 2336, 2348, 2360, 2372, 2384, 2396, 2408, + 2420, 2432, 2444, 2456, 2468, 2480, 2492, 2504, + 2516, 2528, 2540, 2552, 2564, 2576, 2588, 2600, + 2612, 2624, 2636, 2648, 2660, 2672, 2684, 2696, + 2708, 2720, 2732, 2744, 2756, 2768, 2780, 2792, + 2804, 2816, 2828, 2840, 2852, 2864, 2876, 2888, + 2900, 2912, 2924, 2936, 2948, 2960, 2972, 2984, + 2996, 3008, 3020, 3032, 3044, 3056, 3068, 3080, + 3092, 3104, 3116, 3128, 3140, 3152, 3164, 3176, + 3188, 3200, 3212, 3224, 3236, 3248, 3260, 3272, + 3284, 3296, 3308, 3320, 3332, 3344, 3356, 3368, + 3380, 3392, 3404, 3416, 3428, 3440, 3452, 3464, + 3476, 3488, 3500, 3512, 3524, 3536, 3548, 3560, + 3572, 3584, 3596, 3608, 3620, 3632, 3644, 3656, + 3668, 3680, 3692, 3704, 3716, 3728, 3740, 3752, + 3764, 3776, 3788, 3800, 3812, 3824, 3836, 3848, + 3860, 3872, 3884, 3896, 3908, 3920, 3932, 3944, + 3956, 3968, 3980, 3992, 4004, 4016, 4028, 4040, + 4052, 4064, 4076, 4088, 4100, 4112, 4124, 4136, + 4148, 4172, 4184, 4196, 4208, 4220, 4232, 4244, + 4256, 4268, 4280, 4292, 4304, 4316, 4328, 4340, + 4352, 4364, 4376, 4388, 4400, 4412, 4424, 4436, + 4448, 4460, 4472, 4484, 4496, 4508, 4520, 4532, + 4544, 4556, 4568, 4580, 4592, 4604, 4616, 4628, + 4640, 4652, 4664, 4676, 4688, 4700, 4712, 4724, + 4736, 4748, 4760, 4772, 4784, 4796, 4808, 4820, + 4832, 4844, 4856, 4868, 4880, 4892, 4904, 4916, + 4928, 4940, 4952, 4964, 4976, 4988, 5000, 5012, + 5024, 5036, 5048, 5060, 5072, 5084, 5096, 5108, + 5120, 5132, 5144, 5156, 5168, 5180, 5192, 5204, + 5216, 5228, 5240, 5252, 5264, 5276, 5288, 5300, + 5312, 5324, 5336, 5348, 5360, 5372, 5384, 5396, + 5408, 5420, 5432, 5444, 5456, 5468, 5480, 5492, + 5504, 5516, 5528, 5540, 5552, 5564, 5576, 5588, + 5600, 5612, 5624, 5636, 5648, 5660, 5672, 5684, + 5696, 5708, 5720, 5732, 5744, 5756, 5768, 5780, + 5792, 5804, 5816, 5828, 5840, 5852, 5864, 5876, + 5888, 5900, 5912, 5924, 5936, 5948, 5960, 5972, + 5984, 5996, 6008, 6020, 6032, 6044, 6056, 6068, + 6080, 6092, 6104, 6116, 6128, 6140, 6152, 6164, + 6176, 6188, 6200, 6212, 6224, 6236, 6248, 6260, + 6272, 6284, 6296, 6308, 6320, 6332, 6344, 6356, + 6368, 6380, 6392, 6404, 6416, 6428, 6440, 6452, + 6464, 6476, 6488, 6500, 6512, 6524, 6536, 6548, + 6560, 6572, 6584, 6596, 6608, 6620, 6632, 6644, + 6668, 6680, 6692, 6704, 6716, 6728, 6740, 6752, + 6764, 6776, 6788, 6800, 6812, 6824, 6836, 6848, + 6860, 6872, 6884, 6896, 6908, 6920, 6932, 6944, + 6956, 6968, 6980, 6992, 7004, 7016, 7028, 7040, + 7052, 7064, 7076, 7088, 7100, 7112, 7124, 7136, + 7148, 7160, 7172, 7184, 7196, 7208, 7220, 7232, + 7244, 7256, 7268, 7280, 7292, 7304, 7316, 7328, + 7340, 7352, 7364, 7376, 7388, 7400, 7412, 7424, + 7436, 7448, 7460, 7472, 7484, 7496, 7508, 7520, + 7532, 7544, 7556, 7568, 7580, 7592, 7604, 7616, + 7628, 7640, 7652, 7664, 7676, 7688, 7700, 7712, + 7724, 7736, 7748, 7760, 7772, 7784, 7796, 7808, + 7820, 7832, 7844, 7856, 7868, 7880, 7892, 7904, + 7916, 7928, 7940, 7952, 7964, 7976, 7988, 8000, + 8012, 8024, 8036, 8048, 8060, 8072, 8084, 8096, + 8108, 8120, 8132, 8144, 8156, 8168, 8180, 8192, + 8204, 8216, 8228, 8240, 8252, 8264, 8276, 8288, + 8300, 8312, 8324, 8336, 8348, 8360, 8372, 8384, + 8396, 8408, 8420, 8432, 8444, 8456, 8468, 8480, + 8492, 8504, 8516, 8528, 8540, 8552, 8564, 8576, + 8588, 8600, 8612, 8624, 8636, 8648, 8660, 8672, + 8684, 8696, 8708, 8720, 8732, 8744, 8756, 8768, + 8780, 8792, 8804, 8816, 8828, 8840, 8852, 8864, + 8876, 8888, 8900, 8912, 8924, 8936, 8948, 8960, + 8972, 8984, 8996, 9008, 9020, 9032, 9044, 9056, + 9068, 9080, 9092, 9104, 9116, 9128, 9140, 9164, + 9176, 9188, 9200, 9212, 9224, 9236, 9248, 9260, + 9272, 9284, 9296, 9308, 9320, 9332, 9344, 9356, + 9368, 9380, 9392, 9404, 9416, 9428, 9440, 9452, + 9464, 9476, 9488, 9500, 9512, 9524, 9536, 9548, + 9560, 9572, 9584, 9596, 9608, 9620, 9632, 9644, + 9656, 9668, 9680, 9692, 9704, 9716, 9728, 9740, + 9752, 9764, 9776, 9788, 9800, 9812, 9824, 9836, + 9848, 9860, 9872, 9884, 9896, 9908, 9920, 9932, + 9944, 9956, 9968, 9980, }, + /* 5 */ + {9, 21, 33, 45, 57, 69, 81, 93, + 105, 117, 129, 141, 153, 165, 177, 189, + 201, 213, 225, 237, 249, 261, 273, 285, + 297, 309, 321, 333, 345, 357, 369, 381, + 393, 405, 417, 429, 441, 453, 465, 477, + 489, 501, 513, 525, 537, 549, 561, 573, + 585, 597, 609, 621, 633, 645, 657, 669, + 681, 693, 705, 717, 729, 741, 753, 765, + 777, 789, 801, 813, 825, 837, 849, 861, + 873, 885, 897, 909, 921, 933, 945, 957, + 969, 981, 993, 1005, 1017, 1029, 1041, 1053, + 1065, 1077, 1089, 1101, 1113, 1125, 1137, 1149, + 1161, 1173, 1185, 1197, 1209, 1221, 1233, 1245, + 1257, 1269, 1281, 1293, 1305, 1317, 1329, 1341, + 1353, 1365, 1377, 1389, 1401, 1413, 1425, 1437, + 1449, 1461, 1473, 1485, 1497, 1509, 1521, 1533, + 1545, 1557, 1569, 1581, 1593, 1605, 1617, 1629, + 1641, 1653, 1677, 1689, 1701, 1713, 1725, 1737, + 1749, 1761, 1773, 1785, 1797, 1809, 1821, 1833, + 1845, 1857, 1869, 1881, 1893, 1905, 1917, 1929, + 1941, 1953, 1965, 1977, 1989, 2001, 2013, 2025, + 2037, 2049, 2061, 2073, 2085, 2097, 2109, 2121, + 2133, 2145, 2157, 2169, 2181, 2193, 2205, 2217, + 2229, 2241, 2253, 2265, 2277, 2289, 2301, 2313, + 2325, 2337, 2349, 2361, 2373, 2385, 2397, 2409, + 2421, 2433, 2445, 2457, 2469, 2481, 2493, 2505, + 2517, 2529, 2541, 2553, 2565, 2577, 2589, 2601, + 2613, 2625, 2637, 2649, 2661, 2673, 2685, 2697, + 2709, 2721, 2733, 2745, 2757, 2769, 2781, 2793, + 2805, 2817, 2829, 2841, 2853, 2865, 2877, 2889, + 2901, 2913, 2925, 2937, 2949, 2961, 2973, 2985, + 2997, 3009, 3021, 3033, 3045, 3057, 3069, 3081, + 3093, 3105, 3117, 3129, 3141, 3153, 3165, 3177, + 3189, 3201, 3213, 3225, 3237, 3249, 3261, 3273, + 3285, 3297, 3309, 3321, 3333, 3345, 3357, 3369, + 3381, 3393, 3405, 3417, 3429, 3441, 3453, 3465, + 3477, 3489, 3501, 3513, 3525, 3537, 3549, 3561, + 3573, 3585, 3597, 3609, 3621, 3633, 3645, 3657, + 3669, 3681, 3693, 3705, 3717, 3729, 3741, 3753, + 3765, 3777, 3789, 3801, 3813, 3825, 3837, 3849, + 3861, 3873, 3885, 3897, 3909, 3921, 3933, 3945, + 3957, 3969, 3981, 3993, 4005, 4017, 4029, 4041, + 4053, 4065, 4077, 4089, 4101, 4113, 4125, 4137, + 4149, 4173, 4185, 4197, 4209, 4221, 4233, 4245, + 4257, 4269, 4281, 4293, 4305, 4317, 4329, 4341, + 4353, 4365, 4377, 4389, 4401, 4413, 4425, 4437, + 4449, 4461, 4473, 4485, 4497, 4509, 4521, 4533, + 4545, 4557, 4569, 4581, 4593, 4605, 4617, 4629, + 4641, 4653, 4665, 4677, 4689, 4701, 4713, 4725, + 4737, 4749, 4761, 4773, 4785, 4797, 4809, 4821, + 4833, 4845, 4857, 4869, 4881, 4893, 4905, 4917, + 4929, 4941, 4953, 4965, 4977, 4989, 5001, 5013, + 5025, 5037, 5049, 5061, 5073, 5085, 5097, 5109, + 5121, 5133, 5145, 5157, 5169, 5181, 5193, 5205, + 5217, 5229, 5241, 5253, 5265, 5277, 5289, 5301, + 5313, 5325, 5337, 5349, 5361, 5373, 5385, 5397, + 5409, 5421, 5433, 5445, 5457, 5469, 5481, 5493, + 5505, 5517, 5529, 5541, 5553, 5565, 5577, 5589, + 5601, 5613, 5625, 5637, 5649, 5661, 5673, 5685, + 5697, 5709, 5721, 5733, 5745, 5757, 5769, 5781, + 5793, 5805, 5817, 5829, 5841, 5853, 5865, 5877, + 5889, 5901, 5913, 5925, 5937, 5949, 5961, 5973, + 5985, 5997, 6009, 6021, 6033, 6045, 6057, 6069, + 6081, 6093, 6105, 6117, 6129, 6141, 6153, 6165, + 6177, 6189, 6201, 6213, 6225, 6237, 6249, 6261, + 6273, 6285, 6297, 6309, 6321, 6333, 6345, 6357, + 6369, 6381, 6393, 6405, 6417, 6429, 6441, 6453, + 6465, 6477, 6489, 6501, 6513, 6525, 6537, 6549, + 6561, 6573, 6585, 6597, 6609, 6621, 6633, 6645, + 6669, 6681, 6693, 6705, 6717, 6729, 6741, 6753, + 6765, 6777, 6789, 6801, 6813, 6825, 6837, 6849, + 6861, 6873, 6885, 6897, 6909, 6921, 6933, 6945, + 6957, 6969, 6981, 6993, 7005, 7017, 7029, 7041, + 7053, 7065, 7077, 7089, 7101, 7113, 7125, 7137, + 7149, 7161, 7173, 7185, 7197, 7209, 7221, 7233, + 7245, 7257, 7269, 7281, 7293, 7305, 7317, 7329, + 7341, 7353, 7365, 7377, 7389, 7401, 7413, 7425, + 7437, 7449, 7461, 7473, 7485, 7497, 7509, 7521, + 7533, 7545, 7557, 7569, 7581, 7593, 7605, 7617, + 7629, 7641, 7653, 7665, 7677, 7689, 7701, 7713, + 7725, 7737, 7749, 7761, 7773, 7785, 7797, 7809, + 7821, 7833, 7845, 7857, 7869, 7881, 7893, 7905, + 7917, 7929, 7941, 7953, 7965, 7977, 7989, 8001, + 8013, 8025, 8037, 8049, 8061, 8073, 8085, 8097, + 8109, 8121, 8133, 8145, 8157, 8169, 8181, 8193, + 8205, 8217, 8229, 8241, 8253, 8265, 8277, 8289, + 8301, 8313, 8325, 8337, 8349, 8361, 8373, 8385, + 8397, 8409, 8421, 8433, 8445, 8457, 8469, 8481, + 8493, 8505, 8517, 8529, 8541, 8553, 8565, 8577, + 8589, 8601, 8613, 8625, 8637, 8649, 8661, 8673, + 8685, 8697, 8709, 8721, 8733, 8745, 8757, 8769, + 8781, 8793, 8805, 8817, 8829, 8841, 8853, 8865, + 8877, 8889, 8901, 8913, 8925, 8937, 8949, 8961, + 8973, 8985, 8997, 9009, 9021, 9033, 9045, 9057, + 9069, 9081, 9093, 9105, 9117, 9129, 9141, 9165, + 9177, 9189, 9201, 9213, 9225, 9237, 9249, 9261, + 9273, 9285, 9297, 9309, 9321, 9333, 9345, 9357, + 9369, 9381, 9393, 9405, 9417, 9429, 9441, 9453, + 9465, 9477, 9489, 9501, 9513, 9525, 9537, 9549, + 9561, 9573, 9585, 9597, 9609, 9621, 9633, 9645, + 9657, 9669, 9681, 9693, 9705, 9717, 9729, 9741, + 9753, 9765, 9777, 9789, 9801, 9813, 9825, 9837, + 9849, 9861, 9873, 9885, 9897, 9909, 9921, 9933, + 9945, 9957, 9969, 9981, }, + /* 6 */ + {10, 22, 34, 46, 58, 70, 82, 94, + 106, 118, 130, 142, 154, 166, 178, 190, + 202, 214, 226, 238, 250, 262, 274, 286, + 298, 310, 322, 334, 346, 358, 370, 382, + 394, 406, 418, 430, 442, 454, 466, 478, + 490, 502, 514, 526, 538, 550, 562, 574, + 586, 598, 610, 622, 634, 646, 658, 670, + 682, 694, 706, 718, 730, 742, 754, 766, + 778, 790, 802, 814, 826, 838, 850, 862, + 874, 886, 898, 910, 922, 934, 946, 958, + 970, 982, 994, 1006, 1018, 1030, 1042, 1054, + 1066, 1078, 1090, 1102, 1114, 1126, 1138, 1150, + 1162, 1174, 1186, 1198, 1210, 1222, 1234, 1246, + 1258, 1270, 1282, 1294, 1306, 1318, 1330, 1342, + 1354, 1366, 1378, 1390, 1402, 1414, 1426, 1438, + 1450, 1462, 1474, 1486, 1498, 1510, 1522, 1534, + 1546, 1558, 1570, 1582, 1594, 1606, 1618, 1630, + 1642, 1654, 1678, 1690, 1702, 1714, 1726, 1738, + 1750, 1762, 1774, 1786, 1798, 1810, 1822, 1834, + 1846, 1858, 1870, 1882, 1894, 1906, 1918, 1930, + 1942, 1954, 1966, 1978, 1990, 2002, 2014, 2026, + 2038, 2050, 2062, 2074, 2086, 2098, 2110, 2122, + 2134, 2146, 2158, 2170, 2182, 2194, 2206, 2218, + 2230, 2242, 2254, 2266, 2278, 2290, 2302, 2314, + 2326, 2338, 2350, 2362, 2374, 2386, 2398, 2410, + 2422, 2434, 2446, 2458, 2470, 2482, 2494, 2506, + 2518, 2530, 2542, 2554, 2566, 2578, 2590, 2602, + 2614, 2626, 2638, 2650, 2662, 2674, 2686, 2698, + 2710, 2722, 2734, 2746, 2758, 2770, 2782, 2794, + 2806, 2818, 2830, 2842, 2854, 2866, 2878, 2890, + 2902, 2914, 2926, 2938, 2950, 2962, 2974, 2986, + 2998, 3010, 3022, 3034, 3046, 3058, 3070, 3082, + 3094, 3106, 3118, 3130, 3142, 3154, 3166, 3178, + 3190, 3202, 3214, 3226, 3238, 3250, 3262, 3274, + 3286, 3298, 3310, 3322, 3334, 3346, 3358, 3370, + 3382, 3394, 3406, 3418, 3430, 3442, 3454, 3466, + 3478, 3490, 3502, 3514, 3526, 3538, 3550, 3562, + 3574, 3586, 3598, 3610, 3622, 3634, 3646, 3658, + 3670, 3682, 3694, 3706, 3718, 3730, 3742, 3754, + 3766, 3778, 3790, 3802, 3814, 3826, 3838, 3850, + 3862, 3874, 3886, 3898, 3910, 3922, 3934, 3946, + 3958, 3970, 3982, 3994, 4006, 4018, 4030, 4042, + 4054, 4066, 4078, 4090, 4102, 4114, 4126, 4138, + 4150, 4174, 4186, 4198, 4210, 4222, 4234, 4246, + 4258, 4270, 4282, 4294, 4306, 4318, 4330, 4342, + 4354, 4366, 4378, 4390, 4402, 4414, 4426, 4438, + 4450, 4462, 4474, 4486, 4498, 4510, 4522, 4534, + 4546, 4558, 4570, 4582, 4594, 4606, 4618, 4630, + 4642, 4654, 4666, 4678, 4690, 4702, 4714, 4726, + 4738, 4750, 4762, 4774, 4786, 4798, 4810, 4822, + 4834, 4846, 4858, 4870, 4882, 4894, 4906, 4918, + 4930, 4942, 4954, 4966, 4978, 4990, 5002, 5014, + 5026, 5038, 5050, 5062, 5074, 5086, 5098, 5110, + 5122, 5134, 5146, 5158, 5170, 5182, 5194, 5206, + 5218, 5230, 5242, 5254, 5266, 5278, 5290, 5302, + 5314, 5326, 5338, 5350, 5362, 5374, 5386, 5398, + 5410, 5422, 5434, 5446, 5458, 5470, 5482, 5494, + 5506, 5518, 5530, 5542, 5554, 5566, 5578, 5590, + 5602, 5614, 5626, 5638, 5650, 5662, 5674, 5686, + 5698, 5710, 5722, 5734, 5746, 5758, 5770, 5782, + 5794, 5806, 5818, 5830, 5842, 5854, 5866, 5878, + 5890, 5902, 5914, 5926, 5938, 5950, 5962, 5974, + 5986, 5998, 6010, 6022, 6034, 6046, 6058, 6070, + 6082, 6094, 6106, 6118, 6130, 6142, 6154, 6166, + 6178, 6190, 6202, 6214, 6226, 6238, 6250, 6262, + 6274, 6286, 6298, 6310, 6322, 6334, 6346, 6358, + 6370, 6382, 6394, 6406, 6418, 6430, 6442, 6454, + 6466, 6478, 6490, 6502, 6514, 6526, 6538, 6550, + 6562, 6574, 6586, 6598, 6610, 6622, 6634, 6646, + 6670, 6682, 6694, 6706, 6718, 6730, 6742, 6754, + 6766, 6778, 6790, 6802, 6814, 6826, 6838, 6850, + 6862, 6874, 6886, 6898, 6910, 6922, 6934, 6946, + 6958, 6970, 6982, 6994, 7006, 7018, 7030, 7042, + 7054, 7066, 7078, 7090, 7102, 7114, 7126, 7138, + 7150, 7162, 7174, 7186, 7198, 7210, 7222, 7234, + 7246, 7258, 7270, 7282, 7294, 7306, 7318, 7330, + 7342, 7354, 7366, 7378, 7390, 7402, 7414, 7426, + 7438, 7450, 7462, 7474, 7486, 7498, 7510, 7522, + 7534, 7546, 7558, 7570, 7582, 7594, 7606, 7618, + 7630, 7642, 7654, 7666, 7678, 7690, 7702, 7714, + 7726, 7738, 7750, 7762, 7774, 7786, 7798, 7810, + 7822, 7834, 7846, 7858, 7870, 7882, 7894, 7906, + 7918, 7930, 7942, 7954, 7966, 7978, 7990, 8002, + 8014, 8026, 8038, 8050, 8062, 8074, 8086, 8098, + 8110, 8122, 8134, 8146, 8158, 8170, 8182, 8194, + 8206, 8218, 8230, 8242, 8254, 8266, 8278, 8290, + 8302, 8314, 8326, 8338, 8350, 8362, 8374, 8386, + 8398, 8410, 8422, 8434, 8446, 8458, 8470, 8482, + 8494, 8506, 8518, 8530, 8542, 8554, 8566, 8578, + 8590, 8602, 8614, 8626, 8638, 8650, 8662, 8674, + 8686, 8698, 8710, 8722, 8734, 8746, 8758, 8770, + 8782, 8794, 8806, 8818, 8830, 8842, 8854, 8866, + 8878, 8890, 8902, 8914, 8926, 8938, 8950, 8962, + 8974, 8986, 8998, 9010, 9022, 9034, 9046, 9058, + 9070, 9082, 9094, 9106, 9118, 9130, 9142, 9166, + 9178, 9190, 9202, 9214, 9226, 9238, 9250, 9262, + 9274, 9286, 9298, 9310, 9322, 9334, 9346, 9358, + 9370, 9382, 9394, 9406, 9418, 9430, 9442, 9454, + 9466, 9478, 9490, 9502, 9514, 9526, 9538, 9550, + 9562, 9574, 9586, 9598, 9610, 9622, 9634, 9646, + 9658, 9670, 9682, 9694, 9706, 9718, 9730, 9742, + 9754, 9766, 9778, 9790, 9802, 9814, 9826, 9838, + 9850, 9862, 9874, 9886, 9898, 9910, 9922, 9934, + 9946, 9958, 9970, 9982, }, + /* 7 */ + {11, 23, 35, 47, 59, 71, 83, 95, + 107, 119, 131, 143, 155, 167, 179, 191, + 203, 215, 227, 239, 251, 263, 275, 287, + 299, 311, 323, 335, 347, 359, 371, 383, + 395, 407, 419, 431, 443, 455, 467, 479, + 491, 503, 515, 527, 539, 551, 563, 575, + 587, 599, 611, 623, 635, 647, 659, 671, + 683, 695, 707, 719, 731, 743, 755, 767, + 779, 791, 803, 815, 827, 839, 851, 863, + 875, 887, 899, 911, 923, 935, 947, 959, + 971, 983, 995, 1007, 1019, 1031, 1043, 1055, + 1067, 1079, 1091, 1103, 1115, 1127, 1139, 1151, + 1163, 1175, 1187, 1199, 1211, 1223, 1235, 1247, + 1259, 1271, 1283, 1295, 1307, 1319, 1331, 1343, + 1355, 1367, 1379, 1391, 1403, 1415, 1427, 1439, + 1451, 1463, 1475, 1487, 1499, 1511, 1523, 1535, + 1547, 1559, 1571, 1583, 1595, 1607, 1619, 1631, + 1643, 1655, 1679, 1691, 1703, 1715, 1727, 1739, + 1751, 1763, 1775, 1787, 1799, 1811, 1823, 1835, + 1847, 1859, 1871, 1883, 1895, 1907, 1919, 1931, + 1943, 1955, 1967, 1979, 1991, 2003, 2015, 2027, + 2039, 2051, 2063, 2075, 2087, 2099, 2111, 2123, + 2135, 2147, 2159, 2171, 2183, 2195, 2207, 2219, + 2231, 2243, 2255, 2267, 2279, 2291, 2303, 2315, + 2327, 2339, 2351, 2363, 2375, 2387, 2399, 2411, + 2423, 2435, 2447, 2459, 2471, 2483, 2495, 2507, + 2519, 2531, 2543, 2555, 2567, 2579, 2591, 2603, + 2615, 2627, 2639, 2651, 2663, 2675, 2687, 2699, + 2711, 2723, 2735, 2747, 2759, 2771, 2783, 2795, + 2807, 2819, 2831, 2843, 2855, 2867, 2879, 2891, + 2903, 2915, 2927, 2939, 2951, 2963, 2975, 2987, + 2999, 3011, 3023, 3035, 3047, 3059, 3071, 3083, + 3095, 3107, 3119, 3131, 3143, 3155, 3167, 3179, + 3191, 3203, 3215, 3227, 3239, 3251, 3263, 3275, + 3287, 3299, 3311, 3323, 3335, 3347, 3359, 3371, + 3383, 3395, 3407, 3419, 3431, 3443, 3455, 3467, + 3479, 3491, 3503, 3515, 3527, 3539, 3551, 3563, + 3575, 3587, 3599, 3611, 3623, 3635, 3647, 3659, + 3671, 3683, 3695, 3707, 3719, 3731, 3743, 3755, + 3767, 3779, 3791, 3803, 3815, 3827, 3839, 3851, + 3863, 3875, 3887, 3899, 3911, 3923, 3935, 3947, + 3959, 3971, 3983, 3995, 4007, 4019, 4031, 4043, + 4055, 4067, 4079, 4091, 4103, 4115, 4127, 4139, + 4151, 4175, 4187, 4199, 4211, 4223, 4235, 4247, + 4259, 4271, 4283, 4295, 4307, 4319, 4331, 4343, + 4355, 4367, 4379, 4391, 4403, 4415, 4427, 4439, + 4451, 4463, 4475, 4487, 4499, 4511, 4523, 4535, + 4547, 4559, 4571, 4583, 4595, 4607, 4619, 4631, + 4643, 4655, 4667, 4679, 4691, 4703, 4715, 4727, + 4739, 4751, 4763, 4775, 4787, 4799, 4811, 4823, + 4835, 4847, 4859, 4871, 4883, 4895, 4907, 4919, + 4931, 4943, 4955, 4967, 4979, 4991, 5003, 5015, + 5027, 5039, 5051, 5063, 5075, 5087, 5099, 5111, + 5123, 5135, 5147, 5159, 5171, 5183, 5195, 5207, + 5219, 5231, 5243, 5255, 5267, 5279, 5291, 5303, + 5315, 5327, 5339, 5351, 5363, 5375, 5387, 5399, + 5411, 5423, 5435, 5447, 5459, 5471, 5483, 5495, + 5507, 5519, 5531, 5543, 5555, 5567, 5579, 5591, + 5603, 5615, 5627, 5639, 5651, 5663, 5675, 5687, + 5699, 5711, 5723, 5735, 5747, 5759, 5771, 5783, + 5795, 5807, 5819, 5831, 5843, 5855, 5867, 5879, + 5891, 5903, 5915, 5927, 5939, 5951, 5963, 5975, + 5987, 5999, 6011, 6023, 6035, 6047, 6059, 6071, + 6083, 6095, 6107, 6119, 6131, 6143, 6155, 6167, + 6179, 6191, 6203, 6215, 6227, 6239, 6251, 6263, + 6275, 6287, 6299, 6311, 6323, 6335, 6347, 6359, + 6371, 6383, 6395, 6407, 6419, 6431, 6443, 6455, + 6467, 6479, 6491, 6503, 6515, 6527, 6539, 6551, + 6563, 6575, 6587, 6599, 6611, 6623, 6635, 6647, + 6671, 6683, 6695, 6707, 6719, 6731, 6743, 6755, + 6767, 6779, 6791, 6803, 6815, 6827, 6839, 6851, + 6863, 6875, 6887, 6899, 6911, 6923, 6935, 6947, + 6959, 6971, 6983, 6995, 7007, 7019, 7031, 7043, + 7055, 7067, 7079, 7091, 7103, 7115, 7127, 7139, + 7151, 7163, 7175, 7187, 7199, 7211, 7223, 7235, + 7247, 7259, 7271, 7283, 7295, 7307, 7319, 7331, + 7343, 7355, 7367, 7379, 7391, 7403, 7415, 7427, + 7439, 7451, 7463, 7475, 7487, 7499, 7511, 7523, + 7535, 7547, 7559, 7571, 7583, 7595, 7607, 7619, + 7631, 7643, 7655, 7667, 7679, 7691, 7703, 7715, + 7727, 7739, 7751, 7763, 7775, 7787, 7799, 7811, + 7823, 7835, 7847, 7859, 7871, 7883, 7895, 7907, + 7919, 7931, 7943, 7955, 7967, 7979, 7991, 8003, + 8015, 8027, 8039, 8051, 8063, 8075, 8087, 8099, + 8111, 8123, 8135, 8147, 8159, 8171, 8183, 8195, + 8207, 8219, 8231, 8243, 8255, 8267, 8279, 8291, + 8303, 8315, 8327, 8339, 8351, 8363, 8375, 8387, + 8399, 8411, 8423, 8435, 8447, 8459, 8471, 8483, + 8495, 8507, 8519, 8531, 8543, 8555, 8567, 8579, + 8591, 8603, 8615, 8627, 8639, 8651, 8663, 8675, + 8687, 8699, 8711, 8723, 8735, 8747, 8759, 8771, + 8783, 8795, 8807, 8819, 8831, 8843, 8855, 8867, + 8879, 8891, 8903, 8915, 8927, 8939, 8951, 8963, + 8975, 8987, 8999, 9011, 9023, 9035, 9047, 9059, + 9071, 9083, 9095, 9107, 9119, 9131, 9143, 9167, + 9179, 9191, 9203, 9215, 9227, 9239, 9251, 9263, + 9275, 9287, 9299, 9311, 9323, 9335, 9347, 9359, + 9371, 9383, 9395, 9407, 9419, 9431, 9443, 9455, + 9467, 9479, 9491, 9503, 9515, 9527, 9539, 9551, + 9563, 9575, 9587, 9599, 9611, 9623, 9635, 9647, + 9659, 9671, 9683, 9695, 9707, 9719, 9731, 9743, + 9755, 9767, 9779, 9791, 9803, 9815, 9827, 9839, + 9851, 9863, 9875, 9887, 9899, 9911, 9923, 9935, + 9947, 9959, 9971, 9983, }, + /* 8 */ + {12, 24, 36, 48, 60, 72, 84, 96, + 108, 120, 132, 144, 156, 168, 180, 192, + 204, 216, 228, 240, 252, 264, 276, 288, + 300, 312, 324, 336, 348, 360, 372, 384, + 396, 408, 420, 432, 444, 456, 468, 480, + 492, 504, 516, 528, 540, 552, 564, 576, + 588, 600, 612, 624, 636, 648, 660, 672, + 684, 696, 708, 720, 732, 744, 756, 768, + 780, 792, 804, 816, 828, 840, 852, 864, + 876, 888, 900, 912, 924, 936, 948, 960, + 972, 984, 996, 1008, 1020, 1032, 1044, 1056, + 1068, 1080, 1092, 1104, 1116, 1128, 1140, 1152, + 1164, 1176, 1188, 1200, 1212, 1224, 1236, 1248, + 1260, 1272, 1284, 1296, 1308, 1320, 1332, 1344, + 1356, 1368, 1380, 1392, 1404, 1416, 1428, 1440, + 1452, 1464, 1476, 1488, 1500, 1512, 1524, 1536, + 1548, 1560, 1572, 1584, 1596, 1608, 1620, 1632, + 1644, 1656, 1668, 1680, 1692, 1704, 1716, 1728, + 1740, 1752, 1764, 1776, 1788, 1800, 1812, 1824, + 1836, 1848, 1860, 1872, 1884, 1896, 1908, 1920, + 1932, 1944, 1956, 1968, 1980, 1992, 2004, 2016, + 2028, 2040, 2052, 2064, 2076, 2088, 2100, 2112, + 2124, 2136, 2148, 2160, 2172, 2184, 2196, 2208, + 2220, 2232, 2244, 2256, 2268, 2280, 2292, 2304, + 2316, 2328, 2340, 2352, 2364, 2376, 2388, 2400, + 2412, 2424, 2436, 2448, 2460, 2472, 2484, 2508, + 2520, 2532, 2544, 2556, 2568, 2580, 2592, 2604, + 2616, 2628, 2640, 2652, 2664, 2676, 2688, 2700, + 2712, 2724, 2736, 2748, 2760, 2772, 2784, 2796, + 2808, 2820, 2832, 2844, 2856, 2868, 2880, 2892, + 2904, 2916, 2928, 2940, 2952, 2964, 2976, 2988, + 3000, 3012, 3024, 3036, 3048, 3060, 3072, 3084, + 3096, 3108, 3120, 3132, 3144, 3156, 3168, 3180, + 3192, 3204, 3216, 3228, 3240, 3252, 3264, 3276, + 3288, 3300, 3312, 3324, 3336, 3348, 3360, 3372, + 3384, 3396, 3408, 3420, 3432, 3444, 3456, 3468, + 3480, 3492, 3504, 3516, 3528, 3540, 3552, 3564, + 3576, 3588, 3600, 3612, 3624, 3636, 3648, 3660, + 3672, 3684, 3696, 3708, 3720, 3732, 3744, 3756, + 3768, 3780, 3792, 3804, 3816, 3828, 3840, 3852, + 3864, 3876, 3888, 3900, 3912, 3924, 3936, 3948, + 3960, 3972, 3984, 3996, 4008, 4020, 4032, 4044, + 4056, 4068, 4080, 4092, 4104, 4116, 4128, 4140, + 4152, 4164, 4176, 4188, 4200, 4212, 4224, 4236, + 4248, 4260, 4272, 4284, 4296, 4308, 4320, 4332, + 4344, 4356, 4368, 4380, 4392, 4404, 4416, 4428, + 4440, 4452, 4464, 4476, 4488, 4500, 4512, 4524, + 4536, 4548, 4560, 4572, 4584, 4596, 4608, 4620, + 4632, 4644, 4656, 4668, 4680, 4692, 4704, 4716, + 4728, 4740, 4752, 4764, 4776, 4788, 4800, 4812, + 4824, 4836, 4848, 4860, 4872, 4884, 4896, 4908, + 4920, 4932, 4944, 4956, 4968, 4980, 5004, 5016, + 5028, 5040, 5052, 5064, 5076, 5088, 5100, 5112, + 5124, 5136, 5148, 5160, 5172, 5184, 5196, 5208, + 5220, 5232, 5244, 5256, 5268, 5280, 5292, 5304, + 5316, 5328, 5340, 5352, 5364, 5376, 5388, 5400, + 5412, 5424, 5436, 5448, 5460, 5472, 5484, 5496, + 5508, 5520, 5532, 5544, 5556, 5568, 5580, 5592, + 5604, 5616, 5628, 5640, 5652, 5664, 5676, 5688, + 5700, 5712, 5724, 5736, 5748, 5760, 5772, 5784, + 5796, 5808, 5820, 5832, 5844, 5856, 5868, 5880, + 5892, 5904, 5916, 5928, 5940, 5952, 5964, 5976, + 5988, 6000, 6012, 6024, 6036, 6048, 6060, 6072, + 6084, 6096, 6108, 6120, 6132, 6144, 6156, 6168, + 6180, 6192, 6204, 6216, 6228, 6240, 6252, 6264, + 6276, 6288, 6300, 6312, 6324, 6336, 6348, 6360, + 6372, 6384, 6396, 6408, 6420, 6432, 6444, 6456, + 6468, 6480, 6492, 6504, 6516, 6528, 6540, 6552, + 6564, 6576, 6588, 6600, 6612, 6624, 6636, 6648, + 6660, 6672, 6684, 6696, 6708, 6720, 6732, 6744, + 6756, 6768, 6780, 6792, 6804, 6816, 6828, 6840, + 6852, 6864, 6876, 6888, 6900, 6912, 6924, 6936, + 6948, 6960, 6972, 6984, 6996, 7008, 7020, 7032, + 7044, 7056, 7068, 7080, 7092, 7104, 7116, 7128, + 7140, 7152, 7164, 7176, 7188, 7200, 7212, 7224, + 7236, 7248, 7260, 7272, 7284, 7296, 7308, 7320, + 7332, 7344, 7356, 7368, 7380, 7392, 7404, 7416, + 7428, 7440, 7452, 7464, 7476, 7500, 7512, 7524, + 7536, 7548, 7560, 7572, 7584, 7596, 7608, 7620, + 7632, 7644, 7656, 7668, 7680, 7692, 7704, 7716, + 7728, 7740, 7752, 7764, 7776, 7788, 7800, 7812, + 7824, 7836, 7848, 7860, 7872, 7884, 7896, 7908, + 7920, 7932, 7944, 7956, 7968, 7980, 7992, 8004, + 8016, 8028, 8040, 8052, 8064, 8076, 8088, 8100, + 8112, 8124, 8136, 8148, 8160, 8172, 8184, 8196, + 8208, 8220, 8232, 8244, 8256, 8268, 8280, 8292, + 8304, 8316, 8328, 8340, 8352, 8364, 8376, 8388, + 8400, 8412, 8424, 8436, 8448, 8460, 8472, 8484, + 8496, 8508, 8520, 8532, 8544, 8556, 8568, 8580, + 8592, 8604, 8616, 8628, 8640, 8652, 8664, 8676, + 8688, 8700, 8712, 8724, 8736, 8748, 8760, 8772, + 8784, 8796, 8808, 8820, 8832, 8844, 8856, 8868, + 8880, 8892, 8904, 8916, 8928, 8940, 8952, 8964, + 8976, 8988, 9000, 9012, 9024, 9036, 9048, 9060, + 9072, 9084, 9096, 9108, 9120, 9132, 9144, 9156, + 9168, 9180, 9192, 9204, 9216, 9228, 9240, 9252, + 9264, 9276, 9288, 9300, 9312, 9324, 9336, 9348, + 9360, 9372, 9384, 9396, 9408, 9420, 9432, 9444, + 9456, 9468, 9480, 9492, 9504, 9516, 9528, 9540, + 9552, 9564, 9576, 9588, 9600, 9612, 9624, 9636, + 9648, 9660, 9672, 9684, 9696, 9708, 9720, 9732, + 9744, 9756, 9768, 9780, 9792, 9804, 9816, 9828, + 9840, 9852, 9864, 9876, 9888, 9900, 9912, 9924, + 9936, 9948, 9960, 9972, }, + /* 9 */ + {13, 25, 37, 49, 61, 73, 85, 97, + 109, 121, 133, 145, 157, 169, 181, 193, + 205, 217, 229, 241, 253, 265, 277, 289, + 301, 313, 325, 337, 349, 361, 373, 385, + 397, 409, 421, 433, 445, 457, 469, 481, + 493, 505, 517, 529, 541, 553, 565, 577, + 589, 601, 613, 625, 637, 649, 661, 673, + 685, 697, 709, 721, 733, 745, 757, 769, + 781, 793, 805, 817, 829, 841, 853, 865, + 877, 889, 901, 913, 925, 937, 949, 961, + 973, 985, 997, 1009, 1021, 1033, 1045, 1057, + 1069, 1081, 1093, 1105, 1117, 1129, 1141, 1153, + 1165, 1177, 1189, 1201, 1213, 1225, 1237, 1249, + 1261, 1273, 1285, 1297, 1309, 1321, 1333, 1345, + 1357, 1369, 1381, 1393, 1405, 1417, 1429, 1441, + 1453, 1465, 1477, 1489, 1501, 1513, 1525, 1537, + 1549, 1561, 1573, 1585, 1597, 1609, 1621, 1633, + 1645, 1657, 1669, 1681, 1693, 1705, 1717, 1729, + 1741, 1753, 1765, 1777, 1789, 1801, 1813, 1825, + 1837, 1849, 1861, 1873, 1885, 1897, 1909, 1921, + 1933, 1945, 1957, 1969, 1981, 1993, 2005, 2017, + 2029, 2041, 2053, 2065, 2077, 2089, 2101, 2113, + 2125, 2137, 2149, 2161, 2173, 2185, 2197, 2209, + 2221, 2233, 2245, 2257, 2269, 2281, 2293, 2305, + 2317, 2329, 2341, 2353, 2365, 2377, 2389, 2401, + 2413, 2425, 2437, 2449, 2461, 2473, 2485, 2509, + 2521, 2533, 2545, 2557, 2569, 2581, 2593, 2605, + 2617, 2629, 2641, 2653, 2665, 2677, 2689, 2701, + 2713, 2725, 2737, 2749, 2761, 2773, 2785, 2797, + 2809, 2821, 2833, 2845, 2857, 2869, 2881, 2893, + 2905, 2917, 2929, 2941, 2953, 2965, 2977, 2989, + 3001, 3013, 3025, 3037, 3049, 3061, 3073, 3085, + 3097, 3109, 3121, 3133, 3145, 3157, 3169, 3181, + 3193, 3205, 3217, 3229, 3241, 3253, 3265, 3277, + 3289, 3301, 3313, 3325, 3337, 3349, 3361, 3373, + 3385, 3397, 3409, 3421, 3433, 3445, 3457, 3469, + 3481, 3493, 3505, 3517, 3529, 3541, 3553, 3565, + 3577, 3589, 3601, 3613, 3625, 3637, 3649, 3661, + 3673, 3685, 3697, 3709, 3721, 3733, 3745, 3757, + 3769, 3781, 3793, 3805, 3817, 3829, 3841, 3853, + 3865, 3877, 3889, 3901, 3913, 3925, 3937, 3949, + 3961, 3973, 3985, 3997, 4009, 4021, 4033, 4045, + 4057, 4069, 4081, 4093, 4105, 4117, 4129, 4141, + 4153, 4165, 4177, 4189, 4201, 4213, 4225, 4237, + 4249, 4261, 4273, 4285, 4297, 4309, 4321, 4333, + 4345, 4357, 4369, 4381, 4393, 4405, 4417, 4429, + 4441, 4453, 4465, 4477, 4489, 4501, 4513, 4525, + 4537, 4549, 4561, 4573, 4585, 4597, 4609, 4621, + 4633, 4645, 4657, 4669, 4681, 4693, 4705, 4717, + 4729, 4741, 4753, 4765, 4777, 4789, 4801, 4813, + 4825, 4837, 4849, 4861, 4873, 4885, 4897, 4909, + 4921, 4933, 4945, 4957, 4969, 4981, 5005, 5017, + 5029, 5041, 5053, 5065, 5077, 5089, 5101, 5113, + 5125, 5137, 5149, 5161, 5173, 5185, 5197, 5209, + 5221, 5233, 5245, 5257, 5269, 5281, 5293, 5305, + 5317, 5329, 5341, 5353, 5365, 5377, 5389, 5401, + 5413, 5425, 5437, 5449, 5461, 5473, 5485, 5497, + 5509, 5521, 5533, 5545, 5557, 5569, 5581, 5593, + 5605, 5617, 5629, 5641, 5653, 5665, 5677, 5689, + 5701, 5713, 5725, 5737, 5749, 5761, 5773, 5785, + 5797, 5809, 5821, 5833, 5845, 5857, 5869, 5881, + 5893, 5905, 5917, 5929, 5941, 5953, 5965, 5977, + 5989, 6001, 6013, 6025, 6037, 6049, 6061, 6073, + 6085, 6097, 6109, 6121, 6133, 6145, 6157, 6169, + 6181, 6193, 6205, 6217, 6229, 6241, 6253, 6265, + 6277, 6289, 6301, 6313, 6325, 6337, 6349, 6361, + 6373, 6385, 6397, 6409, 6421, 6433, 6445, 6457, + 6469, 6481, 6493, 6505, 6517, 6529, 6541, 6553, + 6565, 6577, 6589, 6601, 6613, 6625, 6637, 6649, + 6661, 6673, 6685, 6697, 6709, 6721, 6733, 6745, + 6757, 6769, 6781, 6793, 6805, 6817, 6829, 6841, + 6853, 6865, 6877, 6889, 6901, 6913, 6925, 6937, + 6949, 6961, 6973, 6985, 6997, 7009, 7021, 7033, + 7045, 7057, 7069, 7081, 7093, 7105, 7117, 7129, + 7141, 7153, 7165, 7177, 7189, 7201, 7213, 7225, + 7237, 7249, 7261, 7273, 7285, 7297, 7309, 7321, + 7333, 7345, 7357, 7369, 7381, 7393, 7405, 7417, + 7429, 7441, 7453, 7465, 7477, 7501, 7513, 7525, + 7537, 7549, 7561, 7573, 7585, 7597, 7609, 7621, + 7633, 7645, 7657, 7669, 7681, 7693, 7705, 7717, + 7729, 7741, 7753, 7765, 7777, 7789, 7801, 7813, + 7825, 7837, 7849, 7861, 7873, 7885, 7897, 7909, + 7921, 7933, 7945, 7957, 7969, 7981, 7993, 8005, + 8017, 8029, 8041, 8053, 8065, 8077, 8089, 8101, + 8113, 8125, 8137, 8149, 8161, 8173, 8185, 8197, + 8209, 8221, 8233, 8245, 8257, 8269, 8281, 8293, + 8305, 8317, 8329, 8341, 8353, 8365, 8377, 8389, + 8401, 8413, 8425, 8437, 8449, 8461, 8473, 8485, + 8497, 8509, 8521, 8533, 8545, 8557, 8569, 8581, + 8593, 8605, 8617, 8629, 8641, 8653, 8665, 8677, + 8689, 8701, 8713, 8725, 8737, 8749, 8761, 8773, + 8785, 8797, 8809, 8821, 8833, 8845, 8857, 8869, + 8881, 8893, 8905, 8917, 8929, 8941, 8953, 8965, + 8977, 8989, 9001, 9013, 9025, 9037, 9049, 9061, + 9073, 9085, 9097, 9109, 9121, 9133, 9145, 9157, + 9169, 9181, 9193, 9205, 9217, 9229, 9241, 9253, + 9265, 9277, 9289, 9301, 9313, 9325, 9337, 9349, + 9361, 9373, 9385, 9397, 9409, 9421, 9433, 9445, + 9457, 9469, 9481, 9493, 9505, 9517, 9529, 9541, + 9553, 9565, 9577, 9589, 9601, 9613, 9625, 9637, + 9649, 9661, 9673, 9685, 9697, 9709, 9721, 9733, + 9745, 9757, 9769, 9781, 9793, 9805, 9817, 9829, + 9841, 9853, 9865, 9877, 9889, 9901, 9913, 9925, + 9937, 9949, 9961, 9973, }, + /* 10 */ + {14, 26, 38, 50, 62, 74, 86, 98, + 110, 122, 134, 146, 158, 170, 182, 194, + 206, 218, 230, 242, 254, 266, 278, 290, + 302, 314, 326, 338, 350, 362, 374, 386, + 398, 410, 422, 434, 446, 458, 470, 482, + 494, 506, 518, 530, 542, 554, 566, 578, + 590, 602, 614, 626, 638, 650, 662, 674, + 686, 698, 710, 722, 734, 746, 758, 770, + 782, 794, 806, 818, 830, 842, 854, 866, + 878, 890, 902, 914, 926, 938, 950, 962, + 974, 986, 998, 1010, 1022, 1034, 1046, 1058, + 1070, 1082, 1094, 1106, 1118, 1130, 1142, 1154, + 1166, 1178, 1190, 1202, 1214, 1226, 1238, 1250, + 1262, 1274, 1286, 1298, 1310, 1322, 1334, 1346, + 1358, 1370, 1382, 1394, 1406, 1418, 1430, 1442, + 1454, 1466, 1478, 1490, 1502, 1514, 1526, 1538, + 1550, 1562, 1574, 1586, 1598, 1610, 1622, 1634, + 1646, 1658, 1670, 1682, 1694, 1706, 1718, 1730, + 1742, 1754, 1766, 1778, 1790, 1802, 1814, 1826, + 1838, 1850, 1862, 1874, 1886, 1898, 1910, 1922, + 1934, 1946, 1958, 1970, 1982, 1994, 2006, 2018, + 2030, 2042, 2054, 2066, 2078, 2090, 2102, 2114, + 2126, 2138, 2150, 2162, 2174, 2186, 2198, 2210, + 2222, 2234, 2246, 2258, 2270, 2282, 2294, 2306, + 2318, 2330, 2342, 2354, 2366, 2378, 2390, 2402, + 2414, 2426, 2438, 2450, 2462, 2474, 2486, 2510, + 2522, 2534, 2546, 2558, 2570, 2582, 2594, 2606, + 2618, 2630, 2642, 2654, 2666, 2678, 2690, 2702, + 2714, 2726, 2738, 2750, 2762, 2774, 2786, 2798, + 2810, 2822, 2834, 2846, 2858, 2870, 2882, 2894, + 2906, 2918, 2930, 2942, 2954, 2966, 2978, 2990, + 3002, 3014, 3026, 3038, 3050, 3062, 3074, 3086, + 3098, 3110, 3122, 3134, 3146, 3158, 3170, 3182, + 3194, 3206, 3218, 3230, 3242, 3254, 3266, 3278, + 3290, 3302, 3314, 3326, 3338, 3350, 3362, 3374, + 3386, 3398, 3410, 3422, 3434, 3446, 3458, 3470, + 3482, 3494, 3506, 3518, 3530, 3542, 3554, 3566, + 3578, 3590, 3602, 3614, 3626, 3638, 3650, 3662, + 3674, 3686, 3698, 3710, 3722, 3734, 3746, 3758, + 3770, 3782, 3794, 3806, 3818, 3830, 3842, 3854, + 3866, 3878, 3890, 3902, 3914, 3926, 3938, 3950, + 3962, 3974, 3986, 3998, 4010, 4022, 4034, 4046, + 4058, 4070, 4082, 4094, 4106, 4118, 4130, 4142, + 4154, 4166, 4178, 4190, 4202, 4214, 4226, 4238, + 4250, 4262, 4274, 4286, 4298, 4310, 4322, 4334, + 4346, 4358, 4370, 4382, 4394, 4406, 4418, 4430, + 4442, 4454, 4466, 4478, 4490, 4502, 4514, 4526, + 4538, 4550, 4562, 4574, 4586, 4598, 4610, 4622, + 4634, 4646, 4658, 4670, 4682, 4694, 4706, 4718, + 4730, 4742, 4754, 4766, 4778, 4790, 4802, 4814, + 4826, 4838, 4850, 4862, 4874, 4886, 4898, 4910, + 4922, 4934, 4946, 4958, 4970, 4982, 5006, 5018, + 5030, 5042, 5054, 5066, 5078, 5090, 5102, 5114, + 5126, 5138, 5150, 5162, 5174, 5186, 5198, 5210, + 5222, 5234, 5246, 5258, 5270, 5282, 5294, 5306, + 5318, 5330, 5342, 5354, 5366, 5378, 5390, 5402, + 5414, 5426, 5438, 5450, 5462, 5474, 5486, 5498, + 5510, 5522, 5534, 5546, 5558, 5570, 5582, 5594, + 5606, 5618, 5630, 5642, 5654, 5666, 5678, 5690, + 5702, 5714, 5726, 5738, 5750, 5762, 5774, 5786, + 5798, 5810, 5822, 5834, 5846, 5858, 5870, 5882, + 5894, 5906, 5918, 5930, 5942, 5954, 5966, 5978, + 5990, 6002, 6014, 6026, 6038, 6050, 6062, 6074, + 6086, 6098, 6110, 6122, 6134, 6146, 6158, 6170, + 6182, 6194, 6206, 6218, 6230, 6242, 6254, 6266, + 6278, 6290, 6302, 6314, 6326, 6338, 6350, 6362, + 6374, 6386, 6398, 6410, 6422, 6434, 6446, 6458, + 6470, 6482, 6494, 6506, 6518, 6530, 6542, 6554, + 6566, 6578, 6590, 6602, 6614, 6626, 6638, 6650, + 6662, 6674, 6686, 6698, 6710, 6722, 6734, 6746, + 6758, 6770, 6782, 6794, 6806, 6818, 6830, 6842, + 6854, 6866, 6878, 6890, 6902, 6914, 6926, 6938, + 6950, 6962, 6974, 6986, 6998, 7010, 7022, 7034, + 7046, 7058, 7070, 7082, 7094, 7106, 7118, 7130, + 7142, 7154, 7166, 7178, 7190, 7202, 7214, 7226, + 7238, 7250, 7262, 7274, 7286, 7298, 7310, 7322, + 7334, 7346, 7358, 7370, 7382, 7394, 7406, 7418, + 7430, 7442, 7454, 7466, 7478, 7502, 7514, 7526, + 7538, 7550, 7562, 7574, 7586, 7598, 7610, 7622, + 7634, 7646, 7658, 7670, 7682, 7694, 7706, 7718, + 7730, 7742, 7754, 7766, 7778, 7790, 7802, 7814, + 7826, 7838, 7850, 7862, 7874, 7886, 7898, 7910, + 7922, 7934, 7946, 7958, 7970, 7982, 7994, 8006, + 8018, 8030, 8042, 8054, 8066, 8078, 8090, 8102, + 8114, 8126, 8138, 8150, 8162, 8174, 8186, 8198, + 8210, 8222, 8234, 8246, 8258, 8270, 8282, 8294, + 8306, 8318, 8330, 8342, 8354, 8366, 8378, 8390, + 8402, 8414, 8426, 8438, 8450, 8462, 8474, 8486, + 8498, 8510, 8522, 8534, 8546, 8558, 8570, 8582, + 8594, 8606, 8618, 8630, 8642, 8654, 8666, 8678, + 8690, 8702, 8714, 8726, 8738, 8750, 8762, 8774, + 8786, 8798, 8810, 8822, 8834, 8846, 8858, 8870, + 8882, 8894, 8906, 8918, 8930, 8942, 8954, 8966, + 8978, 8990, 9002, 9014, 9026, 9038, 9050, 9062, + 9074, 9086, 9098, 9110, 9122, 9134, 9146, 9158, + 9170, 9182, 9194, 9206, 9218, 9230, 9242, 9254, + 9266, 9278, 9290, 9302, 9314, 9326, 9338, 9350, + 9362, 9374, 9386, 9398, 9410, 9422, 9434, 9446, + 9458, 9470, 9482, 9494, 9506, 9518, 9530, 9542, + 9554, 9566, 9578, 9590, 9602, 9614, 9626, 9638, + 9650, 9662, 9674, 9686, 9698, 9710, 9722, 9734, + 9746, 9758, 9770, 9782, 9794, 9806, 9818, 9830, + 9842, 9854, 9866, 9878, 9890, 9902, 9914, 9926, + 9938, 9950, 9962, 9974, }, + /* 11 */ + {15, 27, 39, 51, 63, 75, 87, 99, + 111, 123, 135, 147, 159, 171, 183, 195, + 207, 219, 231, 243, 255, 267, 279, 291, + 303, 315, 327, 339, 351, 363, 375, 387, + 399, 411, 423, 435, 447, 459, 471, 483, + 495, 507, 519, 531, 543, 555, 567, 579, + 591, 603, 615, 627, 639, 651, 663, 675, + 687, 699, 711, 723, 735, 747, 759, 771, + 783, 795, 807, 819, 831, 843, 855, 867, + 879, 891, 903, 915, 927, 939, 951, 963, + 975, 987, 999, 1011, 1023, 1035, 1047, 1059, + 1071, 1083, 1095, 1107, 1119, 1131, 1143, 1155, + 1167, 1179, 1191, 1203, 1215, 1227, 1239, 1251, + 1263, 1275, 1287, 1299, 1311, 1323, 1335, 1347, + 1359, 1371, 1383, 1395, 1407, 1419, 1431, 1443, + 1455, 1467, 1479, 1491, 1503, 1515, 1527, 1539, + 1551, 1563, 1575, 1587, 1599, 1611, 1623, 1635, + 1647, 1659, 1671, 1683, 1695, 1707, 1719, 1731, + 1743, 1755, 1767, 1779, 1791, 1803, 1815, 1827, + 1839, 1851, 1863, 1875, 1887, 1899, 1911, 1923, + 1935, 1947, 1959, 1971, 1983, 1995, 2007, 2019, + 2031, 2043, 2055, 2067, 2079, 2091, 2103, 2115, + 2127, 2139, 2151, 2163, 2175, 2187, 2199, 2211, + 2223, 2235, 2247, 2259, 2271, 2283, 2295, 2307, + 2319, 2331, 2343, 2355, 2367, 2379, 2391, 2403, + 2415, 2427, 2439, 2451, 2463, 2475, 2487, 2511, + 2523, 2535, 2547, 2559, 2571, 2583, 2595, 2607, + 2619, 2631, 2643, 2655, 2667, 2679, 2691, 2703, + 2715, 2727, 2739, 2751, 2763, 2775, 2787, 2799, + 2811, 2823, 2835, 2847, 2859, 2871, 2883, 2895, + 2907, 2919, 2931, 2943, 2955, 2967, 2979, 2991, + 3003, 3015, 3027, 3039, 3051, 3063, 3075, 3087, + 3099, 3111, 3123, 3135, 3147, 3159, 3171, 3183, + 3195, 3207, 3219, 3231, 3243, 3255, 3267, 3279, + 3291, 3303, 3315, 3327, 3339, 3351, 3363, 3375, + 3387, 3399, 3411, 3423, 3435, 3447, 3459, 3471, + 3483, 3495, 3507, 3519, 3531, 3543, 3555, 3567, + 3579, 3591, 3603, 3615, 3627, 3639, 3651, 3663, + 3675, 3687, 3699, 3711, 3723, 3735, 3747, 3759, + 3771, 3783, 3795, 3807, 3819, 3831, 3843, 3855, + 3867, 3879, 3891, 3903, 3915, 3927, 3939, 3951, + 3963, 3975, 3987, 3999, 4011, 4023, 4035, 4047, + 4059, 4071, 4083, 4095, 4107, 4119, 4131, 4143, + 4155, 4167, 4179, 4191, 4203, 4215, 4227, 4239, + 4251, 4263, 4275, 4287, 4299, 4311, 4323, 4335, + 4347, 4359, 4371, 4383, 4395, 4407, 4419, 4431, + 4443, 4455, 4467, 4479, 4491, 4503, 4515, 4527, + 4539, 4551, 4563, 4575, 4587, 4599, 4611, 4623, + 4635, 4647, 4659, 4671, 4683, 4695, 4707, 4719, + 4731, 4743, 4755, 4767, 4779, 4791, 4803, 4815, + 4827, 4839, 4851, 4863, 4875, 4887, 4899, 4911, + 4923, 4935, 4947, 4959, 4971, 4983, 5007, 5019, + 5031, 5043, 5055, 5067, 5079, 5091, 5103, 5115, + 5127, 5139, 5151, 5163, 5175, 5187, 5199, 5211, + 5223, 5235, 5247, 5259, 5271, 5283, 5295, 5307, + 5319, 5331, 5343, 5355, 5367, 5379, 5391, 5403, + 5415, 5427, 5439, 5451, 5463, 5475, 5487, 5499, + 5511, 5523, 5535, 5547, 5559, 5571, 5583, 5595, + 5607, 5619, 5631, 5643, 5655, 5667, 5679, 5691, + 5703, 5715, 5727, 5739, 5751, 5763, 5775, 5787, + 5799, 5811, 5823, 5835, 5847, 5859, 5871, 5883, + 5895, 5907, 5919, 5931, 5943, 5955, 5967, 5979, + 5991, 6003, 6015, 6027, 6039, 6051, 6063, 6075, + 6087, 6099, 6111, 6123, 6135, 6147, 6159, 6171, + 6183, 6195, 6207, 6219, 6231, 6243, 6255, 6267, + 6279, 6291, 6303, 6315, 6327, 6339, 6351, 6363, + 6375, 6387, 6399, 6411, 6423, 6435, 6447, 6459, + 6471, 6483, 6495, 6507, 6519, 6531, 6543, 6555, + 6567, 6579, 6591, 6603, 6615, 6627, 6639, 6651, + 6663, 6675, 6687, 6699, 6711, 6723, 6735, 6747, + 6759, 6771, 6783, 6795, 6807, 6819, 6831, 6843, + 6855, 6867, 6879, 6891, 6903, 6915, 6927, 6939, + 6951, 6963, 6975, 6987, 6999, 7011, 7023, 7035, + 7047, 7059, 7071, 7083, 7095, 7107, 7119, 7131, + 7143, 7155, 7167, 7179, 7191, 7203, 7215, 7227, + 7239, 7251, 7263, 7275, 7287, 7299, 7311, 7323, + 7335, 7347, 7359, 7371, 7383, 7395, 7407, 7419, + 7431, 7443, 7455, 7467, 7479, 7503, 7515, 7527, + 7539, 7551, 7563, 7575, 7587, 7599, 7611, 7623, + 7635, 7647, 7659, 7671, 7683, 7695, 7707, 7719, + 7731, 7743, 7755, 7767, 7779, 7791, 7803, 7815, + 7827, 7839, 7851, 7863, 7875, 7887, 7899, 7911, + 7923, 7935, 7947, 7959, 7971, 7983, 7995, 8007, + 8019, 8031, 8043, 8055, 8067, 8079, 8091, 8103, + 8115, 8127, 8139, 8151, 8163, 8175, 8187, 8199, + 8211, 8223, 8235, 8247, 8259, 8271, 8283, 8295, + 8307, 8319, 8331, 8343, 8355, 8367, 8379, 8391, + 8403, 8415, 8427, 8439, 8451, 8463, 8475, 8487, + 8499, 8511, 8523, 8535, 8547, 8559, 8571, 8583, + 8595, 8607, 8619, 8631, 8643, 8655, 8667, 8679, + 8691, 8703, 8715, 8727, 8739, 8751, 8763, 8775, + 8787, 8799, 8811, 8823, 8835, 8847, 8859, 8871, + 8883, 8895, 8907, 8919, 8931, 8943, 8955, 8967, + 8979, 8991, 9003, 9015, 9027, 9039, 9051, 9063, + 9075, 9087, 9099, 9111, 9123, 9135, 9147, 9159, + 9171, 9183, 9195, 9207, 9219, 9231, 9243, 9255, + 9267, 9279, 9291, 9303, 9315, 9327, 9339, 9351, + 9363, 9375, 9387, 9399, 9411, 9423, 9435, 9447, + 9459, 9471, 9483, 9495, 9507, 9519, 9531, 9543, + 9555, 9567, 9579, 9591, 9603, 9615, 9627, 9639, + 9651, 9663, 9675, 9687, 9699, 9711, 9723, 9735, + 9747, 9759, 9771, 9783, 9795, 9807, 9819, 9831, + 9843, 9855, 9867, 9879, 9891, 9903, 9915, 9927, + 9939, 9951, 9963, 9975, }, +}; + +const unsigned int enco_which_dibits[12][828] = { + /* 0 */ + {6, 4, 2, 0, 102, 100, 98, 96, + 198, 196, 194, 192, 294, 292, 290, 288, + 390, 388, 386, 384, 486, 484, 482, 480, + 582, 580, 578, 576, 678, 676, 674, 672, + 774, 772, 770, 768, 870, 868, 866, 864, + 966, 964, 962, 960, 1062, 1060, 1058, 1056, + 1158, 1156, 1154, 1152, 1254, 1252, 1250, 1248, + 1350, 1348, 1346, 1344, 1446, 1444, 1442, 1440, + 1542, 1540, 1538, 1536, 1638, 1636, 1634, 1632, + 1798, 1796, 1794, 1792, 1894, 1892, 1890, 1888, + 1990, 1988, 1986, 1984, 2086, 2084, 2082, 2080, + 2182, 2180, 2178, 2176, 2278, 2276, 2274, 2272, + 2374, 2372, 2370, 2368, 2470, 2468, 2466, 2464, + 2566, 2564, 2562, 2560, 2662, 2660, 2658, 2656, + 2758, 2756, 2754, 2752, 2854, 2852, 2850, 2848, + 2950, 2948, 2946, 2944, 3046, 3044, 3042, 3040, + 3142, 3140, 3138, 3136, 3238, 3236, 3234, 3232, + 3334, 3332, 3330, 3328, 3398, 3396, 3394, 3392, + 3494, 3492, 3490, 3488, 3590, 3588, 3586, 3584, + 3686, 3684, 3682, 3680, 3782, 3780, 3778, 3776, + 3878, 3876, 3874, 3872, 3974, 3972, 3970, 3968, + 4070, 4068, 4066, 4064, 4166, 4164, 4162, 4160, + 4262, 4260, 4258, 4256, 4358, 4356, 4354, 4352, + 4454, 4452, 4450, 4448, 4550, 4548, 4546, 4544, + 4646, 4644, 4642, 4640, 4742, 4740, 4738, 4736, + 4838, 4836, 4834, 4832, 4934, 4932, 4930, 4928, + 4998, 4996, 4994, 4992, 5094, 5092, 5090, 5088, + 5190, 5188, 5186, 5184, 5286, 5284, 5282, 5280, + 5382, 5380, 5378, 5376, 5478, 5476, 5474, 5472, + 5574, 5572, 5570, 5568, 5670, 5668, 5666, 5664, + 5766, 5764, 5762, 5760, 5862, 5860, 5858, 5856, + 5958, 5956, 5954, 5952, 6054, 6052, 6050, 6048, + 6150, 6148, 6146, 6144, 6246, 6244, 6242, 6240, + 6342, 6340, 6338, 6336, 6438, 6436, 6434, 6432, + 6534, 6532, 6530, 6528, 6694, 6692, 6690, 6688, + 6790, 6788, 6786, 6784, 6886, 6884, 6882, 6880, + 6982, 6980, 6978, 6976, 7078, 7076, 7074, 7072, + 7174, 7172, 7170, 7168, 7270, 7268, 7266, 7264, + 7366, 7364, 7362, 7360, 7462, 7460, 7458, 7456, + 7558, 7556, 7554, 7552, 7654, 7652, 7650, 7648, + 7750, 7748, 7746, 7744, 7846, 7844, 7842, 7840, + 7942, 7940, 7938, 7936, 8038, 8036, 8034, 8032, + 8134, 8132, 8130, 8128, 8230, 8228, 8226, 8224, + 8326, 8324, 8322, 8320, 8390, 8388, 8386, 8384, + 8486, 8484, 8482, 8480, 8582, 8580, 8578, 8576, + 8678, 8676, 8674, 8672, 8774, 8772, 8770, 8768, + 8870, 8868, 8866, 8864, 8966, 8964, 8962, 8960, + 9062, 9060, 9058, 9056, 9158, 9156, 9154, 9152, + 9254, 9252, 9250, 9248, 9350, 9348, 9346, 9344, + 9446, 9444, 9442, 9440, 9542, 9540, 9538, 9536, + 9638, 9636, 9634, 9632, 9734, 9732, 9730, 9728, + 9830, 9828, 9826, 9824, 9926, 9924, 9922, 9920, + 9990, 9988, 9986, 9984, 10086, 10084, 10082, 10080, + 10182, 10180, 10178, 10176, 10278, 10276, 10274, 10272, + 10374, 10372, 10370, 10368, 10470, 10468, 10466, 10464, + 10566, 10564, 10562, 10560, 10662, 10660, 10658, 10656, + 10758, 10756, 10754, 10752, 10854, 10852, 10850, 10848, + 10950, 10948, 10946, 10944, 11046, 11044, 11042, 11040, + 11142, 11140, 11138, 11136, 11238, 11236, 11234, 11232, + 11334, 11332, 11330, 11328, 11430, 11428, 11426, 11424, + 11526, 11524, 11522, 11520, 11686, 11684, 11682, 11680, + 11782, 11780, 11778, 11776, 11878, 11876, 11874, 11872, + 11974, 11972, 11970, 11968, 12070, 12068, 12066, 12064, + 12166, 12164, 12162, 12160, 12262, 12260, 12258, 12256, + 12358, 12356, 12354, 12352, 12454, 12452, 12450, 12448, + 12550, 12548, 12546, 12544, 12646, 12644, 12642, 12640, + 12742, 12740, 12738, 12736, 12838, 12836, 12834, 12832, + 12934, 12932, 12930, 12928, 13030, 13028, 13026, 13024, + 13126, 13124, 13122, 13120, 13222, 13220, 13218, 13216, + 13286, 13284, 13282, 13280, 13382, 13380, 13378, 13376, + 13478, 13476, 13474, 13472, 13574, 13572, 13570, 13568, + 13670, 13668, 13666, 13664, 13766, 13764, 13762, 13760, + 13862, 13860, 13858, 13856, 13958, 13956, 13954, 13952, + 14054, 14052, 14050, 14048, 14150, 14148, 14146, 14144, + 14246, 14244, 14242, 14240, 14342, 14340, 14338, 14336, + 14438, 14436, 14434, 14432, 14534, 14532, 14530, 14528, + 14630, 14628, 14626, 14624, 14726, 14724, 14722, 14720, + 14822, 14820, 14818, 14816, 14918, 14916, 14914, 14912, + 14982, 14980, 14978, 14976, 15078, 15076, 15074, 15072, + 15174, 15172, 15170, 15168, 15270, 15268, 15266, 15264, + 15366, 15364, 15362, 15360, 15462, 15460, 15458, 15456, + 15558, 15556, 15554, 15552, 15654, 15652, 15650, 15648, + 15750, 15748, 15746, 15744, 15846, 15844, 15842, 15840, + 15942, 15940, 15938, 15936, 16038, 16036, 16034, 16032, + 16134, 16132, 16130, 16128, 16230, 16228, 16226, 16224, + 16326, 16324, 16322, 16320, 16422, 16420, 16418, 16416, + 16518, 16516, 16514, 16512, 16678, 16676, 16674, 16672, + 16774, 16772, 16770, 16768, 16870, 16868, 16866, 16864, + 16966, 16964, 16962, 16960, 17062, 17060, 17058, 17056, + 17158, 17156, 17154, 17152, 17254, 17252, 17250, 17248, + 17350, 17348, 17346, 17344, 17446, 17444, 17442, 17440, + 17542, 17540, 17538, 17536, 17638, 17636, 17634, 17632, + 17734, 17732, 17730, 17728, 17830, 17828, 17826, 17824, + 17926, 17924, 17922, 17920, 18022, 18020, 18018, 18016, + 18118, 18116, 18114, 18112, 18214, 18212, 18210, 18208, + 18278, 18276, 18274, 18272, 18374, 18372, 18370, 18368, + 18470, 18468, 18466, 18464, 18566, 18564, 18562, 18560, + 18662, 18660, 18658, 18656, 18758, 18756, 18754, 18752, + 18854, 18852, 18850, 18848, 18950, 18948, 18946, 18944, + 19046, 19044, 19042, 19040, 19142, 19140, 19138, 19136, + 19238, 19236, 19234, 19232, 19334, 19332, 19330, 19328, + 19430, 19428, 19426, 19424, 19526, 19524, 19522, 19520, + 19622, 19620, 19618, 19616, 19718, 19716, 19714, 19712, + 19814, 19812, 19810, 19808, }, + /* 1 */ + {14, 12, 10, 8, 110, 108, 106, 104, + 206, 204, 202, 200, 302, 300, 298, 296, + 398, 396, 394, 392, 494, 492, 490, 488, + 590, 588, 586, 584, 686, 684, 682, 680, + 782, 780, 778, 776, 878, 876, 874, 872, + 974, 972, 970, 968, 1070, 1068, 1066, 1064, + 1166, 1164, 1162, 1160, 1262, 1260, 1258, 1256, + 1358, 1356, 1354, 1352, 1454, 1452, 1450, 1448, + 1550, 1548, 1546, 1544, 1646, 1644, 1642, 1640, + 1806, 1804, 1802, 1800, 1902, 1900, 1898, 1896, + 1998, 1996, 1994, 1992, 2094, 2092, 2090, 2088, + 2190, 2188, 2186, 2184, 2286, 2284, 2282, 2280, + 2382, 2380, 2378, 2376, 2478, 2476, 2474, 2472, + 2574, 2572, 2570, 2568, 2670, 2668, 2666, 2664, + 2766, 2764, 2762, 2760, 2862, 2860, 2858, 2856, + 2958, 2956, 2954, 2952, 3054, 3052, 3050, 3048, + 3150, 3148, 3146, 3144, 3246, 3244, 3242, 3240, + 3342, 3340, 3338, 3336, 3406, 3404, 3402, 3400, + 3502, 3500, 3498, 3496, 3598, 3596, 3594, 3592, + 3694, 3692, 3690, 3688, 3790, 3788, 3786, 3784, + 3886, 3884, 3882, 3880, 3982, 3980, 3978, 3976, + 4078, 4076, 4074, 4072, 4174, 4172, 4170, 4168, + 4270, 4268, 4266, 4264, 4366, 4364, 4362, 4360, + 4462, 4460, 4458, 4456, 4558, 4556, 4554, 4552, + 4654, 4652, 4650, 4648, 4750, 4748, 4746, 4744, + 4846, 4844, 4842, 4840, 4942, 4940, 4938, 4936, + 5006, 5004, 5002, 5000, 5102, 5100, 5098, 5096, + 5198, 5196, 5194, 5192, 5294, 5292, 5290, 5288, + 5390, 5388, 5386, 5384, 5486, 5484, 5482, 5480, + 5582, 5580, 5578, 5576, 5678, 5676, 5674, 5672, + 5774, 5772, 5770, 5768, 5870, 5868, 5866, 5864, + 5966, 5964, 5962, 5960, 6062, 6060, 6058, 6056, + 6158, 6156, 6154, 6152, 6254, 6252, 6250, 6248, + 6350, 6348, 6346, 6344, 6446, 6444, 6442, 6440, + 6542, 6540, 6538, 6536, 6702, 6700, 6698, 6696, + 6798, 6796, 6794, 6792, 6894, 6892, 6890, 6888, + 6990, 6988, 6986, 6984, 7086, 7084, 7082, 7080, + 7182, 7180, 7178, 7176, 7278, 7276, 7274, 7272, + 7374, 7372, 7370, 7368, 7470, 7468, 7466, 7464, + 7566, 7564, 7562, 7560, 7662, 7660, 7658, 7656, + 7758, 7756, 7754, 7752, 7854, 7852, 7850, 7848, + 7950, 7948, 7946, 7944, 8046, 8044, 8042, 8040, + 8142, 8140, 8138, 8136, 8238, 8236, 8234, 8232, + 8334, 8332, 8330, 8328, 8398, 8396, 8394, 8392, + 8494, 8492, 8490, 8488, 8590, 8588, 8586, 8584, + 8686, 8684, 8682, 8680, 8782, 8780, 8778, 8776, + 8878, 8876, 8874, 8872, 8974, 8972, 8970, 8968, + 9070, 9068, 9066, 9064, 9166, 9164, 9162, 9160, + 9262, 9260, 9258, 9256, 9358, 9356, 9354, 9352, + 9454, 9452, 9450, 9448, 9550, 9548, 9546, 9544, + 9646, 9644, 9642, 9640, 9742, 9740, 9738, 9736, + 9838, 9836, 9834, 9832, 9934, 9932, 9930, 9928, + 9998, 9996, 9994, 9992, 10094, 10092, 10090, 10088, + 10190, 10188, 10186, 10184, 10286, 10284, 10282, 10280, + 10382, 10380, 10378, 10376, 10478, 10476, 10474, 10472, + 10574, 10572, 10570, 10568, 10670, 10668, 10666, 10664, + 10766, 10764, 10762, 10760, 10862, 10860, 10858, 10856, + 10958, 10956, 10954, 10952, 11054, 11052, 11050, 11048, + 11150, 11148, 11146, 11144, 11246, 11244, 11242, 11240, + 11342, 11340, 11338, 11336, 11438, 11436, 11434, 11432, + 11534, 11532, 11530, 11528, 11694, 11692, 11690, 11688, + 11790, 11788, 11786, 11784, 11886, 11884, 11882, 11880, + 11982, 11980, 11978, 11976, 12078, 12076, 12074, 12072, + 12174, 12172, 12170, 12168, 12270, 12268, 12266, 12264, + 12366, 12364, 12362, 12360, 12462, 12460, 12458, 12456, + 12558, 12556, 12554, 12552, 12654, 12652, 12650, 12648, + 12750, 12748, 12746, 12744, 12846, 12844, 12842, 12840, + 12942, 12940, 12938, 12936, 13038, 13036, 13034, 13032, + 13134, 13132, 13130, 13128, 13230, 13228, 13226, 13224, + 13294, 13292, 13290, 13288, 13390, 13388, 13386, 13384, + 13486, 13484, 13482, 13480, 13582, 13580, 13578, 13576, + 13678, 13676, 13674, 13672, 13774, 13772, 13770, 13768, + 13870, 13868, 13866, 13864, 13966, 13964, 13962, 13960, + 14062, 14060, 14058, 14056, 14158, 14156, 14154, 14152, + 14254, 14252, 14250, 14248, 14350, 14348, 14346, 14344, + 14446, 14444, 14442, 14440, 14542, 14540, 14538, 14536, + 14638, 14636, 14634, 14632, 14734, 14732, 14730, 14728, + 14830, 14828, 14826, 14824, 14926, 14924, 14922, 14920, + 14990, 14988, 14986, 14984, 15086, 15084, 15082, 15080, + 15182, 15180, 15178, 15176, 15278, 15276, 15274, 15272, + 15374, 15372, 15370, 15368, 15470, 15468, 15466, 15464, + 15566, 15564, 15562, 15560, 15662, 15660, 15658, 15656, + 15758, 15756, 15754, 15752, 15854, 15852, 15850, 15848, + 15950, 15948, 15946, 15944, 16046, 16044, 16042, 16040, + 16142, 16140, 16138, 16136, 16238, 16236, 16234, 16232, + 16334, 16332, 16330, 16328, 16430, 16428, 16426, 16424, + 16526, 16524, 16522, 16520, 16686, 16684, 16682, 16680, + 16782, 16780, 16778, 16776, 16878, 16876, 16874, 16872, + 16974, 16972, 16970, 16968, 17070, 17068, 17066, 17064, + 17166, 17164, 17162, 17160, 17262, 17260, 17258, 17256, + 17358, 17356, 17354, 17352, 17454, 17452, 17450, 17448, + 17550, 17548, 17546, 17544, 17646, 17644, 17642, 17640, + 17742, 17740, 17738, 17736, 17838, 17836, 17834, 17832, + 17934, 17932, 17930, 17928, 18030, 18028, 18026, 18024, + 18126, 18124, 18122, 18120, 18222, 18220, 18218, 18216, + 18286, 18284, 18282, 18280, 18382, 18380, 18378, 18376, + 18478, 18476, 18474, 18472, 18574, 18572, 18570, 18568, + 18670, 18668, 18666, 18664, 18766, 18764, 18762, 18760, + 18862, 18860, 18858, 18856, 18958, 18956, 18954, 18952, + 19054, 19052, 19050, 19048, 19150, 19148, 19146, 19144, + 19246, 19244, 19242, 19240, 19342, 19340, 19338, 19336, + 19438, 19436, 19434, 19432, 19534, 19532, 19530, 19528, + 19630, 19628, 19626, 19624, 19726, 19724, 19722, 19720, + 19822, 19820, 19818, 19816, }, + /* 2 */ + {22, 20, 18, 16, 118, 116, 114, 112, + 214, 212, 210, 208, 310, 308, 306, 304, + 406, 404, 402, 400, 502, 500, 498, 496, + 598, 596, 594, 592, 694, 692, 690, 688, + 790, 788, 786, 784, 886, 884, 882, 880, + 982, 980, 978, 976, 1078, 1076, 1074, 1072, + 1174, 1172, 1170, 1168, 1270, 1268, 1266, 1264, + 1366, 1364, 1362, 1360, 1462, 1460, 1458, 1456, + 1558, 1556, 1554, 1552, 1654, 1652, 1650, 1648, + 1814, 1812, 1810, 1808, 1910, 1908, 1906, 1904, + 2006, 2004, 2002, 2000, 2102, 2100, 2098, 2096, + 2198, 2196, 2194, 2192, 2294, 2292, 2290, 2288, + 2390, 2388, 2386, 2384, 2486, 2484, 2482, 2480, + 2582, 2580, 2578, 2576, 2678, 2676, 2674, 2672, + 2774, 2772, 2770, 2768, 2870, 2868, 2866, 2864, + 2966, 2964, 2962, 2960, 3062, 3060, 3058, 3056, + 3158, 3156, 3154, 3152, 3254, 3252, 3250, 3248, + 3350, 3348, 3346, 3344, 3414, 3412, 3410, 3408, + 3510, 3508, 3506, 3504, 3606, 3604, 3602, 3600, + 3702, 3700, 3698, 3696, 3798, 3796, 3794, 3792, + 3894, 3892, 3890, 3888, 3990, 3988, 3986, 3984, + 4086, 4084, 4082, 4080, 4182, 4180, 4178, 4176, + 4278, 4276, 4274, 4272, 4374, 4372, 4370, 4368, + 4470, 4468, 4466, 4464, 4566, 4564, 4562, 4560, + 4662, 4660, 4658, 4656, 4758, 4756, 4754, 4752, + 4854, 4852, 4850, 4848, 4950, 4948, 4946, 4944, + 5014, 5012, 5010, 5008, 5110, 5108, 5106, 5104, + 5206, 5204, 5202, 5200, 5302, 5300, 5298, 5296, + 5398, 5396, 5394, 5392, 5494, 5492, 5490, 5488, + 5590, 5588, 5586, 5584, 5686, 5684, 5682, 5680, + 5782, 5780, 5778, 5776, 5878, 5876, 5874, 5872, + 5974, 5972, 5970, 5968, 6070, 6068, 6066, 6064, + 6166, 6164, 6162, 6160, 6262, 6260, 6258, 6256, + 6358, 6356, 6354, 6352, 6454, 6452, 6450, 6448, + 6550, 6548, 6546, 6544, 6710, 6708, 6706, 6704, + 6806, 6804, 6802, 6800, 6902, 6900, 6898, 6896, + 6998, 6996, 6994, 6992, 7094, 7092, 7090, 7088, + 7190, 7188, 7186, 7184, 7286, 7284, 7282, 7280, + 7382, 7380, 7378, 7376, 7478, 7476, 7474, 7472, + 7574, 7572, 7570, 7568, 7670, 7668, 7666, 7664, + 7766, 7764, 7762, 7760, 7862, 7860, 7858, 7856, + 7958, 7956, 7954, 7952, 8054, 8052, 8050, 8048, + 8150, 8148, 8146, 8144, 8246, 8244, 8242, 8240, + 8342, 8340, 8338, 8336, 8406, 8404, 8402, 8400, + 8502, 8500, 8498, 8496, 8598, 8596, 8594, 8592, + 8694, 8692, 8690, 8688, 8790, 8788, 8786, 8784, + 8886, 8884, 8882, 8880, 8982, 8980, 8978, 8976, + 9078, 9076, 9074, 9072, 9174, 9172, 9170, 9168, + 9270, 9268, 9266, 9264, 9366, 9364, 9362, 9360, + 9462, 9460, 9458, 9456, 9558, 9556, 9554, 9552, + 9654, 9652, 9650, 9648, 9750, 9748, 9746, 9744, + 9846, 9844, 9842, 9840, 9942, 9940, 9938, 9936, + 10006, 10004, 10002, 10000, 10102, 10100, 10098, 10096, + 10198, 10196, 10194, 10192, 10294, 10292, 10290, 10288, + 10390, 10388, 10386, 10384, 10486, 10484, 10482, 10480, + 10582, 10580, 10578, 10576, 10678, 10676, 10674, 10672, + 10774, 10772, 10770, 10768, 10870, 10868, 10866, 10864, + 10966, 10964, 10962, 10960, 11062, 11060, 11058, 11056, + 11158, 11156, 11154, 11152, 11254, 11252, 11250, 11248, + 11350, 11348, 11346, 11344, 11446, 11444, 11442, 11440, + 11542, 11540, 11538, 11536, 11702, 11700, 11698, 11696, + 11798, 11796, 11794, 11792, 11894, 11892, 11890, 11888, + 11990, 11988, 11986, 11984, 12086, 12084, 12082, 12080, + 12182, 12180, 12178, 12176, 12278, 12276, 12274, 12272, + 12374, 12372, 12370, 12368, 12470, 12468, 12466, 12464, + 12566, 12564, 12562, 12560, 12662, 12660, 12658, 12656, + 12758, 12756, 12754, 12752, 12854, 12852, 12850, 12848, + 12950, 12948, 12946, 12944, 13046, 13044, 13042, 13040, + 13142, 13140, 13138, 13136, 13238, 13236, 13234, 13232, + 13302, 13300, 13298, 13296, 13398, 13396, 13394, 13392, + 13494, 13492, 13490, 13488, 13590, 13588, 13586, 13584, + 13686, 13684, 13682, 13680, 13782, 13780, 13778, 13776, + 13878, 13876, 13874, 13872, 13974, 13972, 13970, 13968, + 14070, 14068, 14066, 14064, 14166, 14164, 14162, 14160, + 14262, 14260, 14258, 14256, 14358, 14356, 14354, 14352, + 14454, 14452, 14450, 14448, 14550, 14548, 14546, 14544, + 14646, 14644, 14642, 14640, 14742, 14740, 14738, 14736, + 14838, 14836, 14834, 14832, 14934, 14932, 14930, 14928, + 14998, 14996, 14994, 14992, 15094, 15092, 15090, 15088, + 15190, 15188, 15186, 15184, 15286, 15284, 15282, 15280, + 15382, 15380, 15378, 15376, 15478, 15476, 15474, 15472, + 15574, 15572, 15570, 15568, 15670, 15668, 15666, 15664, + 15766, 15764, 15762, 15760, 15862, 15860, 15858, 15856, + 15958, 15956, 15954, 15952, 16054, 16052, 16050, 16048, + 16150, 16148, 16146, 16144, 16246, 16244, 16242, 16240, + 16342, 16340, 16338, 16336, 16438, 16436, 16434, 16432, + 16534, 16532, 16530, 16528, 16694, 16692, 16690, 16688, + 16790, 16788, 16786, 16784, 16886, 16884, 16882, 16880, + 16982, 16980, 16978, 16976, 17078, 17076, 17074, 17072, + 17174, 17172, 17170, 17168, 17270, 17268, 17266, 17264, + 17366, 17364, 17362, 17360, 17462, 17460, 17458, 17456, + 17558, 17556, 17554, 17552, 17654, 17652, 17650, 17648, + 17750, 17748, 17746, 17744, 17846, 17844, 17842, 17840, + 17942, 17940, 17938, 17936, 18038, 18036, 18034, 18032, + 18134, 18132, 18130, 18128, 18230, 18228, 18226, 18224, + 18294, 18292, 18290, 18288, 18390, 18388, 18386, 18384, + 18486, 18484, 18482, 18480, 18582, 18580, 18578, 18576, + 18678, 18676, 18674, 18672, 18774, 18772, 18770, 18768, + 18870, 18868, 18866, 18864, 18966, 18964, 18962, 18960, + 19062, 19060, 19058, 19056, 19158, 19156, 19154, 19152, + 19254, 19252, 19250, 19248, 19350, 19348, 19346, 19344, + 19446, 19444, 19442, 19440, 19542, 19540, 19538, 19536, + 19638, 19636, 19634, 19632, 19734, 19732, 19730, 19728, + 19830, 19828, 19826, 19824, }, + /* 3 */ + {30, 28, 26, 24, 126, 124, 122, 120, + 222, 220, 218, 216, 318, 316, 314, 312, + 414, 412, 410, 408, 510, 508, 506, 504, + 606, 604, 602, 600, 702, 700, 698, 696, + 798, 796, 794, 792, 894, 892, 890, 888, + 990, 988, 986, 984, 1086, 1084, 1082, 1080, + 1182, 1180, 1178, 1176, 1278, 1276, 1274, 1272, + 1374, 1372, 1370, 1368, 1470, 1468, 1466, 1464, + 1566, 1564, 1562, 1560, 1662, 1660, 1658, 1656, + 1822, 1820, 1818, 1816, 1918, 1916, 1914, 1912, + 2014, 2012, 2010, 2008, 2110, 2108, 2106, 2104, + 2206, 2204, 2202, 2200, 2302, 2300, 2298, 2296, + 2398, 2396, 2394, 2392, 2494, 2492, 2490, 2488, + 2590, 2588, 2586, 2584, 2686, 2684, 2682, 2680, + 2782, 2780, 2778, 2776, 2878, 2876, 2874, 2872, + 2974, 2972, 2970, 2968, 3070, 3068, 3066, 3064, + 3166, 3164, 3162, 3160, 3262, 3260, 3258, 3256, + 3358, 3356, 3354, 3352, 3422, 3420, 3418, 3416, + 3518, 3516, 3514, 3512, 3614, 3612, 3610, 3608, + 3710, 3708, 3706, 3704, 3806, 3804, 3802, 3800, + 3902, 3900, 3898, 3896, 3998, 3996, 3994, 3992, + 4094, 4092, 4090, 4088, 4190, 4188, 4186, 4184, + 4286, 4284, 4282, 4280, 4382, 4380, 4378, 4376, + 4478, 4476, 4474, 4472, 4574, 4572, 4570, 4568, + 4670, 4668, 4666, 4664, 4766, 4764, 4762, 4760, + 4862, 4860, 4858, 4856, 4958, 4956, 4954, 4952, + 5022, 5020, 5018, 5016, 5118, 5116, 5114, 5112, + 5214, 5212, 5210, 5208, 5310, 5308, 5306, 5304, + 5406, 5404, 5402, 5400, 5502, 5500, 5498, 5496, + 5598, 5596, 5594, 5592, 5694, 5692, 5690, 5688, + 5790, 5788, 5786, 5784, 5886, 5884, 5882, 5880, + 5982, 5980, 5978, 5976, 6078, 6076, 6074, 6072, + 6174, 6172, 6170, 6168, 6270, 6268, 6266, 6264, + 6366, 6364, 6362, 6360, 6462, 6460, 6458, 6456, + 6558, 6556, 6554, 6552, 6718, 6716, 6714, 6712, + 6814, 6812, 6810, 6808, 6910, 6908, 6906, 6904, + 7006, 7004, 7002, 7000, 7102, 7100, 7098, 7096, + 7198, 7196, 7194, 7192, 7294, 7292, 7290, 7288, + 7390, 7388, 7386, 7384, 7486, 7484, 7482, 7480, + 7582, 7580, 7578, 7576, 7678, 7676, 7674, 7672, + 7774, 7772, 7770, 7768, 7870, 7868, 7866, 7864, + 7966, 7964, 7962, 7960, 8062, 8060, 8058, 8056, + 8158, 8156, 8154, 8152, 8254, 8252, 8250, 8248, + 8350, 8348, 8346, 8344, 8414, 8412, 8410, 8408, + 8510, 8508, 8506, 8504, 8606, 8604, 8602, 8600, + 8702, 8700, 8698, 8696, 8798, 8796, 8794, 8792, + 8894, 8892, 8890, 8888, 8990, 8988, 8986, 8984, + 9086, 9084, 9082, 9080, 9182, 9180, 9178, 9176, + 9278, 9276, 9274, 9272, 9374, 9372, 9370, 9368, + 9470, 9468, 9466, 9464, 9566, 9564, 9562, 9560, + 9662, 9660, 9658, 9656, 9758, 9756, 9754, 9752, + 9854, 9852, 9850, 9848, 9950, 9948, 9946, 9944, + 10014, 10012, 10010, 10008, 10110, 10108, 10106, 10104, + 10206, 10204, 10202, 10200, 10302, 10300, 10298, 10296, + 10398, 10396, 10394, 10392, 10494, 10492, 10490, 10488, + 10590, 10588, 10586, 10584, 10686, 10684, 10682, 10680, + 10782, 10780, 10778, 10776, 10878, 10876, 10874, 10872, + 10974, 10972, 10970, 10968, 11070, 11068, 11066, 11064, + 11166, 11164, 11162, 11160, 11262, 11260, 11258, 11256, + 11358, 11356, 11354, 11352, 11454, 11452, 11450, 11448, + 11550, 11548, 11546, 11544, 11710, 11708, 11706, 11704, + 11806, 11804, 11802, 11800, 11902, 11900, 11898, 11896, + 11998, 11996, 11994, 11992, 12094, 12092, 12090, 12088, + 12190, 12188, 12186, 12184, 12286, 12284, 12282, 12280, + 12382, 12380, 12378, 12376, 12478, 12476, 12474, 12472, + 12574, 12572, 12570, 12568, 12670, 12668, 12666, 12664, + 12766, 12764, 12762, 12760, 12862, 12860, 12858, 12856, + 12958, 12956, 12954, 12952, 13054, 13052, 13050, 13048, + 13150, 13148, 13146, 13144, 13246, 13244, 13242, 13240, + 13310, 13308, 13306, 13304, 13406, 13404, 13402, 13400, + 13502, 13500, 13498, 13496, 13598, 13596, 13594, 13592, + 13694, 13692, 13690, 13688, 13790, 13788, 13786, 13784, + 13886, 13884, 13882, 13880, 13982, 13980, 13978, 13976, + 14078, 14076, 14074, 14072, 14174, 14172, 14170, 14168, + 14270, 14268, 14266, 14264, 14366, 14364, 14362, 14360, + 14462, 14460, 14458, 14456, 14558, 14556, 14554, 14552, + 14654, 14652, 14650, 14648, 14750, 14748, 14746, 14744, + 14846, 14844, 14842, 14840, 14942, 14940, 14938, 14936, + 15006, 15004, 15002, 15000, 15102, 15100, 15098, 15096, + 15198, 15196, 15194, 15192, 15294, 15292, 15290, 15288, + 15390, 15388, 15386, 15384, 15486, 15484, 15482, 15480, + 15582, 15580, 15578, 15576, 15678, 15676, 15674, 15672, + 15774, 15772, 15770, 15768, 15870, 15868, 15866, 15864, + 15966, 15964, 15962, 15960, 16062, 16060, 16058, 16056, + 16158, 16156, 16154, 16152, 16254, 16252, 16250, 16248, + 16350, 16348, 16346, 16344, 16446, 16444, 16442, 16440, + 16542, 16540, 16538, 16536, 16702, 16700, 16698, 16696, + 16798, 16796, 16794, 16792, 16894, 16892, 16890, 16888, + 16990, 16988, 16986, 16984, 17086, 17084, 17082, 17080, + 17182, 17180, 17178, 17176, 17278, 17276, 17274, 17272, + 17374, 17372, 17370, 17368, 17470, 17468, 17466, 17464, + 17566, 17564, 17562, 17560, 17662, 17660, 17658, 17656, + 17758, 17756, 17754, 17752, 17854, 17852, 17850, 17848, + 17950, 17948, 17946, 17944, 18046, 18044, 18042, 18040, + 18142, 18140, 18138, 18136, 18238, 18236, 18234, 18232, + 18302, 18300, 18298, 18296, 18398, 18396, 18394, 18392, + 18494, 18492, 18490, 18488, 18590, 18588, 18586, 18584, + 18686, 18684, 18682, 18680, 18782, 18780, 18778, 18776, + 18878, 18876, 18874, 18872, 18974, 18972, 18970, 18968, + 19070, 19068, 19066, 19064, 19166, 19164, 19162, 19160, + 19262, 19260, 19258, 19256, 19358, 19356, 19354, 19352, + 19454, 19452, 19450, 19448, 19550, 19548, 19546, 19544, + 19646, 19644, 19642, 19640, 19742, 19740, 19738, 19736, + 19838, 19836, 19834, 19832, }, + /* 4 */ + {38, 36, 34, 32, 134, 132, 130, 128, + 230, 228, 226, 224, 326, 324, 322, 320, + 422, 420, 418, 416, 518, 516, 514, 512, + 614, 612, 610, 608, 710, 708, 706, 704, + 806, 804, 802, 800, 902, 900, 898, 896, + 998, 996, 994, 992, 1094, 1092, 1090, 1088, + 1190, 1188, 1186, 1184, 1286, 1284, 1282, 1280, + 1382, 1380, 1378, 1376, 1478, 1476, 1474, 1472, + 1574, 1572, 1570, 1568, 1670, 1668, 1666, 1664, + 1734, 1732, 1730, 1728, 1830, 1828, 1826, 1824, + 1926, 1924, 1922, 1920, 2022, 2020, 2018, 2016, + 2118, 2116, 2114, 2112, 2214, 2212, 2210, 2208, + 2310, 2308, 2306, 2304, 2406, 2404, 2402, 2400, + 2502, 2500, 2498, 2496, 2598, 2596, 2594, 2592, + 2694, 2692, 2690, 2688, 2790, 2788, 2786, 2784, + 2886, 2884, 2882, 2880, 2982, 2980, 2978, 2976, + 3078, 3076, 3074, 3072, 3174, 3172, 3170, 3168, + 3270, 3268, 3266, 3264, 3430, 3428, 3426, 3424, + 3526, 3524, 3522, 3520, 3622, 3620, 3618, 3616, + 3718, 3716, 3714, 3712, 3814, 3812, 3810, 3808, + 3910, 3908, 3906, 3904, 4006, 4004, 4002, 4000, + 4102, 4100, 4098, 4096, 4198, 4196, 4194, 4192, + 4294, 4292, 4290, 4288, 4390, 4388, 4386, 4384, + 4486, 4484, 4482, 4480, 4582, 4580, 4578, 4576, + 4678, 4676, 4674, 4672, 4774, 4772, 4770, 4768, + 4870, 4868, 4866, 4864, 4966, 4964, 4962, 4960, + 5030, 5028, 5026, 5024, 5126, 5124, 5122, 5120, + 5222, 5220, 5218, 5216, 5318, 5316, 5314, 5312, + 5414, 5412, 5410, 5408, 5510, 5508, 5506, 5504, + 5606, 5604, 5602, 5600, 5702, 5700, 5698, 5696, + 5798, 5796, 5794, 5792, 5894, 5892, 5890, 5888, + 5990, 5988, 5986, 5984, 6086, 6084, 6082, 6080, + 6182, 6180, 6178, 6176, 6278, 6276, 6274, 6272, + 6374, 6372, 6370, 6368, 6470, 6468, 6466, 6464, + 6566, 6564, 6562, 6560, 6630, 6628, 6626, 6624, + 6726, 6724, 6722, 6720, 6822, 6820, 6818, 6816, + 6918, 6916, 6914, 6912, 7014, 7012, 7010, 7008, + 7110, 7108, 7106, 7104, 7206, 7204, 7202, 7200, + 7302, 7300, 7298, 7296, 7398, 7396, 7394, 7392, + 7494, 7492, 7490, 7488, 7590, 7588, 7586, 7584, + 7686, 7684, 7682, 7680, 7782, 7780, 7778, 7776, + 7878, 7876, 7874, 7872, 7974, 7972, 7970, 7968, + 8070, 8068, 8066, 8064, 8166, 8164, 8162, 8160, + 8262, 8260, 8258, 8256, 8422, 8420, 8418, 8416, + 8518, 8516, 8514, 8512, 8614, 8612, 8610, 8608, + 8710, 8708, 8706, 8704, 8806, 8804, 8802, 8800, + 8902, 8900, 8898, 8896, 8998, 8996, 8994, 8992, + 9094, 9092, 9090, 9088, 9190, 9188, 9186, 9184, + 9286, 9284, 9282, 9280, 9382, 9380, 9378, 9376, + 9478, 9476, 9474, 9472, 9574, 9572, 9570, 9568, + 9670, 9668, 9666, 9664, 9766, 9764, 9762, 9760, + 9862, 9860, 9858, 9856, 9958, 9956, 9954, 9952, + 10022, 10020, 10018, 10016, 10118, 10116, 10114, 10112, + 10214, 10212, 10210, 10208, 10310, 10308, 10306, 10304, + 10406, 10404, 10402, 10400, 10502, 10500, 10498, 10496, + 10598, 10596, 10594, 10592, 10694, 10692, 10690, 10688, + 10790, 10788, 10786, 10784, 10886, 10884, 10882, 10880, + 10982, 10980, 10978, 10976, 11078, 11076, 11074, 11072, + 11174, 11172, 11170, 11168, 11270, 11268, 11266, 11264, + 11366, 11364, 11362, 11360, 11462, 11460, 11458, 11456, + 11558, 11556, 11554, 11552, 11622, 11620, 11618, 11616, + 11718, 11716, 11714, 11712, 11814, 11812, 11810, 11808, + 11910, 11908, 11906, 11904, 12006, 12004, 12002, 12000, + 12102, 12100, 12098, 12096, 12198, 12196, 12194, 12192, + 12294, 12292, 12290, 12288, 12390, 12388, 12386, 12384, + 12486, 12484, 12482, 12480, 12582, 12580, 12578, 12576, + 12678, 12676, 12674, 12672, 12774, 12772, 12770, 12768, + 12870, 12868, 12866, 12864, 12966, 12964, 12962, 12960, + 13062, 13060, 13058, 13056, 13158, 13156, 13154, 13152, + 13318, 13316, 13314, 13312, 13414, 13412, 13410, 13408, + 13510, 13508, 13506, 13504, 13606, 13604, 13602, 13600, + 13702, 13700, 13698, 13696, 13798, 13796, 13794, 13792, + 13894, 13892, 13890, 13888, 13990, 13988, 13986, 13984, + 14086, 14084, 14082, 14080, 14182, 14180, 14178, 14176, + 14278, 14276, 14274, 14272, 14374, 14372, 14370, 14368, + 14470, 14468, 14466, 14464, 14566, 14564, 14562, 14560, + 14662, 14660, 14658, 14656, 14758, 14756, 14754, 14752, + 14854, 14852, 14850, 14848, 14950, 14948, 14946, 14944, + 15014, 15012, 15010, 15008, 15110, 15108, 15106, 15104, + 15206, 15204, 15202, 15200, 15302, 15300, 15298, 15296, + 15398, 15396, 15394, 15392, 15494, 15492, 15490, 15488, + 15590, 15588, 15586, 15584, 15686, 15684, 15682, 15680, + 15782, 15780, 15778, 15776, 15878, 15876, 15874, 15872, + 15974, 15972, 15970, 15968, 16070, 16068, 16066, 16064, + 16166, 16164, 16162, 16160, 16262, 16260, 16258, 16256, + 16358, 16356, 16354, 16352, 16454, 16452, 16450, 16448, + 16550, 16548, 16546, 16544, 16614, 16612, 16610, 16608, + 16710, 16708, 16706, 16704, 16806, 16804, 16802, 16800, + 16902, 16900, 16898, 16896, 16998, 16996, 16994, 16992, + 17094, 17092, 17090, 17088, 17190, 17188, 17186, 17184, + 17286, 17284, 17282, 17280, 17382, 17380, 17378, 17376, + 17478, 17476, 17474, 17472, 17574, 17572, 17570, 17568, + 17670, 17668, 17666, 17664, 17766, 17764, 17762, 17760, + 17862, 17860, 17858, 17856, 17958, 17956, 17954, 17952, + 18054, 18052, 18050, 18048, 18150, 18148, 18146, 18144, + 18310, 18308, 18306, 18304, 18406, 18404, 18402, 18400, + 18502, 18500, 18498, 18496, 18598, 18596, 18594, 18592, + 18694, 18692, 18690, 18688, 18790, 18788, 18786, 18784, + 18886, 18884, 18882, 18880, 18982, 18980, 18978, 18976, + 19078, 19076, 19074, 19072, 19174, 19172, 19170, 19168, + 19270, 19268, 19266, 19264, 19366, 19364, 19362, 19360, + 19462, 19460, 19458, 19456, 19558, 19556, 19554, 19552, + 19654, 19652, 19650, 19648, 19750, 19748, 19746, 19744, + 19846, 19844, 19842, 19840, }, + /* 5 */ + {46, 44, 42, 40, 142, 140, 138, 136, + 238, 236, 234, 232, 334, 332, 330, 328, + 430, 428, 426, 424, 526, 524, 522, 520, + 622, 620, 618, 616, 718, 716, 714, 712, + 814, 812, 810, 808, 910, 908, 906, 904, + 1006, 1004, 1002, 1000, 1102, 1100, 1098, 1096, + 1198, 1196, 1194, 1192, 1294, 1292, 1290, 1288, + 1390, 1388, 1386, 1384, 1486, 1484, 1482, 1480, + 1582, 1580, 1578, 1576, 1678, 1676, 1674, 1672, + 1742, 1740, 1738, 1736, 1838, 1836, 1834, 1832, + 1934, 1932, 1930, 1928, 2030, 2028, 2026, 2024, + 2126, 2124, 2122, 2120, 2222, 2220, 2218, 2216, + 2318, 2316, 2314, 2312, 2414, 2412, 2410, 2408, + 2510, 2508, 2506, 2504, 2606, 2604, 2602, 2600, + 2702, 2700, 2698, 2696, 2798, 2796, 2794, 2792, + 2894, 2892, 2890, 2888, 2990, 2988, 2986, 2984, + 3086, 3084, 3082, 3080, 3182, 3180, 3178, 3176, + 3278, 3276, 3274, 3272, 3438, 3436, 3434, 3432, + 3534, 3532, 3530, 3528, 3630, 3628, 3626, 3624, + 3726, 3724, 3722, 3720, 3822, 3820, 3818, 3816, + 3918, 3916, 3914, 3912, 4014, 4012, 4010, 4008, + 4110, 4108, 4106, 4104, 4206, 4204, 4202, 4200, + 4302, 4300, 4298, 4296, 4398, 4396, 4394, 4392, + 4494, 4492, 4490, 4488, 4590, 4588, 4586, 4584, + 4686, 4684, 4682, 4680, 4782, 4780, 4778, 4776, + 4878, 4876, 4874, 4872, 4974, 4972, 4970, 4968, + 5038, 5036, 5034, 5032, 5134, 5132, 5130, 5128, + 5230, 5228, 5226, 5224, 5326, 5324, 5322, 5320, + 5422, 5420, 5418, 5416, 5518, 5516, 5514, 5512, + 5614, 5612, 5610, 5608, 5710, 5708, 5706, 5704, + 5806, 5804, 5802, 5800, 5902, 5900, 5898, 5896, + 5998, 5996, 5994, 5992, 6094, 6092, 6090, 6088, + 6190, 6188, 6186, 6184, 6286, 6284, 6282, 6280, + 6382, 6380, 6378, 6376, 6478, 6476, 6474, 6472, + 6574, 6572, 6570, 6568, 6638, 6636, 6634, 6632, + 6734, 6732, 6730, 6728, 6830, 6828, 6826, 6824, + 6926, 6924, 6922, 6920, 7022, 7020, 7018, 7016, + 7118, 7116, 7114, 7112, 7214, 7212, 7210, 7208, + 7310, 7308, 7306, 7304, 7406, 7404, 7402, 7400, + 7502, 7500, 7498, 7496, 7598, 7596, 7594, 7592, + 7694, 7692, 7690, 7688, 7790, 7788, 7786, 7784, + 7886, 7884, 7882, 7880, 7982, 7980, 7978, 7976, + 8078, 8076, 8074, 8072, 8174, 8172, 8170, 8168, + 8270, 8268, 8266, 8264, 8430, 8428, 8426, 8424, + 8526, 8524, 8522, 8520, 8622, 8620, 8618, 8616, + 8718, 8716, 8714, 8712, 8814, 8812, 8810, 8808, + 8910, 8908, 8906, 8904, 9006, 9004, 9002, 9000, + 9102, 9100, 9098, 9096, 9198, 9196, 9194, 9192, + 9294, 9292, 9290, 9288, 9390, 9388, 9386, 9384, + 9486, 9484, 9482, 9480, 9582, 9580, 9578, 9576, + 9678, 9676, 9674, 9672, 9774, 9772, 9770, 9768, + 9870, 9868, 9866, 9864, 9966, 9964, 9962, 9960, + 10030, 10028, 10026, 10024, 10126, 10124, 10122, 10120, + 10222, 10220, 10218, 10216, 10318, 10316, 10314, 10312, + 10414, 10412, 10410, 10408, 10510, 10508, 10506, 10504, + 10606, 10604, 10602, 10600, 10702, 10700, 10698, 10696, + 10798, 10796, 10794, 10792, 10894, 10892, 10890, 10888, + 10990, 10988, 10986, 10984, 11086, 11084, 11082, 11080, + 11182, 11180, 11178, 11176, 11278, 11276, 11274, 11272, + 11374, 11372, 11370, 11368, 11470, 11468, 11466, 11464, + 11566, 11564, 11562, 11560, 11630, 11628, 11626, 11624, + 11726, 11724, 11722, 11720, 11822, 11820, 11818, 11816, + 11918, 11916, 11914, 11912, 12014, 12012, 12010, 12008, + 12110, 12108, 12106, 12104, 12206, 12204, 12202, 12200, + 12302, 12300, 12298, 12296, 12398, 12396, 12394, 12392, + 12494, 12492, 12490, 12488, 12590, 12588, 12586, 12584, + 12686, 12684, 12682, 12680, 12782, 12780, 12778, 12776, + 12878, 12876, 12874, 12872, 12974, 12972, 12970, 12968, + 13070, 13068, 13066, 13064, 13166, 13164, 13162, 13160, + 13326, 13324, 13322, 13320, 13422, 13420, 13418, 13416, + 13518, 13516, 13514, 13512, 13614, 13612, 13610, 13608, + 13710, 13708, 13706, 13704, 13806, 13804, 13802, 13800, + 13902, 13900, 13898, 13896, 13998, 13996, 13994, 13992, + 14094, 14092, 14090, 14088, 14190, 14188, 14186, 14184, + 14286, 14284, 14282, 14280, 14382, 14380, 14378, 14376, + 14478, 14476, 14474, 14472, 14574, 14572, 14570, 14568, + 14670, 14668, 14666, 14664, 14766, 14764, 14762, 14760, + 14862, 14860, 14858, 14856, 14958, 14956, 14954, 14952, + 15022, 15020, 15018, 15016, 15118, 15116, 15114, 15112, + 15214, 15212, 15210, 15208, 15310, 15308, 15306, 15304, + 15406, 15404, 15402, 15400, 15502, 15500, 15498, 15496, + 15598, 15596, 15594, 15592, 15694, 15692, 15690, 15688, + 15790, 15788, 15786, 15784, 15886, 15884, 15882, 15880, + 15982, 15980, 15978, 15976, 16078, 16076, 16074, 16072, + 16174, 16172, 16170, 16168, 16270, 16268, 16266, 16264, + 16366, 16364, 16362, 16360, 16462, 16460, 16458, 16456, + 16558, 16556, 16554, 16552, 16622, 16620, 16618, 16616, + 16718, 16716, 16714, 16712, 16814, 16812, 16810, 16808, + 16910, 16908, 16906, 16904, 17006, 17004, 17002, 17000, + 17102, 17100, 17098, 17096, 17198, 17196, 17194, 17192, + 17294, 17292, 17290, 17288, 17390, 17388, 17386, 17384, + 17486, 17484, 17482, 17480, 17582, 17580, 17578, 17576, + 17678, 17676, 17674, 17672, 17774, 17772, 17770, 17768, + 17870, 17868, 17866, 17864, 17966, 17964, 17962, 17960, + 18062, 18060, 18058, 18056, 18158, 18156, 18154, 18152, + 18318, 18316, 18314, 18312, 18414, 18412, 18410, 18408, + 18510, 18508, 18506, 18504, 18606, 18604, 18602, 18600, + 18702, 18700, 18698, 18696, 18798, 18796, 18794, 18792, + 18894, 18892, 18890, 18888, 18990, 18988, 18986, 18984, + 19086, 19084, 19082, 19080, 19182, 19180, 19178, 19176, + 19278, 19276, 19274, 19272, 19374, 19372, 19370, 19368, + 19470, 19468, 19466, 19464, 19566, 19564, 19562, 19560, + 19662, 19660, 19658, 19656, 19758, 19756, 19754, 19752, + 19854, 19852, 19850, 19848, }, + /* 6 */ + {54, 52, 50, 48, 150, 148, 146, 144, + 246, 244, 242, 240, 342, 340, 338, 336, + 438, 436, 434, 432, 534, 532, 530, 528, + 630, 628, 626, 624, 726, 724, 722, 720, + 822, 820, 818, 816, 918, 916, 914, 912, + 1014, 1012, 1010, 1008, 1110, 1108, 1106, 1104, + 1206, 1204, 1202, 1200, 1302, 1300, 1298, 1296, + 1398, 1396, 1394, 1392, 1494, 1492, 1490, 1488, + 1590, 1588, 1586, 1584, 1686, 1684, 1682, 1680, + 1750, 1748, 1746, 1744, 1846, 1844, 1842, 1840, + 1942, 1940, 1938, 1936, 2038, 2036, 2034, 2032, + 2134, 2132, 2130, 2128, 2230, 2228, 2226, 2224, + 2326, 2324, 2322, 2320, 2422, 2420, 2418, 2416, + 2518, 2516, 2514, 2512, 2614, 2612, 2610, 2608, + 2710, 2708, 2706, 2704, 2806, 2804, 2802, 2800, + 2902, 2900, 2898, 2896, 2998, 2996, 2994, 2992, + 3094, 3092, 3090, 3088, 3190, 3188, 3186, 3184, + 3286, 3284, 3282, 3280, 3446, 3444, 3442, 3440, + 3542, 3540, 3538, 3536, 3638, 3636, 3634, 3632, + 3734, 3732, 3730, 3728, 3830, 3828, 3826, 3824, + 3926, 3924, 3922, 3920, 4022, 4020, 4018, 4016, + 4118, 4116, 4114, 4112, 4214, 4212, 4210, 4208, + 4310, 4308, 4306, 4304, 4406, 4404, 4402, 4400, + 4502, 4500, 4498, 4496, 4598, 4596, 4594, 4592, + 4694, 4692, 4690, 4688, 4790, 4788, 4786, 4784, + 4886, 4884, 4882, 4880, 4982, 4980, 4978, 4976, + 5046, 5044, 5042, 5040, 5142, 5140, 5138, 5136, + 5238, 5236, 5234, 5232, 5334, 5332, 5330, 5328, + 5430, 5428, 5426, 5424, 5526, 5524, 5522, 5520, + 5622, 5620, 5618, 5616, 5718, 5716, 5714, 5712, + 5814, 5812, 5810, 5808, 5910, 5908, 5906, 5904, + 6006, 6004, 6002, 6000, 6102, 6100, 6098, 6096, + 6198, 6196, 6194, 6192, 6294, 6292, 6290, 6288, + 6390, 6388, 6386, 6384, 6486, 6484, 6482, 6480, + 6582, 6580, 6578, 6576, 6646, 6644, 6642, 6640, + 6742, 6740, 6738, 6736, 6838, 6836, 6834, 6832, + 6934, 6932, 6930, 6928, 7030, 7028, 7026, 7024, + 7126, 7124, 7122, 7120, 7222, 7220, 7218, 7216, + 7318, 7316, 7314, 7312, 7414, 7412, 7410, 7408, + 7510, 7508, 7506, 7504, 7606, 7604, 7602, 7600, + 7702, 7700, 7698, 7696, 7798, 7796, 7794, 7792, + 7894, 7892, 7890, 7888, 7990, 7988, 7986, 7984, + 8086, 8084, 8082, 8080, 8182, 8180, 8178, 8176, + 8278, 8276, 8274, 8272, 8438, 8436, 8434, 8432, + 8534, 8532, 8530, 8528, 8630, 8628, 8626, 8624, + 8726, 8724, 8722, 8720, 8822, 8820, 8818, 8816, + 8918, 8916, 8914, 8912, 9014, 9012, 9010, 9008, + 9110, 9108, 9106, 9104, 9206, 9204, 9202, 9200, + 9302, 9300, 9298, 9296, 9398, 9396, 9394, 9392, + 9494, 9492, 9490, 9488, 9590, 9588, 9586, 9584, + 9686, 9684, 9682, 9680, 9782, 9780, 9778, 9776, + 9878, 9876, 9874, 9872, 9974, 9972, 9970, 9968, + 10038, 10036, 10034, 10032, 10134, 10132, 10130, 10128, + 10230, 10228, 10226, 10224, 10326, 10324, 10322, 10320, + 10422, 10420, 10418, 10416, 10518, 10516, 10514, 10512, + 10614, 10612, 10610, 10608, 10710, 10708, 10706, 10704, + 10806, 10804, 10802, 10800, 10902, 10900, 10898, 10896, + 10998, 10996, 10994, 10992, 11094, 11092, 11090, 11088, + 11190, 11188, 11186, 11184, 11286, 11284, 11282, 11280, + 11382, 11380, 11378, 11376, 11478, 11476, 11474, 11472, + 11574, 11572, 11570, 11568, 11638, 11636, 11634, 11632, + 11734, 11732, 11730, 11728, 11830, 11828, 11826, 11824, + 11926, 11924, 11922, 11920, 12022, 12020, 12018, 12016, + 12118, 12116, 12114, 12112, 12214, 12212, 12210, 12208, + 12310, 12308, 12306, 12304, 12406, 12404, 12402, 12400, + 12502, 12500, 12498, 12496, 12598, 12596, 12594, 12592, + 12694, 12692, 12690, 12688, 12790, 12788, 12786, 12784, + 12886, 12884, 12882, 12880, 12982, 12980, 12978, 12976, + 13078, 13076, 13074, 13072, 13174, 13172, 13170, 13168, + 13334, 13332, 13330, 13328, 13430, 13428, 13426, 13424, + 13526, 13524, 13522, 13520, 13622, 13620, 13618, 13616, + 13718, 13716, 13714, 13712, 13814, 13812, 13810, 13808, + 13910, 13908, 13906, 13904, 14006, 14004, 14002, 14000, + 14102, 14100, 14098, 14096, 14198, 14196, 14194, 14192, + 14294, 14292, 14290, 14288, 14390, 14388, 14386, 14384, + 14486, 14484, 14482, 14480, 14582, 14580, 14578, 14576, + 14678, 14676, 14674, 14672, 14774, 14772, 14770, 14768, + 14870, 14868, 14866, 14864, 14966, 14964, 14962, 14960, + 15030, 15028, 15026, 15024, 15126, 15124, 15122, 15120, + 15222, 15220, 15218, 15216, 15318, 15316, 15314, 15312, + 15414, 15412, 15410, 15408, 15510, 15508, 15506, 15504, + 15606, 15604, 15602, 15600, 15702, 15700, 15698, 15696, + 15798, 15796, 15794, 15792, 15894, 15892, 15890, 15888, + 15990, 15988, 15986, 15984, 16086, 16084, 16082, 16080, + 16182, 16180, 16178, 16176, 16278, 16276, 16274, 16272, + 16374, 16372, 16370, 16368, 16470, 16468, 16466, 16464, + 16566, 16564, 16562, 16560, 16630, 16628, 16626, 16624, + 16726, 16724, 16722, 16720, 16822, 16820, 16818, 16816, + 16918, 16916, 16914, 16912, 17014, 17012, 17010, 17008, + 17110, 17108, 17106, 17104, 17206, 17204, 17202, 17200, + 17302, 17300, 17298, 17296, 17398, 17396, 17394, 17392, + 17494, 17492, 17490, 17488, 17590, 17588, 17586, 17584, + 17686, 17684, 17682, 17680, 17782, 17780, 17778, 17776, + 17878, 17876, 17874, 17872, 17974, 17972, 17970, 17968, + 18070, 18068, 18066, 18064, 18166, 18164, 18162, 18160, + 18326, 18324, 18322, 18320, 18422, 18420, 18418, 18416, + 18518, 18516, 18514, 18512, 18614, 18612, 18610, 18608, + 18710, 18708, 18706, 18704, 18806, 18804, 18802, 18800, + 18902, 18900, 18898, 18896, 18998, 18996, 18994, 18992, + 19094, 19092, 19090, 19088, 19190, 19188, 19186, 19184, + 19286, 19284, 19282, 19280, 19382, 19380, 19378, 19376, + 19478, 19476, 19474, 19472, 19574, 19572, 19570, 19568, + 19670, 19668, 19666, 19664, 19766, 19764, 19762, 19760, + 19862, 19860, 19858, 19856, }, + /* 7 */ + {62, 60, 58, 56, 158, 156, 154, 152, + 254, 252, 250, 248, 350, 348, 346, 344, + 446, 444, 442, 440, 542, 540, 538, 536, + 638, 636, 634, 632, 734, 732, 730, 728, + 830, 828, 826, 824, 926, 924, 922, 920, + 1022, 1020, 1018, 1016, 1118, 1116, 1114, 1112, + 1214, 1212, 1210, 1208, 1310, 1308, 1306, 1304, + 1406, 1404, 1402, 1400, 1502, 1500, 1498, 1496, + 1598, 1596, 1594, 1592, 1694, 1692, 1690, 1688, + 1758, 1756, 1754, 1752, 1854, 1852, 1850, 1848, + 1950, 1948, 1946, 1944, 2046, 2044, 2042, 2040, + 2142, 2140, 2138, 2136, 2238, 2236, 2234, 2232, + 2334, 2332, 2330, 2328, 2430, 2428, 2426, 2424, + 2526, 2524, 2522, 2520, 2622, 2620, 2618, 2616, + 2718, 2716, 2714, 2712, 2814, 2812, 2810, 2808, + 2910, 2908, 2906, 2904, 3006, 3004, 3002, 3000, + 3102, 3100, 3098, 3096, 3198, 3196, 3194, 3192, + 3294, 3292, 3290, 3288, 3454, 3452, 3450, 3448, + 3550, 3548, 3546, 3544, 3646, 3644, 3642, 3640, + 3742, 3740, 3738, 3736, 3838, 3836, 3834, 3832, + 3934, 3932, 3930, 3928, 4030, 4028, 4026, 4024, + 4126, 4124, 4122, 4120, 4222, 4220, 4218, 4216, + 4318, 4316, 4314, 4312, 4414, 4412, 4410, 4408, + 4510, 4508, 4506, 4504, 4606, 4604, 4602, 4600, + 4702, 4700, 4698, 4696, 4798, 4796, 4794, 4792, + 4894, 4892, 4890, 4888, 4990, 4988, 4986, 4984, + 5054, 5052, 5050, 5048, 5150, 5148, 5146, 5144, + 5246, 5244, 5242, 5240, 5342, 5340, 5338, 5336, + 5438, 5436, 5434, 5432, 5534, 5532, 5530, 5528, + 5630, 5628, 5626, 5624, 5726, 5724, 5722, 5720, + 5822, 5820, 5818, 5816, 5918, 5916, 5914, 5912, + 6014, 6012, 6010, 6008, 6110, 6108, 6106, 6104, + 6206, 6204, 6202, 6200, 6302, 6300, 6298, 6296, + 6398, 6396, 6394, 6392, 6494, 6492, 6490, 6488, + 6590, 6588, 6586, 6584, 6654, 6652, 6650, 6648, + 6750, 6748, 6746, 6744, 6846, 6844, 6842, 6840, + 6942, 6940, 6938, 6936, 7038, 7036, 7034, 7032, + 7134, 7132, 7130, 7128, 7230, 7228, 7226, 7224, + 7326, 7324, 7322, 7320, 7422, 7420, 7418, 7416, + 7518, 7516, 7514, 7512, 7614, 7612, 7610, 7608, + 7710, 7708, 7706, 7704, 7806, 7804, 7802, 7800, + 7902, 7900, 7898, 7896, 7998, 7996, 7994, 7992, + 8094, 8092, 8090, 8088, 8190, 8188, 8186, 8184, + 8286, 8284, 8282, 8280, 8446, 8444, 8442, 8440, + 8542, 8540, 8538, 8536, 8638, 8636, 8634, 8632, + 8734, 8732, 8730, 8728, 8830, 8828, 8826, 8824, + 8926, 8924, 8922, 8920, 9022, 9020, 9018, 9016, + 9118, 9116, 9114, 9112, 9214, 9212, 9210, 9208, + 9310, 9308, 9306, 9304, 9406, 9404, 9402, 9400, + 9502, 9500, 9498, 9496, 9598, 9596, 9594, 9592, + 9694, 9692, 9690, 9688, 9790, 9788, 9786, 9784, + 9886, 9884, 9882, 9880, 9982, 9980, 9978, 9976, + 10046, 10044, 10042, 10040, 10142, 10140, 10138, 10136, + 10238, 10236, 10234, 10232, 10334, 10332, 10330, 10328, + 10430, 10428, 10426, 10424, 10526, 10524, 10522, 10520, + 10622, 10620, 10618, 10616, 10718, 10716, 10714, 10712, + 10814, 10812, 10810, 10808, 10910, 10908, 10906, 10904, + 11006, 11004, 11002, 11000, 11102, 11100, 11098, 11096, + 11198, 11196, 11194, 11192, 11294, 11292, 11290, 11288, + 11390, 11388, 11386, 11384, 11486, 11484, 11482, 11480, + 11582, 11580, 11578, 11576, 11646, 11644, 11642, 11640, + 11742, 11740, 11738, 11736, 11838, 11836, 11834, 11832, + 11934, 11932, 11930, 11928, 12030, 12028, 12026, 12024, + 12126, 12124, 12122, 12120, 12222, 12220, 12218, 12216, + 12318, 12316, 12314, 12312, 12414, 12412, 12410, 12408, + 12510, 12508, 12506, 12504, 12606, 12604, 12602, 12600, + 12702, 12700, 12698, 12696, 12798, 12796, 12794, 12792, + 12894, 12892, 12890, 12888, 12990, 12988, 12986, 12984, + 13086, 13084, 13082, 13080, 13182, 13180, 13178, 13176, + 13342, 13340, 13338, 13336, 13438, 13436, 13434, 13432, + 13534, 13532, 13530, 13528, 13630, 13628, 13626, 13624, + 13726, 13724, 13722, 13720, 13822, 13820, 13818, 13816, + 13918, 13916, 13914, 13912, 14014, 14012, 14010, 14008, + 14110, 14108, 14106, 14104, 14206, 14204, 14202, 14200, + 14302, 14300, 14298, 14296, 14398, 14396, 14394, 14392, + 14494, 14492, 14490, 14488, 14590, 14588, 14586, 14584, + 14686, 14684, 14682, 14680, 14782, 14780, 14778, 14776, + 14878, 14876, 14874, 14872, 14974, 14972, 14970, 14968, + 15038, 15036, 15034, 15032, 15134, 15132, 15130, 15128, + 15230, 15228, 15226, 15224, 15326, 15324, 15322, 15320, + 15422, 15420, 15418, 15416, 15518, 15516, 15514, 15512, + 15614, 15612, 15610, 15608, 15710, 15708, 15706, 15704, + 15806, 15804, 15802, 15800, 15902, 15900, 15898, 15896, + 15998, 15996, 15994, 15992, 16094, 16092, 16090, 16088, + 16190, 16188, 16186, 16184, 16286, 16284, 16282, 16280, + 16382, 16380, 16378, 16376, 16478, 16476, 16474, 16472, + 16574, 16572, 16570, 16568, 16638, 16636, 16634, 16632, + 16734, 16732, 16730, 16728, 16830, 16828, 16826, 16824, + 16926, 16924, 16922, 16920, 17022, 17020, 17018, 17016, + 17118, 17116, 17114, 17112, 17214, 17212, 17210, 17208, + 17310, 17308, 17306, 17304, 17406, 17404, 17402, 17400, + 17502, 17500, 17498, 17496, 17598, 17596, 17594, 17592, + 17694, 17692, 17690, 17688, 17790, 17788, 17786, 17784, + 17886, 17884, 17882, 17880, 17982, 17980, 17978, 17976, + 18078, 18076, 18074, 18072, 18174, 18172, 18170, 18168, + 18334, 18332, 18330, 18328, 18430, 18428, 18426, 18424, + 18526, 18524, 18522, 18520, 18622, 18620, 18618, 18616, + 18718, 18716, 18714, 18712, 18814, 18812, 18810, 18808, + 18910, 18908, 18906, 18904, 19006, 19004, 19002, 19000, + 19102, 19100, 19098, 19096, 19198, 19196, 19194, 19192, + 19294, 19292, 19290, 19288, 19390, 19388, 19386, 19384, + 19486, 19484, 19482, 19480, 19582, 19580, 19578, 19576, + 19678, 19676, 19674, 19672, 19774, 19772, 19770, 19768, + 19870, 19868, 19866, 19864, }, + /* 8 */ + {70, 68, 66, 64, 166, 164, 162, 160, + 262, 260, 258, 256, 358, 356, 354, 352, + 454, 452, 450, 448, 550, 548, 546, 544, + 646, 644, 642, 640, 742, 740, 738, 736, + 838, 836, 834, 832, 934, 932, 930, 928, + 1030, 1028, 1026, 1024, 1126, 1124, 1122, 1120, + 1222, 1220, 1218, 1216, 1318, 1316, 1314, 1312, + 1414, 1412, 1410, 1408, 1510, 1508, 1506, 1504, + 1606, 1604, 1602, 1600, 1702, 1700, 1698, 1696, + 1766, 1764, 1762, 1760, 1862, 1860, 1858, 1856, + 1958, 1956, 1954, 1952, 2054, 2052, 2050, 2048, + 2150, 2148, 2146, 2144, 2246, 2244, 2242, 2240, + 2342, 2340, 2338, 2336, 2438, 2436, 2434, 2432, + 2534, 2532, 2530, 2528, 2630, 2628, 2626, 2624, + 2726, 2724, 2722, 2720, 2822, 2820, 2818, 2816, + 2918, 2916, 2914, 2912, 3014, 3012, 3010, 3008, + 3110, 3108, 3106, 3104, 3206, 3204, 3202, 3200, + 3302, 3300, 3298, 3296, 3366, 3364, 3362, 3360, + 3462, 3460, 3458, 3456, 3558, 3556, 3554, 3552, + 3654, 3652, 3650, 3648, 3750, 3748, 3746, 3744, + 3846, 3844, 3842, 3840, 3942, 3940, 3938, 3936, + 4038, 4036, 4034, 4032, 4134, 4132, 4130, 4128, + 4230, 4228, 4226, 4224, 4326, 4324, 4322, 4320, + 4422, 4420, 4418, 4416, 4518, 4516, 4514, 4512, + 4614, 4612, 4610, 4608, 4710, 4708, 4706, 4704, + 4806, 4804, 4802, 4800, 4902, 4900, 4898, 4896, + 5062, 5060, 5058, 5056, 5158, 5156, 5154, 5152, + 5254, 5252, 5250, 5248, 5350, 5348, 5346, 5344, + 5446, 5444, 5442, 5440, 5542, 5540, 5538, 5536, + 5638, 5636, 5634, 5632, 5734, 5732, 5730, 5728, + 5830, 5828, 5826, 5824, 5926, 5924, 5922, 5920, + 6022, 6020, 6018, 6016, 6118, 6116, 6114, 6112, + 6214, 6212, 6210, 6208, 6310, 6308, 6306, 6304, + 6406, 6404, 6402, 6400, 6502, 6500, 6498, 6496, + 6598, 6596, 6594, 6592, 6662, 6660, 6658, 6656, + 6758, 6756, 6754, 6752, 6854, 6852, 6850, 6848, + 6950, 6948, 6946, 6944, 7046, 7044, 7042, 7040, + 7142, 7140, 7138, 7136, 7238, 7236, 7234, 7232, + 7334, 7332, 7330, 7328, 7430, 7428, 7426, 7424, + 7526, 7524, 7522, 7520, 7622, 7620, 7618, 7616, + 7718, 7716, 7714, 7712, 7814, 7812, 7810, 7808, + 7910, 7908, 7906, 7904, 8006, 8004, 8002, 8000, + 8102, 8100, 8098, 8096, 8198, 8196, 8194, 8192, + 8294, 8292, 8290, 8288, 8358, 8356, 8354, 8352, + 8454, 8452, 8450, 8448, 8550, 8548, 8546, 8544, + 8646, 8644, 8642, 8640, 8742, 8740, 8738, 8736, + 8838, 8836, 8834, 8832, 8934, 8932, 8930, 8928, + 9030, 9028, 9026, 9024, 9126, 9124, 9122, 9120, + 9222, 9220, 9218, 9216, 9318, 9316, 9314, 9312, + 9414, 9412, 9410, 9408, 9510, 9508, 9506, 9504, + 9606, 9604, 9602, 9600, 9702, 9700, 9698, 9696, + 9798, 9796, 9794, 9792, 9894, 9892, 9890, 9888, + 10054, 10052, 10050, 10048, 10150, 10148, 10146, 10144, + 10246, 10244, 10242, 10240, 10342, 10340, 10338, 10336, + 10438, 10436, 10434, 10432, 10534, 10532, 10530, 10528, + 10630, 10628, 10626, 10624, 10726, 10724, 10722, 10720, + 10822, 10820, 10818, 10816, 10918, 10916, 10914, 10912, + 11014, 11012, 11010, 11008, 11110, 11108, 11106, 11104, + 11206, 11204, 11202, 11200, 11302, 11300, 11298, 11296, + 11398, 11396, 11394, 11392, 11494, 11492, 11490, 11488, + 11590, 11588, 11586, 11584, 11654, 11652, 11650, 11648, + 11750, 11748, 11746, 11744, 11846, 11844, 11842, 11840, + 11942, 11940, 11938, 11936, 12038, 12036, 12034, 12032, + 12134, 12132, 12130, 12128, 12230, 12228, 12226, 12224, + 12326, 12324, 12322, 12320, 12422, 12420, 12418, 12416, + 12518, 12516, 12514, 12512, 12614, 12612, 12610, 12608, + 12710, 12708, 12706, 12704, 12806, 12804, 12802, 12800, + 12902, 12900, 12898, 12896, 12998, 12996, 12994, 12992, + 13094, 13092, 13090, 13088, 13190, 13188, 13186, 13184, + 13254, 13252, 13250, 13248, 13350, 13348, 13346, 13344, + 13446, 13444, 13442, 13440, 13542, 13540, 13538, 13536, + 13638, 13636, 13634, 13632, 13734, 13732, 13730, 13728, + 13830, 13828, 13826, 13824, 13926, 13924, 13922, 13920, + 14022, 14020, 14018, 14016, 14118, 14116, 14114, 14112, + 14214, 14212, 14210, 14208, 14310, 14308, 14306, 14304, + 14406, 14404, 14402, 14400, 14502, 14500, 14498, 14496, + 14598, 14596, 14594, 14592, 14694, 14692, 14690, 14688, + 14790, 14788, 14786, 14784, 14886, 14884, 14882, 14880, + 15046, 15044, 15042, 15040, 15142, 15140, 15138, 15136, + 15238, 15236, 15234, 15232, 15334, 15332, 15330, 15328, + 15430, 15428, 15426, 15424, 15526, 15524, 15522, 15520, + 15622, 15620, 15618, 15616, 15718, 15716, 15714, 15712, + 15814, 15812, 15810, 15808, 15910, 15908, 15906, 15904, + 16006, 16004, 16002, 16000, 16102, 16100, 16098, 16096, + 16198, 16196, 16194, 16192, 16294, 16292, 16290, 16288, + 16390, 16388, 16386, 16384, 16486, 16484, 16482, 16480, + 16582, 16580, 16578, 16576, 16646, 16644, 16642, 16640, + 16742, 16740, 16738, 16736, 16838, 16836, 16834, 16832, + 16934, 16932, 16930, 16928, 17030, 17028, 17026, 17024, + 17126, 17124, 17122, 17120, 17222, 17220, 17218, 17216, + 17318, 17316, 17314, 17312, 17414, 17412, 17410, 17408, + 17510, 17508, 17506, 17504, 17606, 17604, 17602, 17600, + 17702, 17700, 17698, 17696, 17798, 17796, 17794, 17792, + 17894, 17892, 17890, 17888, 17990, 17988, 17986, 17984, + 18086, 18084, 18082, 18080, 18182, 18180, 18178, 18176, + 18246, 18244, 18242, 18240, 18342, 18340, 18338, 18336, + 18438, 18436, 18434, 18432, 18534, 18532, 18530, 18528, + 18630, 18628, 18626, 18624, 18726, 18724, 18722, 18720, + 18822, 18820, 18818, 18816, 18918, 18916, 18914, 18912, + 19014, 19012, 19010, 19008, 19110, 19108, 19106, 19104, + 19206, 19204, 19202, 19200, 19302, 19300, 19298, 19296, + 19398, 19396, 19394, 19392, 19494, 19492, 19490, 19488, + 19590, 19588, 19586, 19584, 19686, 19684, 19682, 19680, + 19782, 19780, 19778, 19776, }, + /* 9 */ + {78, 76, 74, 72, 174, 172, 170, 168, + 270, 268, 266, 264, 366, 364, 362, 360, + 462, 460, 458, 456, 558, 556, 554, 552, + 654, 652, 650, 648, 750, 748, 746, 744, + 846, 844, 842, 840, 942, 940, 938, 936, + 1038, 1036, 1034, 1032, 1134, 1132, 1130, 1128, + 1230, 1228, 1226, 1224, 1326, 1324, 1322, 1320, + 1422, 1420, 1418, 1416, 1518, 1516, 1514, 1512, + 1614, 1612, 1610, 1608, 1710, 1708, 1706, 1704, + 1774, 1772, 1770, 1768, 1870, 1868, 1866, 1864, + 1966, 1964, 1962, 1960, 2062, 2060, 2058, 2056, + 2158, 2156, 2154, 2152, 2254, 2252, 2250, 2248, + 2350, 2348, 2346, 2344, 2446, 2444, 2442, 2440, + 2542, 2540, 2538, 2536, 2638, 2636, 2634, 2632, + 2734, 2732, 2730, 2728, 2830, 2828, 2826, 2824, + 2926, 2924, 2922, 2920, 3022, 3020, 3018, 3016, + 3118, 3116, 3114, 3112, 3214, 3212, 3210, 3208, + 3310, 3308, 3306, 3304, 3374, 3372, 3370, 3368, + 3470, 3468, 3466, 3464, 3566, 3564, 3562, 3560, + 3662, 3660, 3658, 3656, 3758, 3756, 3754, 3752, + 3854, 3852, 3850, 3848, 3950, 3948, 3946, 3944, + 4046, 4044, 4042, 4040, 4142, 4140, 4138, 4136, + 4238, 4236, 4234, 4232, 4334, 4332, 4330, 4328, + 4430, 4428, 4426, 4424, 4526, 4524, 4522, 4520, + 4622, 4620, 4618, 4616, 4718, 4716, 4714, 4712, + 4814, 4812, 4810, 4808, 4910, 4908, 4906, 4904, + 5070, 5068, 5066, 5064, 5166, 5164, 5162, 5160, + 5262, 5260, 5258, 5256, 5358, 5356, 5354, 5352, + 5454, 5452, 5450, 5448, 5550, 5548, 5546, 5544, + 5646, 5644, 5642, 5640, 5742, 5740, 5738, 5736, + 5838, 5836, 5834, 5832, 5934, 5932, 5930, 5928, + 6030, 6028, 6026, 6024, 6126, 6124, 6122, 6120, + 6222, 6220, 6218, 6216, 6318, 6316, 6314, 6312, + 6414, 6412, 6410, 6408, 6510, 6508, 6506, 6504, + 6606, 6604, 6602, 6600, 6670, 6668, 6666, 6664, + 6766, 6764, 6762, 6760, 6862, 6860, 6858, 6856, + 6958, 6956, 6954, 6952, 7054, 7052, 7050, 7048, + 7150, 7148, 7146, 7144, 7246, 7244, 7242, 7240, + 7342, 7340, 7338, 7336, 7438, 7436, 7434, 7432, + 7534, 7532, 7530, 7528, 7630, 7628, 7626, 7624, + 7726, 7724, 7722, 7720, 7822, 7820, 7818, 7816, + 7918, 7916, 7914, 7912, 8014, 8012, 8010, 8008, + 8110, 8108, 8106, 8104, 8206, 8204, 8202, 8200, + 8302, 8300, 8298, 8296, 8366, 8364, 8362, 8360, + 8462, 8460, 8458, 8456, 8558, 8556, 8554, 8552, + 8654, 8652, 8650, 8648, 8750, 8748, 8746, 8744, + 8846, 8844, 8842, 8840, 8942, 8940, 8938, 8936, + 9038, 9036, 9034, 9032, 9134, 9132, 9130, 9128, + 9230, 9228, 9226, 9224, 9326, 9324, 9322, 9320, + 9422, 9420, 9418, 9416, 9518, 9516, 9514, 9512, + 9614, 9612, 9610, 9608, 9710, 9708, 9706, 9704, + 9806, 9804, 9802, 9800, 9902, 9900, 9898, 9896, + 10062, 10060, 10058, 10056, 10158, 10156, 10154, 10152, + 10254, 10252, 10250, 10248, 10350, 10348, 10346, 10344, + 10446, 10444, 10442, 10440, 10542, 10540, 10538, 10536, + 10638, 10636, 10634, 10632, 10734, 10732, 10730, 10728, + 10830, 10828, 10826, 10824, 10926, 10924, 10922, 10920, + 11022, 11020, 11018, 11016, 11118, 11116, 11114, 11112, + 11214, 11212, 11210, 11208, 11310, 11308, 11306, 11304, + 11406, 11404, 11402, 11400, 11502, 11500, 11498, 11496, + 11598, 11596, 11594, 11592, 11662, 11660, 11658, 11656, + 11758, 11756, 11754, 11752, 11854, 11852, 11850, 11848, + 11950, 11948, 11946, 11944, 12046, 12044, 12042, 12040, + 12142, 12140, 12138, 12136, 12238, 12236, 12234, 12232, + 12334, 12332, 12330, 12328, 12430, 12428, 12426, 12424, + 12526, 12524, 12522, 12520, 12622, 12620, 12618, 12616, + 12718, 12716, 12714, 12712, 12814, 12812, 12810, 12808, + 12910, 12908, 12906, 12904, 13006, 13004, 13002, 13000, + 13102, 13100, 13098, 13096, 13198, 13196, 13194, 13192, + 13262, 13260, 13258, 13256, 13358, 13356, 13354, 13352, + 13454, 13452, 13450, 13448, 13550, 13548, 13546, 13544, + 13646, 13644, 13642, 13640, 13742, 13740, 13738, 13736, + 13838, 13836, 13834, 13832, 13934, 13932, 13930, 13928, + 14030, 14028, 14026, 14024, 14126, 14124, 14122, 14120, + 14222, 14220, 14218, 14216, 14318, 14316, 14314, 14312, + 14414, 14412, 14410, 14408, 14510, 14508, 14506, 14504, + 14606, 14604, 14602, 14600, 14702, 14700, 14698, 14696, + 14798, 14796, 14794, 14792, 14894, 14892, 14890, 14888, + 15054, 15052, 15050, 15048, 15150, 15148, 15146, 15144, + 15246, 15244, 15242, 15240, 15342, 15340, 15338, 15336, + 15438, 15436, 15434, 15432, 15534, 15532, 15530, 15528, + 15630, 15628, 15626, 15624, 15726, 15724, 15722, 15720, + 15822, 15820, 15818, 15816, 15918, 15916, 15914, 15912, + 16014, 16012, 16010, 16008, 16110, 16108, 16106, 16104, + 16206, 16204, 16202, 16200, 16302, 16300, 16298, 16296, + 16398, 16396, 16394, 16392, 16494, 16492, 16490, 16488, + 16590, 16588, 16586, 16584, 16654, 16652, 16650, 16648, + 16750, 16748, 16746, 16744, 16846, 16844, 16842, 16840, + 16942, 16940, 16938, 16936, 17038, 17036, 17034, 17032, + 17134, 17132, 17130, 17128, 17230, 17228, 17226, 17224, + 17326, 17324, 17322, 17320, 17422, 17420, 17418, 17416, + 17518, 17516, 17514, 17512, 17614, 17612, 17610, 17608, + 17710, 17708, 17706, 17704, 17806, 17804, 17802, 17800, + 17902, 17900, 17898, 17896, 17998, 17996, 17994, 17992, + 18094, 18092, 18090, 18088, 18190, 18188, 18186, 18184, + 18254, 18252, 18250, 18248, 18350, 18348, 18346, 18344, + 18446, 18444, 18442, 18440, 18542, 18540, 18538, 18536, + 18638, 18636, 18634, 18632, 18734, 18732, 18730, 18728, + 18830, 18828, 18826, 18824, 18926, 18924, 18922, 18920, + 19022, 19020, 19018, 19016, 19118, 19116, 19114, 19112, + 19214, 19212, 19210, 19208, 19310, 19308, 19306, 19304, + 19406, 19404, 19402, 19400, 19502, 19500, 19498, 19496, + 19598, 19596, 19594, 19592, 19694, 19692, 19690, 19688, + 19790, 19788, 19786, 19784, }, + /* 10 */ + {86, 84, 82, 80, 182, 180, 178, 176, + 278, 276, 274, 272, 374, 372, 370, 368, + 470, 468, 466, 464, 566, 564, 562, 560, + 662, 660, 658, 656, 758, 756, 754, 752, + 854, 852, 850, 848, 950, 948, 946, 944, + 1046, 1044, 1042, 1040, 1142, 1140, 1138, 1136, + 1238, 1236, 1234, 1232, 1334, 1332, 1330, 1328, + 1430, 1428, 1426, 1424, 1526, 1524, 1522, 1520, + 1622, 1620, 1618, 1616, 1718, 1716, 1714, 1712, + 1782, 1780, 1778, 1776, 1878, 1876, 1874, 1872, + 1974, 1972, 1970, 1968, 2070, 2068, 2066, 2064, + 2166, 2164, 2162, 2160, 2262, 2260, 2258, 2256, + 2358, 2356, 2354, 2352, 2454, 2452, 2450, 2448, + 2550, 2548, 2546, 2544, 2646, 2644, 2642, 2640, + 2742, 2740, 2738, 2736, 2838, 2836, 2834, 2832, + 2934, 2932, 2930, 2928, 3030, 3028, 3026, 3024, + 3126, 3124, 3122, 3120, 3222, 3220, 3218, 3216, + 3318, 3316, 3314, 3312, 3382, 3380, 3378, 3376, + 3478, 3476, 3474, 3472, 3574, 3572, 3570, 3568, + 3670, 3668, 3666, 3664, 3766, 3764, 3762, 3760, + 3862, 3860, 3858, 3856, 3958, 3956, 3954, 3952, + 4054, 4052, 4050, 4048, 4150, 4148, 4146, 4144, + 4246, 4244, 4242, 4240, 4342, 4340, 4338, 4336, + 4438, 4436, 4434, 4432, 4534, 4532, 4530, 4528, + 4630, 4628, 4626, 4624, 4726, 4724, 4722, 4720, + 4822, 4820, 4818, 4816, 4918, 4916, 4914, 4912, + 5078, 5076, 5074, 5072, 5174, 5172, 5170, 5168, + 5270, 5268, 5266, 5264, 5366, 5364, 5362, 5360, + 5462, 5460, 5458, 5456, 5558, 5556, 5554, 5552, + 5654, 5652, 5650, 5648, 5750, 5748, 5746, 5744, + 5846, 5844, 5842, 5840, 5942, 5940, 5938, 5936, + 6038, 6036, 6034, 6032, 6134, 6132, 6130, 6128, + 6230, 6228, 6226, 6224, 6326, 6324, 6322, 6320, + 6422, 6420, 6418, 6416, 6518, 6516, 6514, 6512, + 6614, 6612, 6610, 6608, 6678, 6676, 6674, 6672, + 6774, 6772, 6770, 6768, 6870, 6868, 6866, 6864, + 6966, 6964, 6962, 6960, 7062, 7060, 7058, 7056, + 7158, 7156, 7154, 7152, 7254, 7252, 7250, 7248, + 7350, 7348, 7346, 7344, 7446, 7444, 7442, 7440, + 7542, 7540, 7538, 7536, 7638, 7636, 7634, 7632, + 7734, 7732, 7730, 7728, 7830, 7828, 7826, 7824, + 7926, 7924, 7922, 7920, 8022, 8020, 8018, 8016, + 8118, 8116, 8114, 8112, 8214, 8212, 8210, 8208, + 8310, 8308, 8306, 8304, 8374, 8372, 8370, 8368, + 8470, 8468, 8466, 8464, 8566, 8564, 8562, 8560, + 8662, 8660, 8658, 8656, 8758, 8756, 8754, 8752, + 8854, 8852, 8850, 8848, 8950, 8948, 8946, 8944, + 9046, 9044, 9042, 9040, 9142, 9140, 9138, 9136, + 9238, 9236, 9234, 9232, 9334, 9332, 9330, 9328, + 9430, 9428, 9426, 9424, 9526, 9524, 9522, 9520, + 9622, 9620, 9618, 9616, 9718, 9716, 9714, 9712, + 9814, 9812, 9810, 9808, 9910, 9908, 9906, 9904, + 10070, 10068, 10066, 10064, 10166, 10164, 10162, 10160, + 10262, 10260, 10258, 10256, 10358, 10356, 10354, 10352, + 10454, 10452, 10450, 10448, 10550, 10548, 10546, 10544, + 10646, 10644, 10642, 10640, 10742, 10740, 10738, 10736, + 10838, 10836, 10834, 10832, 10934, 10932, 10930, 10928, + 11030, 11028, 11026, 11024, 11126, 11124, 11122, 11120, + 11222, 11220, 11218, 11216, 11318, 11316, 11314, 11312, + 11414, 11412, 11410, 11408, 11510, 11508, 11506, 11504, + 11606, 11604, 11602, 11600, 11670, 11668, 11666, 11664, + 11766, 11764, 11762, 11760, 11862, 11860, 11858, 11856, + 11958, 11956, 11954, 11952, 12054, 12052, 12050, 12048, + 12150, 12148, 12146, 12144, 12246, 12244, 12242, 12240, + 12342, 12340, 12338, 12336, 12438, 12436, 12434, 12432, + 12534, 12532, 12530, 12528, 12630, 12628, 12626, 12624, + 12726, 12724, 12722, 12720, 12822, 12820, 12818, 12816, + 12918, 12916, 12914, 12912, 13014, 13012, 13010, 13008, + 13110, 13108, 13106, 13104, 13206, 13204, 13202, 13200, + 13270, 13268, 13266, 13264, 13366, 13364, 13362, 13360, + 13462, 13460, 13458, 13456, 13558, 13556, 13554, 13552, + 13654, 13652, 13650, 13648, 13750, 13748, 13746, 13744, + 13846, 13844, 13842, 13840, 13942, 13940, 13938, 13936, + 14038, 14036, 14034, 14032, 14134, 14132, 14130, 14128, + 14230, 14228, 14226, 14224, 14326, 14324, 14322, 14320, + 14422, 14420, 14418, 14416, 14518, 14516, 14514, 14512, + 14614, 14612, 14610, 14608, 14710, 14708, 14706, 14704, + 14806, 14804, 14802, 14800, 14902, 14900, 14898, 14896, + 15062, 15060, 15058, 15056, 15158, 15156, 15154, 15152, + 15254, 15252, 15250, 15248, 15350, 15348, 15346, 15344, + 15446, 15444, 15442, 15440, 15542, 15540, 15538, 15536, + 15638, 15636, 15634, 15632, 15734, 15732, 15730, 15728, + 15830, 15828, 15826, 15824, 15926, 15924, 15922, 15920, + 16022, 16020, 16018, 16016, 16118, 16116, 16114, 16112, + 16214, 16212, 16210, 16208, 16310, 16308, 16306, 16304, + 16406, 16404, 16402, 16400, 16502, 16500, 16498, 16496, + 16598, 16596, 16594, 16592, 16662, 16660, 16658, 16656, + 16758, 16756, 16754, 16752, 16854, 16852, 16850, 16848, + 16950, 16948, 16946, 16944, 17046, 17044, 17042, 17040, + 17142, 17140, 17138, 17136, 17238, 17236, 17234, 17232, + 17334, 17332, 17330, 17328, 17430, 17428, 17426, 17424, + 17526, 17524, 17522, 17520, 17622, 17620, 17618, 17616, + 17718, 17716, 17714, 17712, 17814, 17812, 17810, 17808, + 17910, 17908, 17906, 17904, 18006, 18004, 18002, 18000, + 18102, 18100, 18098, 18096, 18198, 18196, 18194, 18192, + 18262, 18260, 18258, 18256, 18358, 18356, 18354, 18352, + 18454, 18452, 18450, 18448, 18550, 18548, 18546, 18544, + 18646, 18644, 18642, 18640, 18742, 18740, 18738, 18736, + 18838, 18836, 18834, 18832, 18934, 18932, 18930, 18928, + 19030, 19028, 19026, 19024, 19126, 19124, 19122, 19120, + 19222, 19220, 19218, 19216, 19318, 19316, 19314, 19312, + 19414, 19412, 19410, 19408, 19510, 19508, 19506, 19504, + 19606, 19604, 19602, 19600, 19702, 19700, 19698, 19696, + 19798, 19796, 19794, 19792, }, + /* 11 */ + {94, 92, 90, 88, 190, 188, 186, 184, + 286, 284, 282, 280, 382, 380, 378, 376, + 478, 476, 474, 472, 574, 572, 570, 568, + 670, 668, 666, 664, 766, 764, 762, 760, + 862, 860, 858, 856, 958, 956, 954, 952, + 1054, 1052, 1050, 1048, 1150, 1148, 1146, 1144, + 1246, 1244, 1242, 1240, 1342, 1340, 1338, 1336, + 1438, 1436, 1434, 1432, 1534, 1532, 1530, 1528, + 1630, 1628, 1626, 1624, 1726, 1724, 1722, 1720, + 1790, 1788, 1786, 1784, 1886, 1884, 1882, 1880, + 1982, 1980, 1978, 1976, 2078, 2076, 2074, 2072, + 2174, 2172, 2170, 2168, 2270, 2268, 2266, 2264, + 2366, 2364, 2362, 2360, 2462, 2460, 2458, 2456, + 2558, 2556, 2554, 2552, 2654, 2652, 2650, 2648, + 2750, 2748, 2746, 2744, 2846, 2844, 2842, 2840, + 2942, 2940, 2938, 2936, 3038, 3036, 3034, 3032, + 3134, 3132, 3130, 3128, 3230, 3228, 3226, 3224, + 3326, 3324, 3322, 3320, 3390, 3388, 3386, 3384, + 3486, 3484, 3482, 3480, 3582, 3580, 3578, 3576, + 3678, 3676, 3674, 3672, 3774, 3772, 3770, 3768, + 3870, 3868, 3866, 3864, 3966, 3964, 3962, 3960, + 4062, 4060, 4058, 4056, 4158, 4156, 4154, 4152, + 4254, 4252, 4250, 4248, 4350, 4348, 4346, 4344, + 4446, 4444, 4442, 4440, 4542, 4540, 4538, 4536, + 4638, 4636, 4634, 4632, 4734, 4732, 4730, 4728, + 4830, 4828, 4826, 4824, 4926, 4924, 4922, 4920, + 5086, 5084, 5082, 5080, 5182, 5180, 5178, 5176, + 5278, 5276, 5274, 5272, 5374, 5372, 5370, 5368, + 5470, 5468, 5466, 5464, 5566, 5564, 5562, 5560, + 5662, 5660, 5658, 5656, 5758, 5756, 5754, 5752, + 5854, 5852, 5850, 5848, 5950, 5948, 5946, 5944, + 6046, 6044, 6042, 6040, 6142, 6140, 6138, 6136, + 6238, 6236, 6234, 6232, 6334, 6332, 6330, 6328, + 6430, 6428, 6426, 6424, 6526, 6524, 6522, 6520, + 6622, 6620, 6618, 6616, 6686, 6684, 6682, 6680, + 6782, 6780, 6778, 6776, 6878, 6876, 6874, 6872, + 6974, 6972, 6970, 6968, 7070, 7068, 7066, 7064, + 7166, 7164, 7162, 7160, 7262, 7260, 7258, 7256, + 7358, 7356, 7354, 7352, 7454, 7452, 7450, 7448, + 7550, 7548, 7546, 7544, 7646, 7644, 7642, 7640, + 7742, 7740, 7738, 7736, 7838, 7836, 7834, 7832, + 7934, 7932, 7930, 7928, 8030, 8028, 8026, 8024, + 8126, 8124, 8122, 8120, 8222, 8220, 8218, 8216, + 8318, 8316, 8314, 8312, 8382, 8380, 8378, 8376, + 8478, 8476, 8474, 8472, 8574, 8572, 8570, 8568, + 8670, 8668, 8666, 8664, 8766, 8764, 8762, 8760, + 8862, 8860, 8858, 8856, 8958, 8956, 8954, 8952, + 9054, 9052, 9050, 9048, 9150, 9148, 9146, 9144, + 9246, 9244, 9242, 9240, 9342, 9340, 9338, 9336, + 9438, 9436, 9434, 9432, 9534, 9532, 9530, 9528, + 9630, 9628, 9626, 9624, 9726, 9724, 9722, 9720, + 9822, 9820, 9818, 9816, 9918, 9916, 9914, 9912, + 10078, 10076, 10074, 10072, 10174, 10172, 10170, 10168, + 10270, 10268, 10266, 10264, 10366, 10364, 10362, 10360, + 10462, 10460, 10458, 10456, 10558, 10556, 10554, 10552, + 10654, 10652, 10650, 10648, 10750, 10748, 10746, 10744, + 10846, 10844, 10842, 10840, 10942, 10940, 10938, 10936, + 11038, 11036, 11034, 11032, 11134, 11132, 11130, 11128, + 11230, 11228, 11226, 11224, 11326, 11324, 11322, 11320, + 11422, 11420, 11418, 11416, 11518, 11516, 11514, 11512, + 11614, 11612, 11610, 11608, 11678, 11676, 11674, 11672, + 11774, 11772, 11770, 11768, 11870, 11868, 11866, 11864, + 11966, 11964, 11962, 11960, 12062, 12060, 12058, 12056, + 12158, 12156, 12154, 12152, 12254, 12252, 12250, 12248, + 12350, 12348, 12346, 12344, 12446, 12444, 12442, 12440, + 12542, 12540, 12538, 12536, 12638, 12636, 12634, 12632, + 12734, 12732, 12730, 12728, 12830, 12828, 12826, 12824, + 12926, 12924, 12922, 12920, 13022, 13020, 13018, 13016, + 13118, 13116, 13114, 13112, 13214, 13212, 13210, 13208, + 13278, 13276, 13274, 13272, 13374, 13372, 13370, 13368, + 13470, 13468, 13466, 13464, 13566, 13564, 13562, 13560, + 13662, 13660, 13658, 13656, 13758, 13756, 13754, 13752, + 13854, 13852, 13850, 13848, 13950, 13948, 13946, 13944, + 14046, 14044, 14042, 14040, 14142, 14140, 14138, 14136, + 14238, 14236, 14234, 14232, 14334, 14332, 14330, 14328, + 14430, 14428, 14426, 14424, 14526, 14524, 14522, 14520, + 14622, 14620, 14618, 14616, 14718, 14716, 14714, 14712, + 14814, 14812, 14810, 14808, 14910, 14908, 14906, 14904, + 15070, 15068, 15066, 15064, 15166, 15164, 15162, 15160, + 15262, 15260, 15258, 15256, 15358, 15356, 15354, 15352, + 15454, 15452, 15450, 15448, 15550, 15548, 15546, 15544, + 15646, 15644, 15642, 15640, 15742, 15740, 15738, 15736, + 15838, 15836, 15834, 15832, 15934, 15932, 15930, 15928, + 16030, 16028, 16026, 16024, 16126, 16124, 16122, 16120, + 16222, 16220, 16218, 16216, 16318, 16316, 16314, 16312, + 16414, 16412, 16410, 16408, 16510, 16508, 16506, 16504, + 16606, 16604, 16602, 16600, 16670, 16668, 16666, 16664, + 16766, 16764, 16762, 16760, 16862, 16860, 16858, 16856, + 16958, 16956, 16954, 16952, 17054, 17052, 17050, 17048, + 17150, 17148, 17146, 17144, 17246, 17244, 17242, 17240, + 17342, 17340, 17338, 17336, 17438, 17436, 17434, 17432, + 17534, 17532, 17530, 17528, 17630, 17628, 17626, 17624, + 17726, 17724, 17722, 17720, 17822, 17820, 17818, 17816, + 17918, 17916, 17914, 17912, 18014, 18012, 18010, 18008, + 18110, 18108, 18106, 18104, 18206, 18204, 18202, 18200, + 18270, 18268, 18266, 18264, 18366, 18364, 18362, 18360, + 18462, 18460, 18458, 18456, 18558, 18556, 18554, 18552, + 18654, 18652, 18650, 18648, 18750, 18748, 18746, 18744, + 18846, 18844, 18842, 18840, 18942, 18940, 18938, 18936, + 19038, 19036, 19034, 19032, 19134, 19132, 19130, 19128, + 19230, 19228, 19226, 19224, 19326, 19324, 19322, 19320, + 19422, 19420, 19418, 19416, 19518, 19516, 19514, 19512, + 19614, 19612, 19610, 19608, 19710, 19708, 19706, 19704, + 19806, 19804, 19802, 19800, }, +}; + diff --git a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc index 844359333d..ca4c6a6099 100644 --- a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc +++ b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc @@ -1732,6 +1732,16 @@ namespace gr { m_64apsk[62] = gr_complex( 7.0, -7.0); m_64apsk[63] = gr_complex( 7.0, 7.0); break; + case MOD_8VSB: + m_8psk[0] = gr_complex(-7.0 + 1.25, 0.0); + m_8psk[1] = gr_complex(-5.0 + 1.25, 0.0); + m_8psk[2] = gr_complex(-3.0 + 1.25, 0.0); + m_8psk[3] = gr_complex(-1.0 + 1.25, 0.0); + m_8psk[4] = gr_complex( 1.0 + 1.25, 0.0); + m_8psk[5] = gr_complex( 3.0 + 1.25, 0.0); + m_8psk[6] = gr_complex( 5.0 + 1.25, 0.0); + m_8psk[7] = gr_complex( 7.0 + 1.25, 0.0); + break; default: m_qpsk[0] = gr_complex((r1 * cos(M_PI / 4.0)), (r1 * sin(M_PI / 4.0))); m_qpsk[1] = gr_complex((r1 * cos(7 * M_PI / 4.0)), (r1 * sin(7 * M_PI / 4.0))); @@ -1791,6 +1801,7 @@ namespace gr { } break; case MOD_8PSK: + case MOD_8VSB: case MOD_8APSK: for (int i = 0; i < noutput_items; i++) { index = *in++; diff --git a/gr-dtv/lib/dvbt/dvbt_bit_inner_deinterleaver_impl.cc b/gr-dtv/lib/dvbt/dvbt_bit_inner_deinterleaver_impl.cc index 9e45c81018..c10a77c98a 100644 --- a/gr-dtv/lib/dvbt/dvbt_bit_inner_deinterleaver_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_bit_inner_deinterleaver_impl.cc @@ -26,10 +26,13 @@ #include "dvbt_bit_inner_deinterleaver_impl.h" #include <stdio.h> +#define MAX_MODULATION_ORDER 6 +#define INTERLEAVER_BLOCK_SIZE 126 + namespace gr { namespace dtv { - const int dvbt_bit_inner_deinterleaver_impl::d_bsize = 126; + const int dvbt_bit_inner_deinterleaver_impl::d_bsize = INTERLEAVER_BLOCK_SIZE; int dvbt_bit_inner_deinterleaver_impl::H(int e, int w) @@ -135,9 +138,8 @@ namespace gr { // First index of d_b is Bit interleaver number // Second index of d_b is the position inside Bit interleaver - // Linux: unsigned char d_b[d_v][d_bsize]; - __GR_VLA2D(unsigned char, d_b, d_v, d_bsize); - + unsigned char d_b[MAX_MODULATION_ORDER][INTERLEAVER_BLOCK_SIZE]; + for (int bcount = 0; bcount < bmax; bcount++) { for (int w = 0; w < d_bsize; w++) { int c = in[(bcount * d_bsize) + w]; diff --git a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc index d2bfb3d9d2..43146f02c5 100644 --- a/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc +++ b/gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc @@ -26,10 +26,13 @@ #include "dvbt_bit_inner_interleaver_impl.h" #include <stdio.h> +#define MAX_MODULATION_ORDER 6 +#define INTERLEAVER_BLOCK_SIZE 126 + namespace gr { namespace dtv { - const int dvbt_bit_inner_interleaver_impl::d_bsize = 126; + const int dvbt_bit_inner_interleaver_impl::d_bsize = INTERLEAVER_BLOCK_SIZE; int dvbt_bit_inner_interleaver_impl::H(int e, int w) @@ -118,8 +121,9 @@ namespace gr { void dvbt_bit_inner_interleaver_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) { - ninput_items_required[0] = noutput_items; - ninput_items_required[1] = noutput_items; + unsigned ninputs = ninput_items_required.size(); + for (unsigned i = 0; i < ninputs; i++) + ninput_items_required[i] = noutput_items; } int @@ -136,8 +140,7 @@ namespace gr { // First index of d_b is Bit interleaver number // Second index of d_b is the position inside the Bit interleaver - // Linux: unsigned char d_b[d_v][d_bsize]; - __GR_VLA2D(unsigned char, d_b, d_v, d_bsize); + unsigned char d_b[MAX_MODULATION_ORDER][INTERLEAVER_BLOCK_SIZE]; for (int bcount = 0; bcount < bmax; bcount++) { for (int i = 0; i < d_bsize; i++) { diff --git a/gr-dtv/python/dtv/CMakeLists.txt b/gr-dtv/python/dtv/CMakeLists.txt index 543c2c14cf..e39b21cbb9 100644 --- a/gr-dtv/python/dtv/CMakeLists.txt +++ b/gr-dtv/python/dtv/CMakeLists.txt @@ -28,7 +28,6 @@ GR_PYTHON_INSTALL( atsc_rx.py atsc_rx_filter.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/dtv - COMPONENT "dtv_python" ) ######################################################################## diff --git a/gr-dtv/swig/CMakeLists.txt b/gr-dtv/swig/CMakeLists.txt index 04b8b09ec7..7e98fa3b45 100644 --- a/gr-dtv/swig/CMakeLists.txt +++ b/gr-dtv/swig/CMakeLists.txt @@ -43,7 +43,6 @@ GR_SWIG_MAKE(dtv_swig dtv_swig.i) GR_SWIG_INSTALL( TARGETS dtv_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/dtv - COMPONENT "dtv_python" ) install( @@ -51,5 +50,4 @@ install( dtv_swig.i ${CMAKE_CURRENT_BINARY_DIR}/dtv_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "dtv_swig" ) diff --git a/gr-fec/CMakeLists.txt b/gr-fec/CMakeLists.txt index cc96cda6e3..c828fd92e7 100644 --- a/gr-fec/CMakeLists.txt +++ b/gr-fec/CMakeLists.txt @@ -34,6 +34,7 @@ GR_REGISTER_COMPONENT("gr-fec" ENABLE_GR_FEC Boost_FOUND ENABLE_GNURADIO_RUNTIME ENABLE_GR_BLOCKS + GSL_FOUND ) GR_SET_GLOBAL(GR_FEC_INCLUDE_DIRS @@ -51,40 +52,6 @@ SET(GR_PKG_FEC_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/fec) if(ENABLE_GR_FEC) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_FEC_DESCRIPTION "GNU Radio FEC Blocks") - -CPACK_COMPONENT("fec_runtime" - GROUP "FEC" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("fec_devel" - GROUP "FEC" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("fec_python" - GROUP "FEC" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;fec_runtime" -) - -CPACK_COMPONENT("fec_swig" - GROUP "FEC" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;fec_python;fec_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/fec) @@ -111,7 +78,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-fec.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "fec_devel" ) endif(ENABLE_GR_FEC) diff --git a/gr-fec/apps/CMakeLists.txt b/gr-fec/apps/CMakeLists.txt index 62fc6d26d4..41c6e4e2fc 100644 --- a/gr-fec/apps/CMakeLists.txt +++ b/gr-fec/apps/CMakeLists.txt @@ -32,11 +32,9 @@ # #INSTALL(TARGETS # DESTINATION ${GR_RUNTIME_DIR} -# COMPONENT "fec_devel" #) # #GR_PYTHON_INSTALL( # PROGRAMS # DESTINATION ${GR_RUNTIME_DIR} -# COMPONENT "fec_devel" #) diff --git a/gr-fec/examples/CMakeLists.txt b/gr-fec/examples/CMakeLists.txt index e1dfc4ebaf..a66df61ad0 100644 --- a/gr-fec/examples/CMakeLists.txt +++ b/gr-fec/examples/CMakeLists.txt @@ -40,5 +40,4 @@ install( polar_code_example.grc tpc_ber_curve_gen.grc DESTINATION ${GR_PKG_FEC_EXAMPLES_DIR} - COMPONENT "fec_python" ) diff --git a/gr-fec/grc/CMakeLists.txt b/gr-fec/grc/CMakeLists.txt index 27cb5af854..f61603df22 100644 --- a/gr-fec/grc/CMakeLists.txt +++ b/gr-fec/grc/CMakeLists.txt @@ -19,4 +19,8 @@ ######################################################################## file(GLOB xml_files "*.xml") -install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "fec_python") + +install(FILES + ${xml_files} + DESTINATION ${GRC_BLOCKS_DIR} +) diff --git a/gr-fec/include/gnuradio/fec/CMakeLists.txt b/gr-fec/include/gnuradio/fec/CMakeLists.txt index 57594b47d8..5894b1d14a 100644 --- a/gr-fec/include/gnuradio/fec/CMakeLists.txt +++ b/gr-fec/include/gnuradio/fec/CMakeLists.txt @@ -60,8 +60,8 @@ install(FILES polar_decoder_sc_list.h polar_decoder_common.h polar_encoder_systematic.h - polar_decoder_sc_systematic.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/fec - COMPONENT "fec_devel" + polar_decoder_sc_systematic.h + DESTINATION ${GR_INCLUDE_DIR}/gnuradio/fec ) if(GSL_FOUND) @@ -73,6 +73,5 @@ if(GSL_FOUND) ldpc_par_mtrx_encoder.h ldpc_gen_mtrx_encoder.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/fec - COMPONENT "fec_devel" ) endif(GSL_FOUND) diff --git a/gr-fec/lib/CMakeLists.txt b/gr-fec/lib/CMakeLists.txt index bda98016b0..7ed38404f3 100644 --- a/gr-fec/lib/CMakeLists.txt +++ b/gr-fec/lib/CMakeLists.txt @@ -131,7 +131,7 @@ endif(GSL_FOUND) add_library(gnuradio-fec SHARED ${gnuradio_fec_sources}) target_link_libraries(gnuradio-fec ${gnuradio_fec_libs}) -GR_LIBRARY_FOO(gnuradio-fec RUNTIME_COMPONENT "fec_runtime" DEVEL_COMPONENT "fec_devel") +GR_LIBRARY_FOO(gnuradio-fec) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -153,6 +153,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-fec_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "fec_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-fec/lib/generic_decoder.cc b/gr-fec/lib/generic_decoder.cc index aa11aa8d5e..62d4d2a581 100644 --- a/gr-fec/lib/generic_decoder.cc +++ b/gr-fec/lib/generic_decoder.cc @@ -36,8 +36,6 @@ namespace gr { d_name = name; my_id = base_unique_id++; -#ifdef ENABLE_GR_LOG -#ifdef HAVE_LOG4CPP prefs *p = prefs::singleton(); std::string config_file = p->get_string("LOG", "log_config", ""); std::string log_level = p->get_string("LOG", "log_level", "off"); @@ -58,12 +56,8 @@ namespace gr { GR_LOG_SET_FILE_APPENDER(LOG, log_file , true,"%r :%p: %c{1} - %m%n"); } } - d_logger = LOG; -#endif /* HAVE_LOG4CPP */ -#else /* ENABLE_GR_LOG */ - d_logger = NULL; -#endif /* ENABLE_GR_LOG */ + d_logger = LOG; } generic_decoder::~generic_decoder() diff --git a/gr-fec/lib/generic_encoder.cc b/gr-fec/lib/generic_encoder.cc index c5c7f04f55..7872f17068 100644 --- a/gr-fec/lib/generic_encoder.cc +++ b/gr-fec/lib/generic_encoder.cc @@ -36,8 +36,6 @@ namespace gr { d_name = name; my_id = base_unique_id++; -#ifdef ENABLE_GR_LOG -#ifdef HAVE_LOG4CPP prefs *p = prefs::singleton(); std::string config_file = p->get_string("LOG", "log_config", ""); std::string log_level = p->get_string("LOG", "log_level", "off"); @@ -58,12 +56,8 @@ namespace gr { GR_LOG_SET_FILE_APPENDER(LOG, log_file , true,"%r :%p: %c{1} - %m%n"); } } - d_logger = LOG; -#endif /* HAVE_LOG4CPP */ -#else /* ENABLE_GR_LOG */ - d_logger = NULL; -#endif /* ENABLE_GR_LOG */ + d_logger = LOG; } generic_encoder::~generic_encoder() diff --git a/gr-fec/lib/reed-solomon/CMakeLists.txt b/gr-fec/lib/reed-solomon/CMakeLists.txt index 0858a670c5..3d35c9025d 100644 --- a/gr-fec/lib/reed-solomon/CMakeLists.txt +++ b/gr-fec/lib/reed-solomon/CMakeLists.txt @@ -46,7 +46,6 @@ list(APPEND gnuradio_fec_sources ${gr_fec_rs_sources}) #install( # FILES ${CMAKE_CURRENT_SOURCE_DIR}/rs.h # DESTINATION ${GR_INCLUDE_DIR}/gnuradio/fec -# COMPONENT "fec_devel" #) ######################################################################## diff --git a/gr-fec/lib/viterbi/CMakeLists.txt b/gr-fec/lib/viterbi/CMakeLists.txt index 3697787bcc..10c5940246 100644 --- a/gr-fec/lib/viterbi/CMakeLists.txt +++ b/gr-fec/lib/viterbi/CMakeLists.txt @@ -51,7 +51,6 @@ list(APPEND gnuradio_fec_sources ${viterbi_sources}) #install( # FILES ${CMAKE_CURRENT_SOURCE_DIR}/viterbi.h # DESTINATION ${GR_INCLUDE_DIR}/gnuradio/fec -# COMPONENT "fec_devel" #) ######################################################################## diff --git a/gr-fec/python/fec/CMakeLists.txt b/gr-fec/python/fec/CMakeLists.txt index 1b20004e6e..9d170b0423 100644 --- a/gr-fec/python/fec/CMakeLists.txt +++ b/gr-fec/python/fec/CMakeLists.txt @@ -36,7 +36,6 @@ GR_PYTHON_INSTALL( fec_test.py bercurve_generator.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/fec - COMPONENT "fec_python" ) add_subdirectory(polar) diff --git a/gr-fec/python/fec/LDPC/CMakeLists.txt b/gr-fec/python/fec/LDPC/CMakeLists.txt index 3e56ef3975..d2022412b3 100644 --- a/gr-fec/python/fec/LDPC/CMakeLists.txt +++ b/gr-fec/python/fec/LDPC/CMakeLists.txt @@ -26,5 +26,4 @@ GR_PYTHON_INSTALL( Generate_LDPC_matrix_functions.py Generate_LDPC_matrix.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/fec/LDPC - COMPONENT "fec_python" -)
\ No newline at end of file +) diff --git a/gr-fec/python/fec/polar/CMakeLists.txt b/gr-fec/python/fec/polar/CMakeLists.txt index a863995aff..1efed062ff 100644 --- a/gr-fec/python/fec/polar/CMakeLists.txt +++ b/gr-fec/python/fec/polar/CMakeLists.txt @@ -28,14 +28,10 @@ GR_PYTHON_INSTALL( channel_construction_bec.py helper_functions.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/fec/polar - COMPONENT "fec_python" ) GR_PYTHON_INSTALL( PROGRAMS polar_channel_construction DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "fec_python" ) - - diff --git a/gr-fec/python/fec/polar/polar_channel_construction b/gr-fec/python/fec/polar/polar_channel_construction index 448253659e..1c999aa145 100644 --- a/gr-fec/python/fec/polar/polar_channel_construction +++ b/gr-fec/python/fec/polar/polar_channel_construction @@ -21,25 +21,22 @@ # """ A tool for POLAR code channel construction.""" -from optparse import OptionParser +from argparse import ArgumentParser import gnuradio.fec.polar as cc def setup_parser(): - """ Init the option parser. If derived classes need to add options, + """Init the argument parser. If derived classes need to add options, override this and call the parent function. """ - parser = OptionParser(add_help_option=False) - parser.usage = '%prog [blocksize] [designsnr] [mu]' - - parser.add_option("-h", "--help", action="help", help="Displays this help message.") - - parser.add_option("-c", "--channel", action="store", type="string", dest="channel", - help="specify channel, currently BEC or AWGN (default='BEC')", default='BEC') - parser.add_option("-b", "--blocksize", action="store", type="int", dest="block_size", + parser = ArgumentParser() + parser.add_argument("-c", "--channel", choices=('BEC', 'AWGN'), + help="specify channel, currently BEC or AWGN (default='BEC')", + default='BEC') + parser.add_argument("-b", "--blocksize", type=int, dest="block_size", help="specify block size of polar code (default=16)", default=16) - parser.add_option("-s", "--desgin-snr", action="store", type="float", dest="design_snr", + parser.add_argument("-s", "--desgin-snr", type=float, dest="design_snr", help="specify design SNR of polar code (default=0.0)", default=0.0) - parser.add_option("-k", "--mu", action="store", type="int", dest="mu", + parser.add_argument("-k", "--mu", type=int, help="specify block size of polar code (default=2)", default=2) return parser @@ -47,26 +44,13 @@ def setup_parser(): def main(): """ Here we go. Parse command, choose class and run. """ - print('POLAR code channel constructor commandline tool') + print 'POLAR code channel constructor commandline tool' parser = setup_parser() - (options, args) = parser.parse_args() - - channel = str(options.channel) - block_size = int(options.block_size) - design_snr = float(options.design_snr) - mu = int(options.mu) - - if len(args) > 0: - channel = str(args[0]) - if len(args) > 1: - block_size = int(args[1]) - if len(args) > 2: - design_snr = float(args[2]) - if len(args) == 4: - mu = int(args[3]) + args = parser.parse_args() - z_params = cc.get_z_params(False, channel, block_size, design_snr, mu) - print(z_params) + z_params = cc.get_z_params(False, args.channel, args.block_size, + args.design_snr, args.mu) + print z_params if __name__ == '__main__': diff --git a/gr-fec/swig/CMakeLists.txt b/gr-fec/swig/CMakeLists.txt index 5a7984925b..5eaa5de748 100644 --- a/gr-fec/swig/CMakeLists.txt +++ b/gr-fec/swig/CMakeLists.txt @@ -41,14 +41,13 @@ endif(GSL_FOUND) set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/fec_swig_doc.i) set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include/gnuradio/fec) set(GR_SWIG_DOCS_TARGET_DEPS runtime_swig_swig_doc) -set(GR_SWIG_LIBRARIES gnuradio-fec) +set(GR_SWIG_LIBRARIES gnuradio-fec ${GSL_LDFLAGS}) GR_SWIG_MAKE(fec_swig fec_swig.i) GR_SWIG_INSTALL( TARGETS fec_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/fec - COMPONENT "fec_python" ) install( @@ -56,5 +55,4 @@ install( fec_swig.i ${CMAKE_CURRENT_BINARY_DIR}/fec_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "fec_swig" ) diff --git a/gr-fft/CMakeLists.txt b/gr-fft/CMakeLists.txt index 586abe56af..9ac6962c85 100644 --- a/gr-fft/CMakeLists.txt +++ b/gr-fft/CMakeLists.txt @@ -48,40 +48,6 @@ GR_SET_GLOBAL(GR_FFT_INCLUDE_DIRS if(ENABLE_GR_FFT) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_FFT_DESCRIPTION "GNU Radio FFT Blocks") - -CPACK_COMPONENT("fft_runtime" - GROUP "FFT" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("fft_devel" - GROUP "FFT" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("fft_python" - GROUP "FFT" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;fft_runtime" -) - -CPACK_COMPONENT("fft_swig" - GROUP "FFT" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;fft_python;fft_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/fft) @@ -105,7 +71,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-fft.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "fft_devel" ) endif(ENABLE_GR_FFT) diff --git a/gr-fft/grc/CMakeLists.txt b/gr-fft/grc/CMakeLists.txt index cc972dfa7e..8eeb431c3e 100644 --- a/gr-fft/grc/CMakeLists.txt +++ b/gr-fft/grc/CMakeLists.txt @@ -24,5 +24,4 @@ install(FILES fft_logpwrfft_x.xml fft_ctrlport_probe_psd.xml DESTINATION ${GRC_BLOCKS_DIR} - COMPONENT "fft_python" ) diff --git a/gr-fft/include/gnuradio/fft/CMakeLists.txt b/gr-fft/include/gnuradio/fft/CMakeLists.txt index 55705ee660..0f52b0aa96 100644 --- a/gr-fft/include/gnuradio/fft/CMakeLists.txt +++ b/gr-fft/include/gnuradio/fft/CMakeLists.txt @@ -29,14 +29,11 @@ install(FILES goertzel_fc.h window.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/fft - COMPONENT "fft_devel" ) if(ENABLE_GR_CTRLPORT) install(FILES ctrlport_probe_psd.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/fft - COMPONENT "fft_devel" ) endif(ENABLE_GR_CTRLPORT) - diff --git a/gr-fft/lib/CMakeLists.txt b/gr-fft/lib/CMakeLists.txt index 77476e58b4..9777d243df 100644 --- a/gr-fft/lib/CMakeLists.txt +++ b/gr-fft/lib/CMakeLists.txt @@ -83,7 +83,7 @@ endif() add_library(gnuradio-fft SHARED ${fft_sources}) target_link_libraries(gnuradio-fft ${fft_libs}) -GR_LIBRARY_FOO(gnuradio-fft RUNTIME_COMPONENT "fft_runtime" DEVEL_COMPONENT "fft_devel") +GR_LIBRARY_FOO(gnuradio-fft) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -105,6 +105,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-fft_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "fft_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-fft/python/fft/CMakeLists.txt b/gr-fft/python/fft/CMakeLists.txt index b5a8c9d4f7..016c76d27d 100644 --- a/gr-fft/python/fft/CMakeLists.txt +++ b/gr-fft/python/fft/CMakeLists.txt @@ -25,7 +25,6 @@ GR_PYTHON_INSTALL( __init__.py logpwrfft.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/fft - COMPONENT "fft_python" ) ######################################################################## diff --git a/gr-fft/swig/CMakeLists.txt b/gr-fft/swig/CMakeLists.txt index 74a4a25b10..67e34bbba8 100644 --- a/gr-fft/swig/CMakeLists.txt +++ b/gr-fft/swig/CMakeLists.txt @@ -44,7 +44,6 @@ GR_SWIG_MAKE(fft_swig fft_swig.i) GR_SWIG_INSTALL( TARGETS fft_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/fft - COMPONENT "fft_python" ) install( @@ -52,5 +51,4 @@ install( fft_swig.i ${CMAKE_CURRENT_BINARY_DIR}/fft_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "fft_swig" ) diff --git a/gr-filter/CMakeLists.txt b/gr-filter/CMakeLists.txt index c0d46d521a..972cd2c8b0 100644 --- a/gr-filter/CMakeLists.txt +++ b/gr-filter/CMakeLists.txt @@ -51,40 +51,6 @@ SET(GR_PKG_FILTER_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/filter) if(ENABLE_GR_FILTER) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_FILTER_DESCRIPTION "GNU Radio Filter Blocks") - -CPACK_COMPONENT("filter_runtime" - GROUP "Filter" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("filter_devel" - GROUP "Filter" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("filter_python" - GROUP "Filter" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;filter_runtime" -) - -CPACK_COMPONENT("filter_swig" - GROUP "Filter" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;filter_python;filter_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/filter) @@ -111,7 +77,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-filter.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "filter_devel" ) endif(ENABLE_GR_FILTER) diff --git a/gr-filter/apps/CMakeLists.txt b/gr-filter/apps/CMakeLists.txt index 61e2f183ad..8df2c025c6 100644 --- a/gr-filter/apps/CMakeLists.txt +++ b/gr-filter/apps/CMakeLists.txt @@ -26,5 +26,4 @@ GR_PYTHON_INSTALL( PROGRAMS gr_filter_design DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "filter_python" ) diff --git a/gr-filter/examples/CMakeLists.txt b/gr-filter/examples/CMakeLists.txt index a6229f38f4..c7410a839c 100644 --- a/gr-filter/examples/CMakeLists.txt +++ b/gr-filter/examples/CMakeLists.txt @@ -37,7 +37,6 @@ GR_PYTHON_INSTALL(PROGRAMS gr_filtdes_restrict.py gr_filtdes_live_upd.py DESTINATION ${GR_PKG_FILTER_EXAMPLES_DIR} - COMPONENT "filter_python" ) install( @@ -45,5 +44,4 @@ install( filter_taps.grc resampler_demo.grc DESTINATION ${GR_PKG_FILTER_EXAMPLES_DIR} - COMPONENT "filter_python" ) diff --git a/gr-filter/examples/benchmark_filters.py b/gr-filter/examples/benchmark_filters.py index 18380a7a34..4da6b9f5ad 100755 --- a/gr-filter/examples/benchmark_filters.py +++ b/gr-filter/examples/benchmark_filters.py @@ -22,10 +22,10 @@ import time import random -from optparse import OptionParser +from argparse import ArgumentParser from gnuradio import gr from gnuradio import blocks, filter -from gnuradio.eng_option import eng_option +from gnuradio.eng_arg import eng_float, intx def make_random_complex_tuple(L): result = [] @@ -52,25 +52,17 @@ def benchmark(name, creator, dec, ntaps, total_test_size, block_size): name, ntaps, total_test_size, delta, ntaps*total_test_size/delta) def main(): - parser = OptionParser(option_class=eng_option) - parser.add_option("-n", "--ntaps", type="int", default=256) - parser.add_option("-t", "--total-input-size", type="eng_float", default=40e6) - parser.add_option("-b", "--block-size", type="intx", default=50000) - parser.add_option("-d", "--decimation", type="int", default=1) - (options, args) = parser.parse_args() - if len(args) != 0: - parser.print_help() - sys.exit(1) + parser = ArgumentParser() + parser.add_argument("-n", "--ntaps", type=int, default=256) + parser.add_argument("-t", "--total-input-size", type=eng_float, default=40e6) + parser.add_argument("-b", "--block-size", type=intx, default=50000) + parser.add_argument("-d", "--decimation", type=int, default=1) + args = parser.parse_args() - ntaps = options.ntaps - total_input_size = options.total_input_size - block_size = options.block_size - dec = options.decimation - - benchmark("filter.fir_filter_ccc", filter.fir_filter_ccc, - dec, ntaps, total_input_size, block_size) - benchmark("filter.fft_filter_ccc", filter.fft_filter_ccc, - dec, ntaps, total_input_size, block_size) + benchmark("filter.fir_filter_ccc", filter.fir_filter_ccc, args.decimation, + args.ntaps, args.total_input_size, args.block_size) + benchmark("filter.fft_filter_ccc", filter.fft_filter_ccc, args.decimation, + args.ntaps, args.total_input_size, args.block_size) if __name__ == '__main__': main() diff --git a/gr-filter/examples/fft_filter_ccc.py b/gr-filter/examples/fft_filter_ccc.py index 00b0697b6c..92bcc7e316 100755 --- a/gr-filter/examples/fft_filter_ccc.py +++ b/gr-filter/examples/fft_filter_ccc.py @@ -24,8 +24,8 @@ from gnuradio import gr, filter from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import sys try: @@ -68,30 +68,30 @@ class example_fft_filter_ccc(gr.top_block): self.connect(self.head, self.filt0, self.vsnk_out) def main(): - parser = OptionParser(option_class=eng_option, conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=10000, - help="Number of samples to process [default=%default]") - parser.add_option("-s", "--samplerate", type="eng_float", default=8000, - help="System sample rate [default=%default]") - parser.add_option("-S", "--start-pass", type="eng_float", default=1000, - help="Start of Passband [default=%default]") - parser.add_option("-E", "--end-pass", type="eng_float", default=2000, - help="End of Passband [default=%default]") - parser.add_option("-T", "--transition", type="eng_float", default=100, - help="Transition band [default=%default]") - parser.add_option("-A", "--attenuation", type="eng_float", default=80, - help="Stopband attenuation [default=%default]") - parser.add_option("-D", "--decimation", type="int", default=1, - help="Decmation factor [default=%default]") - (options, args) = parser.parse_args () - - put = example_fft_filter_ccc(options.nsamples, - options.samplerate, - options.start_pass, - options.end_pass, - options.transition, - options.attenuation, - options.decimation) + parser = ArgumentParser(conflict_handler="resolve") + parser.add_argument("-N", "--nsamples", type=int, default=10000, + help="Number of samples to process [default=%(default)r]") + parser.add_argument("-s", "--samplerate", type=eng_float, default=8000, + help="System sample rate [default=%(default)r]") + parser.add_argument("-S", "--start-pass", type=eng_float, default=1000, + help="Start of Passband [default=%(default)r]") + parser.add_argument("-E", "--end-pass", type=eng_float, default=2000, + help="End of Passband [default=%(default)r]") + parser.add_argument("-T", "--transition", type=eng_float, default=100, + help="Transition band [default=%(default)r]") + parser.add_argument("-A", "--attenuation", type=eng_float, default=80, + help="Stopband attenuation [default=%(default)r]") + parser.add_argument("-D", "--decimation", type=int, default=1, + help="Decmation factor [default=%(default)r]") + args = parser.parse_args() + + put = example_fft_filter_ccc(args.nsamples, + args.samplerate, + args.start_pass, + args.end_pass, + args.transition, + args.attenuation, + args.decimation) put.run() data_src = scipy.array(put.vsnk_src.data()) @@ -102,9 +102,9 @@ def main(): f1 = pylab.figure(1, figsize=(12,10)) s1 = f1.add_subplot(1,1,1) s1.psd(data_src, NFFT=nfft, noverlap=nfft/4, - Fs=options.samplerate) + Fs=args.samplerate) s1.psd(data_snk, NFFT=nfft, noverlap=nfft/4, - Fs=options.samplerate) + Fs=args.samplerate) f2 = pylab.figure(2, figsize=(12,10)) s2 = f2.add_subplot(1,1,1) diff --git a/gr-filter/examples/fir_filter_ccc.py b/gr-filter/examples/fir_filter_ccc.py index b295e299bb..357e3d7111 100755 --- a/gr-filter/examples/fir_filter_ccc.py +++ b/gr-filter/examples/fir_filter_ccc.py @@ -24,8 +24,8 @@ from gnuradio import gr, filter from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import sys try: @@ -65,27 +65,27 @@ class example_fir_filter_ccc(gr.top_block): self.connect(self.head, self.filt0, self.vsnk_out) def main(): - parser = OptionParser(option_class=eng_option, conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=10000, - help="Number of samples to process [default=%default]") - parser.add_option("-s", "--samplerate", type="eng_float", default=8000, - help="System sample rate [default=%default]") - parser.add_option("-B", "--bandwidth", type="eng_float", default=1000, - help="Filter bandwidth [default=%default]") - parser.add_option("-T", "--transition", type="eng_float", default=100, - help="Transition band [default=%default]") - parser.add_option("-A", "--attenuation", type="eng_float", default=80, - help="Stopband attenuation [default=%default]") - parser.add_option("-D", "--decimation", type="int", default=1, - help="Decmation factor [default=%default]") - (options, args) = parser.parse_args () - - put = example_fir_filter_ccc(options.nsamples, - options.samplerate, - options.bandwidth, - options.transition, - options.attenuation, - options.decimation) + parser = ArgumentParser(conflict_handler="resolve") + parser.add_argument("-N", "--nsamples", type=int, default=10000, + help="Number of samples to process [default=%(default)r]") + parser.add_argument("-s", "--samplerate", type=eng_float, default=8000, + help="System sample rate [default=%(default)r]") + parser.add_argument("-B", "--bandwidth", type=eng_float, default=1000, + help="Filter bandwidth [default=%(default)r]") + parser.add_argument("-T", "--transition", type=eng_float, default=100, + help="Transition band [default=%(default)r]") + parser.add_argument("-A", "--attenuation", type=eng_float, default=80, + help="Stopband attenuation [default=%(default)r]") + parser.add_argument("-D", "--decimation", type=int, default=1, + help="Decmation factor [default=%(default)r]") + args = parser.parse_args() + + put = example_fir_filter_ccc(args.nsamples, + args.samplerate, + args.bandwidth, + args.transition, + args.attenuation, + args.decimation) put.run() data_src = scipy.array(put.vsnk_src.data()) @@ -96,9 +96,9 @@ def main(): f1 = pylab.figure(1, figsize=(12,10)) s1 = f1.add_subplot(1,1,1) s1.psd(data_src, NFFT=nfft, noverlap=nfft/4, - Fs=options.samplerate) + Fs=args.samplerate) s1.psd(data_snk, NFFT=nfft, noverlap=nfft/4, - Fs=options.samplerate) + Fs=args.samplerate) f2 = pylab.figure(2, figsize=(12,10)) s2 = f2.add_subplot(1,1,1) diff --git a/gr-filter/examples/fir_filter_fff.py b/gr-filter/examples/fir_filter_fff.py index 60b61054e9..2019215f12 100755 --- a/gr-filter/examples/fir_filter_fff.py +++ b/gr-filter/examples/fir_filter_fff.py @@ -24,8 +24,8 @@ from gnuradio import gr, filter from gnuradio import analog from gnuradio import blocks from gnuradio import eng_notation -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import sys try: @@ -65,27 +65,27 @@ class example_fir_filter_fff(gr.top_block): self.connect(self.head, self.filt0, self.vsnk_out) def main(): - parser = OptionParser(option_class=eng_option, conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=10000, - help="Number of samples to process [default=%default]") - parser.add_option("-s", "--samplerate", type="eng_float", default=8000, - help="System sample rate [default=%default]") - parser.add_option("-B", "--bandwidth", type="eng_float", default=1000, - help="Filter bandwidth [default=%default]") - parser.add_option("-T", "--transition", type="eng_float", default=100, - help="Transition band [default=%default]") - parser.add_option("-A", "--attenuation", type="eng_float", default=80, - help="Stopband attenuation [default=%default]") - parser.add_option("-D", "--decimation", type="int", default=1, - help="Decmation factor [default=%default]") - (options, args) = parser.parse_args () - - put = example_fir_filter_fff(options.nsamples, - options.samplerate, - options.bandwidth, - options.transition, - options.attenuation, - options.decimation) + parser = ArgumentParser(conflict_handler="resolve") + parser.add_argument("-N", "--nsamples", type=int, default=10000, + help="Number of samples to process [default=%(default)r]") + parser.add_argument("-s", "--samplerate", type=eng_float, default=8000, + help="System sample rate [default=%(default)r]") + parser.add_argument("-B", "--bandwidth", type=eng_float, default=1000, + help="Filter bandwidth [default=%(default)r]") + parser.add_argument("-T", "--transition", type=eng_float, default=100, + help="Transition band [default=%(default)r]") + parser.add_argument("-A", "--attenuation", type=eng_float, default=80, + help="Stopband attenuation [default=%(default)r]") + parser.add_argument("-D", "--decimation", type=int, default=1, + help="Decmation factor [default=%(default)r]") + args = parser.parse_args() + + put = example_fir_filter_fff(args.nsamples, + args.samplerate, + args.bandwidth, + args.transition, + args.attenuation, + args.decimation) put.run() data_src = scipy.array(put.vsnk_src.data()) @@ -96,9 +96,9 @@ def main(): f1 = pylab.figure(1, figsize=(12,10)) s1 = f1.add_subplot(1,1,1) s1.psd(data_src, NFFT=nfft, noverlap=nfft/4, - Fs=options.samplerate) + Fs=args.samplerate) s1.psd(data_snk, NFFT=nfft, noverlap=nfft/4, - Fs=options.samplerate) + Fs=args.samplerate) f2 = pylab.figure(2, figsize=(12,10)) s2 = f2.add_subplot(1,1,1) diff --git a/gr-filter/grc/CMakeLists.txt b/gr-filter/grc/CMakeLists.txt index b3bc2e1828..6c67a5a6ae 100644 --- a/gr-filter/grc/CMakeLists.txt +++ b/gr-filter/grc/CMakeLists.txt @@ -51,5 +51,4 @@ install(FILES variable_band_reject_filter_taps.xml variable_rrc_filter_taps.xml DESTINATION ${GRC_BLOCKS_DIR} - COMPONENT "filter_python" ) diff --git a/gr-filter/grc/filter_fractional_resampler_xx.xml b/gr-filter/grc/filter_fractional_resampler_xx.xml index 40957b889d..b2b4b1066c 100644 --- a/gr-filter/grc/filter_fractional_resampler_xx.xml +++ b/gr-filter/grc/filter_fractional_resampler_xx.xml @@ -42,7 +42,12 @@ <sink> <name>rate</name> <type>float</type> - <optional>1</optional> + <optional>1</optional> + </sink> + <sink> + <name>msg_in</name> + <type>message</type> + <optional>1</optional> </sink> <source> <name>out</name> diff --git a/gr-filter/include/gnuradio/filter/CMakeLists.txt b/gr-filter/include/gnuradio/filter/CMakeLists.txt index e75f02b7a2..7ad692743a 100644 --- a/gr-filter/include/gnuradio/filter/CMakeLists.txt +++ b/gr-filter/include/gnuradio/filter/CMakeLists.txt @@ -76,6 +76,5 @@ install(FILES single_pole_iir_filter_cc.h single_pole_iir_filter_ff.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/filter - COMPONENT "filter_devel" ) diff --git a/gr-filter/include/gnuradio/filter/fractional_resampler_cc.h b/gr-filter/include/gnuradio/filter/fractional_resampler_cc.h index 6fde6dde8a..65e53e23f2 100644 --- a/gr-filter/include/gnuradio/filter/fractional_resampler_cc.h +++ b/gr-filter/include/gnuradio/filter/fractional_resampler_cc.h @@ -32,6 +32,11 @@ namespace gr { /*! * \brief resampling MMSE filter with complex input, complex output * \ingroup resamplers_blk + * + * \details + * The resampling ratio and mu parameters can be set with a pmt dict + * message. Keys are pmt symbols with the strings "resamp_ratio" and "mu" + * and values are pmt floats. */ class FILTER_API fractional_resampler_cc : virtual public block { diff --git a/gr-filter/include/gnuradio/filter/fractional_resampler_ff.h b/gr-filter/include/gnuradio/filter/fractional_resampler_ff.h index 9836010af5..f8d207d337 100644 --- a/gr-filter/include/gnuradio/filter/fractional_resampler_ff.h +++ b/gr-filter/include/gnuradio/filter/fractional_resampler_ff.h @@ -32,7 +32,13 @@ namespace gr { /*! * \brief Resampling MMSE filter with float input, float output * \ingroup resamplers_blk + * + * \details + * The resampling ratio and mu parameters can be set with a pmt dict + * message. Keys are pmt symbols with the strings "resamp_ratio" and "mu" + * and values are pmt floats. */ + class FILTER_API fractional_resampler_ff : virtual public block { public: diff --git a/gr-filter/lib/CMakeLists.txt b/gr-filter/lib/CMakeLists.txt index feabe73be7..ff869eafe5 100644 --- a/gr-filter/lib/CMakeLists.txt +++ b/gr-filter/lib/CMakeLists.txt @@ -119,7 +119,7 @@ list(APPEND filter_libs add_library(gnuradio-filter SHARED ${filter_sources}) target_link_libraries(gnuradio-filter ${filter_libs}) -GR_LIBRARY_FOO(gnuradio-filter RUNTIME_COMPONENT "filter_runtime" DEVEL_COMPONENT "filter_devel") +GR_LIBRARY_FOO(gnuradio-filter) add_dependencies(gnuradio-filter filter_generated_includes filter_generated_swigs gnuradio-runtime gnuradio-fft) @@ -148,7 +148,7 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-filter_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "filter_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-filter/lib/fractional_resampler_cc_impl.cc b/gr-filter/lib/fractional_resampler_cc_impl.cc index 72a2262605..4d8def70cd 100644 --- a/gr-filter/lib/fractional_resampler_cc_impl.cc +++ b/gr-filter/lib/fractional_resampler_cc_impl.cc @@ -52,6 +52,9 @@ namespace gr { throw std::out_of_range("phase shift ratio must be > 0 and < 1"); set_relative_rate(1.0 / resamp_ratio); + message_port_register_in(pmt::intern("msg_in")); + set_msg_handler(pmt::intern("msg_in"), boost::bind( + &fractional_resampler_cc_impl::handle_msg, this, _1)); } fractional_resampler_cc_impl::~fractional_resampler_cc_impl() @@ -60,6 +63,29 @@ namespace gr { } void + fractional_resampler_cc_impl::handle_msg(pmt::pmt_t msg) { + if(!pmt::is_dict(msg)) + return; + // set resamp_ratio or mu by message dict + if(pmt::dict_has_key(msg, pmt::intern("resamp_ratio"))) { + set_resamp_ratio( + pmt::to_float( + pmt::dict_ref(msg, pmt::intern("resamp_ratio"), + pmt::from_float(resamp_ratio())) + ) + ); + } + if(pmt::dict_has_key(msg, pmt::intern("mu"))) { + set_mu( + pmt::to_float( + pmt::dict_ref(msg, pmt::intern("mu"), + pmt::from_float(mu())) + ) + ); + } + } + + void fractional_resampler_cc_impl::forecast(int noutput_items, gr_vector_int &ninput_items_required) { diff --git a/gr-filter/lib/fractional_resampler_cc_impl.h b/gr-filter/lib/fractional_resampler_cc_impl.h index d88d595370..8b7d9de317 100644 --- a/gr-filter/lib/fractional_resampler_cc_impl.h +++ b/gr-filter/lib/fractional_resampler_cc_impl.h @@ -42,6 +42,8 @@ namespace gr { float resamp_ratio); ~fractional_resampler_cc_impl(); + void handle_msg(pmt::pmt_t msg); + void forecast(int noutput_items, gr_vector_int &ninput_items_required); int general_work(int noutput_items, diff --git a/gr-filter/lib/fractional_resampler_ff_impl.cc b/gr-filter/lib/fractional_resampler_ff_impl.cc index 2ffccf5204..6fcd7e53d3 100644 --- a/gr-filter/lib/fractional_resampler_ff_impl.cc +++ b/gr-filter/lib/fractional_resampler_ff_impl.cc @@ -52,6 +52,10 @@ namespace gr { throw std::out_of_range("phase shift ratio must be > 0 and < 1"); set_relative_rate(1.0 / resamp_ratio); + + message_port_register_in(pmt::intern("msg_in")); + set_msg_handler(pmt::intern("msg_in"), boost::bind( + &fractional_resampler_ff_impl::handle_msg, this, _1)); } fractional_resampler_ff_impl::~fractional_resampler_ff_impl() @@ -60,6 +64,29 @@ namespace gr { } void + fractional_resampler_ff_impl::handle_msg(pmt::pmt_t msg) { + if(!pmt::is_dict(msg)) + return; + // set resamp_ratio or mu by message dict + if(pmt::dict_has_key(msg, pmt::intern("resamp_ratio"))) { + set_resamp_ratio( + pmt::to_float( + pmt::dict_ref(msg, pmt::intern("resamp_ratio"), + pmt::from_float(resamp_ratio())) + ) + ); + } + if(pmt::dict_has_key(msg, pmt::intern("mu"))) { + set_mu( + pmt::to_float( + pmt::dict_ref(msg, pmt::intern("mu"), + pmt::from_float(mu())) + ) + ); + } + } + + void fractional_resampler_ff_impl::forecast(int noutput_items, gr_vector_int &ninput_items_required) { diff --git a/gr-filter/lib/fractional_resampler_ff_impl.h b/gr-filter/lib/fractional_resampler_ff_impl.h index 11c9886176..cccc1be4b3 100644 --- a/gr-filter/lib/fractional_resampler_ff_impl.h +++ b/gr-filter/lib/fractional_resampler_ff_impl.h @@ -42,6 +42,8 @@ namespace gr { float resamp_ratio); ~fractional_resampler_ff_impl(); + void handle_msg(pmt::pmt_t msg); + void forecast(int noutput_items, gr_vector_int &ninput_items_required); int general_work(int noutput_items, diff --git a/gr-filter/python/filter/CMakeLists.txt b/gr-filter/python/filter/CMakeLists.txt index 1dd055abaf..bc4892412e 100644 --- a/gr-filter/python/filter/CMakeLists.txt +++ b/gr-filter/python/filter/CMakeLists.txt @@ -29,7 +29,6 @@ GR_PYTHON_INSTALL( pfb.py rational_resampler.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/filter - COMPONENT "filter_python" ) ######################################################################## diff --git a/gr-filter/python/filter/design/CMakeLists.txt b/gr-filter/python/filter/design/CMakeLists.txt index 21e47b86d6..2c800e9148 100644 --- a/gr-filter/python/filter/design/CMakeLists.txt +++ b/gr-filter/python/filter/design/CMakeLists.txt @@ -26,6 +26,5 @@ GR_PYTHON_INSTALL( filter_design.py fir_design.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/filter - COMPONENT "filter_python" ) diff --git a/gr-filter/python/filter/gui/CMakeLists.txt b/gr-filter/python/filter/gui/CMakeLists.txt index 6c9bbfa2f3..6c1d98894f 100644 --- a/gr-filter/python/filter/gui/CMakeLists.txt +++ b/gr-filter/python/filter/gui/CMakeLists.txt @@ -29,6 +29,5 @@ GR_PYTHON_INSTALL( polezero_plot.py pyqt_filter_stacked.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/filter - COMPONENT "filter_python" ) diff --git a/gr-filter/swig/CMakeLists.txt b/gr-filter/swig/CMakeLists.txt index b7bf203d16..ee8389dddb 100644 --- a/gr-filter/swig/CMakeLists.txt +++ b/gr-filter/swig/CMakeLists.txt @@ -50,7 +50,6 @@ GR_SWIG_MAKE(filter_swig filter_swig.i) GR_SWIG_INSTALL( TARGETS filter_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/filter - COMPONENT "filter_python" ) install( @@ -58,5 +57,4 @@ install( filter_swig.i ${CMAKE_CURRENT_BINARY_DIR}/gr_filter_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "filter_swig" ) diff --git a/gr-qtgui/CMakeLists.txt b/gr-qtgui/CMakeLists.txt index ad10363c1e..80bb8b3bdb 100644 --- a/gr-qtgui/CMakeLists.txt +++ b/gr-qtgui/CMakeLists.txt @@ -70,40 +70,6 @@ if(ENABLE_GR_QTGUI) include(GrSetupQt4) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_QTGUI_DESCRIPTION "GNU Radio QtGUI Blocks") - -CPACK_COMPONENT("qtgui_runtime" - GROUP "QtGUI" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("qtgui_devel" - GROUP "QtGUI" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("qtgui_python" - GROUP "QtGUI" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;qtgui_runtime" -) - -CPACK_COMPONENT("qtgui_swig" - GROUP "QtGUI" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;qtgui_python;qtgui_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/qtgui) @@ -129,7 +95,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-qtgui.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "qtgui_devel" ) ######################################################################## @@ -138,7 +103,6 @@ install( install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/gr-qtgui.conf DESTINATION ${GR_PREFSDIR} - COMPONENT "qtgui" ) @@ -152,7 +116,6 @@ install( themes/alt.qss themes/projector.qss DESTINATION ${GR_THEMES_DIR} - COMPONENT "qtgui" ) endif(ENABLE_GR_QTGUI) diff --git a/gr-qtgui/apps/CMakeLists.txt b/gr-qtgui/apps/CMakeLists.txt index 3c64cb6e0a..6a8e6c51aa 100644 --- a/gr-qtgui/apps/CMakeLists.txt +++ b/gr-qtgui/apps/CMakeLists.txt @@ -33,7 +33,6 @@ GR_PYTHON_INSTALL( plot_time_form.py plot_time_raster_form.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/qtgui - COMPONENT "qtgui_python" ) GR_PYTHON_INSTALL( @@ -58,5 +57,4 @@ GR_PYTHON_INSTALL( gr_spectrogram_plot gr_constellation_plot DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "qtgui_python" ) diff --git a/gr-qtgui/apps/gr_constellation_plot b/gr-qtgui/apps/gr_constellation_plot index 528bb97e5a..ff5db1a9a6 100755 --- a/gr-qtgui/apps/gr_constellation_plot +++ b/gr-qtgui/apps/gr_constellation_plot @@ -22,8 +22,8 @@ from gnuradio import gr from gnuradio import blocks -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import os, sys try: @@ -143,32 +143,27 @@ class my_top_block(gr.top_block): def main(): description = "Plots the constellations of a list of files." - parser = OptionParser(option_class=eng_option, description=description, + parser = ArgumentParser(description=description, conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=1000000, - help="Set the number of samples to display [default=%default]") - parser.add_option("-S", "--start", type="int", default=0, - help="Starting sample number [default=%default]") - (options, args) = parser.parse_args() + parser.add_argument("-N", "--nsamples", type=int, default=1000000, + help="Set the number of samples to display [default=%(default)r]") + parser.add_argument("-S", "--start", type=int, default=0, + help="Starting sample number [default=%(default)r]") + parser.add_argument("files", nargs="+", metavar='FILE') + args = parser.parse_args() - if(len(args) < 1): - parser.print_help() - sys.exit(0) - - filelist = list(args) - - nsamples = options.nsamples + filelist = args.files + nsamples = args.nsamples # Find the smallest number of samples in all files and use that as # a maximum value possible. filesizes = [] for f in filelist: if(os.path.exists(f)): - filesizes.append(os.path.getsize(f) / gr.sizeof_gr_complex) + filesizes.append(os.path.getsize(f) // gr.sizeof_gr_complex) max_nsamples = min(filesizes) - tb = my_top_block(filelist, - options.start, nsamples, max_nsamples); + tb = my_top_block(filelist, args.start, nsamples, max_nsamples); main_box = plot_constellation_form(tb, 'GNU Radio Constellation Plot', 10000.0) for n in xrange(tb._nsigs): diff --git a/gr-qtgui/apps/gr_psd_plot_b b/gr-qtgui/apps/gr_psd_plot_b index 606311af48..26263112ca 100755 --- a/gr-qtgui/apps/gr_psd_plot_b +++ b/gr-qtgui/apps/gr_psd_plot_b @@ -54,16 +54,15 @@ class psd_plot_b(plot_base.plot_base): def main(): description = "Plots the PSDs of a list of files. Files are a binary list of bytes." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = psd_plot_b(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average) + tb = psd_plot_b(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average) main_box = plot_base.plot_psd_form(tb, 'GNU Radio PSD Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_psd_plot_c b/gr-qtgui/apps/gr_psd_plot_c index 6df9fae190..1bd847b607 100755 --- a/gr-qtgui/apps/gr_psd_plot_c +++ b/gr-qtgui/apps/gr_psd_plot_c @@ -55,16 +55,15 @@ class psd_plot_c(plot_base.plot_base): def main(): description = "Plots the PSDs of a list of files. Files are a binary list of complex floats." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = psd_plot_c(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average) + tb = psd_plot_c(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average) main_box = plot_base.plot_psd_form(tb, 'GNU Radio PSD Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_psd_plot_f b/gr-qtgui/apps/gr_psd_plot_f index f07e3e8b50..04f1b03486 100755 --- a/gr-qtgui/apps/gr_psd_plot_f +++ b/gr-qtgui/apps/gr_psd_plot_f @@ -55,16 +55,15 @@ class psd_plot_f(plot_base.plot_base): def main(): description = "Plots the PSDs of a list of files. Files are a binary list of floats." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = psd_plot_f(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average) + tb = psd_plot_f(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average) main_box = plot_base.plot_psd_form(tb, 'GNU Radio PSD Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_psd_plot_i b/gr-qtgui/apps/gr_psd_plot_i index 1852345823..46bdd7bc84 100755 --- a/gr-qtgui/apps/gr_psd_plot_i +++ b/gr-qtgui/apps/gr_psd_plot_i @@ -54,16 +54,15 @@ class psd_plot_i(plot_base.plot_base): def main(): description = "Plots the PSDs of a list of files. Files are a binary list of integers." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = psd_plot_i(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average) + tb = psd_plot_i(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average) main_box = plot_base.plot_psd_form(tb, 'GNU Radio PSD Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_psd_plot_s b/gr-qtgui/apps/gr_psd_plot_s index c06076f1f9..8dc4a05d55 100755 --- a/gr-qtgui/apps/gr_psd_plot_s +++ b/gr-qtgui/apps/gr_psd_plot_s @@ -54,16 +54,15 @@ class psd_plot_s(plot_base.plot_base): def main(): description = "Plots the PSDs of a list of files. Files are a binary list of shorts." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = psd_plot_s(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average) + tb = psd_plot_s(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average) main_box = plot_base.plot_psd_form(tb, 'GNU Radio PSD Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_spectrogram_plot b/gr-qtgui/apps/gr_spectrogram_plot index db79f9dbad..8e8ba86757 100755 --- a/gr-qtgui/apps/gr_spectrogram_plot +++ b/gr-qtgui/apps/gr_spectrogram_plot @@ -142,55 +142,54 @@ def read_header(filelist): def main(): description = 'Plots the spectrogram (waterfall) of a file with detached header.' description += ' Assumes header is <input_filename>.hdr' - (options, args) = plot_base.setup_options(description) - filelist = list(args) + args = plot_base.setup_options(description) # Attempt to read the header information - info = read_header(filelist) + info = read_header(args.files) # If no header, quit if not info: sys.stderr.write('Header not found\n') sys.exit(1) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) srate = info["rx_rate"] # Dispatch the proper function # Complex Types if(info["cplx"] == True): if( info["type"] == "float" ): - tb = spectrogram_plot_c(filelist, - options.center_frequency,srate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_c(args.files, + args.center_frequency,srate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); else: sys.stderr.write("Complex File Type " + info["type"]+ " not supported.\n") # Real Types else: if( info["type"] == "bytes" ): - tb = spectrogram_plot_b(filelist, - options.center_frequency,srate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_b(args.files, + args.center_frequency,srate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); elif( info["type"] == "int" ): - tb = spectrogram_plot_i(filelist, - options.center_frequency,srate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_i(args.files, + args.center_frequency,srate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); elif( info["type"] == "float" ): - tb = spectrogram_plot_f(filelist, - options.center_frequency,srate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_f(args.files, + args.center_frequency,srate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); elif( info["type"] == "short" ): - tb = spectrogram_plot_s(filelist, - options.center_frequency,srate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_s(args.files, + args.center_frequency,srate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); else: sys.stderr.write("Real File Type " + info["type"] + " not supported\n") main_box = plot_base.plot_spectrogram_form(tb, 'GNU Radio Spectrogram Plot') diff --git a/gr-qtgui/apps/gr_spectrogram_plot_b b/gr-qtgui/apps/gr_spectrogram_plot_b index 0d7a16ea6e..6045ebfadd 100755 --- a/gr-qtgui/apps/gr_spectrogram_plot_b +++ b/gr-qtgui/apps/gr_spectrogram_plot_b @@ -54,16 +54,15 @@ class spectrogram_plot_b(plot_base.plot_base): def main(): description = "Plots the spectrogram (waterfall) of a list of files. Files are a binary list of chars." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = spectrogram_plot_b(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_b(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); main_box = plot_base.plot_spectrogram_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_spectrogram_plot_c b/gr-qtgui/apps/gr_spectrogram_plot_c index 52b0d4dff7..a2e63d0113 100755 --- a/gr-qtgui/apps/gr_spectrogram_plot_c +++ b/gr-qtgui/apps/gr_spectrogram_plot_c @@ -55,16 +55,15 @@ class spectrogram_plot_c(plot_base.plot_base): def main(): description = "Plots the spectrogram (waterfall) of a list of files. Files are a binary list of complex floats." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = spectrogram_plot_c(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_c(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); main_box = plot_base.plot_spectrogram_form(tb, 'GNU Radio Spectrogram Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_spectrogram_plot_f b/gr-qtgui/apps/gr_spectrogram_plot_f index 6ea5afc4ef..d131747486 100755 --- a/gr-qtgui/apps/gr_spectrogram_plot_f +++ b/gr-qtgui/apps/gr_spectrogram_plot_f @@ -55,16 +55,15 @@ class spectrogram_plot_f(plot_base.plot_base): def main(): description = "Plots the spectrogram (waterfall) of a list of files. Files are a binary list of floats." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = spectrogram_plot_f(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_f(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); main_box = plot_base.plot_spectrogram_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_spectrogram_plot_i b/gr-qtgui/apps/gr_spectrogram_plot_i index 893df2a234..723291d4b4 100755 --- a/gr-qtgui/apps/gr_spectrogram_plot_i +++ b/gr-qtgui/apps/gr_spectrogram_plot_i @@ -54,16 +54,15 @@ class spectrogram_plot_i(plot_base.plot_base): def main(): description = "Plots the spectrogram (waterfall) of a list of files. Files are a binary list of ints." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = spectrogram_plot_i(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_i(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); main_box = plot_base.plot_spectrogram_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_spectrogram_plot_s b/gr-qtgui/apps/gr_spectrogram_plot_s index 82a22f740d..606fbf95e4 100755 --- a/gr-qtgui/apps/gr_spectrogram_plot_s +++ b/gr-qtgui/apps/gr_spectrogram_plot_s @@ -54,16 +54,15 @@ class spectrogram_plot_s(plot_base.plot_base): def main(): description = "Plots the spectrogram (waterfall) of a list of files. Files are a binary list of shorts." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = spectrogram_plot_s(filelist, - options.center_frequency, options.sample_rate, - options.psd_size, - options.start, options.nsamples, max_nsamples, - options.average); + tb = spectrogram_plot_s(args.files, + args.center_frequency, args.sample_rate, + args.psd_size, + args.start, args.nsamples, max_nsamples, + args.average); main_box = plot_base.plot_spectrogram_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_time_plot_b b/gr-qtgui/apps/gr_time_plot_b index d822557f1b..a2f63cc4bf 100755 --- a/gr-qtgui/apps/gr_time_plot_b +++ b/gr-qtgui/apps/gr_time_plot_b @@ -52,14 +52,13 @@ class plot_time_b(plot_base.plot_base): def main(): description = "Plots a list of files on a scope plot. Files are a binary list of chars." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = plot_time_b(filelist, options.sample_rate, - options.start, options.nsamples, max_nsamples, - not options.no_auto_scale) + tb = plot_time_b(args.files, args.sample_rate, + args.start, args.nsamples, max_nsamples, + not args.no_auto_scale) main_box = plot_base.plot_time_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_time_plot_c b/gr-qtgui/apps/gr_time_plot_c index 202e0f88f4..3dfccad804 100755 --- a/gr-qtgui/apps/gr_time_plot_c +++ b/gr-qtgui/apps/gr_time_plot_c @@ -54,14 +54,13 @@ class plot_time_c(plot_base.plot_base): def main(): description = "Plots a list of files on a scope plot. Files are a binary list of complex floats." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = plot_time_c(filelist, options.sample_rate, - options.start, options.nsamples, max_nsamples, - not options.no_auto_scale) + tb = plot_time_c(args.files, args.sample_rate, + args.start, args.nsamples, max_nsamples, + not args.no_auto_scale) main_box = plot_base.plot_time_form(tb, 'GNU Radio Time Plot', 10000.0) main_box.show() diff --git a/gr-qtgui/apps/gr_time_plot_f b/gr-qtgui/apps/gr_time_plot_f index 8f5ad9f60d..59b340de9e 100755 --- a/gr-qtgui/apps/gr_time_plot_f +++ b/gr-qtgui/apps/gr_time_plot_f @@ -53,14 +53,13 @@ class plot_time_f(plot_base.plot_base): def main(): description = "Plots a list of files on a scope plot. Files are a binary list of floats." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = plot_time_f(filelist, options.sample_rate, - options.start, options.nsamples, max_nsamples, - not options.no_auto_scale) + tb = plot_time_f(args.files, args.sample_rate, + args.start, args.nsamples, max_nsamples, + not args.no_auto_scale) main_box = plot_base.plot_time_form(tb, 'GNU Radio Time Plot', 10000.0) main_box.show() diff --git a/gr-qtgui/apps/gr_time_plot_i b/gr-qtgui/apps/gr_time_plot_i index 8a7888b451..66c0a7f9cf 100755 --- a/gr-qtgui/apps/gr_time_plot_i +++ b/gr-qtgui/apps/gr_time_plot_i @@ -52,14 +52,13 @@ class plot_time_i(plot_base.plot_base): def main(): description = "Plots a list of files on a scope plot. Files are a binary list of integers." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = plot_time_i(filelist, options.sample_rate, - options.start, options.nsamples, max_nsamples, - not options.no_auto_scale) + tb = plot_time_i(args.files, args.sample_rate, + args.start, args.nsamples, max_nsamples, + not args.no_auto_scale) main_box = plot_base.plot_time_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_time_plot_s b/gr-qtgui/apps/gr_time_plot_s index 7cee262379..b2e42320db 100755 --- a/gr-qtgui/apps/gr_time_plot_s +++ b/gr-qtgui/apps/gr_time_plot_s @@ -52,14 +52,13 @@ class plot_time_s(plot_base.plot_base): def main(): description = "Plots a list of files on a scope plot. Files are a binary list of shorts." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = plot_time_s(filelist, options.sample_rate, - options.start, options.nsamples, max_nsamples, - not options.no_auto_scale) + tb = plot_time_s(args.files, args.sample_rate, + args.start, args.nsamples, max_nsamples, + not args.no_auto_scale) main_box = plot_base.plot_time_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_time_raster_b b/gr-qtgui/apps/gr_time_raster_b index ad8691489c..6cd93b0965 100755 --- a/gr-qtgui/apps/gr_time_raster_b +++ b/gr-qtgui/apps/gr_time_raster_b @@ -56,15 +56,14 @@ class plot_time_raster_b(plot_base.plot_base): def main(): description = "Plots a list of files on a scope plot. Files are a binary list of chars." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = plot_time_raster_b(filelist, options.sample_rate, - options.start, options.nsamples, max_nsamples, - options.nrows, options.ncols, - not options.no_auto_scale) + tb = plot_time_raster_b(args.files, args.sample_rate, + args.start, args.nsamples, max_nsamples, + args.nrows, args.ncols, + not args.no_auto_scale) main_box = plot_base.plot_time_raster_form(tb, 'GNU Radio Time Plot') main_box.show() diff --git a/gr-qtgui/apps/gr_time_raster_f b/gr-qtgui/apps/gr_time_raster_f index 5d6a8389cf..944d739978 100755 --- a/gr-qtgui/apps/gr_time_raster_f +++ b/gr-qtgui/apps/gr_time_raster_f @@ -56,15 +56,14 @@ class plot_time_raster_f(plot_base.plot_base): def main(): description = "Plots a list of files on a scope plot. Files are a binary list of floats." - (options, args) = plot_base.setup_options(description) + args = plot_base.setup_options(description) - filelist = list(args) - max_nsamples = plot_base.find_max_nsamples(filelist) + max_nsamples = plot_base.find_max_nsamples(args.files) - tb = plot_time_raster_f(filelist, options.sample_rate, - options.start, options.nsamples, max_nsamples, - options.nrows, options.ncols, - not options.no_auto_scale) + tb = plot_time_raster_f(args.files, args.sample_rate, + args.start, args.nsamples, max_nsamples, + args.nrows, args.ncols, + not args.no_auto_scale) main_box = plot_base.plot_time_raster_form(tb, 'GNU Radio Time Plot', 10000.0) main_box.show() diff --git a/gr-qtgui/apps/plot_base.py b/gr-qtgui/apps/plot_base.py index eaab7599c7..7a039e2135 100644 --- a/gr-qtgui/apps/plot_base.py +++ b/gr-qtgui/apps/plot_base.py @@ -21,8 +21,6 @@ # from gnuradio import gr, blocks -from gnuradio.eng_option import eng_option -from optparse import OptionParser import os, sys os.environ['GR_CONF_CONTROLPORT_ON'] = 'False' diff --git a/gr-qtgui/apps/plot_psd_base.py b/gr-qtgui/apps/plot_psd_base.py index 46f903e1b5..c3c03ec977 100644 --- a/gr-qtgui/apps/plot_psd_base.py +++ b/gr-qtgui/apps/plot_psd_base.py @@ -21,8 +21,8 @@ # from gnuradio import gr, blocks -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import os, sys try: @@ -141,23 +141,21 @@ class plot_base(gr.top_block): self.start() def setup_options(desc): - parser = OptionParser(option_class=eng_option, description=desc, - conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=1000000, + parser = ArgumentParser(description=desc, conflict_handler="resolve") + parser.add_argument("-N", "--nsamples", type=int, default=1000000, help="Set the number of samples to display [default=prints entire file]") - parser.add_option("-S", "--start", type="int", default=0, - help="Starting sample number [default=%default]") - parser.add_option("-L", "--psd-size", type="int", default=2048, - help="Set the FFT size of the PSD [default=%default]") - parser.add_option("-f", "--center-frequency", type="eng_float", default=0.0, - help="Set the center frequency of the signal [default=%default]") - parser.add_option("-r", "--sample-rate", type="eng_float", default=1.0, - help="Set the sample rate of the signal [default=%default]") - parser.add_option("-a", "--average", type="float", default=1.0, - help="Set amount of averaging (smaller=more averaging) [default=%default]") - (options, args) = parser.parse_args() - - if(len(args) < 1): - parser.print_help() - sys.exit(0) - return (options,args) + parser.add_argument("-S", "--start", type=int, default=0, + help="Starting sample number [default=%(default)r]") + parser.add_argument("-L", "--psd-size", type=int, default=2048, + help="Set the FFT size of the PSD [default=%(default)r]") + parser.add_argument("-f", "--center-frequency", type=eng_float, default=0.0, + help="Set the center frequency of the signal [default=%(default)r]") + parser.add_argument("-r", "--sample-rate", type=eng_float, default=1.0, + help="Set the sample rate of the signal [default=%(default)r]") + parser.add_argument("-a", "--average", type=float, default=1.0, + help="Set amount of averaging (smaller=more averaging) [default=%(default)r]") + parser.add_argument("files", nargs='+', metavar='FILE', + help="Complex samples") + args = parser.parse_args() + + return args diff --git a/gr-qtgui/apps/plot_spectrogram_base.py b/gr-qtgui/apps/plot_spectrogram_base.py index b252bb8863..f568100719 100644 --- a/gr-qtgui/apps/plot_spectrogram_base.py +++ b/gr-qtgui/apps/plot_spectrogram_base.py @@ -21,8 +21,8 @@ # from gnuradio import gr, blocks -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import os, sys try: @@ -146,25 +146,22 @@ class plot_base(gr.top_block): self.start() def setup_options(desc): - parser = OptionParser(option_class=eng_option, description=desc, - conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=1000000, - help="Set the number of samples to display [default=%default]") - parser.add_option("-S", "--start", type="int", default=0, - help="Starting sample number [default=%default]") - parser.add_option("-L", "--psd-size", type="int", default=2048, - help="Set the FFT size of the PSD [default=%default]") - parser.add_option("-f", "--center-frequency", type="eng_float", default=0.0, - help="Set the center frequency of the signal [default=%default]") - parser.add_option("-r", "--sample-rate", type="eng_float", default=1.0, - help="Set the sample rate of the signal [default=%default]") - parser.add_option("-a", "--average", type="float", default=1.0, - help="Set amount of averaging (smaller=more averaging) [default=%default]") - (options, args) = parser.parse_args() - - if(len(args) < 1): - parser.print_help() - sys.exit(0) - - return (options, args) + parser = ArgumentParser(description=desc, conflict_handler="resolve") + parser.add_argument("-N", "--nsamples", type=int, default=1000000, + help="Set the number of samples to display [default=%(default)r]") + parser.add_argument("-S", "--start", type=int, default=0, + help="Starting sample number [default=%(default)r]") + parser.add_argument("-L", "--psd-size", type=int, default=2048, + help="Set the FFT size of the PSD [default=%(default)r]") + parser.add_argument("-f", "--center-frequency", type=eng_float, default=0.0, + help="Set the center frequency of the signal [default=%(default)r]") + parser.add_argument("-r", "--sample-rate", type=eng_float, default=1.0, + help="Set the sample rate of the signal [default=%(default)r]") + parser.add_argument("-a", "--average", type=float, default=1.0, + help="Set amount of averaging (smaller=more averaging) [default=%(default)r]") + parser.add_argument('files', nargs='+', metavar='FILE', + help="File with complex samples") + args = parser.parse_args() + + return args diff --git a/gr-qtgui/apps/plot_time_base.py b/gr-qtgui/apps/plot_time_base.py index 007c94d044..cfbe5dc6cb 100644 --- a/gr-qtgui/apps/plot_time_base.py +++ b/gr-qtgui/apps/plot_time_base.py @@ -21,8 +21,8 @@ # from gnuradio import gr, blocks -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import os, sys try: @@ -166,19 +166,18 @@ class plot_base(gr.top_block): self._auto_scale = False def setup_options(desc): - parser = OptionParser(option_class=eng_option, description=desc, - conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=1000000, - help="Set the number of samples to display [default=%default]") - parser.add_option("-S", "--start", type="int", default=0, - help="Starting sample number [default=%default]") - parser.add_option("-r", "--sample-rate", type="eng_float", default=1.0, - help="Set the sample rate of the signal [default=%default]") - parser.add_option("", "--no-auto-scale", action="store_true", default=False, - help="Do not auto-scale the plot [default=%default]") - (options,args) = parser.parse_args() - if(len(args) < 1): - parser.print_help() - sys.exit(0) - return (options,args) + parser = ArgumentParser(description=desc, conflict_handler="resolve") + parser.add_argument("-N", "--nsamples", type=int, default=1000000, + help="Set the number of samples to display [default=%(default)r]") + parser.add_argument("-S", "--start", type=int, default=0, + help="Starting sample number [default=%(default)r]") + parser.add_argument("-r", "--sample-rate", type=eng_float, default=1.0, + help="Set the sample rate of the signal [default=%(default)r]") + parser.add_argument("--no-auto-scale", action="store_true", + help="Do not auto-scale the plot [default=%(default)r]") + parser.add_argument("files", nargs='+', metavar="FILE", + help="File with complex samples") + args = parser.parse_args() + + return args diff --git a/gr-qtgui/apps/plot_time_raster_base.py b/gr-qtgui/apps/plot_time_raster_base.py index 856c8c8945..e84b84c295 100644 --- a/gr-qtgui/apps/plot_time_raster_base.py +++ b/gr-qtgui/apps/plot_time_raster_base.py @@ -21,8 +21,8 @@ # from gnuradio import gr, blocks -from gnuradio.eng_option import eng_option -from optparse import OptionParser +from gnuradio.eng_arg import eng_float, intx +from argparse import ArgumentParser import os, sys try: @@ -161,23 +161,22 @@ class plot_base(gr.top_block): self._auto_scale = False def setup_options(desc): - parser = OptionParser(option_class=eng_option, description=desc, - conflict_handler="resolve") - parser.add_option("-N", "--nsamples", type="int", default=1000000, - help="Set the number of samples to display [default=%default]") - parser.add_option("-S", "--start", type="int", default=0, - help="Starting sample number [default=%default]") - parser.add_option("-C", "--ncols", type="int", default=100, - help="Number of columns [default=%default]") - parser.add_option("-R", "--nrows", type="int", default=100, - help="Number of rows [default=%default]") - parser.add_option("-r", "--sample-rate", type="eng_float", default=1.0, - help="Set the sample rate of the signal [default=%default]") - parser.add_option("", "--no-auto-scale", action="store_true", default=False, - help="Do not auto-scale the plot [default=%default]") - (options,args) = parser.parse_args() - if(len(args) < 1): - parser.print_help() - sys.exit(0) - return (options,args) + parser = ArgumentParser(description=desc, conflict_handler="resolve") + parser.add_argument("-N", "--nsamples", type=int, default=1000000, + help="Set the number of samples to display [default=%(default)r]") + parser.add_argument("-S", "--start", type=int, default=0, + help="Starting sample number [default=%(default)r]") + parser.add_argument("-C", "--ncols", type=int, default=100, + help="Number of columns [default=%(default)r]") + parser.add_argument("-R", "--nrows", type=int, default=100, + help="Number of rows [default=%(default)r]") + parser.add_argument("-r", "--sample-rate", type=eng_float, default=1.0, + help="Set the sample rate of the signal [default=%(default)r]") + parser.add_argument("--no-auto-scale", action="store_true", + help="Do not auto-scale the plot [default=%(default)r]") + parser.add_argument("files", nargs="+", metavar="FILE", + help="Input files with complex samples") + args = parser.parse_args() + + return args diff --git a/gr-qtgui/examples/CMakeLists.txt b/gr-qtgui/examples/CMakeLists.txt index 5662dfa9c8..a91e374772 100644 --- a/gr-qtgui/examples/CMakeLists.txt +++ b/gr-qtgui/examples/CMakeLists.txt @@ -33,7 +33,6 @@ GR_PYTHON_INSTALL(PROGRAMS pyqt_waterfall_c.py pyqt_waterfall_f.py DESTINATION ${GR_PKG_QTGUI_EXAMPLES_DIR} - COMPONENT "qtgui_python" ) install( @@ -43,5 +42,4 @@ install( qtgui_message_inputs.grc test_qtgui_msg.grc DESTINATION ${GR_PKG_QTGUI_EXAMPLES_DIR} - COMPONENT "qtgui_python" ) diff --git a/gr-qtgui/examples/c++/CMakeLists.txt b/gr-qtgui/examples/c++/CMakeLists.txt index ad84287367..f7c61bc316 100644 --- a/gr-qtgui/examples/c++/CMakeLists.txt +++ b/gr-qtgui/examples/c++/CMakeLists.txt @@ -45,5 +45,4 @@ target_link_libraries(display_qt ${QTGUI_LIBRARIES}) INSTALL(TARGETS display_qt DESTINATION ${GR_PKG_QTGUI_EXAMPLES_DIR} - COMPONENT "qtgui_examples" ) diff --git a/gr-qtgui/grc/CMakeLists.txt b/gr-qtgui/grc/CMakeLists.txt index d56158ac70..7da5fbc352 100644 --- a/gr-qtgui/grc/CMakeLists.txt +++ b/gr-qtgui/grc/CMakeLists.txt @@ -19,4 +19,4 @@ ######################################################################## file(GLOB xml_files "*.xml") -install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "qtgui_python") +install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR}) diff --git a/gr-qtgui/grc/qtgui_number_sink.xml b/gr-qtgui/grc/qtgui_number_sink.xml index eef862abd4..d10b7325c0 100644 --- a/gr-qtgui/grc/qtgui_number_sink.xml +++ b/gr-qtgui/grc/qtgui_number_sink.xml @@ -116,7 +116,7 @@ $(gui_hint()($win))</make> <key>qtgui.NUM_GRAPH_HORIZ</key> </option> <option> - <name>Verticle</name> + <name>Vertical</name> <key>qtgui.NUM_GRAPH_VERT</key> </option> <option> diff --git a/gr-qtgui/include/gnuradio/qtgui/CMakeLists.txt b/gr-qtgui/include/gnuradio/qtgui/CMakeLists.txt index 991c7583a8..92ffef9ee7 100644 --- a/gr-qtgui/include/gnuradio/qtgui/CMakeLists.txt +++ b/gr-qtgui/include/gnuradio/qtgui/CMakeLists.txt @@ -68,5 +68,4 @@ install(FILES VectorDisplayPlot.h vector_sink_f.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/qtgui - COMPONENT "qtgui_devel" ) diff --git a/gr-qtgui/lib/CMakeLists.txt b/gr-qtgui/lib/CMakeLists.txt index b1ee580398..aafb61699d 100644 --- a/gr-qtgui/lib/CMakeLists.txt +++ b/gr-qtgui/lib/CMakeLists.txt @@ -177,7 +177,7 @@ endif(ENABLE_PYTHON) add_definitions(-DQWT_DLL) #setup QWT library linkage add_library(gnuradio-qtgui SHARED ${qtgui_sources}) target_link_libraries(gnuradio-qtgui ${qtgui_libs}) -GR_LIBRARY_FOO(gnuradio-qtgui RUNTIME_COMPONENT "qtgui_runtime" DEVEL_COMPONENT "qtgui_devel") +GR_LIBRARY_FOO(gnuradio-qtgui) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -199,6 +199,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-qtgui_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "qtgui_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-qtgui/python/qtgui/CMakeLists.txt b/gr-qtgui/python/qtgui/CMakeLists.txt index 4fa4d0f484..212c98ebb4 100644 --- a/gr-qtgui/python/qtgui/CMakeLists.txt +++ b/gr-qtgui/python/qtgui/CMakeLists.txt @@ -24,7 +24,6 @@ GR_PYTHON_INSTALL( FILES __init__.py range.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/qtgui - COMPONENT "qtgui_python" ) ######################################################################## diff --git a/gr-qtgui/swig/CMakeLists.txt b/gr-qtgui/swig/CMakeLists.txt index 44b5c2fbd4..2990ac9086 100644 --- a/gr-qtgui/swig/CMakeLists.txt +++ b/gr-qtgui/swig/CMakeLists.txt @@ -51,12 +51,10 @@ GR_SWIG_MAKE(qtgui_swig qtgui_swig.i) GR_SWIG_INSTALL( TARGETS qtgui_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/qtgui - COMPONENT "qtgui_python" ) install(FILES qtgui_swig.i ${CMAKE_CURRENT_BINARY_DIR}/qtgui_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "qtgui_swig" ) diff --git a/gr-trellis/CMakeLists.txt b/gr-trellis/CMakeLists.txt index a3f0ad486c..20c1c6b54d 100644 --- a/gr-trellis/CMakeLists.txt +++ b/gr-trellis/CMakeLists.txt @@ -51,53 +51,6 @@ SET(GR_PKG_TRELLIS_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/trellis) if(ENABLE_GR_TRELLIS) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_TRELLIS_DESCRIPTION "GNU Radio Trellis Blocks") - -CPACK_COMPONENT("trellis_docs" - GROUP "Trellis" - DISPLAY_NAME "Documentation" - DESCRIPTION "Doxygen HTML and XML" -) - -CPACK_COMPONENT("trellis_runtime" - GROUP "Trellis" - DISPLAY_NAME "Runtime" - DESCRIPTION "Dynamic link libraries" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("trellis_devel" - GROUP "Trellis" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("trellis_python" - GROUP "Trellis" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime" - DEPENDS "runtime_python;trellis_runtime" -) - -CPACK_COMPONENT("trellis_examples" - GROUP "Trellis" - DISPLAY_NAME "Examples" - DESCRIPTION "Python examples for trellis" - DEPENDS "trellis_python" -) - -CPACK_COMPONENT("trellis_swig" - GROUP "Trellis" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;trellis_python;trellis_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/trellis) @@ -122,7 +75,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-trellis.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "trellis_devel" ) endif(ENABLE_GR_TRELLIS) diff --git a/gr-trellis/doc/CMakeLists.txt b/gr-trellis/doc/CMakeLists.txt index 568539582d..06813258f3 100644 --- a/gr-trellis/doc/CMakeLists.txt +++ b/gr-trellis/doc/CMakeLists.txt @@ -35,7 +35,6 @@ add_custom_target(gr_trellis_html ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/gr-tre install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gr-trellis.html DESTINATION ${GR_PKG_DOC_DIR}/html - COMPONENT "trellis_docs" ) endif(XMLTO_EXECUTABLE) @@ -69,5 +68,4 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/test_tcm.py.xml ${CMAKE_CURRENT_BINARY_DIR}/test_viterbi_equalization1.py.xml DESTINATION ${GR_PKG_DOC_DIR}/xml - COMPONENT "trellis_docs" ) diff --git a/gr-trellis/examples/grc/CMakeLists.txt b/gr-trellis/examples/grc/CMakeLists.txt index c5d4fc8965..a4718dd59b 100644 --- a/gr-trellis/examples/grc/CMakeLists.txt +++ b/gr-trellis/examples/grc/CMakeLists.txt @@ -59,5 +59,4 @@ install( ${CMAKE_CURRENT_BINARY_DIR}/interference_cancellation.grc readme.txt DESTINATION ${GR_PKG_TRELLIS_EXAMPLES_DIR} - COMPONENT "trellis-examples" ) diff --git a/gr-trellis/examples/python/CMakeLists.txt b/gr-trellis/examples/python/CMakeLists.txt index 8a05525bc4..76c88ee2f4 100644 --- a/gr-trellis/examples/python/CMakeLists.txt +++ b/gr-trellis/examples/python/CMakeLists.txt @@ -24,13 +24,11 @@ GR_PYTHON_INSTALL( test_tcm.py test_cpm.py DESTINATION ${GR_PKG_TRELLIS_EXAMPLES_DIR} - COMPONENT "trellis_examples" ) install( FILES README DESTINATION ${GR_PKG_DATA_DIR}/examples/trellis - COMPONENT "trellis_examples" ) install( @@ -68,5 +66,4 @@ install( fsm_files/simple.fsm fsm_files/uncoded4.fsm DESTINATION ${GR_PKG_TRELLIS_EXAMPLES_DIR}/fsm_files - COMPONENT "trellis_examples" ) diff --git a/gr-trellis/grc/CMakeLists.txt b/gr-trellis/grc/CMakeLists.txt index d60d64872c..9fbadd50d8 100644 --- a/gr-trellis/grc/CMakeLists.txt +++ b/gr-trellis/grc/CMakeLists.txt @@ -32,5 +32,4 @@ install(FILES trellis_pccc_decoder_x.xml trellis_pccc_decoder_combined_xx.xml DESTINATION ${GRC_BLOCKS_DIR} - COMPONENT "trellis_python" ) diff --git a/gr-trellis/include/gnuradio/trellis/CMakeLists.txt b/gr-trellis/include/gnuradio/trellis/CMakeLists.txt index ef60ce7370..831f2916dc 100644 --- a/gr-trellis/include/gnuradio/trellis/CMakeLists.txt +++ b/gr-trellis/include/gnuradio/trellis/CMakeLists.txt @@ -54,6 +54,5 @@ install(FILES siso_combined_f.h siso_f.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/trellis - COMPONENT "trellis_devel" ) diff --git a/gr-trellis/lib/CMakeLists.txt b/gr-trellis/lib/CMakeLists.txt index 9c51d06604..3d268c608f 100644 --- a/gr-trellis/lib/CMakeLists.txt +++ b/gr-trellis/lib/CMakeLists.txt @@ -90,7 +90,7 @@ ENDIF(MSVC) add_library(gnuradio-trellis SHARED ${trellis_sources}) target_link_libraries(gnuradio-trellis ${trellis_libs}) -GR_LIBRARY_FOO(gnuradio-trellis RUNTIME_COMPONENT "trellis_runtime" DEVEL_COMPONENT "trellis_devel") +GR_LIBRARY_FOO(gnuradio-trellis) add_dependencies(gnuradio-trellis trellis_generated_includes trellis_generated_swigs gnuradio-runtime gnuradio-digital) @@ -120,6 +120,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-trellis_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "trellis_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-trellis/python/trellis/CMakeLists.txt b/gr-trellis/python/trellis/CMakeLists.txt index 5cfe927412..10fd9d5c0e 100644 --- a/gr-trellis/python/trellis/CMakeLists.txt +++ b/gr-trellis/python/trellis/CMakeLists.txt @@ -27,7 +27,6 @@ GR_PYTHON_INSTALL( __init__.py fsm_utils.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/trellis - COMPONENT "trellis_python" ) ######################################################################## diff --git a/gr-trellis/swig/CMakeLists.txt b/gr-trellis/swig/CMakeLists.txt index d03d0998ef..e1ee66cba0 100644 --- a/gr-trellis/swig/CMakeLists.txt +++ b/gr-trellis/swig/CMakeLists.txt @@ -50,7 +50,6 @@ GR_SWIG_MAKE(trellis_swig trellis_swig.i) GR_SWIG_INSTALL( TARGETS trellis_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/trellis - COMPONENT "trellis_python" ) install( @@ -58,5 +57,4 @@ install( trellis_swig.i ${CMAKE_CURRENT_BINARY_DIR}/trellis_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "trellis_swig" ) diff --git a/gr-uhd/CMakeLists.txt b/gr-uhd/CMakeLists.txt index 43ac4ab8a9..6310822cf4 100644 --- a/gr-uhd/CMakeLists.txt +++ b/gr-uhd/CMakeLists.txt @@ -50,47 +50,6 @@ SET(GR_PKG_UHD_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/uhd) if(ENABLE_GR_UHD) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_UHD_DESCRIPTION "GNU Radio UHD Blocks") - -CPACK_COMPONENT("uhd_runtime" - GROUP "UHD" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("uhd_devel" - GROUP "UHD" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("uhd_python" - GROUP "UHD" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;uhd_runtime" -) - -CPACK_COMPONENT("uhd_examples" - GROUP "UHD" - DISPLAY_NAME "Examples" - DESCRIPTION "Example programs" - DEPENDS "uhd_runtime" -) - -CPACK_COMPONENT("uhd_swig" - GROUP "UHD" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;uhd_python;uhd_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/uhd) @@ -117,7 +76,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-uhd.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "uhd_devel" ) endif(ENABLE_GR_UHD) diff --git a/gr-uhd/apps/CMakeLists.txt b/gr-uhd/apps/CMakeLists.txt index ebcaf6e9f8..ce94a43cff 100644 --- a/gr-uhd/apps/CMakeLists.txt +++ b/gr-uhd/apps/CMakeLists.txt @@ -27,7 +27,6 @@ GR_PYTHON_INSTALL( uhd_siggen_base.py uhd_app.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/uhd - COMPONENT "uhd_python" ) GR_PYTHON_INSTALL( @@ -38,7 +37,6 @@ GR_PYTHON_INSTALL( uhd_siggen_gui uhd_rx_nogui DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "uhd_python" ) ######################################################################## @@ -51,7 +49,6 @@ install( hf_radio/README.TXT hf_radio/ssb_taps DESTINATION ${GR_PKG_DATA_DIR}/examples/hf_radio - COMPONENT "uhd_python" ) GR_PYTHON_INSTALL( @@ -62,7 +59,6 @@ GR_PYTHON_INSTALL( hf_radio/ssbdemod.py hf_radio/startup.py DESTINATION ${GR_PKG_DATA_DIR}/examples/hf_radio - COMPONENT "uhd_python" ) GR_PYTHON_INSTALL( @@ -70,7 +66,6 @@ GR_PYTHON_INSTALL( hf_radio/radio.py hf_radio/ui.py DESTINATION ${GR_PKG_DATA_DIR}/examples/hf_radio - COMPONENT "uhd_python" ) ######################################################################## @@ -81,12 +76,10 @@ install( hf_explorer/README hf_explorer/hfx_help DESTINATION ${GR_PKG_DATA_DIR}/examples/hf_explorer - COMPONENT "uhd_python" ) GR_PYTHON_INSTALL( PROGRAMS hf_explorer/hfx.py DESTINATION ${GR_PKG_DATA_DIR}/examples/hf_explorer - COMPONENT "uhd_python" ) diff --git a/gr-uhd/apps/uhd_app.py b/gr-uhd/apps/uhd_app.py index ff4412a140..652a9fbab6 100644 --- a/gr-uhd/apps/uhd_app.py +++ b/gr-uhd/apps/uhd_app.py @@ -42,12 +42,25 @@ LONG_TPL = """{prefix} Motherboard: {mb_id} ({mb_serial}) """ class UHDApp(object): + " Base class for simple UHD-based applications " def __init__(self, prefix=None, args=None): self.prefix = prefix self.args = args self.verbose = args.verbose or 0 if self.args.sync == 'auto' and len(self.args.channels) > 1: self.args.sync = 'pps' + self.antenna = None + self.gain_range = None + self.samp_rate = None + self.has_lo_sensor = None + self.async_msgq = None + self.async_src = None + self.async_rcv = None + self.tr = None + self.gain = None + self.freq = None + self.channels = None + self.cpu_format = None def vprint(self, *args): """ @@ -78,7 +91,7 @@ class UHDApp(object): if info_pp['mb_serial'] == "": info_pp['mb_serial'] = "no serial" info_pp['db_subdev'] = usrp_info["{xx}_subdev_name".format(xx=tx_or_rx)] - info_pp['db_serial'] = ", " + usrp_info["{xx}_serial".format(xx=tx_or_rx)] + info_pp['db_serial'] = ", " + usrp_info["{xx}_serial".format(xx=tx_or_rx)] if info_pp['db_serial'] == "": info_pp['db_serial'] = "no serial" info_pp['subdev'] = self.usrp.get_subdev_spec(mboard) @@ -112,12 +125,12 @@ class UHDApp(object): """ Call this when USRP async metadata needs printing. """ - md = self.async_src.msg_to_async_metadata_t(msg) + metadata = self.async_src.msg_to_async_metadata_t(msg) print("[{prefix}] Channel: {chan} Time: {t} Event: {e}".format( prefix=self.prefix, - chan=md.channel, - t=md.time_spec.get_real_secs(), - e=md.event_code, + chan=metadata.channel, + t=metadata.time_spec.get_real_secs(), + e=metadata.event_code, )) def setup_usrp(self, ctor, args, cpu_format='fc32'): @@ -141,9 +154,13 @@ class UHDApp(object): if args.spec: for mb_idx in xrange(self.usrp.get_num_mboards()): self.usrp.set_subdev_spec(args.spec, mb_idx) - # Set the clock source: + # Set the clock and/or time source: if args.clock_source is not None: - self.usrp.set_clock_source(args.clock_source) + for mb_idx in xrange(self.usrp.get_num_mboards()): + self.usrp.set_clock_source(args.clock_source, mb_idx) + if args.time_source is not None: + for mb_idx in xrange(self.usrp.get_num_mboards()): + self.usrp.set_time_source(args.time_source, mb_idx) # Sampling rate: self.usrp.set_samp_rate(args.samp_rate) self.samp_rate = self.usrp.get_samp_rate() @@ -153,7 +170,7 @@ class UHDApp(object): if self.antenna is not None: for i, chan in enumerate(self.channels): if not self.antenna[i] in self.usrp.get_antennas(chan): - self.vprint("[ERROR] {} is not a valid antenna name for this USRP device!".format(ant)) + self.vprint("[ERROR] {} is not a valid antenna name for this USRP device!".format(self.antenna[i])) exit(1) self.usrp.set_antenna(self.antenna[i], chan) self.vprint("[{prefix}] Channel {chan}: Using antenna {ant}.".format( @@ -310,5 +327,7 @@ class UHDApp(object): default='auto', help="Set to 'pps' to sync devices to PPS") group.add_argument("--clock-source", help="Set the clock source; typically 'internal', 'external' or 'gpsdo'") + group.add_argument("--time-source", + help="Set the time source") return parser diff --git a/gr-uhd/apps/uhd_fft b/gr-uhd/apps/uhd_fft index bb557e96f0..aa10cdf900 100755 --- a/gr-uhd/apps/uhd_fft +++ b/gr-uhd/apps/uhd_fft @@ -1,6 +1,6 @@ #!/usr/bin/env python2 # -# Copyright 2015 Free Software Foundation, Inc. +# Copyright 2015-2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -277,7 +277,37 @@ class uhd_fft(gr.top_block, Qt.QWidget, UHDApp): _freeze_scope_thread = threading.Thread(target=lambda: _freeze_scaling(self.qtgui_time_sink_x_0, 2.0)) _freeze_scope_thread.daemon = True _freeze_scope_thread.start() - + if args.phase_relations and len(self.channels) > 1: + self.display_widget_phase = Qt.QWidget() + self.display_layout_phase = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.display_widget_phase) + self.display_grid_layout_phase = Qt.QGridLayout() + self.display_layout_phase.addLayout(self.display_grid_layout_phase) + self.display.addTab(self.display_widget_phase, "Rel. Phase") + self.qtgui_phase_plot = qtgui.time_sink_f( + 1024, #size + self.samp_rate, #samp_rate + "", #name + len(self.channels) - 1 + ) + self.qtgui_phase_plot.set_update_time(self.update_rate) + self.qtgui_phase_plot.set_y_axis(-3.5, 3.5) + self.qtgui_phase_plot.set_y_label("Relative Phase", "") + self.qtgui_phase_plot.enable_tags(-1, True) + self.qtgui_phase_plot.set_trigger_mode(qtgui.TRIG_MODE_FREE, qtgui.TRIG_SLOPE_POS, 0.0, 0, 0, "") + self.qtgui_phase_plot.enable_autoscale(False) + self.qtgui_phase_plot.enable_grid(True) + self.qtgui_phase_plot.enable_control_panel(True) + self.qtgui_phase_plot.disable_legend() + for i in xrange(len(self.channels) - 1): + self.qtgui_phase_plot.set_line_label(i, "Phase Delta Channels {0}/{1}".format(i, i+1)) + self.qtgui_phase_plot.set_line_width(i, widths[i]) + self.qtgui_phase_plot.set_line_color(i, colors[i]) + self.qtgui_phase_plot.set_line_style(i, styles[i]) + self.qtgui_phase_plot.set_line_marker(i, markers[i]) + self.qtgui_phase_plot.set_line_alpha(i, alphas[i]) + self._qtgui_phase_plot_win = sip.wrapinstance(self.qtgui_phase_plot.pyqwidget(), Qt.QWidget) + self.display_grid_layout_phase.addWidget(self._qtgui_phase_plot_win, 0,0,1,4) + ### Other widgets ################################################### self._lo_locked_probe_tool_bar = Qt.QToolBar(self) self._lo_locked_probe_formatter = lambda x: {True: 'Yes', False: 'No'}[x] if self.has_lo_sensor: @@ -317,10 +347,24 @@ class uhd_fft(gr.top_block, Qt.QWidget, UHDApp): ################################################## self.msg_connect((self.qtgui_freq_sink_x_0, 'freq'), (self.qtgui_freq_sink_x_0, 'freq')) self.msg_connect((self.qtgui_freq_sink_x_0, 'freq'), (self.usrp, 'command')) - for c in self.channels: - self.connect((self.usrp, c), (self.qtgui_freq_sink_x_0, c)) - self.connect((self.usrp, c), (self.qtgui_time_sink_x_0, c)) - self.connect((self.usrp, c), (self.qtgui_waterfall_sink_x_0, c)) + for c, idx in enumerate(self.channels): + self.connect((self.usrp, c), (self.qtgui_freq_sink_x_0, idx)) + self.connect((self.usrp, c), (self.qtgui_time_sink_x_0, idx)) + self.connect((self.usrp, c), (self.qtgui_waterfall_sink_x_0, idx)) + if args.phase_relations and len(self.channels) > 1: + for c, idx in enumerate(self.channels[:-1]): + self.connect_phase_plot( + (self.usrp, c), + (self.usrp, self.channels[idx+1]), + (self.qtgui_phase_plot, idx) + ) + + def connect_phase_plot(self, src_port1, src_port2, dst_port): + " Calculate relative phase between two src ports and send it dst_port " + from gnuradio import blocks + multiplier = blocks.multiply_cc() + self.connect(src_port1, (multiplier, 0), blocks.complex_to_arg(), dst_port) + self.connect(src_port2, blocks.conjugate_cc(), (multiplier, 1)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "uhd_fft") @@ -417,6 +461,8 @@ def setup_argparser(): help="Specify FFT average alpha (overrides --fft-average)") group.add_argument("--update-rate", dest="update_rate", type=eng_arg.eng_float, default=eng_notation.num_to_str(.1), help="Set GUI widget update rate") + group.add_argument("--phase-relations", action="store_true", + help="Plot relative phases between multiple channels") return parser diff --git a/gr-uhd/apps/uhd_siggen_base.py b/gr-uhd/apps/uhd_siggen_base.py index 31415dac41..cc699dd145 100644 --- a/gr-uhd/apps/uhd_siggen_base.py +++ b/gr-uhd/apps/uhd_siggen_base.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # # Copyright 2008,2009,2011,2012,2015 Free Software Foundation, Inc. # @@ -23,6 +23,17 @@ Provide a base flow graph for USRP signal generators. """ +from __future__ import print_function +import math +try: + from uhd_app import UHDApp +except ImportError: + from gnuradio.uhd.uhd_app import UHDApp +from gnuradio import gr, uhd, eng_notation, eng_arg +from gnuradio import analog +from gnuradio import blocks +from gnuradio.gr.pubsub import pubsub + DESC_KEY = 'desc' SAMP_RATE_KEY = 'samp_rate' LINK_RATE_KEY = 'link_rate' @@ -39,26 +50,9 @@ FREQ_RANGE_KEY = 'freq_range' GAIN_RANGE_KEY = 'gain_range' TYPE_KEY = 'type' -# FIXME figure out if this can be deleted -#def setter(ps, key, val): ps[key] = val - -import sys -import math -import argparse -try: - from uhd_app import UHDApp -except ImportError: - from gnuradio.uhd.uhd_app import UHDApp -from gnuradio import gr, gru, uhd, eng_notation, eng_arg -from gnuradio import analog -from gnuradio import blocks -from gnuradio.gr.pubsub import pubsub -from gnuradio.eng_option import eng_option -from optparse import OptionParser - n2s = eng_notation.num_to_str -waveforms = { +WAVEFORMS = { analog.GR_CONST_WAVE : "Constant", analog.GR_SIN_WAVE : "Complex Sinusoid", analog.GR_GAUSSIAN : "Gaussian Noise", @@ -78,6 +72,11 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): UHDApp.__init__(self, args=args, prefix="UHD-SIGGEN") self.extra_sink = None + # Allocate some attributes + self._src1 = None + self._src2 = None + self._src = None + # Initialize device: self.setup_usrp( ctor=uhd.usrp_sink, @@ -121,13 +120,13 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self[key] = self[key] self[TYPE_KEY] = args.type #set type last - def set_samp_rate(self, sr): + def set_samp_rate(self, samp_rate): """ When sampling rate is updated, also update the signal sources. """ - self.vprint("Setting sampling rate to: {rate} Msps".format(rate=sr/1e6)) - self.usrp.set_samp_rate(sr) - sr = self.usrp.get_samp_rate() + self.vprint("Setting sampling rate to: {rate} Msps".format(rate=samp_rate/1e6)) + self.usrp.set_samp_rate(samp_rate) + samp_rate = self.usrp.get_samp_rate() if self[TYPE_KEY] in (analog.GR_SIN_WAVE, analog.GR_CONST_WAVE): self._src.set_sampling_freq(self[SAMP_RATE_KEY]) elif self[TYPE_KEY] == "2tone": @@ -138,10 +137,11 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self._src2.set_sampling_freq(self[WAVEFORM_FREQ_KEY]*2*math.pi/self[SAMP_RATE_KEY]) else: return True # Waveform not yet set - self.vprint("Set sample rate to: {rate} Msps".format(rate=sr/1e6)) + self.vprint("Set sample rate to: {rate} Msps".format(rate=samp_rate/1e6)) return True def set_waveform_freq(self, freq): + " Change the frequency 1 of the generated waveform " if self[TYPE_KEY] == analog.GR_SIN_WAVE: self._src.set_frequency(freq) elif self[TYPE_KEY] == "2tone": @@ -152,6 +152,10 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): return True def set_waveform2_freq(self, freq): + """ + Change the frequency 2 of the generated waveform. This only + applies to 2-tone and sweep. + """ if freq is None: self[WAVEFORM2_FREQ_KEY] = -self[WAVEFORM_FREQ_KEY] return @@ -161,19 +165,22 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self._src1.set_frequency(freq) return True - def set_waveform(self, type): + def set_waveform(self, waveform_type): + """ + Select the generated waveform + """ self.vprint("Selecting waveform...") self.lock() self.disconnect_all() - if type == analog.GR_SIN_WAVE or type == analog.GR_CONST_WAVE: + if waveform_type == analog.GR_SIN_WAVE or waveform_type == analog.GR_CONST_WAVE: self._src = analog.sig_source_c(self[SAMP_RATE_KEY], # Sample rate - type, # Waveform type + waveform_type, # Waveform waveform_type self[WAVEFORM_FREQ_KEY], # Waveform frequency self[AMPLITUDE_KEY], # Waveform amplitude self[WAVEFORM_OFFSET_KEY]) # Waveform offset - elif type == analog.GR_GAUSSIAN or type == analog.GR_UNIFORM: - self._src = analog.noise_source_c(type, self[AMPLITUDE_KEY]) - elif type == "2tone": + elif waveform_type == analog.GR_GAUSSIAN or waveform_type == analog.GR_UNIFORM: + self._src = analog.noise_source_c(waveform_type, self[AMPLITUDE_KEY]) + elif waveform_type == "2tone": self._src1 = analog.sig_source_c(self[SAMP_RATE_KEY], analog.GR_SIN_WAVE, self[WAVEFORM_FREQ_KEY], @@ -187,9 +194,9 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self[AMPLITUDE_KEY]/2.0, 0) self._src = blocks.add_cc() - self.connect(self._src1,(self._src,0)) - self.connect(self._src2,(self._src,1)) - elif type == "sweep": + self.connect(self._src1, (self._src, 0)) + self.connect(self._src2, (self._src, 1)) + elif waveform_type == "sweep": # rf freq is center frequency # waveform_freq is total swept width # waveform2_freq is sweep rate @@ -205,21 +212,21 @@ class USRPSiggen(gr.top_block, pubsub, UHDApp): self._src = blocks.multiply_const_cc(self[AMPLITUDE_KEY]) self.connect(self._src1, self._src2, self._src) else: - raise RuntimeError("[UHD-SIGGEN] Unknown waveform type") - for c in xrange(len(self.channels)): - self.connect(self._src, (self.usrp, c)) + raise RuntimeError("[UHD-SIGGEN] Unknown waveform waveform_type") + for chan in xrange(len(self.channels)): + self.connect(self._src, (self.usrp, chan)) if self.extra_sink is not None: self.connect(self._src, self.extra_sink) self.unlock() - self.vprint("Set baseband modulation to:", waveforms[type]) - if type == analog.GR_SIN_WAVE: + self.vprint("Set baseband modulation to:", WAVEFORMS[waveform_type]) + if waveform_type == analog.GR_SIN_WAVE: self.vprint("Modulation frequency: %sHz" % (n2s(self[WAVEFORM_FREQ_KEY]),)) self.vprint("Initial phase:", self[WAVEFORM_OFFSET_KEY]) - elif type == "2tone": + elif waveform_type == "2tone": self.vprint("Tone 1: %sHz" % (n2s(self[WAVEFORM_FREQ_KEY]),)) self.vprint("Tone 2: %sHz" % (n2s(self[WAVEFORM2_FREQ_KEY]),)) - elif type == "sweep": - self.vprint("Sweeping across %sHz to %sHz" % (n2s(-self[WAVEFORM_FREQ_KEY]/2.0),n2s(self[WAVEFORM_FREQ_KEY]/2.0))) + elif waveform_type == "sweep": + self.vprint("Sweeping across %sHz to %sHz" % (n2s(-self[WAVEFORM_FREQ_KEY]/2.0), n2s(self[WAVEFORM_FREQ_KEY]/2.0))) self.vprint("Sweep rate: %sHz" % (n2s(self[WAVEFORM2_FREQ_KEY]),)) self.vprint("TX amplitude:", self[AMPLITUDE_KEY]) @@ -274,6 +281,7 @@ def setup_argparser(): return parser def main(): + " Go, go, go! " if gr.enable_realtime_scheduling() != gr.RT_OK: print("Note: failed to enable realtime scheduling, continuing") # Grab command line args and create top block @@ -281,8 +289,8 @@ def main(): parser = setup_argparser() args = parser.parse_args() tb = USRPSiggen(args) - except RuntimeError as e: - print(e) + except RuntimeError as ex: + print(ex) exit(1) tb.start() raw_input('[UHD-SIGGEN] Press Enter to quit:\n') diff --git a/gr-uhd/apps/uhd_siggen_gui b/gr-uhd/apps/uhd_siggen_gui index ab04ccc8e2..c5528f3777 100755 --- a/gr-uhd/apps/uhd_siggen_gui +++ b/gr-uhd/apps/uhd_siggen_gui @@ -1,6 +1,6 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python # -# Copyright 2015 Free Software Foundation, Inc. +# Copyright 2015-2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -32,13 +32,14 @@ Signal Generator App # Generated: Sun Jun 28 17:21:28 2015 ################################################## +from __future__ import print_function import sip import sys import threading import time from distutils.version import StrictVersion from PyQt4 import Qt -from PyQt4.QtCore import QObject, pyqtSlot +from PyQt4.QtCore import pyqtSlot from gnuradio import analog from gnuradio import eng_notation from gnuradio import gr @@ -69,9 +70,9 @@ class uhd_siggen_gui(Qt.QWidget): Qt.QWidget.__init__(self) self.setWindowTitle("UHD Signal Generator") try: - self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) + self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) except: - pass + pass self.top_scroll_layout = Qt.QVBoxLayout() self.setLayout(self.top_scroll_layout) self.top_scroll = Qt.QScrollArea() @@ -90,8 +91,8 @@ class uhd_siggen_gui(Qt.QWidget): # Widgets + Controls ################################################## ### Waveform Selector - self._waveform_options = uhd_siggen.waveforms.keys() - self._waveform_labels = uhd_siggen.waveforms.values() + self._waveform_options = uhd_siggen.WAVEFORMS.keys() + self._waveform_labels = uhd_siggen.WAVEFORMS.values() self._waveform_group_box = Qt.QGroupBox("Waveform") self._waveform_box = Qt.QHBoxLayout() class variable_chooser_button_group(Qt.QButtonGroup): @@ -259,11 +260,12 @@ class uhd_siggen_gui(Qt.QWidget): self._lo_locked_probe_0_tool_bar.addWidget(self._lo_locked_probe_0_label) self.top_grid_layout.addWidget(self._lo_locked_probe_0_tool_bar, 8,0,1,1) def _chan0_lo_locked_probe(): + " Monitor lock status of LO on channel 0 " while True: - val = all([self.usrp.get_sensor('lo_locked', c).to_bool() for c in range(len(self._sg.channels))]) try: + val = all([self.usrp.get_sensor('lo_locked', c).to_bool() for c in range(len(self._sg.channels))]) self.set_chan0_lo_locked(val) - except AttributeError: + except: pass time.sleep(.1) _chan0_lo_locked_thread = threading.Thread(target=_chan0_lo_locked_probe) @@ -366,8 +368,8 @@ class uhd_siggen_gui(Qt.QWidget): self.freq_fine + self.freq_coarse, self.lo_offset ) - for idx, c in enumerate(self._sg.channels): - tune_res = self.usrp.set_center_freq(tune_req, c) + for idx, chan in enumerate(self._sg.channels): + tune_res = self.usrp.set_center_freq(tune_req, chan) if idx == 0: self.set_label_dsp_freq(tune_res.actual_dsp_freq) self.set_label_rf_freq(tune_res.actual_rf_freq) @@ -446,7 +448,7 @@ def main(): """ Go, go, go! """ parser = setup_parser() args = parser.parse_args() - if(StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0")): + if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): Qt.QApplication.setGraphicsSystem(gr.prefs().get_string('qtgui', 'style', 'raster')) qapp = Qt.QApplication(sys.argv) siggen_gui = uhd_siggen_gui(args) @@ -457,14 +459,17 @@ def main(): qapp.exec_() siggen_gui = None #to clean up Qt widgets -if __name__ == '__main__': +def x11_init_threads(): + " If on X11, init threads " import ctypes - import sys if sys.platform.startswith('linux'): try: x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: print("Warning: failed to XInitThreads()") + +if __name__ == '__main__': + x11_init_threads() main() diff --git a/gr-uhd/examples/c++/CMakeLists.txt b/gr-uhd/examples/c++/CMakeLists.txt index 655ef0c0a9..c5a55520f6 100644 --- a/gr-uhd/examples/c++/CMakeLists.txt +++ b/gr-uhd/examples/c++/CMakeLists.txt @@ -40,5 +40,4 @@ target_link_libraries(tags_demo gnuradio-uhd) INSTALL(TARGETS tags_demo DESTINATION ${GR_PKG_UHD_EXAMPLES_DIR} - COMPONENT "uhd_examples" ) diff --git a/gr-uhd/examples/grc/CMakeLists.txt b/gr-uhd/examples/grc/CMakeLists.txt index 06c233d45c..4c124b5c03 100644 --- a/gr-uhd/examples/grc/CMakeLists.txt +++ b/gr-uhd/examples/grc/CMakeLists.txt @@ -27,5 +27,4 @@ install( uhd_tx_dpsk.grc uhd_wbfm_receive.grc DESTINATION ${GR_PKG_UHD_EXAMPLES_DIR} - COMPONENT "uhd_python" ) diff --git a/gr-uhd/examples/python/CMakeLists.txt b/gr-uhd/examples/python/CMakeLists.txt index 7642b536b8..cf50feb148 100644 --- a/gr-uhd/examples/python/CMakeLists.txt +++ b/gr-uhd/examples/python/CMakeLists.txt @@ -38,5 +38,4 @@ GR_PYTHON_INSTALL( usrp_wfm_rcv_sca.py usrp_wxapt_rcv.py DESTINATION ${GR_PKG_UHD_EXAMPLES_DIR} - COMPONENT "uhd_python" ) diff --git a/gr-uhd/grc/CMakeLists.txt b/gr-uhd/grc/CMakeLists.txt index 2d8f24aa3c..d748bfacef 100644 --- a/gr-uhd/grc/CMakeLists.txt +++ b/gr-uhd/grc/CMakeLists.txt @@ -42,5 +42,4 @@ install(FILES uhd_amsg_source.xml uhd_block_tree.xml DESTINATION ${GRC_BLOCKS_DIR} - COMPONENT "uhd_python" ) diff --git a/gr-uhd/include/gnuradio/uhd/CMakeLists.txt b/gr-uhd/include/gnuradio/uhd/CMakeLists.txt index b1f3345d78..8d75afc1bc 100644 --- a/gr-uhd/include/gnuradio/uhd/CMakeLists.txt +++ b/gr-uhd/include/gnuradio/uhd/CMakeLists.txt @@ -27,5 +27,4 @@ install(FILES usrp_sink.h amsg_source.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/uhd - COMPONENT "uhd_devel" ) diff --git a/gr-uhd/lib/CMakeLists.txt b/gr-uhd/lib/CMakeLists.txt index b57b80b557..2427516c9a 100644 --- a/gr-uhd/lib/CMakeLists.txt +++ b/gr-uhd/lib/CMakeLists.txt @@ -75,7 +75,7 @@ list(APPEND uhd_libs add_library(gnuradio-uhd SHARED ${gr_uhd_sources}) target_link_libraries(gnuradio-uhd ${uhd_libs}) -GR_LIBRARY_FOO(gnuradio-uhd RUNTIME_COMPONENT "uhd_runtime" DEVEL_COMPONENT "uhd_devel") +GR_LIBRARY_FOO(gnuradio-uhd) ######################################################################## # Build static libraries if enabled @@ -91,7 +91,7 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-uhd_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "uhd_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) else(UHD_VERSION VERSION_GREATER "3.8.1") message(STATUS "Not building gr-uhd static library; requires UHD >= 3.8.2") diff --git a/gr-uhd/lib/usrp_source_impl.cc b/gr-uhd/lib/usrp_source_impl.cc index ed0b891770..ab1e84ba3a 100644 --- a/gr-uhd/lib/usrp_source_impl.cc +++ b/gr-uhd/lib/usrp_source_impl.cc @@ -480,6 +480,7 @@ namespace gr { { _dev->issue_stream_cmd(cmd, _stream_args.channels[i]); } + _tag_now = true; } bool diff --git a/gr-uhd/python/uhd/CMakeLists.txt b/gr-uhd/python/uhd/CMakeLists.txt index aa1d1a6b4a..ee69e8eb7d 100644 --- a/gr-uhd/python/uhd/CMakeLists.txt +++ b/gr-uhd/python/uhd/CMakeLists.txt @@ -26,7 +26,6 @@ GR_PYTHON_INSTALL( FILES __init__.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/uhd - COMPONENT "uhd_python" ) ######################################################################## diff --git a/gr-uhd/swig/CMakeLists.txt b/gr-uhd/swig/CMakeLists.txt index ef54761d0f..5cbc6c642c 100644 --- a/gr-uhd/swig/CMakeLists.txt +++ b/gr-uhd/swig/CMakeLists.txt @@ -48,12 +48,10 @@ GR_SWIG_MAKE(uhd_swig uhd_swig.i) GR_SWIG_INSTALL( TARGETS uhd_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/uhd - COMPONENT "uhd_python" ) install( FILES uhd_swig.i ${CMAKE_CURRENT_BINARY_DIR}/uhd_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "uhd_swig" ) diff --git a/gr-utils/CMakeLists.txt b/gr-utils/CMakeLists.txt index b9d3763e48..d54a06abd1 100644 --- a/gr-utils/CMakeLists.txt +++ b/gr-utils/CMakeLists.txt @@ -46,16 +46,6 @@ GR_REGISTER_COMPONENT("gr-utils" ENABLE_GR_UTILS if(ENABLE_GR_UTILS) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_COMPONENT("utils" - DISPLAY_NAME "Utils" - DESCRIPTION "Misc gnuradio python utilities" - DEPENDS "runtime_python" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(python/utils) diff --git a/gr-utils/python/modtool/CMakeLists.txt b/gr-utils/python/modtool/CMakeLists.txt index 9ee38d61e6..5fc5b0287f 100644 --- a/gr-utils/python/modtool/CMakeLists.txt +++ b/gr-utils/python/modtool/CMakeLists.txt @@ -27,7 +27,6 @@ GR_PYTHON_INSTALL(FILES modtool_add.py modtool_base.py modtool_disable.py - modtool_help.py modtool_info.py modtool_makexml.py modtool_newmod.py @@ -38,13 +37,11 @@ GR_PYTHON_INSTALL(FILES templates.py util_functions.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/modtool - COMPONENT "utils" ) set(GR_PKG_MODTOOL_DATA_DIR ${GR_PKG_DATA_DIR}/modtool) install(DIRECTORY gr-newmod DESTINATION ${GR_PKG_MODTOOL_DATA_DIR} - COMPONENT "utils" ) @@ -61,6 +58,5 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/modtool.conf DESTINATION ${GR_PREFSDIR} - COMPONENT "utils" ) diff --git a/gr-utils/python/modtool/__init__.py b/gr-utils/python/modtool/__init__.py index 1bc841ecf5..897ff97fce 100644 --- a/gr-utils/python/modtool/__init__.py +++ b/gr-utils/python/modtool/__init__.py @@ -21,7 +21,7 @@ from cmakefile_editor import CMakeFileEditor from grc_xml_generator import GRCXMLGenerator -from modtool_base import ModTool, ModToolException, get_class_dict +from modtool_base import ModTool, ModToolException, get_modtool_modules from modtool_add import ModToolAdd from modtool_disable import ModToolDisable from modtool_info import ModToolInfo @@ -31,6 +31,5 @@ from modtool_rm import ModToolRemove from modtool_rename import ModToolRename from templates import Templates # Leave this at the end -from modtool_help import ModToolHelp from parser_cc_block import ParserCCBlock from util_functions import * diff --git a/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrMiscUtils.cmake b/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrMiscUtils.cmake index 5bad57c51e..319581c05e 100644 --- a/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrMiscUtils.cmake +++ b/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrMiscUtils.cmake @@ -135,18 +135,14 @@ endfunction(GR_LIBTOOL) # Also handle gnuradio custom naming conventions w/ extras mode. ######################################################################## function(GR_LIBRARY_FOO target) - #parse the arguments for component names - include(CMakeParseArgumentsCopy) - CMAKE_PARSE_ARGUMENTS(GR_LIBRARY "" "RUNTIME_COMPONENT;DEVEL_COMPONENT" "" ${ARGN}) - #set additional target properties set_target_properties(${target} PROPERTIES SOVERSION ${LIBVER}) #install the generated files like so... install(TARGETS ${target} - LIBRARY DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .so/.dylib file - ARCHIVE DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_DEVEL_COMPONENT} # .lib file - RUNTIME DESTINATION ${GR_RUNTIME_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} # .dll file + LIBRARY DESTINATION ${GR_LIBRARY_DIR} # .so/.dylib file + ARCHIVE DESTINATION ${GR_LIBRARY_DIR} # .lib file + RUNTIME DESTINATION ${GR_RUNTIME_DIR} # .dll file ) #extras mode enabled automatically on linux @@ -178,7 +174,7 @@ function(GR_LIBRARY_FOO target) FILES ${CMAKE_CURRENT_BINARY_DIR}/lib${target}.so ${CMAKE_CURRENT_BINARY_DIR}/lib${target}-${LIBVER}.so.0 - DESTINATION ${GR_LIBRARY_DIR} COMPONENT ${GR_LIBRARY_RUNTIME_COMPONENT} + DESTINATION ${GR_LIBRARY_DIR} ) endif(LIBRARY_EXTRAS) @@ -216,49 +212,6 @@ function(GR_GEN_TARGET_DEPS name var) endfunction(GR_GEN_TARGET_DEPS) ######################################################################## -# Control use of gr_logger -# Usage: -# GR_LOGGING() -# -# Will set ENABLE_GR_LOG to 1 by default. -# Can manually set with -DENABLE_GR_LOG=0|1 -######################################################################## -function(GR_LOGGING) - find_package(Log4cpp) - - OPTION(ENABLE_GR_LOG "Use gr_logger" ON) - if(ENABLE_GR_LOG) - # If gr_logger is enabled, make it usable - add_definitions( -DENABLE_GR_LOG ) - - # also test LOG4CPP; if we have it, use this version of the logger - # otherwise, default to the stdout/stderr model. - if(LOG4CPP_FOUND) - SET(HAVE_LOG4CPP True CACHE INTERNAL "" FORCE) - add_definitions( -DHAVE_LOG4CPP ) - else(not LOG4CPP_FOUND) - SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE) - SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE) - endif(LOG4CPP_FOUND) - - SET(ENABLE_GR_LOG ${ENABLE_GR_LOG} CACHE INTERNAL "" FORCE) - - else(ENABLE_GR_LOG) - SET(HAVE_LOG4CPP False CACHE INTERNAL "" FORCE) - SET(LOG4CPP_INCLUDE_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARY_DIRS "" CACHE INTERNAL "" FORCE) - SET(LOG4CPP_LIBRARIES "" CACHE INTERNAL "" FORCE) - endif(ENABLE_GR_LOG) - - message(STATUS "ENABLE_GR_LOG set to ${ENABLE_GR_LOG}.") - message(STATUS "HAVE_LOG4CPP set to ${HAVE_LOG4CPP}.") - message(STATUS "LOG4CPP_LIBRARIES set to ${LOG4CPP_LIBRARIES}.") - -endfunction(GR_LOGGING) - -######################################################################## # Run GRCC to compile .grc files into .py files. # # Usage: GRCC(filename, directory) diff --git a/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrPython.cmake b/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrPython.cmake index 06e061e212..0bfa92db8d 100644 --- a/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrPython.cmake +++ b/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrPython.cmake @@ -130,7 +130,7 @@ endfunction(GR_UNIQUE_TARGET) ######################################################################## function(GR_PYTHON_INSTALL) include(CMakeParseArgumentsCopy) - CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION;COMPONENT" "FILES;PROGRAMS" ${ARGN}) + CMAKE_PARSE_ARGUMENTS(GR_PYTHON_INSTALL "" "DESTINATION" "FILES;PROGRAMS" ${ARGN}) #################################################################### if(GR_PYTHON_INSTALL_FILES) @@ -182,7 +182,6 @@ function(GR_PYTHON_INSTALL) set(python_install_gen_targets ${pycfiles} ${pyofiles}) install(FILES ${python_install_gen_targets} DESTINATION ${GR_PYTHON_INSTALL_DESTINATION} - COMPONENT ${GR_PYTHON_INSTALL_COMPONENT} ) #################################################################### @@ -219,7 +218,6 @@ function(GR_PYTHON_INSTALL) install(PROGRAMS ${pyexefile} RENAME ${pyfile_name} DESTINATION ${GR_PYTHON_INSTALL_DESTINATION} - COMPONENT ${GR_PYTHON_INSTALL_COMPONENT} ) endforeach(pyfile) diff --git a/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrSwig.cmake b/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrSwig.cmake index abf4dc4612..ab8926ba7e 100644 --- a/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrSwig.cmake +++ b/gr-utils/python/modtool/gr-newmod/cmake/Modules/GrSwig.cmake @@ -183,24 +183,21 @@ endmacro(GR_SWIG_MAKE) # GR_SWIG_INSTALL( # TARGETS target target target... # [DESTINATION destination] -# [COMPONENT component] # ) ######################################################################## macro(GR_SWIG_INSTALL) include(CMakeParseArgumentsCopy) - CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION;COMPONENT" "TARGETS" ${ARGN}) + CMAKE_PARSE_ARGUMENTS(GR_SWIG_INSTALL "" "DESTINATION" "TARGETS" ${ARGN}) foreach(name ${GR_SWIG_INSTALL_TARGETS}) install(TARGETS ${SWIG_MODULE_${name}_REAL_NAME} DESTINATION ${GR_SWIG_INSTALL_DESTINATION} - COMPONENT ${GR_SWIG_INSTALL_COMPONENT} ) include(GrPython) GR_PYTHON_INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}.py DESTINATION ${GR_SWIG_INSTALL_DESTINATION} - COMPONENT ${GR_SWIG_INSTALL_COMPONENT} ) GR_LIBTOOL( diff --git a/gr-utils/python/modtool/gr-newmod/lib/CMakeLists.txt b/gr-utils/python/modtool/gr-newmod/lib/CMakeLists.txt index 10a15b7dd9..24ffa41fc1 100644 --- a/gr-utils/python/modtool/gr-newmod/lib/CMakeLists.txt +++ b/gr-utils/python/modtool/gr-newmod/lib/CMakeLists.txt @@ -48,7 +48,7 @@ endif(APPLE) # Install built library files ######################################################################## include(GrMiscUtils) -GR_LIBRARY_FOO(gnuradio-howto RUNTIME_COMPONENT "howto_runtime" DEVEL_COMPONENT "howto_devel") +GR_LIBRARY_FOO(gnuradio-howto) ######################################################################## # Build and register unit test @@ -79,4 +79,3 @@ GR_ADD_TEST(test_howto test-howto) ######################################################################## message(STATUS "Using install prefix: ${CMAKE_INSTALL_PREFIX}") message(STATUS "Building for version: ${VERSION} / ${LIBVER}") - diff --git a/gr-utils/python/modtool/modtool_add.py b/gr-utils/python/modtool/modtool_add.py index 416c0943b7..b7d33c6113 100644 --- a/gr-utils/python/modtool/modtool_add.py +++ b/gr-utils/python/modtool/modtool_add.py @@ -22,7 +22,6 @@ import os import re -from optparse import OptionGroup from util_functions import append_re_line_sequence, ask_yes_no from cmakefile_editor import CMakeFileEditor @@ -33,7 +32,7 @@ from code_generator import render_template class ModToolAdd(ModTool): """ Add block to the out-of-tree module. """ name = 'add' - aliases = ('insert',) + description = 'Add new block into module.' _block_types = ('sink', 'source', 'sync', 'decimator', 'interpolator', 'general', 'tagged_stream', 'hier', 'noblock') @@ -44,30 +43,29 @@ class ModToolAdd(ModTool): self._skip_cmakefiles = False self._license_file = None - def setup_parser(self): - parser = ModTool.setup_parser(self) - ogroup = OptionGroup(parser, "Add module options") - ogroup.add_option("-t", "--block-type", type="choice", - choices=self._block_types, default=None, help="One of %s." % ', '.join(self._block_types)) - ogroup.add_option("--license-file", type="string", default=None, + @staticmethod + def setup_parser(parser): + parser.add_argument("-t", "--block-type", choices=ModToolAdd._block_types, + help="One of %s." % ', '.join(ModToolAdd._block_types)) + parser.add_argument("--license-file", help="File containing the license header for every source code file.") - ogroup.add_option("--copyright", type="string", default=None, + parser.add_argument("--copyright", help="Name of the copyright holder (you or your company) MUST be a quoted string.") - ogroup.add_option("--argument-list", type="string", default=None, + parser.add_argument("--argument-list", help="The argument list for the constructor and make functions.") - ogroup.add_option("--add-python-qa", action="store_true", default=None, + parser.add_argument("--add-python-qa", action="store_true", default=None, help="If given, Python QA code is automatically added if possible.") - ogroup.add_option("--add-cpp-qa", action="store_true", default=None, + parser.add_argument("--add-cpp-qa", action="store_true", default=None, help="If given, C++ QA code is automatically added if possible.") - ogroup.add_option("--skip-cmakefiles", action="store_true", default=False, + parser.add_argument("--skip-cmakefiles", action="store_true", help="If given, only source files are written, but CMakeLists.txt files are left unchanged.") - ogroup.add_option("-l", "--lang", type="choice", choices=('cpp', 'c++', 'python'), - default=None, help="Language (cpp or python)") - parser.add_option_group(ogroup) + parser.add_argument("-l", "--lang", choices=('cpp', 'c++', 'python'), + help="Programing language") + ModTool.setup_parser_block(parser) return parser - def setup(self, options, args): - ModTool.setup(self, options, args) + def setup(self, options): + ModTool.setup(self, options) self._info['blocktype'] = options.block_type if self._info['blocktype'] is None: @@ -80,7 +78,7 @@ class ModToolAdd(ModTool): # Allow user to specify language interactively if not set self._info['lang'] = options.lang if self._info['lang'] is None: - while self._info['lang'] not in ['cpp', 'python']: + while self._info['lang'] not in ['c++', 'cpp', 'python']: self._info['lang'] = raw_input("Language (python/cpp): ") if self._info['lang'] == 'c++': self._info['lang'] = 'cpp' @@ -92,10 +90,7 @@ class ModToolAdd(ModTool): raise ModToolException('Missing or skipping relevant subdir.') if self._info['blockname'] is None: - if len(args) >= 2: - self._info['blockname'] = args[1] - else: - self._info['blockname'] = raw_input("Enter name of block/code (without module name prefix): ") + self._info['blockname'] = raw_input("Enter name of block/code (without module name prefix): ") if not re.match('[a-zA-Z0-9_]+', self._info['blockname']): raise ModToolException('Invalid block name.') print "Block/code identifier: " + self._info['blockname'] @@ -152,8 +147,9 @@ class ModToolAdd(ModTool): open(path_to_file, 'w').write(render_template(tpl, **self._info)) self.scm.add_files((path_to_file,)) - def run(self): + def run(self, options): """ Go, go, go. """ + self.setup(options) has_swig = ( self._info['lang'] == 'cpp' and not self._skip_subdirs['swig'] diff --git a/gr-utils/python/modtool/modtool_base.py b/gr-utils/python/modtool/modtool_base.py index a58b7abcb1..990e63af14 100644 --- a/gr-utils/python/modtool/modtool_base.py +++ b/gr-utils/python/modtool/modtool_base.py @@ -22,7 +22,7 @@ import os import re -from optparse import OptionParser, OptionGroup +from argparse import ArgumentParser, RawDescriptionHelpFormatter from gnuradio import gr from util_functions import get_modname @@ -35,6 +35,8 @@ class ModToolException(BaseException): class ModTool(object): """ Base class for all modtool command classes. """ name = 'base' + description = None + def __init__(self): self._subdirs = ['lib', 'include', 'python', 'swig', 'grc'] # List subdirs where stuff happens self._has_subdirs = {} @@ -44,45 +46,49 @@ class ModTool(object): for subdir in self._subdirs: self._has_subdirs[subdir] = False self._skip_subdirs[subdir] = False - self.parser = self.setup_parser() self._dir = None - def setup_parser(self): - """ Init the option parser. If derived classes need to add options, - override this and call the parent function. """ - parser = OptionParser(add_help_option=False) - parser.usage = '%prog ' + self.name + ' [options] <PATTERN> \n' + \ - ' Call "%prog ' + self.name + '" without any options to run it interactively.' - ogroup = OptionGroup(parser, "General options") - ogroup.add_option("-h", "--help", action="help", help="Displays this help message.") - ogroup.add_option("-d", "--directory", type="string", default=".", + @staticmethod + def setup_parser(parser): + """Override in child class.""" + pass + + @staticmethod + def setup_parser_block(parser): + """Setup options specific for block manipulating modules.""" + parser.add_argument("blockname", nargs="?", metavar="BLOCK_NAME", + help="Name of the block/module") + + @staticmethod + def get_parser(): + """Init the option parser.""" + parser = ArgumentParser( + description='Manipulate with GNU Radio modules source code tree. ' + \ + 'Call it withou options to run specified command interactively', + formatter_class=RawDescriptionHelpFormatter) + parser.add_argument("-d", "--directory", default=".", help="Base directory of the module. Defaults to the cwd.") - ogroup.add_option("-n", "--module-name", type="string", default=None, - help="Use this to override the current module's name (is normally autodetected).") - ogroup.add_option("-N", "--block-name", type="string", default=None, - help="Name of the block, where applicable.") - ogroup.add_option("--skip-lib", action="store_true", default=False, + parser.add_argument("--skip-lib", action="store_true", help="Don't do anything in the lib/ subdirectory.") - ogroup.add_option("--skip-swig", action="store_true", default=False, + parser.add_argument("--skip-swig", action="store_true", help="Don't do anything in the swig/ subdirectory.") - ogroup.add_option("--skip-python", action="store_true", default=False, + parser.add_argument("--skip-python", action="store_true", help="Don't do anything in the python/ subdirectory.") - ogroup.add_option("--skip-grc", action="store_true", default=False, + parser.add_argument("--skip-grc", action="store_true", help="Don't do anything in the grc/ subdirectory.") - ogroup.add_option("--scm-mode", type="choice", choices=('yes', 'no', 'auto'), + parser.add_argument("--scm-mode", choices=('yes', 'no', 'auto'), default=gr.prefs().get_string('modtool', 'scm_mode', 'no'), - help="Use source control management (yes, no or auto).") - ogroup.add_option("-y", "--yes", action="store_true", default=False, + help="Use source control management [ yes | no | auto ]).") + parser.add_argument("-y", "--yes", action="store_true", help="Answer all questions with 'yes'. This can overwrite and delete your files, so be careful.") - parser.add_option_group(ogroup) return parser - def setup(self, options, args): + def setup(self, options): """ Initialise all internal variables, such as the module name etc. """ self._dir = options.directory if not self._check_directory(self._dir): raise ModToolException('No GNU Radio module found in the given directory.') - if options.module_name is not None: + if hasattr(options, 'module_name') and options.module_name is not None: self._info['modname'] = options.module_name else: self._info['modname'] = get_modname() @@ -102,7 +108,7 @@ class ModTool(object): self._skip_subdirs['swig'] = True if options.skip_grc or not self._has_subdirs['grc']: self._skip_subdirs['grc'] = True - self._info['blockname'] = options.block_name + self._info['blockname'] = options.blockname self._setup_files() self._info['yes'] = options.yes self.options = options @@ -181,21 +187,19 @@ class ModTool(object): return fname return None - def run(self): + def run(self, options): """ Override this. """ - pass + raise NotImplementedError('Module implementation missing') -def get_class_dict(the_globals): - " Return a dictionary of the available commands in the form command->class " - classdict = {} - for g in the_globals: +def get_modtool_modules(all_objects): + """Return list with all modtool modules.""" + modules = [] + for o in all_objects: try: - if issubclass(g, ModTool): - classdict[g.name] = g - for a in g.aliases: - classdict[a] = g + if issubclass(o, ModTool) and o != ModTool: + modules.append(o) except (TypeError, AttributeError): pass - return classdict + return modules diff --git a/gr-utils/python/modtool/modtool_disable.py b/gr-utils/python/modtool/modtool_disable.py index 4ae2242f99..1772a740f3 100644 --- a/gr-utils/python/modtool/modtool_disable.py +++ b/gr-utils/python/modtool/modtool_disable.py @@ -31,24 +31,26 @@ from cmakefile_editor import CMakeFileEditor class ModToolDisable(ModTool): """ Disable block (comments out CMake entries for files) """ name = 'disable' - aliases = ('dis',) + description = 'Disable selected block in module.' def __init__(self): ModTool.__init__(self) - def setup(self, options, args): - ModTool.setup(self, options, args) + @staticmethod + def setup_parser(parser): + ModTool.setup_parser_block(parser) - if options.block_name is not None: - self._info['pattern'] = options.block_name - elif len(args) >= 2: - self._info['pattern'] = args[1] + def setup(self, options): + ModTool.setup(self, options) + + if options.blockname is not None: + self._info['pattern'] = options.blockname else: self._info['pattern'] = raw_input('Which blocks do you want to disable? (Regex): ') if len(self._info['pattern']) == 0: self._info['pattern'] = '.' - def run(self): + def run(self, options): """ Go, go, go! """ def _handle_py_qa(cmake, fname): """ Do stuff for py qa """ @@ -115,6 +117,7 @@ class ModToolDisable(ModTool): open(self._file['swig'], 'w').write(swigfile) self.scm.mark_file_updated(self._file['swig']) return False + self.setup(options) # List of special rules: 0: subdir, 1: filename re match, 2: callback special_treatments = ( ('python', 'qa.+py$', _handle_py_qa), diff --git a/gr-utils/python/modtool/modtool_help.py b/gr-utils/python/modtool/modtool_help.py deleted file mode 100644 index b894e272e8..0000000000 --- a/gr-utils/python/modtool/modtool_help.py +++ /dev/null @@ -1,68 +0,0 @@ -# -# Copyright 2013 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# 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. -# -""" The help module """ - -from gnuradio.modtool import * -from util_functions import get_command_from_argv -from templates import Templates - - -def print_class_descriptions(): - """ Go through all ModTool* classes and print their name, - alias and description. """ - desclist = [] - for gvar in globals().values(): - try: - if issubclass(gvar, ModTool) and not issubclass(gvar, ModToolHelp): - desclist.append((gvar.name, ','.join(gvar.aliases), gvar.__doc__)) - except (TypeError, AttributeError): - pass - print 'Name Aliases Description' - print '=====================================================================' - for description in desclist: - print '%-8s %-12s %s' % description - - -class ModToolHelp(ModTool): - """ Show some help. """ - name = 'help' - aliases = ('h', '?') - - def __init__(self): - ModTool.__init__(self) - - def setup(self, options, args): - pass - - def run(self): - cmd_dict = get_class_dict(globals().values()) - cmds = cmd_dict.keys() - cmds.remove(self.name) - for a in self.aliases: - cmds.remove(a) - help_requested_for = get_command_from_argv(cmds) - if help_requested_for is None: - print 'Usage:' + Templates['usage'] - print '\nList of possible commands:\n' - print_class_descriptions() - return - cmd_dict[help_requested_for]().setup_parser().print_help() - diff --git a/gr-utils/python/modtool/modtool_info.py b/gr-utils/python/modtool/modtool_info.py index 5596a7db83..317948239e 100644 --- a/gr-utils/python/modtool/modtool_info.py +++ b/gr-utils/python/modtool/modtool_info.py @@ -21,7 +21,6 @@ """ Returns information about a module """ import os -from optparse import OptionGroup from modtool_base import ModTool, ModToolException from util_functions import get_modname @@ -30,7 +29,7 @@ from util_functions import get_modname class ModToolInfo(ModTool): """ Return information about a given module """ name = 'info' - aliases = ('getinfo', 'inf') + description = 'Return informations about module.' def __init__(self): ModTool.__init__(self) @@ -38,26 +37,25 @@ class ModToolInfo(ModTool): self._python_readable = False self._suggested_dirs = None - def setup_parser(self): + @staticmethod + def setup_parser(parser): """ Initialise the option parser for 'gr_modtool info' """ - parser = ModTool.setup_parser(self) - parser.usage = '%prog info [options]. \n Call %prog without any options to run it interactively.' - ogroup = OptionGroup(parser, "Info options") - ogroup.add_option("--python-readable", action="store_true", default=None, + #args_group = parser.add_argument_group(title="Info options") + parser.add_argument("--python-readable", action="store_true", help="Return the output in a format that's easier to read for Python scripts.") - ogroup.add_option("--suggested-dirs", default=None, type="string", + parser.add_argument("--suggested-dirs", help="Suggest typical include dirs if nothing better can be detected.") - parser.add_option_group(ogroup) return parser - def setup(self, options, args): + def setup(self, options): # Won't call parent's setup(), because that's too chatty self._directory = options.directory self._python_readable = options.python_readable self._suggested_dirs = options.suggested_dirs - def run(self): + def run(self, options): """ Go, go, go! """ + self.setup(options) mod_info = dict() mod_info['base_dir'] = self._get_base_dir(self._directory) if mod_info['base_dir'] is None: diff --git a/gr-utils/python/modtool/modtool_makexml.py b/gr-utils/python/modtool/modtool_makexml.py index 575d7eb873..5f53749163 100644 --- a/gr-utils/python/modtool/modtool_makexml.py +++ b/gr-utils/python/modtool/modtool_makexml.py @@ -34,35 +34,34 @@ from util_functions import ask_yes_no class ModToolMakeXML(ModTool): """ Make XML file for GRC block bindings """ name = 'makexml' - aliases = ('mx',) + description = 'Generate XML files for GRC block bindings.' def __init__(self): ModTool.__init__(self) - def setup_parser(self): + @staticmethod + def setup_parser(parser): """ Initialise the option parser for 'gr_modtool makexml' """ - parser = ModTool.setup_parser(self) - parser.usage = """%prog info [options]. \n Call %prog without any options to run it interactively. + parser.usage = """%s Note: This does not work on Python blocks! - """ - return parser + """ % parser.usage + ModTool.setup_parser_block(parser) - def setup(self, options, args): - ModTool.setup(self, options, args) + def setup(self, options): + ModTool.setup(self, options) - if options.block_name is not None: - self._info['pattern'] = options.block_name - elif len(args) >= 2: - self._info['pattern'] = args[1] + if options.blockname is not None: + self._info['pattern'] = options.blockname else: self._info['pattern'] = raw_input('Which blocks do you want to parse? (Regex): ') if len(self._info['pattern']) == 0: self._info['pattern'] = '.' - def run(self): + def run(self, options): """ Go, go, go! """ print "Warning: This is an experimental feature. Don't expect any magic." + self.setup(options) # 1) Go through lib/ if not self._skip_subdirs['lib']: if self._info['version'] == '37': diff --git a/gr-utils/python/modtool/modtool_newmod.py b/gr-utils/python/modtool/modtool_newmod.py index 3e05ecbf48..4382d9be7d 100644 --- a/gr-utils/python/modtool/modtool_newmod.py +++ b/gr-utils/python/modtool/modtool_newmod.py @@ -23,7 +23,6 @@ import shutil import os import re -from optparse import OptionGroup from gnuradio import gr from modtool_base import ModTool, ModToolException from scm import SCMRepoFactory @@ -31,26 +30,24 @@ from scm import SCMRepoFactory class ModToolNewModule(ModTool): """ Create a new out-of-tree module """ name = 'newmod' - aliases = ('nm', 'create') + description = 'Create new empty module, use add to add blocks.' def __init__(self): ModTool.__init__(self) - def setup_parser(self): + @staticmethod + def setup_parser(parser): " Initialise the option parser for 'gr_modtool newmod' " - parser = ModTool.setup_parser(self) - parser.usage = '%prog nm [options]. \n Call %prog without any options to run it interactively.' - ogroup = OptionGroup(parser, "New out-of-tree module options") - ogroup.add_option("--srcdir", type="string", + parser.add_argument("--srcdir", help="Source directory for the module template.") - parser.add_option_group(ogroup) - return parser + parser.add_argument("module_name", metavar='MODULE-NAME', nargs='?', + help="Override the current module's name (normally is autodetected).") - def setup(self, options, args): + def setup(self, options): # Don't call ModTool.setup(), that assumes an existing module. self._info['modname'] = options.module_name if self._info['modname'] is None: - if len(args) >= 2: - self._info['modname'] = args[1] + if options.module_name: + self._info['modname'] = options.module_name else: self._info['modname'] = raw_input('Name of the new module: ') if not re.match('[a-zA-Z0-9_]+$', self._info['modname']): @@ -72,12 +69,13 @@ class ModToolNewModule(ModTool): self.options = options self._setup_scm(mode='new') - def run(self): + def run(self, options): """ * Copy the example dir recursively * Open all files, rename howto and HOWTO to the module name * Rename files and directories that contain the word howto """ + self.setup(options) print "Creating out-of-tree module in %s..." % self._dir, try: shutil.copytree(self._srcdir, self._dir) diff --git a/gr-utils/python/modtool/modtool_rename.py b/gr-utils/python/modtool/modtool_rename.py index 86bafc56a5..f0ff412a89 100644 --- a/gr-utils/python/modtool/modtool_rename.py +++ b/gr-utils/python/modtool/modtool_rename.py @@ -22,7 +22,6 @@ import os import re -from optparse import OptionGroup from util_functions import append_re_line_sequence, ask_yes_no from cmakefile_editor import CMakeFileEditor @@ -32,7 +31,7 @@ from templates import Templates class ModToolRename(ModTool): """ Rename a block in the out-of-tree module. """ name = 'rename' - aliases = ('mv',) + description = 'Rename block inside module.' def __init__(self): ModTool.__init__(self) @@ -41,47 +40,43 @@ class ModToolRename(ModTool): self._skip_cmakefiles = False self._license_file = None - def setup_parser(self): - parser = ModTool.setup_parser(self) - ogroup = OptionGroup(parser, "Rename module options") - ogroup.add_option("-o", "--old-name", type="string", default=None, help="Current name of the block to rename.") - ogroup.add_option("-u", "--new-name", type="string", default=None, help="New name of the block.") - parser.add_option_group(ogroup) + @staticmethod + def setup_parser(parser): + #parser = parser.add_argument_group(title="Rename module options") + ModTool.setup_parser_block(parser) + parser.add_argument("new_name", nargs="?", metavar='NEW-BLOCK-NAME', + help="New name of the block.") return parser - def setup(self, options, args): - ModTool.setup(self, options, args) + def setup(self, options): + ModTool.setup(self, options) if ((self._skip_subdirs['lib'] and self._info['lang'] == 'cpp') or (self._skip_subdirs['python'] and self._info['lang'] == 'python')): raise ModToolException('Missing or skipping relevant subdir.') # first make sure the old block name is provided - self._info['oldname'] = options.old_name + self._info['oldname'] = options.blockname if self._info['oldname'] is None: - if len(args) >= 2: - self._info['oldname'] = args[1] - else: - self._info['oldname'] = raw_input("Enter name of block/code to rename (without module name prefix): ") + self._info['oldname'] = raw_input("Enter name of block/code to rename (without module name prefix): ") if not re.match('[a-zA-Z0-9_]+', self._info['oldname']): raise ModToolException('Invalid block name.') print "Block/code to rename identifier: " + self._info['oldname'] self._info['fulloldname'] = self._info['modname'] + '_' + self._info['oldname'] # now get the new block name - self._info['newname'] = options.new_name - if self._info['newname'] is None: - if len(args) >= 2: - self._info['newname'] = args[2] - else: - self._info['newname'] = raw_input("Enter name of block/code (without module name prefix): ") + if options.new_name is None: + self._info['newname'] = raw_input("Enter name of block/code (without module name prefix): ") + else: + self._info['newname'] = options.new_name[0] if not re.match('[a-zA-Z0-9_]+', self._info['newname']): raise ModToolException('Invalid block name.') print "Block/code identifier: " + self._info['newname'] self._info['fullnewname'] = self._info['modname'] + '_' + self._info['newname'] - def run(self): + def run(self, options): """ Go, go, go. """ + self.setup(options) module = self._info['modname'] oldname = self._info['oldname'] newname = self._info['newname'] diff --git a/gr-utils/python/modtool/modtool_rm.py b/gr-utils/python/modtool/modtool_rm.py index 47128dbc87..eef743dd61 100644 --- a/gr-utils/python/modtool/modtool_rm.py +++ b/gr-utils/python/modtool/modtool_rm.py @@ -33,24 +33,26 @@ from cmakefile_editor import CMakeFileEditor class ModToolRemove(ModTool): """ Remove block (delete files and remove Makefile entries) """ name = 'remove' - aliases = ('rm', 'del') + description = 'Remove block from module.' def __init__(self): ModTool.__init__(self) - def setup(self, options, args): - ModTool.setup(self, options, args) + @staticmethod + def setup_parser(parser): + ModTool.setup_parser_block(parser) - if options.block_name is not None: - self._info['pattern'] = options.block_name - elif len(args) >= 2: - self._info['pattern'] = args[1] + def setup(self, options): + ModTool.setup(self, options) + + if options.blockname is not None: + self._info['pattern'] = options.blockname else: self._info['pattern'] = raw_input('Which blocks do you want to delete? (Regex): ') if len(self._info['pattern']) == 0: self._info['pattern'] = '.' - def run(self): + def run(self, options): """ Go, go, go! """ def _remove_cc_test_case(filename=None, ed=None): """ Special function that removes the occurrences of a qa*.cc file @@ -96,6 +98,7 @@ class ModToolRemove(ModTool): (self._info['modname'], pyblockname, self._info['modname'], filename) return regexp # Go, go, go! + self.setup(options) if not self._skip_subdirs['lib']: self._run_subdir('lib', ('*.cc', '*.h'), ('add_library', 'list'), cmakeedit_func=_remove_cc_test_case) diff --git a/gr-utils/python/modtool/templates.py b/gr-utils/python/modtool/templates.py index a9c117ac91..3829f7a644 100644 --- a/gr-utils/python/modtool/templates.py +++ b/gr-utils/python/modtool/templates.py @@ -567,12 +567,6 @@ Templates['grc_xml'] = '''<?xml version="1.0"?> </block> ''' -# Usage -Templates['usage'] = ''' -gr_modtool <command> [options] -- Run <command> with the given options. -gr_modtool help -- Show a list of commands. -gr_modtool help <command> -- Shows the help for a given command. ''' - # SWIG string Templates['swig_block_magic'] = """% if version == '36': % if blocktype != 'noblock': diff --git a/gr-utils/python/modtool/util_functions.py b/gr-utils/python/modtool/util_functions.py index 47799ac461..de7f3d29b6 100644 --- a/gr-utils/python/modtool/util_functions.py +++ b/gr-utils/python/modtool/util_functions.py @@ -25,15 +25,6 @@ import sys # None of these must depend on other modtool stuff! -def get_command_from_argv(possible_cmds): - """ Read the requested command from argv. This can't be done with optparse, - since the option parser isn't defined before the command is known, and - optparse throws an error.""" - for arg in sys.argv: - if arg[0] != "-" and arg in possible_cmds: - return arg - return None - def append_re_line_sequence(filename, linepattern, newline): """ Detects the re 'linepattern' in the file. After its last occurrence, paste 'newline'. If the pattern does not exist, append the new line diff --git a/gr-utils/python/utils/CMakeLists.txt b/gr-utils/python/utils/CMakeLists.txt index 54eba51170..46a21c1508 100644 --- a/gr-utils/python/utils/CMakeLists.txt +++ b/gr-utils/python/utils/CMakeLists.txt @@ -30,7 +30,6 @@ GR_PYTHON_INSTALL( pyqt_plot.py pyqt_filter.py DESTINATION ${GR_PYTHON_DIR}/gnuradio - COMPONENT "utils" ) GR_PYTHON_INSTALL( @@ -52,5 +51,4 @@ GR_PYTHON_INSTALL( gr_read_file_metadata grcc DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "utils" ) diff --git a/gr-utils/python/utils/gr_modtool b/gr-utils/python/utils/gr_modtool index e714cf48e5..d9016840be 100755 --- a/gr-utils/python/utils/gr_modtool +++ b/gr-utils/python/utils/gr_modtool @@ -24,19 +24,27 @@ from gnuradio.modtool import * +def setup_parser(): + modules = get_modtool_modules(globals().values()) + parser = ModTool.get_parser() + subparsers = parser.add_subparsers(title="Commands") + epilog = [] + for module in modules: + subparser = subparsers.add_parser(module.name, + description=module.description) + module.setup_parser(subparser) + subparser.set_defaults(module=module) + epilog.append(" {:<22}{}".format(module.name, module.description)) + parser.epilog = '\n'.join(epilog) + return parser + def main(): """ Here we go. Parse command, choose class and run. """ - cmd_dict = get_class_dict(globals().values()) - command = get_command_from_argv(cmd_dict.keys()) - if command is None: - print 'Usage:' + Templates['usage'] - exit(2) - modtool = cmd_dict[command]() - try: - (options, args) = modtool.parser.parse_args() - modtool.setup(options, args) - modtool.run() + parser = setup_parser() + args = parser.parse_args() + try: + args.module().run(args) except ModToolException as err: print >> sys.stderr, err exit(1) diff --git a/gr-utils/python/utils/gr_plot_char b/gr-utils/python/utils/gr_plot_char index a2b93a63c6..ee644557bb 100755 --- a/gr-utils/python/utils/gr_plot_char +++ b/gr-utils/python/utils/gr_plot_char @@ -26,29 +26,26 @@ except ImportError: print "Please install SciPy to run this script (http://www.scipy.org/)" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser from gnuradio.plot_data import plot_data def main(): - usage="%prog: [options] input_filenames" description = "Takes a GNU Radio byte/char binary file and displays the samples versus time. You can set the block size to specify how many points to read in at a time and the start position in the file. By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples." - parser = OptionParser(conflict_handler="resolve", usage=usage, description=description) - parser.add_option("-B", "--block", type="int", default=1000, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="float", default=1.0, - help="Set the sampler rate of the data [default=%default]") - - (options, args) = parser.parse_args () - if len(args) < 1: - parser.print_help() - raise SystemExit, 1 - filenames = args - - datatype=scipy.int8 - dc = plot_data(datatype, filenames, options) + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-B", "--block", type=int, default=1000, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("files", metavar="FILE", nargs="+", + help="Input file with complex samples") + + args = parser.parse_args() + + datatype = scipy.int8 + dc = plot_data(datatype, args.files, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_const b/gr-utils/python/utils/gr_plot_const index e2580dd58f..28f6a540da 100755 --- a/gr-utils/python/utils/gr_plot_const +++ b/gr-utils/python/utils/gr_plot_const @@ -33,7 +33,7 @@ except ImportError: print "Please install Matplotlib to run this script (http://matplotlib.sourceforge.net/)" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser class draw_constellation: def __init__(self, filename, options): @@ -221,24 +221,20 @@ def find(item_in, list_search): def main(): - usage="%prog: [options] input_filename" description = "Takes a GNU Radio complex binary file and displays the I&Q data versus time and the constellation plot (I vs. Q). You can set the block size to specify how many points to read in at a time and the start position in the file. By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples." - parser = OptionParser(conflict_handler="resolve", usage=usage, description=description) - parser.add_option("-B", "--block", type="int", default=1000, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="float", default=1.0, - help="Set the sampler rate of the data [default=%default]") - - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] - - dc = draw_constellation(filename, options) + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-B", "--block", type=int, default=1000, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("file", metavar="FILE", nargs=1, + help="Input file with complex samples") + args = parser.parse_args() + + dc = draw_constellation(args.file[0], args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_fft b/gr-utils/python/utils/gr_plot_fft index 4343481645..59fc88b994 100644 --- a/gr-utils/python/utils/gr_plot_fft +++ b/gr-utils/python/utils/gr_plot_fft @@ -27,13 +27,9 @@ from gnuradio.plot_fft_base import plot_fft_base def main(): parser = plot_fft_base.setup_options() - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] + args = parser.parse_args() - dc = plot_fft_base(options.data_type, filename, options) + dc = plot_fft_base(args.data_type, args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_fft_c b/gr-utils/python/utils/gr_plot_fft_c index 43e808d95a..48d3218586 100755 --- a/gr-utils/python/utils/gr_plot_fft_c +++ b/gr-utils/python/utils/gr_plot_fft_c @@ -26,15 +26,12 @@ from gnuradio.plot_fft_base import plot_fft_base def main(): parser = plot_fft_base.setup_options() - parser.remove_option("--data-type") + parser.add_argument("-d", "--data-type", default="complex64", + choices=("complex64", )) - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] + args = parser.parse_args() - dc = plot_fft_base("complex64", filename, options) + dc = plot_fft_base("complex64", args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_fft_f b/gr-utils/python/utils/gr_plot_fft_f index dee9b17dea..d1791419bb 100755 --- a/gr-utils/python/utils/gr_plot_fft_f +++ b/gr-utils/python/utils/gr_plot_fft_f @@ -26,15 +26,11 @@ from gnuradio.plot_fft_base import plot_fft_base def main(): parser = plot_fft_base.setup_options() - parser.remove_option("--data-type") + parser.add_argument("-d", "--data-type", default="float32", + choices=("float32", )) + args = parser.parse_args() - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] - - dc = plot_fft_base("float32", filename, options) + dc = plot_fft_base("float32", args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_float b/gr-utils/python/utils/gr_plot_float index 22806e48ae..faf8106d70 100755 --- a/gr-utils/python/utils/gr_plot_float +++ b/gr-utils/python/utils/gr_plot_float @@ -26,29 +26,26 @@ except ImportError: print "Please install SciPy to run this script (http://www.scipy.org/)" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser from gnuradio.plot_data import plot_data def main(): - usage="%prog: [options] input_filenames" description = "Takes a GNU Radio floating point binary file and displays the samples versus time. You can set the block size to specify how many points to read in at a time and the start position in the file. By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples." - parser = OptionParser(conflict_handler="resolve", usage=usage, description=description) - parser.add_option("-B", "--block", type="int", default=1000, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="float", default=1.0, - help="Set the sampler rate of the data [default=%default]") + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-B", "--block", type=int, default=1000, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("file", metavar="FILE", nargs='+', + help="Input file with samples") - (options, args) = parser.parse_args () - if len(args) < 1: - parser.print_help() - raise SystemExit, 1 - filenames = args + args = parser.parse_args() datatype=scipy.float32 - dc = plot_data(datatype, filenames, options) + dc = plot_data(datatype, args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_int b/gr-utils/python/utils/gr_plot_int index 355ddf0189..c687f13b17 100755 --- a/gr-utils/python/utils/gr_plot_int +++ b/gr-utils/python/utils/gr_plot_int @@ -26,29 +26,26 @@ except ImportError: print "Please install SciPy to run this script (http://www.scipy.org/)" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser from gnuradio.plot_data import plot_data def main(): - usage="%prog: [options] input_filenames" description = "Takes a GNU Radio integer binary file and displays the samples versus time. You can set the block size to specify how many points to read in at a time and the start position in the file. By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples." - parser = OptionParser(conflict_handler="resolve", usage=usage, description=description) - parser.add_option("-B", "--block", type="int", default=1000, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="float", default=1.0, - help="Set the sampler rate of the data [default=%default]") + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-B", "--block", type=int, default=1000, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("file", metavar="FILE", nargs='+', + help="Input file"); - (options, args) = parser.parse_args () - if len(args) < 1: - parser.print_help() - raise SystemExit, 1 - filenames = args + args = parser.parse_args() datatype=scipy.int32 - dc = plot_data(datatype, filenames, options) + dc = plot_data(datatype, args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_iq b/gr-utils/python/utils/gr_plot_iq index bf8077b6b4..7409b73909 100755 --- a/gr-utils/python/utils/gr_plot_iq +++ b/gr-utils/python/utils/gr_plot_iq @@ -32,7 +32,7 @@ except ImportError: print "Please install Matplotlib to run this script (http://matplotlib.sourceforge.net/)" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser class draw_iq: def __init__(self, filename, options): @@ -149,24 +149,21 @@ def find(item_in, list_search): return False def main(): - usage="%prog: [options] input_filename" description = "Takes a GNU Radio complex binary file and displays the I&Q data versus time. You can set the block size to specify how many points to read in at a time and the start position in the file. By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples." - parser = OptionParser(conflict_handler="resolve", usage=usage, description=description) - parser.add_option("-B", "--block", type="int", default=1000, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="float", default=1.0, - help="Set the sampler rate of the data [default=%default]") - - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] - - dc = draw_iq(filename, options) + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-B", "--block", type=int, default=1000, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("file", metavar="FILE", + help="Input file with complex samples") + + args = parser.parse_args() + + dc = draw_iq(args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_psd b/gr-utils/python/utils/gr_plot_psd index 059ca6b645..b052cbfdd7 100644 --- a/gr-utils/python/utils/gr_plot_psd +++ b/gr-utils/python/utils/gr_plot_psd @@ -27,13 +27,9 @@ from gnuradio.plot_psd_base import plot_psd_base def main(): parser = plot_psd_base.setup_options() - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] + args = parser.parse_args() - dc = plot_psd_base(options.data_type, filename, options) + dc = plot_psd_base(args.data_type, args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_psd_c b/gr-utils/python/utils/gr_plot_psd_c index fff2bff0f2..352a838138 100755 --- a/gr-utils/python/utils/gr_plot_psd_c +++ b/gr-utils/python/utils/gr_plot_psd_c @@ -20,22 +20,19 @@ # Boston, MA 02110-1301, USA. # -from optparse import OptionParser +from argparse import ArgumentParser from gnuradio.plot_psd_base import plot_psd_base # This is a wrapper program for plot_psd_base specifically for complex data def main(): parser = plot_psd_base.setup_options() - parser.remove_option("--data-type") + parser.add_argument("-d", "--data-type", default="complex64", + choices=("complex64", )) - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] + args = parser.parse_args() - dc = plot_psd_base("complex64", filename, options) + dc = plot_psd_base("complex64", args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_psd_f b/gr-utils/python/utils/gr_plot_psd_f index ec67994797..ab860e3fb8 100755 --- a/gr-utils/python/utils/gr_plot_psd_f +++ b/gr-utils/python/utils/gr_plot_psd_f @@ -20,22 +20,19 @@ # Boston, MA 02110-1301, USA. # -from optparse import OptionParser +from argparse import ArgumentParser from gnuradio.plot_psd_base import plot_psd_base # This is a wrapper program for gr_plot_psd specifically for floating point data def main(): parser = plot_psd_base.setup_options() - parser.remove_option("--data-type") + parser.add_argument("-d", "--data-type", default="complex64", + choices=("float32", )) - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] + args = parser.parse_args() - dc = plot_psd_base("float32", filename, options) + dc = plot_psd_base("float32", args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_plot_short b/gr-utils/python/utils/gr_plot_short index 702a2a94a6..f900af1bac 100755 --- a/gr-utils/python/utils/gr_plot_short +++ b/gr-utils/python/utils/gr_plot_short @@ -26,29 +26,26 @@ except ImportError: print "Please install SciPy to run this script (http://www.scipy.org/)" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser from gnuradio.plot_data import plot_data def main(): - usage="%prog: [options] input_filenames" description = "Takes a GNU Radio short integer binary file and displays the samples versus time. You can set the block size to specify how many points to read in at a time and the start position in the file. By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples." - parser = OptionParser(conflict_handler="resolve", usage=usage, description=description) - parser.add_option("-B", "--block", type="int", default=1000, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="float", default=1.0, - help="Set the sampler rate of the data [default=%default]") + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-B", "--block", type=int, default=1000, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("files", metavar="FILE", nargs="+", + help="Input file with data (int16_t)") - (options, args) = parser.parse_args () - if len(args) < 1: - parser.print_help() - raise SystemExit, 1 - filenames = args + args = parser.parse_args() datatype=scipy.int16 - dc = plot_data(datatype, filenames, options) + dc = plot_data(datatype, args.files, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/gr_read_file_metadata b/gr-utils/python/utils/gr_read_file_metadata index 429b38310f..2a907687d6 100644 --- a/gr-utils/python/utils/gr_read_file_metadata +++ b/gr-utils/python/utils/gr_read_file_metadata @@ -21,7 +21,7 @@ # import sys -from optparse import OptionParser +from argparse import ArgumentParser import pmt from gnuradio.blocks import parse_file_metadata @@ -69,19 +69,15 @@ def main(filename, detached=False): handle.seek(nread, 0) print "\n\n" + if __name__ == "__main__": - usage="%prog: [options] filename" description = "Read in a GNU Radio file with meta data, extracts the header and prints it." - parser = OptionParser(conflict_handler="resolve", - usage=usage, description=description) - parser.add_option("-D", "--detached", action="store_true", default=False, + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-D", "--detached", action="store_true", help="Used if header is detached.") - (options, args) = parser.parse_args () - - if(len(args) < 1): - sys.stderr.write("No filename given\n") - sys.exit(1) + parser.add_argument("file", metavar="FILE", nargs=1, + help="Input file"); + args = parser.parse_args() - filename = args[0] - main(filename, options.detached) + main(args.file[0], args.detached) diff --git a/gr-utils/python/utils/grcc b/gr-utils/python/utils/grcc index 776af799d3..e93802f051 100755 --- a/gr-utils/python/utils/grcc +++ b/gr-utils/python/utils/grcc @@ -26,16 +26,22 @@ from argparse import ArgumentParser import warnings warnings.simplefilter('ignore') +from gnuradio import gr + try: - from grc.python.Platform import Platform + from grc.core.Platform import Platform except ImportError: - from gnuradio.grc.python.Platform import Platform + from gnuradio.grc.core.Platform import Platform class GRCC: def __init__(self, grcfile, out_dir): self.out_dir = out_dir - self.platform = Platform() + self.platform = Platform( + prefs_file=gr.prefs(), + version=gr.version(), + version_parts=(gr.major_version(), gr.api_version(), gr.minor_version()) + ) data = self.platform.parse_flow_graph(grcfile) self.fg = self.platform.get_new_flow_graph() @@ -48,7 +54,7 @@ class GRCC: ["Validation failed:"] + self.fg.get_error_messages() )) - self.gen = self.platform.get_generator()(self.fg, out_dir) + self.gen = self.platform.Generator(self.fg, out_dir) self.gen.write() def exec_program(self): diff --git a/gr-utils/python/utils/plot_data.py b/gr-utils/python/utils/plot_data.py index 2ae3b1d5b3..7d80c714fe 100644 --- a/gr-utils/python/utils/plot_data.py +++ b/gr-utils/python/utils/plot_data.py @@ -34,7 +34,6 @@ except ImportError: print "Please install Matplotlib to run this script (http://matplotlib.sourceforge.net/)" raise SystemExit, 1 -from optparse import OptionParser class plot_data: def __init__(self, datatype, filenames, options): diff --git a/gr-utils/python/utils/plot_fft_base.py b/gr-utils/python/utils/plot_fft_base.py index c4bc484d97..c99462147d 100755 --- a/gr-utils/python/utils/plot_fft_base.py +++ b/gr-utils/python/utils/plot_fft_base.py @@ -33,7 +33,7 @@ except ImportError: print "Please install Python Matplotlib (http://matplotlib.sourceforge.net/) and Python TkInter https://wiki.python.org/moin/TkInter to run this script" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser class plot_fft_base: def __init__(self, datatype, filename, options): @@ -209,18 +209,21 @@ class plot_fft_base: @staticmethod def setup_options(): - usage="%prog: [options] input_filename" description = "Takes a GNU Radio complex binary file and displays the I&Q data versus time as well as the frequency domain (FFT) plot. The y-axis values are plotted assuming volts as the amplitude of the I&Q streams and converted into dBm in the frequency domain (the 1/N power adjustment out of the FFT is performed internally). The script plots a certain block of data at a time, specified on the command line as -B or --block. This value defaults to 1000. The start position in the file can be set by specifying -s or --start and defaults to 0 (the start of the file). By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time and frequency axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples." - parser = OptionParser(conflict_handler="resolve", usage=usage, description=description) - parser.add_option("-d", "--data-type", type="string", default="complex64", - help="Specify the data type (complex64, float32, (u)int32, (u)int16, (u)int8) [default=%default]") - parser.add_option("-B", "--block", type="int", default=1000, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="float", default=1.0, - help="Set the sampler rate of the data [default=%default]") + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-d", "--data-type", default="complex64", + choices=("complex64", "float32", "uint32", "int32", "uint16", + "int16", "uint8", "int8"), + help="Specify the data type [default=%(default)r]") + parser.add_argument("-B", "--block", type=int, default=1000, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("file", metavar="FILE", + help="Input file with samples") return parser def find(item_in, list_search): @@ -231,13 +234,9 @@ def find(item_in, list_search): def main(): parser = plot_fft_base.setup_options() - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] + args = parser.parse_args() - dc = plot_fft_base(options.data_type, filename, options) + dc = plot_fft_base(args.data_type, args.file, args) if __name__ == "__main__": try: diff --git a/gr-utils/python/utils/plot_psd_base.py b/gr-utils/python/utils/plot_psd_base.py index fe3c9e12b7..2611ed4be2 100755 --- a/gr-utils/python/utils/plot_psd_base.py +++ b/gr-utils/python/utils/plot_psd_base.py @@ -33,9 +33,9 @@ except ImportError: print "Please install Matplotlib to run this script (http://matplotlib.sourceforge.net/)" raise SystemExit, 1 -from optparse import OptionParser +from argparse import ArgumentParser from scipy import log10 -from gnuradio.eng_option import eng_option +from gnuradio.eng_arg import eng_float, intx class plot_psd_base: def __init__(self, datatype, filename, options): @@ -244,25 +244,27 @@ class plot_psd_base: @staticmethod def setup_options(): - usage="%prog: [options] input_filename" description = "Takes a GNU Radio binary file (with specified data type using --data-type) and displays the I&Q data versus time as well as the power spectral density (PSD) plot. The y-axis values are plotted assuming volts as the amplitude of the I&Q streams and converted into dBm in the frequency domain (the 1/N power adjustment out of the FFT is performed internally). The script plots a certain block of data at a time, specified on the command line as -B or --block. The start position in the file can be set by specifying -s or --start and defaults to 0 (the start of the file). By default, the system assumes a sample rate of 1, so in time, each sample is plotted versus the sample number. To set a true time and frequency axis, set the sample rate (-R or --sample-rate) to the sample rate used when capturing the samples. Finally, the size of the FFT to use for the PSD and spectrogram plots can be set independently with --psd-size and --spec-size, respectively. The spectrogram plot does not display by default and is turned on with -S or --enable-spec." - parser = OptionParser(option_class=eng_option, conflict_handler="resolve", - usage=usage, description=description) - parser.add_option("-d", "--data-type", type="string", default="complex64", - help="Specify the data type (complex64, float32, (u)int32, (u)int16, (u)int8) [default=%default]") - parser.add_option("-B", "--block", type="int", default=8192, - help="Specify the block size [default=%default]") - parser.add_option("-s", "--start", type="int", default=0, - help="Specify where to start in the file [default=%default]") - parser.add_option("-R", "--sample-rate", type="eng_float", default=1.0, - help="Set the sampler rate of the data [default=%default]") - parser.add_option("", "--psd-size", type="int", default=1024, - help="Set the size of the PSD FFT [default=%default]") - parser.add_option("", "--spec-size", type="int", default=256, - help="Set the size of the spectrogram FFT [default=%default]") - parser.add_option("-S", "--enable-spec", action="store_true", default=False, - help="Turn on plotting the spectrogram [default=%default]") + parser = ArgumentParser(conflict_handler="resolve", description=description) + parser.add_argument("-d", "--data-type", default="complex64", + choices=("complex64", "float32", "int32", "uint32", "int16", + "uint16", "int8", "uint8" ), + help="Specify the data type [default=%(default)r]") + parser.add_argument("-B", "--block", type=int, default=8192, + help="Specify the block size [default=%(default)r]") + parser.add_argument("-s", "--start", type=int, default=0, + help="Specify where to start in the file [default=%(default)r]") + parser.add_argument("-R", "--sample-rate", type=eng_float, default=1.0, + help="Set the sampler rate of the data [default=%(default)r]") + parser.add_argument("--psd-size", type=int, default=1024, + help="Set the size of the PSD FFT [default=%(default)r]") + parser.add_argument("--spec-size", type=int, default=256, + help="Set the size of the spectrogram FFT [default=%(default)r]") + parser.add_argument("-S", "--enable-spec", action="store_true", + help="Turn on plotting the spectrogram [default=%(default)r]") + parser.add_argument("file", metavar="FILE", + help="Input file with samples") return parser @@ -274,13 +276,9 @@ def find(item_in, list_search): def main(): parser = plot_psd_base.setup_options() - (options, args) = parser.parse_args () - if len(args) != 1: - parser.print_help() - raise SystemExit, 1 - filename = args[0] + args = parser.parse_args() - dc = plot_psd_base(options.data_type, filename, options) + dc = plot_psd_base(args.data_type, args.file, args) if __name__ == "__main__": try: diff --git a/gr-video-sdl/CMakeLists.txt b/gr-video-sdl/CMakeLists.txt index 50975eb675..a171535c37 100644 --- a/gr-video-sdl/CMakeLists.txt +++ b/gr-video-sdl/CMakeLists.txt @@ -45,40 +45,6 @@ GR_SET_GLOBAL(GR_VIDEO_SDL_INCLUDE_DIRS if(ENABLE_GR_VIDEO_SDL) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_VIDEO_SDL_DESCRIPTION "GNU Radio Video SDL Blocks") - -CPACK_COMPONENT("video_sdl_runtime" - GROUP "Video SDL" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("video_sdl_devel" - GROUP "Video SDL" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("video_sdl_python" - GROUP "Video SDL" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;video_sdl_runtime" -) - -CPACK_COMPONENT("video_sdl_swig" - GROUP "Video SDL" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;video_sdl_python;video_sdl_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/video_sdl) @@ -100,7 +66,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-video-sdl.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "video_sdl_devel" ) endif(ENABLE_GR_VIDEO_SDL) diff --git a/gr-video-sdl/grc/CMakeLists.txt b/gr-video-sdl/grc/CMakeLists.txt index b696224274..f62d41b6db 100644 --- a/gr-video-sdl/grc/CMakeLists.txt +++ b/gr-video-sdl/grc/CMakeLists.txt @@ -23,5 +23,3 @@ install(FILES DESTINATION share/gnuradio/grc/blocks ) - - diff --git a/gr-video-sdl/include/gnuradio/video_sdl/CMakeLists.txt b/gr-video-sdl/include/gnuradio/video_sdl/CMakeLists.txt index 8831fd8172..97b211031d 100644 --- a/gr-video-sdl/include/gnuradio/video_sdl/CMakeLists.txt +++ b/gr-video-sdl/include/gnuradio/video_sdl/CMakeLists.txt @@ -25,6 +25,5 @@ install(FILES sink_s.h sink_uc.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/video_sdl - COMPONENT "video_sdl_devel" ) diff --git a/gr-video-sdl/lib/CMakeLists.txt b/gr-video-sdl/lib/CMakeLists.txt index 42ad24e3ff..d43f0bb914 100644 --- a/gr-video-sdl/lib/CMakeLists.txt +++ b/gr-video-sdl/lib/CMakeLists.txt @@ -65,7 +65,7 @@ ENDIF(MSVC) add_library(gnuradio-video-sdl SHARED ${video_sdl_sources}) target_link_libraries(gnuradio-video-sdl ${video_sdl_libs}) -GR_LIBRARY_FOO(gnuradio-video-sdl RUNTIME_COMPONENT "video_sdl_runtime" DEVEL_COMPONENT "video_sdl_devel") +GR_LIBRARY_FOO(gnuradio-video-sdl) add_dependencies(gnuradio-video-sdl gnuradio-runtime) if(ENABLE_STATIC_LIBS) @@ -90,6 +90,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-video-sdl_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "video_sdl_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-video-sdl/python/video_sdl/CMakeLists.txt b/gr-video-sdl/python/video_sdl/CMakeLists.txt index 7b2f01aace..6465affa10 100644 --- a/gr-video-sdl/python/video_sdl/CMakeLists.txt +++ b/gr-video-sdl/python/video_sdl/CMakeLists.txt @@ -26,7 +26,6 @@ GR_PYTHON_INSTALL( FILES __init__.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/video_sdl - COMPONENT "video_sdl_python" ) ######################################################################## diff --git a/gr-video-sdl/swig/CMakeLists.txt b/gr-video-sdl/swig/CMakeLists.txt index 46343741a1..0d5974f21c 100644 --- a/gr-video-sdl/swig/CMakeLists.txt +++ b/gr-video-sdl/swig/CMakeLists.txt @@ -48,7 +48,6 @@ GR_SWIG_MAKE(video_sdl_swig video_sdl_swig.i) GR_SWIG_INSTALL( TARGETS video_sdl_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/video_sdl - COMPONENT "video_sdl_python" ) install( @@ -56,5 +55,4 @@ install( video_sdl_swig.i ${CMAKE_CURRENT_BINARY_DIR}/video_sdl_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "video_sdl_swig" ) diff --git a/gr-vocoder/CMakeLists.txt b/gr-vocoder/CMakeLists.txt index 37c0cf70e9..686378f2a7 100644 --- a/gr-vocoder/CMakeLists.txt +++ b/gr-vocoder/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011 Free Software Foundation, Inc. +# Copyright 2011,2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -48,45 +48,27 @@ SET(GR_PKG_VOCODER_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/vocoder) if(ENABLE_GR_VOCODER) ######################################################################## -# Setup CPack components +## CODEC2 Support ######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_VOCODER_DESCRIPTION "GNU Radio Vocoder Blocks") +find_package(Codec2) +if(LIBCODEC2_FOUND) + GR_APPEND_SUBCOMPONENT("codec2") + #message(STATUS "libcodec2 modes: ${CODEC2_MODES}") + if(LIBCODEC2_HAS_CODEC2_MODE_700) + #message(STATUS "libcodec2 has 700bps mode") + endif() + if (LIBCODEC2_HAS_FREEDV_API) + #message(STATUS "libcodec2 had FreeDV api modes: ${FREEDV_MODES}") + endif() +endif(LIBCODEC2_FOUND) -CPACK_COMPONENT("vocoder_runtime" - GROUP "Vocoder" - DISPLAY_NAME "Runtime" - DESCRIPTION "Dynamic link libraries" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("vocoder_devel" - GROUP "Vocoder" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("vocoder_python" - GROUP "Vocoder" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime" - DEPENDS "runtime_python;vocoder_runtime" -) - -CPACK_COMPONENT("vocoder_examples" - GROUP "Vocoder" - DISPLAY_NAME "Examples" - DESCRIPTION "Python examples for vocoder" - DEPENDS "vocoder_python" -) - -CPACK_COMPONENT("vocoder_swig" - GROUP "Vocoder" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;vocoder_python;vocoder_devel" -) +######################################################################## +## GSM Support +######################################################################## +find_package(GSM) +if(LIBGSM_FOUND) + GR_APPEND_SUBCOMPONENT("gsm") +endif(LIBGSM_FOUND) ######################################################################## # Add subdirectories @@ -112,7 +94,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-vocoder.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "vocoder_devel" ) endif(ENABLE_GR_VOCODER) diff --git a/gr-vocoder/examples/CMakeLists.txt b/gr-vocoder/examples/CMakeLists.txt index 769ddf602a..e5895c8d8a 100644 --- a/gr-vocoder/examples/CMakeLists.txt +++ b/gr-vocoder/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011 Free Software Foundation, Inc. +# Copyright 2011,2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -25,13 +25,24 @@ include(GrPython) GR_PYTHON_INSTALL( PROGRAMS alaw_audio_loopback.py - codec2_audio_loopback.py cvsd_audio_loopback.py g721_audio_loopback.py g723_24_audio_loopback.py g723_40_audio_loopback.py - gsm_audio_loopback.py ulaw_audio_loopback.py DESTINATION ${GR_PKG_VOCODER_EXAMPLES_DIR} - COMPONENT "vocoder_examples" ) +if(LIBCODEC2_FOUND) + GR_PYTHON_INSTALL( + PROGRAMS + codec2_audio_loopback.py + DESTINATION ${GR_PKG_VOCODER_EXAMPLES_DIR} + ) +endif(LIBCODEC2_FOUND) +if(LIBGSM_FOUND) + GR_PYTHON_INSTALL( + PROGRAMS + gsm_audio_loopback.py + DESTINATION ${GR_PKG_VOCODER_EXAMPLES_DIR} + ) +endif(LIBGSM_FOUND) diff --git a/gr-vocoder/grc/CMakeLists.txt b/gr-vocoder/grc/CMakeLists.txt index f8cf8231b2..fd320545ad 100644 --- a/gr-vocoder/grc/CMakeLists.txt +++ b/gr-vocoder/grc/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011 Free Software Foundation, Inc. +# Copyright 2011,2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -21,8 +21,6 @@ install(FILES vocoder_alaw_decode_bs.xml vocoder_alaw_encode_sb.xml vocoder_block_tree.xml - vocoder_codec2_decode_ps.xml - vocoder_codec2_encode_sp.xml vocoder_cvsd_decode_bs.xml vocoder_cvsd_decode.xml vocoder_cvsd_encode_sb.xml @@ -33,10 +31,23 @@ install(FILES vocoder_g723_24_encode_sb.xml vocoder_g723_40_decode_bs.xml vocoder_g723_40_encode_sb.xml - vocoder_gsm_fr_decode_ps.xml - vocoder_gsm_fr_encode_sp.xml vocoder_ulaw_decode_bs.xml vocoder_ulaw_encode_sb.xml DESTINATION ${GRC_BLOCKS_DIR} - COMPONENT "vocoder_python" ) + +if(LIBCODEC2_FOUND) + install(FILES + vocoder_codec2_decode_ps.xml + vocoder_codec2_encode_sp.xml + DESTINATION ${GRC_BLOCKS_DIR} + ) +endif(LIBCODEC2_FOUND) + +if(LIBGSM_FOUND) + install(FILES + vocoder_gsm_fr_decode_ps.xml + vocoder_gsm_fr_encode_sp.xml + DESTINATION ${GRC_BLOCKS_DIR} + ) +endif(LIBGSM_FOUND) diff --git a/gr-vocoder/grc/vocoder_codec2_decode_ps.xml b/gr-vocoder/grc/vocoder_codec2_decode_ps.xml index b6e10ef8ba..8448dc83df 100644 --- a/gr-vocoder/grc/vocoder_codec2_decode_ps.xml +++ b/gr-vocoder/grc/vocoder_codec2_decode_ps.xml @@ -39,11 +39,19 @@ <name>1200 bps</name> <key>codec2.MODE_1200</key> </option> + <option> + <name>700 bps</name> + <key>codec2.MODE_700</key> + </option> + <option> + <name>700B bps</name> + <key>codec2.MODE_700B</key> + </option> </param> <sink> <name>in</name> <type>byte</type> - <vlen>{ 0: 64, 1: 48, 2: 64, 3: 56, 4: 52, 5: 48 }[$mode]</vlen> + <vlen>{ 0: 64, 1: 48, 2: 64, 3: 56, 4: 52, 5: 48, 6: 28, 7: 28 }[$mode]</vlen> </sink> <source> <name>out</name> diff --git a/gr-vocoder/grc/vocoder_codec2_encode_sp.xml b/gr-vocoder/grc/vocoder_codec2_encode_sp.xml index 6af54fa586..f11ad443c6 100644 --- a/gr-vocoder/grc/vocoder_codec2_encode_sp.xml +++ b/gr-vocoder/grc/vocoder_codec2_encode_sp.xml @@ -39,6 +39,14 @@ <name>1200 bps</name> <key>codec2.MODE_1200</key> </option> + <option> + <name>700 bps</name> + <key>codec2.MODE_700</key> + </option> + <option> + <name>700B bps</name> + <key>codec2.MODE_700B</key> + </option> </param> <sink> <name>in</name> @@ -47,7 +55,7 @@ <source> <name>out</name> <type>byte</type> - <vlen>{ 0: 64, 1: 48, 2: 64, 3: 56, 4: 52, 5: 48 }[$mode]</vlen> + <vlen>{ 0: 64, 1: 48, 2: 64, 3: 56, 4: 52, 5: 48, 6: 28, 7: 28 }[$mode]</vlen> </source> </block> diff --git a/gr-vocoder/include/gnuradio/vocoder/CMakeLists.txt b/gr-vocoder/include/gnuradio/vocoder/CMakeLists.txt index 60f75e7913..172f18a730 100644 --- a/gr-vocoder/include/gnuradio/vocoder/CMakeLists.txt +++ b/gr-vocoder/include/gnuradio/vocoder/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2012,2013 Free Software Foundation, Inc. +# Copyright 2012,2013,2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -32,10 +32,22 @@ install(FILES g723_24_encode_sb.h g723_40_decode_bs.h g723_40_encode_sb.h - gsm_fr_decode_ps.h - gsm_fr_encode_sp.h ulaw_decode_bs.h ulaw_encode_sb.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/vocoder - COMPONENT "vocoder_devel" ) +if(LIBCODEC2_FOUND) +install(FILES + codec2.h + codec2_decode_ps.h + codec2_encode_sp.h + DESTINATION ${GR_INCLUDE_DIR}/gnuradio/vocoder +) +endif(LIBCODEC2_FOUND) +if(LIBGSM_FOUND) +install(FILES + gsm_fr_decode_ps.h + gsm_fr_encode_sp.h + DESTINATION ${GR_INCLUDE_DIR}/gnuradio/vocoder +) +endif(LIBGSM_FOUND) diff --git a/gr-vocoder/include/gnuradio/vocoder/codec2.h b/gr-vocoder/include/gnuradio/vocoder/codec2.h index a3c2225208..afa53d5ac0 100644 --- a/gr-vocoder/include/gnuradio/vocoder/codec2.h +++ b/gr-vocoder/include/gnuradio/vocoder/codec2.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2014 Free Software Foundation, Inc. + * Copyright 2014,2016 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -26,7 +26,7 @@ #include <gnuradio/vocoder/api.h> extern "C" { -#include "../lib/codec2/codec2.h" +#include <codec2/codec2.h> } namespace gr { @@ -42,6 +42,12 @@ namespace gr { MODE_1400 = CODEC2_MODE_1400, MODE_1300 = CODEC2_MODE_1300, MODE_1200 = CODEC2_MODE_1200, +#ifdef CODEC2_MODE_700 + MODE_700 = CODEC2_MODE_700, +#endif +#ifdef CODEC2_MODE_700B + MODE_700B = CODEC2_MODE_700B, +#endif }; private: diff --git a/gr-vocoder/lib/CMakeLists.txt b/gr-vocoder/lib/CMakeLists.txt index a347cbf7fe..5e806a2c2c 100644 --- a/gr-vocoder/lib/CMakeLists.txt +++ b/gr-vocoder/lib/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011,2013 Free Software Foundation, Inc. +# Copyright 2011,2013,2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -18,135 +18,6 @@ # Boston, MA 02110-1301, USA. ######################################################################## -# Check for system libgsm via CMake variable GR_USE_SYSTEM_LIBGSM .... -# if undefined, try to find system libgsm library, -# but if there is no system library use a local copy. -# if defined True, use system libgsm if found, otherwise do not -# use a local copy. -# if defined False, use the local copy -######################################################################## -if (NOT DEFINED GR_USE_SYSTEM_LIBGSM) - find_path(LIBGSM_INCLUDE_DIR NAMES gsm.h - PATHS - ${LIBGSM_PKG_INCLUDE_DIRS} - /usr/include/gsm - /usr/include - ) - - find_library(LIBGSM_LIBRARIES NAMES gsm - PATHS - ${LIBGSM_PKG_LIBRARY_DIRS} - /usr/lib - ) - - if(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) - set(GR_USE_SYSTEM_LIBGSM TRUE CACHE INTERNAL "System libgsm found") - message(STATUS "Found libgsm: ${LIBGSM_INCLUDE_DIR}, ${LIBGSM_LIBRARIES}") - set(GR_USE_LOCAL_LIBGSM FALSE) - set(GR_USE_SYSTEM_LIBGSM TRUE) - else(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) - set(GR_USE_SYSTEM_LIBGSM FALSE CACHE INTERNAL "System libgsm found") - message(STATUS "System libgsm not found.") - set(GR_USE_LOCAL_LIBGSM TRUE) - endif(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) -else (NOT DEFINED GR_USE_SYSTEM_LIBGSM) - if (GR_USE_SYSTEM_LIBGSM) - find_path(LIBGSM_INCLUDE_DIR NAMES gsm.h - PATHS - ${LIBGSM_PKG_INCLUDE_DIRS} - /usr/include/gsm - /usr/include - ) - - find_library(LIBGSM_LIBRARIES NAMES gsm - PATHS - ${LIBGSM_PKG_LIBRARY_DIRS} - /usr/lib - ) - - if(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) - set(GR_USE_SYSTEM_LIBGSM TRUE CACHE INTERNAL "System libgsm found") - message(STATUS "Found libgsm: ${LIBGSM_INCLUDE_DIR}, ${LIBGSM_LIBRARIES}") - set(GR_USE_LOCAL_LIBGSM FALSE) - else(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) - set(GR_USE_SYSTEM_LIBGSM FALSE CACHE INTERNAL "System libgsm found") - message(STATUS "System libgsm not found.") - set(GR_USE_LOCAL_LIBGSM FALSE) - endif(LIBGSM_INCLUDE_DIR AND LIBGSM_LIBRARIES) - else (GR_USE_SYSTEM_LIBGSM) - set(GR_USE_LOCAL_LIBGSM TRUE) - message(STATUS "Using gnuradio local copy of libgsm.") - endif (GR_USE_SYSTEM_LIBGSM) -endif (NOT DEFINED GR_USE_SYSTEM_LIBGSM) - -mark_as_advanced(LIBGSM_INCLUDE_DIR LIBGSM_LIBRARIES) - -######################################################################## -# Check for system libcodec2 via CMake variable GR_USE_SYSTEM_LIBCODEC2 -# if undefined, try to find system libgsm library, -# but if there is no system library use a local copy. -# if defined True, use system libcodec2 if found, otherwise do not -# use a local copy. -# if defined False, use the local copy -######################################################################## -if (NOT DEFINED GR_USE_SYSTEM_LIBCODEC2) - find_path(LIBCODEC2_INCLUDE_DIR NAMES codec2.h - PATHS - ${LIBCODEC2_PKG_INCLUDE_DIRS} - /usr/include/codec2 - /usr/include - ) - - find_library(LIBCODEC2_LIBRARIES NAMES codec2 - PATHS - ${LIBCODEC2_PKG_LIBRARY_DIRS} - /usr/lib - ) - - if(LIBCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) - set(GR_USE_SYSTEM_LIBCODEC2 TRUE CACHE INTERNAL "System libcodec2 found") - message(STATUS "Found libcodec2: ${LIBCODEC2_INCLUDE_DIR}, ${LIBCODEC2_LIBRARIES}") - set(GR_USE_LOCAL_LIBCODEC2 FALSE) - set(GR_USE_SYSTEM_LIBCODEC2 TRUE) - else(LIBCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) - set(GR_USE_SYSTEM_LIBCODEC2 FALSE CACHE INTERNAL "System libcodec2 found") - message(STATUS "System libcodec2 not found.") - set(GR_USE_LOCAL_LIBCODEC2 TRUE) - endif(LIBCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) -else (NOT DEFINED GR_USE_SYSTEM_LIBCODEC2) - if (GR_USE_SYSTEM_LIBCODEC2) - find_path(LIBCODEC2_INCLUDE_DIR NAMES codec2.h - PATHS - ${LIBCODEC2_PKG_INCLUDE_DIRS} - /usr/include/codec2 - /usr/include - ) - - find_library(LIBCODEC2_LIBRARIES NAMES codec2 - PATHS - ${LIBGSM_PKG_LIBRARY_DIRS} - /usr/lib - ) - - if(LIBCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) - set(GR_USE_SYSTEM_LIBCODEC2 TRUE CACHE INTERNAL "System libcodec2 found") - message(STATUS "Found libgsm: ${LIBCODEC2_INCLUDE_DIR}, ${LIBCODEC2_LIBRARIES}") - set(GR_USE_LOCAL_LIBCODEC2 FALSE) - else(LIBGCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) - set(GR_USE_SYSTEM_LIBCODEC2 FALSE CACHE INTERNAL "System libcodec2 found") - message(STATUS "System libcodec2 not found.") - set(GR_USE_LOCAL_LIBCODEC2 FALSE) - endif(LIBCODEC2_INCLUDE_DIR AND LIBCODEC2_LIBRARIES) - else (GR_USE_SYSTEM_LIBCODEC2) - set(GR_USE_LOCAL_LIBCODEC2 TRUE) - message(STATUS "Using gnuradio local copy of libcodec2.") - endif (GR_USE_SYSTEM_LIBCODEC2) -endif (NOT DEFINED GR_USE_SYSTEM_LIBCODEC2) - -mark_as_advanced(LIBCODEC2_INCLUDE_DIR LIBCODEC2_LIBRARIES) - - -######################################################################## # Setup the include and linker paths ######################################################################## include_directories( @@ -172,9 +43,6 @@ link_directories(${LOG4CPP_LIBRARY_DIRS}) list(APPEND gr_vocoder_sources alaw_decode_bs_impl.cc alaw_encode_sb_impl.cc - codec2.cc - codec2_decode_ps_impl.cc - codec2_encode_sp_impl.cc cvsd_decode_bs_impl.cc cvsd_encode_sb_impl.cc g721_decode_bs_impl.cc @@ -183,11 +51,22 @@ list(APPEND gr_vocoder_sources g723_24_encode_sb_impl.cc g723_40_decode_bs_impl.cc g723_40_encode_sb_impl.cc - gsm_fr_decode_ps_impl.cc - gsm_fr_encode_sp_impl.cc ulaw_decode_bs_impl.cc ulaw_encode_sb_impl.cc ) +if(LIBCODEC2_FOUND) + list(APPEND gr_vocoder_sources + codec2.cc + codec2_decode_ps_impl.cc + codec2_encode_sp_impl.cc + ) +endif(LIBCODEC2_FOUND) +if(LIBGSM_FOUND) + list(APPEND gr_vocoder_sources + gsm_fr_decode_ps_impl.cc + gsm_fr_encode_sp_impl.cc + ) +endif(LIBGSM_FOUND) #Add Windows DLL resource file if using MSVC if(MSVC) @@ -208,31 +87,23 @@ endif(MSVC) ######################################################################## GR_INCLUDE_SUBDIRECTORY(g7xx) -if(GR_USE_LOCAL_LIBCODEC2) - GR_INCLUDE_SUBDIRECTORY(codec2) -endif(GR_USE_LOCAL_LIBCODEC2) - -if(GR_USE_LOCAL_LIBGSM) - GR_INCLUDE_SUBDIRECTORY(gsm) -endif(GR_USE_LOCAL_LIBGSM) - list(APPEND vocoder_libs gnuradio-runtime ${Boost_LIBRARIES} ${LOG4CPP_LIBRARIES} ) -if(GR_USE_SYSTEM_LIBCODEC2) +if(LIBCODEC2_LIBRARIES) list(APPEND vocoder_libs ${LIBCODEC2_LIBRARIES}) -endif(GR_USE_SYSTEM_LIBCODEC2) +endif(LIBCODEC2_LIBRARIES) -if(GR_USE_SYSTEM_LIBGSM) +if(LIBGSM_LIBRARIES) list(APPEND vocoder_libs ${LIBGSM_LIBRARIES}) -endif(GR_USE_SYSTEM_LIBGSM) +endif(LIBGSM_LIBRARIES) add_library(gnuradio-vocoder SHARED ${gr_vocoder_sources}) target_link_libraries(gnuradio-vocoder ${vocoder_libs}) -GR_LIBRARY_FOO(gnuradio-vocoder RUNTIME_COMPONENT "vocoder_runtime" DEVEL_COMPONENT "vocoder_devel") +GR_LIBRARY_FOO(gnuradio-vocoder) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -254,6 +125,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-vocoder_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "vocoder_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-vocoder/lib/codec2/CMakeLists.txt b/gr-vocoder/lib/codec2/CMakeLists.txt deleted file mode 100644 index ac25b7cce7..0000000000 --- a/gr-vocoder/lib/codec2/CMakeLists.txt +++ /dev/null @@ -1,201 +0,0 @@ -# Copyright 2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# 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. - -######################################################################## -# Create executable to generate other sources -# http://www.vtk.org/Wiki/CMake_Cross_Compiling#Using_executables_in_the_build_created_during_the_build -######################################################################## -if(NOT CMAKE_CROSSCOMPILING) - include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}) - add_executable(generate_codebook ${CMAKE_CURRENT_SOURCE_DIR}/generate_codebook.c) - target_link_libraries(generate_codebook -lm) - export(TARGETS generate_codebook APPEND FILE ${EXPORT_FILE}) -endif() - -######################################################################## -# Create codebook -######################################################################## -set(CODEBOOKS - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp1.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp2.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp3.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp4.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp5.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp6.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp7.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp8.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp9.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp10.txt -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebook.c - DEPENDS generate_codebook ${CODEBOOKS} - COMMAND generate_codebook lsp_cb ${CODEBOOKS} > ${CMAKE_CURRENT_BINARY_DIR}/codebook.c -) - -######################################################################## -# Create codebookd -######################################################################## -set(CODEBOOKSD - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp1.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp2.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp3.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp4.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp5.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp6.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp7.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp8.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp9.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/dlsp10.txt -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c - DEPENDS generate_codebook ${CODEBOOKSD} - COMMAND generate_codebook lsp_cbd ${CODEBOOKSD} > ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c -) - -######################################################################## -# Create codebookvq -######################################################################## -set(CODEBOOKSVQ - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp1.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp2.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp3.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp4.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp45678910.txt -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookvq.c - DEPENDS generate_codebook ${CODEBOOKSVQ} - COMMAND generate_codebook lsp_cbvq ${CODEBOOKSVQ} > ${CMAKE_CURRENT_BINARY_DIR}/codebookvq.c -) - -######################################################################## -# Create codebookjnd -######################################################################## -set(CODEBOOKSJND - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp1.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp2.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp3.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lsp4.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspjnd5-10.txt -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookjnd.c - DEPENDS generate_codebook ${CODEBOOKSJND} - COMMAND generate_codebook lsp_cbjnd ${CODEBOOKSJND} > ${CMAKE_CURRENT_BINARY_DIR}/codebookjnd.c -) - -######################################################################## -# Create codebookjvm -######################################################################## -set(CODEBOOKSJVM - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspjvm1.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspjvm2.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspjvm3.txt -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookjvm.c - DEPENDS generate_codebook ${CODEBOOKSJVM} - COMMAND generate_codebook lsp_cbjvm ${CODEBOOKSJVM} > ${CMAKE_CURRENT_BINARY_DIR}/codebookjvm.c -) - -######################################################################## -# Create codebookvqanssi -######################################################################## -set(CODEBOOKSVQANSSI - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspvqanssi1.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspvqanssi2.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspvqanssi3.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspvqanssi4.txt -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookvqanssi.c - DEPENDS generate_codebook ${CODEBOOKSVQANSSI} - COMMAND generate_codebook lsp_cbvqanssi ${CODEBOOKSVQANSSI} > ${CMAKE_CURRENT_BINARY_DIR}/codebookvqanssi.c -) - -######################################################################## -# Create codebookdt -######################################################################## -set(CODEBOOKSDT - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt1.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt2.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt3.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt4.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt5.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt6.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt7.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt8.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt9.txt - ${CMAKE_CURRENT_SOURCE_DIR}/codebook/lspdt10.txt -) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookdt.c - DEPENDS generate_codebook ${CODEBOOKSDT} - COMMAND generate_codebook lsp_cbdt ${CODEBOOKSDT} > ${CMAKE_CURRENT_BINARY_DIR}/codebookdt.c -) - -######################################################################## -# Create codebookge -######################################################################## -set(CODEBOOKSGE ${CMAKE_CURRENT_SOURCE_DIR}/codebook/gecb.txt) - -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c - DEPENDS generate_codebook ${CODEBOOKSGE} - COMMAND generate_codebook ge_cb ${CODEBOOKSGE} > ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c -) - -######################################################################## -# Append all sources in this dir -######################################################################## -list(APPEND gr_vocoder_sources - ${CMAKE_CURRENT_BINARY_DIR}/codebook.c - ${CMAKE_CURRENT_BINARY_DIR}/codebookd.c - ${CMAKE_CURRENT_BINARY_DIR}/codebookvq.c - ${CMAKE_CURRENT_BINARY_DIR}/codebookjnd.c - ${CMAKE_CURRENT_BINARY_DIR}/codebookjvm.c - ${CMAKE_CURRENT_BINARY_DIR}/codebookvqanssi.c - ${CMAKE_CURRENT_BINARY_DIR}/codebookdt.c - ${CMAKE_CURRENT_BINARY_DIR}/codebookge.c - - - ${CMAKE_CURRENT_SOURCE_DIR}/dump.c - ${CMAKE_CURRENT_SOURCE_DIR}/lpc.c - ${CMAKE_CURRENT_SOURCE_DIR}/nlp.c - ${CMAKE_CURRENT_SOURCE_DIR}/postfilter.c - ${CMAKE_CURRENT_SOURCE_DIR}/sine.c - ${CMAKE_CURRENT_SOURCE_DIR}/codec2.c - ${CMAKE_CURRENT_SOURCE_DIR}/fifo.c - ${CMAKE_CURRENT_SOURCE_DIR}/fdmdv.c - ${CMAKE_CURRENT_SOURCE_DIR}/kiss_fft.c - ${CMAKE_CURRENT_SOURCE_DIR}/interp.c - ${CMAKE_CURRENT_SOURCE_DIR}/lsp.c - ${CMAKE_CURRENT_SOURCE_DIR}/phase.c - ${CMAKE_CURRENT_SOURCE_DIR}/quantise.c - ${CMAKE_CURRENT_SOURCE_DIR}/pack.c -) diff --git a/gr-vocoder/lib/codec2/_kiss_fft_guts.h b/gr-vocoder/lib/codec2/_kiss_fft_guts.h deleted file mode 100644 index f008a7b500..0000000000 --- a/gr-vocoder/lib/codec2/_kiss_fft_guts.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -Copyright (c) 2003-2010, Mark Borgerding - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* kiss_fft.h - defines kiss_fft_scalar as either short or a float type - and defines - typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ -#include "kiss_fft.h" -#include <limits.h> - -#define MAXFACTORS 32 -/* e.g. an fft of length 128 has 4 factors - as far as kissfft is concerned - 4*4*4*2 - */ - -struct kiss_fft_state{ - int nfft; - int inverse; - int factors[2*MAXFACTORS]; - kiss_fft_cpx twiddles[1]; -}; - -/* - Explanation of macros dealing with complex math: - - C_MUL(m,a,b) : m = a*b - C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise - C_SUB( res, a,b) : res = a - b - C_SUBFROM( res , a) : res -= a - C_ADDTO( res , a) : res += a - * */ -#ifdef FIXED_POINT -#if (FIXED_POINT==32) -# define FRACBITS 31 -# define SAMPPROD int64_t -#define SAMP_MAX 2147483647 -#else -# define FRACBITS 15 -# define SAMPPROD int32_t -#define SAMP_MAX 32767 -#endif - -#define SAMP_MIN -SAMP_MAX - -#if defined(CHECK_OVERFLOW) -# define CHECK_OVERFLOW_OP(a,op,b) \ - if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ - fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } -#endif - - -# define smul(a,b) ( (SAMPPROD)(a)*(b) ) -# define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) - -# define S_MUL(a,b) sround( smul(a,b) ) - -# define C_MUL(m,a,b) \ - do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ - (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) - -# define DIVSCALAR(x,k) \ - (x) = sround( smul( x, SAMP_MAX/k ) ) - -# define C_FIXDIV(c,div) \ - do { DIVSCALAR( (c).r , div); \ - DIVSCALAR( (c).i , div); }while (0) - -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r = sround( smul( (c).r , s ) ) ;\ - (c).i = sround( smul( (c).i , s ) ) ; }while(0) - -#else /* not FIXED_POINT*/ - -# define S_MUL(a,b) ( (a)*(b) ) -#define C_MUL(m,a,b) \ - do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ - (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) -# define C_FIXDIV(c,div) /* NOOP */ -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r *= (s);\ - (c).i *= (s); }while(0) -#endif - -#ifndef CHECK_OVERFLOW_OP -# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ -#endif - -#define C_ADD( res, a,b)\ - do { \ - CHECK_OVERFLOW_OP((a).r,+,(b).r)\ - CHECK_OVERFLOW_OP((a).i,+,(b).i)\ - (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ - }while(0) -#define C_SUB( res, a,b)\ - do { \ - CHECK_OVERFLOW_OP((a).r,-,(b).r)\ - CHECK_OVERFLOW_OP((a).i,-,(b).i)\ - (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ - }while(0) -#define C_ADDTO( res , a)\ - do { \ - CHECK_OVERFLOW_OP((res).r,+,(a).r)\ - CHECK_OVERFLOW_OP((res).i,+,(a).i)\ - (res).r += (a).r; (res).i += (a).i;\ - }while(0) - -#define C_SUBFROM( res , a)\ - do {\ - CHECK_OVERFLOW_OP((res).r,-,(a).r)\ - CHECK_OVERFLOW_OP((res).i,-,(a).i)\ - (res).r -= (a).r; (res).i -= (a).i; \ - }while(0) - - -#ifdef FIXED_POINT -# define KISS_FFT_COS(phase) floor(.5+SAMP_MAX * cos (phase)) -# define KISS_FFT_SIN(phase) floor(.5+SAMP_MAX * sin (phase)) -# define HALF_OF(x) ((x)>>1) -#elif defined(USE_SIMD) -# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) -# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) -# define HALF_OF(x) ((x)*_mm_set1_ps(.5)) -#else -# define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) -# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) -# define HALF_OF(x) ((x)*.5) -#endif - -#define kf_cexp(x,phase) \ - do{ \ - (x)->r = KISS_FFT_COS(phase);\ - (x)->i = KISS_FFT_SIN(phase);\ - }while(0) - - -/* a debugging function */ -#define pcpx(c)\ - fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) - - -#ifdef KISS_FFT_USE_ALLOCA -// define this to allow use of alloca instead of malloc for temporary buffers -// Temporary buffers are used in two case: -// 1. FFT sizes that have "bad" factors. i.e. not 2,3 and 5 -// 2. "in-place" FFTs. Notice the quotes, since kissfft does not really do an in-place transform. -#include <alloca.h> -#define KISS_FFT_TMP_ALLOC(nbytes) alloca(nbytes) -#define KISS_FFT_TMP_FREE(ptr) -#else -#define KISS_FFT_TMP_ALLOC(nbytes) KISS_FFT_MALLOC(nbytes) -#define KISS_FFT_TMP_FREE(ptr) KISS_FFT_FREE(ptr) -#endif diff --git a/gr-vocoder/lib/codec2/ampexp.c b/gr-vocoder/lib/codec2/ampexp.c deleted file mode 100644 index ccec6dce8e..0000000000 --- a/gr-vocoder/lib/codec2/ampexp.c +++ /dev/null @@ -1,1093 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: ampexp.c - AUTHOR......: David Rowe - DATE CREATED: 7 August 2012 - - Functions for experimenting with amplitude quantisation. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not,see <http://www.gnu.org/licenses/>. -*/ - - -#include <assert.h> -#include <ctype.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "ampexp.h" - - -#define PRED_COEFF 0.9 - -/* states for amplitude experiments */ - -struct codebook { - unsigned int k; - unsigned int log2m; - unsigned int m; - float *cb; - unsigned int offset; -}; - -struct AEXP { - float A_prev[MAX_AMP]; - int frames; - float snr; - int snr_n; - float var; - int var_n; - float vq_var; - int vq_var_n; - struct codebook *vq1,*vq2,*vq3,*vq4,*vq5; - - int indexes[5][3]; - MODEL model[3]; - float mag[3]; - MODEL model_uq[3]; -}; - - -/*---------------------------------------------------------------------------*\ - - Bruce Perens' funcs to load codebook files - -\*---------------------------------------------------------------------------*/ - - -static const char format[] = -"The table format must be:\n" -"\tTwo integers describing the dimensions of the codebook.\n" -"\tThen, enough numbers to fill the specified dimensions.\n"; - -static float get_float(FILE * in, const char * name, char * * cursor, char * buffer, int size) -{ - for ( ; ; ) { - char * s = *cursor; - char c; - - while ( (c = *s) != '\0' && !isdigit(c) && c != '-' && c != '.' ) - s++; - - /* Comments start with "#" and continue to the end of the line. */ - if ( c != '\0' && c != '#' ) { - char * end = 0; - float f = 0; - - f = strtod(s, &end); - - if ( end != s ) - *cursor = end; - return f; - } - - if ( fgets(buffer, size, in) == NULL ) { - fprintf(stderr, "%s: Format error. %s\n", name, format); - exit(1); - } - *cursor = buffer; - } -} - -static struct codebook *load(const char * name) -{ - FILE *file; - char line[2048]; - char *cursor = line; - struct codebook *b = malloc(sizeof(struct codebook)); - int i; - int size; - - file = fopen(name, "rt"); - assert(file != NULL); - - *cursor = '\0'; - - b->k = (int)get_float(file, name, &cursor, line, sizeof(line)); - b->m = (int)get_float(file, name ,&cursor, line, sizeof(line)); - size = b->k * b->m; - - b->cb = (float *)malloc(size * sizeof(float)); - - for ( i = 0; i < size; i++ ) { - b->cb[i] = get_float(file, name, &cursor, line, sizeof(line)); - } - - fclose(file); - - return b; -} - - -/*---------------------------------------------------------------------------* \ - - amp_experiment_create() - - Inits states for amplitude quantisation experiments. - -\*---------------------------------------------------------------------------*/ - -struct AEXP *amp_experiment_create() { - struct AEXP *aexp; - int i,j,m; - - aexp = (struct AEXP *)malloc(sizeof(struct AEXP)); - assert (aexp != NULL); - - for(i=0; i<MAX_AMP; i++) - aexp->A_prev[i] = 1.0; - aexp->frames = 0; - aexp->snr = 0.0; - aexp->snr_n = 0; - aexp->var = 0.0; - aexp->var_n = 0; - aexp->vq_var = 0.0; - aexp->vq_var_n = 0; - - //aexp->vq1 = load("amp_1_80_1024a.txt"); - //aexp->vq1 = load("../unittest/st1_10_1024.txt"); - //aexp->vq1 = load("../unittest/amp41_80_1024.txt"); - //aexp->vq1->offset = 40; - aexp->vq1 = load("../unittest/amp1_10_1024.txt"); - aexp->vq1->offset = 0; - aexp->vq2 = load("../unittest/amp11_20_1024.txt"); - aexp->vq2->offset = 10; - - aexp->vq3 = load("../unittest/amp21_40_1024.txt"); - aexp->vq3->offset = 20; - aexp->vq4 = load("../unittest/amp41_60_1024.txt"); - aexp->vq4->offset = 40; - aexp->vq5 = load("../unittest/amp61_80_256.txt"); - aexp->vq5->offset = 60; - - #ifdef CAND2_GS - //aexp->vq1 = load("../unittest/t1_amp1_20_1024.txt"); - //aexp->vq1 = load("../unittest/t2_amp1_20_1024.txt"); - aexp->vq1 = load("../unittest/amp1_20_1024.txt"); - aexp->vq1->offset = 0; - aexp->vq2 = load("../unittest/amp21_40_1024.txt"); - aexp->vq2->offset = 20; - aexp->vq3 = load("../unittest/amp41_60_1024.txt"); - aexp->vq3->offset = 40; - aexp->vq4 = load("../unittest/amp61_80_32.txt"); - aexp->vq4->offset = 60; - #endif - - //#define CAND2_GS - #ifdef CAND2_GS - aexp->vq1 = load("../unittest/amp1_20_1024.txt"); - aexp->vq2 = load("../unittest/amp21_40_1024.txt"); - aexp->vq3 = load("../unittest/amp41_80_1024.txt"); - aexp->vq4 = load("../unittest/amp61_80_32.txt"); - aexp->vq1->offset = 0; - aexp->vq2->offset = 20; - aexp->vq3->offset = 40; - aexp->vq4->offset = 60; - #endif - - //#define CAND1 - #ifdef CAND1 - aexp->vq1 = load("../unittest/amp1_10_128.txt"); - aexp->vq2 = load("../unittest/amp11_20_512.txt"); - aexp->vq3 = load("../unittest/amp21_40_1024.txt"); - aexp->vq4 = load("../unittest/amp41_60_1024.txt"); - aexp->vq5 = load("../unittest/amp61_80_32.txt"); - aexp->vq1->offset = 0; - aexp->vq2->offset = 10; - aexp->vq3->offset = 20; - aexp->vq4->offset = 40; - aexp->vq5->offset = 60; - #endif - - for(i=0; i<3; i++) { - for(j=0; j<5; j++) - aexp->indexes[j][i] = 0; - aexp->mag[i] = 1.0; - aexp->model[i].Wo = TWO_PI*100.0/8000.0; - aexp->model[i].L = floor(PI/aexp->model[i].Wo); - for(m=1; m<=MAX_AMP; m++) - aexp->model[i].A[m] = 10.0; - aexp->model_uq[i] = aexp->model[i]; - } - - return aexp; -} - - -/*---------------------------------------------------------------------------* \ - - amp_experiment_destroy() - -\*---------------------------------------------------------------------------*/ - -void amp_experiment_destroy(struct AEXP *aexp) { - assert(aexp != NULL); - if (aexp->snr != 0.0) - printf("snr: %4.2f dB\n", aexp->snr/aexp->snr_n); - if (aexp->var != 0.0) - printf("var...: %4.3f std dev...: %4.3f (%d amplitude samples)\n", - aexp->var/aexp->var_n, sqrt(aexp->var/aexp->var_n), aexp->var_n); - if (aexp->vq_var != 0.0) - printf("vq var: %4.3f std dev...: %4.3f (%d amplitude samples)\n", - aexp->vq_var/aexp->vq_var_n, sqrt(aexp->vq_var/aexp->vq_var_n), aexp->vq_var_n); - free(aexp); -} - - -/*---------------------------------------------------------------------------*\ - - Various test and experimental functions ................ - -\*---------------------------------------------------------------------------*/ - -/* - Quantisation noise simulation. Assume noise on amplitudes is a uniform - distribution, of +/- x dB. This means x = sqrt(3)*sigma. - - Note: for uniform distribution var = = sigma * sigma = (b-a)*(b-a)/12. -*/ - -static void add_quant_noise(struct AEXP *aexp, MODEL *model, int start, int end, float sigma_dB) -{ - int m; - float x_dB; - float noise_sam_dB; - float noise_sam_lin; - - x_dB = sqrt(3.0) * sigma_dB; - - for(m=start; m<=end; m++) { - noise_sam_dB = x_dB*(1.0 - 2.0*rand()/RAND_MAX); - //printf("%f\n", noise_sam_dB); - noise_sam_lin = pow(10.0, noise_sam_dB/20.0); - model->A[m] *= noise_sam_lin; - aexp->var += noise_sam_dB*noise_sam_dB; - aexp->var_n++; - } - -} - -/* - void print_sparse_pred_error() - - use to check pred error stats (e.g. of first 1kHz) in Octave: - - $ ./c2sim ../raw/hts1a.raw --ampexp > amppe.txt - - octave> load ../src/amppe.txt - octave> std(nonzeros(amppe(:,1:20))) - octave> hist(nonzeros(amppe(:,1:20)),20); - - */ - - -static void print_sparse_pred_error(struct AEXP *aexp, MODEL *model, float mag_thresh) -{ - int m, index; - float mag, error; - float sparse_pe[MAX_AMP]; - - mag = 0.0; - for(m=1; m<=model->L; m++) - mag += model->A[m]*model->A[m]; - mag = 10*log10(mag/model->L); - - if (mag > mag_thresh) { - for(m=0; m<MAX_AMP; m++) { - sparse_pe[m] = 0.0; - } - - for(m=1; m<=model->L; m++) { - assert(model->A[m] > 0.0); - error = PRED_COEFF*20.0*log10(aexp->A_prev[m]) - 20.0*log10(model->A[m]); - //error = 20.0*log10(model->A[m]) - mag; - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe[index] = error; - } - - /* dump sparse amp vector */ - - for(m=0; m<MAX_AMP; m++) - printf("%f ", sparse_pe[m]); - printf("\n"); - } -} - - -static float frame_energy(MODEL *model, float *enormdB) { - int m; - float e, edB; - - e = 0.0; - for(m=1; m<=model->L; m++) - e += model->A[m]*model->A[m]; - edB = 10*log10(e); - - #define VER_E0 - - #ifdef VER_E0 - *enormdB = 10*log10(e/model->L); /* make high and low pitches have similar amps */ - #endif - - #ifdef VER_E1 - e = 0.0; - for(m=1; m<=model->L; m++) - e += 10*log10(model->A[m]*model->A[m]); - *enormdB = e; - #endif - - #ifdef VER_E2 - e = 0.0; - for(m=1; m<=model->L; m++) - e += 10*log10(model->A[m]*model->A[m]); - *enormdB = e/model->L; - #endif - //printf("%f\n", enormdB); - - return edB; -} - -static void print_sparse_amp_error(struct AEXP *aexp, MODEL *model, float edB_thresh) -{ - int m, index; - float edB, enormdB, error, dWo; - float sparse_pe[MAX_AMP]; - - edB = frame_energy(model, &enormdB); - //printf("%f\n", enormdB); - dWo = fabs((aexp->model_uq[2].Wo - aexp->model_uq[1].Wo)/aexp->model_uq[2].Wo); - - if ((edB > edB_thresh) && (dWo < 0.1)) { - for(m=0; m<MAX_AMP; m++) { - sparse_pe[m] = 0.0; - } - - for(m=1; m<=model->L; m++) { - assert(model->A[m] > 0.0); - error = 20.0*log10(model->A[m]) - enormdB; - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe[index] = error; - } - - /* dump sparse amp vector */ - - for(m=0; m<MAX_AMP; m++) - printf("%f ", sparse_pe[m]); - printf("\n"); - } -} - - -int vq_amp(float cb[], float vec[], float weights[], int d, int e, float *se) -{ - float error; /* current error */ - int besti; /* best index so far */ - float best_error; /* best error so far */ - int i,j; - float diff, metric, best_metric; - - besti = 0; - best_metric = best_error = 1E32; - for(j=0; j<e; j++) { - metric = error = 0.0; - for(i=0; i<d; i++) { - if (vec[i] != 0.0) { - diff = (cb[j*d+i] - vec[i]); - error += diff*diff; - metric += weights[i]*diff*diff; - } - } - if (metric < best_metric) { - best_error = error; - best_metric = metric; - besti = j; - } - } - - *se += best_error; - - return(besti); -} - - -static int split_vq(float sparse_pe_out[], struct AEXP *aexp, struct codebook *vq, float weights[], float sparse_pe_in[]) -{ - int i, j, non_zero, vq_ind; - float se; - - vq_ind = vq_amp(vq->cb, &sparse_pe_in[vq->offset], &weights[vq->offset], vq->k, vq->m, &se); - printf("\n offset %d k %d m %d vq_ind %d j: ", vq->offset, vq->k, vq->m, vq_ind); - - non_zero = 0; - for(i=0, j=vq->offset; i<vq->k; i++,j++) { - if (sparse_pe_in[j] != 0.0) { - printf("%d ", j); - sparse_pe_in[j] -= vq->cb[vq->k * vq_ind + i]; - sparse_pe_out[j] += vq->cb[vq->k * vq_ind + i]; - non_zero++; - } - } - aexp->vq_var_n += non_zero; - return vq_ind; -} - - -static void sparse_vq_pred_error(struct AEXP *aexp, - MODEL *model -) -{ - int m, index; - float error, amp_dB, edB, enormdB; - float sparse_pe_in[MAX_AMP]; - float sparse_pe_out[MAX_AMP]; - float weights[MAX_AMP]; - - edB = frame_energy(model, &enormdB); - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_in[m] = 0.0; - sparse_pe_out[m] = 0.0; - } - - for(m=1; m<=model->L; m++) { - assert(model->A[m] > 0.0); - error = PRED_COEFF*20.0*log10(aexp->A_prev[m]) - 20.0*log10(model->A[m]); - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe_in[index] = error; - weights[index] = model->A[m]; - } - - /* vector quantise */ - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_out[m] = sparse_pe_in[m]; - } - - //#define SIM_VQ - #ifndef SIM_VQ - split_vq(sparse_pe_out, aexp, aexp->vq1, weights, sparse_pe_in); - #else - for(m=aexp->vq->offset; m<aexp->vq->offset+aexp->vq->k; m++) { - if (sparse_pe_in[m] != 0.0) { - float error = 8*(1.0 - 2.0*rand()/RAND_MAX); - aexp->vq_var += error*error; - aexp->vq_var_n++; - sparse_pe_out[m] = sparse_pe_in[m] + error; - } - } - #endif - - if (edB > -100.0) - for(m=0; m<MAX_AMP; m++) { - if (sparse_pe_in[m] != 0.0) - aexp->vq_var += pow(sparse_pe_out[m] - sparse_pe_in[m], 2.0); - } - - /* transform quantised amps back */ - - for(m=1; m<=model->L; m++) { - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - amp_dB = PRED_COEFF*20.0*log10(aexp->A_prev[m]) - sparse_pe_out[index]; - //printf("in: %f out: %f\n", sparse_pe_in[index], sparse_pe_out[index]); - //printf("amp_dB: %f A[m] (dB) %f\n", amp_dB, 20.0*log10(model->A[m])); - model->A[m] = pow(10.0, amp_dB/20.0); - } - //exit(0); -} - - -static void split_error(struct AEXP *aexp, struct codebook *vq, float sparse_pe_in[], int ind) -{ - int i, j; - - for(i=0, j=vq->offset; i<vq->k; i++,j++) { - if (sparse_pe_in[j] != 0.0) { - sparse_pe_in[j] -= vq->cb[vq->k * ind + i]; - } - } -} - - -static void sparse_vq_amp(struct AEXP *aexp, MODEL *model) -{ - int m, index; - float error, amp_dB, enormdB; - float sparse_pe_in[MAX_AMP]; - float sparse_pe_out[MAX_AMP]; - float weights[MAX_AMP]; - - frame_energy(model, &enormdB); - - aexp->mag[2] = enormdB; - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_in[m] = 0.0; - sparse_pe_out[m] = 0.0; - } - - for(m=1; m<=model->L; m++) { - assert(model->A[m] > 0.0); - error = 20.0*log10(model->A[m]) - enormdB; - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe_in[index] = error; - weights[index] = pow(model->A[m],0.8); - } - - /* vector quantise */ - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_out[m] = sparse_pe_in[m]; - } - - for(m=0; m<80; m++) - sparse_pe_out[m] = 0; - - #define SPLIT - #ifdef SPLIT - aexp->indexes[0][2] = split_vq(sparse_pe_out, aexp, aexp->vq1, weights, sparse_pe_in); - - aexp->indexes[1][2] = split_vq(sparse_pe_out, aexp, aexp->vq2, weights, sparse_pe_in); - aexp->indexes[2][2] = split_vq(sparse_pe_out, aexp, aexp->vq3, weights, sparse_pe_in); - aexp->indexes[3][2] = split_vq(sparse_pe_out, aexp, aexp->vq4, weights, sparse_pe_in); - aexp->indexes[4][2] = split_vq(sparse_pe_out, aexp, aexp->vq5, weights, sparse_pe_in); - #endif - //#define MULTISTAGE - #ifdef MULTISTAGE - aexp->indexes[0][2] = split_vq(sparse_pe_out, aexp, aexp->vq1, weights, sparse_pe_in); - aexp->indexes[1][2] = split_vq(sparse_pe_out, aexp, aexp->vq2, weights, sparse_pe_in); - aexp->indexes[2][2] = split_vq(sparse_pe_out, aexp, aexp->vq3, weights, sparse_pe_in); - //aexp->indexes[3][2] = split_vq(sparse_pe_out, aexp, aexp->vq4, weights, sparse_pe_in); - #endif - - for(m=0; m<MAX_AMP; m++) { - if (sparse_pe_in[m] != 0.0) - aexp->vq_var += pow(sparse_pe_out[m] - sparse_pe_in[m], 2.0); - } - - /* transform quantised amps back */ - - for(m=1; m<=model->L; m++) { - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - amp_dB = sparse_pe_out[index] + enormdB; - model->A[m] = pow(10.0, amp_dB/20.0); - } - //exit(0); -} - - -static void update_snr_calc(struct AEXP *aexp, MODEL *m1, MODEL *m2) -{ - int m; - float signal, noise, signal_dB; - - assert(m1->L == m2->L); - - signal = 0.0; noise = 1E-32; - for(m=1; m<=m1->L; m++) { - signal += m1->A[m]*m1->A[m]; - noise += pow(m1->A[m] - m2->A[m], 2.0); - //printf("%f %f\n", before[m], model->phi[m]); - } - signal_dB = 10*log10(signal); - if (signal_dB > -100.0) { - aexp->snr += 10.0*log10(signal/noise); - aexp->snr_n++; - } -} - - -/* gain/shape vq search. Returns index of best gain. Gain is additive (as we use log quantisers) */ - -int gain_shape_vq_amp(float cb[], float vec[], float weights[], int d, int e, float *se, float *best_gain) -{ - float error; /* current error */ - int besti; /* best index so far */ - float best_error; /* best error so far */ - int i,j,m; - float diff, metric, best_metric, gain, sumAm, sumCb; - - besti = 0; - best_metric = best_error = 1E32; - for(j=0; j<e; j++) { - - /* compute optimum gain */ - - sumAm = sumCb = 0.0; - m = 0; - for(i=0; i<d; i++) { - if (vec[i] != 0.0) { - m++; - sumAm += vec[i]; - sumCb += cb[j*d+i]; - } - } - gain = (sumAm - sumCb)/m; - - /* compute error */ - - metric = error = 0.0; - for(i=0; i<d; i++) { - if (vec[i] != 0.0) { - diff = vec[i] - cb[j*d+i] - gain; - error += diff*diff; - metric += weights[i]*diff*diff; - } - } - if (metric < best_metric) { - best_error = error; - best_metric = metric; - *best_gain = gain; - besti = j; - } - } - - *se += best_error; - - return(besti); -} - - -static void gain_shape_split_vq(float sparse_pe_out[], struct AEXP *aexp, struct codebook *vq, float weights[], float sparse_pe_in[], float *best_gain) -{ - int i, j, non_zero, vq_ind; - float se; - - vq_ind = gain_shape_vq_amp(vq->cb, &sparse_pe_in[vq->offset], &weights[vq->offset], vq->k, vq->m, &se, best_gain); - //printf("\n offset %d k %d m %d vq_ind %d gain: %4.2f j: ", vq->offset, vq->k, vq->m, vq_ind, *best_gain); - - non_zero = 0; - for(i=0, j=vq->offset; i<vq->k; i++,j++) { - if (sparse_pe_in[j] != 0.0) { - //printf("%d ", j); - sparse_pe_out[j] = vq->cb[vq->k * vq_ind + i] + *best_gain; - non_zero++; - } - } - aexp->vq_var_n += non_zero; -} - - -static void gain_shape_sparse_vq_amp(struct AEXP *aexp, MODEL *model) -{ - int m, index; - float amp_dB, best_gain; - float sparse_pe_in[MAX_AMP]; - float sparse_pe_out[MAX_AMP]; - float weights[MAX_AMP]; - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_in[m] = 0.0; - sparse_pe_out[m] = 0.0; - } - - for(m=1; m<=model->L; m++) { - assert(model->A[m] > 0.0); - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe_in[index] = 20.0*log10(model->A[m]); - weights[index] = model->A[m]; - } - - /* vector quantise */ - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_out[m] = sparse_pe_in[m]; - } - - gain_shape_split_vq(sparse_pe_out, aexp, aexp->vq1, weights, sparse_pe_in, &best_gain); - gain_shape_split_vq(sparse_pe_out, aexp, aexp->vq2, weights, sparse_pe_in, &best_gain); - gain_shape_split_vq(sparse_pe_out, aexp, aexp->vq3, weights, sparse_pe_in, &best_gain); - gain_shape_split_vq(sparse_pe_out, aexp, aexp->vq4, weights, sparse_pe_in, &best_gain); - - for(m=0; m<MAX_AMP; m++) { - if (sparse_pe_in[m] != 0.0) - aexp->vq_var += pow(sparse_pe_out[m] - sparse_pe_in[m], 2.0); - } - - /* transform quantised amps back */ - - for(m=1; m<=model->L; m++) { - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - amp_dB = sparse_pe_out[index]; - model->A[m] = pow(10.0, amp_dB/20.0); - } - //exit(0); -} - - -static void interp_split_vq(float sparse_pe_out[], struct AEXP *aexp, struct codebook *vq, float sparse_pe_in[], int ind) -{ - int i, j; - float amp_dB; - - for(i=0, j=vq->offset; i<vq->k; i++,j++) { - if (sparse_pe_in[j] != 0.0) { - amp_dB = 0.5*(aexp->mag[0] + vq->cb[vq->k * aexp->indexes[ind][0] + i]); - amp_dB += 0.5*(aexp->mag[2] + vq->cb[vq->k * aexp->indexes[ind][2] + i]); - sparse_pe_out[j] = amp_dB; - } - } -} - - -static void vq_interp(struct AEXP *aexp, MODEL *model, int on) -{ - int i, j, m, index; - float amp_dB; - //struct codebook *vq = aexp->vq1; - float sparse_pe_in[MAX_AMP]; - float sparse_pe_out[MAX_AMP]; - - /* replace odd frames with interp */ - /* once we get an even input frame we can interpolate and output odd */ - /* using VQ to interpolate. This assumes some correlation in - adjacent VQ samples */ - - memcpy(&aexp->model[2], model, sizeof(MODEL)); - - /* once we get an even input frame we have enough information to - replace prev odd frame with interpolated version */ - - if (on && ((aexp->frames % 2) == 0)) { - - /* copy Wo, L, and phases */ - - memcpy(model, &aexp->model[1], sizeof(MODEL)); - //printf("mags: %4.2f %4.2f %4.2f Am: \n", aexp->mag[0], aexp->mag[1], aexp->mag[2]); - - /* now replace Am by interpolation, use similar design to VQ - to handle different bands */ - - for(m=1; m<=model->L; m++) { - assert(model->A[m] > 0.0); - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe_in[index] = 20.0*log10(model->A[m]); - } - - /* this can be used for when just testing partial interpolation */ - - for(m=0; m<MAX_AMP; m++) { - //sparse_pe_out[m] = sparse_pe_in[m]; - sparse_pe_out[m] = 0; - } - - interp_split_vq(sparse_pe_out, aexp, aexp->vq1, sparse_pe_in, 0); - interp_split_vq(sparse_pe_out, aexp, aexp->vq2, sparse_pe_in, 1); - interp_split_vq(sparse_pe_out, aexp, aexp->vq3, sparse_pe_in, 2); - interp_split_vq(sparse_pe_out, aexp, aexp->vq4, sparse_pe_in, 3); - interp_split_vq(sparse_pe_out, aexp, aexp->vq5, sparse_pe_in, 4); - - for(m=1; m<=model->L; m++) { - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - amp_dB = sparse_pe_out[index]; - //printf(" %4.2f", 10.0*log10(model->A[m])); - model->A[m] = pow(10.0, amp_dB/20.0); - //printf(" %4.2f\n", 10.0*log10(model->A[m])); - } - - #ifdef INITIAL_VER - - for(m=1; m<=model->L; m++) { - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - - if (index < vq->k) { - amp_dB = 0.5*(aexp->mag[0] + vq->cb[vq->k * aexp->indexes[0] + index]); - amp_dB += 0.5*(aexp->mag[2] + vq->cb[vq->k * aexp->indexes[2] + index]); - //printf(" %4.2f", 10.0*log10(model->A[m])); - //amp_dB = 10; - model->A[m] = pow(10.0, amp_dB/20.0); - printf(" %4.2f\n", 10.0*log10(model->A[m])); - } - } - - #endif - } - else - memcpy(model, &aexp->model[1], sizeof(MODEL)); - - /* update memories */ - - for(i=0; i<2; i++) { - memcpy(&aexp->model[i], &aexp->model[i+1], sizeof(MODEL)); - for(j=0; j<5; j++) - aexp->indexes[j][i] = aexp->indexes[j][i+1]; - aexp->mag[i] = aexp->mag[i+1]; - } - -} - - -/* - This functions tests theory that some bands can be combined together - due to less frequency resolution at higher frequencies. This will - reduce the amount of information we need to encode. -*/ - -void smooth_samples(struct AEXP *aexp, MODEL *model, int mode) -{ - int m, i, j, index, step, nav, v, en; - float sparse_pe_in[MAX_AMP], av, amp_dB; - float sparse_pe_out[MAX_AMP]; - float smoothed[MAX_AMP], smoothed_out[MAX_AMP]; - float weights[MAX_AMP]; - float enormdB; - - frame_energy(model, &enormdB); - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_in[m] = 0.0; - sparse_pe_out[m] = 0.0; - } - - /* set up sparse array */ - - for(m=1; m<=model->L; m++) { - assert(model->A[m] > 0.0); - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe_out[index] = sparse_pe_in[index] = 20.0*log10(model->A[m]) - enormdB; - } - - /* now combine samples at high frequencies to reduce dimension */ - - step=4; - for(i=MAX_AMP/2,v=0; i<MAX_AMP; i+=step,v++) { - - /* average over one band */ - - av = 0.0; nav = 0; - en = i+step; - if (en > (MAX_AMP-1)) - en = MAX_AMP-1; - for(j=i; j<en; j++) { - if (sparse_pe_in[j] != 0.0) { - av += sparse_pe_in[j]; - nav++; - } - } - if (nav) { - av /= nav; - smoothed[v] = av; - weights[v] = pow(10.0,av/20.0); - //weights[v] = 1.0; - } - else - smoothed[v] = 0.0; - - } - - if (mode == 1) { - for(i=0; i<v; i++) - printf("%5.2f ", smoothed[i]); - printf("\n"); - } - - if (mode == 2) { - for(i=0; i<v; i++) - smoothed_out[i] = 0; - split_vq(smoothed_out, aexp, aexp->vq1, weights, smoothed); - for(i=0; i<v; i++) - smoothed[i] = smoothed_out[i]; - } - - /* set all samples to smoothed average */ - - step = 4; - for(i=MAX_AMP/2,v=0; i<MAX_AMP; i+=step,v++) { - en = i+step; - if (en > (MAX_AMP-1)) - en = MAX_AMP-1; - for(j=i; j<en; j++) - sparse_pe_out[j] = smoothed[v]; - } - - /* convert back to Am */ - - for(m=1; m<=model->L; m++) { - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - amp_dB = sparse_pe_out[index] + enormdB; - //printf("%d %4.2f %4.2f\n", m, 10.0*log10(model->A[m]), amp_dB); - model->A[m] = pow(10.0, amp_dB/20.0); - } - -} - -#define MAX_BINS 40 -static float bins[] = { - /*1000.0, 1200.0, 1400.0, 1600.0, 1800,*/ - 2000.0, 2400.0, 2800.0, - 3000.0, 3400.0, 3600.0, 4000.0}; - -void smooth_amp(struct AEXP *aexp, MODEL *model) { - int m, i; - int nbins; - int b; - float f; - float av[MAX_BINS]; - int nav[MAX_BINS]; - - nbins = sizeof(bins)/sizeof(float); - - /* clear all bins */ - - for(i=0; i<MAX_BINS; i++) { - av[i] = 0.0; - nav[i] = 0; - } - - /* add amps into each bin */ - - for(m=1; m<=model->L; m++) { - f = m*model->Wo*FS/TWO_PI; - if (f > bins[0]) { - - /* find bin */ - - for(i=0; i<nbins; i++) - if ((f > bins[i]) && (f <= bins[i+1])) - b = i; - assert(b < MAX_BINS); - - av[b] += model->A[m]*model->A[m]; - nav[b]++; - } - - } - - /* use averages to est amps */ - - for(m=1; m<=model->L; m++) { - f = m*model->Wo*FS/TWO_PI; - if (f > bins[0]) { - - /* find bin */ - - for(i=0; i<nbins; i++) - if ((f > bins[i]) && (f <= bins[i+1])) - b = i; - assert(b < MAX_BINS); - - /* add predicted phase error to this bin */ - - printf("L %d m %d f %4.f b %d\n", model->L, m, f, b); - - printf(" %d: %4.3f -> ", m, 20*log10(model->A[m])); - model->A[m] = sqrt(av[b]/nav[b]); - printf("%4.3f\n", 20*log10(model->A[m])); - } - } - printf("\n"); -} - -/*---------------------------------------------------------------------------* \ - - amp_experiment() - - Amplitude quantisation experiments. - -\*---------------------------------------------------------------------------*/ - -void amp_experiment(struct AEXP *aexp, MODEL *model, char *arg) { - int m,i; - - memcpy(&aexp->model_uq[2], model, sizeof(MODEL)); - - if (strcmp(arg, "qn") == 0) { - add_quant_noise(aexp, model, 1, model->L, 1); - update_snr_calc(aexp, &aexp->model_uq[2], model); - } - - /* print training samples that can be > train.txt for training VQ */ - - if (strcmp(arg, "train") == 0) - print_sparse_amp_error(aexp, model, 00.0); - - /* VQ of amplitudes, no interpolation (ie 10ms rate) */ - - if (strcmp(arg, "vq") == 0) { - sparse_vq_amp(aexp, model); - vq_interp(aexp, model, 0); - update_snr_calc(aexp, &aexp->model_uq[1], model); - } - - /* VQ of amplitudes, interpolation (ie 20ms rate) */ - - if (strcmp(arg, "vqi") == 0) { - sparse_vq_amp(aexp, model); - vq_interp(aexp, model, 1); - update_snr_calc(aexp, &aexp->model_uq[1], model); - } - - /* gain/shape VQ of amplitudes, 10ms rate (doesn't work that well) */ - - if (strcmp(arg, "gsvq") == 0) { - gain_shape_sparse_vq_amp(aexp, model); - vq_interp(aexp, model, 0); - update_snr_calc(aexp, &aexp->model_uq[1], model); - } - - if (strcmp(arg, "smooth") == 0) { - smooth_samples(aexp, model, 0); - update_snr_calc(aexp, &aexp->model_uq[2], model); - } - - if (strcmp(arg, "smoothtrain") == 0) { - smooth_samples(aexp, model, 1); - //update_snr_calc(aexp, &aexp->model_uq[2], model); - } - - if (strcmp(arg, "smoothvq") == 0) { - smooth_samples(aexp, model, 2); - update_snr_calc(aexp, &aexp->model_uq[2], model); - } - - if (strcmp(arg, "smoothamp") == 0) { - smooth_amp(aexp, model); - update_snr_calc(aexp, &aexp->model_uq[2], model); - } - - /* update states */ - - for(m=1; m<=model->L; m++) - aexp->A_prev[m] = model->A[m]; - aexp->frames++; - for(i=0; i<3; i++) - aexp->model_uq[i] = aexp->model_uq[i+1]; -} - diff --git a/gr-vocoder/lib/codec2/ampexp.h b/gr-vocoder/lib/codec2/ampexp.h deleted file mode 100644 index 8954ea282e..0000000000 --- a/gr-vocoder/lib/codec2/ampexp.h +++ /dev/null @@ -1,39 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: ampexp.h - AUTHOR......: David Rowe - DATE CREATED: & August 2012 - - Functions for experimenting with amplitude quantisation. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not,see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __AMPEX__ -#define __AMPEXP__ - -#include "defines.h" - -struct AEXP; - -struct AEXP *amp_experiment_create(); -void amp_experiment_destroy(struct AEXP *aexp); -void amp_experiment(struct AEXP *aexp, MODEL *model, char *arg); - -#endif diff --git a/gr-vocoder/lib/codec2/c2dec.c b/gr-vocoder/lib/codec2/c2dec.c deleted file mode 100644 index ec44f0a9fd..0000000000 --- a/gr-vocoder/lib/codec2/c2dec.c +++ /dev/null @@ -1,291 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: c2dec.c - AUTHOR......: David Rowe - DATE CREATED: 23/8/2010 - - Decodes a file of bits to a file of raw speech samples using codec2. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2010 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "codec2.h" -#include "dump.h" - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <getopt.h> - -#define NONE 0 /* no bit errors */ -#define UNIFORM 1 /* random bit errors */ -#define TWO_STATE 2 /* Two state error model */ -#define UNIFORM_RANGE 3 /* random bit errors over a certain range */ - -void print_help(const struct option *long_options, int num_opts, char* argv[]); - -int main(int argc, char *argv[]) -{ - int mode; - void *codec2; - FILE *fin; - FILE *fout; - FILE *fber = NULL; - short *buf; - unsigned char *bits, *prev_bits; - int nsam, nbit, nbyte, i, byte, frames, bits_proc, bit_errors, error_mode; - int nstart_bit, nend_bit, bit_rate; - int state, next_state; - float ber, r, burst_length, burst_period, burst_timer, ber_est; - unsigned char mask; - int natural, dump; - - char* opt_string = "h:"; - struct option long_options[] = { - { "ber", required_argument, NULL, 0 }, - { "startbit", required_argument, NULL, 0 }, - { "endbit", required_argument, NULL, 0 }, - { "berfile", required_argument, NULL, 0 }, - { "natural", no_argument, &natural, 1 }, - #ifdef DUMP - { "dump", required_argument, &dump, 1 }, - #endif - { "help", no_argument, NULL, 'h' }, - { NULL, no_argument, NULL, 0 } - }; - int num_opts=sizeof(long_options)/sizeof(struct option); - - if (argc < 4) - print_help(long_options, num_opts, argv); - - if (strcmp(argv[1],"3200") == 0) - mode = CODEC2_MODE_3200; - else if (strcmp(argv[1],"2400") == 0) - mode = CODEC2_MODE_2400; - else if (strcmp(argv[1],"1600") == 0) - mode = CODEC2_MODE_1600; - else if (strcmp(argv[1],"1400") == 0) - mode = CODEC2_MODE_1400; - else if (strcmp(argv[1],"1300") == 0) - mode = CODEC2_MODE_1300; - else if (strcmp(argv[1],"1200") == 0) - mode = CODEC2_MODE_1200; - else { - fprintf(stderr, "Error in mode: %s. Must be 3200, 2400, 1600, 1400, 1300 or 1200\n", argv[1]); - exit(1); - } - bit_rate = atoi(argv[1]); - - if (strcmp(argv[2], "-") == 0) fin = stdin; - else if ( (fin = fopen(argv[2],"rb")) == NULL ) { - fprintf(stderr, "Error opening input bit file: %s: %s.\n", - argv[2], strerror(errno)); - exit(1); - } - - if (strcmp(argv[3], "-") == 0) fout = stdout; - else if ( (fout = fopen(argv[3],"wb")) == NULL ) { - fprintf(stderr, "Error opening output speech file: %s: %s.\n", - argv[3], strerror(errno)); - exit(1); - } - - error_mode = NONE; - ber = 0.0; - burst_length = burst_period = 0.0; - burst_timer = 0.0; - dump = natural = 0; - - codec2 = codec2_create(mode); - nsam = codec2_samples_per_frame(codec2); - nbit = codec2_bits_per_frame(codec2); - buf = (short*)malloc(nsam*sizeof(short)); - nbyte = (nbit + 7) / 8; - bits = (unsigned char*)malloc(nbyte*sizeof(char)); - prev_bits = (unsigned char*)malloc(nbyte*sizeof(char)); - frames = bit_errors = bits_proc = 0; - nstart_bit = 0; - nend_bit = nbit-1; - - while(1) { - int option_index = 0; - int opt = getopt_long(argc, argv, opt_string, - long_options, &option_index); - if (opt == -1) - break; - - switch (opt) { - case 0: - if(strcmp(long_options[option_index].name, "ber") == 0) { - ber = atof(optarg); - error_mode = UNIFORM; - } else if(strcmp(long_options[option_index].name, "startbit") == 0) { - nstart_bit = atoi(optarg); - } else if(strcmp(long_options[option_index].name, "endbit") == 0) { - nend_bit = atoi(optarg); - } else if(strcmp(long_options[option_index].name, "berfile") == 0) { - if ((fber = fopen(optarg,"wt")) == NULL) { - fprintf(stderr, "Error opening BER file: %s %s.\n", - optarg, strerror(errno)); - exit(1); - } - - } - #ifdef DUMP - else if(strcmp(long_options[option_index].name, "dump") == 0) { - if (dump) - dump_on(optarg); - } - #endif - break; - - case 'h': - print_help(long_options, num_opts, argv); - break; - - default: - /* This will never be reached */ - break; - } - } - assert(nend_bit <= nbit); - codec2_set_natural_or_gray(codec2, !natural); - //printf("%d %d\n", nstart_bit, nend_bit); - - while(fread(bits, sizeof(char), nbyte, fin) == (size_t)nbyte) { - frames++; - - // apply bit errors, MSB of byte 0 is bit 0 in frame */ - - if ((error_mode == UNIFORM) || (error_mode == UNIFORM_RANGE)) { - for(i=nstart_bit; i<nend_bit+1; i++) { - r = (float)rand()/RAND_MAX; - if (r < ber) { - byte = i/8; - //printf("nbyte %d nbit %d i %d byte %d bits[%d] 0x%0x ", nbyte, nbit, i, byte, byte, bits[byte]); - mask = 1 << (7 - i + byte*8); - bits[byte] ^= mask; - //printf("shift: %d mask: 0x%0x bits[%d] 0x%0x\n", 7 - i + byte*8, mask, byte, bits[byte] ); - bit_errors++; - } - bits_proc++; - } - } - - if (error_mode == TWO_STATE) { - burst_timer += (float)nbit/bit_rate; - fprintf(stderr, "burst_timer: %f state: %d\n", burst_timer, state); - - next_state = state; - switch(state) { - case 0: - - /* clear channel state - no bit errors */ - - if (burst_timer > (burst_period - burst_length)) - next_state = 1; - break; - - case 1: - - /* burst error state - 50% bit error rate */ - - for(i=nstart_bit; i<nend_bit+1; i++) { - r = (float)rand()/RAND_MAX; - if (r < 0.5) { - byte = i/8; - bits[byte] ^= 1 << (7 - i + byte*8); - bit_errors++; - } - bits_proc++; - } - - if (burst_timer > burst_period) { - burst_timer = 0.0; - next_state = 0; - } - break; - - } - - state = next_state; - } - - if (fber != NULL) { - if (fread(&ber_est, sizeof(float), 1, fber) != 1) { - fprintf(stderr, "ran out of BER estimates!\n"); - exit(1); - } - //fprintf(stderr, "ber_est: %f\n", ber_est); - } - else - ber_est = 0.0; - - codec2_decode_ber(codec2, buf, bits, ber_est); - fwrite(buf, sizeof(short), nsam, fout); - //if this is in a pipeline, we probably don't want the usual - //buffering to occur - if (fout == stdout) fflush(stdout); - if (fin == stdin) fflush(stdin); - - memcpy(prev_bits, bits, nbyte); - } - - if (error_mode) - fprintf(stderr, "actual BER: %1.3f\n", (float)bit_errors/bits_proc); - - codec2_destroy(codec2); - - free(buf); - free(bits); - fclose(fin); - fclose(fout); - - return 0; -} - -void print_help(const struct option* long_options, int num_opts, char* argv[]) -{ - int i; - char *option_parameters; - fprintf(stderr, "\nc2dec - Codec 2 decoder and bit error simulation program\n" - "usage: %s 3200|2400|1400}1300|1200 InputFile OutputRawFile [OPTIONS]\n\n" - "Options:\n", argv[0]); - for(i=0; i<num_opts-1; i++) { - if(long_options[i].has_arg == no_argument) { - option_parameters=""; - } else if (strcmp("ber", long_options[i].name) == 0) { - option_parameters = " BER"; - } else if (strcmp("startbit", long_options[i].name) == 0) { - option_parameters = " startBit"; - } else if (strcmp("endbit", long_options[i].name) == 0) { - option_parameters = " endBit"; - } else if (strcmp("berfile", long_options[i].name) == 0) { - option_parameters = " berFileName"; - } else if (strcmp("dump", long_options[i].name) == 0) { - option_parameters = " dumpFilePrefix"; - } else { - option_parameters = " <UNDOCUMENTED parameter>"; - } - fprintf(stderr, "\t--%s%s\n", long_options[i].name, option_parameters); - } - exit(1); -} diff --git a/gr-vocoder/lib/codec2/c2demo.c b/gr-vocoder/lib/codec2/c2demo.c deleted file mode 100644 index 9cd11d490e..0000000000 --- a/gr-vocoder/lib/codec2/c2demo.c +++ /dev/null @@ -1,101 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: c2demo.c - AUTHOR......: David Rowe - DATE CREATED: 15/11/2010 - - Encodes and decodes a file of raw speech samples using Codec 2. - Demonstrates use of Codec 2 function API. - - Note to convert a wave file to raw and vice-versa: - - $ sox file.wav -r 8000 -s -2 file.raw - $ sox -r 8000 -s -2 file.raw file.wav - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2010 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "codec2.h" -#include "sine.h" -#include "dump.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -int main(int argc, char *argv[]) -{ - struct CODEC2 *codec2; - FILE *fin; - FILE *fout; - short *buf; - unsigned char *bits; - int nsam, nbit, i, r; - - for(i=0; i<10; i++) { - r = codec2_rand(); - printf("[%d] r = %d\n", i, r); - } - - if (argc != 3) { - printf("usage: %s InputRawSpeechFile OutputRawSpeechFile\n", argv[0]); - exit(1); - } - - if ( (fin = fopen(argv[1],"rb")) == NULL ) { - fprintf(stderr, "Error opening input speech file: %s: %s.\n", - argv[1], strerror(errno)); - exit(1); - } - - if ( (fout = fopen(argv[2],"wb")) == NULL ) { - fprintf(stderr, "Error opening output speech file: %s: %s.\n", - argv[2], strerror(errno)); - exit(1); - } - - #ifdef DUMP - dump_on("c2demo"); - #endif - - /* Note only one set of Codec 2 states is required for an encoder - and decoder pair. */ - - codec2 = codec2_create(CODEC2_MODE_1300); - nsam = codec2_samples_per_frame(codec2); - buf = (short*)malloc(nsam*sizeof(short)); - nbit = codec2_bits_per_frame(codec2); - bits = (unsigned char*)malloc(nbit*sizeof(char)); - - while(fread(buf, sizeof(short), nsam, fin) == (size_t)nsam) { - codec2_encode(codec2, bits, buf); - codec2_decode(codec2, buf, bits); - fwrite(buf, sizeof(short), nsam, fout); - } - - free(buf); - free(bits); - codec2_destroy(codec2); - - fclose(fin); - fclose(fout); - - return 0; -} diff --git a/gr-vocoder/lib/codec2/c2enc.c b/gr-vocoder/lib/codec2/c2enc.c deleted file mode 100644 index 1e2760a01f..0000000000 --- a/gr-vocoder/lib/codec2/c2enc.c +++ /dev/null @@ -1,117 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: c2enc.c - AUTHOR......: David Rowe - DATE CREATED: 23/8/2010 - - Encodes a file of raw speech samples using codec2 and outputs a file - of bits. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2010 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "codec2.h" - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> - -int main(int argc, char *argv[]) -{ - int mode; - void *codec2; - FILE *fin; - FILE *fout; - short *buf; - unsigned char *bits; - int nsam, nbit, nbyte, gray; - - if (argc < 4) { - printf("usage: c2enc 3200|2400|1600|1400|1300|1200 InputRawspeechFile OutputBitFile [--natural]\n"); - printf("e.g c2enc 1400 ../raw/hts1a.raw hts1a.c2\n"); - printf("e.g c2enc 1300 ../raw/hts1a.raw hts1a.c2 --natural\n"); - exit(1); - } - - if (strcmp(argv[1],"3200") == 0) - mode = CODEC2_MODE_3200; - else if (strcmp(argv[1],"2400") == 0) - mode = CODEC2_MODE_2400; - else if (strcmp(argv[1],"1600") == 0) - mode = CODEC2_MODE_1600; - else if (strcmp(argv[1],"1400") == 0) - mode = CODEC2_MODE_1400; - else if (strcmp(argv[1],"1300") == 0) - mode = CODEC2_MODE_1300; - else if (strcmp(argv[1],"1200") == 0) - mode = CODEC2_MODE_1200; - else { - fprintf(stderr, "Error in mode: %s. Must be 3200, 2400, 1600, 1400, 1300 or 1200\n", argv[1]); - exit(1); - } - - if (strcmp(argv[2], "-") == 0) fin = stdin; - else if ( (fin = fopen(argv[2],"rb")) == NULL ) { - fprintf(stderr, "Error opening input speech file: %s: %s.\n", - argv[2], strerror(errno)); - exit(1); - } - - if (strcmp(argv[3], "-") == 0) fout = stdout; - else if ( (fout = fopen(argv[3],"wb")) == NULL ) { - fprintf(stderr, "Error opening output compressed bit file: %s: %s.\n", - argv[3], strerror(errno)); - exit(1); - } - - codec2 = codec2_create(mode); - nsam = codec2_samples_per_frame(codec2); - nbit = codec2_bits_per_frame(codec2); - buf = (short*)malloc(nsam*sizeof(short)); - nbyte = (nbit + 7) / 8; - - bits = (unsigned char*)malloc(nbyte*sizeof(char)); - - if (argc == 5) { - if (strcmp(argv[4], "--natural") == 0) - gray = 0; - else - gray = 1; - codec2_set_natural_or_gray(codec2, gray); - } - - while(fread(buf, sizeof(short), nsam, fin) == (size_t)nsam) { - codec2_encode(codec2, bits, buf); - fwrite(bits, sizeof(char), nbyte, fout); - // if this is in a pipeline, we probably don't want the usual - // buffering to occur - if (fout == stdout) fflush(stdout); - if (fin == stdin) fflush(stdin); - } - - codec2_destroy(codec2); - - free(buf); - free(bits); - fclose(fin); - fclose(fout); - - return 0; -} diff --git a/gr-vocoder/lib/codec2/c2sim.c b/gr-vocoder/lib/codec2/c2sim.c deleted file mode 100644 index e68f2aceeb..0000000000 --- a/gr-vocoder/lib/codec2/c2sim.c +++ /dev/null @@ -1,934 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: c2sim.c - AUTHOR......: David Rowe - DATE CREATED: 20/8/2010 - - Codec2 simulation. Combines encoder and decoder and allows - switching in and out various algorithms and quantisation steps. Used - for algorithm development. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <math.h> -#include <unistd.h> -#include <getopt.h> - -#include "defines.h" -#include "sine.h" -#include "nlp.h" -#include "dump.h" -#include "lpc.h" -#include "lsp.h" -#include "quantise.h" -#include "phase.h" -#include "postfilter.h" -#include "interp.h" -#include "ampexp.h" -#include "phaseexp.h" - -void synth_one_frame(kiss_fft_cfg fft_inv_cfg, short buf[], MODEL *model, float Sn_[], float Pn[], int prede, float *de_mem, float gain); -void print_help(const struct option *long_options, int num_opts, char* argv[]); - - -/*---------------------------------------------------------------------------*\ - - MAIN - -\*---------------------------------------------------------------------------*/ - -int main(int argc, char *argv[]) -{ - FILE *fout = NULL; /* output speech file */ - FILE *fin; /* input speech file */ - short buf[N]; /* input/output buffer */ - float Sn[M]; /* float input speech samples */ - float Sn_pre[M]; /* pre-emphasised input speech samples */ - COMP Sw[FFT_ENC]; /* DFT of Sn[] */ - kiss_fft_cfg fft_fwd_cfg; - kiss_fft_cfg fft_inv_cfg; - float w[M]; /* time domain hamming window */ - COMP W[FFT_ENC]; /* DFT of w[] */ - MODEL model; - float Pn[2*N]; /* trapezoidal synthesis window */ - float Sn_[2*N]; /* synthesised speech */ - int i; /* loop variable */ - int frames; - float prev_Wo, prev__Wo, uq_Wo, prev_uq_Wo; - float pitch; - int voiced1 = 0; - char out_file[MAX_STR]; - char ampexp_arg[MAX_STR]; - char phaseexp_arg[MAX_STR]; - float snr; - float sum_snr; - - int lpc_model = 0, order = LPC_ORD; - int lsp = 0, lspd = 0, lspvq = 0; - int lspres = 0; - int lspdt = 0, lspdt_mode = LSPDT_ALL; - int dt = 0, lspjvm = 0, lspanssi = 0, lspjnd = 0, lspmel = 0; - int prede = 0; - float pre_mem = 0.0, de_mem = 0.0; - float ak[LPC_MAX]; - COMP Sw_[FFT_ENC]; - COMP Ew[FFT_ENC]; - - int phase0 = 0; - float ex_phase[MAX_AMP+1]; - - int postfilt; - float bg_est; - - int hand_voicing = 0, phaseexp = 0, ampexp = 0, hi = 0, simlpcpf = 0; - int lpcpf = 0; - FILE *fvoicing = 0; - - MODEL prev_model, interp_model; - int decimate = 0; - float lsps[LPC_MAX]; - float prev_lsps[LPC_MAX], prev_lsps_[LPC_MAX]; - float lsps__prev[LPC_MAX]; - float lsps__prev2[LPC_MAX]; - float e, prev_e; - float ak_interp[LPC_MAX]; - int lsp_indexes[LPC_MAX]; - float lsps_[LPC_MAX]; - float Woe_[2]; - - void *nlp_states; - float hpf_states[2]; - int scalar_quant_Wo_e = 0; - int vector_quant_Wo_e = 0; - int dump_pitch_e = 0; - FILE *fjvm = NULL; - #ifdef DUMP - int dump; - #endif - struct PEXP *pexp = NULL; - struct AEXP *aexp = NULL; - float gain = 1.0; - - char* opt_string = "ho:"; - struct option long_options[] = { - { "lpc", required_argument, &lpc_model, 1 }, - { "lspjnd", no_argument, &lspjnd, 1 }, - { "lspmel", no_argument, &lspmel, 1 }, - { "lsp", no_argument, &lsp, 1 }, - { "lspd", no_argument, &lspd, 1 }, - { "lspvq", no_argument, &lspvq, 1 }, - { "lspres", no_argument, &lspres, 1 }, - #ifdef __EXPERIMENTAL__ - { "lspdt", no_argument, &lspdt, 1 }, - { "lspdt_mode", required_argument, NULL, 0 }, - #endif - { "lspjvm", no_argument, &lspjvm, 1 }, - #ifdef __EXPERIMENTAL__ - { "lspanssi", no_argument, &lspanssi, 1 }, - #endif - { "phase0", no_argument, &phase0, 1 }, - { "phaseexp", required_argument, &phaseexp, 1 }, - { "ampexp", required_argument, &exp, 1 }, - { "postfilter", no_argument, &postfilt, 1 }, - { "hand_voicing", required_argument, &hand_voicing, 1 }, - { "dec", no_argument, &decimate, 1 }, - { "dt", no_argument, &dt, 1 }, - { "hi", no_argument, &hi, 1 }, - { "simlpcpf", no_argument, &simlpcpf, 1 }, - { "lpcpf", no_argument, &lpcpf, 1 }, - { "prede", no_argument, &prede, 1 }, - { "dump_pitch_e", required_argument, &dump_pitch_e, 1 }, - { "sq_pitch_e", no_argument, &scalar_quant_Wo_e, 1 }, - { "vq_pitch_e", no_argument, &vector_quant_Wo_e, 1 }, - { "rate", required_argument, NULL, 0 }, - { "gain", required_argument, NULL, 0 }, - #ifdef DUMP - { "dump", required_argument, &dump, 1 }, - #endif - { "help", no_argument, NULL, 'h' }, - { NULL, no_argument, NULL, 0 } - }; - int num_opts=sizeof(long_options)/sizeof(struct option); - - for(i=0; i<M; i++) { - Sn[i] = 1.0; - Sn_pre[i] = 1.0; - } - for(i=0; i<2*N; i++) - Sn_[i] = 0; - - prev_uq_Wo = prev_Wo = prev__Wo = TWO_PI/P_MAX; - - prev_model.Wo = TWO_PI/P_MIN; - prev_model.L = floor(PI/prev_model.Wo); - for(i=1; i<=prev_model.L; i++) { - prev_model.A[i] = 0.0; - prev_model.phi[i] = 0.0; - } - for(i=1; i<=MAX_AMP; i++) { - //ex_phase[i] = (PI/3)*(float)rand()/RAND_MAX; - ex_phase[i] = 0.0; - } - for(i=0; i<LPC_ORD; i++) { - lsps_[i] = prev_lsps[i] = prev_lsps_[i] = i*PI/(LPC_ORD+1); - lsps__prev[i] = lsps__prev2[i] = i*PI/(LPC_ORD+1); - } - e = prev_e = 1; - hpf_states[0] = hpf_states[1] = 0.0; - - nlp_states = nlp_create(M); - - if (argc < 2) { - print_help(long_options, num_opts, argv); - } - - /*----------------------------------------------------------------*\ - - Interpret Command Line Arguments - - \*----------------------------------------------------------------*/ - - while(1) { - int option_index = 0; - int opt = getopt_long(argc, argv, opt_string, - long_options, &option_index); - if (opt == -1) - break; - switch (opt) { - case 0: - if(strcmp(long_options[option_index].name, "lpc") == 0) { - order = atoi(optarg); - if((order < 4) || (order > 20)) { - fprintf(stderr, "Error in LPC order: %s\n", optarg); - exit(1); - } - #ifdef DUMP - } else if(strcmp(long_options[option_index].name, "dump") == 0) { - if (dump) - dump_on(optarg); - #endif - } else if(strcmp(long_options[option_index].name, "lsp") == 0 - || strcmp(long_options[option_index].name, "lspd") == 0 - || strcmp(long_options[option_index].name, "lspvq") == 0) { - assert(order == LPC_ORD); - } else if(strcmp(long_options[option_index].name, "lspdt_mode") == 0) { - if (strcmp(optarg,"all") == 0) - lspdt_mode = LSPDT_ALL; - else if (strcmp(optarg,"low") == 0) - lspdt_mode = LSPDT_LOW; - else if (strcmp(optarg,"high") == 0) - lspdt_mode = LSPDT_HIGH; - else { - fprintf(stderr, "Error in lspdt_mode: %s\n", optarg); - exit(1); - } - } else if(strcmp(long_options[option_index].name, "hand_voicing") == 0) { - if ((fvoicing = fopen(optarg,"rt")) == NULL) { - fprintf(stderr, "Error opening voicing file: %s: %s.\n", - optarg, strerror(errno)); - exit(1); - } - } else if(strcmp(long_options[option_index].name, "dump_pitch_e") == 0) { - if ((fjvm = fopen(optarg,"wt")) == NULL) { - fprintf(stderr, "Error opening pitch & energy dump file: %s: %s.\n", - optarg, strerror(errno)); - exit(1); - } - } else if(strcmp(long_options[option_index].name, "phaseexp") == 0) { - strcpy(phaseexp_arg, optarg); - } else if(strcmp(long_options[option_index].name, "ampexp") == 0) { - strcpy(ampexp_arg, optarg); - } else if(strcmp(long_options[option_index].name, "gain") == 0) { - gain = atof(optarg); - } else if(strcmp(long_options[option_index].name, "rate") == 0) { - if(strcmp(optarg,"3200") == 0) { - lpc_model = 1; order = 10; - scalar_quant_Wo_e = 1; - lspd = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - lpcpf = 1; - } else if(strcmp(optarg,"2400") == 0) { - lpc_model = 1; order = 10; - vector_quant_Wo_e = 1; - lsp = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - lpcpf = 1; - } else if(strcmp(optarg,"1400") == 0) { - lpc_model = 1; order = 10; - vector_quant_Wo_e = 1; - lsp = 1; lspdt = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - dt = 1; - lpcpf = 1; - } else if(strcmp(optarg,"1200") == 0) { - lpc_model = 1; order = 10; - scalar_quant_Wo_e = 1; - lspjvm = 1; lspdt = 1; - phase0 = 1; - postfilt = 1; - decimate = 1; - dt = 1; - lpcpf = 1; - } else { - fprintf(stderr, "Error: invalid output rate %s\n", optarg); - exit(1); - } - } - break; - - case 'h': - print_help(long_options, num_opts, argv); - break; - - case 'o': - if (strcmp(optarg, "-") == 0) fout = stdout; - else if ((fout = fopen(optarg,"wb")) == NULL) { - fprintf(stderr, "Error opening output speech file: %s: %s.\n", - optarg, strerror(errno)); - exit(1); - } - strcpy(out_file,optarg); - break; - - default: - /* This will never be reached */ - break; - } - } - - /* Input file */ - - if ((fin = fopen(argv[optind],"rb")) == NULL) { - fprintf(stderr, "Error opening input speech file: %s: %s.\n", - argv[optind], strerror(errno)); - exit(1); - } - - ex_phase[0] = 0; - bg_est = 0.0; - Woe_[0] = Woe_[1] = 1.0; - - /* - printf("lspd: %d lspdt: %d lspdt_mode: %d phase0: %d postfilt: %d " - "decimate: %d dt: %d\n",lspd,lspdt,lspdt_mode,phase0,postfilt, - decimate,dt); - */ - - /* Initialise ------------------------------------------------------------*/ - - fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL); /* fwd FFT,used in several places */ - fft_inv_cfg = kiss_fft_alloc(FFT_DEC, 1, NULL, NULL); /* inverse FFT, used just for synth */ - make_analysis_window(fft_fwd_cfg, w, W); - make_synthesis_window(Pn); - quantise_init(); - if (phaseexp) - pexp = phase_experiment_create(); - if (ampexp) - aexp = amp_experiment_create(); - - /*----------------------------------------------------------------*\ - - Main Loop - - \*----------------------------------------------------------------*/ - - frames = 0; - sum_snr = 0; - while(fread(buf,sizeof(short),N,fin)) { - frames++; - //printf("frame: %d ", frames); - - /* Read input speech */ - - for(i=0; i<M-N; i++) { - Sn[i] = Sn[i+N]; - Sn_pre[i] = Sn_pre[i+N]; - } - for(i=0; i<N; i++) - Sn[i+M-N] = buf[i]; - - pre_emp(&Sn_pre[M-N], &Sn[M-N], &pre_mem, N); - - - /*------------------------------------------------------------*\ - - Estimate Sinusoidal Model Parameters - - \*------------------------------------------------------------*/ - - nlp(nlp_states,Sn,N,P_MIN,P_MAX,&pitch,Sw,W,&prev_uq_Wo); - model.Wo = TWO_PI/pitch; - - dft_speech(fft_fwd_cfg, Sw, Sn, w); - two_stage_pitch_refinement(&model, Sw); - estimate_amplitudes(&model, Sw, W, 1); - uq_Wo = model.Wo; - - #ifdef DUMP - dump_Sn(Sn); dump_Sw(Sw); dump_model(&model); - #endif - - if (ampexp) - amp_experiment(aexp, &model, ampexp_arg); - - if (phaseexp) { - #ifdef DUMP - dump_phase(&model.phi[0], model.L); - #endif - phase_experiment(pexp, &model, phaseexp_arg); - #ifdef DUMP - dump_phase_(&model.phi[0], model.L); - #endif - } - - if (hi) { - int m; - for(m=1; m<model.L/2; m++) - model.A[m] = 0.0; - for(m=3*model.L/4; m<=model.L; m++) - model.A[m] = 0.0; - } - - /*------------------------------------------------------------*\ - - Zero-phase modelling - - \*------------------------------------------------------------*/ - - if (phase0) { - float Wn[M]; /* windowed speech samples */ - float Rk[LPC_MAX+1]; /* autocorrelation coeffs */ - - #ifdef DUMP - dump_phase(&model.phi[0], model.L); - #endif - - /* find aks here, these are overwritten if LPC modelling is enabled */ - - if (prede) { - for(i=0; i<M; i++) - Wn[i] = Sn_pre[i]*w[i]; - } - else { - - for(i=0; i<M; i++) - Wn[i] = Sn[i]*w[i]; - } - autocorrelate(Wn,Rk,M,order); - levinson_durbin(Rk,ak,order); - - /* determine voicing */ - - snr = est_voicing_mbe(&model, Sw, W, Sw_, Ew, prev_uq_Wo); - - if (dump_pitch_e) - fprintf(fjvm, "%f %f %d ", model.Wo, snr, model.voiced); - - //printf("snr %3.2f v: %d Wo: %f prev_Wo: %f\n", snr, model.voiced, - // model.Wo, prev_uq_Wo); - #ifdef DUMP - dump_Sw_(Sw_); - dump_Ew(Ew); - dump_snr(snr); - #endif - - /* just to make sure we are not cheating - kill all phases */ - - for(i=0; i<=MAX_AMP; i++) - model.phi[i] = 0; - - if (hand_voicing) { - fscanf(fvoicing,"%d\n",&model.voiced); - } - } - - /*------------------------------------------------------------*\ - - LPC model amplitudes and LSP quantisation - - \*------------------------------------------------------------*/ - - if (lpc_model) { - - if (prede) - e = speech_to_uq_lsps(lsps, ak, Sn_pre, w, order); - else - e = speech_to_uq_lsps(lsps, ak, Sn, w, order); - - #ifdef DUMP - dump_ak(ak, LPC_ORD); - #endif - - /* tracking down -ve energy values with BW expansion */ - /* - if (e < 0.0) { - int i; - FILE*f=fopen("x.txt","wt"); - for(i=0; i<M; i++) - fprintf(f,"%f\n", Sn[i]); - fclose(f); - printf("e = %f frames = %d\n", e, frames); - for(i=0; i<order; i++) - printf("%f ", ak[i]); - exit(0); - } - */ - - if (dump_pitch_e) - fprintf(fjvm, "%f\n", e); - - #ifdef DUMP - /* dump order is different if we are decimating */ - if (!decimate) - dump_lsp(lsps); - for(i=0; i<LPC_ORD; i++) - prev_lsps[i] = lsps[i]; - #endif - - /* various LSP quantisation schemes */ - - if (lsp) { - encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); - decode_lsps_scalar(lsps_, lsp_indexes, LPC_ORD); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - if (lspd) { - encode_lspds_scalar(lsp_indexes, lsps, LPC_ORD); - decode_lspds_scalar(lsps_, lsp_indexes, LPC_ORD); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - -#ifdef __EXPERIMENTAL__ - if (lspvq) { - lspvq_quantise(lsps, lsps_, LPC_ORD); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } -#endif - - if (lspjvm) { - /* Jean-Marc's multi-stage, split VQ */ - lspjvm_quantise(lsps, lsps_, LPC_ORD); - { - float lsps_bw[LPC_ORD]; - memcpy(lsps_bw, lsps_, sizeof(float)*LPC_ORD); - bw_expand_lsps(lsps_bw, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_bw, ak, LPC_ORD); - } - } - -#ifdef __EXPERIMENTAL__ - if (lspanssi) { - /* multi-stage VQ from Anssi Ramo OH3GDD */ - - lspanssi_quantise(lsps, lsps_, LPC_ORD, 5); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } -#endif - - /* experimenting with non-linear LSP spacing to see if - it's just noticable */ - - if (lspjnd) { - for(i=0; i<LPC_ORD; i++) - lsps_[i] = lsps[i]; - locate_lsps_jnd_steps(lsps_, LPC_ORD); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - /* Another experiment with non-linear LSP spacing, this - time using a scaled version of mel frequency axis - warping. The scaling is such that the integer output - can be directly sent over the channel. - */ - - if (lspmel) { - float f, f_; - int mel[LPC_ORD]; - - for(i=0; i<LPC_ORD; i++) { - f = (4000.0/PI)*lsps[i]; - mel[i] = floor(100.0*log10(1.0 + f/700.0) + 0.5); - } - - for(i=1; i<LPC_ORD; i++) { - if (mel[i] == mel[i-1]) - mel[i]++; - } - - #ifdef DUMP - dump_mel(mel); - #endif - - for(i=0; i<LPC_ORD; i++) { - f_ = 700.0*( pow(10.0, (float)mel[i]/100.0) - 1.0); - lsps_[i] = f_*(PI/4000.0); - } - /* - for(i=5; i<10; i++) { - lsps_[i] = lsps[i]; - } - */ - - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - /* we need lsp__prev[] for lspdt and decimate. If no - other LSP quantisation is used we use original LSPs as - there is no quantised version available. TODO: this is - mess, we should have structures and standard - nomenclature for previous frames values, lsp_[] - shouldn't be overwritten as we may want to dump it for - analysis. Re-design some time. - */ - - if (!lsp && !lspd && !lspvq && !lspres && !lspjvm && !lspanssi && !lspjnd && !lspmel) - for(i=0; i<LPC_ORD; i++) - lsps_[i] = lsps[i]; - - /* Odd frames are generated by quantising the difference - between the previous frames LSPs and this frames */ - -#ifdef __EXPERIMENTAL__ - if (lspdt && !decimate) { - if (frames%2) { - lspdt_quantise(lsps, lsps_, lsps__prev, lspdt_mode); - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - for(i=0; i<LPC_ORD; i++) - lsps__prev[i] = lsps_[i]; - } -#endif - - /* - When decimation is enabled we only send LSPs to the - decoder on odd frames. In the Delta-time LSPs case we - encode every second odd frame (i.e. every 3rd frame out - of 4) by quantising the difference between the 1st - frames LSPs and the 3rd frames: - - 10ms, frame 1: discard (interpolate at decoder) - 20ms, frame 2: send "full" LSP frame - 30ms, frame 3: discard (interpolate at decoder) - 40ms, frame 4: send LSPs differences between frame 4 and frame 2 - */ - - if (lspdt && decimate) { - /* print previous LSPs to make sure we are using the right set */ - if ((frames%4) == 0) { - //printf(" lspdt "); - //#define LSPDT - #ifdef LSPDT - lspdt_quantise(lsps, lsps_, lsps__prev2, lspdt_mode); - #else - for(i=0; i<LPC_ORD; i++) - lsps_[i] = lsps__prev2[i]; - #endif - bw_expand_lsps(lsps_, LPC_ORD, 50.0, 100.0); - lsp_to_lpc(lsps_, ak, LPC_ORD); - } - - for(i=0; i<LPC_ORD; i++) { - lsps__prev2[i] = lsps__prev[i]; - lsps__prev[i] = lsps_[i]; - } - } - #ifdef DUMP - /* if using decimated (20ms) frames we dump interp - LSPs below */ - if (!decimate) - dump_lsp_(lsps_); - #endif - - if (scalar_quant_Wo_e) { - - e = decode_energy(encode_energy(e)); - - if (!decimate) { - /* we send params every 10ms, delta-time every 20ms */ - if (dt && (frames % 2)) - model.Wo = decode_Wo_dt(encode_Wo_dt(model.Wo, prev_Wo),prev_Wo); - else - model.Wo = decode_Wo(encode_Wo(model.Wo)); - } - - if (decimate) { - /* we send params every 20ms */ - if (dt && ((frames % 4) == 0)) { - /* delta-time every 40ms */ - model.Wo = decode_Wo_dt(encode_Wo_dt(model.Wo, prev__Wo),prev__Wo); - } - else - model.Wo = decode_Wo(encode_Wo(model.Wo)); - } - - model.L = PI/model.Wo; /* if we quantise Wo re-compute L */ - } - - if (vector_quant_Wo_e) { - - /* JVM's experimental joint Wo & LPC energy quantiser */ - - //printf("\nWo %f e %f\n", model.Wo, e); - quantise_WoE(&model, &e, Woe_); - //printf("Wo %f e %f\n", model.Wo, e); - - } - - aks_to_M2(fft_fwd_cfg, ak, order, &model, e, &snr, 1, simlpcpf, lpcpf, 1, LPCPF_BETA, LPCPF_GAMMA); - apply_lpc_correction(&model); - - #ifdef DUMP - dump_ak_(ak, LPC_ORD); - #endif - - /* note SNR on interpolated frames can't be measured properly - by comparing Am as L has changed. We can dump interp lsps - and compare them, - */ - #ifdef DUMP - dump_lpc_snr(snr); - #endif - sum_snr += snr; - #ifdef DUMP - dump_quantised_model(&model); - #endif - } - - /*------------------------------------------------------------*\ - - Decimation to 20ms frame rate - - \*------------------------------------------------------------*/ - - if (decimate) { - float lsps_interp[LPC_ORD]; - - if (!phase0) { - printf("needs --phase0 to resample phase for interpolated Wo\n"); - exit(0); - } - if (!lpc_model) { - printf("needs --lpc 10 to resample amplitudes\n"); - exit(0); - } - - /* - Each 20ms we synthesise two 10ms frames: - - frame 1: discard except for voicing bit - frame 2: interpolate frame 1 LSPs from frame 2 and frame 0 - synthesise frame 1 and frame 2 speech - frame 3: discard except for voicing bit - frame 4: interpolate frame 3 LSPs from frame 4 and frame 2 - synthesise frame 3 and frame 4 speech - */ - - if ((frames%2) == 0) { - //printf("frame: %d\n", frames); - - /* decode interpolated frame */ - - interp_model.voiced = voiced1; - - interpolate_lsp(fft_fwd_cfg, &interp_model, &prev_model, &model, - prev_lsps_, prev_e, lsps_, e, ak_interp, lsps_interp); - apply_lpc_correction(&interp_model); - - /* used to compare with c2enc/c2dec version - - printf(" Wo: %1.5f L: %d v1: %d prev_e: %f\n", - interp_model.Wo, interp_model.L, interp_model.voiced, prev_e); - printf(" lsps_interp: "); - for(i=0; i<LPC_ORD; i++) - printf("%5.3f ", lsps_interp[i]); - printf("\n A..........: "); - for(i=0; i<10; i++) - printf("%5.3f ",interp_model.A[i]); - - printf("\n Wo: %1.5f L: %d e: %3.2f v2: %d\n", - model.Wo, model.L, e, model.voiced); - printf(" lsps_......: "); - for(i=0; i<LPC_ORD; i++) - printf("%5.3f ", lsps_[i]); - printf("\n A..........: "); - for(i=0; i<10; i++) - printf("%5.3f ",model.A[i]); - printf("\n"); - */ - - #ifdef DUMP - /* do dumping here so we get lsp dump file in correct order */ - dump_lsp(prev_lsps); - dump_lsp(lsps_interp); - dump_lsp(lsps); - dump_lsp(lsps_); - #endif - - if (phase0) - phase_synth_zero_order(fft_fwd_cfg, &interp_model, ak_interp, ex_phase, - order); - if (postfilt) - postfilter(&interp_model, &bg_est); - synth_one_frame(fft_inv_cfg, buf, &interp_model, Sn_, Pn, prede, &de_mem, gain); - //printf(" buf[0] %d\n", buf[0]); - if (fout != NULL) - fwrite(buf,sizeof(short),N,fout); - - /* decode this frame */ - - if (phase0) - phase_synth_zero_order(fft_fwd_cfg, &model, ak, ex_phase, order); - if (postfilt) - postfilter(&model, &bg_est); - synth_one_frame(fft_inv_cfg, buf, &model, Sn_, Pn, prede, &de_mem, gain); - //printf(" buf[0] %d\n", buf[0]); - if (fout != NULL) - fwrite(buf,sizeof(short),N,fout); - - /* update states for next time */ - - prev_model = model; - for(i=0; i<LPC_ORD; i++) - prev_lsps_[i] = lsps_[i]; - prev_e = e; - } - else { - voiced1 = model.voiced; - } - } - else { - /* no decimation - sythesise each 10ms frame immediately */ - - if (phase0) - phase_synth_zero_order(fft_fwd_cfg, &model, ak, ex_phase, order); - - if (postfilt) - postfilter(&model, &bg_est); - synth_one_frame(fft_inv_cfg, buf, &model, Sn_, Pn, prede, &de_mem, gain); - if (fout != NULL) fwrite(buf,sizeof(short),N,fout); - } - - prev__Wo = prev_Wo; - prev_Wo = model.Wo; - prev_uq_Wo = uq_Wo; - //if (frames == 8) { - // exit(0); - //} - } - - /*----------------------------------------------------------------*\ - - End Main Loop - - \*----------------------------------------------------------------*/ - - fclose(fin); - - if (fout != NULL) - fclose(fout); - - if (lpc_model) - printf("SNR av = %5.2f dB\n", sum_snr/frames); - - if (phaseexp) - phase_experiment_destroy(pexp); - if (ampexp) - amp_experiment_destroy(aexp); - #ifdef DUMP - if (dump) - dump_off(); - #endif - - if (hand_voicing) - fclose(fvoicing); - - nlp_destroy(nlp_states); - - return 0; -} - -void synth_one_frame(kiss_fft_cfg fft_inv_cfg, short buf[], MODEL *model, float Sn_[], float Pn[], int prede, float *de_mem, float gain) -{ - int i; - - synthesise(fft_inv_cfg, Sn_, model, Pn, 1); - if (prede) - de_emp(Sn_, Sn_, de_mem, N); - - for(i=0; i<N; i++) { - Sn_[i] *= gain; - if (Sn_[i] > 32767.0) - buf[i] = 32767; - else if (Sn_[i] < -32767.0) - buf[i] = -32767; - else - buf[i] = Sn_[i]; - } - -} - -void print_help(const struct option* long_options, int num_opts, char* argv[]) -{ - int i; - char *option_parameters; - - fprintf(stderr, "\nCodec2 - low bit rate speech codec - Simulation Program\n" - "\thttp://rowetel.com/codec2.html\n\n" - "usage: %s [OPTIONS] <InputFile>\n\n" - "Options:\n" - "\t-o <OutputFile>\n", argv[0]); - for(i=0; i<num_opts-1; i++) { - if(long_options[i].has_arg == no_argument) { - option_parameters=""; - } else if (strcmp("lpc", long_options[i].name) == 0) { - option_parameters = " <Order>"; - } else if (strcmp("lspdt_mode", long_options[i].name) == 0) { - option_parameters = " <all|high|low>"; - } else if (strcmp("hand_voicing", long_options[i].name) == 0) { - option_parameters = " <VoicingFile>"; - } else if (strcmp("dump_pitch_e", long_options[i].name) == 0) { - option_parameters = " <Dump File>"; - } else if (strcmp("rate", long_options[i].name) == 0) { - option_parameters = " <4800|2400|1400|1200>"; - } else if (strcmp("dump", long_options[i].name) == 0) { - option_parameters = " <DumpFilePrefix>"; - } else { - option_parameters = " <UNDOCUMENTED parameter>"; - } - fprintf(stderr, "\t--%s%s\n", long_options[i].name, option_parameters); - } - exit(1); -} diff --git a/gr-vocoder/lib/codec2/codebook/dlsp1.txt b/gr-vocoder/lib/codec2/codebook/dlsp1.txt deleted file mode 100644 index 058d048d3c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp1.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 -725 -750 -775 -800 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp10.txt b/gr-vocoder/lib/codec2/codebook/dlsp10.txt deleted file mode 100644 index 058d048d3c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp10.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 -725 -750 -775 -800 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp2.txt b/gr-vocoder/lib/codec2/codebook/dlsp2.txt deleted file mode 100644 index 058d048d3c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp2.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 -725 -750 -775 -800 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp3.txt b/gr-vocoder/lib/codec2/codebook/dlsp3.txt deleted file mode 100644 index 058d048d3c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp3.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 -725 -750 -775 -800 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp4.txt b/gr-vocoder/lib/codec2/codebook/dlsp4.txt deleted file mode 100644 index 4a5e9902a4..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp4.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -250 -300 -350 -400 -450 -500 -550 -600 -650 -700 -750 -800 -850 -900 -950 -1000 -1050 -1100 -1150 -1200 -1250 -1300 -1350 -1400 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp5.txt b/gr-vocoder/lib/codec2/codebook/dlsp5.txt deleted file mode 100644 index 4a5e9902a4..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp5.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -250 -300 -350 -400 -450 -500 -550 -600 -650 -700 -750 -800 -850 -900 -950 -1000 -1050 -1100 -1150 -1200 -1250 -1300 -1350 -1400 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp6.txt b/gr-vocoder/lib/codec2/codebook/dlsp6.txt deleted file mode 100644 index 4a5e9902a4..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp6.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -250 -300 -350 -400 -450 -500 -550 -600 -650 -700 -750 -800 -850 -900 -950 -1000 -1050 -1100 -1150 -1200 -1250 -1300 -1350 -1400 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp7.txt b/gr-vocoder/lib/codec2/codebook/dlsp7.txt deleted file mode 100644 index 058d048d3c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp7.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 -725 -750 -775 -800 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp8.txt b/gr-vocoder/lib/codec2/codebook/dlsp8.txt deleted file mode 100644 index 058d048d3c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp8.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 -725 -750 -775 -800 - - diff --git a/gr-vocoder/lib/codec2/codebook/dlsp9.txt b/gr-vocoder/lib/codec2/codebook/dlsp9.txt deleted file mode 100644 index 058d048d3c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/dlsp9.txt +++ /dev/null @@ -1,35 +0,0 @@ -1 32 -25 -50 -75 -100 -125 -150 -175 -200 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 -725 -750 -775 -800 - - diff --git a/gr-vocoder/lib/codec2/codebook/gecb.txt b/gr-vocoder/lib/codec2/codebook/gecb.txt deleted file mode 100644 index bd3bb08a4a..0000000000 --- a/gr-vocoder/lib/codec2/codebook/gecb.txt +++ /dev/null @@ -1,257 +0,0 @@ -2 256 -2.709998 12.018395 -0.046750 -2.738813 -0.120993 8.388947 --1.580275 -0.892307 -1.193065 -1.915609 -0.187101 -3.276788 -0.332251 -7.664550 --1.479436 31.246122 -1.527612 27.709463 --0.524379 5.250122 -0.553330 7.438797 --0.843451 -1.952987 -2.263885 8.610286 -0.143143 2.365493 -0.616506 1.284268 --1.711327 22.096672 -1.008128 17.396519 --0.106718 1.418905 --0.136246 14.273605 --1.709087 -20.531881 -1.657866 -3.391068 -0.138049 -4.957845 -0.536729 -1.943748 -0.196307 36.851948 -1.272479 22.556494 --0.670219 -1.906045 -0.382092 6.401132 --0.756911 -4.901017 -1.829313 4.613800 -0.318794 0.736830 -0.612815 -2.075045 --0.410151 24.787077 -1.776016 13.190924 -0.106457 -0.104492 -0.192206 10.183844 --1.824423 -7.715654 -0.931346 4.348355 -0.308813 -4.086001 -0.397143 -11.808859 --0.048715 41.227314 -0.877342 35.850311 --0.759794 0.476634 -0.978593 7.674673 --1.195056 3.038826 -2.639894 -3.411063 -0.191127 3.603507 -0.402932 1.084298 --2.152022 18.107616 -1.546802 8.322713 --0.143089 -4.075922 --0.150142 5.866741 --1.408444 -3.250696 -1.566148 -10.413164 -0.178171 -10.226697 -0.362164 -0.028556 --0.070125 24.390722 -0.594752 17.482765 --0.286980 -6.904069 -0.464818 10.205451 --1.006841 -14.357209 -2.329569 -3.691613 -0.335745 2.407139 -1.019658 -3.155647 --1.259455 7.991899 -2.383695 19.680567 --0.094947 -2.413742 -0.209330 6.664768 --2.221034 1.379860 -1.292387 2.046333 -0.243626 -0.890741 -0.428773 -7.193658 --1.113744 41.341354 -2.609799 31.140514 --0.446468 2.534188 -0.490104 4.627575 --1.117226 -3.241744 -1.791562 8.414926 -0.156012 0.183336 -0.532447 3.154545 --0.764484 18.513958 -0.952395 11.771298 --0.332567 0.346987 -0.202165 14.716752 --2.129240 -15.558954 -1.353583 -1.926790 --0.010963 -16.336386 -0.399053 -2.790569 -0.750657 31.148336 -0.655743 24.481859 --0.453210 -0.735879 -0.286900 6.546703 --0.715673 -12.357815 -1.548488 3.872171 -0.271874 0.802339 -0.502073 -4.854850 --0.497037 17.761904 -1.191161 13.954446 -0.015630 1.331566 -0.341867 8.935369 --2.316009 -5.395058 -0.758610 1.964505 -0.241320 -3.237686 -0.267151 -11.234388 --0.273126 32.624771 -1.753523 40.431995 --0.784011 3.045757 -0.705987 5.661178 --1.386400 1.353557 -2.376458 1.674851 -0.242973 4.732178 -0.491227 0.354061 --1.606762 8.658955 -1.167111 5.987103 --0.137601 -12.041750 --0.251375 10.397204 --1.431514 -8.904108 -0.988280 -13.208963 -0.261484 -6.354970 -0.395932 -0.702529 -0.283704 26.899563 -0.420959 15.441778 --0.355804 -13.727784 -0.527372 12.398515 --1.169559 -15.998457 -1.906688 -5.816055 -0.354492 3.851572 -0.825760 -4.162642 --0.490190 13.057229 -2.255773 13.526449 --0.004956 -3.237127 -0.026709 7.866448 --1.810372 -0.451183 -1.083827 -0.183620 -0.135836 -2.266582 -0.375812 -5.512248 --1.966443 38.682854 -1.977988 24.565481 --0.704656 6.358810 -0.480786 7.051749 --0.976417 -2.422727 -2.502148 6.759346 -0.083588 3.258795 -0.543629 0.910013 --1.231959 23.091507 -0.785492 14.807000 --0.213554 1.688002 -0.004748 18.171820 --1.547192 -16.116837 -1.501045 -3.281141 -0.080133 -4.634724 -0.476592 -2.180929 -0.442470 40.303989 -1.072766 27.592009 --0.594738 -4.166807 -0.422480 7.616091 --0.927521 -7.274406 -1.991623 1.296359 -0.291307 2.398781 -0.721081 -1.950625 --0.804256 24.929474 -1.648388 19.119692 -0.060852 -0.590639 -0.266085 9.103249 --1.957399 -2.884607 -1.116929 2.672397 -0.354580 -2.748541 -0.330733 -14.156131 --0.527851 39.575626 -0.991152 43.194984 --0.589619 1.269186 -0.787401 8.730713 --1.013800 1.025075 -2.825403 1.895381 -0.240890 2.745566 -0.427195 2.544456 --1.953109 12.243958 -1.448616 12.060747 --0.210492 -3.379058 --0.056713 10.204020 --1.652370 -5.102737 -1.294748 -12.270802 -0.111608 -8.675921 -0.326634 -1.167627 -0.021781 31.125782 -0.455335 21.468430 --0.375440 -3.371207 -0.393620 11.301987 --0.851456 -19.414892 -2.107030 -2.228865 -0.373233 1.924056 -0.884438 -1.720581 --0.975127 9.840128 -2.003303 17.395407 --0.036915 -1.111372 -0.148456 5.399970 --1.914412 4.773819 -1.447907 0.537122 -0.194979 -1.038179 -0.495771 -9.955025 --1.058987 32.947052 -2.011222 32.454418 --0.309650 4.719106 -0.436082 4.635524 --1.237105 -1.254284 -2.022740 9.428345 -0.190342 1.460767 -0.479017 2.484788 --1.078483 16.221748 -1.207642 9.654212 --0.258087 -1.672358 -0.071852 13.415978 --1.877228 -16.072031 -1.289568 -4.871185 -0.067713 -13.442700 -0.435551 -4.165503 -0.466140 30.589535 -0.904895 21.597990 --0.518369 -2.532048 -0.337363 5.637264 --0.554975 -17.400511 -1.691879 1.145742 -0.227934 0.889297 -0.587303 -5.729732 --0.262133 18.666620 -1.395048 17.002878 --0.019090 4.308379 -0.304235 12.669943 --2.074059 -6.460845 -0.920546 1.212957 -0.284927 -1.785466 -0.209724 -16.023964 --0.636067 31.576820 -1.349887 34.677502 --0.971625 5.300859 -0.590249 4.449709 --1.567867 3.602385 -2.145497 4.516663 -0.296022 4.120170 -0.445299 0.868772 --1.441931 14.128431 -1.355752 6.007401 --0.012814 -7.496573 --0.430000 8.500124 --1.204693 -7.113256 -1.101018 -6.836818 -0.196463 -6.234002 -0.436747 -1.129788 -0.141052 22.854876 -0.290821 18.811443 --0.529536 -7.732510 -0.634280 10.789847 --1.334721 -20.325773 -1.815645 -1.903316 -0.394778 3.797577 -0.732682 -8.183819 --0.741244 11.768337 diff --git a/gr-vocoder/lib/codec2/codebook/lsp1.txt b/gr-vocoder/lib/codec2/codebook/lsp1.txt deleted file mode 100644 index d126be7714..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp1.txt +++ /dev/null @@ -1,17 +0,0 @@ -1 16 -225 -250 -275 -300 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 diff --git a/gr-vocoder/lib/codec2/codebook/lsp10.txt b/gr-vocoder/lib/codec2/codebook/lsp10.txt deleted file mode 100644 index 39aab7c568..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp10.txt +++ /dev/null @@ -1,6 +0,0 @@ -1 4 -2900 -3100 -3300 -3500 - diff --git a/gr-vocoder/lib/codec2/codebook/lsp2.txt b/gr-vocoder/lib/codec2/codebook/lsp2.txt deleted file mode 100644 index 597f149653..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp2.txt +++ /dev/null @@ -1,17 +0,0 @@ -1 16 -325 -350 -375 -400 -425 -450 -475 -500 -525 -550 -575 -600 -625 -650 -675 -700 diff --git a/gr-vocoder/lib/codec2/codebook/lsp3.txt b/gr-vocoder/lib/codec2/codebook/lsp3.txt deleted file mode 100644 index 36a64b158e..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp3.txt +++ /dev/null @@ -1,17 +0,0 @@ -1 16 -500 -550 -600 -650 -700 -750 -800 -850 -900 -950 -1000 -1050 -1100 -1150 -1200 -1250 diff --git a/gr-vocoder/lib/codec2/codebook/lsp4.txt b/gr-vocoder/lib/codec2/codebook/lsp4.txt deleted file mode 100644 index 53a90bd8c5..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp4.txt +++ /dev/null @@ -1,17 +0,0 @@ -1 16 -700 -800 -900 -1000 -1100 -1200 -1300 -1400 -1500 -1600 -1700 -1800 -1900 -2000 -2100 -2200 diff --git a/gr-vocoder/lib/codec2/codebook/lsp45678910.txt b/gr-vocoder/lib/codec2/codebook/lsp45678910.txt deleted file mode 100644 index 291d3cdbce..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp45678910.txt +++ /dev/null @@ -1,4097 +0,0 @@ -6 4096 -1.081234 1.578844 1.855572 1.937313 2.532441 2.649806 -1.062804 1.450009 1.839560 1.956503 2.488847 2.653463 -1.101587 1.361019 1.833584 1.932414 2.505176 2.629812 -1.079058 1.376855 1.872688 1.955078 2.541337 2.633780 -1.095536 1.631036 1.866273 2.066987 2.506661 2.570431 -1.093059 1.561358 1.772473 2.123863 2.547475 2.618258 -1.093649 1.500206 1.786047 2.077115 2.483767 2.572542 -1.035022 1.485983 1.678652 2.079363 2.402344 2.513315 -1.231720 1.630566 1.849906 2.023447 2.467212 2.571610 -1.206362 1.478193 1.855647 2.009197 2.437429 2.552382 -1.204249 1.495756 1.846404 2.039977 2.500628 2.592437 -1.272025 1.438353 1.854503 2.038713 2.518717 2.620094 -1.298912 1.483356 1.838869 1.983659 2.488374 2.597006 -1.385591 1.500184 1.819431 1.981705 2.505537 2.612529 -1.413670 1.566546 1.767180 1.994490 2.569613 2.625244 -1.469053 1.626083 1.751768 2.041187 2.608951 2.658775 -1.489505 1.617638 1.689177 2.053852 2.662243 2.705533 -1.431122 1.535578 1.647319 1.810924 2.575767 2.692196 -1.411673 1.606174 1.730361 1.969368 2.628110 2.691849 -1.341020 1.639970 2.197392 2.281319 2.449714 2.625998 -1.319877 1.674826 2.101177 2.281732 2.499782 2.611482 -1.274620 1.610124 1.901436 2.235657 2.518178 2.628876 -1.172210 1.365637 1.784703 1.904448 2.538076 2.646190 -1.096161 1.350109 1.754990 1.869673 2.486568 2.605496 -1.036538 1.326195 1.729890 1.862116 2.461192 2.575454 -1.016529 1.277247 1.688801 1.808376 2.462981 2.576244 -0.968031 1.329007 1.716412 1.821357 2.481150 2.561950 -0.940641 1.283342 1.767876 1.860537 2.503139 2.594903 -0.926995 1.243331 1.738909 1.901001 2.449501 2.557636 -0.839883 1.237117 1.702150 1.812616 2.421388 2.492978 -0.924474 1.188075 1.757524 1.824899 2.455944 2.611065 -0.964230 1.207274 1.666224 1.876812 2.507149 2.580412 -0.989772 1.189729 1.693447 1.807142 2.445712 2.561953 -0.919183 1.203118 1.673832 1.772614 2.385797 2.511668 -0.978552 1.175420 1.613855 1.726871 2.328959 2.516699 -1.014543 1.254251 1.587284 1.756626 2.403061 2.510828 -1.096718 1.231168 1.557405 1.843944 2.463584 2.555458 -1.168771 1.351177 1.613931 1.831029 2.476269 2.581218 -1.176515 1.264150 1.564916 1.760486 2.483522 2.581045 -1.017969 1.249828 1.424493 1.593545 2.458340 2.525030 -1.053988 1.216029 1.517421 1.851941 2.342751 2.502327 -0.908986 1.250795 1.593917 1.887100 2.373089 2.530129 -0.993871 1.164018 1.616620 1.775732 2.569459 2.658570 -1.102483 1.386153 1.573681 1.785642 2.317931 2.508557 -1.207240 1.390831 1.551049 1.850614 2.335983 2.494330 -0.905032 1.416478 1.580046 1.841825 2.503807 2.601603 -0.795890 1.107933 1.597705 2.015496 2.402148 2.534611 -0.732401 1.158610 1.557468 1.938003 2.626415 2.705430 -0.859670 1.129062 1.671859 1.953992 2.514790 2.615870 -0.921647 1.245355 1.683753 1.894457 2.599645 2.716564 -0.845409 1.194759 1.767314 1.844514 2.589767 2.716944 -0.977678 1.141401 1.667109 1.923833 2.632008 2.689070 -0.951137 1.122551 1.714183 1.885895 2.535763 2.672112 -1.029949 1.159554 1.739443 1.928325 2.488185 2.623518 -0.925634 1.225929 1.751801 1.970749 2.532895 2.621066 -1.012300 1.211427 1.793946 1.885857 2.467267 2.572492 -0.993978 1.137467 1.743472 1.840886 2.390082 2.566385 -0.989822 1.173068 1.687559 1.948929 2.325527 2.473423 -0.955854 1.237231 1.807406 2.116766 2.391031 2.502779 -1.103361 1.357985 1.852236 2.097091 2.392749 2.553242 -1.128873 1.440897 1.927907 2.176697 2.407985 2.544276 -1.316127 1.575436 1.964565 2.158944 2.485840 2.576132 -1.469605 1.772101 1.954837 2.164070 2.399616 2.481917 -1.506520 1.754882 2.018413 2.249491 2.486272 2.607615 -1.524190 1.776451 2.054579 2.275694 2.584977 2.669083 -1.518000 1.850281 2.026435 2.301875 2.577528 2.669180 -1.422050 1.788979 1.967476 2.184773 2.596851 2.699678 -1.208408 1.434703 1.923623 2.003769 2.602930 2.685007 -1.221170 1.436565 1.879969 2.033402 2.498146 2.695421 -1.217714 1.375982 1.908609 1.973031 2.480559 2.645396 -1.200348 1.412239 1.863276 2.054536 2.409232 2.646327 -1.439453 1.675933 2.064707 2.273226 2.606450 2.696215 -1.547568 1.956021 2.083785 2.387077 2.634316 2.711216 -1.745365 1.995260 2.176270 2.409488 2.632251 2.707416 -1.819289 1.982164 2.210166 2.452194 2.603770 2.664517 -1.669555 1.940179 2.100875 2.386942 2.530819 2.630866 -1.597684 1.945913 2.072836 2.338891 2.544245 2.608247 -1.656152 1.888690 1.984550 2.301133 2.510775 2.586360 -1.618800 1.898863 2.024738 2.291312 2.440530 2.560289 -1.481284 1.826210 1.971921 2.192909 2.417020 2.530293 -1.318733 1.581540 1.845445 2.163997 2.389227 2.505418 -1.341326 1.565852 1.802875 2.218482 2.430769 2.545834 -1.318506 1.412657 1.677620 2.182351 2.372753 2.476532 -1.243720 1.456674 1.665712 2.126711 2.332874 2.438449 -1.152502 1.458855 1.582937 2.037521 2.342102 2.428296 -1.025383 1.407599 1.551528 1.846789 2.282863 2.385436 -0.876560 1.384326 1.582900 1.741935 2.239923 2.338453 -0.953781 1.441879 1.592404 1.764174 2.294091 2.474201 -0.899968 1.454031 1.634363 1.724312 2.353403 2.597502 -0.784159 1.423933 1.737258 1.855960 2.390032 2.614540 -0.802442 1.397066 1.658548 1.816788 2.429390 2.500099 -0.863071 1.318492 1.646022 1.812971 2.398098 2.503855 -0.896870 1.306239 1.671592 1.902175 2.466526 2.601523 -0.999503 1.304292 1.708420 1.899036 2.512342 2.655191 -1.045277 1.266302 1.669631 1.846323 2.517066 2.637484 -1.038456 1.158529 1.643778 1.865279 2.583201 2.658938 -1.026317 1.219306 1.768348 1.840920 2.538168 2.673329 -1.080965 1.215431 1.730192 1.836927 2.236858 2.608870 -1.101801 1.431508 1.752078 1.918964 2.091244 2.538958 -1.178729 1.297314 1.724099 1.850753 2.310291 2.621525 -1.151182 1.239683 1.754792 1.850524 2.539101 2.705992 -1.202697 1.300604 1.763340 1.867428 2.470717 2.664655 -1.261122 1.368681 1.753282 1.846646 2.461515 2.652599 -1.263075 1.364289 1.797670 1.876939 2.543725 2.660224 -1.320149 1.415925 1.809830 1.903217 2.515554 2.648236 -1.339872 1.459354 1.806677 1.924576 2.491477 2.587047 -1.355170 1.451772 1.763405 1.944161 2.472633 2.561167 -1.327925 1.428910 1.704448 1.914816 2.397366 2.503472 -1.307600 1.415352 1.616295 1.840793 2.322166 2.470994 -1.248247 1.349207 1.617615 1.772735 2.250680 2.486533 -1.096572 1.355681 1.626115 1.941988 2.313846 2.498213 -1.012526 1.342839 1.647854 1.907164 2.435934 2.533191 -0.944393 1.399280 1.642998 1.931993 2.331977 2.489908 -0.883306 1.402338 1.706359 2.025366 2.373713 2.543710 -0.829559 1.235771 1.712746 2.184853 2.386736 2.544183 -0.923799 1.513109 1.703086 2.105291 2.476476 2.555162 -0.772688 1.443301 1.656120 2.053011 2.450442 2.532517 -0.776285 1.403196 1.734016 1.935257 2.464085 2.566799 -0.782396 1.418811 1.758875 1.973225 2.548330 2.610298 -0.789572 1.411082 1.771533 2.060410 2.540262 2.631254 -0.774326 1.288019 1.837269 1.960951 2.512420 2.581626 -0.811751 1.274027 1.810006 1.885738 2.565463 2.639219 -0.844982 1.320831 1.873915 1.944600 2.561048 2.661720 -0.881256 1.695357 1.906981 2.078886 2.618546 2.678654 -1.099890 1.727818 1.971319 2.153135 2.509688 2.602947 -1.173850 1.685437 1.917457 2.147432 2.383055 2.567035 -1.101548 1.543219 1.820605 2.055324 2.338724 2.585028 -0.975012 1.379716 1.776625 2.033293 2.194151 2.518224 -0.967054 1.082459 1.618973 2.077928 2.206837 2.370886 -1.009607 1.120613 1.534181 2.088528 2.282936 2.420584 -0.899159 1.208523 1.423691 1.970324 2.287269 2.498904 -0.879682 1.314480 1.479489 1.689360 2.209743 2.285765 -1.033473 1.243843 1.473137 1.667992 2.159422 2.255044 -1.048412 1.255890 1.536997 1.820047 2.142252 2.313751 -1.048246 1.189264 1.705109 1.835993 2.105450 2.372062 -1.034320 1.138878 1.514616 1.829657 2.170447 2.425608 -1.103878 1.217645 1.622150 1.805848 2.027526 2.376811 -1.087235 1.195012 1.559018 1.895036 2.250122 2.379205 -1.130013 1.293868 1.692397 1.858880 2.197201 2.349063 -1.162892 1.304601 1.691021 1.969323 2.268614 2.430288 -1.151808 1.257932 1.673832 1.902017 2.189155 2.458708 -1.168445 1.271828 1.557328 2.084152 2.308031 2.420367 -1.235095 1.340187 1.656794 2.095155 2.283187 2.409638 -1.252394 1.355363 1.609848 2.085193 2.332714 2.488870 -1.226314 1.343994 1.673049 2.215533 2.459996 2.546921 -1.408182 1.566449 1.701931 2.155097 2.540243 2.588591 -1.303998 1.548995 1.653578 2.128738 2.589470 2.633320 -1.312529 1.488936 1.690548 1.982880 2.558390 2.622521 -1.303590 1.485664 1.772996 1.991417 2.555629 2.650059 -1.257202 1.528917 1.880489 2.045674 2.400087 2.567493 -1.294719 1.634324 1.911539 2.046657 2.438083 2.611133 -1.328444 1.716065 1.850301 2.021260 2.507052 2.612864 -1.138077 1.269039 1.792588 1.898148 2.530410 2.653563 -1.024794 1.145542 1.688222 1.812928 2.425037 2.650928 -1.056656 1.178042 1.590336 1.747349 2.368449 2.618711 -0.994299 1.110839 1.632651 1.730538 2.337688 2.550296 -0.960030 1.103482 1.632800 1.745079 2.197252 2.530535 -0.952099 1.078914 1.704160 1.837306 2.319065 2.544307 -0.901034 1.074801 1.653662 1.788590 2.393831 2.533117 -0.970595 1.130054 1.568353 1.820966 2.445105 2.563373 -0.883200 1.029140 1.480583 1.884365 2.321620 2.470715 -0.817959 0.941844 1.410138 1.540709 2.174043 2.482774 -0.772028 0.888033 1.490117 1.717092 2.324349 2.560462 -0.874200 1.020101 1.571479 1.746811 2.437393 2.561332 -0.827282 1.010026 1.605382 1.750680 2.261846 2.481604 -0.790605 1.149000 1.653820 1.781055 2.358642 2.491606 -0.746581 0.961080 1.604908 1.879005 2.319270 2.551585 -0.845418 0.969530 1.696169 1.890927 2.301880 2.621489 -0.826083 1.016050 1.658604 1.852554 2.435884 2.572744 -0.804260 0.948999 1.684490 2.103337 2.475054 2.575853 -0.837016 1.029999 1.676991 1.796645 2.498023 2.631032 -0.779629 0.917041 1.607073 1.868904 2.459568 2.628902 -0.802981 0.922379 1.556141 1.967845 2.595450 2.692512 -0.821239 0.952349 1.585249 2.095797 2.593711 2.655934 -0.819528 1.109552 1.526845 1.767514 2.637798 2.710511 -0.846222 1.055717 1.707281 1.838626 2.113999 2.501403 -0.956553 1.439848 1.724902 1.939820 2.145194 2.431913 -1.334292 1.551594 1.721399 2.019173 2.178003 2.329439 -1.247359 1.571459 1.834521 2.114156 2.268206 2.489811 -1.223145 1.573420 1.846247 2.016089 2.219280 2.457849 -1.239932 1.537791 1.822800 2.046476 2.444455 2.578055 -1.299681 1.557742 1.798304 2.080692 2.393370 2.575201 -1.273117 1.474131 1.814869 2.014907 2.405011 2.602918 -1.229029 1.448502 1.757153 2.050565 2.417160 2.594614 -1.206296 1.515099 1.788958 2.042150 2.368561 2.585804 -1.158903 1.544803 1.861448 2.066653 2.405246 2.590991 -1.203257 1.479859 1.833516 2.070616 2.431802 2.585701 -1.170767 1.555780 1.826674 2.077078 2.467476 2.619408 -1.116279 1.593527 1.824249 2.160817 2.427806 2.600491 -1.250314 1.617299 1.962648 2.152242 2.531239 2.631433 -1.352996 1.645245 2.070194 2.180379 2.612026 2.688774 -1.460334 1.917189 2.086815 2.314592 2.641184 2.723059 -1.557095 1.916613 2.056898 2.263201 2.640329 2.702797 -1.410674 1.903388 2.077833 2.222944 2.615402 2.694117 -1.340491 1.804040 2.040016 2.149565 2.607705 2.678152 -1.090681 1.321064 1.862736 1.983775 2.475855 2.592436 -1.002459 1.265507 1.813017 1.904336 2.499258 2.626541 -1.051386 1.161286 1.832534 1.955080 2.502338 2.624753 -0.942516 1.064243 1.669560 1.977253 2.464181 2.598328 -0.869608 0.984141 1.454614 1.956177 2.507893 2.617868 -0.972489 1.135467 1.529146 1.729979 2.411574 2.571077 -1.051275 1.149410 1.547524 1.827149 2.511333 2.617618 -1.079744 1.191206 1.539363 1.944728 2.545236 2.632156 -1.182063 1.260030 1.596098 2.084659 2.511859 2.579406 -1.172004 1.352761 1.462749 2.015059 2.625356 2.679374 -1.200545 1.322975 1.515601 1.769202 2.523140 2.666825 -1.228092 1.307135 1.734031 1.914746 2.244815 2.562025 -1.176188 1.321661 1.782310 1.882580 2.271364 2.521450 -1.150025 1.486223 1.774146 1.970935 2.385075 2.612636 -1.103163 1.455003 1.720622 1.899593 2.356715 2.591383 -1.070467 1.386313 1.746928 1.891984 2.367512 2.543572 -0.953610 1.176163 1.643545 1.919980 2.372057 2.572461 -1.052319 1.405171 1.688954 1.831668 2.542879 2.632479 -0.996802 1.441427 1.684462 1.821948 2.595992 2.658845 -1.026550 1.334938 1.740944 1.840382 2.571653 2.678967 -1.108319 1.200840 1.706127 1.999085 2.514665 2.648206 -1.133324 1.219468 1.747774 2.013077 2.406643 2.640363 -1.142143 1.218723 1.814638 1.951061 2.430067 2.666180 -1.081563 1.207089 1.846455 1.946284 2.339144 2.612659 -1.146374 1.238625 1.874251 1.968098 2.427377 2.595630 -1.069408 1.393128 1.859759 1.941816 2.374471 2.538181 -1.060221 1.402928 1.784643 1.909954 2.080852 2.375424 -0.893759 1.225333 1.741426 1.895488 2.062213 2.441777 -0.911307 1.301394 1.651487 1.798169 1.996879 2.208655 -1.102905 1.503307 1.707775 1.808533 1.958631 2.311679 -1.149446 1.328058 1.738279 1.904609 2.061868 2.257965 -1.121345 1.230563 1.748776 1.950661 2.086466 2.389286 -0.948970 1.101893 1.676635 1.875393 2.016817 2.296681 -1.035082 1.162231 1.641377 1.952709 2.100948 2.358717 -0.994183 1.114307 1.547601 1.773728 1.966081 2.336299 -1.025110 1.139705 1.585236 1.912371 2.102465 2.482426 -0.955352 1.062216 1.659060 1.848407 2.043281 2.487426 -1.049103 1.120549 1.446982 1.949018 2.026898 2.560590 -1.012432 1.138276 1.367936 2.008468 2.189441 2.422416 -1.082028 1.234911 1.351755 1.827170 2.173158 2.300241 -1.094359 1.235138 1.416416 1.922593 2.128232 2.419413 -1.034512 1.151307 1.492358 1.980846 2.149036 2.365312 -1.013088 1.154539 1.459958 1.943044 2.281758 2.397269 -0.987103 1.274347 1.561873 1.917460 2.334292 2.495651 -0.989791 1.289172 1.623138 1.982329 2.345033 2.548052 -1.042013 1.225970 1.610016 1.974800 2.406311 2.537036 -1.019690 1.323725 1.679076 1.983690 2.443023 2.561932 -1.030978 1.249914 1.753285 1.970302 2.442750 2.577102 -1.078647 1.281367 1.821676 2.046994 2.512487 2.614303 -1.042503 1.318276 1.817538 1.977740 2.538774 2.643473 -1.033751 1.323431 1.885960 1.993635 2.587127 2.648293 -1.084158 1.434121 1.899660 1.974483 2.661669 2.717102 -1.095790 1.481301 1.916550 1.970409 2.671232 2.730973 -1.147960 1.553068 1.884541 1.960664 2.501839 2.667876 -1.137776 1.498910 1.962620 2.047239 2.537310 2.642351 -1.108862 1.435492 1.955490 2.195866 2.514284 2.601530 -1.191071 1.557850 1.984542 2.270790 2.541878 2.642064 -1.110737 1.553081 1.978127 2.211052 2.613375 2.706641 -1.114093 1.728016 1.975042 2.124483 2.602927 2.681942 -1.148485 1.627087 1.968135 2.073898 2.607358 2.686667 -1.109004 1.450655 1.961102 2.058609 2.611646 2.694610 -1.095904 1.318763 1.866640 2.096294 2.574677 2.658840 -1.116558 1.367968 1.922533 2.016505 2.549444 2.646230 -1.129468 1.529113 1.942204 2.003339 2.527872 2.699919 -1.139050 1.679536 1.945866 2.032922 2.537427 2.642172 -1.219207 1.599421 1.929600 2.011091 2.539104 2.705280 -1.233969 1.556201 1.930999 2.084786 2.578580 2.675834 -1.234430 1.653741 2.033213 2.256759 2.637546 2.699663 -1.255288 1.475044 2.022543 2.289234 2.587690 2.703947 -1.253389 1.472198 1.956397 2.211186 2.574243 2.676099 -1.126854 1.587210 1.950824 2.031487 2.416846 2.614459 -1.007062 1.608304 1.896229 1.986335 2.223017 2.524028 -1.067280 1.729449 1.931889 2.045329 2.164850 2.400910 -0.946660 1.699777 1.870624 1.981832 2.135670 2.447688 -1.002686 1.728563 1.939905 2.072520 2.274792 2.467485 -1.148787 1.600550 2.003063 2.128026 2.409105 2.506525 -1.191365 1.359514 1.908437 2.116985 2.369079 2.529393 -1.229740 1.316359 1.901465 2.001169 2.368350 2.575701 -1.167453 1.284078 1.851548 2.056283 2.446292 2.573763 -1.177049 1.282978 1.796076 2.014566 2.409896 2.524428 -1.166550 1.281729 1.804132 1.938592 2.383050 2.543803 -1.144710 1.266197 1.755782 1.865513 2.354119 2.575142 -1.168465 1.283561 1.695054 1.817537 2.302788 2.529561 -1.093474 1.316111 1.625831 1.791050 2.303314 2.408563 -1.072994 1.218877 1.586912 1.725308 2.219203 2.343524 -0.946241 1.172838 1.426290 1.551682 2.192575 2.321727 -1.001802 1.174980 1.507444 1.697862 2.240802 2.478241 -0.992564 1.257780 1.429092 1.819825 2.234153 2.434915 -0.933586 1.255559 1.372464 1.686266 2.265977 2.349467 -0.987914 1.162881 1.404420 1.563483 2.227668 2.485371 -1.058576 1.185833 1.325383 1.445585 2.164512 2.455141 -1.042271 1.149610 1.389036 1.473828 1.906671 2.390132 -0.966952 1.075537 1.288155 1.405105 2.061861 2.451990 -0.901530 1.194476 1.354732 1.705750 2.325032 2.434812 -1.038418 1.292428 1.527305 1.909844 2.230333 2.465135 -1.336010 1.441693 1.849134 2.208029 2.414400 2.532513 -1.436224 1.645653 2.008636 2.198160 2.502278 2.601413 -1.424341 1.684427 1.929812 2.122504 2.512280 2.604860 -1.452203 1.722988 1.962207 2.156659 2.484102 2.584594 -1.481999 1.735238 1.971190 2.222801 2.512305 2.623621 -1.392556 1.721267 1.940304 2.174966 2.488944 2.601854 -1.243347 1.558461 1.809822 1.990890 2.381971 2.537485 -1.199294 1.421504 1.763108 1.990880 2.358918 2.489556 -1.217773 1.348784 1.714665 1.916837 2.379728 2.456961 -1.219523 1.326854 1.719656 1.838075 2.299329 2.435406 -1.263073 1.353656 1.787228 1.918973 2.320389 2.448246 -1.270962 1.373799 1.718185 1.857935 2.366922 2.481748 -1.284351 1.368069 1.793907 1.895081 2.356790 2.524604 -1.244789 1.353657 1.782947 1.928688 2.225716 2.379949 -1.269283 1.368726 1.719184 1.909677 2.267163 2.491540 -1.249305 1.338194 1.799918 1.917097 2.274691 2.533224 -1.179498 1.259046 1.802972 1.927327 2.228930 2.503637 -1.140961 1.245902 1.708660 1.923794 2.243465 2.557345 -1.063955 1.209030 1.737289 1.945349 2.338697 2.573092 -1.003475 1.109161 1.745131 1.902188 2.308443 2.601614 -0.937618 1.077537 1.747804 1.869648 2.205055 2.570449 -0.885099 1.192451 1.790545 1.876157 2.360305 2.598108 -0.803485 0.966415 1.768458 1.928742 2.196723 2.530460 -0.797205 1.120717 1.776585 1.878573 2.370357 2.614341 -0.831514 1.059080 1.808800 1.905483 2.448208 2.573050 -0.806597 0.967446 1.829385 1.963682 2.358632 2.653242 -0.699378 0.851831 1.739446 1.933943 2.516377 2.655249 -0.739203 1.033985 1.902113 2.010327 2.494149 2.629822 -0.945605 1.079706 1.796352 2.039543 2.581863 2.699784 -0.843512 1.304861 1.835452 2.036832 2.600217 2.677826 -0.970152 1.414374 1.854051 1.957787 2.596045 2.665425 -1.067282 1.438542 1.888429 2.067094 2.531016 2.643177 -1.117619 1.563112 1.886324 2.218866 2.530223 2.624080 -1.209656 1.626913 1.943700 2.187427 2.555090 2.658675 -1.338891 1.812879 2.030890 2.305204 2.569275 2.661165 -1.303367 1.840104 2.035985 2.286745 2.614227 2.713359 -1.193428 1.727354 1.926203 2.184400 2.574784 2.631812 -1.063515 1.717188 1.903657 2.119051 2.444811 2.497667 -1.062175 1.188948 1.810480 2.044978 2.322378 2.578780 -1.073201 1.177557 1.654731 2.023264 2.200369 2.442874 -1.027815 1.165415 1.669466 1.859614 2.202142 2.462466 -1.035584 1.148236 1.604900 1.872549 2.257851 2.551682 -1.007205 1.131087 1.579146 1.969788 2.331637 2.507912 -0.908594 1.005601 1.463269 2.072372 2.304356 2.407363 -0.981614 1.126428 1.280565 1.886853 2.101922 2.487836 -1.006764 1.132557 1.253088 1.718315 2.189249 2.436605 -0.899830 1.156538 1.260748 1.696712 2.116655 2.228297 -0.896996 1.246551 1.436874 1.645194 2.073642 2.149130 -0.965481 1.069671 1.446489 1.949492 2.091582 2.298331 -0.898113 1.058765 1.617556 1.941551 2.113568 2.374743 -0.769481 1.159379 1.597415 1.959851 2.283842 2.418197 -0.908091 1.305340 1.473570 1.862549 2.164147 2.331091 -0.924282 1.334689 1.563201 2.043541 2.406015 2.515756 -0.972939 1.381971 1.549985 2.021238 2.268488 2.419332 -1.032229 1.484031 1.620031 1.952234 2.267322 2.486440 -1.005234 1.354692 1.620203 1.777917 2.223067 2.497574 -1.072742 1.245035 1.661666 1.819389 2.260496 2.468700 -1.134470 1.250480 1.737034 1.868971 2.303204 2.466426 -1.145935 1.293264 1.728505 1.950979 2.350982 2.504021 -1.226356 1.329795 1.750777 1.982144 2.347843 2.553027 -1.234801 1.328107 1.696728 2.060564 2.437310 2.535600 -1.247128 1.360496 1.742955 1.961348 2.474080 2.668447 -1.234736 1.329837 1.688634 1.913331 2.442940 2.627695 -1.230430 1.326635 1.697588 1.806044 2.381473 2.618535 -1.188567 1.273079 1.708983 1.969001 2.340683 2.588959 -1.204284 1.331218 1.835523 2.141256 2.463226 2.583492 -1.202374 1.397220 1.863749 2.155165 2.599733 2.681191 -1.217581 1.333297 1.763898 1.994983 2.601835 2.684817 -1.272368 1.364451 1.776352 1.952098 2.563424 2.676170 -1.330173 1.434654 1.825090 1.938032 2.579405 2.666102 -1.383550 1.514770 1.774712 2.134998 2.528583 2.614711 -1.488234 1.631245 1.795942 2.180588 2.497787 2.585930 -1.497854 1.598429 1.760395 1.985719 2.538066 2.622220 -1.446514 1.555686 1.675484 1.899620 2.547070 2.637129 -1.420188 1.651758 1.888119 2.201558 2.498716 2.624372 -1.524851 1.748918 1.939479 2.132594 2.426619 2.604303 -1.588214 1.786968 1.965710 2.123251 2.417433 2.579888 -1.603052 1.805249 1.932723 2.088062 2.490882 2.628467 -1.521714 1.853040 1.968163 2.198421 2.530921 2.597229 -1.496309 1.785807 2.001979 2.206169 2.574155 2.645280 -1.405201 1.500557 1.908673 2.179223 2.543732 2.645774 -1.369555 1.501308 1.848796 2.089859 2.551118 2.643621 -1.395377 1.488644 1.872404 2.028116 2.530256 2.599192 -1.354582 1.508972 1.848875 1.976677 2.504926 2.579355 -1.325752 1.411326 1.837129 1.970792 2.502717 2.584831 -1.264497 1.390436 1.764758 2.087338 2.519279 2.625037 -1.280904 1.355652 1.790288 1.995707 2.502567 2.587359 -1.267443 1.360843 1.858033 2.035632 2.509375 2.584870 -1.238902 1.487541 1.786660 2.080354 2.480913 2.582137 -1.228708 1.441140 1.715963 1.893335 2.507070 2.565131 -1.167347 1.397307 1.672051 1.923535 2.438392 2.523520 -1.169232 1.356809 1.567433 1.950379 2.378945 2.468006 -1.240244 1.470896 1.629735 2.024684 2.376716 2.454875 -1.370859 1.665288 1.831505 2.176433 2.486403 2.586565 -1.513368 1.657039 1.965014 2.298013 2.532148 2.623007 -1.446940 1.612676 1.929087 2.232303 2.466210 2.565149 -1.430659 1.664527 1.882163 2.234579 2.421664 2.527294 -1.511551 1.658934 1.944043 2.198499 2.451946 2.588348 -1.539441 1.741360 2.111062 2.229922 2.438935 2.615056 -1.510948 1.846893 2.061790 2.202452 2.484110 2.572628 -1.366393 1.611652 2.079365 2.260070 2.467062 2.588032 -1.383579 1.641339 1.997349 2.226153 2.491435 2.611630 -1.381458 1.706898 1.963061 2.125553 2.596797 2.681115 -1.360033 1.558255 1.949661 2.054826 2.599573 2.714554 -1.379339 1.491775 1.925897 2.046337 2.539371 2.696047 -1.313275 1.469403 1.863111 2.141749 2.553959 2.668104 -1.201520 1.563000 1.925029 2.093014 2.476606 2.614413 -0.965563 1.662126 1.836100 2.071866 2.530046 2.578446 -0.976435 1.635119 1.844726 2.005117 2.553083 2.614153 -1.098159 1.549476 1.826426 1.907908 2.490671 2.625630 -0.971599 1.431927 1.818186 1.923193 2.493841 2.568117 -0.881008 1.272866 1.901429 1.959221 2.513674 2.596017 -0.915929 1.478770 1.955701 2.082549 2.494350 2.585776 -1.008177 1.579393 1.898198 2.139172 2.477629 2.551209 -0.937399 1.507567 1.803910 1.922590 2.546047 2.637297 -0.848413 1.358228 1.783925 1.906229 2.477012 2.588525 -0.863404 1.488629 1.835502 1.930032 2.465498 2.545317 -0.844376 1.622282 1.826798 2.048364 2.490552 2.545809 -0.869731 1.705034 1.854703 2.111605 2.517014 2.593453 -0.862235 1.623015 1.899372 2.028710 2.527844 2.574800 -0.931658 1.576339 1.853614 1.975118 2.542237 2.614786 -0.848799 1.588406 1.847097 1.955899 2.534073 2.584561 -0.737814 1.457219 1.829993 1.966203 2.501271 2.579455 -0.786199 1.100080 1.860369 1.964282 2.419364 2.566134 -0.728962 1.040841 1.773818 1.963733 2.356948 2.578866 -0.733093 1.147783 1.789774 1.909293 2.349819 2.481103 -0.785959 1.280236 1.730487 1.926696 2.346913 2.422480 -0.784924 1.446821 1.669690 1.935370 2.368317 2.459601 -0.758523 1.466915 1.805902 1.946588 2.352213 2.426335 -0.767907 1.544295 1.768171 2.003937 2.239037 2.386192 -0.896374 1.562074 1.716926 1.903301 2.308243 2.430582 -0.834530 1.504812 1.737424 1.917731 2.409279 2.493291 -0.896027 1.406949 1.730026 1.903326 2.431247 2.539722 -1.039666 1.364116 1.806278 1.948174 2.440690 2.557972 -1.093454 1.412357 1.833723 1.940104 2.489654 2.564450 -1.190180 1.386167 1.848700 1.956202 2.481553 2.580885 -1.243158 1.350416 1.811797 1.893593 2.467576 2.613520 -1.221986 1.308711 1.815913 1.911989 2.417533 2.600995 -1.228372 1.343619 1.763163 1.872602 2.394885 2.582719 -1.278387 1.389710 1.738500 1.870267 2.420854 2.532852 -1.211636 1.401793 1.710146 1.811019 2.363826 2.482240 -1.161497 1.400684 1.766674 1.891745 2.392605 2.495922 -1.114937 1.405487 1.718336 1.927418 2.356818 2.468335 -1.074680 1.452959 1.668715 1.898094 2.336526 2.443457 -1.006705 1.356254 1.629477 1.848470 2.313894 2.426320 -0.966452 1.457923 1.654693 1.906386 2.320056 2.418339 -0.939007 1.519988 1.667014 1.989416 2.390669 2.488951 -0.946840 1.483985 1.701087 2.105572 2.391444 2.490066 -0.909129 1.501060 1.665371 2.004939 2.256700 2.389841 -0.958919 1.390613 1.680082 2.107156 2.297251 2.440839 -1.462160 1.588562 1.808539 2.109890 2.264826 2.417467 -1.301642 1.673806 1.892518 2.168109 2.477558 2.561621 -1.152769 1.529326 1.783781 2.014354 2.446614 2.560929 -1.128698 1.493018 1.748156 1.930275 2.530674 2.621591 -1.164356 1.496855 1.767664 1.871136 2.607250 2.684794 -1.122714 1.380513 1.762236 1.875604 2.441522 2.732814 -1.173906 1.545927 1.843801 1.933791 2.123448 2.629011 -1.155439 1.465806 1.793876 1.928550 2.168553 2.609610 -1.147812 1.484543 1.816424 1.908762 2.262620 2.704081 -1.185870 1.393524 1.811853 1.881115 2.544291 2.735905 -1.153304 1.451135 1.855404 1.888619 2.603314 2.738077 -1.208854 1.582363 1.784858 1.880089 2.596481 2.727884 -1.194841 1.542896 1.919056 2.023145 2.551891 2.634186 -1.230327 1.492063 1.937225 2.133605 2.615726 2.690226 -1.258764 1.581307 1.980070 2.138762 2.599037 2.691033 -1.220691 1.572961 1.917212 2.177536 2.599585 2.702012 -1.258143 1.556630 1.871736 2.132633 2.585514 2.673307 -1.233770 1.598238 1.849957 2.013674 2.542859 2.634481 -1.269759 1.560794 1.865225 2.076328 2.521082 2.617443 -1.116561 1.680882 1.781694 1.920497 2.592211 2.675845 -1.048209 1.662996 1.817400 1.915170 2.484585 2.623077 -0.954241 1.619674 1.813457 1.881694 2.550667 2.631971 -0.964363 1.579747 1.728712 1.862126 2.567566 2.636332 -1.296922 1.646884 1.889259 2.069271 2.320227 2.481389 -1.232775 1.619596 1.955470 2.066559 2.335277 2.456514 -1.238971 1.351788 1.877566 2.166413 2.317967 2.474389 -1.180292 1.388353 1.607451 1.950835 2.210855 2.477718 -1.124001 1.423538 1.617323 1.826801 2.206068 2.444078 -1.147794 1.487048 1.627974 1.926015 2.278418 2.486526 -1.092654 1.499725 1.623041 1.880156 2.411660 2.648649 -1.115294 1.468690 1.607626 1.814459 2.356904 2.576088 -1.176045 1.424631 1.614229 1.966337 2.352676 2.570354 -1.211051 1.467429 1.617777 1.851487 2.389770 2.591860 -1.287681 1.464858 1.633790 1.856231 2.349748 2.565320 -1.298585 1.495223 1.639003 1.942642 2.415390 2.518116 -1.309890 1.431142 1.757192 1.977209 2.414871 2.520878 -1.392241 1.477414 1.811303 1.909687 2.440417 2.573891 -1.414942 1.515382 1.858997 2.127937 2.490674 2.635418 -1.490435 1.565967 1.952412 2.049065 2.499936 2.600180 -1.485068 1.734116 1.997368 2.089376 2.524766 2.608159 -1.507131 1.787198 2.048100 2.128356 2.533629 2.624653 -1.485217 1.772591 2.048100 2.144373 2.595743 2.679785 -1.560042 1.744521 2.076144 2.156837 2.615057 2.698771 -1.506276 1.855445 2.064190 2.144534 2.585665 2.687788 -1.592877 1.903451 2.084530 2.163395 2.496904 2.633589 -1.609454 1.870860 2.119821 2.186594 2.599505 2.697819 -1.594779 1.855348 2.025620 2.142545 2.572299 2.637841 -1.527194 1.714086 2.076267 2.185169 2.526549 2.631137 -1.518012 1.628010 2.039263 2.134528 2.453843 2.576361 -1.531312 1.678082 2.035179 2.146889 2.504859 2.584171 -1.508627 1.632606 1.965140 2.148678 2.496640 2.592746 -1.499896 1.599423 1.913687 2.036860 2.450192 2.538166 -1.481158 1.583812 1.884461 2.013870 2.359497 2.481100 -1.475736 1.569698 1.799993 1.916182 2.329218 2.535901 -1.498641 1.623604 1.792824 1.945217 2.358627 2.490727 -1.431128 1.574627 1.743263 2.006116 2.347765 2.508896 -1.427064 1.536583 1.790690 1.943028 2.344465 2.452652 -1.436838 1.542023 1.758917 1.925622 2.242913 2.416844 -1.419788 1.509038 1.863320 1.995399 2.275792 2.424732 -1.424396 1.510477 1.882887 2.179017 2.304708 2.455667 -1.366051 1.461194 1.935323 2.147551 2.263420 2.465785 -1.407395 1.564972 1.981125 2.103440 2.445291 2.565104 -1.597013 1.877015 2.068503 2.270312 2.499356 2.604888 -1.484981 1.818125 2.149815 2.337593 2.504753 2.589439 -1.487878 1.937181 2.118271 2.308368 2.511781 2.604626 -1.682297 1.977033 2.192290 2.373676 2.522931 2.611282 -1.749459 1.905682 2.218271 2.352013 2.574227 2.681484 -1.676221 1.936512 2.237179 2.343782 2.535908 2.661271 -1.723362 1.989915 2.271236 2.413144 2.550828 2.649366 -1.756006 1.996913 2.312656 2.461484 2.625420 2.708736 -1.499770 1.763295 2.158871 2.346879 2.592716 2.682851 -1.747521 1.927133 2.248936 2.410841 2.604121 2.690881 -1.670354 1.938258 2.247669 2.447135 2.657540 2.730040 -1.669237 1.959610 2.179318 2.440527 2.588429 2.640800 -1.780231 2.015138 2.164810 2.399021 2.581913 2.646942 -1.739561 1.967219 2.065694 2.364479 2.589977 2.649441 -1.605008 1.875105 2.018901 2.227404 2.541181 2.603541 -1.511246 1.892601 2.027827 2.148110 2.520001 2.608199 -1.363362 1.568768 1.910845 2.057695 2.463506 2.558819 -1.338497 1.483825 1.883695 2.067074 2.448950 2.577904 -1.369193 1.437863 1.845222 2.078464 2.428504 2.615891 -1.377698 1.498294 1.867666 2.164965 2.492547 2.570908 -1.408098 1.487760 1.872414 2.097948 2.447272 2.551716 -1.402363 1.531952 1.897693 2.126667 2.419162 2.551442 -1.456496 1.554631 1.841067 2.095807 2.421290 2.561761 -1.434931 1.529146 1.795336 2.163704 2.446465 2.530309 -1.391108 1.495499 1.869679 2.161228 2.381406 2.532017 -1.388934 1.534466 1.797003 2.102941 2.398508 2.521270 -1.358571 1.471303 1.760049 2.100883 2.350197 2.546548 -1.276599 1.519215 1.779419 2.095819 2.442938 2.665941 -1.206661 1.457865 1.760464 2.244280 2.495881 2.644848 -1.214611 1.460274 1.979019 2.239454 2.398324 2.634473 -1.275473 1.473470 1.878570 2.203117 2.475028 2.687851 -1.291712 1.399288 1.813807 2.194118 2.502758 2.614888 -1.260058 1.397998 1.924890 2.186721 2.511667 2.644548 -1.210634 1.326713 1.897594 2.107441 2.460079 2.711722 -1.202657 1.319235 1.892634 2.079859 2.379418 2.679891 -0.967019 1.105970 1.761322 2.107426 2.328428 2.593155 -0.947746 1.035797 1.393730 2.061233 2.300744 2.668280 -0.996167 1.215029 1.378995 1.861982 2.329665 2.605022 -1.008823 1.198481 1.313837 1.693525 2.360746 2.604824 -1.054057 1.218510 1.368106 1.738006 2.174906 2.546071 -1.021568 1.133991 1.369174 1.935639 2.267798 2.544415 -1.033742 1.227769 1.451289 2.005917 2.412620 2.595031 -1.065155 1.168636 1.530185 2.061499 2.410743 2.485478 -1.121227 1.281283 1.432233 1.909928 2.202734 2.509308 -1.170032 1.306041 1.494945 1.981910 2.202815 2.351735 -1.152630 1.266186 1.620999 2.057673 2.214453 2.381642 -1.228128 1.313272 1.751468 2.118469 2.263417 2.453888 -1.307832 1.398650 1.799753 2.125735 2.260615 2.451800 -1.360104 1.477444 1.835740 2.121870 2.291563 2.499791 -1.398477 1.492966 1.806519 2.107140 2.241410 2.434146 -1.351212 1.462506 1.726393 2.122387 2.285789 2.421844 -1.297203 1.498868 1.766246 2.157839 2.376714 2.497158 -1.377349 1.518971 1.803789 2.191150 2.356374 2.478897 -1.289165 1.553241 1.674591 2.112634 2.403345 2.473877 -1.188972 1.700336 1.834324 2.055585 2.599531 2.700414 -1.077038 1.667666 1.902189 2.045693 2.602910 2.700056 -1.072057 1.272462 1.843743 1.901183 2.586254 2.720558 -1.084385 1.392072 1.823558 1.901299 2.589426 2.680029 -1.106319 1.441363 1.766145 1.853724 2.549356 2.627414 -1.094566 1.550024 1.771922 1.870952 2.559682 2.628051 -1.041899 1.598552 1.813702 1.928485 2.545630 2.671501 -1.090204 1.610510 1.812559 2.019257 2.556321 2.608793 -1.016528 1.626657 1.742411 2.041925 2.541538 2.602247 -1.075570 1.647752 1.870667 2.073970 2.574597 2.628798 -1.126656 1.586213 1.792572 1.982408 2.629180 2.725561 -1.027776 1.542665 1.831396 1.956878 2.603010 2.668523 -1.111897 1.543416 1.861469 1.942917 2.621957 2.672864 -1.080512 1.583194 1.857304 1.958456 2.633597 2.695142 -1.132239 1.449156 1.884949 1.977000 2.607850 2.709420 -1.232769 1.612605 1.960435 2.071693 2.644678 2.727118 -1.325014 1.779901 1.967304 2.113871 2.547837 2.668723 -1.404585 1.644448 2.058088 2.257112 2.519116 2.634613 -1.413485 1.609401 2.002521 2.184102 2.587532 2.696153 -1.354020 1.593877 2.014439 2.122204 2.617254 2.721812 -1.373822 1.656758 1.992185 2.189875 2.548725 2.702514 -1.421181 1.611084 1.958071 2.123616 2.569835 2.648136 -1.379179 1.620195 1.922636 2.093948 2.550690 2.641857 -1.367726 1.656675 1.838447 1.992123 2.596226 2.654039 -1.394553 1.750623 1.872269 2.038430 2.553215 2.623595 -1.464021 1.741591 1.912988 2.150261 2.565594 2.648823 -1.461132 1.809059 1.954612 2.209898 2.570276 2.642519 -1.434520 1.770834 1.904022 2.217315 2.631183 2.686995 -1.375527 1.631662 1.885996 2.086587 2.600503 2.671257 -1.339213 1.568724 1.817375 2.085568 2.591336 2.666455 -1.504403 1.779590 2.057141 2.272445 2.534600 2.634655 -1.474504 1.746318 2.044711 2.137376 2.474545 2.630529 -1.557045 1.755017 2.039661 2.080935 2.661339 2.741743 -1.573452 1.715361 2.056726 2.098368 2.691640 2.743685 -1.511431 1.831887 1.991585 2.156042 2.624346 2.709519 -1.501907 1.714027 2.012931 2.079434 2.554662 2.690409 -1.547183 1.671908 1.977966 2.104057 2.507158 2.614807 -1.563264 1.635971 1.990128 2.123718 2.563823 2.633190 -1.587772 1.697791 2.007538 2.127360 2.588839 2.656541 -1.618303 1.722230 2.008488 2.131284 2.618167 2.687641 -1.580078 1.684932 2.000646 2.087829 2.613984 2.687671 -1.572775 1.736323 1.961536 2.144351 2.641248 2.687943 -1.538985 1.652845 1.952108 2.156038 2.639302 2.685734 -1.537130 1.622797 1.963527 2.075940 2.612204 2.679327 -1.537449 1.633250 1.986524 2.075675 2.542791 2.643796 -1.543228 1.772021 2.053914 2.142473 2.536411 2.690489 -1.621800 1.829997 2.052741 2.210858 2.583215 2.665837 -1.609565 1.935324 2.146682 2.393315 2.597212 2.670556 -1.560818 1.935543 2.191435 2.444376 2.609921 2.692602 -1.704277 1.874585 2.010256 2.380095 2.528658 2.604802 -1.624784 1.837785 1.925361 2.193011 2.497168 2.569432 -1.556125 1.832653 1.986935 2.189317 2.453204 2.531630 -1.347428 1.669666 1.943932 2.108052 2.506631 2.608423 -1.278409 1.497251 1.838413 2.073920 2.454553 2.592324 -1.271049 1.415120 1.758107 2.232460 2.422770 2.554672 -1.260337 1.356714 1.913167 2.225895 2.380602 2.557250 -1.223099 1.307974 1.784088 2.207517 2.362875 2.487786 -1.249454 1.538164 1.716600 1.998319 2.362110 2.465531 -1.208014 1.503064 1.761303 1.917077 2.448048 2.525133 -1.151848 1.461146 1.783945 1.946886 2.452561 2.556307 -1.165555 1.347773 1.799946 1.920752 2.437876 2.546954 -1.109788 1.310449 1.815889 1.923381 2.427304 2.602804 -1.091990 1.233639 1.789609 1.925036 2.467804 2.611170 -1.052323 1.194748 1.809895 1.914231 2.390180 2.556318 -1.032267 1.189488 1.775623 1.889690 2.393248 2.640830 -0.992854 1.169627 1.814159 1.912252 2.320268 2.634324 -1.054415 1.177746 1.762755 1.907196 2.266178 2.516301 -1.029545 1.167365 1.780060 1.973540 2.227843 2.613887 -1.067777 1.184807 1.741322 1.919129 2.121959 2.500789 -1.167843 1.263051 1.778629 1.900717 2.150811 2.568660 -1.247027 1.323672 1.811046 1.934590 2.184022 2.674617 -1.331781 1.426137 1.785144 1.966030 2.114558 2.541825 -1.360900 1.444142 1.862535 1.949748 2.426744 2.646105 -1.408538 1.451788 1.866918 2.014230 2.478842 2.705911 -1.405554 1.483551 1.874980 1.960293 2.502764 2.662540 -1.442367 1.544656 1.883354 1.987590 2.562980 2.647761 -1.480719 1.536202 1.881818 2.018874 2.582349 2.661791 -1.513078 1.583246 1.895764 1.987154 2.586166 2.676009 -1.497760 1.602088 1.831006 1.985404 2.564090 2.643635 -1.497065 1.564915 1.844643 1.957697 2.539930 2.677163 -1.468106 1.523747 1.865842 1.940079 2.607970 2.684862 -1.468104 1.564389 1.858916 1.982405 2.606481 2.709686 -1.422735 1.519196 1.806791 1.891590 2.614823 2.703893 -1.396871 1.476698 1.776404 2.013253 2.607847 2.665988 -1.391532 1.504565 1.830535 2.081544 2.611020 2.720808 -1.372885 1.645062 1.833360 2.015761 2.631341 2.701342 -1.331289 1.747404 1.897953 2.146510 2.586685 2.658273 -1.503178 1.734690 1.914996 2.282089 2.598389 2.679187 -1.465242 1.711762 2.025166 2.284078 2.653659 2.717393 -1.423402 1.768761 2.084406 2.277880 2.636443 2.711524 -1.423821 1.724472 2.032594 2.300309 2.603340 2.686111 -1.433184 1.818868 2.053883 2.409241 2.628605 2.699461 -1.509846 1.793493 2.052637 2.357768 2.644126 2.718058 -1.575730 1.851530 2.032958 2.374899 2.583530 2.662235 -1.501264 1.780829 1.998554 2.329265 2.505605 2.606743 -1.460060 1.763209 1.912334 2.214416 2.494328 2.577616 -1.444041 1.657674 1.895357 2.148549 2.478458 2.595455 -1.454287 1.619858 1.935887 2.189754 2.478831 2.594880 -1.377243 1.642180 1.919668 2.142842 2.421514 2.541038 -1.051059 1.421021 1.830399 2.021216 2.373690 2.548829 -0.964571 1.071641 1.394899 2.151202 2.371776 2.464951 -0.966306 1.181025 1.302213 2.014819 2.375093 2.435135 -0.895560 1.207845 1.335308 1.823923 2.239924 2.363100 -1.006776 1.203093 1.317821 1.873977 2.336638 2.408782 -1.054129 1.225595 1.379006 2.024687 2.333311 2.421550 -1.090202 1.224770 1.409674 2.013195 2.245364 2.353229 -1.076475 1.203972 1.563890 2.033954 2.203362 2.369101 -1.127967 1.249133 1.664693 2.080426 2.256625 2.469541 -1.202013 1.429684 1.793680 2.080715 2.339984 2.460053 -1.517223 1.673904 1.927925 2.203642 2.386760 2.520143 -1.586618 1.786240 2.041674 2.198999 2.416371 2.581194 -1.593300 1.808548 2.148779 2.250278 2.372090 2.532412 -1.657294 1.783458 2.150393 2.258130 2.453915 2.616209 -1.571489 1.792659 2.117652 2.350385 2.577192 2.666949 -1.301994 1.729750 1.974424 2.093250 2.593899 2.663024 -1.100218 1.563399 1.919910 2.059220 2.562974 2.637757 -1.025074 1.540738 1.811898 2.057911 2.491877 2.603248 -1.015309 1.473504 1.802588 2.013084 2.436758 2.605319 -1.022065 1.158479 1.689786 2.183529 2.383778 2.492374 -1.212476 1.453108 1.823947 2.061442 2.396186 2.536578 -1.126243 1.452934 1.809587 2.071074 2.408943 2.549557 -0.880332 1.324785 1.621337 1.967251 2.313156 2.426927 -0.749583 1.358409 1.575073 1.870590 2.279227 2.377431 -0.901917 1.290215 1.674425 1.954410 2.233361 2.391524 -0.850971 1.252102 1.657646 1.816460 2.183885 2.328806 -0.881480 1.284101 1.698159 1.844661 2.341820 2.440909 -0.874499 1.182682 1.709489 1.917452 2.365966 2.499649 -0.833751 1.231132 1.803319 1.918020 2.459092 2.546881 -0.850970 1.127086 1.772073 1.855222 2.487580 2.582865 -0.881650 1.114802 1.820703 1.959079 2.521753 2.598731 -0.803558 1.150285 1.798477 1.952675 2.538917 2.634898 -0.867833 0.990496 1.832275 1.929767 2.547660 2.681084 -0.865057 1.067437 1.773263 1.860188 2.558331 2.702216 -0.832529 0.985960 1.756367 1.862925 2.438281 2.623782 -0.850804 1.060553 1.892217 1.984007 2.483774 2.661123 -0.873803 1.041984 1.746198 1.932438 2.338221 2.554585 -0.958594 1.103471 1.836438 1.936783 2.393758 2.573200 -1.014831 1.140873 1.825933 2.013713 2.401490 2.609423 -1.075369 1.457644 1.900463 2.033493 2.314190 2.490949 -1.201715 1.736170 1.914076 2.066503 2.386907 2.476963 -1.215217 1.873613 2.065903 2.182990 2.374981 2.489555 -1.620207 1.851261 2.111542 2.342798 2.527494 2.633887 -1.683879 1.860372 2.126009 2.404344 2.562983 2.636158 -1.703817 1.934383 2.133673 2.393214 2.601932 2.682469 -1.526877 1.900128 2.151100 2.361638 2.575171 2.658979 -1.587253 1.881390 2.129945 2.267860 2.577863 2.657840 -1.539163 1.871344 2.190283 2.360385 2.624615 2.705636 -1.625747 1.862181 2.120094 2.339463 2.592159 2.682142 -1.679527 1.920689 2.161166 2.317106 2.648896 2.712106 -1.635199 1.922826 2.174839 2.407399 2.630046 2.709271 -1.454186 1.975699 2.151850 2.371342 2.609179 2.685790 -1.672439 2.011404 2.183017 2.463917 2.652956 2.711525 -1.612105 1.987481 2.102582 2.293346 2.616125 2.670264 -1.528075 1.895073 2.053582 2.232503 2.544912 2.624122 -1.420355 1.683500 1.963431 2.159418 2.536725 2.620131 -1.456320 1.693132 1.969234 2.164744 2.587162 2.677588 -1.481106 1.637541 1.992642 2.178479 2.548138 2.632755 -1.488517 1.591174 2.016501 2.123324 2.528663 2.614918 -1.477429 1.651519 1.962894 2.102183 2.543300 2.618840 -1.473856 1.622302 1.992230 2.080352 2.572688 2.644430 -1.478216 1.633404 1.931202 2.064133 2.552282 2.629338 -1.452477 1.676763 1.945911 2.084750 2.600973 2.668889 -1.411560 1.706182 1.890249 2.169616 2.567319 2.650155 -1.383398 1.664625 1.803260 2.108612 2.595771 2.646221 -1.434597 1.645007 1.871751 2.115488 2.528958 2.660256 -1.444542 1.581834 1.898636 2.094074 2.528453 2.631504 -1.465558 1.562000 1.841423 2.051601 2.559944 2.632318 -1.499287 1.581053 1.857454 2.098994 2.511597 2.604341 -1.528680 1.651347 1.871308 2.071232 2.562548 2.622460 -1.514467 1.633477 1.778604 2.123502 2.606102 2.662390 -1.301476 1.683914 1.796063 2.170750 2.644952 2.691777 -1.154424 1.626935 1.749221 1.996410 2.579238 2.652899 -1.117912 1.569269 1.795380 1.885300 2.376717 2.739725 -1.251786 1.625672 1.839263 1.991314 2.350120 2.655047 -1.412131 1.694235 1.839362 1.998399 2.445222 2.739684 -1.370157 1.687258 1.879731 2.006454 2.329014 2.632962 -1.174780 1.729049 1.887372 2.013905 2.259388 2.557737 -1.317917 1.737041 1.878083 1.979313 2.175363 2.634863 -1.140130 1.586450 1.932219 2.027711 2.236840 2.484950 -1.100136 1.600099 1.851286 1.972375 2.604826 2.649449 -1.111969 1.525982 1.842706 2.011491 2.601600 2.669393 -1.080825 1.492576 1.810233 1.965312 2.556725 2.645171 -1.129345 1.635898 1.785176 2.137400 2.498003 2.572522 -1.003594 1.603010 1.722697 2.139397 2.431587 2.510996 -1.120169 1.425151 1.675683 2.050774 2.343247 2.460676 -1.328607 1.599151 1.873581 2.170450 2.470538 2.613529 -1.382087 1.595341 1.923462 2.082111 2.349552 2.510754 -1.466192 1.572864 1.870467 2.179996 2.346338 2.471868 -1.379765 1.633014 1.808273 2.166294 2.398723 2.492469 -1.305921 1.610021 1.856406 2.001543 2.390671 2.533908 -1.383086 1.586806 1.757224 1.934804 2.433540 2.587951 -1.307509 1.450943 1.675332 2.033940 2.244229 2.418123 -1.191501 1.484072 1.750272 2.096644 2.249380 2.504983 -1.241378 1.491790 1.776884 2.071735 2.367933 2.508071 -1.265701 1.459923 1.781754 2.009900 2.348578 2.516037 -1.279508 1.414652 1.795096 2.055938 2.395700 2.530542 -1.337338 1.445932 1.853009 2.075183 2.385984 2.535489 -1.288973 1.424709 1.797989 2.026295 2.299802 2.423713 -1.365284 1.471788 1.801705 1.937695 2.345304 2.466696 -1.353791 1.447746 1.736211 1.868886 2.274358 2.475584 -1.360863 1.449607 1.680466 1.802646 2.395536 2.513256 -1.388330 1.526246 1.673331 1.909867 2.385020 2.535430 -1.424428 1.544219 1.720205 1.936245 2.307968 2.491418 -1.448943 1.552009 1.797935 1.937520 2.406873 2.546121 -1.432034 1.521621 1.799322 2.021435 2.477329 2.571754 -1.463087 1.546282 1.834418 2.063488 2.489800 2.595267 -1.425467 1.556435 1.904716 2.110821 2.466374 2.587563 -1.384837 1.569415 1.925581 2.072374 2.561291 2.640537 -1.418492 1.539421 1.937535 2.014318 2.609201 2.676764 -1.397006 1.483285 1.936731 1.977746 2.595606 2.735850 -1.335615 1.441868 1.884738 1.994960 2.589628 2.695748 -1.357490 1.518997 1.871603 1.980199 2.629016 2.700305 -1.353558 1.524318 1.891083 1.963707 2.595814 2.679332 -1.295102 1.639282 1.907387 2.103139 2.583356 2.679778 -1.455545 1.667590 1.953202 2.240488 2.570672 2.673617 -1.460281 1.786653 1.997747 2.285131 2.582928 2.677618 -1.543121 1.729391 2.155674 2.280274 2.655577 2.744248 -1.434440 1.748782 2.042199 2.201295 2.606501 2.695862 -1.436079 1.747337 2.067838 2.253257 2.575944 2.679075 -1.470866 1.698245 2.083133 2.257574 2.565342 2.666191 -1.417419 1.693439 2.053193 2.243538 2.544836 2.632800 -1.412107 1.681588 2.081799 2.326098 2.472446 2.570581 -1.397226 1.764739 2.031556 2.297123 2.471645 2.575881 -1.466497 1.694305 2.005924 2.206325 2.534515 2.635757 -1.437113 1.746568 1.923838 2.127846 2.356631 2.464479 -1.324023 1.597918 1.757776 2.124352 2.347986 2.440470 -1.375387 1.626387 1.778068 2.068399 2.258938 2.397532 -1.379576 1.621789 1.857961 1.994277 2.306086 2.477213 -1.416412 1.648893 1.869117 2.098359 2.345397 2.475125 -1.426241 1.639197 1.925396 2.072677 2.448945 2.532546 -1.459052 1.615870 1.911170 2.125459 2.483704 2.592087 -1.459433 1.690704 1.852418 2.136068 2.529395 2.597199 -1.485144 1.578047 1.810569 2.150621 2.559043 2.618237 -1.529055 1.594664 1.738903 2.261216 2.595771 2.651620 -1.532488 1.585333 1.820935 2.229621 2.623157 2.658477 -1.374401 1.528078 1.848019 2.042459 2.458230 2.591088 -1.399870 1.597467 1.853082 2.096076 2.431604 2.556847 -1.457434 1.609510 1.930756 2.186100 2.392287 2.525064 -1.440508 1.607587 1.869980 2.158283 2.424280 2.555526 -1.376758 1.474791 1.750562 2.190623 2.406180 2.547123 -1.327713 1.454236 1.644635 2.110356 2.352447 2.455926 -1.302805 1.418954 1.609785 2.093121 2.263489 2.393252 -1.207712 1.379869 1.536412 2.059932 2.317302 2.455399 -1.154213 1.302966 1.499207 2.070378 2.322203 2.630828 -1.111474 1.224424 1.625635 2.176079 2.342546 2.606190 -0.945723 1.083298 1.625408 2.214532 2.389898 2.510077 -0.992344 1.116986 1.451917 2.008420 2.313589 2.437855 -1.117309 1.392988 1.713458 2.132315 2.276818 2.497613 -1.332868 1.580932 1.895512 2.129003 2.425104 2.576946 -1.322037 1.497740 1.819219 2.128645 2.443614 2.567952 -1.361937 1.547377 1.790968 2.062941 2.465318 2.546093 -1.252677 1.483878 1.758631 2.033450 2.416283 2.539220 -1.099384 1.344747 1.686531 2.016752 2.355863 2.530839 -1.126109 1.263617 1.649938 1.991544 2.309088 2.514895 -1.190621 1.289655 1.692709 2.009481 2.160091 2.417069 -1.174976 1.414314 1.797856 1.987597 2.278818 2.492762 -1.205354 1.482053 1.850760 2.025549 2.342281 2.523425 -1.248034 1.561185 1.852759 2.096445 2.428364 2.551865 -1.260728 1.601832 1.901052 2.131984 2.409850 2.565546 -1.265037 1.693841 2.000531 2.200039 2.503508 2.617708 -1.278843 1.738264 2.062020 2.289983 2.604440 2.678111 -1.339428 1.735918 2.050123 2.352408 2.597394 2.688219 -1.301064 1.708745 1.965976 2.286214 2.546707 2.653175 -1.278604 1.746157 1.950065 2.214767 2.605793 2.687616 -1.183771 1.523062 1.879119 2.004908 2.600314 2.690485 -1.186222 1.342133 1.817831 1.940077 2.504905 2.659254 -1.179389 1.243680 1.894260 1.979753 2.558019 2.721819 -1.175622 1.357037 1.853192 1.940810 2.646805 2.705660 -1.211124 1.369645 1.825254 1.913289 2.634717 2.712259 -1.169472 1.345149 1.764944 1.883669 2.591077 2.714522 -1.222090 1.389480 1.800177 1.935903 2.573766 2.702922 -1.287266 1.375911 1.878738 1.986045 2.625999 2.708468 -1.299711 1.389598 1.873905 1.942723 2.533485 2.691472 -1.271356 1.424203 1.849847 1.953565 2.555561 2.652372 -1.253571 1.448512 1.829531 1.919100 2.487837 2.630761 -1.223923 1.323017 1.841258 1.932730 2.226845 2.570717 -1.226170 1.321389 1.771794 1.948065 2.137880 2.563052 -1.316238 1.399466 1.789328 1.965570 2.132039 2.424710 -1.264391 1.363953 1.735531 2.005600 2.155844 2.418921 -1.214027 1.319779 1.662017 1.902948 2.064631 2.424833 -1.242602 1.342314 1.624757 1.929420 2.083549 2.318443 -1.241605 1.439119 1.646334 1.817919 1.997763 2.196632 -1.239348 1.336917 1.777062 2.028009 2.155853 2.328702 -1.178416 1.266326 1.802039 1.959820 2.145703 2.469513 -1.247702 1.328626 1.812686 1.992792 2.200638 2.499445 -1.270078 1.370907 1.882273 1.997225 2.254284 2.526050 -1.295553 1.376421 1.860437 2.076734 2.248998 2.567118 -1.304838 1.386085 1.832762 2.061619 2.219399 2.486348 -1.314313 1.381482 1.912831 2.017535 2.287746 2.576424 -1.275078 1.353772 1.858468 2.037031 2.362055 2.615420 -1.287115 1.366797 1.835524 1.961094 2.291985 2.562975 -1.256666 1.341161 1.798806 1.921264 2.333647 2.596913 -1.229284 1.337507 1.753982 1.942388 2.403549 2.602171 -1.224871 1.322981 1.792609 1.918908 2.363314 2.520583 -1.218452 1.321589 1.651493 1.884157 2.366537 2.521284 -1.193218 1.359120 1.632401 1.857625 2.322851 2.452708 -1.205474 1.368035 1.608030 1.815042 2.341851 2.574505 -1.061251 1.318432 1.545024 1.888740 2.401884 2.617020 -1.072522 1.365786 1.514127 1.893675 2.369617 2.474232 -1.111644 1.436790 1.606098 1.842456 2.382418 2.474111 -1.012061 1.316202 1.471593 1.799057 2.349432 2.455130 -1.089471 1.248571 1.572785 1.953061 2.298439 2.461784 -1.068360 1.195813 1.624024 2.111295 2.311476 2.419253 -1.147513 1.525224 1.724810 1.957167 2.387532 2.471314 -1.334336 1.568150 1.749039 1.962569 2.390633 2.484647 -1.298140 1.467881 1.814397 1.941570 2.384226 2.522176 -1.295007 1.418486 1.859466 1.962329 2.376315 2.521757 -1.335831 1.436636 1.858260 1.966332 2.446579 2.563483 -1.346492 1.477982 1.905644 1.998091 2.490052 2.584468 -1.407183 1.540763 1.879296 1.992980 2.487939 2.564009 -1.447665 1.628575 1.828196 2.053651 2.534046 2.605859 -1.524705 1.620051 1.837880 2.017915 2.592167 2.653373 -1.564584 1.647141 1.761178 2.024150 2.615248 2.656575 -1.529370 1.593981 1.683157 1.979831 2.601640 2.654391 -1.585075 1.652835 1.786770 2.031845 2.518000 2.620980 -1.588906 1.644232 1.813812 2.041481 2.610723 2.666049 -1.601362 1.686074 1.862952 2.127114 2.608859 2.655021 -1.640245 1.750920 1.921102 2.164412 2.547516 2.617193 -1.548602 1.638196 1.917398 2.092646 2.563829 2.615836 -1.515875 1.616955 1.844164 2.007026 2.528173 2.601071 -1.465872 1.572195 1.740969 2.011290 2.493415 2.581928 -1.411908 1.534275 1.669392 2.025507 2.419065 2.534991 -1.339405 1.524896 1.674545 2.018990 2.344004 2.443795 -1.300672 1.527060 1.673067 2.036189 2.269516 2.383792 -1.193083 1.476495 1.664464 1.933230 2.291004 2.414954 -1.192791 1.485591 1.649261 1.844048 2.295088 2.502001 -1.197824 1.364864 1.703691 1.827209 2.262766 2.499801 -1.138273 1.379249 1.658127 1.912486 2.389082 2.583381 -1.166597 1.357942 1.688915 1.942734 2.491527 2.589252 -1.170615 1.391547 1.721925 1.889510 2.506116 2.616390 -1.210959 1.452702 1.755617 1.844973 2.490062 2.624729 -1.212139 1.519716 1.785919 1.889270 2.551264 2.629492 -1.276001 1.664615 1.957757 2.249343 2.602286 2.677701 -1.400862 1.816183 1.994456 2.325956 2.651785 2.717305 -1.466054 1.834563 2.118572 2.372427 2.625377 2.704685 -1.578859 1.790938 2.136097 2.392831 2.638547 2.714022 -1.480700 1.816555 2.206450 2.432389 2.575887 2.645111 -1.617288 1.807665 2.241721 2.440067 2.567226 2.631745 -1.570100 1.785068 2.178210 2.348135 2.467045 2.556638 -1.579682 1.701535 2.005186 2.288766 2.434155 2.548589 -1.578691 1.674213 1.965474 2.199446 2.334867 2.479803 -1.640546 1.726915 1.991606 2.240338 2.400971 2.523628 -1.588532 1.709671 1.874418 2.160822 2.381523 2.517230 -1.447497 1.665484 1.900942 2.103382 2.397872 2.535571 -1.203022 1.599213 1.884283 2.032257 2.369015 2.504738 -1.146521 1.513193 1.880497 1.985787 2.407380 2.522482 -1.131266 1.435001 1.834092 2.111348 2.306550 2.531154 -1.176712 1.640343 1.870115 2.064938 2.313000 2.439124 -1.254490 1.590614 1.958487 2.200173 2.344272 2.479816 -1.243959 1.684492 2.016502 2.192945 2.451075 2.547334 -1.537310 1.763854 2.188639 2.371726 2.539927 2.648079 -1.646538 1.887574 2.280949 2.443446 2.593067 2.680775 -1.567456 1.876170 2.108713 2.427826 2.611726 2.691363 -1.341056 1.874127 2.114216 2.396197 2.621228 2.702770 -1.449196 1.837843 2.058401 2.307470 2.616907 2.689695 -1.313491 1.794349 1.961057 2.237499 2.597739 2.685191 -1.202175 1.706913 1.905104 2.139148 2.612890 2.693658 -1.080344 1.590487 1.846519 2.059279 2.631365 2.697376 -1.043219 1.601906 1.900346 2.141041 2.588352 2.662523 -0.984957 1.556146 1.841481 2.148769 2.577337 2.662952 -0.979403 1.553838 1.844172 2.052598 2.577754 2.641114 -0.947313 1.453890 1.836463 1.998780 2.566547 2.637546 -0.959460 1.441678 1.832870 2.106499 2.553643 2.630882 -0.951016 1.397882 1.793743 2.053066 2.492635 2.622573 -0.870727 1.369217 1.817794 2.107476 2.524230 2.627945 -0.902872 1.385159 1.754800 2.013432 2.536990 2.654823 -0.891101 1.362395 1.753579 1.878041 2.559805 2.662468 -0.835616 1.259326 1.757169 1.832338 2.486345 2.635682 -0.787419 1.132035 1.693975 1.776933 2.533180 2.616312 -0.791106 1.068132 1.697743 1.851598 2.571958 2.669553 -0.759951 1.112356 1.562357 1.855199 2.490682 2.601972 -0.792061 1.139999 1.724823 1.954458 2.608864 2.689684 -0.823952 1.270934 1.741090 2.077662 2.613199 2.669386 -0.736534 1.124969 1.743684 2.093250 2.579787 2.661721 -0.797043 1.051944 1.780229 2.240357 2.583476 2.662315 -0.923582 1.503155 1.776882 2.018470 2.613910 2.703042 -1.421538 1.735030 2.006889 2.210344 2.574319 2.670736 -1.350174 1.606122 1.963013 2.084969 2.478192 2.589945 -1.361799 1.656583 1.974082 2.173881 2.479634 2.612008 -1.319939 1.764454 2.027445 2.249293 2.529644 2.635744 -1.394028 1.664199 2.006309 2.246188 2.558094 2.671320 -1.385394 1.755426 2.080024 2.329874 2.630895 2.722673 -1.333690 1.669430 2.021492 2.250607 2.600265 2.689100 -1.341532 1.698164 1.975002 2.237112 2.560850 2.684376 -1.388610 1.785046 1.956888 2.281386 2.563576 2.643708 -1.345894 1.706236 1.842983 2.264164 2.606222 2.694785 -1.320329 1.694191 1.923363 2.218151 2.645478 2.750259 -1.332386 1.748388 2.014721 2.221780 2.602628 2.697461 -1.397603 1.715354 1.949721 2.236000 2.577802 2.661479 -1.618810 1.795968 2.016419 2.205191 2.506636 2.636829 -1.659811 1.735333 2.021086 2.175840 2.443378 2.641454 -1.539528 1.652064 1.946773 2.095081 2.446637 2.636547 -1.532272 1.592873 1.977822 2.053408 2.551491 2.674907 -1.509350 1.581109 2.004243 2.059379 2.524603 2.702937 -1.432533 1.504626 1.930707 2.042330 2.440661 2.690850 -1.194640 1.677037 2.023104 2.078391 2.446911 2.745852 -1.210373 1.824825 2.021515 2.139089 2.539931 2.659640 -1.276624 1.715436 1.952490 2.083815 2.473462 2.664346 -1.235656 1.548445 2.067341 2.118624 2.427438 2.727540 -1.283474 1.374296 1.963417 2.098418 2.474393 2.702856 -1.305021 1.394700 2.068003 2.139040 2.520168 2.706208 -1.284823 1.494312 2.055208 2.140334 2.602120 2.698828 -1.296593 1.587724 2.087205 2.156563 2.618559 2.718633 -1.252465 1.583350 2.108883 2.173872 2.600502 2.685035 -1.177439 1.612038 2.093884 2.155173 2.581066 2.695123 -1.132957 1.572991 2.135458 2.220598 2.615734 2.710569 -1.060318 1.542980 2.165747 2.230410 2.609442 2.697786 -0.993306 1.542205 2.170751 2.247209 2.631170 2.706892 -0.783750 1.568542 2.323323 2.398878 2.594196 2.690603 -0.866024 1.454427 2.113290 2.187039 2.662007 2.719943 -0.793002 1.437700 2.125666 2.225555 2.588880 2.664786 -0.863183 1.439828 2.031948 2.203948 2.586483 2.646886 -0.817301 1.443077 2.078742 2.356665 2.572146 2.635324 -0.840200 1.268198 1.973956 2.380693 2.546743 2.624124 -0.905910 1.472855 2.000805 2.420178 2.606009 2.662539 -0.885218 1.599132 2.063964 2.335379 2.688751 2.736255 -0.812099 1.480973 2.103159 2.193629 2.621360 2.702113 -0.727009 1.481278 2.088167 2.170556 2.575583 2.660557 -0.783755 1.482083 2.210773 2.281994 2.564635 2.658081 -0.810890 1.318001 2.156661 2.250146 2.565371 2.666169 -0.775372 1.352710 2.277457 2.371730 2.587244 2.655489 -0.765239 1.280609 2.227449 2.304899 2.577531 2.696870 -0.860727 1.309962 2.239215 2.358255 2.523746 2.681832 -0.828001 1.157509 2.157199 2.279201 2.554510 2.655379 -0.776568 1.131001 2.110470 2.282369 2.502240 2.634533 -0.662804 1.210648 2.214487 2.275268 2.480153 2.598167 -0.752595 1.172127 2.270252 2.354795 2.534373 2.613431 -0.769014 1.037539 2.239849 2.320190 2.523883 2.637275 -0.747299 1.036519 2.059875 2.380316 2.507719 2.677768 -0.818428 1.110448 2.132574 2.306792 2.442669 2.597844 -0.838124 1.256032 2.152521 2.304078 2.501081 2.591854 -0.842740 1.147341 2.045086 2.317073 2.459293 2.588472 -0.950977 1.150930 2.097644 2.290004 2.497415 2.643449 -0.932262 1.159756 1.945175 2.233748 2.538888 2.635754 -0.872640 1.294667 1.881084 2.112185 2.488729 2.612697 -0.953242 1.398337 1.906758 2.024454 2.396667 2.616332 -1.019160 1.447236 1.917323 2.023333 2.213019 2.528896 -0.980910 1.420444 1.857618 1.943436 2.294481 2.596120 -1.007917 1.474723 1.827586 1.921475 2.567362 2.643752 -1.057674 1.583820 1.862216 1.988312 2.507590 2.602780 -1.089480 1.610937 1.894205 2.067983 2.401427 2.589250 -1.155642 1.601524 1.853784 2.109924 2.266420 2.654880 -1.190394 1.403206 1.850320 2.129434 2.355479 2.599651 -1.165667 1.266234 1.847925 2.191760 2.352164 2.576809 -1.112543 1.237226 1.755553 2.196412 2.378413 2.515897 -1.093202 1.229320 1.630970 2.198491 2.394327 2.490062 -1.030916 1.160090 1.536996 2.150269 2.345755 2.526171 -1.090134 1.227459 1.470303 2.121663 2.325691 2.414263 -1.084185 1.353427 1.495774 2.165409 2.396637 2.501534 -1.128688 1.380138 1.551457 2.110309 2.296856 2.418999 -1.087172 1.454259 1.658795 2.020385 2.196298 2.381465 -1.039395 1.582193 1.728098 2.070179 2.301852 2.489432 -1.019025 1.646872 1.828918 2.125767 2.542468 2.624929 -1.017909 1.675444 2.009386 2.200627 2.432273 2.532754 -0.975365 1.568456 2.099629 2.243759 2.469669 2.558656 -1.045139 1.750545 2.091194 2.277034 2.473998 2.559636 -1.003490 1.670000 2.149872 2.216814 2.544142 2.591015 -0.972271 1.669349 2.066914 2.253461 2.528115 2.626794 -1.001400 1.910537 2.208899 2.322095 2.475052 2.594146 -1.106236 1.762398 2.170214 2.368326 2.532382 2.636954 -0.937567 1.570796 2.208314 2.312080 2.547601 2.604149 -0.984015 1.531648 2.154446 2.260403 2.519554 2.621365 -1.058045 1.589683 2.130473 2.238788 2.559220 2.636001 -1.126293 1.674296 2.142380 2.304378 2.581987 2.659797 -1.092169 1.547245 2.138847 2.246962 2.570924 2.653740 -1.164152 1.513575 2.120596 2.203037 2.555931 2.629117 -1.154436 1.451664 2.109876 2.193787 2.569383 2.668688 -1.171007 1.297549 2.105789 2.224294 2.529719 2.663245 -1.139370 1.343339 2.024942 2.161273 2.570054 2.662064 -1.214975 1.759488 2.013624 2.126711 2.350657 2.508933 -1.410441 1.787361 1.940449 2.082004 2.255781 2.406359 -1.192527 1.698280 1.956892 2.084836 2.235743 2.490643 -1.173627 1.448751 2.011122 2.145246 2.280142 2.534706 -1.172797 1.327177 1.938868 2.095910 2.247560 2.526844 -1.129709 1.376142 1.891533 1.985327 2.196351 2.582653 -1.195218 1.292910 1.887213 2.025135 2.200698 2.525594 -1.246281 1.338967 1.851654 2.072793 2.209074 2.457441 -1.244715 1.395538 1.916844 2.097048 2.296495 2.526646 -1.346432 1.453272 2.128410 2.313839 2.566271 2.666215 -1.392181 1.506569 2.060420 2.183828 2.523643 2.656421 -1.397671 1.478362 2.037869 2.140024 2.522879 2.634883 -1.405078 1.437969 2.064698 2.121678 2.484341 2.664086 -1.527970 1.731644 2.001400 2.182281 2.477459 2.609679 -1.602215 1.694049 2.065008 2.176143 2.567575 2.650751 -1.549243 1.668152 2.061940 2.136053 2.575954 2.678540 -1.590489 1.693208 1.921586 2.193585 2.522338 2.657822 -1.593120 1.715596 2.057856 2.172814 2.502009 2.607762 -1.508461 1.713948 2.053457 2.146855 2.383043 2.628673 -1.500942 1.577870 1.978516 2.080955 2.517866 2.640817 -1.503819 1.559203 1.933282 2.030596 2.516193 2.657495 -1.430951 1.506436 1.856364 2.014512 2.406913 2.583800 -1.394417 1.471155 1.914772 2.015327 2.414514 2.568928 -1.376718 1.476739 1.841743 1.961573 2.459621 2.552505 -1.304829 1.509257 1.807862 1.899025 2.532604 2.616563 -1.486241 1.646868 1.928992 2.176641 2.503384 2.645535 -1.477068 1.576408 1.937301 2.094449 2.468734 2.643633 -1.431493 1.551268 1.935807 2.027994 2.468760 2.605588 -1.427171 1.670820 1.944981 2.109944 2.482745 2.652433 -1.393190 1.649564 1.991075 2.070334 2.586450 2.667337 -1.406966 1.518528 1.967049 2.067755 2.501722 2.624107 -1.399129 1.487381 1.880327 1.972568 2.359193 2.604810 -1.419452 1.541906 1.920889 2.015257 2.416437 2.547537 -1.447736 1.626647 1.911603 2.037838 2.508304 2.609091 -1.507943 1.649223 1.954490 2.063843 2.515779 2.591471 -1.512511 1.697882 1.919266 2.077175 2.545774 2.631085 -1.577487 1.652922 1.969378 2.057105 2.533497 2.610477 -1.604710 1.687839 1.943635 2.030700 2.552461 2.659467 -1.634825 1.710086 1.943508 2.035741 2.553037 2.650522 -1.629110 1.721048 1.907265 2.020140 2.570097 2.652611 -1.653862 1.731013 1.917069 2.016503 2.551305 2.678978 -1.675623 1.740253 1.923108 1.995468 2.543890 2.693466 -1.704324 1.761003 1.892088 1.958603 2.520344 2.709583 -1.631746 1.698022 1.879765 1.974816 2.475043 2.688708 -1.563394 1.662351 1.863499 1.961656 2.492069 2.692141 -1.535271 1.621802 1.864516 2.016880 2.457202 2.701452 -1.463627 1.689995 1.942593 2.019493 2.516076 2.684085 -1.427161 1.545730 1.922601 1.983390 2.549083 2.724037 -1.387863 1.469421 1.874287 2.047091 2.486568 2.643007 -1.364743 1.462745 1.908513 2.076519 2.468769 2.627416 -1.421611 1.616670 2.074387 2.243630 2.604811 2.697119 -1.443567 1.802480 2.145890 2.311026 2.615127 2.704969 -1.402806 1.864810 2.209376 2.377972 2.654288 2.731440 -1.472673 1.860803 2.162882 2.447267 2.648421 2.719024 -1.518497 1.794725 2.075011 2.339205 2.552102 2.655931 -1.503597 1.758472 2.111549 2.304480 2.551002 2.643546 -1.466759 1.587712 2.046144 2.276602 2.546510 2.649906 -1.414608 1.499164 2.000686 2.080851 2.549084 2.654414 -1.324617 1.597419 1.961703 2.075259 2.518788 2.638260 -1.262448 1.666067 1.961546 2.098269 2.549101 2.630367 -1.220869 1.632115 1.947651 2.054954 2.515971 2.607563 -1.136650 1.569138 1.923253 2.011403 2.513979 2.612924 -1.058570 1.570577 1.921267 2.037973 2.484487 2.569497 -1.039823 1.492368 1.862383 2.113321 2.462634 2.586287 -1.291651 1.546687 1.888427 2.160338 2.444567 2.573682 -1.154151 1.629832 1.978719 2.114524 2.505413 2.616168 -1.018988 1.844229 2.003497 2.145640 2.430051 2.549664 -1.003639 1.900247 2.103968 2.200810 2.555267 2.678873 -1.007182 1.652528 2.033376 2.117896 2.534356 2.593837 -1.014065 1.625311 2.073565 2.163998 2.546138 2.611829 -1.009846 1.729007 2.001610 2.190071 2.554550 2.635426 -1.019489 1.599817 2.062920 2.180981 2.585351 2.651906 -1.042282 1.559849 2.061719 2.184907 2.608829 2.711272 -1.093985 1.606698 2.067049 2.179456 2.578115 2.647082 -1.117524 1.554503 2.010457 2.171257 2.524192 2.604614 -1.189148 1.687116 2.026818 2.220744 2.584656 2.673603 -1.184285 1.592927 2.011407 2.140558 2.575633 2.652764 -1.243271 1.544342 1.991354 2.103724 2.547726 2.633837 -1.249802 1.530059 1.930460 2.044509 2.489498 2.611045 -1.317227 1.550858 1.927474 2.019107 2.563575 2.632413 -1.300146 1.571198 1.817213 1.967321 2.572012 2.659755 -1.304786 1.459074 1.804350 1.873800 2.572345 2.677847 -1.272113 1.387927 1.710588 1.798443 2.519124 2.630967 -1.168824 1.271438 1.680467 1.847635 2.472587 2.636108 -1.127715 1.380423 1.702693 1.948341 2.254799 2.516590 -1.037344 1.362071 1.698870 1.943363 2.319984 2.576108 -0.912701 1.215239 1.774758 2.057933 2.407301 2.609739 -0.884045 1.283341 1.740086 2.012038 2.332329 2.530152 -0.859928 1.361393 1.787767 2.032428 2.439162 2.572497 -0.933575 1.497313 1.860114 2.007764 2.460777 2.636583 -0.980843 1.376674 1.808267 1.899302 2.551384 2.660680 -0.888314 1.390836 1.819063 1.938604 2.611726 2.713704 -0.839112 1.455052 1.864246 1.932569 2.561260 2.649480 -0.851738 1.633441 1.854938 2.065105 2.591532 2.637966 -0.927993 1.739190 1.882023 2.133201 2.585017 2.640778 -0.938681 1.795656 1.962111 2.138930 2.565233 2.627897 -0.939389 1.842127 2.021817 2.196345 2.611519 2.658322 -0.876668 1.922758 2.066598 2.238607 2.657831 2.709139 -0.928890 1.831807 2.053719 2.203623 2.653635 2.695408 -0.843177 1.785949 2.180039 2.258075 2.596807 2.669868 -0.904710 1.738574 2.045482 2.171335 2.659082 2.701770 -0.870576 1.672854 2.046684 2.160295 2.663395 2.706284 -0.863208 1.611276 2.039577 2.131986 2.662744 2.710206 -0.911587 1.521477 1.972249 2.117701 2.671514 2.736290 -0.857624 1.506231 1.927459 2.092066 2.599004 2.671353 -0.876724 1.386211 1.930102 2.020125 2.640246 2.715714 -0.822485 1.363083 1.951099 2.012089 2.546285 2.704224 -0.896312 1.299233 1.946153 2.039999 2.427568 2.660429 -0.993275 1.379765 2.001120 2.083441 2.476481 2.621083 -1.111974 1.369262 1.980570 2.050077 2.518420 2.654724 -1.168214 1.421156 1.929649 2.013732 2.513895 2.659462 -1.185532 1.477308 1.941700 2.021792 2.545835 2.636829 -1.134677 1.498395 1.996860 2.077054 2.487095 2.605961 -1.411729 1.500808 1.930565 2.251695 2.391409 2.514752 -1.387101 1.551631 1.939267 2.134432 2.390647 2.538102 -1.436468 1.601632 1.856306 2.001721 2.498428 2.579682 -1.490762 1.673865 1.865367 2.015258 2.490944 2.589599 -1.532290 1.665821 1.854110 1.987787 2.544314 2.634547 -1.563136 1.683249 1.819205 1.981344 2.592402 2.655991 -1.532691 1.642869 1.795089 1.955952 2.595574 2.688667 -1.506939 1.596868 1.724719 1.902522 2.497152 2.646767 -1.385229 1.553302 1.733776 1.993489 2.385677 2.620193 -1.191373 1.508094 1.914117 2.177183 2.460347 2.600638 -0.990202 1.268417 1.760300 1.988487 2.516663 2.661016 -1.004888 1.273030 1.919583 1.976961 2.621532 2.711155 -1.013289 1.479166 1.983769 2.021110 2.561293 2.681392 -1.094384 1.424205 1.985002 2.164791 2.592137 2.670975 -1.057765 1.377512 1.866113 2.165416 2.490671 2.623341 -1.001768 1.321304 1.902289 2.133880 2.499889 2.659347 -0.896048 1.414778 1.927546 2.127605 2.570653 2.658502 -0.862503 1.586972 1.946548 2.153624 2.615123 2.677873 -0.837783 1.700010 1.932982 2.209447 2.588567 2.687532 -0.901209 1.639772 1.999974 2.070577 2.515297 2.763152 -0.955829 1.601245 2.008965 2.112233 2.503888 2.592844 -0.939285 1.704094 2.027412 2.125922 2.430007 2.538916 -0.948268 1.700873 2.002768 2.088348 2.563468 2.622110 -0.959154 1.624274 2.005824 2.077760 2.577716 2.658733 -0.932538 1.593435 1.952831 2.044660 2.567978 2.644497 -0.933107 1.590563 1.945695 2.111900 2.534278 2.608873 -0.943808 1.649088 1.897019 2.104647 2.578170 2.689758 -1.003034 1.619161 1.930228 2.216721 2.582337 2.637890 -0.936810 1.692346 1.965525 2.118648 2.628517 2.684797 -0.973578 1.737821 1.975673 2.106344 2.658295 2.722445 -0.955324 1.750194 1.961437 2.075373 2.655612 2.731757 -0.994013 1.727390 1.946779 2.062413 2.643379 2.738490 -1.005363 1.693919 1.929868 2.100177 2.618754 2.684861 -0.967862 1.640078 1.930261 2.021548 2.639890 2.726662 -0.928258 1.579359 1.864413 1.973012 2.638908 2.717888 -1.058334 1.410591 1.870850 2.066023 2.451575 2.633697 -1.123046 1.486876 1.862969 2.086078 2.412975 2.591738 -1.177472 1.431539 1.849290 2.099756 2.423335 2.566135 -1.187028 1.443506 1.882075 1.983318 2.550673 2.639389 -1.267969 1.628389 1.932608 2.043278 2.552232 2.641727 -1.355546 1.701559 1.924241 2.034556 2.590180 2.660965 -1.472056 1.739983 1.914264 2.052330 2.573889 2.644926 -1.461490 1.790656 1.911310 2.057871 2.525599 2.587235 -1.542347 1.742399 1.901654 2.063063 2.499169 2.580661 -1.550813 1.642896 1.877392 1.995154 2.474361 2.561166 -1.625354 1.724756 1.899115 2.052586 2.447095 2.556852 -1.636703 1.742201 1.904488 2.155317 2.470314 2.569291 -1.608688 1.701026 1.957110 2.085583 2.465316 2.552203 -1.517569 1.685169 1.923050 2.028968 2.382899 2.503932 -1.215848 1.648126 1.842885 2.049966 2.393827 2.484346 -1.158500 1.452995 1.752665 1.859020 2.467269 2.575520 -1.128274 1.384146 1.801504 1.899178 2.472451 2.609988 -1.080623 1.414338 1.812493 1.916642 2.422686 2.620118 -1.104866 1.492913 1.854038 1.971940 2.444002 2.583583 -1.235805 1.437823 1.919484 2.042792 2.483999 2.617147 -1.167412 1.407601 1.774394 2.073573 2.390599 2.543323 -1.096565 1.317231 1.782210 2.013544 2.394372 2.571806 -1.104307 1.206800 1.718582 2.001006 2.351339 2.505639 -1.047321 1.316889 1.824322 2.050773 2.417158 2.531028 -1.087184 1.408401 1.843144 2.031666 2.440481 2.544264 -1.108521 1.394200 1.760026 2.005728 2.435035 2.552154 -1.121767 1.340590 1.749504 1.963633 2.493819 2.609645 -1.122415 1.452714 1.793131 2.030414 2.502133 2.593239 -1.026877 1.468099 1.745342 1.860466 2.483684 2.579747 -0.971670 1.244091 1.752977 1.837331 2.384716 2.625316 -0.917302 1.104410 1.674928 1.792426 2.336189 2.629469 -0.961560 1.088356 1.555776 1.663706 2.282322 2.579748 -0.919563 1.063279 1.573205 1.711100 2.422693 2.675976 -0.875889 1.022614 1.380839 1.829163 2.584656 2.667378 -0.763749 1.018806 1.506319 1.707976 2.471526 2.595865 -0.886944 1.031388 1.425057 1.710023 2.427922 2.576385 -0.890351 1.037652 1.443986 1.587883 2.520205 2.695833 -0.906256 1.035046 1.405613 1.523743 2.536532 2.596081 -0.929418 1.061071 1.157090 1.566597 2.528260 2.694068 -0.917396 1.106117 1.253042 1.389506 2.551566 2.709098 -0.910230 1.042070 1.162527 1.362129 2.393076 2.605349 -0.804288 1.059586 1.418081 1.530362 2.410566 2.663442 -0.907675 1.046288 1.392541 1.508232 2.495351 2.692340 -0.835212 1.126874 1.350498 1.463210 2.567735 2.694674 -0.770295 1.150701 1.428259 1.601173 2.610228 2.683669 -0.924536 1.075405 1.468526 1.669865 2.543683 2.693196 -0.972382 1.191757 1.544758 1.638670 2.535321 2.642972 -0.903877 1.101926 1.510782 1.602659 2.487038 2.638272 -0.881279 1.096901 1.554249 1.644297 2.424659 2.557575 -0.866115 1.118877 1.603042 1.702467 2.543898 2.649301 -0.906645 1.160248 1.672021 1.747258 2.517909 2.650863 -0.861085 1.205864 1.660991 1.847091 2.462741 2.632034 -0.837175 1.187776 1.806042 1.889495 2.508608 2.684557 -0.797709 1.178516 1.903177 2.021653 2.546180 2.690072 -0.802875 1.262753 1.923936 2.000576 2.568440 2.670106 -0.766638 1.320827 1.961021 2.058945 2.582312 2.646725 -0.811579 1.455194 2.011480 2.084784 2.548418 2.639933 -0.829770 1.484961 2.052714 2.127227 2.530640 2.608181 -0.799011 1.567454 2.155632 2.265108 2.573173 2.668504 -0.730379 1.358614 2.125791 2.194588 2.518703 2.605426 -0.720667 1.277836 2.042808 2.111923 2.592800 2.675300 -0.777663 1.163703 2.066790 2.179199 2.570004 2.675513 -0.839969 1.373176 2.185884 2.304679 2.509358 2.602576 -0.815752 1.915221 2.233635 2.288481 2.569983 2.628428 -1.191882 1.945689 2.175132 2.299053 2.523524 2.632041 -1.036281 1.742208 2.072713 2.141555 2.573194 2.641551 -1.042507 1.303046 2.012892 2.154612 2.530678 2.649182 -1.109942 1.204237 1.928687 2.058228 2.384097 2.639570 -1.187387 1.287703 1.954253 2.071260 2.382559 2.641811 -1.239189 1.327757 1.930550 2.015277 2.361685 2.627501 -1.292084 1.351985 1.938008 2.017320 2.411502 2.663432 -1.306236 1.382401 1.918450 2.038312 2.339392 2.637738 -1.330235 1.401641 1.873760 1.990443 2.185496 2.510909 -1.356391 1.459759 1.883388 1.980460 2.264547 2.541810 -1.347396 1.438637 1.891675 2.018006 2.302572 2.643809 -1.300877 1.390171 1.889271 1.972933 2.337515 2.605637 -1.318667 1.410121 1.895352 1.990366 2.384682 2.654040 -1.309274 1.425501 1.966145 2.021896 2.501117 2.698509 -1.293853 1.370923 1.908443 1.999149 2.465481 2.673998 -1.277395 1.382844 2.002299 2.066843 2.496853 2.664070 -1.245384 1.422441 2.002908 2.070718 2.556839 2.666388 -1.272587 1.491087 2.012301 2.129241 2.562307 2.657432 -1.265182 1.533940 2.020942 2.093088 2.498380 2.630954 -1.265700 1.477033 2.103009 2.196534 2.455284 2.619887 -1.288505 1.642454 2.093854 2.247833 2.561691 2.658788 -1.410258 1.828971 2.171872 2.374134 2.564587 2.653381 -1.353887 1.710043 2.209331 2.426043 2.629318 2.702189 -1.413615 1.766928 2.137724 2.434853 2.632060 2.702909 -1.459054 1.706939 2.135084 2.377030 2.626415 2.708945 -1.498018 1.687923 2.094822 2.342946 2.558778 2.665699 -1.413908 1.588267 2.086727 2.293084 2.513587 2.642131 -1.399998 1.553342 1.938772 2.183871 2.458665 2.610409 -1.373521 1.449791 1.880601 2.079841 2.298236 2.559768 -1.367538 1.440752 1.973770 2.086070 2.339106 2.621913 -1.368842 1.460821 2.006053 2.129789 2.391520 2.650517 -1.375993 1.496235 2.050052 2.130850 2.453915 2.698625 -1.340575 1.484156 2.084130 2.140940 2.549924 2.685428 -1.389975 1.553009 2.063781 2.147982 2.592260 2.703825 -1.247451 1.503376 2.044299 2.136485 2.344491 2.599169 -1.315110 1.540850 2.028329 2.116330 2.272535 2.431545 -1.298833 1.587487 2.071926 2.185875 2.335690 2.500779 -1.293658 1.562430 2.031101 2.149606 2.408168 2.517292 -1.357545 1.513305 1.998085 2.153047 2.450464 2.583804 -1.314414 1.517423 2.079463 2.179438 2.522288 2.616203 -1.237750 1.513563 2.052227 2.181066 2.539042 2.628158 -1.208558 1.486041 2.046503 2.194666 2.489982 2.636673 -1.196570 1.462494 2.073139 2.230856 2.547633 2.700603 -1.080935 1.459427 2.110500 2.217708 2.538133 2.678354 -1.094483 1.378608 2.167880 2.246181 2.567935 2.691322 -0.942435 1.463343 2.253533 2.330775 2.538479 2.626769 -0.828468 1.390170 2.152319 2.218028 2.545274 2.621490 -0.883311 1.334196 2.094816 2.191259 2.475576 2.573464 -0.863185 1.418682 2.080489 2.166381 2.556104 2.714086 -0.848520 1.391080 2.049319 2.134194 2.702541 2.780818 -0.826225 1.373582 2.037386 2.120576 2.736093 2.782594 -0.823246 1.343853 2.033890 2.111803 2.740872 2.787067 -0.833848 1.336791 2.045450 2.118012 2.699609 2.796181 -0.811654 1.321345 2.094991 2.178116 2.494230 2.649899 -0.947528 1.361146 2.127848 2.219008 2.511382 2.668194 -0.875759 1.251606 2.133422 2.241748 2.473825 2.662930 -0.933534 1.448444 2.139134 2.244510 2.486761 2.606936 -0.945109 1.280801 2.208944 2.335059 2.511318 2.614528 -0.956935 1.371241 2.107196 2.194521 2.403252 2.573030 -0.981000 1.251932 2.147964 2.266597 2.440418 2.624374 -1.061610 1.231691 2.076021 2.233401 2.438599 2.636988 -1.018874 1.354035 1.998033 2.260078 2.443139 2.554775 -1.080301 1.301891 2.034629 2.145600 2.415056 2.591218 -1.133867 1.359760 2.063950 2.164629 2.439392 2.628661 -1.125038 1.414128 1.997540 2.103717 2.392421 2.599578 -1.167273 1.393564 1.998177 2.076478 2.441776 2.643288 -1.198696 1.421193 1.967983 2.057020 2.432820 2.645067 -1.256230 1.378074 1.941853 2.019326 2.444584 2.608853 -1.295565 1.412154 1.932411 2.008349 2.430053 2.649016 -1.281347 1.464522 1.888236 2.006518 2.425280 2.635204 -1.270582 1.406704 1.901187 1.969293 2.470983 2.647901 -1.266697 1.372887 1.871811 1.957591 2.414971 2.648622 -1.194388 1.351744 1.888250 1.978092 2.400857 2.662660 -1.198872 1.299839 1.864283 1.963651 2.362794 2.619509 -1.126580 1.240104 1.902544 1.997646 2.331426 2.608634 -1.104618 1.214183 1.879788 2.014306 2.251659 2.573373 -1.024288 1.193207 1.868916 2.127876 2.376009 2.623451 -1.000362 1.230212 1.960304 2.075244 2.329353 2.584128 -0.977548 1.321985 1.988755 2.104256 2.381026 2.607919 -0.927608 1.447916 2.027888 2.123013 2.478479 2.585880 -0.887733 1.516534 2.046895 2.153890 2.480515 2.582006 -0.898681 1.564754 2.091528 2.179653 2.573940 2.676783 -0.974718 1.500859 2.081966 2.177780 2.532281 2.634995 -1.023818 1.390635 2.060590 2.142028 2.469386 2.636908 -1.106581 1.431053 1.977134 2.097146 2.471693 2.659120 -1.201259 1.485663 1.944652 2.112542 2.500250 2.665927 -1.285694 1.520657 1.911058 2.044248 2.487710 2.665801 -1.362495 1.534785 1.910552 1.990936 2.505705 2.661527 -1.434594 1.514838 1.934187 2.017407 2.501527 2.693875 -1.420840 1.519491 1.909348 1.986650 2.460403 2.688194 -1.404412 1.469806 1.964287 2.054233 2.366794 2.655269 -1.388287 1.466909 1.964052 2.058950 2.286531 2.604935 -1.367998 1.434810 1.857703 2.007116 2.196577 2.604187 -1.300836 1.380544 1.740254 2.046889 2.235228 2.521906 -1.231299 1.321604 1.867230 2.147627 2.354630 2.579138 -1.154924 1.255903 1.932323 2.164374 2.392832 2.605994 -1.098663 1.202218 1.948275 2.150159 2.492596 2.625742 -1.057458 1.221852 1.869129 2.268825 2.456540 2.580362 -1.033078 1.150105 1.708873 2.264876 2.476044 2.563612 -0.988998 1.159268 1.962027 2.302711 2.448723 2.560725 -1.028425 1.228689 2.025910 2.260366 2.561850 2.661757 -0.934860 1.348208 2.053889 2.214742 2.525301 2.647713 -0.919150 1.264565 2.068138 2.183398 2.534979 2.644315 -0.975247 1.362233 2.052147 2.231420 2.582800 2.724482 -0.954336 1.311177 1.977372 2.238157 2.478111 2.617046 -0.941853 1.335982 1.976422 2.219013 2.579491 2.714299 -0.928694 1.366450 1.884879 2.183146 2.580560 2.657594 -0.986067 1.338370 1.954317 2.187863 2.566522 2.638835 -0.912646 1.284402 1.814142 2.175069 2.553933 2.638518 -0.968965 1.310497 1.839690 2.078084 2.590335 2.660573 -0.977192 1.304629 1.880951 2.127022 2.598044 2.712114 -1.023839 1.299619 1.944708 2.103778 2.625919 2.730897 -1.110208 1.286313 1.959383 2.053969 2.564587 2.676132 -1.028136 1.324243 1.976740 2.094942 2.586202 2.754727 -1.129799 1.269907 2.011874 2.109219 2.588902 2.696539 -1.056967 1.340484 2.016171 2.105554 2.557611 2.747157 -1.037500 1.255766 2.029385 2.136193 2.511776 2.709627 -1.006157 1.417167 2.071949 2.132612 2.543898 2.701957 -1.136962 1.416211 2.050339 2.112042 2.449673 2.695205 -1.135319 1.436267 2.083850 2.194924 2.386385 2.656934 -1.094073 1.385456 2.015160 2.113333 2.320097 2.641531 -1.025929 1.360649 1.878300 1.981456 2.128037 2.458938 -1.142747 1.416162 1.901013 2.054884 2.170210 2.459052 -1.093211 1.488385 1.801376 2.073578 2.203432 2.494834 -1.161243 1.263262 1.784814 2.071204 2.194577 2.436217 -1.010788 1.141181 1.728171 2.118721 2.251271 2.426326 -1.083805 1.275984 1.888426 2.068392 2.227464 2.511105 -1.093824 1.303401 1.924085 2.183963 2.348527 2.531702 -1.409867 1.540059 1.722330 2.049905 2.235685 2.389249 -1.466595 1.617030 1.819393 2.035808 2.439730 2.543324 -1.526883 1.811727 1.926153 2.129197 2.481471 2.556058 -1.420465 1.731610 1.925362 2.081119 2.474447 2.570275 -1.248374 1.462520 1.699273 1.907107 2.355354 2.484796 -1.183224 1.558159 1.646615 1.999807 2.374069 2.461600 -1.143841 1.513288 1.675690 1.906750 2.428362 2.518793 -1.066986 1.500051 1.667526 1.961464 2.445898 2.521565 -1.046648 1.520761 1.705160 1.878376 2.459759 2.532729 -1.013709 1.559530 1.737535 1.955854 2.437820 2.515857 -1.021952 1.586883 1.737034 1.929179 2.523644 2.577879 -0.942307 1.579146 1.776104 2.060265 2.437220 2.517653 -0.914226 1.642076 1.812801 2.001091 2.508510 2.570062 -0.952017 1.688066 1.935018 2.016153 2.446793 2.563584 -0.856280 1.697514 1.902727 2.012686 2.522414 2.584398 -0.891878 1.553150 1.935497 2.046974 2.532664 2.594967 -0.845424 1.602286 1.937720 2.027521 2.583016 2.649168 -0.876501 1.716624 1.939566 2.067536 2.588264 2.625363 -0.901014 1.864369 1.978925 2.075191 2.462666 2.609798 -0.911677 1.767853 1.947788 2.072575 2.595744 2.634946 -0.937394 1.708734 1.927739 2.054606 2.574109 2.647431 -1.003647 1.614615 1.942062 2.035984 2.592009 2.664724 -1.089415 1.563712 1.910690 1.974956 2.590910 2.681816 -1.180196 1.457231 1.840836 1.921595 2.573409 2.659354 -1.239380 1.444276 1.818908 1.893870 2.559595 2.657419 -1.377315 1.528992 1.744904 1.862220 2.591155 2.669066 -1.504904 1.589455 1.777756 1.887229 2.506207 2.617754 -1.628411 1.697438 1.830602 1.957574 2.495413 2.652982 -1.655345 1.726761 1.914454 2.042947 2.589709 2.658972 -1.698171 1.754006 1.967189 2.090429 2.602705 2.677128 -1.676303 1.767709 2.042847 2.156668 2.628324 2.690687 -1.724974 1.789927 2.022254 2.138454 2.576232 2.671774 -1.748186 1.802674 2.037781 2.180248 2.542513 2.638948 -1.727494 1.820586 1.984490 2.159068 2.525266 2.641113 -1.681162 1.820947 1.975700 2.157376 2.485796 2.590414 -1.695585 1.807190 1.993679 2.180888 2.380331 2.560860 -1.706934 1.810695 2.008115 2.133097 2.420753 2.641751 -1.654579 1.765733 2.024758 2.124029 2.493478 2.660848 -1.482280 1.849534 2.039337 2.240485 2.457215 2.547774 -1.603912 1.832539 2.051601 2.251630 2.461138 2.560412 -1.611914 1.787316 2.134457 2.250322 2.620939 2.678279 -1.702258 1.857664 2.093573 2.245781 2.633559 2.687798 -1.692364 1.776254 2.026193 2.275357 2.580552 2.683245 -1.587105 1.750297 1.997944 2.242069 2.586538 2.691453 -1.535548 1.765338 2.053611 2.233619 2.646730 2.717875 -1.189624 1.336795 1.763750 2.001818 2.436073 2.594289 -1.190961 1.322629 1.662495 2.028538 2.347408 2.530977 -1.170930 1.394685 1.727435 2.022812 2.382661 2.552602 -1.082797 1.383312 1.623231 1.825654 2.463128 2.574492 -1.058861 1.316419 1.617844 1.734402 2.496675 2.607354 -1.031745 1.332707 1.534727 1.707419 2.433275 2.544209 -1.096632 1.405927 1.540583 1.719915 2.509655 2.573209 -1.088142 1.381934 1.507222 1.618554 2.484112 2.618437 -1.128355 1.341806 1.494171 1.715551 2.495969 2.579865 -1.175042 1.360111 1.572899 1.757164 2.481162 2.588909 -1.251837 1.388286 1.580411 1.744290 2.530232 2.614281 -1.310739 1.444267 1.657251 1.823494 2.515110 2.614602 -1.329594 1.483659 1.703926 1.871461 2.532374 2.621921 -1.364647 1.503101 1.755842 1.919028 2.547482 2.624406 -1.400143 1.516781 1.808646 1.943813 2.572341 2.655551 -1.403936 1.536778 1.854571 1.961169 2.527770 2.650144 -1.441635 1.534902 1.873629 1.970753 2.528116 2.670832 -1.448614 1.528669 1.860977 1.951947 2.473243 2.657815 -1.451619 1.547843 1.824154 2.019980 2.462454 2.654097 -1.474914 1.548478 1.890892 1.995469 2.484609 2.659992 -1.432352 1.541523 1.888921 2.060202 2.407091 2.630443 -1.443739 1.529785 1.892698 1.996592 2.373799 2.620977 -1.379224 1.489730 1.897357 2.016742 2.416784 2.627496 -1.377069 1.463119 1.911655 2.022620 2.355389 2.608649 -1.331805 1.431037 1.929174 2.046904 2.374045 2.605001 -1.261392 1.448545 1.975458 2.082519 2.366860 2.620796 -1.222534 1.418974 1.979786 2.116310 2.439587 2.664630 -1.142938 1.304442 1.984504 2.071356 2.473077 2.672948 -1.163073 1.268521 1.930445 2.046302 2.305097 2.594448 -1.102508 1.246087 1.951734 2.103272 2.299777 2.571979 -1.010568 1.147332 1.902536 2.046240 2.288021 2.566997 -1.010466 1.307000 1.827652 2.076872 2.333263 2.555967 -1.246338 1.534633 1.859079 2.187994 2.388066 2.541619 -1.200493 1.578943 1.899233 2.165025 2.448881 2.583181 -0.969958 1.321171 1.879198 2.166270 2.417955 2.602455 -0.883738 1.359575 2.004523 2.100728 2.516977 2.633388 -0.844286 1.405546 2.057051 2.140524 2.516435 2.660060 -0.862435 1.502332 2.107411 2.205164 2.558187 2.660491 -0.940459 1.428240 2.139821 2.233319 2.564481 2.673761 -0.930987 1.583981 2.021904 2.152394 2.404035 2.506344 -1.046556 1.798258 1.988424 2.129290 2.357578 2.453538 -1.053483 1.593749 2.104331 2.232679 2.372807 2.498150 -1.137645 1.642783 2.089155 2.231807 2.383165 2.575567 -1.180782 1.899843 2.114705 2.223340 2.453147 2.554915 -1.144768 1.795798 2.058166 2.194105 2.452139 2.558749 -1.132549 1.688302 1.980246 2.107445 2.321949 2.446573 -1.155835 1.527004 1.951246 2.101869 2.265669 2.423260 -1.218988 1.551877 1.978933 2.129503 2.365239 2.547894 -1.269955 1.592834 1.957403 2.059254 2.477360 2.620075 -1.304775 1.597146 1.974266 2.084408 2.414413 2.613437 -1.304611 1.645522 1.976796 2.100584 2.364468 2.510600 -1.357449 1.721619 2.013975 2.141789 2.385178 2.512136 -1.335725 1.833907 2.001270 2.155846 2.401439 2.496098 -1.311398 1.558292 1.938760 2.063279 2.307274 2.526616 -1.360360 1.440763 1.893578 2.075310 2.237527 2.504599 -1.331599 1.468494 1.928903 2.060963 2.318029 2.567821 -1.318611 1.537603 1.924470 2.015195 2.358808 2.593307 -1.214364 1.546191 1.882099 1.995250 2.377928 2.652939 -1.296335 1.566534 1.875140 2.003277 2.476321 2.631527 -1.397784 1.586154 1.861480 2.030113 2.587065 2.654646 -1.475237 1.644203 1.915883 2.047027 2.653267 2.714423 -1.524741 1.716019 1.957822 2.067654 2.623703 2.690243 -1.578686 1.677809 1.940919 2.066782 2.613829 2.704583 -1.558659 1.702533 1.930114 2.028274 2.615049 2.686527 -1.500895 1.699904 1.908920 1.998738 2.620634 2.691280 -1.442946 1.702672 1.900985 1.975333 2.624730 2.699244 -1.372883 1.638290 1.917707 2.028286 2.626184 2.697452 -1.284224 1.656214 1.897845 1.992564 2.644425 2.707381 -1.204035 1.651822 1.889771 1.992564 2.638494 2.709577 -1.149198 1.622068 1.884510 1.979246 2.632691 2.699244 -1.133732 1.618626 1.895041 1.977544 2.625046 2.694884 -1.157568 1.662329 1.889784 1.978395 2.626035 2.684544 -1.218943 1.667105 1.879063 2.005165 2.602271 2.658132 -1.224226 1.626864 1.791981 1.894650 2.517637 2.647870 -1.354348 1.558760 1.843077 1.930892 2.571225 2.630861 -1.339527 1.595092 1.762248 1.979267 2.546017 2.613198 -1.389217 1.592419 1.859636 1.962120 2.550950 2.637714 -1.441267 1.590433 1.879393 1.987047 2.582006 2.666738 -1.431033 1.609808 1.890274 2.037874 2.525040 2.672056 -1.468384 1.575421 1.945848 2.029866 2.551470 2.705315 -1.450092 1.601430 1.954103 2.062799 2.534132 2.666966 -1.482171 1.565438 1.973588 2.124154 2.520208 2.656022 -1.429418 1.560169 1.984368 2.078415 2.510933 2.668346 -1.440913 1.587927 1.976090 2.097963 2.464144 2.621669 -1.432466 1.582610 1.973345 2.159930 2.500511 2.668329 -1.429101 1.593924 1.974811 2.070207 2.527049 2.683794 -1.377247 1.571046 1.937033 2.094336 2.488609 2.653189 -1.485270 1.572718 1.935520 2.015863 2.471891 2.687018 -1.473606 1.569260 1.872618 1.962880 2.412797 2.654369 -1.486059 1.580245 1.866252 1.975544 2.318749 2.586712 -1.465213 1.581118 1.784993 1.913021 2.172477 2.555915 -1.433656 1.566339 1.728508 1.853259 2.061966 2.413952 -1.367612 1.543842 1.700068 1.854972 2.034622 2.282022 -1.503264 1.657179 1.809362 1.937669 2.143191 2.435605 -1.340742 1.593266 1.833843 2.129408 2.468938 2.572839 -1.336721 1.481696 1.944774 2.230613 2.480290 2.580121 -1.321318 1.603141 1.968333 2.203371 2.515102 2.650047 -1.341931 1.668341 1.988838 2.185252 2.564141 2.653216 -1.315554 1.648897 1.959899 2.147638 2.516885 2.612616 -1.277314 1.620218 2.001858 2.229409 2.531549 2.621818 -1.305168 1.578599 2.038627 2.295512 2.565341 2.654838 -1.330511 1.609911 1.991543 2.262708 2.563339 2.665956 -1.374004 1.683930 1.980067 2.338575 2.595603 2.682727 -1.268703 1.389752 1.885378 2.110404 2.488114 2.638645 -1.216813 1.310045 1.854691 2.036714 2.277594 2.566534 -1.234945 1.337806 1.949427 2.059361 2.295326 2.566468 -1.188939 1.302387 1.996200 2.107442 2.349193 2.585236 -1.268977 1.440154 2.024771 2.136855 2.444005 2.664042 -1.274373 1.383125 2.066734 2.151173 2.407560 2.654201 -1.264553 1.356123 2.001656 2.118864 2.287784 2.569535 -1.234337 1.329784 2.063392 2.150768 2.367188 2.598596 -1.155210 1.257442 2.082496 2.211439 2.390593 2.620100 -1.199455 1.265557 1.934979 2.226691 2.540894 2.664195 -1.304701 1.526851 1.954550 2.174656 2.477694 2.621713 -1.638067 1.896263 2.077081 2.361007 2.646027 2.718839 -1.643821 1.943109 2.131987 2.329624 2.578717 2.645464 -1.640898 1.989224 2.161468 2.269205 2.586475 2.655395 -1.723007 1.910073 2.070189 2.259565 2.564392 2.640342 -1.652067 1.998733 2.135937 2.352824 2.652512 2.717475 -1.680722 2.074091 2.269666 2.453470 2.699939 2.763041 -1.695085 2.058973 2.193637 2.313571 2.639345 2.699445 -1.782955 2.014033 2.224899 2.332287 2.645355 2.724401 -1.705960 1.974745 2.180829 2.256084 2.575177 2.716938 -1.662556 1.988643 2.115183 2.205279 2.548376 2.657655 -1.562053 1.843896 2.173269 2.265891 2.477950 2.695966 -1.685920 1.795837 2.078330 2.180138 2.465369 2.667314 -1.680613 1.738555 1.994736 2.131193 2.473191 2.649544 -1.659289 1.833639 2.000087 2.140167 2.564913 2.692724 -1.714890 1.784823 1.974907 2.085230 2.566670 2.701036 -1.729112 1.826059 1.895041 2.053724 2.603924 2.699244 -1.696294 1.791079 1.916038 2.017742 2.583106 2.704200 -1.626844 1.720989 1.890443 2.014482 2.589192 2.689135 -1.574181 1.677998 1.880801 1.982799 2.574984 2.664083 -1.432597 1.676378 1.834673 1.964658 2.535300 2.638654 -1.318535 1.535375 1.836957 1.932882 2.478408 2.578350 -1.226292 1.492951 1.836423 1.946067 2.430171 2.582074 -1.098912 1.499048 1.896293 2.028872 2.540535 2.618603 -1.034465 1.533372 1.964842 2.070966 2.578583 2.651519 -0.979835 1.480912 1.975960 2.089319 2.534240 2.632634 -0.916592 1.481293 1.967506 2.053292 2.558345 2.642742 -0.937338 1.474374 2.023762 2.110460 2.585438 2.665463 -0.873055 1.560533 2.028802 2.086416 2.575020 2.684778 -0.901938 1.628414 2.031806 2.102850 2.610158 2.685650 -0.862562 1.556144 1.997573 2.081742 2.533196 2.615757 -0.906140 1.665744 2.019373 2.133337 2.581928 2.661153 -0.872836 1.638660 2.038436 2.097283 2.645014 2.697786 -0.829264 1.441895 2.039191 2.111142 2.611659 2.688610 -0.825197 1.304534 2.056354 2.143792 2.590309 2.657819 -0.793520 1.521024 1.979438 2.058424 2.596225 2.668581 -0.849751 1.485532 1.986103 2.055458 2.624269 2.701899 -0.849936 1.385589 2.007518 2.060577 2.567229 2.678449 -0.829655 1.230975 1.988404 2.101475 2.530728 2.677331 -0.940677 1.264510 1.946316 2.046724 2.499806 2.677984 -1.038884 1.297487 1.958215 2.035997 2.406970 2.650323 -1.157909 1.247311 1.892511 1.984329 2.396990 2.663399 -1.237064 1.318827 1.843309 1.954773 2.420851 2.693910 -1.328871 1.403948 1.808685 1.946118 2.400888 2.683397 -1.393193 1.460812 1.822128 1.939601 2.242548 2.723232 -1.370957 1.526137 1.785367 1.963164 2.136749 2.644805 -1.501135 1.606768 1.841831 2.009462 2.198461 2.614649 -1.467944 1.551473 1.849852 1.982829 2.208604 2.514793 -1.405944 1.480977 1.855980 1.997060 2.178717 2.490007 -1.448170 1.520957 1.868813 1.975365 2.241031 2.616351 -1.380808 1.612670 1.869962 2.026788 2.443477 2.639977 -1.483716 1.596112 1.969733 2.100913 2.577431 2.688144 -1.467685 1.578222 1.986564 2.194709 2.570945 2.671094 -1.496302 1.614196 2.032020 2.218322 2.553463 2.681813 -1.596958 1.722731 2.144525 2.319980 2.604392 2.703958 -1.563283 1.830072 2.213128 2.432926 2.641108 2.721000 -1.591103 1.948477 2.288414 2.486581 2.666837 2.743573 -1.475707 1.718658 2.050982 2.217962 2.487280 2.571804 -1.558930 1.772302 2.094474 2.234464 2.518928 2.597737 -1.567586 1.822091 2.100593 2.286654 2.533948 2.648113 -1.750029 1.936668 2.135601 2.347638 2.546896 2.638316 -1.756882 1.998584 2.116800 2.223412 2.556559 2.647062 -1.700043 1.922262 2.075348 2.184374 2.556081 2.639062 -1.598667 1.709712 1.994558 2.098788 2.521397 2.628442 -1.609782 1.719799 1.937528 2.091978 2.547584 2.621070 -1.580745 1.686692 1.927934 2.059508 2.580331 2.643528 -1.541164 1.684662 1.944797 2.038248 2.568516 2.637104 -1.474497 1.633889 1.881331 1.988847 2.554704 2.623589 -1.427685 1.616808 1.898469 1.994121 2.545908 2.635844 -1.366974 1.583736 1.860760 2.018090 2.526247 2.594032 -1.257899 1.562399 1.870764 1.961750 2.512050 2.589589 -1.183313 1.571246 1.867445 1.988791 2.543767 2.607786 -1.137720 1.607193 1.879149 2.008769 2.536804 2.607481 -1.053818 1.511423 1.904439 2.002387 2.584849 2.657089 -1.029306 1.560669 1.913466 1.984439 2.613420 2.670916 -0.990299 1.520302 1.919708 2.005988 2.615870 2.705960 -0.927002 1.486845 1.900099 1.977768 2.614622 2.695757 -0.924166 1.500302 1.837270 1.915819 2.601787 2.702827 -0.901854 1.422756 1.898010 1.950141 2.572992 2.759299 -0.910623 1.286484 1.801282 1.925793 2.438152 2.671294 -0.904293 1.226137 1.873337 1.946907 2.485265 2.645532 -0.872654 1.122664 1.912497 2.047619 2.468062 2.645490 -1.136081 1.248013 1.725399 2.180627 2.493778 2.579400 -1.161500 1.346974 1.804044 2.157021 2.550312 2.633164 -1.287295 1.663717 2.044188 2.321923 2.599284 2.687129 -1.456799 1.758274 2.055266 2.310654 2.549315 2.660074 -1.416948 1.741370 2.104189 2.357764 2.591761 2.679543 -1.379535 1.752525 2.173415 2.361073 2.617497 2.699322 -1.361005 1.762025 2.115710 2.330663 2.562002 2.650389 -1.340777 1.685357 2.024889 2.281946 2.547415 2.639463 -1.278174 1.686145 1.961407 2.165468 2.554171 2.647873 -1.294524 1.547620 1.981967 2.183432 2.547510 2.637235 -1.201621 1.343641 2.007859 2.089427 2.535679 2.660742 -1.201995 1.332111 1.949153 2.051811 2.553202 2.665468 -1.180355 1.354250 1.890523 2.069912 2.515229 2.620120 -1.128725 1.419757 1.854779 2.056632 2.480702 2.583539 -1.133191 1.402342 1.822656 2.013606 2.539914 2.639438 -1.149266 1.376927 1.821187 1.914934 2.562423 2.664037 -1.080871 1.408443 1.788020 1.879929 2.517515 2.656681 -1.152439 1.509600 1.822338 1.939812 2.528944 2.619151 -1.227262 1.543782 1.935413 2.017678 2.575512 2.665626 -1.253647 1.485940 1.945543 1.987370 2.539186 2.715089 -1.224504 1.521337 1.982156 2.044940 2.522684 2.687446 -1.258716 1.476124 1.981858 2.073104 2.536174 2.634089 -1.255580 1.471131 1.983938 2.052555 2.541040 2.708650 -1.221419 1.556731 2.013319 2.089772 2.538596 2.706495 -1.178484 1.474650 2.007635 2.122088 2.560256 2.629434 -1.136643 1.459288 2.033733 2.100427 2.544702 2.689126 -1.035202 1.462561 2.024973 2.194093 2.530601 2.662208 -1.090875 1.522421 2.038442 2.129424 2.587618 2.687392 -1.054541 1.538340 2.000589 2.084015 2.516505 2.644331 -1.069567 1.471150 1.977006 2.102657 2.548224 2.645658 -1.084637 1.235068 1.999027 2.091007 2.405191 2.622410 -1.073907 1.180490 1.961383 2.101877 2.255303 2.531797 -1.185536 1.320277 2.006751 2.098846 2.443082 2.582972 -1.256811 1.419989 1.983529 2.130962 2.470417 2.558689 -1.290736 1.391916 1.995379 2.106560 2.351663 2.485168 -1.428569 1.748298 2.044813 2.277573 2.513087 2.625248 -1.495766 1.686660 2.135657 2.292230 2.499007 2.616505 -1.482459 1.632012 2.083877 2.297241 2.488552 2.605327 -1.538843 1.630868 2.111745 2.223107 2.576837 2.693238 -1.551627 1.628553 2.040601 2.158000 2.590177 2.713514 -1.570014 1.637722 1.958103 2.124258 2.570176 2.692788 -1.534589 1.607992 1.801643 2.087274 2.392697 2.600933 -1.502776 1.607625 1.843802 2.082344 2.323284 2.522392 -1.515698 1.613442 1.837842 2.027239 2.402910 2.602242 -1.510034 1.607577 1.826422 1.955465 2.340570 2.679619 -1.445827 1.566639 1.756421 1.869709 2.296147 2.601653 -1.410709 1.488515 1.820022 1.910438 2.358230 2.614654 -1.301575 1.428283 1.812427 1.902581 2.293360 2.725276 -1.106808 1.351509 1.888725 1.956330 2.320442 2.646886 -1.056263 1.366917 1.866615 1.968949 2.421463 2.653524 -1.148746 1.368055 1.809637 2.064105 2.437788 2.604096 -0.990270 1.453159 1.887277 2.035172 2.296937 2.600298 -0.943695 1.204266 1.748001 1.886445 2.181614 2.509804 -1.057049 1.221402 1.835972 1.972438 2.154951 2.492969 -0.936404 1.225524 1.895053 1.998065 2.539531 2.644930 -0.941516 1.224493 1.966408 2.055267 2.515087 2.609082 -1.000240 1.314972 1.942001 2.051921 2.535877 2.634783 -1.031394 1.407401 1.953467 2.045443 2.550815 2.634369 -1.118870 1.441951 1.952517 2.061995 2.494339 2.608036 -1.197103 1.553158 1.887646 2.009186 2.472098 2.550658 -1.293802 1.588339 1.868376 2.045916 2.481096 2.566107 -1.353770 1.610646 1.897619 2.083477 2.408292 2.543397 -1.403681 1.521997 1.891672 2.054144 2.357288 2.512253 -1.370402 1.446254 1.871326 1.998144 2.336676 2.570693 -1.499387 1.755248 2.090328 2.282953 2.484033 2.574394 -1.567708 1.842611 2.136623 2.278726 2.477117 2.576067 -1.591554 1.767544 2.169415 2.302935 2.525126 2.637496 -1.458272 1.799744 2.227216 2.397500 2.616529 2.705570 -1.496705 1.846042 2.279896 2.437186 2.649673 2.726623 -1.502759 1.731322 2.268727 2.464213 2.623623 2.706745 -1.497299 1.617932 2.156580 2.386255 2.579030 2.664716 -1.379977 1.538687 1.850634 2.109517 2.410662 2.586146 -1.405875 1.497926 1.741705 1.932278 2.337183 2.563846 -1.346170 1.431041 1.657425 1.884420 2.373948 2.587354 -1.307909 1.406366 1.734141 1.875825 2.460720 2.602094 -1.273940 1.571154 1.771276 1.912248 2.536452 2.595610 -1.200061 1.575178 1.770854 1.877630 2.508016 2.579146 -1.125813 1.539421 1.722626 1.859971 2.511653 2.574626 -1.064900 1.484512 1.690862 1.832750 2.519579 2.589278 -1.042869 1.483231 1.627118 1.867084 2.495867 2.550264 -0.950910 1.474823 1.576110 1.830086 2.519438 2.569906 -1.004516 1.423026 1.550120 1.835220 2.473605 2.544366 -1.026409 1.365688 1.510656 1.879110 2.467179 2.543867 -0.978321 1.338491 1.528018 1.913878 2.465066 2.524725 -0.922555 1.409585 1.520258 1.932657 2.404714 2.472216 -1.009019 1.345028 1.518729 1.999531 2.463064 2.544939 -0.989351 1.433164 1.573872 2.015438 2.401202 2.490979 -1.035325 1.556325 1.677312 2.086779 2.481518 2.567949 -1.004119 1.575292 1.796393 2.075521 2.402912 2.574238 -1.037355 1.681818 1.943106 2.065425 2.478887 2.598899 -1.005855 1.684746 1.972392 2.109307 2.565052 2.623513 -0.954873 1.719791 2.006188 2.112346 2.598630 2.682782 -0.937994 1.728321 1.993763 2.105254 2.632050 2.700706 -0.889626 1.709530 2.001291 2.090092 2.620540 2.709802 -0.912128 1.657624 1.966778 2.058636 2.626429 2.702918 -0.972006 1.569116 1.985953 2.130241 2.569149 2.677258 -1.038791 1.651170 2.008290 2.118109 2.599188 2.701292 -1.102203 1.624993 1.998759 2.125031 2.569760 2.646643 -1.187738 1.639367 2.059243 2.147304 2.475862 2.634964 -1.274099 1.590670 2.016754 2.099633 2.548725 2.668989 -1.373403 1.630011 1.981494 2.070929 2.505950 2.689328 -1.511208 1.602606 1.911343 2.022899 2.475945 2.645751 -1.553078 1.639398 1.870403 1.975613 2.473431 2.626572 -1.633420 1.773325 1.875127 1.959482 2.413151 2.625912 -1.596719 1.747314 1.878046 2.049018 2.587489 2.669276 -1.664674 1.933354 2.156044 2.280025 2.462736 2.571555 -1.551190 1.695801 2.047099 2.236977 2.447592 2.570843 -1.648304 1.728067 2.060789 2.273739 2.475137 2.631203 -1.633548 1.757572 2.089279 2.240980 2.436119 2.556847 -1.608644 1.684711 2.123747 2.256566 2.486503 2.598234 -1.653176 1.714541 2.105354 2.203230 2.509317 2.641781 -1.541046 1.679960 2.104266 2.247262 2.540379 2.626724 -1.559664 1.659637 2.101376 2.213674 2.473238 2.562999 -1.608810 1.671776 2.071434 2.184829 2.493283 2.639463 -1.538876 1.610189 2.083083 2.171544 2.554389 2.650993 -1.511021 1.595459 2.031637 2.130089 2.587598 2.660399 -1.340693 1.587842 1.931002 2.117119 2.599860 2.676574 -1.484682 1.533251 2.024488 2.113154 2.548321 2.659954 -1.534337 1.608310 2.031541 2.136001 2.537102 2.617716 -1.571577 1.618314 2.056726 2.139748 2.525414 2.622206 -1.564471 1.631266 2.060592 2.166039 2.469995 2.635657 -1.533650 1.663515 2.093962 2.190787 2.406743 2.622754 -1.570124 1.631042 2.049374 2.165169 2.393566 2.588498 -1.552473 1.634522 2.008478 2.098878 2.509195 2.669322 -1.498536 1.602806 2.008880 2.099726 2.525137 2.659175 -1.450925 1.660536 1.991759 2.103304 2.544073 2.696474 -1.447598 1.569099 1.993051 2.079756 2.587712 2.676395 -1.394567 1.544697 2.006663 2.078973 2.579015 2.721882 -1.347921 1.507746 1.993785 2.077331 2.510234 2.682685 -1.265189 1.355385 1.877848 2.063826 2.425800 2.657797 -1.266300 1.376932 2.008877 2.275008 2.479039 2.636159 -1.414729 1.680622 2.057398 2.332754 2.549975 2.652454 -1.499883 1.708789 2.054742 2.313580 2.521026 2.613915 -1.445680 1.741768 2.126388 2.338809 2.495118 2.597970 -1.459203 1.792340 2.113493 2.346074 2.563702 2.664973 -1.416845 1.644394 2.131474 2.322905 2.578800 2.677164 -1.447967 1.708221 2.144894 2.272584 2.593212 2.700869 -1.474608 1.742978 2.066944 2.341635 2.601749 2.685249 -1.346721 1.653940 1.999147 2.218537 2.633365 2.723602 -1.375208 1.551414 2.052682 2.232013 2.586844 2.697029 -1.260950 1.501751 1.925196 2.033937 2.546694 2.652031 -1.259339 1.500189 1.909647 1.982913 2.545881 2.638673 -1.252838 1.563842 1.910593 1.973683 2.579307 2.664280 -1.263002 1.546326 1.878080 2.031152 2.583468 2.653793 -1.265196 1.521273 1.905708 1.967385 2.581430 2.658715 -1.307704 1.547718 1.881421 1.962040 2.573475 2.658828 -1.291340 1.575015 1.915239 1.985560 2.602082 2.697699 -1.295431 1.626460 1.923299 2.023724 2.591291 2.680142 -1.301210 1.624080 1.878934 1.998083 2.560098 2.634506 -1.305813 1.620922 1.888028 1.989036 2.606227 2.669425 -1.308088 1.642328 1.885958 2.013573 2.611911 2.696648 -1.312101 1.627858 1.861841 1.974096 2.602616 2.658487 -1.292897 1.605725 1.877131 1.973395 2.599643 2.682844 -1.273139 1.591736 1.870416 1.947454 2.602328 2.674146 -1.283582 1.620817 1.847273 1.928033 2.590051 2.636876 -1.246205 1.560066 1.851625 1.954533 2.587535 2.673542 -1.260393 1.539639 1.831617 1.928432 2.552288 2.629629 -1.261220 1.505229 1.857309 1.933908 2.569004 2.696314 -1.283108 1.719865 1.823903 1.976026 2.565436 2.628748 -1.314387 1.617735 1.804065 1.960535 2.596814 2.686738 -1.338699 1.637284 1.896932 2.009128 2.523466 2.637375 -1.336475 1.577029 1.850025 1.943237 2.521339 2.596832 -1.398912 1.549275 1.724463 1.861933 2.166791 2.466332 -1.406894 1.497435 1.805042 1.909122 2.284281 2.542582 -1.474849 1.579373 1.970765 2.079699 2.371434 2.542616 -1.452309 1.539401 2.076665 2.137999 2.442972 2.649515 -1.450617 1.506612 2.036385 2.131452 2.484829 2.674720 -1.434796 1.583083 2.027674 2.136807 2.429113 2.578344 -1.087572 1.367208 1.786303 2.025035 2.298079 2.515673 -0.992092 1.436432 1.725512 1.965111 2.425717 2.549021 -0.969474 1.497321 1.730092 2.016045 2.414373 2.633316 -0.936277 1.413012 1.683609 2.029768 2.443096 2.552830 -1.176352 1.559638 1.748772 2.061891 2.311483 2.434690 -1.067106 1.406642 1.643885 1.978806 2.374725 2.547845 -0.989262 1.333111 1.475085 1.728650 2.492018 2.553467 -0.957471 1.308545 1.424561 1.823472 2.490215 2.552316 -1.035765 1.254486 1.352081 1.786247 2.539488 2.585779 -1.023678 1.232418 1.398476 1.875768 2.451677 2.540251 -1.037249 1.247286 1.387422 2.008554 2.419268 2.496115 -1.045924 1.231687 1.361952 1.887611 2.384450 2.471500 -1.000981 1.250837 1.376662 1.767666 2.398053 2.484439 -1.061773 1.214611 1.410756 1.728252 2.423979 2.514269 -1.168228 1.291194 1.597509 1.900015 2.415419 2.555014 -1.150788 1.412860 1.825953 1.953264 2.400052 2.535324 -1.166923 1.517635 1.943529 2.034246 2.373359 2.521470 -1.183183 1.523161 1.995315 2.119892 2.433461 2.591155 -1.159482 1.521728 2.072369 2.176962 2.514904 2.660759 -1.260320 1.722656 2.116773 2.249048 2.534123 2.645628 -1.450433 1.717713 2.048790 2.212752 2.499485 2.636128 -1.449227 1.653123 2.023641 2.196888 2.453054 2.612516 -1.388122 1.597569 1.968649 2.163453 2.425431 2.578033 -1.347603 1.449808 1.894138 2.168973 2.446471 2.602268 -1.398006 1.471755 1.922063 2.120957 2.396434 2.600718 -1.428663 1.541308 2.046052 2.132513 2.397088 2.643104 -1.492673 1.585159 2.059339 2.158303 2.480824 2.648749 -1.558991 1.648786 2.037511 2.153321 2.512380 2.647660 -1.587505 1.659085 2.020500 2.139692 2.537458 2.616564 -1.634348 1.739360 2.044485 2.218194 2.530130 2.622735 -1.650152 1.736774 2.049269 2.148919 2.551868 2.651288 -1.640705 1.707347 1.991329 2.119563 2.587595 2.642835 -1.655822 1.709750 1.941946 2.090791 2.570081 2.630366 -1.606441 1.695623 1.852762 2.047845 2.554897 2.628090 -1.484591 1.657033 1.822979 2.008956 2.584027 2.653723 -1.348381 1.627797 1.779073 1.897327 2.521867 2.646403 -1.155644 1.464872 1.763798 1.943553 2.555854 2.642088 -1.339453 1.676328 1.971041 2.186803 2.438887 2.571072 -1.297378 1.615525 1.946759 2.151180 2.429841 2.558129 -1.136457 1.519887 1.867226 2.107387 2.452727 2.553710 -0.943433 1.350976 1.714327 1.830884 2.380038 2.573606 -0.933950 1.078579 1.553087 1.662344 2.027950 2.453145 -0.896937 1.246931 1.586629 1.684078 2.397137 2.611707 -0.892078 1.350059 1.560075 1.689846 2.506278 2.607560 -0.772181 1.313675 1.525659 1.650282 2.468977 2.636413 -0.863603 1.328577 1.481135 1.768890 2.496778 2.546566 -0.908312 1.258415 1.382771 1.699751 2.448589 2.547326 -0.863083 1.273798 1.422414 1.575877 2.509924 2.567103 -0.798143 1.233378 1.328045 1.718547 2.545479 2.654885 -0.937997 1.297209 1.447389 1.659450 2.539430 2.664368 -1.015311 1.282646 1.449652 1.656931 2.519587 2.597241 -1.012603 1.308086 1.428756 1.742642 2.581377 2.654752 -1.075222 1.359942 1.466363 1.790456 2.582927 2.654917 -1.174719 1.354592 1.470683 1.808114 2.611814 2.690601 -1.304671 1.380565 1.486415 1.863253 2.499088 2.646637 -1.329253 1.458935 1.599739 1.985102 2.412241 2.489601 -1.326849 1.466962 1.650712 1.972882 2.173652 2.363777 -1.440729 1.597862 1.756923 1.942121 2.134420 2.330899 -1.490912 1.615283 1.799725 1.989183 2.307191 2.535959 -1.523001 1.676436 1.841390 2.084493 2.490067 2.619504 -1.536446 1.672927 1.834339 2.067942 2.594848 2.655730 -1.585206 1.673419 1.879347 2.026137 2.609162 2.691334 -1.576452 1.662112 1.868110 1.987273 2.629831 2.702492 -1.561137 1.629084 1.910414 2.005430 2.633437 2.726135 -1.531209 1.615548 1.873644 1.966279 2.522587 2.706064 -1.473294 1.591222 1.908945 1.973407 2.535042 2.733124 -1.412536 1.473645 1.871722 1.957323 2.341205 2.740704 -1.379808 1.473241 1.923919 1.986068 2.447172 2.657583 -1.333691 1.500115 1.933534 2.138032 2.501795 2.615830 -1.405765 1.570091 2.028114 2.332669 2.573681 2.664117 -1.386052 1.546746 2.101843 2.380119 2.607300 2.712463 -1.420552 1.664080 2.096840 2.287671 2.545433 2.645671 -1.429919 1.632895 2.056448 2.245342 2.469727 2.594625 -1.450338 1.542326 1.936139 2.160089 2.389658 2.594948 -1.458650 1.545840 1.973946 2.132840 2.280546 2.519107 -1.499624 1.621854 1.924363 2.086584 2.253820 2.393464 -1.480124 1.596614 1.822901 2.030079 2.212455 2.440593 -1.385572 1.515794 1.763525 2.007562 2.207014 2.505163 -1.363477 1.483710 1.745394 2.020826 2.177380 2.428417 -1.422412 1.526361 1.802470 2.041367 2.267629 2.509983 -1.451781 1.539504 1.888618 2.079745 2.258528 2.500819 -1.462745 1.548876 1.925748 2.065292 2.320100 2.591877 -1.459612 1.526791 1.937299 2.029745 2.425999 2.618215 -1.426774 1.495962 1.934803 2.028683 2.474317 2.639936 -1.395478 1.494605 1.923542 2.006865 2.508795 2.651596 -1.315323 1.475877 1.925867 2.012444 2.562544 2.642674 -1.216208 1.542312 1.867609 1.962911 2.578507 2.638914 -1.188119 1.592111 1.826165 1.956758 2.592728 2.659305 -1.157283 1.519027 1.841285 1.936129 2.596722 2.669387 -1.042732 1.334857 1.852810 1.927812 2.509256 2.721390 -1.076921 1.512728 1.892211 1.976017 2.370736 2.635640 -1.328644 1.555209 1.826957 2.080018 2.447934 2.607755 -1.271225 1.383527 1.740551 2.048721 2.356257 2.567108 -1.288765 1.385478 1.793872 1.977849 2.390396 2.604554 -1.328655 1.422241 1.805644 2.002822 2.289156 2.544301 -1.377945 1.493655 1.793682 2.031868 2.353733 2.518906 -1.384430 1.453654 1.838071 2.001840 2.390785 2.635123 -1.289457 1.403427 1.871018 1.986122 2.479981 2.723796 -1.207888 1.388220 1.865052 2.031661 2.450066 2.591415 -1.218628 1.309314 1.909852 2.003782 2.499425 2.604984 -1.178831 1.273297 1.832814 2.025041 2.508629 2.650229 -1.147475 1.259195 1.930161 2.027735 2.522075 2.634075 -1.100906 1.268026 1.857908 1.951898 2.508895 2.660387 -1.069825 1.225671 1.888950 1.974341 2.492132 2.592105 -1.042255 1.182210 1.891740 2.039958 2.559652 2.679327 -0.956414 1.180966 1.881463 1.994332 2.316474 2.617691 -1.061791 1.571696 1.926569 2.107177 2.404155 2.525452 -1.374312 1.475896 1.678426 1.972424 2.364289 2.516531 -1.363442 1.455771 1.763156 1.970798 2.368334 2.586977 -1.423043 1.591891 1.798197 2.012780 2.388112 2.602184 -1.527265 1.605781 1.909513 2.033429 2.406683 2.593463 -1.585135 1.664508 1.918013 2.026537 2.425727 2.600924 -1.611888 1.728561 1.907667 2.034036 2.395680 2.641770 -1.463013 1.624657 1.872286 1.998243 2.487821 2.662465 -1.507075 1.597912 1.893748 1.997011 2.535979 2.672459 -1.502401 1.618027 1.888560 2.024162 2.581852 2.656536 -1.553117 1.639479 1.918920 2.034284 2.576859 2.655677 -1.577358 1.648261 1.958093 2.053413 2.567886 2.656516 -1.595375 1.654628 1.997767 2.099746 2.531642 2.675206 -1.621639 1.704007 1.957750 2.074637 2.584314 2.660506 -1.618433 1.711386 1.954786 2.067454 2.533767 2.695229 -1.617851 1.716314 1.949677 2.103360 2.635944 2.686892 -1.649322 1.746309 1.901606 2.064352 2.606774 2.690238 -1.635059 1.769603 1.904617 2.019099 2.607597 2.713325 -1.645565 1.779500 1.868948 1.965332 2.592154 2.714895 -1.686573 1.757504 1.858066 1.922036 2.505271 2.698890 -1.612716 1.703234 1.831053 1.925901 2.373806 2.613684 -1.244351 1.409563 1.713462 1.967702 2.351463 2.537356 -1.269988 1.387301 1.640967 1.991832 2.324911 2.501768 -1.305349 1.455772 1.788777 2.091229 2.487237 2.614726 -1.413862 1.518807 1.888520 2.252275 2.448086 2.594722 -1.409418 1.591460 1.944717 2.196924 2.518393 2.638233 -1.399142 1.703314 1.966146 2.224863 2.616908 2.734082 -1.375311 1.636377 2.061764 2.292420 2.586624 2.705744 -1.394667 1.733415 2.073598 2.297154 2.573824 2.672888 -1.366082 1.738611 2.016634 2.285662 2.605490 2.693517 -1.360620 1.601685 1.967966 2.194839 2.564848 2.657918 -1.354700 1.471541 1.990171 2.165439 2.569000 2.679116 -1.319372 1.403922 2.030220 2.115007 2.452702 2.635911 -1.303257 1.374731 1.975040 2.111171 2.369818 2.660606 -1.325790 1.431051 2.036171 2.113943 2.475995 2.685073 -1.307478 1.510363 2.117703 2.179166 2.554579 2.695776 -1.311427 1.548305 2.128351 2.279725 2.551702 2.645499 -1.293775 1.442228 2.115561 2.289555 2.415905 2.531210 -1.278672 1.697114 2.092498 2.199540 2.368518 2.561138 -1.292641 1.867932 2.128826 2.206329 2.450839 2.551778 -1.234857 1.631071 2.143705 2.304460 2.491014 2.565728 -1.219953 1.367565 2.149802 2.218488 2.495215 2.635299 -1.208902 1.484837 2.180300 2.276690 2.526332 2.626732 -1.165264 1.458241 2.155590 2.227283 2.490182 2.596799 -1.116188 1.492178 2.177271 2.241905 2.532331 2.620529 -1.096897 1.524925 2.093489 2.345253 2.480356 2.611159 -1.043785 1.369028 2.229277 2.306648 2.527431 2.613026 -1.080719 1.336126 2.135541 2.240613 2.463443 2.634282 -1.126263 1.502538 2.065329 2.274832 2.512833 2.588250 -1.199125 1.448000 2.040575 2.216856 2.449127 2.544297 -1.244303 1.540831 2.036533 2.174834 2.470267 2.580345 -1.277190 1.574057 2.066371 2.150365 2.508540 2.611728 -1.341754 1.576876 2.031475 2.120651 2.496164 2.575343 -1.335444 1.541598 1.994337 2.108804 2.518844 2.622948 -1.351719 1.543708 2.003315 2.075354 2.579158 2.656631 -1.359299 1.470533 1.968461 2.042323 2.565151 2.664841 -1.368199 1.433218 1.983774 2.044947 2.438603 2.670598 -1.351177 1.426131 1.991290 2.087726 2.430748 2.616370 -1.349866 1.483300 2.000270 2.242826 2.535909 2.629047 -1.322061 1.596777 2.113123 2.408146 2.548980 2.625263 -1.381288 1.648758 2.192458 2.378361 2.579516 2.654496 -1.372134 1.542663 2.062546 2.307310 2.475587 2.580621 -1.363570 1.463481 1.864764 2.288459 2.467800 2.571685 -1.335793 1.536300 1.886159 2.221871 2.543381 2.670529 -1.259757 1.393352 1.604761 1.934288 2.430512 2.509599 -1.224722 1.349648 1.481936 1.836832 2.384963 2.463134 -1.253661 1.369206 1.505507 1.994342 2.366061 2.454562 -1.250448 1.372217 1.563439 2.133283 2.391531 2.461107 -1.298984 1.412532 1.560005 2.162846 2.475577 2.551467 -1.308701 1.487231 1.616571 2.140891 2.422519 2.527844 -1.362265 1.509740 1.691137 2.151850 2.425060 2.504008 -1.415186 1.573817 1.726343 2.145690 2.423615 2.518947 -1.468304 1.624569 1.768003 2.107079 2.433687 2.501879 -1.474213 1.645172 1.829377 2.150471 2.330539 2.454132 -1.488731 1.662220 1.853177 2.160434 2.390722 2.507469 -1.515371 1.685102 1.820897 2.090815 2.477135 2.541320 -1.533941 1.681022 1.911151 2.101052 2.431211 2.507421 -1.547022 1.762747 1.905315 2.057302 2.369967 2.496458 -1.524747 1.707503 1.880853 2.145136 2.331290 2.443298 -1.532670 1.689464 1.838440 2.066707 2.352074 2.487585 -1.449082 1.639914 1.786524 2.047043 2.328788 2.426218 -1.393415 1.607003 1.752128 2.065963 2.381000 2.473775 -1.234921 1.620384 1.751709 2.079353 2.400969 2.471820 -1.128649 1.589193 1.725978 2.097814 2.421776 2.507176 -1.205122 1.491109 1.707033 2.143134 2.407676 2.489596 -1.105985 1.524092 1.740260 2.142524 2.422755 2.532710 -1.146867 1.428089 1.698792 2.100330 2.423332 2.545496 -1.116015 1.351902 1.754307 2.146023 2.411698 2.527537 -1.178509 1.306840 1.824109 2.272040 2.452886 2.546314 -1.386046 1.686532 2.010818 2.148686 2.439205 2.570934 -1.334381 1.674050 1.962490 2.108725 2.403922 2.587496 -1.309542 1.519433 2.030598 2.119732 2.436082 2.620801 -1.199624 1.425192 2.037889 2.161327 2.493314 2.639529 -0.913804 1.251727 2.055079 2.176873 2.416854 2.644928 -0.822137 1.067331 2.019119 2.216592 2.395557 2.658189 -0.859923 0.985874 1.904285 2.160589 2.433708 2.639822 -0.906761 1.140617 2.010505 2.146239 2.469640 2.644134 -0.950845 1.253958 2.039526 2.095898 2.600275 2.711094 -0.953879 1.245319 1.985465 2.133152 2.543655 2.613003 -1.031672 1.286594 1.974619 2.037126 2.541018 2.690276 -1.051598 1.373163 1.905246 2.009638 2.495552 2.674053 -1.088262 1.297396 1.898694 2.018578 2.508840 2.690510 -1.146698 1.282269 1.930714 2.010155 2.439408 2.647009 -1.157205 1.343846 1.930823 2.029125 2.368152 2.598000 -1.247348 1.432742 1.942594 2.067451 2.392833 2.554304 -1.297617 1.516021 1.993391 2.079273 2.439458 2.548273 -1.386254 1.483598 1.965854 2.071612 2.444793 2.594366 -1.429692 1.499865 1.880633 2.074107 2.346203 2.604251 -1.569133 1.644482 1.942763 2.045196 2.370694 2.589367 -1.696361 1.745617 1.980943 2.093662 2.433481 2.583667 -1.694840 1.801151 1.961027 2.068322 2.452636 2.638290 -1.619793 1.785586 1.919626 2.055816 2.238163 2.498763 -1.223689 1.621225 1.791717 1.898693 2.161669 2.499947 -1.144413 1.452915 1.780893 1.866745 2.214208 2.494268 -1.135538 1.495124 1.820776 1.894356 2.115005 2.441578 -1.131378 1.535817 1.737318 1.842419 2.021638 2.425946 -1.212645 1.312165 1.752907 1.889323 2.108905 2.469701 -1.253951 1.352407 1.652652 1.960954 2.394436 2.568676 -1.362676 1.580790 1.913319 2.212617 2.381597 2.528987 -1.417331 1.582049 1.977630 2.237995 2.413078 2.580292 -1.383161 1.603552 2.016139 2.210126 2.449048 2.587234 -1.442111 1.544212 1.938946 2.141876 2.494998 2.590164 -1.381730 1.579156 1.982000 2.138775 2.485780 2.620572 -1.361593 1.597812 1.964935 2.138121 2.542610 2.622470 -1.360664 1.614689 2.010781 2.161500 2.460448 2.583897 -1.390092 1.628646 1.963826 2.130557 2.477732 2.613382 -1.346169 1.648499 2.082367 2.321708 2.555952 2.649424 -1.440422 1.742439 2.007648 2.208244 2.450993 2.577906 -1.444825 1.695062 2.026868 2.210477 2.414028 2.532766 -1.345541 1.589166 1.955423 2.129306 2.409889 2.543165 -1.400043 1.481922 1.947067 2.110259 2.313164 2.531167 -1.384776 1.484787 1.983872 2.107142 2.360088 2.585480 -1.429185 1.514936 2.019660 2.137662 2.329551 2.585292 -1.450546 1.518321 2.010034 2.102797 2.401692 2.603278 -1.441363 1.525406 1.964971 2.076719 2.376014 2.594808 -1.464787 1.521553 1.968987 2.077867 2.444963 2.621082 -1.486696 1.573684 2.001845 2.108515 2.433771 2.626158 -1.471032 1.543603 1.991659 2.111714 2.473307 2.645459 -1.415271 1.524488 2.012703 2.095751 2.458820 2.642016 -1.407514 1.501486 2.050311 2.156204 2.480187 2.623271 -1.376118 1.459583 2.009938 2.169415 2.480196 2.642689 -1.345946 1.472883 2.073124 2.184863 2.486126 2.610362 -1.306365 1.438379 2.090496 2.213143 2.554203 2.683954 -1.219262 1.423037 2.090917 2.170494 2.559623 2.668211 -1.180469 1.408080 1.935170 2.088177 2.548134 2.639438 -1.209541 1.528929 1.887266 1.961882 2.483440 2.649342 -1.219923 1.521384 1.939175 1.988023 2.460034 2.673476 -1.198754 1.474098 1.859112 1.981042 2.395346 2.719202 -1.118408 1.504845 1.897944 2.002376 2.242870 2.598523 -1.018525 1.459894 1.746590 2.051954 2.324856 2.458848 -0.866990 1.387782 1.654105 1.799741 2.325792 2.407380 -0.862252 1.365828 1.705762 1.802245 2.416352 2.493849 -0.928394 1.546454 1.716680 1.877069 2.379724 2.524594 -1.083354 1.487338 1.801149 2.005692 2.321736 2.558733 -1.057425 1.339797 1.834422 1.934601 2.279625 2.530701 -0.954787 1.140996 1.792870 1.891796 2.342908 2.492038 -0.996853 1.130036 1.792153 1.895409 2.236238 2.403350 -0.920268 1.069492 1.874858 2.072086 2.335228 2.486570 -0.954214 1.081065 1.827324 2.079149 2.238820 2.508120 -0.894487 1.013841 1.716536 2.018446 2.175347 2.482241 -0.842005 0.979634 1.644526 1.945897 2.271025 2.438632 -0.955710 1.090003 1.754054 1.967070 2.127836 2.448885 -0.954385 1.094473 1.727553 2.005579 2.266567 2.514397 -1.025620 1.137605 1.787527 2.002076 2.336896 2.511839 -1.013813 1.175105 1.881936 2.016643 2.345862 2.445716 -1.082667 1.227297 1.923243 2.022783 2.402376 2.520967 -1.118115 1.224136 1.824448 1.961745 2.245832 2.515829 -1.146448 1.298991 1.872929 1.995465 2.371727 2.526896 -1.188552 1.310653 1.902213 1.996780 2.290374 2.520538 -1.309924 1.416529 1.878448 2.050089 2.224176 2.387793 -1.394764 1.506270 1.934888 2.056817 2.271193 2.453341 -1.377933 1.572642 1.990697 2.083570 2.381595 2.606523 -1.444019 1.689297 1.997464 2.153207 2.361127 2.507701 -1.515035 1.642770 1.929088 2.159339 2.335507 2.497838 -1.540079 1.708314 1.883825 2.094981 2.398624 2.570098 -1.600911 1.698511 1.881481 2.085171 2.451013 2.653738 -1.502633 1.756061 2.040722 2.163397 2.376168 2.548669 -1.532107 1.855341 1.993840 2.139554 2.302488 2.430987 -1.484859 1.822055 1.964302 2.135961 2.337023 2.472337 -1.536688 1.766917 1.951249 2.090524 2.324175 2.529206 -1.582282 1.723852 1.912068 2.069366 2.302944 2.473896 -1.499712 1.593288 1.912697 2.034098 2.366553 2.553790 -1.434200 1.540709 1.867569 1.989167 2.323715 2.539399 -1.189101 1.500824 1.763417 1.976198 2.137279 2.441179 -1.165922 1.470178 1.772997 1.927098 2.088007 2.304301 -1.250154 1.600421 1.818068 1.922113 2.080252 2.241814 -1.122694 1.628796 1.814409 1.932949 2.099304 2.418672 -1.019615 1.510656 1.850726 1.995621 2.130205 2.457063 -0.958176 1.639680 1.840433 1.956534 2.104283 2.279028 -1.010543 1.537512 1.772221 1.930517 2.101622 2.248506 -0.904371 1.505016 1.664330 1.827875 2.278031 2.348418 -1.067733 1.454537 1.686858 1.803459 2.384372 2.499789 -1.262873 1.516004 1.882748 1.975559 2.353571 2.519731 -1.560637 1.698959 1.921539 2.000060 2.540292 2.605234 -1.665625 1.744091 1.995924 2.104003 2.538942 2.620162 -1.615168 1.748503 2.024112 2.126056 2.408165 2.614133 -1.678025 1.752954 2.027903 2.146564 2.382374 2.568508 -1.580352 1.680273 1.997415 2.122458 2.459846 2.587827 -1.590082 1.692050 1.934784 2.095757 2.552980 2.625876 -1.539000 1.620243 1.920765 2.031604 2.481670 2.592695 -1.408796 1.511786 1.744250 1.896588 2.412019 2.515579 -1.320558 1.487993 1.754964 1.896907 2.437159 2.563184 -1.174869 1.524851 1.708181 1.962955 2.513779 2.581010 -1.287639 1.559567 1.903084 2.105175 2.450979 2.599458 -1.224033 1.507999 1.922793 2.076370 2.372907 2.581210 -1.163218 1.444961 1.734673 2.020179 2.322152 2.541566 -1.212255 1.448003 1.638494 2.031919 2.229345 2.399467 -1.108889 1.283327 1.481151 1.907068 2.100013 2.293484 -1.155218 1.290372 1.476717 1.688065 2.089220 2.181765 -1.171472 1.290390 1.556515 1.825992 2.018143 2.243494 -1.149886 1.282652 1.601900 1.745296 2.110780 2.409060 -1.223914 1.360718 1.650069 1.792936 2.265100 2.370934 -1.254374 1.404539 1.706674 1.854649 2.276473 2.394690 -1.225833 1.442107 1.766130 1.924123 2.292396 2.394677 -1.211141 1.461886 1.804549 1.927018 2.361986 2.453285 -1.218638 1.405782 1.809530 1.914204 2.318449 2.520048 -1.222942 1.394674 1.840107 1.932398 2.391674 2.503193 -1.206898 1.372866 1.842954 1.943799 2.424465 2.578763 -1.246306 1.423826 1.866209 1.962415 2.436055 2.595659 -1.270919 1.455901 1.888055 1.976335 2.469281 2.582811 -1.198265 1.323940 1.880236 1.949408 2.471659 2.644805 -1.174323 1.293200 1.765612 2.019282 2.282243 2.576238 -1.141730 1.383190 1.882826 2.126532 2.453044 2.611191 -1.483342 1.650728 2.043593 2.193798 2.517271 2.622915 -1.446069 1.621898 1.999609 2.103532 2.493478 2.581923 -1.414671 1.630237 1.945678 2.061773 2.500655 2.588950 -1.438432 1.615586 1.903350 2.013028 2.426105 2.613642 -1.556674 1.623119 1.875461 1.972308 2.366695 2.629218 -1.466504 1.638319 1.796576 1.959267 2.457617 2.603231 -1.308284 1.481394 1.730539 1.979266 2.332265 2.538090 -1.301646 1.413738 1.674441 1.933375 2.143487 2.508142 -1.318907 1.416559 1.751644 1.913438 2.294089 2.555125 -1.324509 1.425623 1.844923 1.947411 2.375384 2.597366 -1.266998 1.359728 1.849155 1.950839 2.370723 2.579301 -1.162697 1.344305 1.906935 1.986568 2.470580 2.583422 -1.115998 1.365829 1.948029 2.040077 2.461135 2.583597 -1.061798 1.350291 2.006280 2.080459 2.451632 2.526961 -1.024331 1.233571 1.989411 2.085049 2.387181 2.495816 -0.962287 1.219238 1.967000 2.089191 2.424659 2.599861 -0.881533 1.356828 2.047429 2.155394 2.409074 2.508754 -0.856010 1.217716 2.008528 2.111528 2.424806 2.537738 -0.774065 0.965055 1.874139 2.035878 2.251024 2.527966 -0.820344 0.990331 1.960958 2.242123 2.349553 2.535465 -0.846158 1.062894 1.972506 2.169152 2.353165 2.556086 -0.748812 1.063441 1.949952 2.066846 2.364509 2.602003 -0.855725 1.158383 2.008420 2.144140 2.328495 2.600481 -0.862076 1.188230 1.906456 2.191351 2.368506 2.542645 -0.814218 1.194007 2.086397 2.156864 2.482953 2.574777 -0.811087 1.320952 2.038259 2.112835 2.508878 2.598939 -0.967874 1.191718 2.049318 2.146525 2.422668 2.566778 -1.008026 1.234198 2.040908 2.121036 2.480150 2.609085 -1.118175 1.312265 1.961423 2.071245 2.409323 2.600531 -1.189338 1.302425 1.961961 2.063211 2.432115 2.545303 -1.253885 1.371226 1.931879 2.030140 2.387565 2.558949 -1.307301 1.398036 1.910989 2.006938 2.409438 2.577142 -1.330085 1.468465 1.908521 2.012222 2.418015 2.537683 -1.367992 1.492291 1.942021 2.036750 2.498866 2.581003 -1.368367 1.443433 1.947482 2.013180 2.486344 2.585241 -1.418284 1.496850 1.933442 2.024630 2.473682 2.594036 -1.443886 1.551220 1.904909 2.018103 2.456717 2.542868 -1.473689 1.587097 1.899829 2.079006 2.421501 2.584477 -1.424674 1.611334 1.974517 2.142720 2.402882 2.620760 -1.431487 1.622660 1.940232 2.125436 2.429652 2.581851 -1.484538 1.690581 1.921860 2.109101 2.474401 2.607828 -1.498136 1.751579 1.925730 2.039135 2.440519 2.616180 -1.505248 1.789182 1.994666 2.114126 2.408417 2.599889 -1.609869 1.793035 1.986226 2.160600 2.519572 2.593245 -1.562825 1.739913 1.974184 2.143221 2.539588 2.620088 -1.650259 1.723964 2.002949 2.150399 2.532100 2.600746 -1.584628 1.665482 1.833853 1.979658 2.511168 2.576182 -1.547562 1.665631 1.805111 1.930451 2.428670 2.548606 -1.499078 1.595123 1.700269 1.824190 2.376924 2.575480 -1.300837 1.552954 1.664576 1.791707 2.488304 2.561078 -1.168605 1.311953 1.668583 1.872905 2.413570 2.493285 -1.047458 1.249963 1.699886 1.914183 2.417032 2.496381 -0.948776 1.275594 1.738944 1.998684 2.312154 2.462020 -0.921081 1.311946 1.775244 1.895491 2.382160 2.528440 -0.811311 1.125217 1.745194 2.094737 2.326109 2.511883 -0.796518 1.060230 1.740129 2.060503 2.179506 2.385501 -0.868836 1.153353 1.792833 1.945638 2.125498 2.248001 -0.915536 1.218160 1.818910 2.068347 2.243402 2.348648 -0.966595 1.301606 1.895255 2.111957 2.248646 2.389247 -0.995849 1.442084 1.952071 2.066120 2.240125 2.338587 -1.056392 1.372214 1.984171 2.119327 2.271702 2.372743 -1.098400 1.324164 1.781533 2.082856 2.218804 2.344318 -1.039157 1.356474 1.820178 2.114625 2.346728 2.450389 -0.988689 1.293884 1.916348 2.088201 2.362497 2.481270 -1.104406 1.230679 1.939434 2.122401 2.254811 2.377705 -1.086105 1.174481 1.826346 2.111318 2.237689 2.471667 -1.069802 1.206486 1.845381 2.118634 2.471087 2.575405 -1.074963 1.342794 1.955309 2.147713 2.511467 2.589270 -1.149198 1.418813 1.887043 1.966968 2.472616 2.587246 -1.455749 1.669829 1.964104 2.175182 2.469990 2.605009 -1.418548 1.603566 1.964426 2.175678 2.466765 2.583333 -1.389392 1.601163 1.925746 2.131857 2.442025 2.574229 -1.415333 1.507338 1.911262 2.087139 2.535199 2.629580 -1.382483 1.453710 1.872292 1.955406 2.554343 2.658507 -1.392944 1.482296 1.838526 1.928577 2.473732 2.633718 -1.390456 1.463044 1.839906 1.922012 2.514942 2.698788 -1.339376 1.470118 1.858751 1.959522 2.539427 2.686382 -1.353776 1.541029 1.822546 2.022164 2.542215 2.677200 -1.350868 1.631877 1.918792 2.183528 2.501087 2.617310 -1.407644 1.669128 2.000740 2.224226 2.522804 2.634897 -1.433780 1.586913 1.999627 2.192922 2.535981 2.626121 -1.413876 1.639426 1.952196 2.170695 2.501106 2.610591 -1.505388 1.613685 1.991590 2.214459 2.487873 2.612841 -1.409245 1.563694 2.048043 2.154145 2.483727 2.642180 -1.411023 1.646699 1.983177 2.152550 2.568807 2.661248 -1.384745 1.603808 1.934487 2.141949 2.507642 2.630050 -1.366120 1.551337 1.999561 2.177467 2.489112 2.596761 -1.355542 1.635015 2.008420 2.162675 2.465273 2.661406 -1.453972 1.673697 2.037857 2.180201 2.615971 2.709278 -1.369538 1.696466 1.999789 2.084847 2.482775 2.666286 -1.349740 1.462313 1.966717 2.051722 2.472616 2.652615 -1.327312 1.437762 1.928517 2.006392 2.505810 2.658921 -1.341350 1.419153 1.921202 1.991463 2.530825 2.613585 -1.342697 1.505329 1.946926 2.029431 2.538224 2.635583 -1.392743 1.535099 1.936104 2.024567 2.527279 2.614258 -1.432564 1.543790 1.951854 2.049855 2.546244 2.623711 -1.452940 1.569432 1.932369 2.037247 2.558693 2.638096 -1.467999 1.597453 1.920306 2.018574 2.536219 2.622824 -1.486806 1.569654 1.875855 1.966065 2.536740 2.631905 -1.454618 1.578126 1.811620 1.974659 2.537513 2.606334 -1.418040 1.507665 1.783572 1.893001 2.551797 2.628991 -1.264140 1.474380 1.770586 1.898927 2.524762 2.594073 -1.118340 1.456671 1.734720 1.996589 2.412285 2.519146 -1.096432 1.603123 1.808391 2.012238 2.409620 2.544361 -0.976303 1.473740 1.759171 1.855828 2.412929 2.483947 -0.990184 1.390703 1.710711 1.831672 2.377092 2.454935 -1.056900 1.387366 1.783109 1.873514 2.401419 2.486425 -0.989786 1.452622 1.851566 1.945924 2.403454 2.482939 -1.112084 1.364820 1.770002 1.921998 2.290405 2.437297 -1.096250 1.336388 1.741855 1.968572 2.211613 2.362493 -1.000030 1.346185 1.704531 1.966852 2.277389 2.389374 -1.027901 1.174070 1.793005 2.026854 2.178200 2.387232 -1.056882 1.167504 1.861000 2.204421 2.351246 2.485631 -1.075972 1.226420 1.997644 2.196176 2.330099 2.494137 -1.147221 1.258128 1.958667 2.258550 2.387749 2.552119 -1.162811 1.290567 2.052795 2.201829 2.424621 2.560484 -1.147890 1.265733 2.025675 2.130794 2.496878 2.620259 -1.239563 1.315734 2.018377 2.123513 2.463946 2.569207 -1.181131 1.358942 1.942155 2.159833 2.458701 2.593961 -1.247455 1.386435 1.898250 1.999009 2.446020 2.542764 -1.227695 1.504889 1.817998 1.908019 2.213334 2.552228 -1.201972 1.577872 1.771276 1.873354 2.061263 2.535817 -1.306230 1.516310 1.819234 1.923423 2.382025 2.582568 -1.505719 1.585654 1.949330 2.046203 2.448307 2.615962 -1.623749 1.698728 2.009543 2.108007 2.461522 2.647903 -1.690861 1.764294 2.036097 2.175502 2.515253 2.616822 -1.715336 1.828294 2.078551 2.252209 2.483666 2.607649 -1.659970 1.807170 1.975009 2.255594 2.481341 2.589617 -1.734824 1.850216 2.012044 2.276744 2.519359 2.608181 -1.635768 1.862548 1.956456 2.328743 2.568869 2.632471 -1.616355 1.825398 1.949523 2.281216 2.560861 2.641804 -1.592472 1.804360 1.927158 2.167339 2.577510 2.646873 -1.606484 1.895095 1.983153 2.112452 2.477608 2.576959 -1.708493 1.835068 1.966711 2.127238 2.427571 2.543077 -1.691093 1.889580 1.986069 2.206774 2.522399 2.601798 -1.702442 1.902120 2.076380 2.216219 2.484843 2.603543 -1.329491 1.542588 1.875436 2.105532 2.385234 2.536630 -1.321384 1.474161 1.932268 2.152505 2.374420 2.506710 -1.277750 1.458580 1.963094 2.182377 2.417003 2.558654 -1.208016 1.418710 2.009739 2.138531 2.396782 2.554506 -1.198910 1.299925 1.983625 2.150128 2.296124 2.505944 -1.250344 1.361156 2.010558 2.195944 2.340984 2.500873 -1.308664 1.585162 2.106341 2.214164 2.402673 2.635894 -1.330165 1.494630 2.141901 2.235810 2.459582 2.649465 -1.296306 1.434105 2.098086 2.204131 2.355208 2.600113 -1.309619 1.402978 1.892542 2.184955 2.333605 2.513160 -1.269067 1.491839 1.958963 2.174572 2.324689 2.543667 -1.434975 1.628849 1.981273 2.247282 2.476397 2.593980 -1.459644 1.650080 2.024368 2.267723 2.546314 2.675203 -1.381486 1.703195 2.138905 2.295559 2.545762 2.642527 -1.441842 1.700585 2.197906 2.276293 2.468211 2.694954 -1.539669 1.999668 2.206532 2.351484 2.651231 2.734825 -1.589576 1.926407 2.173457 2.256196 2.633242 2.707677 -1.434262 1.859373 2.141950 2.211447 2.511783 2.628376 -1.326814 1.596573 2.024769 2.115813 2.426136 2.609340 -1.229072 1.325550 1.838698 2.013045 2.471300 2.639281 -1.230813 1.329059 1.872619 1.964510 2.444752 2.594694 -1.193705 1.426297 1.898594 2.039364 2.502714 2.581046 -1.175637 1.473287 1.912423 2.002740 2.476222 2.606851 -1.099269 1.443896 1.892457 1.997567 2.522081 2.611086 -1.113739 1.439098 1.912268 2.000476 2.462769 2.559343 -1.085510 1.469634 1.914465 2.064613 2.427917 2.512412 -1.052481 1.501205 1.918797 1.999794 2.493684 2.571708 -1.043597 1.331616 1.927947 1.989186 2.445730 2.578082 -1.051981 1.200390 1.938627 2.026811 2.446750 2.629884 -0.978672 1.083042 1.868777 2.133583 2.430141 2.580267 -0.904772 1.105214 1.960566 2.064948 2.362564 2.604875 -0.859439 1.084629 1.901705 2.033000 2.276166 2.574716 -0.948943 1.043554 1.855644 2.050857 2.444431 2.661478 -0.974338 1.126459 1.927321 2.020910 2.455487 2.559782 -0.995629 1.175887 1.937743 2.013680 2.378974 2.617290 -1.001312 1.224390 1.901702 1.976467 2.425878 2.574844 -0.985969 1.282601 1.886614 2.032451 2.455957 2.599528 -0.927590 1.320448 1.924006 2.012174 2.498308 2.599681 -1.007942 1.383963 1.921628 2.007624 2.507570 2.607500 -0.972512 1.446775 1.920365 2.013492 2.490207 2.576492 -0.951123 1.452036 1.889861 1.987269 2.421483 2.562217 -0.924342 1.369953 1.851744 1.942740 2.475661 2.544282 -0.882605 1.301666 1.850813 2.032498 2.364632 2.541824 -0.933888 1.368996 1.943109 2.023849 2.405442 2.530330 -0.927916 1.112379 1.847430 1.979093 2.255596 2.563992 -1.031936 1.249132 1.833165 1.925221 2.310315 2.520141 -0.934046 1.239886 1.909603 2.008149 2.372869 2.548965 -0.984297 1.220031 1.823788 1.947602 2.264359 2.478653 -0.933366 1.278980 1.860469 1.942999 2.289801 2.465670 -0.983115 1.227707 1.842104 2.047699 2.272651 2.531979 -0.953311 1.245822 1.849685 1.945142 2.289569 2.572282 -0.994609 1.303464 1.868144 1.971560 2.372435 2.585257 -0.986061 1.364094 1.852132 1.917821 2.435113 2.633873 -0.975486 1.248848 1.848797 1.934434 2.402023 2.574203 -1.008388 1.304679 1.804310 1.888508 2.369473 2.598230 -0.999393 1.329937 1.901438 1.994378 2.397503 2.504548 -0.922186 1.321538 1.851082 1.962056 2.382159 2.472985 -0.897224 1.382187 1.780842 1.921734 2.359590 2.448091 -0.859516 1.447371 1.732311 1.881193 2.295231 2.380849 -0.986347 1.601641 1.752386 1.966362 2.314384 2.459101 -1.265264 1.616535 1.811273 2.097139 2.371242 2.550361 -1.318958 1.600426 1.755641 2.029814 2.329188 2.493144 -1.209901 1.470135 1.670187 1.970732 2.416208 2.523420 -1.122232 1.308395 1.457114 1.720231 2.384259 2.470421 -1.077675 1.245511 1.366478 1.664281 2.327344 2.419196 -1.075445 1.228131 1.365376 1.558947 2.238585 2.324563 -1.044502 1.215785 1.325993 1.645187 2.148642 2.225749 -0.955863 1.150609 1.283133 1.492306 2.177576 2.266677 -0.909204 1.045108 1.166160 1.320593 2.215965 2.352846 -0.960368 1.103540 1.278352 1.467726 2.260152 2.460237 -1.010220 1.186777 1.290055 1.578425 2.388733 2.500317 -1.020144 1.135718 1.239343 1.388838 2.438182 2.563922 -1.082493 1.206954 1.347455 1.490039 2.404819 2.494617 -1.144114 1.278638 1.434725 1.567887 2.322768 2.424800 -1.274296 1.348789 1.515602 1.632221 2.360105 2.552789 -1.301328 1.390629 1.638492 1.764907 2.347961 2.576115 -1.358515 1.444452 1.724492 1.843715 2.478143 2.574552 -1.399712 1.513306 1.791713 1.902169 2.495815 2.581592 -1.448866 1.534750 1.821506 1.931492 2.517823 2.622859 -1.438398 1.530057 1.831437 1.999329 2.531929 2.623280 -1.511918 1.581087 1.927484 2.041399 2.573287 2.663469 -1.535380 1.608310 1.924231 2.048796 2.546746 2.681650 -1.544368 1.620413 1.980425 2.068130 2.477398 2.626652 -1.558461 1.643007 2.024613 2.121014 2.451868 2.639494 -1.524202 1.613947 2.005898 2.115477 2.429090 2.663085 -1.504519 1.590381 1.966356 2.072628 2.376901 2.621094 -1.439395 1.512336 1.950354 2.058564 2.276407 2.573036 -1.315215 1.400050 1.854752 1.957633 2.246197 2.576501 -1.288117 1.488904 1.945571 2.024839 2.439848 2.605685 -1.436278 1.667254 2.056847 2.146443 2.548238 2.661743 -1.417389 1.819841 2.083572 2.220278 2.606693 2.690863 -1.373599 1.963014 2.144565 2.274057 2.547389 2.638900 -1.320367 1.918635 2.063208 2.237723 2.415847 2.517654 -1.223778 1.619753 1.890594 2.107915 2.520999 2.629701 -1.018748 1.427668 1.917566 2.001782 2.435507 2.564351 -1.026252 1.377048 1.949170 2.039209 2.393769 2.530053 -1.009988 1.472847 1.998049 2.079876 2.484961 2.553950 -1.053267 1.468372 2.016120 2.129309 2.456623 2.564128 -1.101072 1.355268 2.010441 2.107467 2.395605 2.537748 -1.132796 1.391658 2.016574 2.114099 2.497623 2.585099 -1.173305 1.443009 1.970633 2.104863 2.447883 2.535937 -1.209478 1.384097 1.972240 2.069587 2.457494 2.573686 -1.242419 1.453561 1.983731 2.068419 2.471041 2.593609 -1.320388 1.463651 1.997825 2.082334 2.472034 2.605892 -1.389516 1.477732 1.978692 2.094038 2.480170 2.644445 -1.413743 1.526085 1.963751 2.113919 2.403846 2.654427 -1.519419 1.592852 1.919458 2.024494 2.301172 2.668892 -1.513663 1.600129 1.922007 2.105104 2.278322 2.523416 -1.481852 1.659944 1.913552 2.049439 2.272255 2.493787 -1.567545 1.659167 1.930647 2.071517 2.312595 2.564270 -1.550890 1.677657 1.863928 2.010128 2.223475 2.520007 -1.572772 1.683020 1.863047 2.002198 2.320378 2.560791 -1.621943 1.734050 1.920642 2.062932 2.335107 2.576252 -1.631487 1.697136 1.952883 2.056578 2.459627 2.652858 -1.594706 1.671490 1.936091 2.013301 2.430776 2.669632 -1.601444 1.668704 1.945495 2.037168 2.503369 2.682121 -1.587570 1.664898 1.944621 2.032989 2.569757 2.703408 -1.556417 1.631245 1.930707 2.040513 2.453873 2.665177 -1.487851 1.565634 1.892869 2.011729 2.393945 2.647118 -1.406012 1.520184 1.791646 1.987880 2.289334 2.602762 -1.358221 1.436040 1.818480 1.957084 2.309801 2.605784 -1.309339 1.405329 1.835697 2.076369 2.340807 2.613062 -1.303792 1.415614 1.985149 2.129488 2.469355 2.643119 -1.358952 1.437733 1.988826 2.127374 2.537981 2.656471 -1.333866 1.480460 1.950069 2.122437 2.431168 2.587133 -1.384528 1.539708 1.964093 2.130549 2.510449 2.652805 -1.412625 1.544436 1.947280 2.173185 2.593018 2.716637 -1.433269 1.539892 2.004125 2.201951 2.515051 2.635244 -1.447580 1.554019 2.128269 2.240167 2.470753 2.657077 -1.480647 1.609898 2.097964 2.167566 2.473701 2.700702 -1.607823 1.675959 2.023409 2.146384 2.426913 2.636247 -1.643303 1.717783 2.060655 2.197557 2.415413 2.614329 -1.737392 1.816967 2.039362 2.219707 2.422999 2.623531 -1.694258 1.799366 2.042600 2.280098 2.418626 2.583273 -1.556188 1.831866 1.985355 2.207899 2.471677 2.630819 -1.421150 1.803896 1.984581 2.123513 2.438200 2.522496 -1.327444 1.668870 1.888433 2.029945 2.224455 2.461746 -1.109824 1.562199 1.862663 1.977860 2.139552 2.328644 -1.233875 1.580797 1.854187 2.021788 2.193504 2.355917 -1.207537 1.568638 1.872908 1.986671 2.137938 2.487653 -1.179978 1.625946 1.900003 2.008135 2.231660 2.594349 -1.469842 1.717204 1.875670 2.024433 2.325463 2.488422 -1.641097 1.809779 1.926763 2.062053 2.414037 2.542900 -1.648803 1.734123 1.966905 2.086726 2.354475 2.498840 -1.605468 1.689394 2.010048 2.114211 2.407628 2.527066 -1.520887 1.628733 1.977005 2.086771 2.340162 2.489336 -1.503816 1.600587 2.039010 2.130377 2.396482 2.513742 -1.437817 1.545316 2.043931 2.188366 2.356821 2.521449 -1.445398 1.549208 1.982213 2.096659 2.328629 2.462126 -1.416417 1.504357 1.973772 2.080427 2.393479 2.543532 -1.425822 1.528083 1.995729 2.162530 2.440693 2.562510 -1.394274 1.473952 2.043537 2.149086 2.432979 2.549080 -1.373755 1.476048 2.043903 2.160251 2.345351 2.501882 -1.370183 1.443588 2.092872 2.178103 2.413056 2.590595 -1.320393 1.466374 2.036782 2.137812 2.435621 2.578912 -1.286926 1.393325 2.060733 2.200945 2.500015 2.582353 -1.323391 1.421794 2.058500 2.153930 2.495548 2.638088 -1.295313 1.393216 2.004420 2.138189 2.526374 2.641535 -1.230979 1.355132 2.047369 2.156418 2.522379 2.664129 -1.233755 1.308524 1.939495 2.097348 2.487349 2.649836 -1.227589 1.355101 1.875835 1.977538 2.319288 2.575191 -1.227369 1.507108 1.853515 2.022894 2.212431 2.576493 -1.152896 1.470513 1.830430 1.954309 2.331452 2.533253 -1.336656 1.650185 1.779214 2.043424 2.444821 2.539640 -1.455824 1.582937 2.022254 2.176680 2.481340 2.592664 -1.437625 1.556245 2.081454 2.174959 2.482445 2.614573 -1.416470 1.620886 2.033007 2.157073 2.462925 2.601588 -1.376304 1.551493 2.117213 2.198338 2.416190 2.605635 -1.442804 1.657855 2.127088 2.206301 2.344857 2.578113 -1.368110 1.538734 2.060199 2.198045 2.366884 2.622242 -1.346445 1.428338 1.980453 2.126605 2.283275 2.530611 -1.304592 1.373259 1.923523 2.096362 2.239964 2.508433 -1.298027 1.371594 1.954971 2.107512 2.349707 2.545570 -1.307177 1.416169 1.980337 2.064455 2.389102 2.588444 -1.279296 1.390782 1.959784 2.090687 2.436145 2.612606 -1.317020 1.415866 1.921874 2.071794 2.463821 2.616221 -1.294309 1.412297 1.916195 2.019201 2.484708 2.611341 -1.310051 1.407774 1.853169 2.009907 2.466493 2.645013 -1.341298 1.422330 1.885156 1.967813 2.483863 2.626324 -1.428263 1.526125 1.885115 1.978529 2.499386 2.603389 -1.501165 1.580511 1.847282 2.000494 2.465952 2.608868 -1.538510 1.625396 1.813916 1.950057 2.522899 2.620472 -1.566628 1.639602 1.771792 1.878749 2.541764 2.663693 -1.543435 1.647821 1.748616 1.822597 2.434677 2.631280 -1.623389 1.680917 1.759152 1.844539 2.521467 2.653611 -1.574857 1.663719 1.767780 1.869740 2.453335 2.658218 -1.558309 1.661251 1.793844 1.895130 2.261873 2.572330 -1.543680 1.627756 1.817671 1.921282 2.432997 2.653342 -1.493536 1.575657 1.805687 1.939448 2.470642 2.665081 -1.440050 1.513838 1.832212 1.937802 2.530248 2.702867 -1.319101 1.506232 1.823485 1.931612 2.539554 2.676703 -1.307271 1.563371 1.847930 1.951724 2.251818 2.453220 -1.336405 1.661596 1.828825 1.988331 2.189506 2.354248 -1.342922 1.598751 1.784739 1.915122 2.109991 2.450644 -1.336704 1.646363 1.800742 1.891215 2.235913 2.558506 -1.311763 1.500014 1.830220 1.945042 2.430387 2.644578 -1.266113 1.431962 1.858757 2.059148 2.590485 2.674762 -1.317779 1.419948 1.916462 2.124820 2.574729 2.668476 -1.341519 1.436167 1.968421 2.097444 2.572787 2.685098 -1.305930 1.438859 1.933746 2.036080 2.569070 2.656417 -1.279130 1.406473 1.943094 2.031719 2.530080 2.630882 -1.286005 1.410029 1.969688 2.040243 2.448573 2.651374 -1.257538 1.391063 1.966565 2.039208 2.402422 2.646794 -1.224386 1.352129 1.931370 2.006343 2.456203 2.696151 -1.296292 1.488099 1.996948 2.068189 2.594535 2.695842 -1.334566 1.607716 1.922141 2.163161 2.545921 2.679970 -1.381781 1.646772 2.037640 2.204087 2.545791 2.639326 -1.416818 1.628929 2.045931 2.209348 2.523853 2.675794 -1.431463 1.694802 1.998932 2.159531 2.522928 2.664749 -1.384236 1.622936 2.036943 2.115706 2.528893 2.633929 -1.403832 1.558362 2.027347 2.138015 2.562774 2.659379 -1.390591 1.671936 2.017942 2.164595 2.592820 2.683609 -1.357527 1.553759 2.023137 2.212306 2.420463 2.558257 -1.301715 1.465816 2.052932 2.215957 2.420685 2.548524 -1.339331 1.597053 2.035156 2.145819 2.509602 2.644137 -1.346088 1.633870 2.006920 2.114724 2.570026 2.688879 -1.358438 1.501669 1.949578 2.027633 2.479635 2.637460 -1.427991 1.533690 1.853629 1.960806 2.437544 2.588461 -1.507003 1.585812 1.864642 1.950265 2.478769 2.624546 -1.535154 1.619477 1.784602 1.926332 2.537152 2.665799 -1.499658 1.574823 1.685832 1.822553 2.533986 2.705306 -1.585485 1.642424 1.721846 1.846735 2.524494 2.710346 -1.167359 1.627213 1.768394 1.853039 2.265556 2.540517 -1.110320 1.506953 1.805632 1.881807 2.361271 2.589961 -1.066434 1.539420 1.746305 1.936119 2.127988 2.461181 -1.110995 1.565351 1.852078 1.960462 2.214924 2.497897 -1.116118 1.590687 1.879184 1.969081 2.323294 2.532966 -1.148401 1.557455 1.819964 1.963793 2.380344 2.484532 -1.092558 1.569815 1.784004 1.959241 2.324259 2.468490 -1.212996 1.578928 1.751637 1.901569 2.271773 2.386093 -1.123979 1.626268 1.758062 1.983762 2.291127 2.408000 -1.075785 1.534831 1.784777 2.041940 2.236695 2.368112 -1.118783 1.415693 1.971932 2.122755 2.330245 2.440458 -1.016087 1.334517 1.899204 2.121574 2.425143 2.543872 -1.066196 1.289419 1.948157 2.081946 2.471493 2.593822 -1.064989 1.255756 1.935973 2.036951 2.493176 2.612753 -1.049670 1.228450 1.829530 2.025060 2.431071 2.670840 -1.019627 1.313583 1.880313 1.953952 2.491693 2.642660 -1.153477 1.551900 1.909752 2.133530 2.540066 2.626465 -1.293030 1.600480 2.035687 2.166885 2.572967 2.658261 -1.409308 1.624144 1.993621 2.268493 2.527057 2.651858 -1.426397 1.681509 2.039405 2.215283 2.559060 2.681401 -1.422045 1.752644 2.027991 2.231432 2.546485 2.631238 -1.403067 1.735547 2.007077 2.202109 2.635543 2.718353 -1.364124 1.687363 2.011927 2.293629 2.640697 2.705256 -1.328058 1.608269 1.989851 2.364958 2.590564 2.689451 -1.333592 1.644867 2.130503 2.308577 2.644140 2.732807 -1.405236 1.665965 2.123365 2.315861 2.656941 2.732874 -1.435372 1.679544 2.019100 2.254404 2.596082 2.674056 -1.041025 1.476515 1.923322 2.290557 2.592337 2.673623 -0.818396 1.189747 2.051367 2.233382 2.417100 2.622567 -0.745703 1.240251 2.139256 2.224179 2.476418 2.558791 -0.786217 1.296744 2.004359 2.245816 2.548718 2.631400 -0.781573 1.122340 1.875748 2.277284 2.459421 2.557207 -0.697586 1.327149 2.097985 2.173556 2.574671 2.693605 -0.773107 1.393007 1.971171 2.270220 2.591495 2.651543 -0.799951 1.252666 1.928383 2.211233 2.577718 2.683817 -0.737528 1.237907 1.827160 2.110526 2.476303 2.627671 -0.896067 1.421355 1.841161 2.104821 2.432869 2.585719 -0.920446 1.418578 1.943416 2.252701 2.491235 2.623110 -0.905094 1.284731 1.843688 2.269109 2.479541 2.595905 -1.049549 1.447497 1.841173 2.160358 2.575747 2.655700 -1.282800 1.445416 1.901230 2.290173 2.581640 2.678726 -1.174710 1.517021 1.867926 2.176617 2.547483 2.640154 -1.241259 1.518496 1.936773 2.208770 2.521322 2.619833 -1.321929 1.540199 1.998528 2.205769 2.605663 2.707912 -1.303802 1.622926 1.880392 2.189485 2.588909 2.669966 -1.360827 1.658553 1.903323 2.178010 2.554280 2.634772 -1.385461 1.623312 1.959095 2.257739 2.605390 2.694616 -1.467954 1.628168 2.003097 2.348920 2.596096 2.674558 -1.411837 1.691393 1.947010 2.259218 2.526145 2.615112 -1.415256 1.697464 2.003104 2.284290 2.526236 2.643365 -1.365343 1.610187 2.022103 2.171703 2.557595 2.642236 -1.343948 1.630769 2.040836 2.261714 2.477921 2.647359 -1.333580 1.630378 2.031205 2.210871 2.504057 2.623327 -1.344121 1.704685 2.065813 2.192571 2.541365 2.658520 -1.439884 1.666588 2.082726 2.206006 2.636341 2.699174 -1.344355 1.655936 2.026852 2.227832 2.565868 2.661265 -1.299677 1.585295 1.961552 2.231139 2.599559 2.677599 -1.184434 1.441654 1.888542 2.255409 2.554664 2.625508 -1.446570 1.792548 2.022664 2.179214 2.497160 2.591115 -1.464682 1.809276 2.060194 2.205446 2.545963 2.641910 -1.481290 1.729523 2.025686 2.250012 2.537459 2.667746 -1.476458 1.657788 2.008062 2.249201 2.503220 2.613116 -1.386264 1.589548 2.031702 2.218301 2.509210 2.619100 -1.386263 1.662864 2.052585 2.208677 2.488387 2.623049 -1.438117 1.646070 1.967818 2.212439 2.508718 2.629395 -1.437599 1.590230 2.089082 2.184453 2.566546 2.677847 -1.367022 1.652527 2.084373 2.169492 2.483600 2.655744 -1.403779 1.701337 2.062797 2.148537 2.443186 2.657250 -1.399193 1.706047 2.062427 2.144585 2.531224 2.635014 -1.409664 1.750569 2.005073 2.087238 2.602834 2.694068 -1.430153 1.760399 2.048802 2.118059 2.569383 2.657275 -1.418847 1.858926 2.018666 2.141412 2.597867 2.671139 -1.515040 1.815611 1.942165 2.089059 2.554645 2.634597 -1.420031 1.740119 1.953746 2.196133 2.502692 2.639749 -1.384099 1.723309 1.901165 2.160196 2.426618 2.522583 -1.341050 1.737372 1.894752 2.110869 2.407505 2.502838 -1.375756 1.553983 1.784274 1.981423 2.504116 2.571526 -1.414589 1.520552 1.715365 2.013015 2.511199 2.608636 -1.384971 1.519108 1.696689 1.939377 2.575701 2.644752 -1.377861 1.611683 1.751236 2.044564 2.493605 2.567974 -1.360853 1.553679 1.693976 2.036113 2.535885 2.588469 -1.391629 1.489335 1.631480 1.853083 2.529546 2.631825 -1.364077 1.476053 1.629040 1.949019 2.525741 2.587922 -1.243896 1.398594 1.539687 2.066323 2.528653 2.592221 -1.255509 1.429357 1.548843 1.950985 2.519984 2.574845 -1.213331 1.388798 1.505976 1.886640 2.486118 2.545361 -1.125797 1.286903 1.534946 1.982051 2.490209 2.570684 -1.132522 1.296198 1.460831 1.925246 2.355670 2.444037 -1.146734 1.365341 1.496067 2.020613 2.448334 2.510650 -1.192778 1.378937 1.491161 1.959258 2.459140 2.519716 -1.271605 1.383883 1.525856 1.953206 2.473140 2.526275 -1.199948 1.366094 1.519729 1.926772 2.562989 2.623739 -1.236017 1.383510 1.510394 1.793300 2.585490 2.677079 -1.277218 1.416561 1.539447 1.923790 2.599080 2.667723 -1.195957 1.408063 1.568713 2.090793 2.622180 2.668897 -1.174436 1.300805 1.706567 2.070327 2.332828 2.490999 -1.120253 1.252790 1.562102 2.057117 2.357857 2.488099 -1.176325 1.291966 1.760265 2.093355 2.395545 2.591528 -1.197722 1.415532 1.801926 2.033180 2.459620 2.592560 -1.170462 1.491249 1.888044 2.082479 2.392285 2.528149 -1.083509 1.491779 1.949458 2.046197 2.422471 2.591609 -1.059936 1.417978 1.954816 2.073246 2.480964 2.599125 -0.939633 1.348507 2.005684 2.094229 2.474051 2.580294 -0.849679 1.293534 1.998123 2.105266 2.410101 2.615907 -0.886534 1.432349 1.990451 2.089797 2.379083 2.539500 -0.973462 1.473622 1.944390 2.051837 2.393100 2.468610 -1.041989 1.576432 1.952733 2.062536 2.326319 2.437768 -1.048696 1.543946 1.799024 2.015259 2.415911 2.487382 -1.060745 1.463281 1.792003 1.940494 2.417438 2.517618 -1.086879 1.350511 1.715443 1.804481 2.481994 2.577240 -1.237763 1.487227 1.724896 1.808323 2.528530 2.614554 -1.398461 1.499585 1.705939 1.817865 2.537422 2.611149 -1.461839 1.549278 1.719489 1.835184 2.480052 2.656622 -1.411934 1.594838 1.722617 1.840214 2.536598 2.618705 -1.527085 1.609472 1.704839 1.832817 2.512769 2.605081 -1.549304 1.649714 1.747183 1.838847 2.593282 2.681523 -1.408650 1.622130 1.797760 1.950766 2.238972 2.463941 -1.463558 1.647961 1.790731 1.921407 2.348044 2.572625 -1.531892 1.700373 1.834041 2.005597 2.413477 2.570542 -1.595204 1.681563 1.857023 2.020177 2.475381 2.620261 -1.578383 1.651863 1.912263 2.011994 2.512496 2.625607 -1.551105 1.644360 1.936207 2.041608 2.527321 2.617243 -1.531973 1.623150 1.927602 2.007454 2.528038 2.634563 -1.492463 1.579493 1.908682 1.998228 2.490609 2.583094 -1.445430 1.548758 1.913697 2.002797 2.519245 2.610948 -1.397285 1.482251 1.891220 1.983837 2.474487 2.607776 -1.358299 1.562942 1.902050 2.003614 2.425639 2.585407 -1.313352 1.518886 1.923066 2.011942 2.496939 2.583703 -1.321679 1.506830 1.903064 1.990064 2.510610 2.619736 -1.272893 1.513437 1.897901 2.039656 2.536517 2.604144 -1.255738 1.431150 1.896619 1.960886 2.526746 2.624236 -1.253559 1.392826 1.893788 1.975079 2.520685 2.596673 -1.212336 1.375220 1.860311 1.964962 2.531189 2.598668 -1.177442 1.324186 1.806632 1.885288 2.487316 2.595463 -1.184996 1.383080 1.783224 1.863469 2.466568 2.570648 -1.162268 1.444731 1.797884 1.960244 2.515838 2.594432 -1.293132 1.612625 1.912866 2.113069 2.467202 2.592647 -1.354402 1.698025 1.960114 2.149465 2.532985 2.652695 -1.412069 1.729124 2.034085 2.172945 2.538810 2.643693 -1.391792 1.801757 1.944790 2.194546 2.467300 2.547714 -1.476077 1.743192 1.982548 2.141155 2.559049 2.642891 -1.423680 1.857196 1.998407 2.146989 2.499501 2.583857 -1.420678 1.878169 2.012321 2.298282 2.578266 2.665489 -1.455663 1.910540 2.069836 2.393055 2.593493 2.679808 -1.525575 1.925713 2.186470 2.400715 2.660126 2.743114 -1.376147 1.633438 1.934297 2.250493 2.494057 2.618970 -1.354498 1.560950 1.931259 2.207320 2.500701 2.611053 -1.308071 1.569512 1.967243 2.245460 2.461123 2.595512 -1.347009 1.654983 1.980907 2.251887 2.510089 2.634977 -1.478008 1.588438 2.038202 2.224140 2.499366 2.646631 -1.451530 1.630286 2.114101 2.249734 2.416504 2.651801 -1.412137 1.655832 2.128349 2.224639 2.525056 2.681740 -1.374504 1.848893 2.140832 2.291897 2.602827 2.691005 -1.378568 1.744853 2.106673 2.201221 2.626831 2.711996 -1.082739 1.603117 2.070774 2.129571 2.504286 2.657551 -1.013288 1.467910 1.960032 2.091788 2.362049 2.561554 -0.994100 1.328068 1.791699 1.902549 2.410628 2.501324 -0.999159 1.325245 1.722310 1.871377 2.281177 2.502088 -1.035282 1.338082 1.653023 1.759760 2.441464 2.540672 -1.077126 1.293589 1.565666 1.711796 2.330341 2.436256 -1.058117 1.243026 1.488328 1.623677 2.330121 2.429536 -1.150659 1.296201 1.574724 1.701839 2.390475 2.507354 -1.167918 1.382035 1.573815 1.795297 2.440653 2.490361 -1.221368 1.405075 1.535783 1.728642 2.412290 2.519375 -1.248273 1.383975 1.572280 1.826858 2.425352 2.494218 -1.274149 1.386267 1.557821 1.734106 2.378306 2.477968 -1.343890 1.456032 1.668535 1.815600 2.248744 2.419705 -1.356022 1.559300 1.731279 1.853333 2.343968 2.514760 -1.433214 1.575906 1.673186 1.781463 2.292800 2.491264 -1.354708 1.637604 1.875368 2.162870 2.408490 2.566375 -1.464664 1.591442 2.071219 2.235462 2.398887 2.563489 -1.424812 1.622646 2.020332 2.161315 2.328264 2.468190 -1.364274 1.516152 2.011760 2.109608 2.395705 2.554722 -1.342677 1.460516 2.038898 2.122976 2.506655 2.643449 -1.338308 1.519884 2.030044 2.100145 2.533338 2.674767 -1.321127 1.545574 1.977232 2.122268 2.557592 2.680218 -1.315091 1.467109 1.972429 2.068538 2.526845 2.645634 -1.304457 1.400689 1.954545 2.053140 2.562504 2.685886 -1.267182 1.376660 1.888057 2.029893 2.545417 2.669311 -1.225012 1.339338 1.887320 1.965236 2.543506 2.672285 -1.226210 1.403527 1.797664 1.959693 2.540988 2.627346 -1.347025 1.607942 1.966769 2.184515 2.477879 2.608821 -1.332099 1.755961 1.948416 2.176713 2.513390 2.601370 -1.349288 1.781404 1.922794 2.109230 2.462878 2.559863 -1.362379 1.693594 1.884339 2.088053 2.522473 2.613966 -1.320290 1.510299 1.857749 2.065435 2.494726 2.605564 -1.282991 1.459743 1.744910 1.961419 2.439941 2.623746 -1.251365 1.381919 1.673542 1.772697 2.323540 2.661592 -1.204256 1.435153 1.654230 1.737800 2.305057 2.581558 -1.181960 1.465280 1.670027 1.861303 2.444123 2.546129 -1.347122 1.628258 1.931339 2.123429 2.466851 2.598918 -1.170479 1.284934 1.552741 1.832546 2.299787 2.519811 -1.190040 1.284015 1.646086 1.969170 2.496917 2.620449 -1.255411 1.381474 1.781732 2.094994 2.431362 2.593520 -1.231880 1.334167 1.796249 2.040002 2.387081 2.554655 -1.180520 1.308571 1.818239 1.976323 2.293501 2.451796 -1.102564 1.266319 1.844247 1.961761 2.324841 2.514083 -1.004636 1.144874 1.835019 1.997102 2.182380 2.522076 -0.956994 1.212915 1.940923 2.060449 2.312226 2.441670 -0.795434 1.444280 1.932418 2.047161 2.365680 2.450523 -0.942462 1.606038 2.025121 2.119735 2.299947 2.431814 -0.812186 1.469389 2.078323 2.173021 2.391967 2.474051 -0.831008 1.620609 2.092943 2.167732 2.334863 2.416721 -0.917049 1.800997 2.121233 2.199383 2.347284 2.440519 -0.857286 1.679152 2.112428 2.203072 2.444738 2.529211 -0.809582 1.542552 2.182369 2.239437 2.461979 2.543366 -0.912283 1.779198 2.166321 2.251092 2.461682 2.576876 -0.774827 1.770199 2.179196 2.239611 2.487323 2.560225 -1.222989 1.574575 2.081078 2.223587 2.501523 2.661302 -1.394216 1.696320 2.036647 2.273328 2.570400 2.684130 -1.370771 1.698913 2.082660 2.245671 2.598794 2.695446 -1.372406 1.647175 2.142373 2.272905 2.608093 2.686558 -1.342788 1.694536 2.123284 2.256762 2.575277 2.690952 -1.380553 1.750680 2.123405 2.199744 2.488043 2.610243 -1.395056 1.883317 2.088702 2.189488 2.458258 2.548140 -1.413151 1.872836 2.020835 2.161956 2.396167 2.487013 -1.403097 1.764242 1.911249 2.055851 2.391006 2.484601 -1.250592 1.606846 1.834805 1.914414 2.344090 2.549461 -1.171007 1.406438 1.699124 1.858102 2.354073 2.471053 -1.132691 1.251867 1.521350 1.638290 2.355284 2.470608 -1.011681 1.287897 1.450262 1.663822 2.285463 2.371452 -1.030244 1.208417 1.366673 1.550352 2.337520 2.421401 -0.964915 1.171185 1.288162 1.588419 2.327292 2.388297 -0.953674 1.102888 1.263755 1.835591 2.316855 2.424820 -0.886544 1.074635 1.242245 1.964445 2.296815 2.412946 -0.853009 1.077083 1.184534 1.752324 2.283038 2.389217 -0.840278 1.033222 1.152546 1.520954 2.333984 2.454533 -0.910770 1.083873 1.223537 1.668076 2.346235 2.511845 -0.967915 1.121818 1.220258 1.806588 2.421129 2.498176 -0.992265 1.169069 1.260049 1.679990 2.398939 2.459143 -1.065276 1.230957 1.322385 1.753477 2.314399 2.415925 -1.081305 1.271782 1.458008 1.729400 2.332304 2.405121 -1.017815 1.349087 1.515836 1.721892 2.292963 2.398991 -1.097652 1.332937 1.570030 1.776462 2.377274 2.465894 -1.147644 1.302495 1.640156 1.797044 2.363880 2.474795 -1.127168 1.322009 1.684884 1.796463 2.407050 2.578659 -1.159532 1.266652 1.709552 1.830584 2.438156 2.572425 -1.137105 1.331512 1.749399 1.846000 2.414391 2.511488 -1.121271 1.351105 1.728223 1.846664 2.449211 2.564158 -1.118680 1.261543 1.794458 1.885767 2.429009 2.552772 -1.076991 1.212163 1.727637 1.861263 2.432992 2.564041 -1.082093 1.261697 1.760917 1.858031 2.315851 2.573591 -1.086353 1.279061 1.763123 1.864186 2.380786 2.485297 -0.988401 1.262393 1.737901 1.836710 2.375780 2.492390 -1.074712 1.196202 1.677279 1.806309 2.341401 2.560642 -1.067864 1.265290 1.689350 1.802993 2.401947 2.524062 -1.010475 1.289540 1.652721 1.778727 2.362305 2.466551 -0.977570 1.261308 1.576271 1.741327 2.297622 2.404091 -1.097180 1.464421 1.606664 1.717614 2.330709 2.412068 -1.383838 1.652270 1.898203 2.096608 2.476719 2.574183 -1.279735 1.700611 1.894987 2.029873 2.468395 2.584491 -1.236668 1.683312 1.791059 1.953368 2.533100 2.587084 -1.185052 1.599131 1.853897 1.944925 2.499951 2.572896 -1.163573 1.307316 1.872443 1.953987 2.544667 2.623228 -1.190969 1.449255 1.863288 1.937666 2.525272 2.599969 -1.118547 1.513105 1.856666 1.968822 2.497385 2.575529 -1.156521 1.630926 1.845452 2.051106 2.443167 2.534052 -1.410042 1.541981 2.135508 2.235609 2.575406 2.680553 -1.392791 1.720666 2.034946 2.192456 2.487154 2.653398 -1.581248 1.837838 2.109761 2.187484 2.497898 2.660089 -1.663078 1.901302 2.151665 2.248289 2.534789 2.639793 -1.623160 1.843067 2.177770 2.255312 2.543601 2.681190 -1.539709 1.846069 2.119080 2.315024 2.605425 2.695012 -1.532691 1.805362 2.166180 2.276515 2.582080 2.695324 -1.517203 1.864729 2.111840 2.241033 2.602399 2.678593 -1.481004 1.879771 2.183398 2.258504 2.624580 2.714706 -1.480064 1.947829 2.126591 2.239313 2.602703 2.689760 -1.615747 2.025678 2.188405 2.291472 2.673701 2.723276 -1.546688 2.023668 2.137583 2.233880 2.563573 2.627361 -1.517274 1.902434 2.132410 2.189277 2.548379 2.643352 -1.498762 1.602359 2.159933 2.275665 2.540579 2.682962 -1.573572 1.655201 2.071740 2.214602 2.523447 2.642142 -1.601993 1.680362 2.130147 2.247308 2.567706 2.670568 -1.632928 1.733671 2.134699 2.255127 2.559994 2.682076 -1.707428 1.752059 2.139704 2.252060 2.567637 2.647910 -1.680790 1.812582 2.189235 2.287297 2.578245 2.644737 -1.746130 1.778548 2.119511 2.283392 2.596379 2.686826 -1.680242 1.774944 2.097848 2.213994 2.558507 2.656276 -1.698158 1.777690 2.096918 2.211009 2.512421 2.625627 -1.757218 1.828197 2.092183 2.218630 2.459897 2.653906 -1.768299 1.815758 2.044601 2.174404 2.469800 2.674385 -1.740913 1.830010 2.044499 2.168426 2.442501 2.587668 -1.728988 1.801586 2.036902 2.135694 2.483000 2.647346 -1.740200 1.780349 2.039841 2.116482 2.460078 2.666408 -1.679167 1.810585 1.976200 2.085150 2.330970 2.574697 -1.675383 1.741676 1.986605 2.086988 2.444839 2.648385 -1.605366 1.684640 1.977146 2.084309 2.401376 2.626669 -1.593589 1.667011 1.993079 2.095793 2.477055 2.660517 -1.495436 1.677492 1.915438 2.107516 2.504100 2.687519 -1.371193 1.581007 1.812088 2.159971 2.540808 2.654514 -1.308897 1.652762 1.877696 2.100223 2.498357 2.635266 -1.257546 1.701192 1.908659 2.063978 2.330876 2.588480 -1.260641 1.733829 1.901311 2.046022 2.230421 2.379709 -1.192017 1.695443 1.866332 1.969861 2.131279 2.367813 -1.331300 1.727619 1.875686 1.967226 2.115488 2.461652 -1.221851 1.644785 1.861070 1.957289 2.263788 2.509227 -1.297010 1.684814 1.825106 1.981266 2.388696 2.497940 -1.292992 1.621691 1.795497 1.891584 2.430941 2.597238 -1.293338 1.412441 1.678427 2.013436 2.406265 2.575295 -1.355250 1.470521 1.748288 2.044830 2.411070 2.590823 -1.352085 1.474384 1.811950 2.028535 2.445376 2.597977 -1.380432 1.472981 1.836191 1.957768 2.390372 2.571170 -1.417568 1.514975 1.839991 1.974610 2.382486 2.510706 -1.396329 1.511621 1.743909 2.009524 2.414088 2.533502 -1.355999 1.511197 1.775041 1.973539 2.445398 2.568851 -1.357482 1.533305 1.820633 1.998326 2.395457 2.573696 -1.244544 1.446552 1.726849 1.935995 2.428985 2.555947 -1.206555 1.365874 1.510017 1.809039 2.464853 2.520241 -1.204707 1.340270 1.477154 1.731800 2.461076 2.525822 -1.152135 1.294762 1.429873 1.669780 2.436091 2.504828 -1.122329 1.284669 1.445441 1.811897 2.444467 2.535691 -1.167102 1.311995 1.430682 1.931216 2.579180 2.626367 -1.140963 1.255562 1.416924 1.913114 2.462643 2.552650 -1.175380 1.325094 1.434137 1.826282 2.534111 2.599692 -1.152952 1.311344 1.428753 1.733281 2.499163 2.555417 -1.208942 1.318147 1.450855 1.631131 2.484793 2.560756 -1.214984 1.312305 1.496973 1.602685 2.441060 2.513740 -1.154899 1.274352 1.497828 1.611080 2.493972 2.628464 -1.221737 1.324479 1.529355 1.668502 2.496342 2.572455 -1.265483 1.360436 1.574447 1.698291 2.465872 2.529454 -1.299969 1.411470 1.634331 1.790167 2.464188 2.546209 -1.296816 1.461296 1.674047 1.867297 2.472828 2.546532 -1.319231 1.493029 1.702922 1.867177 2.417583 2.503853 -1.307703 1.511731 1.795464 1.988697 2.415827 2.502063 -1.341439 1.567295 1.849636 2.054411 2.368545 2.484938 -1.346092 1.709857 1.847822 2.089875 2.320388 2.426929 -1.351207 1.582397 1.853947 2.087781 2.269740 2.406134 -1.403409 1.681258 1.930634 2.064741 2.317595 2.445510 -1.303563 1.800429 1.946546 2.064780 2.347899 2.575654 -1.401968 1.795117 2.043851 2.149158 2.337423 2.475421 -1.486349 1.896915 2.033679 2.164583 2.427213 2.516709 -1.581223 1.920360 2.032925 2.186636 2.458825 2.534175 -1.623672 1.949219 2.056949 2.220873 2.544733 2.612737 -1.720081 1.916335 2.069658 2.310061 2.503085 2.592652 -1.652066 1.993905 2.122170 2.282322 2.533728 2.604129 -1.696384 1.990268 2.088659 2.317899 2.562346 2.630795 -1.688613 1.976549 2.085500 2.354425 2.483404 2.567677 -1.791891 1.956617 2.084765 2.344129 2.473213 2.578020 -1.770146 1.955967 2.075143 2.263105 2.508576 2.594808 -1.688172 1.958387 2.097165 2.237127 2.443133 2.558386 -1.614095 1.858106 1.996129 2.151245 2.327315 2.485345 -1.517662 1.729778 1.975388 2.118726 2.390828 2.523423 -1.576388 1.764916 1.937347 2.159436 2.354537 2.476553 -1.596523 1.796717 1.930679 2.173774 2.415264 2.515193 -1.598274 1.758907 1.941525 2.242941 2.461919 2.548378 -1.564588 1.667806 1.910211 2.207508 2.432969 2.562295 -1.502258 1.598757 1.701036 1.993517 2.431658 2.568611 -1.261165 1.379257 1.669436 1.864259 2.424394 2.560278 -1.183142 1.291685 1.496242 1.775091 2.415349 2.571850 -1.176858 1.280643 1.397295 1.556275 2.482609 2.556911 -1.151406 1.269090 1.402613 1.529417 2.547298 2.660723 -1.138350 1.270088 1.386698 1.656508 2.516680 2.570828 -1.167637 1.288387 1.379397 1.815954 2.488744 2.544025 -1.191129 1.318584 1.433056 1.898734 2.440995 2.505523 -1.231547 1.339710 1.505832 1.865461 2.401919 2.567552 -1.249001 1.342543 1.526521 1.644629 2.260060 2.528113 -1.292116 1.385043 1.567293 1.928018 2.343597 2.526727 -1.553055 1.731196 1.875584 2.037623 2.189580 2.433617 -1.556332 1.807351 2.009873 2.134758 2.395110 2.517757 -1.700800 1.862996 2.016062 2.212872 2.465828 2.576608 -1.744516 1.892300 2.042875 2.203697 2.393022 2.529386 -1.614682 1.867043 2.024132 2.172368 2.402152 2.567866 -1.662548 1.926469 2.016222 2.153675 2.544682 2.636605 -1.607737 1.840632 2.036507 2.148869 2.475726 2.623423 -1.542603 1.789412 1.988210 2.133702 2.500071 2.623838 -1.520491 1.854019 1.966284 2.100229 2.465497 2.590987 -1.429100 1.726203 1.958566 2.068736 2.397125 2.578275 -1.230963 1.483915 1.909424 2.037168 2.278162 2.442677 -1.165473 1.402475 1.877668 1.985029 2.337001 2.482301 -1.060649 1.341795 1.891591 1.997803 2.342252 2.473851 -1.045982 1.264410 1.892878 2.028108 2.265711 2.418342 -0.872467 1.318607 1.941288 2.054895 2.265976 2.523000 -0.878165 1.208778 1.863524 2.074171 2.319885 2.460496 -0.871380 1.050930 1.866310 2.044293 2.184267 2.469225 -0.814866 1.206234 1.936241 2.046364 2.243986 2.391005 -0.791495 1.154802 1.950862 2.062225 2.270188 2.497120 -0.734873 1.117496 2.013891 2.146348 2.252079 2.340218 -0.717596 1.113315 2.145116 2.214288 2.350660 2.437091 -0.747897 1.181886 1.982640 2.073387 2.391063 2.461216 -0.814210 1.593704 1.930814 2.051889 2.279916 2.450975 -1.007998 1.635254 1.848698 1.998294 2.264960 2.399367 -1.058125 1.548258 1.725115 1.885874 2.174154 2.386746 -1.065325 1.446828 1.763113 2.061160 2.393931 2.533355 -1.245436 1.513106 1.699869 1.885972 2.163732 2.412556 -1.402218 1.550167 1.679097 2.104476 2.314265 2.464617 -1.439688 1.565541 1.746159 2.175756 2.353179 2.445969 -1.282789 1.467574 1.689789 2.057017 2.299566 2.506538 -1.157513 1.360077 1.531522 1.931682 2.277828 2.387362 -1.127719 1.287186 1.421085 1.844362 2.281074 2.385221 -1.172511 1.317506 1.497831 1.768329 2.327099 2.453399 -1.215615 1.351452 1.554622 1.706859 2.280267 2.410315 -1.162714 1.318505 1.568816 1.757107 2.225559 2.321236 -1.221146 1.364069 1.728202 1.867240 2.149636 2.323430 -1.274525 1.455876 1.651807 1.929882 2.119518 2.245371 -1.324827 1.466657 1.837727 1.982753 2.167839 2.294890 -1.207408 1.463737 1.907228 2.010942 2.187613 2.315377 -1.197505 1.325369 1.903945 2.104257 2.264375 2.406017 -0.964658 1.421326 1.800591 2.075541 2.249667 2.391422 -0.900184 1.419486 1.860531 2.052169 2.204670 2.414730 -0.976462 1.444988 1.837158 1.997086 2.133567 2.303194 -0.943062 1.543803 1.914625 1.993134 2.184650 2.344182 -0.896780 1.426973 1.923545 2.039994 2.257922 2.504524 -0.957615 1.553177 1.862682 2.044650 2.192655 2.484166 -1.024381 1.626871 1.891283 2.041787 2.304775 2.613132 -1.260699 1.570977 1.796922 1.938909 2.457980 2.543689 -1.433872 1.676893 2.020354 2.249287 2.488434 2.619226 -1.427791 1.605308 1.999841 2.197618 2.472581 2.628257 -1.344936 1.547750 2.019906 2.153463 2.482519 2.664904 -1.394553 1.830863 2.075753 2.146704 2.529848 2.662938 -1.393531 1.579984 2.005267 2.068322 2.595828 2.677955 -1.371670 1.501665 2.012362 2.069292 2.605716 2.701205 -1.365970 1.443760 1.893696 2.063362 2.540864 2.635754 -1.392813 1.470933 1.920415 1.985276 2.612047 2.670626 -1.393576 1.502340 1.926492 2.019514 2.571540 2.645701 -1.331438 1.470056 1.844344 1.945539 2.527331 2.620827 -1.280394 1.379998 1.822792 1.927676 2.470720 2.614037 -1.230446 1.394851 1.772237 1.910697 2.494879 2.569172 -1.103766 1.420997 1.742156 1.901028 2.458527 2.544960 -1.070834 1.438456 1.754789 1.827791 2.323725 2.484121 -1.023924 1.522342 1.713716 1.834742 2.289596 2.496846 -1.123843 1.539945 1.766275 1.866623 2.349980 2.441218 -1.046667 1.496581 1.791535 1.859477 2.400747 2.468296 -1.031227 1.504904 1.714267 1.944348 2.365219 2.459437 -1.201184 1.370120 1.882630 2.011333 2.411295 2.510294 -1.249461 1.324457 1.907616 2.059001 2.448619 2.551408 -1.308584 1.403015 1.961155 2.048592 2.475709 2.562469 -1.354357 1.476040 2.008730 2.111323 2.513237 2.591557 -1.415309 1.559632 2.020191 2.107847 2.505348 2.596462 -1.452150 1.536961 2.033461 2.120472 2.473458 2.600239 -1.476159 1.570668 1.981439 2.089874 2.441733 2.574939 -1.532138 1.607322 1.996255 2.099111 2.448993 2.575083 -1.578251 1.670901 1.946452 2.067931 2.484573 2.596033 -1.645992 1.719829 1.908426 2.034805 2.521504 2.630135 -1.675204 1.739089 1.858009 1.951150 2.549621 2.668138 -1.698801 1.740674 1.816221 1.872214 2.552990 2.675039 -1.589313 1.665941 1.751972 1.834254 2.495821 2.663916 -1.443571 1.535057 1.685496 1.788025 2.391781 2.644852 -1.389394 1.597558 1.884291 2.161052 2.453631 2.577281 -1.344693 1.573396 1.949051 2.033207 2.436483 2.650227 -1.340679 1.442192 1.904082 1.992387 2.427510 2.604339 -1.301569 1.363519 1.870210 1.953388 2.445808 2.609366 -1.265637 1.365516 1.838660 1.922174 2.431739 2.552480 -1.291868 1.451067 1.770742 1.900677 2.380488 2.474590 -1.319797 1.502062 1.686208 1.922008 2.291200 2.392613 -1.253224 1.445797 1.591748 1.893558 2.295028 2.381503 -1.171375 1.370630 1.523209 1.825821 2.336350 2.399182 -1.238986 1.365086 1.486833 1.790131 2.302513 2.384222 -1.186490 1.327527 1.463687 1.680778 2.322037 2.402246 -1.160765 1.294904 1.467635 1.613241 2.219663 2.329651 -1.167970 1.312269 1.458793 1.725469 2.182513 2.270653 -1.160491 1.371381 1.546645 1.859914 2.151480 2.267109 -1.060643 1.447736 1.589363 1.762026 2.187949 2.312538 -1.096873 1.449372 1.669939 1.880786 2.205157 2.322919 -0.965471 1.394985 1.664859 1.869740 2.130135 2.272101 -0.992815 1.276232 1.736324 1.883127 2.198488 2.291947 -0.989087 1.348989 1.869284 1.945029 2.217100 2.329616 -0.905850 1.296468 1.839413 1.984491 2.131357 2.261643 -0.913468 1.347104 1.974941 2.056808 2.233065 2.312403 -0.891335 1.518146 1.956057 2.017051 2.234247 2.369537 -0.838007 1.490697 2.017641 2.097784 2.331456 2.417972 -0.918242 1.411219 2.047094 2.157938 2.312207 2.414304 -0.737470 1.475335 2.131705 2.195099 2.336065 2.410088 -0.804454 1.247009 2.183193 2.253103 2.376866 2.457474 -0.910989 1.120584 2.031279 2.134740 2.301672 2.401323 -0.823657 1.023714 1.899299 2.153486 2.278157 2.468898 -0.820197 0.968457 1.655670 2.137310 2.320413 2.442552 -0.901009 1.047635 1.785794 2.126322 2.248142 2.419219 -0.908944 1.151536 1.941268 2.153759 2.287775 2.477861 -1.022921 1.329810 1.973526 2.121196 2.269160 2.496929 -1.008035 1.176565 1.832554 2.130737 2.263094 2.484071 -1.148404 1.261617 1.868165 2.138339 2.287914 2.475774 -1.131641 1.245536 1.746902 2.127206 2.273644 2.439518 -1.105449 1.230686 1.759865 2.023222 2.225896 2.485020 -1.232277 1.363476 1.914876 2.021647 2.314039 2.455927 -1.287966 1.377464 1.853658 2.039634 2.348077 2.502708 -1.285144 1.520789 1.951021 2.053636 2.366537 2.486110 -1.276358 1.656613 1.882329 2.084625 2.430619 2.524004 -1.305701 1.532539 1.861534 2.029161 2.435632 2.519577 -1.295725 1.474840 1.838375 2.045012 2.413018 2.545296 -1.232802 1.307215 1.786758 1.911450 2.533633 2.625793 -1.106012 1.252432 1.737311 1.827401 2.395470 2.658026 -1.080321 1.249736 1.763810 1.842229 2.488083 2.637970 -1.084809 1.302696 1.791104 1.915712 2.532753 2.626979 -1.024077 1.398495 1.758154 1.947685 2.536753 2.647797 -1.052552 1.486524 1.835972 2.013128 2.526539 2.621519 -0.980943 1.528894 1.887706 1.990429 2.559226 2.631730 -0.954706 1.355188 1.890849 1.968743 2.538301 2.645803 -0.894853 1.316420 1.931923 2.000630 2.617822 2.706960 -0.859848 1.166660 1.851854 2.011085 2.629872 2.731061 -0.817565 1.169139 1.975684 2.117069 2.593136 2.683713 -0.776768 0.999874 1.951669 2.126997 2.578530 2.719218 -0.750075 1.105669 2.015241 2.099156 2.469178 2.637879 -0.878438 1.039620 2.078822 2.189100 2.453168 2.610618 -0.915136 1.114879 2.017689 2.236527 2.370275 2.538277 -0.826110 1.208983 2.069074 2.156825 2.331864 2.463067 -0.869876 1.289563 2.061703 2.143050 2.313737 2.395809 -0.790056 1.421058 1.945728 2.025231 2.254924 2.384106 -0.782642 1.678142 1.928308 1.980152 2.169702 2.290020 -0.795940 1.409661 1.767797 1.894756 2.191648 2.280190 -0.832117 1.169093 1.828013 1.911028 2.228646 2.366162 -0.862231 1.189399 1.754948 1.924129 2.312126 2.412551 -1.034774 1.290469 1.783502 1.996158 2.343760 2.462730 -1.135806 1.358791 1.789192 1.980630 2.376359 2.495841 -1.303901 1.414996 1.787505 1.918440 2.435463 2.547746 -1.489246 1.592963 1.850578 1.950051 2.428039 2.571337 -1.631472 1.742640 1.887885 1.994933 2.493769 2.619665 -1.683853 1.800379 1.926611 2.064050 2.509149 2.592626 -1.745313 1.854259 1.988545 2.117137 2.504306 2.611340 -1.764270 1.890575 2.037993 2.174299 2.507724 2.600610 -1.680174 1.817366 1.937110 2.228976 2.550139 2.623314 -1.552625 1.819462 1.957322 2.263495 2.517281 2.580506 -1.558425 1.784912 2.021491 2.239374 2.543712 2.637456 -1.240665 1.739293 1.889814 2.105082 2.532436 2.618228 -0.928972 1.440269 1.769258 1.853352 2.400406 2.636877 -1.055767 1.488842 1.756065 1.832574 2.209682 2.650309 -1.013301 1.381032 1.704087 1.772713 2.155486 2.585135 -1.009186 1.333235 1.741382 1.846496 2.158765 2.517761 -1.006381 1.519900 1.813751 1.916290 2.407674 2.581853 -1.357730 1.530547 1.883639 2.141513 2.463268 2.614627 -1.426823 1.560875 1.882518 2.175206 2.488354 2.628703 -1.315984 1.579838 1.859556 2.083481 2.419884 2.564645 -1.213050 1.538899 1.800250 1.882067 2.341570 2.574606 -1.275056 1.543507 1.917099 2.127451 2.388939 2.542721 -1.438943 1.698143 1.856610 2.075189 2.266712 2.437372 -1.454331 1.663763 1.869820 2.011414 2.366272 2.533385 -1.382166 1.672920 1.827442 1.942032 2.453906 2.559856 -1.400656 1.585453 1.841334 2.002744 2.426997 2.517756 -1.382144 1.688087 1.819756 2.063153 2.417793 2.492551 -1.255095 1.603378 1.753915 2.047569 2.455562 2.569585 -1.134783 1.409147 1.705283 1.802106 2.488030 2.647140 -1.111876 1.260129 1.676050 1.778495 2.501588 2.627003 -1.060347 1.208811 1.660354 1.776864 2.488758 2.604456 -0.947120 1.164647 1.642037 1.723789 2.475156 2.567411 -0.902077 1.251204 1.664026 1.769008 2.499003 2.576704 -0.920170 1.243894 1.709681 1.794989 2.534352 2.623833 -0.938770 1.267684 1.725861 1.870157 2.549512 2.628197 -0.914357 1.254315 1.712915 1.784742 2.590431 2.707485 -0.930246 1.281241 1.802793 1.878861 2.560218 2.687216 -0.955350 1.148671 1.814732 1.902586 2.557821 2.684594 -0.968330 1.098589 1.813440 1.911875 2.463136 2.646490 -0.990311 1.185444 1.864673 1.941589 2.488112 2.664465 -1.186903 1.590929 1.954158 2.033697 2.597861 2.662179 -1.302643 1.694423 1.997444 2.169046 2.617414 2.693079 -1.379258 1.718278 1.993219 2.212202 2.543730 2.640859 -1.405165 1.780534 1.997893 2.151147 2.555776 2.632215 -1.297766 1.878255 2.020268 2.190566 2.546467 2.617338 -1.442158 1.856645 2.101038 2.299709 2.561481 2.644123 -1.370167 1.781207 2.114991 2.251821 2.446751 2.549845 -1.403451 1.703568 2.079302 2.221399 2.448766 2.593978 -1.413349 1.649169 2.009976 2.159164 2.518675 2.615138 -1.326655 1.719941 1.950443 2.025468 2.521068 2.635953 -1.385954 1.552749 1.856784 1.937506 2.496646 2.580159 -1.345409 1.488014 1.885538 2.017189 2.546874 2.625597 -1.335716 1.420210 1.787067 1.976842 2.501334 2.643553 -1.303803 1.408266 1.801454 1.901471 2.375048 2.575946 -1.312907 1.408086 1.837981 1.950093 2.318536 2.475897 -1.193613 1.293642 1.819061 1.974492 2.468077 2.585285 -1.191527 1.311470 1.711629 1.854585 2.395044 2.554024 -1.103176 1.332165 1.717922 1.857994 2.340287 2.445217 -0.996011 1.234172 1.751022 1.868274 2.285877 2.406723 -1.055311 1.378240 1.712116 1.841673 2.206702 2.440537 -1.078611 1.465910 1.787009 1.948977 2.231741 2.478981 -0.984520 1.420593 1.815304 1.925218 2.263433 2.430940 -0.984574 1.495178 1.774189 1.964126 2.221656 2.346849 -1.154842 1.507200 1.812101 1.949371 2.281741 2.426097 -1.170058 1.429376 1.745091 1.937927 2.235016 2.374769 -1.206485 1.487526 1.767298 2.009836 2.207048 2.339471 -1.073656 1.377733 1.828679 1.993004 2.130615 2.256776 -1.088454 1.495385 1.907767 1.996871 2.213903 2.390489 -1.122976 1.422213 1.865827 2.037113 2.253747 2.418388 -1.134166 1.382636 1.804236 1.963200 2.161170 2.473602 -1.245397 1.552607 1.960811 2.134690 2.453597 2.577539 -1.118704 1.567208 1.952615 2.176519 2.446630 2.578556 -1.141708 1.643603 2.013339 2.277434 2.557381 2.634785 -1.392514 1.807925 2.039343 2.237922 2.578023 2.668286 -1.433212 1.833712 2.020620 2.252182 2.518635 2.600857 -1.379262 1.712226 2.024999 2.242965 2.515533 2.602479 -1.366984 1.675637 1.976590 2.199474 2.516967 2.598815 -1.352760 1.801872 2.033607 2.181935 2.491382 2.589883 -1.323663 1.743572 2.009640 2.122701 2.474517 2.566379 -1.190092 1.540538 1.933066 2.088076 2.506726 2.570608 -1.519832 1.766187 1.906004 2.076747 2.261416 2.407680 -1.534691 1.714074 2.016476 2.130902 2.323259 2.457608 -1.522050 1.794760 2.050945 2.218278 2.408013 2.537728 -1.665365 1.906867 2.025658 2.232383 2.430131 2.550641 -1.666299 1.834650 1.998042 2.220240 2.401507 2.502391 -1.523608 1.730092 1.862962 2.164599 2.466262 2.549229 -1.216124 1.503465 1.760462 1.967473 2.381720 2.564350 -1.171128 1.429428 1.616628 1.917782 2.387933 2.477271 -1.091303 1.351374 1.568657 1.796196 2.437587 2.514874 -1.001277 1.386906 1.539603 1.775045 2.413270 2.482152 -0.952227 1.397307 1.527926 1.722524 2.442747 2.492370 -0.824979 1.388886 1.568976 1.735264 2.408751 2.471180 -0.794444 1.433059 1.588848 1.749579 2.489366 2.576364 -0.899067 1.521851 1.681397 1.780293 2.441748 2.508286 -0.922249 1.464613 1.592525 1.828442 2.418162 2.477264 -0.871556 1.444421 1.538321 1.889009 2.353691 2.412544 -0.857823 1.270248 1.501265 1.760257 2.355761 2.407297 -0.846263 1.176606 1.481984 1.614166 2.369933 2.485687 -0.882414 1.176092 1.377969 1.497390 2.380010 2.516508 -0.938718 1.100648 1.489109 1.576205 2.325566 2.543468 -0.932462 1.105586 1.294346 1.470956 2.400120 2.554718 -0.945253 1.161000 1.303877 1.580262 2.466680 2.584612 -1.018317 1.214740 1.330580 1.683749 2.482961 2.557157 -1.048240 1.175481 1.258095 1.599087 2.521448 2.642499 -1.073739 1.203513 1.298705 1.688758 2.555683 2.614473 -1.096788 1.260856 1.368595 1.755340 2.493034 2.606453 -1.105643 1.227026 1.404391 1.849702 2.523314 2.601568 -1.143864 1.269393 1.387340 1.829083 2.395167 2.496463 -1.099246 1.228614 1.344408 1.664420 2.440626 2.518066 -1.116181 1.228322 1.332947 1.667312 2.331673 2.512262 -1.201517 1.299388 1.478475 1.577915 2.003307 2.451583 -1.167995 1.292729 1.470730 1.814621 2.140965 2.436146 -1.280521 1.424881 1.595211 1.803880 2.205832 2.315376 -1.230157 1.364939 1.610435 2.002513 2.172872 2.355721 -1.302555 1.400606 1.734329 2.074003 2.208548 2.389274 -1.512686 1.818227 2.144783 2.266917 2.447736 2.569392 -1.507528 1.760422 2.164228 2.276872 2.479494 2.624837 -1.446511 1.760436 2.114696 2.256700 2.572570 2.661468 -1.468868 1.812355 2.114567 2.193023 2.617745 2.713842 -1.449647 1.776448 2.080604 2.210155 2.540909 2.713991 -1.441252 1.719517 2.114612 2.218690 2.511304 2.660049 -1.477657 1.619839 2.112699 2.198704 2.520599 2.655696 -1.532866 1.718145 2.132629 2.222301 2.551440 2.665729 -1.341030 1.814584 2.125039 2.245863 2.547976 2.649591 -1.361910 1.698086 2.076920 2.255113 2.524884 2.647043 -1.315333 1.592772 2.109776 2.210194 2.517745 2.666968 -1.382801 1.571593 2.106842 2.204058 2.495197 2.661417 -1.453626 1.641746 2.100313 2.199368 2.462404 2.608881 -1.376104 1.646574 1.987188 2.218409 2.413618 2.526810 -1.372839 1.632461 2.056237 2.163721 2.376186 2.586874 -1.432614 1.624632 2.074174 2.119889 2.480656 2.669026 -1.410683 1.662804 2.069219 2.130369 2.581373 2.714005 -1.174126 1.524516 2.032046 2.105255 2.502385 2.653307 -1.150832 1.249780 2.004788 2.158226 2.317980 2.588167 -1.057643 1.199724 2.043666 2.165479 2.371022 2.608171 -1.070330 1.169192 2.051065 2.187195 2.476449 2.671328 -0.989962 1.100883 1.959715 2.107656 2.451860 2.659328 -0.995945 1.125081 1.967729 2.171051 2.352755 2.586378 -0.951054 1.073408 1.768679 2.213097 2.362509 2.504270 -0.912647 1.063629 1.874306 2.209354 2.347793 2.515052 -0.880146 1.057702 1.939506 2.298197 2.447874 2.559719 -0.808391 0.999903 1.789456 2.221085 2.383243 2.512098 -0.872797 1.051306 1.907981 2.345885 2.551438 2.620384 -0.736864 0.925226 2.101552 2.273865 2.392948 2.568863 -0.704727 1.026198 2.094726 2.212489 2.474164 2.656197 -0.793545 1.029482 1.901019 2.333682 2.650248 2.721424 -0.890709 1.270067 2.139854 2.238320 2.544384 2.711324 -0.971655 1.317691 2.245472 2.351092 2.631963 2.711259 -1.080789 1.555771 2.010618 2.245992 2.528408 2.644890 -1.409512 1.769321 2.106696 2.284262 2.512254 2.638336 -1.248437 1.661986 2.035140 2.283241 2.534287 2.647326 -0.952460 1.123797 2.103484 2.258075 2.394744 2.604571 -0.989645 1.181656 2.023429 2.237371 2.369517 2.522527 -0.926042 1.348117 1.949341 2.062080 2.346962 2.449077 -0.919696 1.405301 1.834047 2.099696 2.376206 2.493394 -1.000811 1.371649 1.836653 2.224095 2.410108 2.539296 -1.200088 1.436788 1.839151 2.179281 2.398849 2.498430 -1.223520 1.486412 1.943988 2.252258 2.407325 2.540679 -1.113671 1.477208 1.844163 2.218008 2.381333 2.486877 -1.138107 1.498752 1.980951 2.297474 2.457848 2.560767 -1.146154 1.614539 1.898903 2.232476 2.416572 2.510958 -1.119673 1.589916 1.824415 2.111914 2.354760 2.453276 -1.032037 1.589416 1.852847 2.142988 2.324001 2.472943 -0.989427 1.528982 1.914645 2.179193 2.376737 2.494371 -1.095755 1.494564 1.866122 2.136805 2.283713 2.464058 -0.834557 1.463722 1.882565 2.150927 2.378636 2.463091 -0.835589 1.296069 1.771371 2.098776 2.286243 2.426378 -0.806577 1.403328 1.685216 2.040945 2.235736 2.356401 -0.800011 1.383092 1.814158 1.959934 2.309583 2.386791 -0.804745 1.318210 1.821360 1.908703 2.235131 2.427141 -0.895849 1.367225 1.864812 1.979670 2.324237 2.420788 -0.827390 1.425085 1.767158 2.058185 2.376232 2.469430 -0.917915 1.497920 1.855338 1.987207 2.315382 2.451640 -0.940855 1.409563 1.789190 1.988531 2.336666 2.534686 -0.972711 1.291697 1.786937 1.914881 2.323264 2.405491 -0.993281 1.368817 1.807237 1.958622 2.357274 2.459276 -1.074694 1.349312 1.840844 1.954844 2.269081 2.384056 -1.100597 1.218573 1.756134 1.900188 2.277874 2.406215 -1.165622 1.313695 1.843695 1.962222 2.157100 2.342911 -1.157768 1.372357 1.879963 1.991928 2.258080 2.390865 -1.286092 1.780986 1.959702 2.118874 2.324541 2.437595 -1.455169 1.738149 2.098885 2.235010 2.428464 2.539714 -1.500252 1.684257 2.161002 2.272591 2.399078 2.510334 -1.485672 1.846402 2.195717 2.305655 2.546282 2.650594 -1.727818 2.013707 2.167283 2.304214 2.586608 2.652160 -1.676773 1.960528 2.217006 2.368813 2.598284 2.681624 -1.631959 1.915752 2.227040 2.335178 2.603101 2.710218 -1.663857 1.973017 2.124709 2.222354 2.660483 2.724322 -1.542011 1.929582 2.075601 2.170628 2.628551 2.707745 -1.509689 1.706046 2.056908 2.197674 2.578326 2.653903 -1.482072 1.673728 2.131047 2.194868 2.586319 2.690293 -1.423447 1.643267 2.092317 2.178941 2.527205 2.636748 -1.355154 1.565169 2.023932 2.236487 2.538323 2.655495 -1.328421 1.553976 2.081558 2.161922 2.472742 2.656928 -1.330758 1.419042 2.026707 2.129051 2.367999 2.571017 -1.270648 1.377593 2.025948 2.140131 2.389237 2.575945 -1.236825 1.345428 2.022395 2.109848 2.478126 2.633911 -1.222076 1.320425 1.939670 2.021742 2.436807 2.628532 -1.252172 1.358274 1.972621 2.079346 2.371453 2.598928 -1.266234 1.470203 1.930446 2.145813 2.471858 2.618153 -1.332281 1.546411 2.025723 2.219524 2.464616 2.645111 -1.418604 1.649476 2.008305 2.128114 2.489878 2.676868 -1.455677 1.684682 1.988976 2.152647 2.470396 2.651526 -1.447490 1.600650 1.935900 2.271764 2.512990 2.631833 -1.444770 1.556361 2.020377 2.282318 2.475768 2.612336 -1.387476 1.487406 2.024679 2.244659 2.445046 2.582829 -1.353922 1.443279 1.957555 2.171307 2.336106 2.560084 -1.369786 1.447714 2.006181 2.191416 2.404713 2.604727 -1.425956 1.504279 2.072312 2.178177 2.417663 2.603411 -1.440235 1.540501 2.082397 2.211979 2.377070 2.637315 -1.497010 1.582681 2.056522 2.172175 2.389278 2.593845 -1.504963 1.584564 1.984094 2.149333 2.367563 2.559723 -1.519045 1.603989 1.993800 2.109929 2.327255 2.599694 -1.569559 1.651048 1.988942 2.116726 2.345772 2.569917 -1.569894 1.683682 1.980575 2.182917 2.357234 2.587282 -1.607074 1.712704 1.951468 2.125681 2.307168 2.547246 -1.645231 1.736599 1.952360 2.131487 2.376223 2.606463 -1.669612 1.763984 1.979653 2.173233 2.332349 2.516667 -1.632436 1.758871 1.980800 2.124271 2.285899 2.443828 -1.557406 1.667695 1.902055 2.106931 2.260859 2.483917 -1.470421 1.688945 1.846379 2.032834 2.185130 2.375868 -1.421944 1.531479 1.825667 2.026592 2.180382 2.360115 -1.385644 1.606158 1.846365 2.071388 2.488500 2.607454 -1.359715 1.577664 1.897105 2.111958 2.471108 2.603005 -1.339447 1.542640 1.933966 2.133741 2.454906 2.583194 -1.325808 1.691761 2.080233 2.164213 2.474164 2.605215 -1.347146 1.624704 2.074108 2.214395 2.430593 2.562946 -1.314857 1.541837 1.967631 2.164145 2.372693 2.606516 -1.312898 1.534081 1.917285 2.089949 2.411610 2.570672 -1.283019 1.557401 1.937879 2.103338 2.520615 2.623700 -1.138825 1.337472 1.871092 1.972746 2.433484 2.647653 -1.155936 1.281125 1.831346 1.919243 2.266602 2.600943 -1.166841 1.273824 1.843198 1.946026 2.318377 2.578792 -1.172291 1.275007 1.832581 2.025917 2.353813 2.624686 -1.082157 1.265436 1.892357 1.989008 2.383161 2.601421 -1.091903 1.208823 1.835009 2.034461 2.394722 2.562904 -1.098835 1.199487 1.757650 2.065888 2.390403 2.578893 -1.132798 1.244386 1.876625 2.071549 2.339183 2.537916 -1.180603 1.259469 1.823163 2.095055 2.256898 2.542724 -1.186987 1.312908 1.800793 2.105036 2.366989 2.496082 -1.266390 1.377139 1.810434 2.113272 2.329619 2.533152 -1.323586 1.404515 1.904242 2.145928 2.386113 2.580936 -1.352171 1.451401 1.949824 2.077051 2.390820 2.538573 -1.343859 1.452231 1.889889 2.026744 2.317477 2.482486 -1.244808 1.378854 1.792557 1.986745 2.422571 2.536950 -1.124619 1.253596 1.703825 1.951315 2.439640 2.545147 -0.995104 1.411750 1.728505 1.861639 2.456605 2.544957 -1.001072 1.409106 1.797727 1.897572 2.409482 2.555324 -1.033981 1.428160 1.786944 1.880286 2.326359 2.503159 -0.970169 1.320721 1.716642 1.841569 2.220200 2.388916 -0.930477 1.373382 1.798398 1.904734 2.305786 2.525304 -0.939935 1.418455 1.772704 1.878087 2.367491 2.461526 -0.949116 1.527114 1.765903 1.840735 2.164926 2.474337 -0.993353 1.629343 1.813445 1.910215 2.100772 2.492902 -1.013830 1.549621 1.796834 1.891936 2.239760 2.556346 -0.970121 1.509802 1.834006 1.938978 2.338575 2.504346 -0.947238 1.361377 1.783553 1.984713 2.423900 2.547178 -0.980991 1.388783 1.783307 2.131708 2.454635 2.558692 -1.002668 1.402339 1.807195 2.024461 2.464418 2.554280 -1.010697 1.404186 1.872558 2.079362 2.479332 2.569625 -0.972976 1.375802 1.843367 1.980698 2.513609 2.578272 -0.932062 1.277676 1.851126 1.985878 2.466286 2.566260 -0.938577 1.181150 1.833964 1.965034 2.458011 2.550532 -0.940095 1.145447 1.796688 2.078273 2.482897 2.610630 -0.909789 1.074084 1.717403 2.139110 2.462525 2.572261 -0.882446 1.066652 1.729556 2.284662 2.478899 2.555022 -0.938178 1.121504 1.828485 2.234041 2.474778 2.557100 -0.917165 1.283072 1.779497 2.100290 2.475831 2.590182 -1.062938 1.349043 1.762759 2.118297 2.504806 2.606788 -1.186965 1.461900 1.889039 2.112738 2.481323 2.621310 -1.480720 1.619232 1.979483 2.177103 2.436476 2.578983 -1.448723 1.566337 1.880134 2.138534 2.339676 2.554594 -1.407995 1.613546 1.828927 2.052703 2.344501 2.538078 -1.616019 1.691006 1.856347 1.980078 2.548246 2.637759 -1.628171 1.684163 1.886153 2.012867 2.563772 2.621577 -1.595743 1.688011 1.935400 2.025813 2.483630 2.616820 -1.641560 1.708656 1.955460 2.046989 2.519834 2.645741 -1.673668 1.752213 1.951288 2.080918 2.487394 2.640725 -1.656417 1.736239 1.991365 2.098321 2.571908 2.676827 -1.659820 1.732449 1.951246 2.077020 2.581642 2.693515 -1.654803 1.716207 1.966639 2.044230 2.563251 2.680200 -1.602729 1.682614 1.917410 1.994825 2.531087 2.673289 -1.582550 1.639535 1.926100 1.992074 2.532073 2.697110 -1.462370 1.585004 1.818300 1.897553 2.557132 2.706256 -1.453199 1.550734 1.815192 1.916461 2.399968 2.667684 -1.419387 1.557717 1.784441 1.909176 2.511382 2.669980 -1.395165 1.539820 1.847477 1.930837 2.583961 2.703625 -1.348853 1.610875 1.958146 2.043068 2.586086 2.664353 -1.372390 1.658144 1.958657 2.189437 2.450481 2.650316 -1.352586 1.528092 1.923141 2.194837 2.427729 2.562143 -1.380925 1.612272 1.993385 2.176111 2.508934 2.635056 -1.429580 1.686586 2.017126 2.172565 2.486420 2.609268 -1.392123 1.641039 1.952077 2.065066 2.421215 2.574909 -1.399593 1.788262 1.952093 2.098580 2.489935 2.629393 -1.383756 1.662435 1.983097 2.112236 2.532805 2.631814 -1.372732 1.673625 1.912122 2.134246 2.432996 2.612276 -1.396034 1.642619 1.962634 2.197392 2.521323 2.660686 -1.379360 1.623989 2.069404 2.243124 2.562033 2.668437 -1.338665 1.618629 2.042041 2.195119 2.570159 2.699099 -1.294124 1.712084 2.050162 2.120133 2.607839 2.681695 -1.293254 1.596252 1.993414 2.060041 2.583077 2.664144 -1.209917 1.362665 1.955116 2.028347 2.512957 2.625803 -1.381701 1.706617 2.003167 2.146470 2.500026 2.613009 -1.204671 1.734562 1.928802 2.109687 2.476898 2.549090 -1.114491 1.696319 1.888819 2.043672 2.539268 2.637168 -1.119312 1.601460 1.846733 2.085664 2.577543 2.645353 -1.128747 1.531175 1.858280 2.146770 2.596351 2.688725 -1.130254 1.674654 1.830664 2.172114 2.562554 2.672831 -1.100767 1.644406 1.833225 2.040605 2.599334 2.652288 -1.066968 1.530596 1.768634 2.003323 2.617323 2.678055 -1.063119 1.469356 1.797817 1.881851 2.568187 2.679145 -1.177293 1.703277 1.865510 2.061041 2.481068 2.581444 -1.404135 1.657504 1.927058 2.181851 2.457409 2.580431 -1.428360 1.663538 1.984994 2.183449 2.458664 2.569489 -1.403204 1.667154 1.955094 2.146449 2.462636 2.562658 -1.234126 1.597848 1.917754 2.034440 2.407548 2.560257 -1.224528 1.368625 1.848065 1.924719 2.494949 2.670207 -1.214772 1.588344 1.765811 2.003861 2.526784 2.635964 -1.264884 1.636472 1.825225 2.077058 2.563495 2.679292 -1.269611 1.588977 1.782182 2.095015 2.620415 2.691789 -1.296409 1.504336 1.802915 2.013382 2.605687 2.681621 -1.334375 1.520771 1.796606 1.963884 2.600418 2.703744 -1.397570 1.600583 1.845972 1.940123 2.616223 2.696111 -1.430879 1.559075 1.799241 1.994052 2.598948 2.674700 -1.482115 1.583037 1.807507 1.981426 2.575382 2.684729 -1.464344 1.565621 1.776029 1.917627 2.575000 2.659270 -1.455399 1.538232 1.730658 1.882074 2.563750 2.660443 -1.499577 1.584423 1.688069 1.892068 2.587098 2.688675 -1.479760 1.573703 1.695194 2.024437 2.558177 2.639037 -1.452267 1.547118 1.750567 2.072025 2.537014 2.673786 -1.447379 1.563037 1.794376 2.141633 2.353387 2.502548 -1.351721 1.450714 1.730230 1.991889 2.298349 2.463553 -1.318760 1.414624 1.641985 1.948338 2.326246 2.474291 -1.212051 1.346227 1.685099 1.959885 2.322238 2.512951 -1.209021 1.302946 1.634616 1.930848 2.282912 2.507545 -1.188947 1.292823 1.665660 2.177853 2.373563 2.474293 -1.257542 1.451148 1.836011 2.161476 2.447295 2.596642 -1.253420 1.370197 1.833717 2.244743 2.479769 2.576022 -1.179954 1.302011 1.592154 2.151577 2.455959 2.518120 -1.114477 1.257653 1.411579 2.042361 2.548294 2.620409 -1.099986 1.307070 1.407174 2.159418 2.585914 2.649358 -1.131151 1.246857 1.401279 2.116604 2.483756 2.546663 -1.173775 1.340865 1.449901 2.093705 2.561030 2.626482 -1.189575 1.346203 1.465586 2.003540 2.517749 2.575697 -1.217965 1.302991 1.569488 2.028970 2.455729 2.550140 -1.231915 1.393228 1.520464 1.955734 2.476226 2.642241 -1.277177 1.451138 1.591018 1.925992 2.458091 2.566561 -1.216236 1.483117 1.688680 1.988972 2.454628 2.599617 -1.184293 1.553039 1.838890 2.100265 2.385006 2.550049 -1.239174 1.792822 1.959073 2.182600 2.445294 2.529569 -1.624571 1.860854 2.120332 2.219916 2.429410 2.594102 -1.753243 1.889331 2.136521 2.254574 2.436331 2.562459 -1.757269 1.956924 2.242335 2.360108 2.493739 2.587626 -1.806843 1.985195 2.197761 2.338682 2.496335 2.600682 -1.859905 2.030422 2.282537 2.396000 2.548595 2.632629 -1.771104 1.896134 2.306763 2.421261 2.538338 2.625956 -1.505646 1.893235 2.019328 2.325790 2.487965 2.585530 -1.189137 1.771099 1.915068 2.254873 2.534430 2.612783 -1.103999 1.649346 1.834993 1.935938 2.534134 2.651998 -1.079006 1.522445 1.767276 1.934965 2.523135 2.596389 -1.106210 1.608040 1.751444 2.008392 2.491731 2.577152 -1.225135 1.597265 1.857833 2.103611 2.465420 2.593047 -1.375366 1.618359 1.930516 2.214454 2.445564 2.576198 -1.429991 1.698975 1.982144 2.233337 2.490443 2.605353 -1.482797 1.679463 1.997759 2.222400 2.464577 2.586822 -1.407997 1.676636 1.970849 2.221085 2.440364 2.592428 -1.279905 1.618797 1.920986 2.161088 2.438805 2.627424 -0.936959 1.310295 1.663367 2.010101 2.515991 2.597781 -1.014662 1.401511 1.590078 2.080875 2.556905 2.622152 -1.043648 1.384572 1.571501 1.988231 2.568660 2.647893 -1.107266 1.413973 1.562057 1.877144 2.554722 2.637289 -1.179476 1.467385 1.605003 1.839003 2.523485 2.640499 -1.218315 1.412023 1.591634 1.796526 2.519799 2.660570 -1.305370 1.427385 1.614577 1.763694 2.497267 2.657791 -1.338542 1.456340 1.642200 1.862353 2.448789 2.631625 -1.328675 1.442223 1.575230 1.858910 2.470665 2.570433 -1.351215 1.466285 1.601432 1.863743 2.425253 2.500336 -1.360914 1.476484 1.624624 1.832107 2.486273 2.563333 -1.401730 1.499881 1.613403 1.749733 2.423219 2.591408 -1.261551 1.402991 1.523781 1.802043 2.499740 2.605532 -1.160005 1.467049 1.605598 1.787691 2.508050 2.557362 -1.279521 1.535093 1.620574 1.758619 2.409621 2.676419 -1.161358 1.505461 1.626199 1.733096 2.398831 2.617482 -1.184633 1.528528 1.614286 1.698210 2.350337 2.667102 -1.117350 1.538074 1.658450 1.759625 2.281261 2.580678 -1.109838 1.492830 1.701966 1.789832 2.151236 2.489725 -1.010233 1.467118 1.631090 1.886421 2.420021 2.522779 -0.950861 1.336887 1.617005 1.789550 2.449618 2.528894 -1.028468 1.348095 1.571888 1.880393 2.543912 2.608014 -1.110746 1.415658 1.690546 2.005512 2.558177 2.650097 -1.110147 1.432665 1.669404 1.901594 2.516926 2.602743 -1.067829 1.543381 1.719440 1.979004 2.543666 2.617575 -1.422545 1.701061 1.940427 2.327061 2.557612 2.642956 -1.386122 1.781934 2.040679 2.383895 2.573951 2.633463 -1.512775 1.696332 2.184500 2.295985 2.578995 2.677261 -1.571845 1.705242 2.225227 2.319189 2.542604 2.676163 -1.514913 1.844285 2.247341 2.361592 2.529071 2.653297 -1.603580 1.948417 2.271813 2.429600 2.528208 2.617731 -1.620409 2.024184 2.379020 2.477983 2.622963 2.670765 -1.578823 1.906347 2.238314 2.378843 2.556955 2.647118 -1.611136 1.900666 2.185777 2.317384 2.517010 2.610141 -1.554611 1.941431 2.133055 2.249862 2.491762 2.571608 -1.469621 1.918901 2.094184 2.225177 2.490350 2.564343 -1.335366 1.697214 2.017085 2.232317 2.474337 2.571016 -1.221936 1.519055 1.814063 2.129404 2.458290 2.560125 -1.193348 1.426044 1.731637 2.009086 2.485687 2.566097 -1.140861 1.304138 1.724072 1.962123 2.456816 2.673582 -1.171988 1.316998 1.756942 2.050812 2.520621 2.679355 -1.135139 1.410213 1.715289 2.092595 2.499448 2.617713 -1.114534 1.487214 1.595404 2.013785 2.531961 2.628395 -1.185163 1.399888 1.582655 2.195793 2.518380 2.582468 -1.104552 1.423680 1.656289 2.262530 2.593187 2.664012 -1.164305 1.596992 1.717746 2.207846 2.563155 2.621398 -1.022593 1.596460 1.831763 2.287975 2.519037 2.580420 -0.920067 1.656499 1.829222 2.207172 2.535598 2.582536 -0.940069 1.577439 1.960575 2.189248 2.482820 2.549330 -0.824619 1.708493 1.932229 2.188611 2.551880 2.605484 -0.819752 1.688971 1.950607 2.083451 2.463192 2.515870 -0.820934 1.718478 2.021631 2.158415 2.521119 2.576288 -0.860984 1.615689 2.046857 2.146219 2.469888 2.571061 -0.722400 1.647372 1.973155 2.066104 2.438838 2.609071 -0.853506 1.577947 1.949855 2.082839 2.448741 2.512425 -0.745605 1.464510 1.993321 2.077513 2.469178 2.532474 -0.710718 1.533693 1.890047 2.013877 2.425598 2.516390 -0.877569 1.511979 1.831605 2.031903 2.441617 2.517441 -1.259618 1.519519 1.879696 2.138828 2.450290 2.614072 -1.326658 1.670099 1.919340 2.148365 2.362928 2.464453 -1.437714 1.671637 1.955052 2.166713 2.405950 2.557523 -1.603868 1.740291 1.989945 2.198778 2.467525 2.585653 -1.638499 1.743252 2.051089 2.149707 2.462625 2.569332 -1.631833 1.721768 2.002918 2.131145 2.438931 2.569221 -1.603157 1.763192 2.082194 2.174769 2.376719 2.502259 -1.630977 1.703944 2.009215 2.149268 2.369179 2.580570 -1.576599 1.658687 1.922940 2.124950 2.448734 2.578273 -1.516265 1.630706 1.860803 2.127036 2.444402 2.582277 -1.458879 1.547626 1.796080 2.046972 2.378056 2.535592 -1.376657 1.512511 1.733562 2.098209 2.361768 2.452137 -1.134749 1.320184 1.582547 2.052886 2.449062 2.527062 -1.079447 1.164059 1.573367 2.220764 2.500300 2.560928 -1.060468 1.186417 1.456658 2.155790 2.437004 2.526903 -0.974645 1.132811 1.563530 2.089864 2.504612 2.571780 -0.925733 1.049035 1.555693 2.095444 2.541677 2.614171 -1.012861 1.154680 1.283807 2.126165 2.558786 2.595811 -0.970704 1.088894 1.398803 1.969666 2.517460 2.621486 -0.996670 1.155602 1.284230 1.967741 2.478048 2.536750 -1.061875 1.172759 1.296847 1.890131 2.465313 2.550488 -0.971133 1.146895 1.425088 1.823656 2.310199 2.513193 -1.122316 1.246948 1.573931 1.945863 2.350666 2.546107 -1.130444 1.281802 1.711748 2.052845 2.471168 2.568969 -1.285794 1.425185 1.874398 2.085225 2.426111 2.576993 -1.273537 1.490213 1.878772 2.106249 2.402449 2.544368 -1.224244 1.462476 1.904611 2.128189 2.416565 2.570019 -1.252061 1.449849 1.802510 2.119875 2.418885 2.518798 -1.327124 1.417585 1.789962 2.174930 2.340651 2.468715 -1.346777 1.435555 1.734308 2.036035 2.356552 2.531051 -1.235820 1.315959 1.597124 1.897870 2.284217 2.575948 -0.955415 1.303770 1.560187 1.730070 2.449775 2.648120 -0.909089 1.471674 1.624478 1.890973 2.389653 2.627950 -0.919631 1.366873 1.506021 1.842587 2.342002 2.554492 -0.855197 1.279671 1.539553 1.688524 2.386911 2.502065 -0.807057 1.135620 1.541600 1.681299 2.243913 2.510869 -0.849115 1.190235 1.449935 1.541388 2.302579 2.655596 -0.832569 1.273363 1.592481 1.792808 2.284175 2.498482 -0.835449 1.168916 1.544629 1.718930 2.423889 2.632619 -0.826578 1.276188 1.407857 1.660287 2.378044 2.474526 -0.873632 1.360315 1.502868 1.758332 2.570802 2.712262 -0.828320 1.284633 1.462407 1.624198 2.575860 2.705612 -0.866930 1.133312 1.254056 1.429890 2.499289 2.562307 -0.807119 1.218080 1.346012 1.540621 2.487606 2.633103 -0.983680 1.146576 1.336648 1.479310 2.327156 2.614361 -0.991742 1.170728 1.296168 1.485606 2.543050 2.663819 -0.857243 1.172195 1.298593 1.623901 2.581253 2.675646 -1.024459 1.245164 1.335833 1.923956 2.623488 2.689817 -1.035260 1.293064 1.419811 1.882694 2.474976 2.673673 -0.981160 1.239841 1.334553 1.628448 2.544049 2.681735 -0.948338 1.227389 1.360095 1.572061 2.447980 2.668611 -1.097120 1.256099 1.362188 1.632542 2.507787 2.656424 -1.060738 1.283998 1.527933 1.676274 2.540944 2.638141 -0.999111 1.230695 1.531258 1.643979 2.373065 2.634336 -0.900037 1.357157 1.519901 1.691155 2.333453 2.605899 -0.906535 1.200477 1.615255 1.715962 2.288870 2.609565 -0.841267 1.337701 1.721187 1.799125 2.176356 2.627236 -0.950819 1.507117 1.718816 1.826725 2.050526 2.489892 -0.922437 1.447590 1.832061 1.920513 2.148990 2.509573 -0.797637 1.120473 1.756266 1.946112 2.209112 2.535941 -0.821846 1.168739 1.837911 1.977726 2.361612 2.642410 -0.802821 1.394640 1.945588 2.031517 2.337491 2.589953 -0.808599 1.214285 1.878529 2.002325 2.280219 2.577779 -0.825133 1.329296 1.896620 1.979559 2.455746 2.573104 -0.847939 1.235948 1.897295 2.016610 2.422214 2.651151 -0.793266 1.311794 1.885265 1.974869 2.493916 2.699921 -0.835729 1.418115 1.839725 1.903232 2.507962 2.645131 -0.849380 1.476197 1.836815 1.977378 2.321338 2.561101 -0.774570 1.284607 1.758190 1.864424 2.367732 2.561205 -0.896154 1.466437 1.770222 1.871354 2.586553 2.688477 -1.097803 1.576496 1.742325 1.910224 2.160666 2.658455 -0.950720 1.452865 1.760158 1.934774 2.196277 2.624191 -0.947778 1.334777 1.745609 1.830510 2.256113 2.667856 -0.970291 1.214911 1.745935 1.840709 2.268780 2.555177 -1.027483 1.193053 1.655411 1.770558 2.115990 2.502962 -1.108625 1.224039 1.556423 1.705900 2.019067 2.463824 -1.137334 1.248642 1.659896 1.835999 2.087298 2.494018 -1.192784 1.290313 1.652861 1.878632 2.086082 2.615960 -1.231829 1.343294 1.528206 1.646125 1.912160 2.354407 -1.043149 1.380698 1.679143 1.830121 2.008367 2.414010 -1.102887 1.243057 1.747479 1.861385 2.203092 2.504381 -1.049734 1.354368 1.735882 1.819000 2.248805 2.557794 -1.105977 1.571421 1.764806 1.953547 2.428854 2.560105 -1.290846 1.550164 1.837562 2.126596 2.488831 2.600779 -1.194236 1.426699 1.837665 1.914014 2.443207 2.635517 -1.165504 1.260088 1.790938 1.893312 2.400453 2.646643 -1.224955 1.308139 1.825926 1.919493 2.321356 2.695079 -1.248486 1.345382 1.775451 1.876708 2.353719 2.654140 -1.271138 1.399667 1.811535 1.897580 2.403493 2.653922 -1.309100 1.407658 1.806843 1.897827 2.339222 2.632347 -1.291018 1.383330 1.802439 1.887187 2.247718 2.662452 -1.261355 1.370512 1.755969 1.871246 2.101895 2.593588 -1.282645 1.376536 1.775534 1.904499 2.192341 2.507429 -1.361360 1.450864 1.791066 1.906164 2.221501 2.543343 -1.334993 1.431384 1.716268 1.905493 2.089197 2.378260 -1.385673 1.470423 1.765397 1.909217 2.173842 2.456572 -1.364318 1.455064 1.754884 1.871473 2.365039 2.572279 -1.387777 1.486887 1.712089 1.847504 2.243563 2.570692 -1.312448 1.425290 1.622893 1.756780 1.978470 2.367512 -1.347202 1.454345 1.683431 1.825472 2.087917 2.462563 -1.326447 1.405443 1.727641 1.835551 2.328868 2.614333 -1.333108 1.429712 1.796075 1.900347 2.445062 2.652912 -1.322803 1.421588 1.736939 1.843495 2.532120 2.646639 -1.344685 1.431856 1.766206 1.924579 2.550076 2.689857 -1.388277 1.485813 1.711960 1.826211 2.496137 2.658495 -1.411133 1.495610 1.776872 1.876674 2.492586 2.651345 -1.417795 1.491577 1.801693 1.890405 2.442446 2.706992 -1.406122 1.515595 1.757336 1.896968 2.382045 2.633633 -1.425860 1.514813 1.773260 1.901744 2.447546 2.634715 -1.476029 1.555032 1.745731 1.861617 2.398766 2.614978 -1.459852 1.561528 1.786445 1.911235 2.476542 2.591787 -1.403056 1.514189 1.720761 1.900939 2.489890 2.577333 -1.428127 1.523512 1.689756 1.835214 2.458899 2.565972 -1.328956 1.434709 1.604068 1.734252 2.466296 2.566835 -1.241317 1.343249 1.457997 1.696624 2.527818 2.645659 -1.136623 1.311125 1.429957 1.695364 2.542525 2.660410 -1.153111 1.344144 1.690808 1.985929 2.420013 2.553782 -1.231755 1.373918 1.668818 2.117444 2.401907 2.488883 -0.978581 1.115592 1.517126 2.000531 2.449025 2.526020 -0.951081 1.107962 1.208612 1.737223 2.474298 2.611849 -0.981806 1.127841 1.220590 1.720985 2.586528 2.698889 -0.977554 1.224067 1.337758 1.713271 2.593374 2.675408 -0.986078 1.260397 1.407440 1.571486 2.569420 2.631754 -1.068774 1.209396 1.464430 1.557978 2.551351 2.669751 -1.034191 1.174307 1.467256 1.555295 2.460490 2.642259 -1.056632 1.178692 1.509897 1.621544 2.153033 2.540535 -1.108939 1.240242 1.651384 1.778538 2.227605 2.571951 -1.040854 1.397785 1.709633 1.830019 2.398698 2.618954 -1.063080 1.564032 1.695538 1.794688 2.419017 2.577353 -1.156653 1.579890 1.742991 1.888966 2.419007 2.626873 -1.282148 1.604674 1.769820 1.984806 2.290529 2.408545 -1.414961 1.752587 1.937904 2.076787 2.287689 2.502281 -1.561586 1.882695 2.087185 2.199871 2.398595 2.509058 -1.741771 1.963051 2.161078 2.262211 2.516056 2.626131 -1.579553 1.916299 2.201667 2.301679 2.458486 2.648337 -1.656200 1.849299 2.101697 2.302170 2.487760 2.573832 -1.761707 1.935887 2.167102 2.423095 2.531309 2.619774 -1.747342 1.946460 2.129719 2.452120 2.591709 2.681100 -1.664774 1.950714 2.064839 2.452925 2.653282 2.719977 -1.182120 1.806988 2.031810 2.240448 2.589338 2.666952 -0.911793 1.444427 1.938199 2.009542 2.518849 2.662424 -0.906235 1.353950 1.860144 1.948940 2.570343 2.653728 -0.915756 1.182444 1.779374 1.918355 2.495182 2.685238 -0.923262 1.168083 1.705447 2.007985 2.401242 2.584424 -0.915338 1.196101 1.641183 1.957797 2.235160 2.502509 -1.116935 1.269153 1.597465 1.950801 2.129101 2.392503 -1.227147 1.344231 1.809259 1.999158 2.320768 2.545770 -1.307876 1.517973 1.832338 2.042156 2.347761 2.543408 -1.142909 1.427477 1.831520 2.022295 2.356478 2.589639 -1.020209 1.202712 1.780168 2.070788 2.565827 2.661648 -1.087846 1.265956 1.653284 2.093962 2.625661 2.709244 -1.146593 1.234170 1.666291 2.022252 2.605716 2.676253 -1.089057 1.311412 1.647149 1.833847 2.666682 2.722762 -1.188386 1.319963 1.725677 1.806948 2.571193 2.664171 -1.209565 1.358036 1.697429 1.794200 2.470455 2.640229 -1.246047 1.338292 1.695538 1.782003 2.565757 2.666941 -1.261251 1.384481 1.619675 1.779584 2.591799 2.712426 -1.337507 1.450232 1.646992 1.774207 2.578969 2.703367 -1.387688 1.478096 1.618920 1.747276 2.531990 2.665704 -1.301779 1.392643 1.541867 1.665649 2.484537 2.655063 -1.257012 1.398833 1.527358 1.734139 2.619531 2.689676 -1.211161 1.324264 1.664338 1.911508 2.589343 2.685254 -1.113028 1.325407 1.697702 1.940185 2.591124 2.679629 -1.000343 1.352231 1.719494 2.024790 2.577661 2.639096 -0.952537 1.564659 1.914580 2.021105 2.481262 2.553572 -0.941380 1.573371 1.898482 1.990822 2.388399 2.527824 -0.835656 1.426857 1.914902 2.006303 2.455843 2.544426 -0.762518 1.617975 1.848163 1.952719 2.511683 2.576889 -0.760103 1.720246 1.884039 1.972497 2.526184 2.668968 -0.788105 1.515939 1.760885 1.953721 2.498661 2.553903 -0.842390 1.235086 1.687435 2.011114 2.391471 2.529546 -0.970555 1.304880 1.689915 2.060096 2.386014 2.524270 -1.078507 1.220815 1.630394 2.103928 2.411414 2.518300 -1.035130 1.374294 1.739516 2.015391 2.383541 2.542893 -1.232775 1.466122 1.942876 2.112602 2.359872 2.476841 -1.032139 1.460157 1.843607 2.111319 2.405612 2.545609 -0.863004 1.575367 1.754339 2.026425 2.484055 2.545871 -0.781880 1.621135 1.876114 2.131620 2.591150 2.665213 -0.689257 1.567671 1.951319 2.246727 2.507788 2.649956 -0.762920 1.454508 2.052137 2.239950 2.408909 2.570384 -0.735313 1.369541 2.141121 2.226737 2.404256 2.515847 -0.692794 1.213217 2.021728 2.170012 2.409789 2.632609 -0.749191 1.327407 1.876305 2.159813 2.396372 2.543556 -0.723514 1.311926 1.779121 2.000990 2.333064 2.521625 -0.800844 1.399334 1.702525 1.886771 2.183805 2.391837 -0.935365 1.532399 1.746103 1.843273 2.027876 2.366925 -0.879717 1.390978 1.696694 1.873227 2.273388 2.532951 -1.115628 1.395380 1.552486 2.062541 2.379745 2.485662 -1.253460 1.379822 1.726521 2.164899 2.386851 2.507812 -1.288652 1.548609 1.769224 2.106137 2.428838 2.517503 -1.369653 1.611147 1.793668 1.970474 2.367649 2.558036 -1.399028 1.694930 1.865624 2.036762 2.409162 2.586430 -1.433335 1.745725 1.930732 2.159385 2.426554 2.579037 -1.267585 1.665867 1.971379 2.103318 2.444523 2.567741 -1.226120 1.497218 1.888612 2.083592 2.547854 2.623475 -1.217864 1.502320 1.850155 1.973913 2.506017 2.625566 -1.213794 1.595369 1.875039 1.979415 2.427150 2.606463 -1.239752 1.513874 1.766680 1.947926 2.281624 2.492074 -1.247634 1.585626 1.729740 1.894696 2.381964 2.522121 -1.201153 1.474465 1.746568 1.834238 2.289729 2.525183 -1.181465 1.555321 1.703604 1.823083 2.315827 2.443888 -1.196327 1.573762 1.735225 1.808031 2.403501 2.557243 -1.149081 1.631606 1.769163 1.925569 2.368122 2.542814 -1.071093 1.633545 1.761338 1.872468 2.408464 2.573521 -1.065230 1.551738 1.713412 1.880487 2.387426 2.512159 -0.987564 1.635727 1.785940 1.956709 2.413400 2.548618 -0.931677 1.526457 1.773013 1.896960 2.437956 2.513898 -0.900322 1.645882 1.787979 2.041039 2.334273 2.434592 -0.867303 1.714715 1.901607 2.099190 2.387096 2.475894 -0.868278 1.693735 1.917301 2.013076 2.274597 2.382531 -0.848816 1.567192 1.829012 1.929834 2.339398 2.425619 -0.789452 1.369290 1.826862 1.917268 2.414283 2.502071 -0.737031 1.173300 1.873028 1.972833 2.455130 2.541243 -0.759015 1.250729 1.781114 1.994631 2.420436 2.554945 -0.749485 1.363939 1.896372 1.993571 2.442257 2.509848 -0.749379 1.214662 1.940660 2.034076 2.450716 2.568302 -0.801242 1.269156 1.870897 1.955986 2.405162 2.473861 -0.823290 1.258951 1.879861 2.069704 2.411773 2.510105 -0.836531 1.273927 1.957305 2.047469 2.490158 2.582295 -0.834116 1.183883 1.886457 1.969193 2.499483 2.604335 -0.876413 1.171153 1.946619 2.030903 2.431350 2.553010 -0.839364 1.056108 1.853641 2.100590 2.392613 2.554339 -0.864173 1.164684 1.835487 1.968845 2.376306 2.516103 -0.932804 1.294569 1.830951 1.901036 2.445265 2.552572 -0.963048 1.356861 1.768829 1.893219 2.479918 2.614673 -1.037066 1.359723 1.820807 1.891047 2.519312 2.605020 -1.060607 1.462340 1.797954 1.939293 2.521868 2.591879 -1.079923 1.504167 1.802208 1.930535 2.465137 2.543195 -1.140112 1.339064 1.813350 1.905307 2.370068 2.530420 -1.151868 1.356167 1.772359 1.883710 2.370014 2.610806 -1.288085 1.638629 1.751055 2.279923 2.555394 2.623279 -1.451442 1.739489 1.916401 2.388700 2.636146 2.702827 -1.591253 1.851544 2.218282 2.385490 2.593754 2.679427 -1.592264 2.016137 2.233799 2.333758 2.544823 2.665169 -1.654199 1.941575 2.250965 2.372366 2.458905 2.599827 -1.703247 2.025498 2.229596 2.337095 2.468575 2.617655 -1.638815 2.005565 2.201946 2.268461 2.499537 2.618409 -1.924675 2.135325 2.458180 2.504168 2.593838 2.625401 -1.803809 2.062572 2.199354 2.289456 2.550039 2.643916 -1.773011 1.976616 2.107571 2.220874 2.444977 2.543841 -1.764952 2.001727 2.214453 2.254705 2.475610 2.579746 -1.678332 1.863913 2.244638 2.343674 2.471126 2.636086 -1.755810 1.860246 2.223719 2.353060 2.498302 2.586676 -1.693433 1.869241 2.283303 2.395805 2.519741 2.583673 -1.704396 1.791207 2.147185 2.336447 2.479029 2.590894 -1.683258 1.862251 2.163335 2.351843 2.520908 2.616034 -1.623219 1.804206 2.222072 2.360296 2.619900 2.699507 -1.657240 1.825612 2.258489 2.347345 2.545732 2.694714 -1.660069 1.860341 2.253569 2.364116 2.564093 2.630731 -1.596899 1.839512 2.218930 2.385793 2.546468 2.625886 -1.622317 1.851201 1.996215 2.377397 2.522071 2.595493 -1.029466 1.254529 1.748991 2.053525 2.445882 2.576112 -0.856689 0.993818 1.569607 2.213756 2.461855 2.547082 -1.016581 1.191900 1.293465 1.778141 2.455802 2.551646 -1.010542 1.228148 1.311431 1.820284 2.531515 2.656752 -0.908278 1.189582 1.285536 1.858600 2.525918 2.619924 -0.871987 1.171922 1.317490 1.826516 2.400744 2.518087 -1.033124 1.188852 1.439697 2.039008 2.572425 2.656103 -0.970197 1.295635 1.402442 2.035038 2.488178 2.549888 -1.088196 1.220650 1.553062 2.133376 2.535702 2.595055 -1.009947 1.389803 1.517057 2.115221 2.474188 2.550693 -0.993372 1.427374 1.539173 1.972396 2.525839 2.583860 -1.048290 1.482084 1.637176 2.161075 2.523169 2.614712 -1.024326 1.562855 1.692237 2.295162 2.594836 2.648573 -0.907692 1.612559 1.746134 2.162536 2.575745 2.616258 -0.890482 1.611128 1.773927 1.970733 2.577746 2.659601 -0.808392 1.597802 1.785959 2.006399 2.565042 2.638957 -0.766474 1.584421 1.835838 1.929741 2.581539 2.641074 -0.769957 1.626769 1.869258 2.029447 2.602778 2.660482 -0.798945 1.531859 1.834894 1.946531 2.628257 2.692621 -0.720628 1.380228 1.817598 1.895348 2.547755 2.607196 -0.717991 1.301269 1.753273 1.880568 2.501113 2.570677 -0.757538 1.197506 1.719315 1.863401 2.467197 2.580754 -0.753702 1.292466 1.691851 1.775796 2.472592 2.583782 -0.814552 1.234200 1.583851 1.688282 2.546255 2.601382 -0.892573 1.259415 1.548665 1.628711 2.465185 2.557477 -0.949846 1.260567 1.429248 1.620283 2.396748 2.457397 -1.035299 1.244100 1.498240 1.643920 2.381366 2.524331 -1.108074 1.337571 1.538192 1.800588 2.513582 2.617693 -1.182535 1.370472 1.561886 1.844157 2.545726 2.614455 -1.215270 1.374402 1.595386 1.940797 2.512277 2.594163 -1.232828 1.356701 1.648355 2.040665 2.518326 2.606889 -1.295532 1.441002 1.626009 2.063594 2.535454 2.607196 -1.317455 1.484169 1.666626 2.107203 2.509460 2.569563 -1.288135 1.404836 1.708442 2.142397 2.478263 2.558149 -1.301178 1.490634 1.688663 2.209739 2.516570 2.582597 -1.388908 1.488602 1.753074 2.249110 2.468447 2.532735 -1.432358 1.501949 1.756043 2.227378 2.540315 2.633816 -1.270629 1.444250 1.697177 2.167736 2.574168 2.667078 -1.377953 1.511825 1.619242 2.070588 2.580573 2.655449 -1.319093 1.437635 1.575159 1.826257 2.568503 2.646941 -1.273340 1.439378 1.614682 1.977816 2.589179 2.642268 -1.364811 1.491437 1.654641 1.914895 2.277580 2.491707 -1.381399 1.482330 1.625703 1.767453 2.292816 2.535410 -1.316122 1.410804 1.574518 1.696495 2.241547 2.544142 -1.249213 1.448411 1.651606 1.812013 2.166941 2.528826 -1.329985 1.430104 1.637785 1.753696 2.144268 2.491734 -1.212008 1.460184 1.663715 1.723968 2.452735 2.654868 -1.154672 1.427992 1.639839 1.703824 2.524782 2.647191 -1.132193 1.276380 1.638189 1.750734 2.360136 2.630237 -1.106796 1.292196 1.563991 1.737151 2.276384 2.673484 -1.009469 1.409199 1.605253 1.755880 2.549809 2.666897 -0.849242 1.424760 1.607336 1.770467 2.593061 2.697570 -0.884126 1.418674 1.690537 1.910365 2.648893 2.753562 -0.835786 1.505326 1.650834 1.839830 2.667508 2.731820 -0.830887 1.418426 1.698221 1.812786 2.546614 2.605179 -0.770144 1.456185 1.735350 1.839787 2.485317 2.539411 -0.741204 1.461201 1.720258 2.039661 2.613149 2.656617 -0.746126 1.436058 1.674916 1.868865 2.616457 2.659599 -0.785082 1.343492 1.675451 1.756554 2.550054 2.611912 -0.745773 1.354824 1.630019 1.938987 2.453600 2.549079 -0.845780 1.469252 1.629079 1.974969 2.499282 2.549783 -0.949421 1.462768 1.572994 2.286043 2.549581 2.602929 -1.025145 1.385363 1.648388 2.192934 2.440628 2.531024 -1.033724 1.436166 1.744094 2.132259 2.544044 2.618903 -1.082839 1.455838 1.597987 2.003093 2.628262 2.736133 -1.021616 1.380799 1.537805 2.007919 2.656179 2.725478 -0.934605 1.338311 1.721281 2.021380 2.452658 2.635942 -0.974987 1.280603 1.740482 1.988643 2.383388 2.588543 -0.963572 1.358626 1.775093 2.077077 2.374408 2.552547 -1.339392 1.606067 1.941038 2.159799 2.446540 2.587306 -1.268637 1.604063 1.940062 2.178915 2.487660 2.597501 -1.129807 1.522621 1.872974 2.075068 2.479707 2.633172 -1.135346 1.422302 1.865991 1.945310 2.523357 2.686142 -1.135540 1.562266 1.768152 1.922013 2.506054 2.736130 -1.173335 1.637622 1.845405 1.974533 2.379511 2.627590 -1.223094 1.477161 1.799506 1.945290 2.603703 2.697773 -1.285652 1.781420 1.972532 2.335252 2.649620 2.719252 -1.516066 1.862470 2.084987 2.386138 2.563370 2.650523 -1.622511 1.800884 2.074682 2.371099 2.494100 2.608952 -1.644218 1.730914 2.235251 2.344625 2.460604 2.621775 -1.646495 1.743836 2.118671 2.334538 2.487649 2.597304 -1.574474 1.666941 2.165682 2.294626 2.463016 2.642929 -1.568529 1.662679 2.068377 2.240071 2.374784 2.534291 -1.501088 1.675567 2.019200 2.253935 2.403957 2.560212 -1.333222 1.481857 1.810385 2.032438 2.235271 2.464023 -1.184189 1.376469 1.743067 2.077177 2.247370 2.436639 -0.860298 1.017970 1.399466 2.031356 2.445832 2.512045 -0.987543 1.187216 1.324668 2.086564 2.440265 2.507859 -0.987539 1.057392 1.400508 2.291033 2.462013 2.534542 -1.072567 1.168456 1.335425 2.281555 2.595283 2.641991 -1.042424 1.219473 1.328751 2.104394 2.481407 2.544847 -1.075840 1.204873 1.370286 2.206558 2.509524 2.557197 -1.075906 1.188083 1.414337 2.320102 2.530914 2.589422 -1.076149 1.267397 1.411982 2.218421 2.452294 2.540946 -1.154549 1.314810 1.500389 2.300970 2.505189 2.569795 -1.170382 1.300375 1.477782 2.201078 2.418226 2.511009 -1.164826 1.290783 1.436432 2.042173 2.434597 2.517154 -1.193857 1.293191 1.527594 2.008805 2.370813 2.473257 -1.263542 1.385669 1.596130 2.048764 2.427787 2.504082 -1.305187 1.421012 1.658876 2.095853 2.429425 2.518576 -1.378304 1.494361 1.710276 2.078040 2.477964 2.559482 -1.333727 1.475263 1.674044 2.039635 2.446712 2.527050 -1.346152 1.468526 1.673673 1.961087 2.462599 2.567158 -1.324261 1.466904 1.747093 2.009440 2.480558 2.571278 -1.306921 1.411049 1.740784 2.032398 2.466338 2.575794 -1.277304 1.408311 1.715677 1.956928 2.505971 2.597300 -1.239174 1.409858 1.635688 1.843138 2.511337 2.592493 -1.262271 1.377900 1.665878 1.785276 2.414923 2.519101 -1.223772 1.378608 1.706935 1.812010 2.472106 2.553503 -1.248275 1.560969 1.688454 2.024421 2.464682 2.532083 -1.551147 1.674831 1.863917 2.242605 2.425666 2.512306 -1.613538 1.736360 1.915832 2.284340 2.505100 2.575495 -1.675654 1.764549 2.013262 2.308596 2.479308 2.570877 -1.676790 1.732192 2.216913 2.350744 2.516807 2.584938 -1.672091 1.768085 2.170300 2.277530 2.411164 2.492525 -1.645851 1.881233 2.216349 2.320633 2.460809 2.564931 -1.714095 1.933206 2.220117 2.327698 2.453033 2.557432 -1.864162 1.965600 2.211890 2.354075 2.451546 2.543697 -1.840509 1.980901 2.141357 2.275924 2.487833 2.607026 -1.281628 1.508538 1.878088 2.153311 2.510390 2.597723 -1.285937 1.558518 1.895925 2.154502 2.510047 2.628884 -1.179704 1.457966 1.805824 2.088695 2.536834 2.648347 -1.213178 1.474144 1.796481 1.886388 2.426441 2.597142 -1.175759 1.566628 1.786803 1.959634 2.443976 2.621808 -1.241280 1.495544 1.772941 1.959431 2.513639 2.611886 -1.252864 1.547349 1.741300 1.873671 2.447277 2.674639 -1.234254 1.437033 1.742154 1.835750 2.372173 2.581494 -1.262397 1.351279 1.710277 1.833486 2.308910 2.583598 -1.330861 1.424104 1.673893 1.802977 2.271847 2.556762 -1.374920 1.473192 1.703358 1.804519 2.374494 2.625833 -1.350424 1.477644 1.741927 1.869579 2.468162 2.637851 -1.299448 1.409270 1.707326 1.828822 2.412618 2.660075 -1.283675 1.413183 1.694008 1.913840 2.235005 2.663358 -1.131349 1.545449 1.738197 1.927132 2.242548 2.529539 -1.310395 1.445321 1.800815 1.941760 2.224181 2.430698 -1.207823 1.407710 1.792289 1.897833 2.278582 2.588793 -1.172078 1.380374 1.769606 1.870709 2.420713 2.665411 -1.050374 1.292916 1.708676 1.815571 2.398301 2.647835 -1.012196 1.352840 1.710467 1.798435 2.501052 2.622110 -0.949688 1.511315 1.802233 2.051775 2.386590 2.543931 -1.239527 1.523312 1.992644 2.175922 2.535838 2.663321 -1.170409 1.423959 1.918088 2.072957 2.371327 2.600694 -1.153282 1.631638 1.943662 2.041389 2.426287 2.527936 -1.130992 1.687340 1.913097 1.982416 2.366644 2.592156 -0.876015 1.539120 1.952815 2.040387 2.354192 2.592474 -0.741027 1.330783 2.010264 2.088976 2.406380 2.512408 -0.692068 1.220984 1.966843 2.053168 2.527609 2.625367 -0.697907 1.406778 2.016010 2.085819 2.573177 2.652342 -0.747161 1.542479 1.982188 2.091091 2.573313 2.614600 -0.759939 1.518111 1.938220 2.162963 2.534355 2.639085 -0.752015 1.445930 2.097743 2.150626 2.479886 2.587138 -0.804190 1.428522 2.012448 2.195806 2.470749 2.577263 -0.757784 1.356544 1.878177 2.232246 2.530996 2.630296 -0.782189 1.251703 1.766911 2.206553 2.564453 2.617695 -0.692136 1.308291 1.593024 1.842927 2.504334 2.652647 -0.779817 1.264995 1.689687 1.803686 2.530498 2.669456 -0.774734 1.199620 1.649586 1.726576 2.437097 2.591528 -0.885025 1.311938 1.646470 1.739192 2.578721 2.671994 -0.949387 1.387109 1.641927 1.762570 2.528769 2.585787 -1.012043 1.455355 1.666729 1.752575 2.434270 2.553516 -1.104075 1.529375 1.682092 1.973044 2.345511 2.511577 -1.423997 1.619409 1.995513 2.298913 2.430779 2.521288 -1.582461 1.832072 2.275101 2.383131 2.482800 2.539316 -1.706366 2.001667 2.300029 2.394812 2.486966 2.586945 -1.532256 1.933761 2.284009 2.422313 2.622936 2.706043 -1.678938 1.889060 2.338973 2.512967 2.632369 2.679498 -1.634405 1.783714 2.124182 2.462997 2.610348 2.691361 -1.618353 1.751021 2.026128 2.418017 2.609402 2.678953 -1.565199 1.794303 1.902067 2.405664 2.629332 2.696870 -1.282138 1.591250 1.852032 2.314230 2.617777 2.722940 -1.220365 1.421679 1.694336 1.881742 2.556796 2.653179 -1.139402 1.299007 1.622371 1.770432 2.543866 2.640704 -1.214491 1.467423 1.628034 1.794008 2.563409 2.691705 -1.059626 1.521805 1.631948 1.865161 2.601036 2.683659 -1.180200 1.536587 1.671861 2.137961 2.587647 2.638393 -1.213651 1.582110 1.709505 2.157513 2.476799 2.574007 -1.248459 1.553050 1.645298 1.897537 2.577761 2.681279 -1.340584 1.601427 1.679985 1.889143 2.647088 2.755132 -1.194554 1.575563 1.697528 1.801365 2.596516 2.752368 -1.152988 1.531378 1.716414 1.812718 2.417149 2.696455 -1.175284 1.565269 1.657415 1.734779 2.517977 2.671209 -1.315878 1.515976 1.775170 2.058078 2.307304 2.449295 -1.247131 1.381271 1.568357 1.857012 2.157278 2.435014 -1.240254 1.383648 1.580575 1.991473 2.303569 2.411055 -1.286797 1.385847 1.730704 2.067540 2.326906 2.473042 -1.204107 1.337886 1.665492 2.038754 2.231416 2.543395 -1.182343 1.312111 1.522260 1.971028 2.237772 2.483629 -1.095429 1.319910 1.465710 2.032595 2.279936 2.523638 -1.152497 1.294508 1.458307 2.032534 2.306031 2.406760 -0.991441 1.274662 1.428222 1.940576 2.399100 2.509374 -0.850157 1.274723 1.453729 1.893527 2.382294 2.477664 -0.936060 1.313211 1.426739 1.888973 2.551745 2.604392 -0.972592 1.328333 1.432833 2.011050 2.573671 2.613672 -0.909400 1.422756 1.494628 2.073945 2.620634 2.662685 -0.828475 1.431701 1.569493 2.054254 2.622115 2.669741 -0.779249 1.375673 1.476635 1.949187 2.558998 2.622137 -0.815710 1.472687 1.650494 2.000905 2.565206 2.611683 -0.822357 1.333508 1.551653 1.864184 2.595847 2.706122 -0.736497 1.259887 1.490815 1.882220 2.494405 2.619982 -0.902240 1.431002 1.520505 1.910794 2.605395 2.678585 -0.900488 1.363048 1.461814 2.009771 2.665876 2.717180 -1.015394 1.361530 1.474854 1.920438 2.637482 2.702570 -0.950918 1.335184 1.440876 1.874351 2.678915 2.746244 -0.965674 1.306906 1.412895 1.727184 2.656317 2.739472 -1.121335 1.291332 1.412980 1.731394 2.624577 2.735999 -1.135486 1.299970 1.448634 1.635793 2.616713 2.687744 -1.120410 1.248201 1.383680 1.579760 2.397167 2.585237 -1.113415 1.294499 1.482373 1.602789 2.394835 2.634809 -1.241746 1.318174 1.473167 1.577503 2.426003 2.649775 -1.184376 1.272893 1.497747 1.608053 2.144455 2.537267 -1.283135 1.377322 1.543041 1.645177 2.105790 2.490904 -1.138008 1.380756 1.560480 1.640979 2.271006 2.625523 -1.243884 1.351538 1.603070 1.739791 2.038080 2.447512 -1.267258 1.509957 1.641649 1.831984 2.331327 2.472826 -1.276365 1.476401 1.625021 1.930342 2.319377 2.524369 -1.222679 1.559407 1.669982 1.805473 2.326911 2.580278 -1.265218 1.503892 1.830979 2.091536 2.396722 2.569088 -1.256047 1.528877 1.853033 2.106171 2.365139 2.503280 -1.236501 1.479118 1.728297 2.041463 2.528558 2.612900 -1.220644 1.605193 1.713770 1.950925 2.597639 2.649495 -1.255546 1.591871 1.706750 2.062713 2.561381 2.626901 -1.307080 1.580016 1.653547 1.941293 2.552727 2.643706 -1.310968 1.512803 1.656527 1.839190 2.592097 2.677706 -1.188596 1.316082 1.579370 1.690772 2.438500 2.641881 -1.114671 1.235994 1.591973 1.749192 2.359438 2.545213 -1.080067 1.277132 1.727997 2.041411 2.337068 2.549786 -1.032222 1.250210 1.680999 1.998340 2.318533 2.502200 -1.064719 1.159182 1.666731 2.019294 2.256570 2.573467 -1.026313 1.146367 1.672929 2.054063 2.433228 2.615716 -0.942929 1.092789 1.613522 2.077784 2.365142 2.499737 -0.980250 1.254777 1.492003 1.801193 2.445325 2.575711 -0.957395 1.251868 1.378337 1.744574 2.502966 2.665866 -0.840336 1.267995 1.397728 1.827984 2.555867 2.651285 -1.009902 1.175808 1.277770 2.048361 2.637904 2.700904 -0.883840 1.026780 1.146692 1.893681 2.518692 2.610564 -0.997171 1.138289 1.246408 1.837527 2.549820 2.642693 -0.992125 1.178874 1.282272 1.974399 2.559112 2.612968 -1.067589 1.255803 1.359021 1.963939 2.541420 2.596308 -1.086327 1.329068 1.432326 1.928840 2.528332 2.598239 -1.100351 1.345579 1.469529 1.942358 2.469723 2.561680 -1.101019 1.374382 1.561144 1.942560 2.484288 2.552996 -1.177497 1.455165 1.571485 1.943496 2.500309 2.550902 -1.260768 1.477903 1.601611 2.024022 2.487425 2.554237 -1.216439 1.470082 1.639601 1.957212 2.523832 2.588189 -1.257980 1.407199 1.651434 1.910722 2.464200 2.620868 -1.162091 1.436543 1.682166 1.896924 2.447302 2.677069 -1.250215 1.484632 1.653870 1.930473 2.493894 2.633436 -1.237977 1.513389 1.648781 1.880344 2.504094 2.581491 -1.223199 1.412456 1.634083 1.797183 2.451210 2.620618 -1.258745 1.358397 1.627717 1.726099 2.428287 2.621329 -1.234919 1.345606 1.552151 1.708675 2.385742 2.606052 -1.186417 1.341808 1.636911 1.754679 2.429716 2.544394 -1.216260 1.305888 1.632777 1.755770 2.320806 2.583785 -1.165343 1.284152 1.560527 1.682036 2.243217 2.494673 -1.085859 1.215111 1.590602 1.715333 2.231633 2.527227 -1.091652 1.384156 1.655159 1.716563 2.302785 2.535552 -1.060328 1.239077 1.627213 1.737571 2.420162 2.599147 -1.090079 1.394777 1.682485 1.799904 2.331813 2.532862 -1.169038 1.568116 1.785725 2.031553 2.372207 2.497865 -1.241903 1.662080 1.822491 2.169543 2.424542 2.525186 -1.040287 1.690414 1.853098 2.038593 2.472015 2.535969 -0.974879 1.689063 1.850137 2.151312 2.507415 2.562538 -0.879683 1.743838 1.968060 2.161147 2.463916 2.545849 -0.790116 1.794412 2.037297 2.159739 2.508403 2.564883 -0.793374 1.796169 2.060524 2.331075 2.591299 2.648578 -0.859332 1.800464 2.025451 2.200641 2.534316 2.611320 -0.825206 1.895126 2.063579 2.264528 2.514030 2.610797 -0.974068 1.904781 2.002639 2.315848 2.539666 2.595157 -0.961311 1.821283 2.015215 2.274545 2.600786 2.653365 -0.971040 1.737011 1.914953 2.243896 2.572362 2.612602 -0.999552 1.817902 1.953097 2.178591 2.574331 2.626275 -0.977300 1.756036 1.929137 2.135346 2.424209 2.556085 -1.065543 1.747638 1.899169 2.309745 2.587388 2.630589 -1.077057 1.655717 1.868334 2.238603 2.508913 2.571841 -1.077829 1.716423 1.791462 2.266223 2.615485 2.654046 -1.276021 1.713383 1.788825 2.101442 2.625616 2.679590 -1.263173 1.699086 1.776931 2.035107 2.610346 2.653421 -1.297137 1.667668 1.744010 2.030119 2.608062 2.678066 -1.262373 1.626459 1.781159 2.026178 2.636261 2.699179 -1.318031 1.657767 1.763578 1.939043 2.575450 2.705613 -0.980669 1.555891 1.722977 1.978553 2.568958 2.638420 -0.840013 1.463397 1.772781 2.164864 2.566894 2.666228 -0.832158 1.505750 1.937891 2.233974 2.630131 2.694884 -0.745541 1.530097 2.060727 2.162996 2.619130 2.692130 -0.832050 1.597985 2.127678 2.196662 2.528870 2.619304 -0.820544 1.616482 2.044842 2.133557 2.587661 2.668155 -0.789348 1.638569 1.996032 2.212800 2.572934 2.615430 -0.806795 1.742530 2.043915 2.183841 2.603407 2.660269 -0.843597 1.761377 1.998823 2.132969 2.596500 2.673163 -0.927714 1.759399 1.987169 2.201990 2.591677 2.650810 -1.070504 1.767115 1.978295 2.227191 2.642696 2.686380 -1.022852 1.856828 1.989822 2.217218 2.480936 2.574687 -0.886409 1.742690 1.863071 2.054904 2.542328 2.627054 -0.996501 1.553639 1.808061 1.948514 2.516726 2.605745 -1.218221 1.525015 1.878023 2.107205 2.423952 2.578894 -1.274705 1.491779 1.906237 2.101242 2.455724 2.563566 -1.319477 1.587082 1.879825 2.240443 2.439462 2.547992 -1.474513 1.699004 1.929257 2.228217 2.451873 2.563132 -1.545274 1.722709 1.892103 2.169162 2.520241 2.602958 -1.546160 1.668894 1.961486 2.212079 2.505999 2.621266 -1.535625 1.699287 2.016356 2.250824 2.550093 2.645619 -1.583411 1.687746 2.051949 2.332633 2.491721 2.598036 -1.500933 1.594052 1.929231 2.259850 2.422622 2.547761 -1.464918 1.614783 1.881701 2.216729 2.528952 2.623217 -1.406726 1.605026 1.805977 2.222725 2.509009 2.587841 -1.106418 1.527781 1.730182 2.045916 2.549464 2.637497 -1.008151 1.439718 1.665472 1.941372 2.652442 2.751095 -0.971347 1.402084 1.708896 1.953274 2.613325 2.684989 -0.946352 1.501044 1.672151 1.975870 2.527905 2.585573 -0.909229 1.453576 1.713898 2.065638 2.529315 2.613161 -0.975079 1.523288 1.839559 2.138553 2.498690 2.583725 -0.899524 1.552407 1.831637 2.068567 2.544880 2.611180 -0.805175 1.462327 1.860536 2.101344 2.570440 2.654850 -0.859011 1.514531 1.892400 2.012520 2.579679 2.648521 -0.763528 1.522433 1.902539 2.018517 2.556446 2.609582 -0.814387 1.494849 1.941715 2.077981 2.540329 2.612839 -0.853805 1.401871 1.942985 2.088086 2.488394 2.578614 -0.782036 1.348553 1.935300 2.025076 2.516816 2.598046 -0.754386 1.384949 1.900243 1.999656 2.600374 2.663763 -0.746921 1.421143 1.934567 2.038908 2.553273 2.612298 -0.731911 1.450761 1.924508 2.032744 2.497904 2.556491 -0.706741 1.543731 1.876596 1.992525 2.510176 2.565960 -0.852548 1.549952 1.899169 2.226497 2.522787 2.583939 -0.885718 1.656999 1.865791 2.162889 2.467388 2.553769 -0.951271 1.641721 1.813995 2.153059 2.427099 2.499612 -0.928485 1.502784 1.809440 2.224767 2.472400 2.553921 -0.816616 1.391098 1.665580 2.176141 2.510722 2.582819 -0.915934 1.390936 1.767514 2.169548 2.471665 2.652526 -1.115341 1.362311 1.722592 2.033033 2.406363 2.601875 -1.138664 1.252976 1.684517 1.937366 2.384311 2.623900 -1.084318 1.211953 1.633639 1.889936 2.413095 2.626228 -1.126224 1.344921 1.648605 2.071123 2.484189 2.605656 -1.123905 1.461556 1.845099 2.172457 2.462662 2.605139 -1.132557 1.468636 1.740223 2.184934 2.467938 2.580103 -1.148248 1.506173 1.676602 2.049290 2.446774 2.565419 -0.999544 1.404698 1.641769 1.863324 2.523843 2.592114 -0.932167 1.395984 1.709428 1.845739 2.524792 2.599616 -0.870085 1.476327 1.721511 1.897091 2.490256 2.593759 -0.891107 1.429106 1.789728 1.958425 2.519104 2.604987 -0.855550 1.421268 1.900935 2.011013 2.546617 2.609760 -0.895038 1.482579 1.873572 1.974828 2.519429 2.584450 -0.809092 1.486499 1.902272 2.000876 2.518374 2.597261 -0.808211 1.460169 1.881579 1.961398 2.468386 2.616332 -0.774237 1.471857 1.901217 2.013761 2.564870 2.665691 -0.800018 1.576948 1.938176 2.043718 2.494383 2.630097 -0.804705 1.570759 1.889356 1.975489 2.447653 2.555191 -0.840709 1.603377 1.827077 2.026318 2.442892 2.492424 -0.887288 1.536144 1.781616 1.952198 2.500811 2.576512 -0.847527 1.504701 1.792948 1.891589 2.578888 2.637316 -0.959025 1.533821 1.821486 1.979739 2.463750 2.544302 -1.036319 1.640786 1.886024 1.962887 2.358662 2.577756 -0.981142 1.486738 1.733096 1.878277 2.537973 2.610473 -1.046486 1.438515 1.740840 1.850012 2.590883 2.684137 -1.103404 1.489782 1.738241 1.817496 2.588368 2.701052 -1.176925 1.473684 1.732853 1.823270 2.524527 2.733540 -1.173320 1.438383 1.696555 1.792536 2.580785 2.665770 -1.134955 1.421862 1.604070 1.756135 2.617948 2.706644 -1.136007 1.384178 1.699100 1.855319 2.591013 2.683215 -1.201710 1.421935 1.737864 2.011199 2.540959 2.681093 -1.227450 1.624461 2.125226 2.340556 2.593435 2.671453 -1.265133 1.765689 2.131338 2.391774 2.613959 2.699849 -1.342282 1.581411 1.979244 2.297759 2.520391 2.602258 -1.449013 1.725546 2.176279 2.354739 2.538758 2.627319 -1.418726 1.898681 2.206330 2.275600 2.488746 2.586794 -1.555706 1.837600 2.165743 2.346188 2.530178 2.628757 -1.444437 1.790050 1.911014 2.301915 2.468862 2.540557 -1.378052 1.668499 1.845265 2.324889 2.537708 2.601471 -1.394741 1.682710 1.817346 2.075533 2.512120 2.566889 -1.297199 1.655884 1.825405 2.062105 2.513307 2.577371 -1.280659 1.669901 1.824567 2.168209 2.528166 2.601986 -1.306896 1.600808 1.767971 2.095291 2.509869 2.606002 -1.257678 1.559755 1.787804 2.076895 2.540388 2.627179 -1.196849 1.597550 1.817421 2.152662 2.580796 2.651246 -1.235935 1.676643 1.942307 2.326482 2.561542 2.645593 -1.189058 1.818895 2.081496 2.366454 2.608018 2.672086 -1.427589 1.885421 2.264907 2.424220 2.571371 2.651155 -1.714473 1.937868 2.390009 2.457149 2.552016 2.601930 -1.874136 2.073506 2.370468 2.511263 2.709177 2.749495 -1.647818 1.987798 2.281909 2.412099 2.604693 2.674821 -1.596366 1.881529 2.193995 2.380524 2.511918 2.584564 -1.555508 1.775218 2.064094 2.325699 2.512934 2.599262 -1.330054 1.712961 1.917624 2.285900 2.466591 2.579279 -0.990071 1.410874 1.632331 1.965889 2.466882 2.580417 -0.925150 1.299025 1.551401 1.897486 2.498481 2.645212 -0.968080 1.367127 1.520360 1.988159 2.313473 2.546943 -0.974374 1.283811 1.474810 2.078302 2.331089 2.455153 -1.000624 1.299150 1.415675 1.955760 2.261550 2.354258 -0.964045 1.136490 1.305931 1.936406 2.197537 2.299418 -1.013087 1.201143 1.372664 1.820179 2.063576 2.210659 -1.086478 1.216705 1.476655 1.604039 1.855963 2.324503 -1.090160 1.201207 1.460778 1.562225 2.016093 2.458980 -1.133754 1.257469 1.407186 1.787681 2.289532 2.530854 -1.134831 1.341221 1.636293 1.813775 2.219453 2.584652 -0.952747 1.300930 1.616891 1.751014 2.352113 2.547879 -1.078704 1.490043 1.571579 1.800532 2.468175 2.650436 -1.239045 1.333032 1.551379 1.707824 2.242922 2.604251 -1.176517 1.299114 1.588881 1.714081 2.128856 2.533523 -1.135831 1.253056 1.538412 1.634480 2.258093 2.593874 -1.092382 1.253236 1.541772 1.679875 2.423197 2.617584 -1.142663 1.256402 1.528284 1.629676 2.391580 2.589689 -1.172793 1.281248 1.479204 1.608878 2.335938 2.593681 -1.146782 1.251953 1.432916 1.553285 2.238941 2.534180 -1.109946 1.231415 1.412105 1.516055 2.308569 2.599903 -1.120273 1.235535 1.425736 1.509519 2.435529 2.643814 -1.085869 1.189296 1.392718 1.494347 2.129342 2.508989 -1.020500 1.173144 1.440965 1.574421 2.335855 2.524051 -1.040551 1.174338 1.525717 1.693110 2.493748 2.632352 -1.034516 1.205262 1.365087 1.513000 2.471788 2.578008 -1.079383 1.204002 1.332428 1.456604 2.502131 2.665633 -1.088863 1.236949 1.357003 1.564945 2.602020 2.707576 -1.106792 1.262402 1.367273 1.823952 2.598579 2.676300 -1.085013 1.233527 1.311463 1.730333 2.560087 2.690320 -1.069205 1.180224 1.343020 1.474834 2.268046 2.544311 -1.039392 1.375617 1.721445 2.038018 2.463998 2.600812 -1.267853 1.384109 1.659902 1.934021 2.207761 2.424577 -1.225276 1.316621 1.678147 1.819230 2.165345 2.498548 -1.114141 1.283029 1.655518 1.879671 2.352472 2.553537 -1.094762 1.370017 1.799126 2.082377 2.469494 2.578819 -1.041250 1.472757 1.748735 2.047588 2.511699 2.589828 -1.071665 1.456546 1.700524 1.927317 2.441484 2.607003 -0.929006 1.487241 1.669550 1.885619 2.544274 2.628318 -0.844366 1.339712 1.812456 2.300208 2.566012 2.631255 -0.761441 1.279951 1.670446 2.006350 2.526824 2.607557 -0.716643 1.374843 1.843436 2.126958 2.552993 2.613146 -0.749967 1.598458 1.883266 2.050443 2.579184 2.614111 -0.759376 1.596383 1.929103 1.984550 2.566734 2.654207 -0.724977 1.682905 1.888292 2.034796 2.503861 2.565502 -0.812327 1.669865 1.961771 2.102146 2.538781 2.598559 -0.767334 1.594629 1.984319 2.133419 2.501689 2.557813 -0.760230 1.650647 1.928366 2.094047 2.565241 2.596082 -0.766762 1.648062 1.858552 2.078593 2.587079 2.608213 -0.860938 1.629253 1.824855 2.067350 2.563373 2.603209 -0.960953 1.583632 1.752206 2.078444 2.555531 2.628507 -1.007927 1.548004 1.734955 2.185660 2.489350 2.551445 -1.040401 1.471117 1.643519 2.051558 2.508524 2.579168 -1.096025 1.457427 1.604009 1.926200 2.482033 2.552204 -1.130428 1.431534 1.592806 2.014740 2.510652 2.567779 -1.197898 1.465481 1.622929 2.075950 2.507052 2.582750 -1.258831 1.504797 1.659109 1.970653 2.595750 2.685651 -1.315451 1.467446 1.705718 1.898634 2.602572 2.704978 -1.272475 1.431894 1.712848 1.940258 2.650379 2.717166 -1.278865 1.528652 1.796202 1.995202 2.501761 2.587606 -1.458616 1.693943 2.067903 2.264838 2.506857 2.623939 -1.718797 1.909611 2.147601 2.354174 2.485581 2.591269 -1.813873 1.875483 2.097637 2.329683 2.497798 2.596247 -1.744286 1.859449 2.043169 2.284589 2.430897 2.538572 -1.514180 1.808296 1.933791 2.234651 2.462232 2.546237 -1.489264 1.781194 1.908004 2.144484 2.418589 2.513858 -1.434785 1.679793 1.817348 2.105365 2.431372 2.528241 -1.469581 1.589507 1.813510 2.213129 2.440502 2.520511 -1.496287 1.640049 1.893865 2.298621 2.484705 2.576207 -1.333417 1.584728 1.893019 2.121814 2.525345 2.632617 -1.518722 1.735840 1.956529 2.176426 2.465338 2.572342 -1.520953 1.742556 2.010582 2.133578 2.447458 2.566704 -1.458119 1.692227 2.001920 2.120543 2.431042 2.565112 -1.526915 1.662389 2.025135 2.125056 2.537873 2.626810 -1.498303 1.644212 1.960732 2.103288 2.440309 2.572412 -1.415476 1.548286 1.770800 2.099931 2.450265 2.599463 -1.367188 1.460632 1.739482 2.074030 2.551953 2.639997 diff --git a/gr-vocoder/lib/codec2/codebook/lsp5.txt b/gr-vocoder/lib/codec2/codebook/lsp5.txt deleted file mode 100644 index 94739b56e4..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp5.txt +++ /dev/null @@ -1,19 +0,0 @@ -1 16 - 950 -1050 -1150 -1250 -1350 -1450 -1550 -1650 -1750 -1850 -1950 -2050 -2150 -2250 -2350 -2450 - - diff --git a/gr-vocoder/lib/codec2/codebook/lsp6.txt b/gr-vocoder/lib/codec2/codebook/lsp6.txt deleted file mode 100644 index 992ea25c54..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp6.txt +++ /dev/null @@ -1,19 +0,0 @@ -1 16 -1100 -1200 -1300 -1400 -1500 -1600 -1700 -1800 -1900 -2000 -2100 -2200 -2300 -2400 -2500 -2600 - - diff --git a/gr-vocoder/lib/codec2/codebook/lsp7.txt b/gr-vocoder/lib/codec2/codebook/lsp7.txt deleted file mode 100644 index 839cbfdd5b..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp7.txt +++ /dev/null @@ -1,19 +0,0 @@ -1 16 -1500 -1600 -1700 -1800 -1900 -2000 -2100 -2200 -2300 -2400 -2500 -2600 -2700 -2800 -2900 -3000 - - diff --git a/gr-vocoder/lib/codec2/codebook/lsp8.txt b/gr-vocoder/lib/codec2/codebook/lsp8.txt deleted file mode 100644 index d9880c94e3..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp8.txt +++ /dev/null @@ -1,11 +0,0 @@ -1 8 -2300 -2400 -2500 -2600 -2700 -2800 -2900 -3000 - - diff --git a/gr-vocoder/lib/codec2/codebook/lsp9.txt b/gr-vocoder/lib/codec2/codebook/lsp9.txt deleted file mode 100644 index 7e159af2f7..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lsp9.txt +++ /dev/null @@ -1,11 +0,0 @@ -1 8 -2500 -2600 -2700 -2800 -2900 -3000 -3100 -3200 - - diff --git a/gr-vocoder/lib/codec2/codebook/lspdt1.txt b/gr-vocoder/lib/codec2/codebook/lspdt1.txt deleted file mode 100644 index ba30880038..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt1.txt +++ /dev/null @@ -1,9 +0,0 @@ -1 8 --75 --50 --25 - 0 - 25 - 50 - 75 -100 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt10.txt b/gr-vocoder/lib/codec2/codebook/lspdt10.txt deleted file mode 100644 index e72c16c92d..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt10.txt +++ /dev/null @@ -1,3 +0,0 @@ -1 2 --50 - 50 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt2.txt b/gr-vocoder/lib/codec2/codebook/lspdt2.txt deleted file mode 100644 index ba30880038..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt2.txt +++ /dev/null @@ -1,9 +0,0 @@ -1 8 --75 --50 --25 - 0 - 25 - 50 - 75 -100 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt3.txt b/gr-vocoder/lib/codec2/codebook/lspdt3.txt deleted file mode 100644 index 7ebefd92d1..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt3.txt +++ /dev/null @@ -1,5 +0,0 @@ -1 4 --50 - 0 - 50 - 100 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt4.txt b/gr-vocoder/lib/codec2/codebook/lspdt4.txt deleted file mode 100644 index 7ebefd92d1..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt4.txt +++ /dev/null @@ -1,5 +0,0 @@ -1 4 --50 - 0 - 50 - 100 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt5.txt b/gr-vocoder/lib/codec2/codebook/lspdt5.txt deleted file mode 100644 index 7ebefd92d1..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt5.txt +++ /dev/null @@ -1,5 +0,0 @@ -1 4 --50 - 0 - 50 - 100 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt6.txt b/gr-vocoder/lib/codec2/codebook/lspdt6.txt deleted file mode 100644 index 7ebefd92d1..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt6.txt +++ /dev/null @@ -1,5 +0,0 @@ -1 4 --50 - 0 - 50 - 100 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt7.txt b/gr-vocoder/lib/codec2/codebook/lspdt7.txt deleted file mode 100644 index e72c16c92d..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt7.txt +++ /dev/null @@ -1,3 +0,0 @@ -1 2 --50 - 50 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt8.txt b/gr-vocoder/lib/codec2/codebook/lspdt8.txt deleted file mode 100644 index e72c16c92d..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt8.txt +++ /dev/null @@ -1,3 +0,0 @@ -1 2 --50 - 50 diff --git a/gr-vocoder/lib/codec2/codebook/lspdt9.txt b/gr-vocoder/lib/codec2/codebook/lspdt9.txt deleted file mode 100644 index e72c16c92d..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspdt9.txt +++ /dev/null @@ -1,3 +0,0 @@ -1 2 --50 - 50 diff --git a/gr-vocoder/lib/codec2/codebook/lspjnd5-10.txt b/gr-vocoder/lib/codec2/codebook/lspjnd5-10.txt deleted file mode 100644 index e4e500c160..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspjnd5-10.txt +++ /dev/null @@ -1,8317 +0,0 @@ -6 3369 -1400.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1400.0 1900.0 2400.0 2500.0 3200.0 3400.0 -1400.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1400.0 1800.0 2400.0 2500.0 3300.0 3400.0 -1400.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1400.0 1900.0 2300.0 2600.0 3200.0 3300.0 -1400.0 1900.0 2100.0 2600.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1900.0 2300.0 2600.0 3100.0 3200.0 -1600.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1800.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1800.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1900.0 2000.0 2200.0 2600.0 3300.0 3400.0 -1700.0 2000.0 2700.0 2900.0 3200.0 3300.0 -1700.0 2100.0 2600.0 2900.0 3200.0 3300.0 -1600.0 2000.0 2500.0 2800.0 3200.0 3400.0 -1500.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1400.0 1700.0 2200.0 2400.0 3200.0 3300.0 -1300.0 1700.0 2200.0 2300.0 3200.0 3300.0 -1300.0 1600.0 2200.0 2300.0 3200.0 3300.0 -1200.0 1600.0 2200.0 2400.0 3200.0 3300.0 -1200.0 1600.0 2200.0 2300.0 3200.0 3300.0 -1200.0 1500.0 2200.0 2300.0 3100.0 3300.0 -1200.0 1500.0 2200.0 2300.0 3200.0 3300.0 -1300.0 1500.0 2100.0 2300.0 3000.0 3200.0 -1300.0 1600.0 2000.0 2200.0 3000.0 3200.0 -1400.0 1700.0 2000.0 2300.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2300.0 3200.0 3300.0 -1300.0 1600.0 1900.0 2100.0 3100.0 3200.0 -1200.0 1500.0 2100.0 2300.0 3200.0 3300.0 -1500.0 1800.0 2000.0 2300.0 3000.0 3200.0 -1200.0 1500.0 2200.0 2400.0 3300.0 3400.0 -1200.0 1500.0 2200.0 2400.0 3200.0 3400.0 -1200.0 1500.0 2200.0 2400.0 3200.0 3300.0 -1300.0 1500.0 2300.0 2400.0 3200.0 3300.0 -1300.0 1500.0 2200.0 2500.0 3000.0 3200.0 -1300.0 1600.0 2300.0 2600.0 3000.0 3200.0 -1400.0 1800.0 2400.0 2600.0 3100.0 3200.0 -1700.0 2000.0 2500.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2600.0 2700.0 3100.0 3200.0 -1900.0 2300.0 2600.0 2900.0 3200.0 3300.0 -2000.0 2300.0 2600.0 2900.0 3300.0 3400.0 -1900.0 2300.0 2500.0 2900.0 3300.0 3400.0 -1800.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1600.0 1800.0 2400.0 2500.0 3200.0 3400.0 -1500.0 1800.0 2400.0 2600.0 3100.0 3400.0 -1800.0 2100.0 2600.0 2900.0 3300.0 3500.0 -2000.0 2500.0 2700.0 3000.0 3400.0 3500.0 -2200.0 2500.0 2700.0 3100.0 3300.0 3400.0 -2300.0 2500.0 2700.0 3100.0 3300.0 3400.0 -2100.0 2500.0 2600.0 3000.0 3200.0 3300.0 -2100.0 2400.0 2500.0 3000.0 3200.0 3300.0 -1700.0 2000.0 2300.0 2700.0 3100.0 3200.0 -1700.0 2000.0 2300.0 2800.0 3100.0 3300.0 -1600.0 1900.0 2200.0 2800.0 3000.0 3200.0 -1500.0 1900.0 2100.0 2700.0 3000.0 3200.0 -1400.0 1900.0 2000.0 2600.0 3000.0 3100.0 -1200.0 1600.0 2100.0 2400.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2400.0 3200.0 3400.0 -1600.0 1700.0 2200.0 2400.0 3100.0 3400.0 -1600.0 1700.0 2200.0 2400.0 3200.0 3400.0 -1700.0 1800.0 2300.0 2400.0 3200.0 3400.0 -1700.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1700.0 1800.0 2300.0 2400.0 3100.0 3200.0 -1700.0 1800.0 2200.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2100.0 2400.0 3000.0 3100.0 -1500.0 1700.0 2100.0 2300.0 3000.0 3100.0 -1400.0 1700.0 2100.0 2500.0 3000.0 3200.0 -1000.0 1700.0 2300.0 2500.0 3200.0 3300.0 -1100.0 1700.0 2400.0 2500.0 3300.0 3400.0 -1500.0 2000.0 2300.0 2600.0 3000.0 3300.0 -1300.0 1600.0 1800.0 2600.0 2900.0 3100.0 -1300.0 1600.0 1900.0 2200.0 2900.0 3000.0 -1500.0 1700.0 2200.0 2500.0 2900.0 3000.0 -1500.0 1600.0 2100.0 2400.0 2900.0 3100.0 -1500.0 1600.0 2000.0 2600.0 3000.0 3100.0 -1600.0 1700.0 2100.0 2600.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2500.0 3300.0 3400.0 -1700.0 1900.0 2200.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2400.0 2600.0 3000.0 3300.0 -1700.0 2100.0 2400.0 2600.0 3100.0 3300.0 -1700.0 2100.0 2400.0 2600.0 3200.0 3400.0 -1400.0 1600.0 2300.0 2400.0 3300.0 3400.0 -1300.0 1400.0 2100.0 2200.0 2900.0 3200.0 -1000.0 1300.0 2200.0 2300.0 3200.0 3400.0 -1600.0 2000.0 2300.0 2600.0 2800.0 3100.0 -1600.0 2000.0 2300.0 2600.0 2900.0 3200.0 -1600.0 2000.0 2300.0 2600.0 3100.0 3300.0 -1700.0 2000.0 2300.0 2600.0 3100.0 3300.0 -1600.0 1900.0 2300.0 2500.0 3100.0 3400.0 -1500.0 1900.0 2300.0 2600.0 3000.0 3300.0 -1500.0 1900.0 2300.0 2600.0 3100.0 3300.0 -1500.0 2000.0 2300.0 2700.0 3100.0 3300.0 -2000.0 2500.0 2700.0 2900.0 3300.0 3400.0 -2000.0 2400.0 2600.0 2800.0 3300.0 3400.0 -1700.0 2300.0 2600.0 2800.0 3300.0 3400.0 -1400.0 1700.0 2400.0 2500.0 3200.0 3300.0 -1300.0 1600.0 2300.0 2500.0 3200.0 3300.0 -1300.0 1500.0 2000.0 2300.0 3200.0 3300.0 -1500.0 1800.0 2200.0 2400.0 2900.0 3300.0 -1500.0 1700.0 2200.0 2400.0 3000.0 3200.0 -1400.0 1800.0 2200.0 2400.0 3000.0 3300.0 -1400.0 1800.0 2200.0 2400.0 3000.0 3200.0 -1200.0 1500.0 2100.0 2400.0 3100.0 3300.0 -1300.0 1800.0 2200.0 2300.0 3300.0 3400.0 -1300.0 1700.0 2200.0 2400.0 3300.0 3400.0 -1400.0 1500.0 2300.0 2500.0 3100.0 3400.0 -1500.0 1600.0 2300.0 2500.0 3100.0 3300.0 -1500.0 1600.0 2400.0 2500.0 3100.0 3300.0 -1400.0 1800.0 2400.0 2500.0 3000.0 3300.0 -1300.0 1700.0 2100.0 2500.0 3000.0 3200.0 -1300.0 1600.0 2100.0 2500.0 3100.0 3200.0 -1300.0 1700.0 2200.0 2500.0 3100.0 3200.0 -1300.0 1600.0 2200.0 2500.0 3100.0 3300.0 -1300.0 1700.0 2300.0 2600.0 3200.0 3300.0 -1300.0 1700.0 2400.0 2500.0 3200.0 3400.0 -1500.0 1900.0 2500.0 2600.0 3200.0 3400.0 -1500.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1600.0 2100.0 2600.0 2900.0 3400.0 3500.0 -1600.0 1900.0 2500.0 2800.0 3300.0 3400.0 -1500.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1600.0 2000.0 2500.0 2700.0 3100.0 3200.0 -1500.0 1700.0 2400.0 2700.0 3100.0 3200.0 -1500.0 1600.0 2400.0 2600.0 3100.0 3300.0 -1500.0 1600.0 2200.0 2400.0 3000.0 3200.0 -1500.0 1600.0 2200.0 2300.0 3000.0 3200.0 -1400.0 1700.0 2100.0 2300.0 3000.0 3100.0 -1700.0 1800.0 2300.0 2800.0 3100.0 3300.0 -1800.0 2100.0 2500.0 2800.0 3200.0 3300.0 -1800.0 2200.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1800.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1600.0 2000.0 2300.0 2500.0 3000.0 3200.0 -1500.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1500.0 1700.0 2200.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2400.0 3000.0 3100.0 -1600.0 1700.0 2300.0 2400.0 3000.0 3100.0 -1600.0 1700.0 2300.0 2400.0 3000.0 3200.0 -1600.0 1700.0 2300.0 2400.0 2900.0 3100.0 -1600.0 1700.0 2300.0 2400.0 2900.0 3200.0 -1600.0 1700.0 2300.0 2500.0 2900.0 3200.0 -1500.0 1600.0 2300.0 2500.0 2900.0 3300.0 -1400.0 1500.0 2200.0 2500.0 3000.0 3300.0 -1200.0 1400.0 2300.0 2400.0 3000.0 3300.0 -1100.0 1400.0 2300.0 2400.0 3100.0 3300.0 -1200.0 1800.0 2400.0 2500.0 3300.0 3400.0 -1400.0 2000.0 2400.0 2700.0 3300.0 3400.0 -1600.0 2100.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2300.0 2600.0 2900.0 3300.0 3400.0 -1400.0 2100.0 2400.0 2600.0 3100.0 3200.0 -1300.0 1600.0 2300.0 2500.0 3000.0 3200.0 -1200.0 1500.0 2100.0 2500.0 3000.0 3200.0 -1300.0 1700.0 2100.0 2300.0 2900.0 3200.0 -1500.0 1600.0 2200.0 2400.0 3000.0 3100.0 -1500.0 1600.0 2200.0 2500.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2500.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2500.0 3100.0 3300.0 -1600.0 1700.0 2200.0 2400.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2500.0 3300.0 3400.0 -1700.0 1800.0 2300.0 2500.0 3300.0 3400.0 -1800.0 2000.0 2300.0 2700.0 3200.0 3300.0 -1900.0 2000.0 2300.0 2700.0 3300.0 3400.0 -1900.0 2000.0 2100.0 2400.0 3300.0 3400.0 -1800.0 2100.0 2400.0 2800.0 3200.0 3400.0 -2000.0 2200.0 2500.0 2700.0 3100.0 3300.0 -2000.0 2300.0 2500.0 2700.0 3100.0 3300.0 -2000.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1900.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1800.0 1900.0 2300.0 2600.0 3300.0 3400.0 -1800.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1700.0 1800.0 2300.0 2600.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2300.0 2600.0 3200.0 3300.0 -1500.0 1800.0 2200.0 2400.0 3200.0 3300.0 -1500.0 1800.0 2100.0 2500.0 3100.0 3200.0 -1700.0 2100.0 2400.0 2800.0 3200.0 3300.0 -1900.0 2100.0 2500.0 2900.0 3200.0 3300.0 -1900.0 2100.0 2400.0 2900.0 3200.0 3300.0 -1800.0 2100.0 2400.0 2800.0 3100.0 3200.0 -2000.0 2200.0 2500.0 2800.0 3100.0 3300.0 -2000.0 2200.0 2700.0 2800.0 3100.0 3300.0 -2000.0 2300.0 2600.0 2800.0 3200.0 3300.0 -1800.0 2000.0 2600.0 2800.0 3200.0 3300.0 -1800.0 2100.0 2600.0 2800.0 3200.0 3400.0 -1800.0 2200.0 2500.0 2700.0 3300.0 3400.0 -1700.0 1900.0 2500.0 2600.0 3200.0 3400.0 -1700.0 1900.0 2400.0 2700.0 3200.0 3400.0 -1500.0 1900.0 2500.0 2600.0 3100.0 3300.0 -1200.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1300.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1200.0 1600.0 2400.0 2600.0 3200.0 3300.0 -1200.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1300.0 2000.0 2400.0 2700.0 3200.0 3300.0 -1200.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1100.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1100.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1100.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1000.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1000.0 1500.0 2400.0 2500.0 3100.0 3200.0 -1000.0 1500.0 2300.0 2400.0 3100.0 3200.0 -1000.0 1900.0 2300.0 2500.0 3000.0 3100.0 -1100.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1200.0 1800.0 2300.0 2400.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2400.0 3100.0 3200.0 -1400.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2400.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2400.0 3100.0 3200.0 -1500.0 1800.0 2200.0 2400.0 3100.0 3200.0 -1400.0 1800.0 2200.0 2400.0 3100.0 3200.0 -1400.0 1800.0 2200.0 2400.0 3000.0 3100.0 -1800.0 2000.0 2300.0 2800.0 2900.0 3100.0 -1500.0 1900.0 2300.0 2500.0 3100.0 3200.0 -1500.0 1900.0 2300.0 2400.0 3300.0 3400.0 -1500.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1600.0 2000.0 2400.0 2700.0 3300.0 3400.0 -1600.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1700.0 2100.0 2400.0 2600.0 2900.0 3200.0 -1600.0 2000.0 2500.0 2700.0 2900.0 3200.0 -1500.0 1800.0 2400.0 2800.0 3000.0 3200.0 -1500.0 1800.0 2100.0 2400.0 2900.0 3100.0 -1600.0 1900.0 2100.0 2400.0 3100.0 3300.0 -1600.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1800.0 1900.0 2300.0 2400.0 3100.0 3300.0 -1900.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1900.0 2200.0 2600.0 2700.0 3300.0 3400.0 -1900.0 2300.0 2600.0 2700.0 3300.0 3400.0 -1900.0 2300.0 2700.0 2800.0 3300.0 3400.0 -2000.0 2200.0 2700.0 2800.0 3300.0 3400.0 -2000.0 2400.0 2700.0 2800.0 3300.0 3400.0 -2000.0 2300.0 2700.0 2800.0 3300.0 3400.0 -2000.0 2400.0 2600.0 2700.0 3300.0 3400.0 -2000.0 2200.0 2600.0 2700.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2700.0 3200.0 3300.0 -1900.0 2100.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2600.0 3100.0 3200.0 -1900.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1800.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1800.0 1900.0 2300.0 2500.0 3000.0 3100.0 -1800.0 1900.0 2400.0 2700.0 3000.0 3200.0 -1800.0 1900.0 2500.0 2700.0 3000.0 3200.0 -1800.0 2000.0 2500.0 2700.0 3100.0 3200.0 -2000.0 2300.0 2600.0 2900.0 3100.0 3300.0 -1900.0 2300.0 2700.0 3000.0 3200.0 3300.0 -2000.0 2400.0 2700.0 3000.0 3200.0 3300.0 -2100.0 2500.0 2800.0 3000.0 3200.0 3300.0 -2200.0 2400.0 2800.0 3000.0 3300.0 3400.0 -1900.0 2200.0 2700.0 2900.0 3300.0 3400.0 -2200.0 2400.0 2900.0 3100.0 3300.0 3400.0 -2100.0 2400.0 2800.0 3100.0 3300.0 3400.0 -2200.0 2500.0 2800.0 3100.0 3300.0 3400.0 -2100.0 2400.0 2600.0 2800.0 3300.0 3400.0 -2000.0 2400.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2400.0 2700.0 3200.0 3300.0 -1800.0 1900.0 2400.0 2700.0 3100.0 3200.0 -1800.0 1900.0 2400.0 2700.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2700.0 3100.0 3200.0 -1700.0 1900.0 2200.0 2700.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2700.0 2900.0 3200.0 -1700.0 1900.0 2300.0 2700.0 2900.0 3200.0 -1700.0 1900.0 2200.0 2700.0 3000.0 3200.0 -1700.0 2000.0 2300.0 2800.0 3000.0 3200.0 -1400.0 1700.0 2300.0 2400.0 3300.0 3400.0 -1400.0 1800.0 2300.0 2400.0 3300.0 3400.0 -1400.0 1900.0 2300.0 2400.0 3300.0 3400.0 -1400.0 2100.0 2300.0 2500.0 3300.0 3400.0 -1400.0 2100.0 2300.0 2600.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2700.0 3200.0 3400.0 -1800.0 2100.0 2600.0 2900.0 3200.0 3400.0 -1800.0 2100.0 2600.0 2800.0 3300.0 3400.0 -1800.0 2100.0 2600.0 2700.0 3300.0 3400.0 -1800.0 2000.0 2500.0 2700.0 3300.0 3400.0 -1800.0 2100.0 2400.0 2700.0 3300.0 3400.0 -1800.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1800.0 2200.0 2400.0 2600.0 3300.0 3400.0 -1800.0 2200.0 2400.0 2700.0 3300.0 3400.0 -1900.0 2300.0 2600.0 2900.0 3200.0 3400.0 -1900.0 2200.0 2600.0 2700.0 3200.0 3400.0 -1900.0 2100.0 2600.0 2700.0 3300.0 3400.0 -2000.0 2100.0 2500.0 2700.0 3200.0 3300.0 -2000.0 2100.0 2500.0 2700.0 3300.0 3400.0 -2000.0 2200.0 2500.0 2700.0 3300.0 3400.0 -2000.0 2100.0 2600.0 2700.0 3300.0 3400.0 -2000.0 2100.0 2500.0 2700.0 3400.0 3500.0 -1900.0 2100.0 2500.0 2600.0 3200.0 3400.0 -2000.0 2200.0 2600.0 2700.0 3200.0 3400.0 -2100.0 2300.0 2600.0 2800.0 3300.0 3400.0 -2100.0 2500.0 2700.0 3100.0 3300.0 3400.0 -2100.0 2500.0 2800.0 3100.0 3300.0 3400.0 -2100.0 2300.0 2400.0 2700.0 3200.0 3300.0 -2000.0 2300.0 2500.0 2800.0 3200.0 3300.0 -1700.0 2100.0 2500.0 2700.0 3200.0 3300.0 -1600.0 1900.0 2300.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2300.0 2800.0 3100.0 3300.0 -1500.0 1800.0 2300.0 2400.0 3100.0 3200.0 -1500.0 1700.0 2300.0 2400.0 3100.0 3300.0 -1400.0 1700.0 2300.0 2400.0 3100.0 3300.0 -1400.0 1500.0 2300.0 2400.0 3100.0 3300.0 -1300.0 1500.0 2300.0 2400.0 3100.0 3300.0 -1300.0 1500.0 2400.0 2500.0 3100.0 3300.0 -1300.0 1500.0 2400.0 2500.0 3000.0 3300.0 -1300.0 1500.0 2300.0 2400.0 2900.0 3300.0 -1400.0 1500.0 2400.0 2500.0 2900.0 3300.0 -1500.0 1600.0 2300.0 2500.0 2800.0 3300.0 -1600.0 1700.0 2300.0 2500.0 2800.0 3400.0 -1700.0 1800.0 2300.0 2500.0 2800.0 3300.0 -1800.0 1900.0 2400.0 2500.0 3100.0 3400.0 -1800.0 1900.0 2400.0 2500.0 3200.0 3400.0 -1900.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1900.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1900.0 2200.0 2600.0 2900.0 3400.0 3500.0 -1800.0 2200.0 2600.0 2900.0 3300.0 3400.0 -1900.0 2300.0 2600.0 3000.0 3400.0 3500.0 -2000.0 2300.0 2600.0 3000.0 3300.0 3400.0 -1800.0 2200.0 2500.0 2900.0 3200.0 3300.0 -1800.0 2100.0 2400.0 2700.0 3200.0 3300.0 -1900.0 2100.0 2500.0 2800.0 3200.0 3300.0 -1700.0 2100.0 2500.0 2700.0 3100.0 3300.0 -1400.0 1800.0 2300.0 2600.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2400.0 3000.0 3100.0 -1500.0 1800.0 2300.0 2600.0 3000.0 3200.0 -1900.0 2200.0 2500.0 2800.0 3000.0 3300.0 -2000.0 2300.0 2600.0 2800.0 3100.0 3300.0 -2000.0 2300.0 2700.0 2900.0 3100.0 3300.0 -2100.0 2300.0 2700.0 2900.0 3100.0 3300.0 -2000.0 2300.0 2700.0 3000.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2600.0 3300.0 3400.0 -1400.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1300.0 1900.0 2300.0 2600.0 3100.0 3300.0 -1200.0 1600.0 2200.0 2400.0 3000.0 3100.0 -1100.0 1500.0 2200.0 2400.0 3100.0 3200.0 -1100.0 1400.0 2300.0 2400.0 3200.0 3300.0 -1100.0 1500.0 2300.0 2400.0 3200.0 3300.0 -1100.0 1500.0 2300.0 2400.0 3300.0 3400.0 -1300.0 1400.0 2400.0 2500.0 3100.0 3300.0 -1500.0 2200.0 2500.0 2600.0 3100.0 3200.0 -2100.0 2400.0 2700.0 3000.0 3200.0 3300.0 -2200.0 2400.0 2700.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2700.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2700.0 2900.0 3300.0 3400.0 -2000.0 2300.0 2700.0 3000.0 3400.0 3500.0 -2100.0 2400.0 2700.0 3000.0 3400.0 3500.0 -2100.0 2500.0 2700.0 3100.0 3400.0 3500.0 -1900.0 2400.0 2600.0 2800.0 3300.0 3400.0 -1900.0 2100.0 2600.0 2800.0 3300.0 3400.0 -1900.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1900.0 2100.0 2500.0 2600.0 3300.0 3400.0 -1800.0 2200.0 2400.0 2800.0 3300.0 3400.0 -1800.0 2000.0 2400.0 2700.0 3300.0 3400.0 -1900.0 2000.0 2400.0 2700.0 3200.0 3300.0 -2000.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1500.0 2100.0 2200.0 2500.0 3300.0 3400.0 -1400.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1400.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1400.0 1800.0 2200.0 2600.0 3100.0 3200.0 -1700.0 2100.0 2400.0 2700.0 3100.0 3300.0 -1800.0 2000.0 2400.0 2700.0 3000.0 3200.0 -1600.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1700.0 2000.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2200.0 2600.0 2900.0 3200.0 -1600.0 1900.0 2300.0 2600.0 2900.0 3200.0 -1600.0 1900.0 2300.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2500.0 3000.0 3200.0 -1600.0 1800.0 2300.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2400.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2500.0 3000.0 3100.0 -1700.0 1800.0 2300.0 2500.0 3100.0 3200.0 -1700.0 1800.0 2200.0 2400.0 3000.0 3200.0 -1700.0 1800.0 2100.0 2300.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2400.0 3000.0 3200.0 -1800.0 2000.0 2200.0 2400.0 3000.0 3200.0 -1800.0 2000.0 2300.0 2500.0 3100.0 3300.0 -1800.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1800.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1700.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1700.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1800.0 2100.0 2500.0 2900.0 3300.0 3400.0 -1800.0 2200.0 2600.0 2800.0 3300.0 3500.0 -1800.0 2100.0 2600.0 2900.0 3300.0 3400.0 -1800.0 2100.0 2600.0 3000.0 3200.0 3300.0 -1800.0 2200.0 2600.0 2900.0 3200.0 3300.0 -1800.0 2100.0 2600.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2400.0 2700.0 3100.0 3200.0 -1700.0 2000.0 2300.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2300.0 2600.0 3000.0 3100.0 -1800.0 2100.0 2400.0 2600.0 3100.0 3200.0 -1800.0 2100.0 2400.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2400.0 2700.0 3200.0 3300.0 -1800.0 2000.0 2400.0 2700.0 3100.0 3300.0 -1700.0 2000.0 2400.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2300.0 2700.0 3100.0 3300.0 -1700.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1700.0 2200.0 2500.0 3000.0 3200.0 -1500.0 1700.0 2100.0 2500.0 2900.0 3100.0 -1500.0 1800.0 2300.0 2600.0 2900.0 3200.0 -1500.0 1900.0 2400.0 2600.0 3000.0 3200.0 -1600.0 2000.0 2300.0 2700.0 3100.0 3200.0 -1600.0 2000.0 2400.0 2700.0 3100.0 3300.0 -1600.0 2200.0 2600.0 2900.0 3300.0 3400.0 -1700.0 2200.0 2600.0 3000.0 3300.0 3400.0 -1700.0 2100.0 2500.0 2900.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2900.0 3300.0 3400.0 -1500.0 1800.0 2400.0 2500.0 3200.0 3400.0 -1500.0 1700.0 2400.0 2500.0 3300.0 3400.0 -1500.0 1700.0 2300.0 2400.0 3300.0 3400.0 -1600.0 1800.0 2300.0 2400.0 3300.0 3400.0 -1600.0 1800.0 2400.0 2500.0 3300.0 3400.0 -1600.0 1700.0 2400.0 2500.0 2800.0 3300.0 -1600.0 1800.0 2300.0 2500.0 2700.0 3200.0 -1600.0 1700.0 2300.0 2500.0 2700.0 3200.0 -1600.0 1700.0 2200.0 2500.0 2700.0 3100.0 -1600.0 1700.0 2200.0 2500.0 2600.0 3000.0 -1600.0 1700.0 2400.0 2500.0 2700.0 3200.0 -1600.0 1700.0 2400.0 2500.0 2800.0 3200.0 -1700.0 1800.0 2400.0 2600.0 2900.0 3300.0 -1700.0 1800.0 2300.0 2600.0 2800.0 3300.0 -1700.0 1800.0 2400.0 2600.0 3000.0 3400.0 -1700.0 1800.0 2300.0 2500.0 2900.0 3300.0 -1600.0 1700.0 2300.0 2500.0 3000.0 3300.0 -1400.0 1800.0 2000.0 2400.0 3000.0 3200.0 -1400.0 1700.0 2000.0 2300.0 3000.0 3200.0 -1700.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1700.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1800.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1900.0 2000.0 2300.0 2600.0 3300.0 3400.0 -2000.0 2100.0 2200.0 2600.0 3300.0 3400.0 -2000.0 2100.0 2300.0 2600.0 3300.0 3400.0 -2100.0 2200.0 2500.0 2800.0 3300.0 3400.0 -2000.0 2100.0 2300.0 2500.0 3200.0 3300.0 -1900.0 2000.0 2200.0 2600.0 3200.0 3300.0 -1800.0 1900.0 2100.0 2600.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2600.0 3000.0 3200.0 -1500.0 1800.0 2100.0 2300.0 3000.0 3200.0 -1500.0 1800.0 2100.0 2400.0 3100.0 3300.0 -1500.0 1700.0 2200.0 2500.0 3100.0 3300.0 -1500.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1500.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1800.0 2300.0 2600.0 3000.0 3400.0 3500.0 -1900.0 2300.0 2700.0 3000.0 3400.0 3500.0 -2000.0 2300.0 2800.0 3100.0 3300.0 3400.0 -2100.0 2300.0 2800.0 3100.0 3300.0 3400.0 -2000.0 2300.0 2700.0 3000.0 3200.0 3300.0 -2000.0 2200.0 2600.0 2900.0 3100.0 3300.0 -2000.0 2200.0 2500.0 2800.0 3000.0 3200.0 -2000.0 2200.0 2400.0 2800.0 3100.0 3200.0 -1600.0 2000.0 2400.0 2600.0 3100.0 3200.0 -1400.0 1900.0 2400.0 2500.0 3100.0 3200.0 -1400.0 1900.0 2300.0 2600.0 3000.0 3200.0 -1500.0 2000.0 2400.0 2700.0 2900.0 3200.0 -2000.0 2300.0 2800.0 3000.0 3200.0 3400.0 -2100.0 2300.0 2900.0 3100.0 3300.0 3400.0 -1800.0 2300.0 2600.0 2900.0 3400.0 3500.0 -1700.0 2300.0 2500.0 2900.0 3300.0 3400.0 -1300.0 2000.0 2400.0 2700.0 3300.0 3400.0 -1200.0 1900.0 2300.0 2600.0 3300.0 3400.0 -1200.0 1800.0 2300.0 2600.0 3300.0 3400.0 -1100.0 1800.0 2300.0 2500.0 3300.0 3400.0 -1800.0 2200.0 2600.0 2800.0 3300.0 3400.0 -1800.0 2000.0 2500.0 2700.0 3200.0 3400.0 -1700.0 2100.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2200.0 2600.0 2800.0 3300.0 3400.0 -1800.0 2200.0 2600.0 3000.0 3300.0 3500.0 -1700.0 2100.0 2600.0 2800.0 3300.0 3400.0 -1700.0 2100.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2800.0 3300.0 3500.0 -1800.0 2200.0 2500.0 2900.0 3300.0 3400.0 -2100.0 2200.0 2600.0 2700.0 3100.0 3400.0 -1900.0 2100.0 2500.0 2600.0 3100.0 3400.0 -1900.0 2000.0 2500.0 2600.0 3200.0 3400.0 -1900.0 2000.0 2600.0 2700.0 3200.0 3400.0 -1800.0 1900.0 2500.0 2600.0 3100.0 3400.0 -1600.0 2000.0 2700.0 2800.0 3300.0 3400.0 -1400.0 2000.0 2700.0 2800.0 3300.0 3400.0 -1000.0 1900.0 2700.0 2800.0 3300.0 3400.0 -1000.0 1400.0 2700.0 2900.0 3200.0 3400.0 -1100.0 1500.0 2700.0 2900.0 3200.0 3300.0 -1200.0 1700.0 2400.0 2500.0 3100.0 3300.0 -1300.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1300.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1400.0 2000.0 2400.0 2600.0 3100.0 3300.0 -1500.0 2000.0 2400.0 2700.0 3000.0 3300.0 -1300.0 2100.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1900.0 2700.0 2800.0 3300.0 3400.0 -1500.0 1900.0 2700.0 2800.0 3300.0 3400.0 -1400.0 1800.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2300.0 2600.0 2700.0 2900.0 3200.0 -1500.0 1700.0 2400.0 2600.0 2800.0 3300.0 -1600.0 1700.0 2500.0 2700.0 2900.0 3300.0 -1800.0 1900.0 2600.0 2700.0 3200.0 3400.0 -1800.0 1900.0 2600.0 2700.0 3200.0 3300.0 -2000.0 2200.0 2600.0 2800.0 3200.0 3300.0 -2000.0 2100.0 2600.0 2700.0 3200.0 3400.0 -2000.0 2100.0 2500.0 2800.0 3200.0 3400.0 -2000.0 2100.0 2600.0 2700.0 3100.0 3300.0 -1900.0 2000.0 2400.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2400.0 2600.0 3100.0 3200.0 -1700.0 2000.0 2300.0 2400.0 3200.0 3300.0 -1900.0 2100.0 2500.0 2700.0 3200.0 3400.0 -1900.0 2000.0 2500.0 2700.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1800.0 2100.0 2500.0 2700.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2600.0 3200.0 3400.0 -1800.0 1900.0 2400.0 2500.0 3000.0 3300.0 -1800.0 2000.0 2400.0 2600.0 3100.0 3300.0 -1900.0 2100.0 2500.0 2600.0 3200.0 3300.0 -2000.0 2100.0 2500.0 2600.0 3300.0 3400.0 -2000.0 2200.0 2500.0 2600.0 3300.0 3400.0 -2100.0 2200.0 2500.0 2600.0 3300.0 3400.0 -2100.0 2200.0 2500.0 2600.0 3200.0 3400.0 -2100.0 2200.0 2400.0 2500.0 3200.0 3400.0 -2000.0 2100.0 2400.0 2500.0 3200.0 3400.0 -1800.0 1900.0 2400.0 2600.0 3200.0 3400.0 -1800.0 1900.0 2500.0 2600.0 3200.0 3400.0 -1800.0 2300.0 2700.0 2900.0 3300.0 3400.0 -1900.0 2400.0 2800.0 3000.0 3300.0 3500.0 -1900.0 2300.0 2800.0 3100.0 3300.0 3400.0 -2000.0 2300.0 2700.0 2900.0 3200.0 3400.0 -1800.0 2000.0 2600.0 2900.0 3300.0 3400.0 -1700.0 2000.0 2500.0 2600.0 3200.0 3400.0 -1600.0 2100.0 2500.0 2600.0 3300.0 3400.0 -1500.0 2100.0 2500.0 2600.0 3300.0 3400.0 -1500.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1400.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2400.0 2600.0 3100.0 3300.0 -1300.0 2000.0 2600.0 2800.0 3300.0 3400.0 -1500.0 2000.0 2600.0 2700.0 3300.0 3400.0 -1600.0 2000.0 2500.0 2700.0 3200.0 3400.0 -1600.0 2000.0 2500.0 2600.0 3200.0 3400.0 -1600.0 2000.0 2400.0 2500.0 3200.0 3400.0 -1700.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1600.0 1900.0 2300.0 2400.0 3300.0 3400.0 -1500.0 1700.0 2200.0 2400.0 3200.0 3300.0 -1500.0 1800.0 2200.0 2500.0 2900.0 3200.0 -1300.0 1700.0 2200.0 2500.0 3000.0 3300.0 -1200.0 1700.0 2200.0 2600.0 3000.0 3200.0 -1100.0 1700.0 2300.0 2600.0 3100.0 3300.0 -1200.0 1800.0 2300.0 2500.0 3300.0 3400.0 -1100.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1200.0 2200.0 2400.0 2700.0 3300.0 3400.0 -1200.0 2300.0 2500.0 2700.0 3300.0 3400.0 -1200.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1200.0 2300.0 2600.0 2800.0 3300.0 3400.0 -1100.0 1800.0 2500.0 2600.0 3400.0 3500.0 -1300.0 1700.0 2500.0 2600.0 3200.0 3400.0 -1400.0 1800.0 2500.0 2600.0 3200.0 3400.0 -1500.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1500.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1800.0 1900.0 2500.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2400.0 2500.0 3200.0 3300.0 -2000.0 2100.0 2300.0 2500.0 3300.0 3400.0 -1500.0 1900.0 2400.0 2800.0 3100.0 3300.0 -1200.0 1700.0 2500.0 2600.0 3300.0 3400.0 -1300.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1400.0 1800.0 2500.0 2700.0 3300.0 3400.0 -1300.0 1700.0 2400.0 2700.0 3200.0 3400.0 -1100.0 2100.0 2600.0 2700.0 3300.0 3400.0 -1200.0 2100.0 2600.0 2700.0 3300.0 3400.0 -1200.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1200.0 2100.0 2500.0 2600.0 3300.0 3400.0 -1200.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1200.0 2200.0 2500.0 2700.0 3400.0 3500.0 -1400.0 1800.0 2400.0 2600.0 3100.0 3400.0 -1400.0 1900.0 2400.0 2600.0 3100.0 3300.0 -1500.0 1800.0 2400.0 2700.0 3100.0 3300.0 -1500.0 1900.0 2400.0 2600.0 3200.0 3400.0 -1600.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1900.0 2200.0 2400.0 2600.0 3300.0 3400.0 -2000.0 2200.0 2400.0 2600.0 3200.0 3300.0 -2000.0 2100.0 2400.0 2500.0 3200.0 3300.0 -2100.0 2200.0 2500.0 2600.0 3200.0 3300.0 -2100.0 2200.0 2500.0 2700.0 3200.0 3300.0 -2000.0 2100.0 2400.0 2600.0 3100.0 3200.0 -1500.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1500.0 1900.0 2300.0 2400.0 3100.0 3300.0 -1500.0 1800.0 2300.0 2400.0 3100.0 3300.0 -1400.0 1800.0 2300.0 2400.0 3100.0 3300.0 -1400.0 1900.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1500.0 1800.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1700.0 2200.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2200.0 2500.0 3000.0 3200.0 -1300.0 1700.0 2400.0 2600.0 3100.0 3200.0 -1400.0 1700.0 2200.0 2500.0 3200.0 3300.0 -1400.0 1800.0 2300.0 2500.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1100.0 1500.0 2300.0 2400.0 3200.0 3400.0 -1000.0 1600.0 2500.0 2600.0 3300.0 3400.0 -1000.0 1700.0 2500.0 2600.0 3300.0 3400.0 -1000.0 1800.0 2600.0 2700.0 3300.0 3400.0 -1000.0 1900.0 2600.0 2700.0 3300.0 3400.0 -1000.0 1800.0 2800.0 2900.0 3300.0 3400.0 -1400.0 1600.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1700.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1700.0 2500.0 2600.0 3000.0 3400.0 -1700.0 1800.0 2500.0 2600.0 3000.0 3400.0 -1700.0 1800.0 2400.0 2600.0 2800.0 3300.0 -1700.0 1800.0 2400.0 2600.0 2900.0 3400.0 -1700.0 1800.0 2500.0 2600.0 3200.0 3400.0 -1700.0 1800.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1800.0 2500.0 2600.0 3200.0 3400.0 -1600.0 1800.0 2600.0 2700.0 3200.0 3400.0 -1600.0 1900.0 2600.0 2700.0 3300.0 3400.0 -1600.0 2000.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2300.0 2800.0 3000.0 3300.0 3400.0 -1800.0 2100.0 2800.0 3100.0 3300.0 3400.0 -1900.0 2100.0 2700.0 2900.0 3300.0 3400.0 -1800.0 2000.0 2600.0 2800.0 3200.0 3400.0 -1700.0 1900.0 2500.0 2800.0 3100.0 3300.0 -1700.0 1800.0 2400.0 2600.0 3000.0 3300.0 -1700.0 1800.0 2500.0 2700.0 3000.0 3400.0 -1700.0 1900.0 2600.0 2700.0 3100.0 3400.0 -1600.0 1900.0 2600.0 2700.0 3000.0 3300.0 -1700.0 2000.0 2600.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1700.0 1900.0 2600.0 2800.0 3200.0 3300.0 -1600.0 1900.0 2600.0 2800.0 3200.0 3400.0 -1200.0 1800.0 2700.0 2800.0 3200.0 3400.0 -1100.0 1700.0 2700.0 2800.0 3200.0 3300.0 -1500.0 1800.0 2600.0 2700.0 3100.0 3400.0 -1500.0 1800.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1800.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1800.0 2400.0 2500.0 3100.0 3400.0 -1500.0 1700.0 2400.0 2500.0 3000.0 3400.0 -1400.0 1600.0 2400.0 2500.0 3000.0 3400.0 -1400.0 1600.0 2400.0 2600.0 2900.0 3300.0 -1200.0 1700.0 2600.0 2700.0 3100.0 3300.0 -1200.0 1800.0 2600.0 2700.0 3200.0 3400.0 -1100.0 1900.0 2600.0 2700.0 3200.0 3400.0 -1400.0 1800.0 2500.0 2700.0 3200.0 3400.0 -1700.0 1900.0 2500.0 2600.0 2900.0 3300.0 -1600.0 1700.0 2500.0 2700.0 3000.0 3400.0 -1400.0 1500.0 2500.0 2700.0 3200.0 3400.0 -1400.0 1700.0 2500.0 2700.0 3000.0 3300.0 -1800.0 2000.0 2200.0 2600.0 2900.0 3200.0 -1900.0 2100.0 2400.0 2600.0 3100.0 3300.0 -1900.0 2300.0 2400.0 2700.0 3200.0 3300.0 -1800.0 2200.0 2400.0 2700.0 3200.0 3300.0 -1600.0 1900.0 2200.0 2400.0 3000.0 3200.0 -1500.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1500.0 1900.0 2100.0 2400.0 3100.0 3200.0 -1400.0 1900.0 2100.0 2500.0 3200.0 3300.0 -1300.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1200.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1200.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1100.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1200.0 2200.0 2500.0 2600.0 3300.0 3400.0 -1500.0 1800.0 2400.0 2500.0 3300.0 3400.0 -1800.0 1900.0 2300.0 2400.0 3300.0 3400.0 -2100.0 2200.0 2400.0 2600.0 3300.0 3400.0 -2200.0 2300.0 2600.0 2700.0 3300.0 3400.0 -2200.0 2300.0 2600.0 2800.0 3300.0 3400.0 -2100.0 2300.0 2500.0 2800.0 3100.0 3300.0 -2200.0 2300.0 2600.0 2700.0 3100.0 3400.0 -2100.0 2200.0 2600.0 2700.0 3200.0 3400.0 -1900.0 2300.0 2600.0 2900.0 3100.0 3300.0 -2000.0 2300.0 2600.0 2900.0 3200.0 3300.0 -2200.0 2300.0 2700.0 2900.0 3300.0 3400.0 -2000.0 2300.0 2500.0 2900.0 3300.0 3400.0 -1500.0 1700.0 2200.0 2600.0 3100.0 3300.0 -1500.0 1700.0 2200.0 2600.0 3000.0 3300.0 -1500.0 1800.0 2200.0 2600.0 3100.0 3300.0 -1500.0 1800.0 2000.0 2300.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2300.0 3200.0 3300.0 -1600.0 1900.0 2100.0 2300.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2400.0 3300.0 3400.0 -1800.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1800.0 2000.0 2400.0 2500.0 3200.0 3400.0 -1800.0 2000.0 2400.0 2600.0 3100.0 3400.0 -1800.0 1900.0 2400.0 2600.0 3100.0 3400.0 -1400.0 1600.0 2500.0 2600.0 2900.0 3300.0 -1300.0 1500.0 2500.0 2600.0 2900.0 3300.0 -1300.0 1700.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1900.0 2400.0 2800.0 3100.0 3200.0 -1500.0 2000.0 2400.0 2800.0 3100.0 3300.0 -1100.0 1700.0 2600.0 2700.0 3200.0 3400.0 -1100.0 1800.0 2600.0 2700.0 3300.0 3400.0 -1100.0 1800.0 2700.0 2800.0 3300.0 3400.0 -1700.0 2000.0 2600.0 2700.0 3100.0 3400.0 -1700.0 2100.0 2500.0 2600.0 3000.0 3200.0 -1700.0 2200.0 2600.0 2700.0 3100.0 3200.0 -1700.0 2000.0 2500.0 2600.0 3000.0 3200.0 -1700.0 1900.0 2500.0 2600.0 3000.0 3300.0 -1700.0 1900.0 2400.0 2600.0 3000.0 3300.0 -2000.0 2200.0 2400.0 2600.0 3300.0 3400.0 -1800.0 2100.0 2400.0 2500.0 3300.0 3400.0 -1700.0 2100.0 2400.0 2500.0 3300.0 3400.0 -1500.0 2100.0 2400.0 2500.0 3300.0 3400.0 -1600.0 2100.0 2400.0 2500.0 3300.0 3400.0 -1700.0 2000.0 2300.0 2400.0 3300.0 3400.0 -1700.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1800.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1900.0 2000.0 2400.0 2500.0 3100.0 3400.0 -1900.0 2000.0 2400.0 2500.0 3000.0 3400.0 -1900.0 2000.0 2300.0 2400.0 2800.0 3300.0 -1800.0 2000.0 2200.0 2400.0 2600.0 3200.0 -1900.0 2000.0 2300.0 2500.0 2800.0 3200.0 -1700.0 2000.0 2300.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2800.0 3200.0 3300.0 -1700.0 2000.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2000.0 2600.0 2900.0 3300.0 3400.0 -1700.0 1800.0 2500.0 2700.0 3200.0 3400.0 -1600.0 1700.0 2400.0 2600.0 2900.0 3300.0 -1600.0 1700.0 2500.0 2600.0 2900.0 3300.0 -1600.0 1800.0 2600.0 2700.0 3100.0 3400.0 -1600.0 1700.0 2600.0 2700.0 3000.0 3300.0 -1600.0 1700.0 2600.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2800.0 3200.0 3400.0 -2100.0 2500.0 2700.0 3000.0 3300.0 3400.0 -2100.0 2400.0 2700.0 2900.0 3300.0 3400.0 -2200.0 2500.0 2700.0 3000.0 3300.0 3400.0 -2200.0 2500.0 2800.0 2900.0 3400.0 3500.0 -2200.0 2500.0 2800.0 2900.0 3300.0 3500.0 -2100.0 2500.0 2700.0 2800.0 3300.0 3400.0 -2100.0 2400.0 2700.0 2900.0 3200.0 3400.0 -2100.0 2300.0 2600.0 2800.0 3100.0 3400.0 -2100.0 2200.0 2500.0 2700.0 3100.0 3400.0 -2200.0 2300.0 2500.0 2700.0 3200.0 3400.0 -1900.0 2100.0 2400.0 2500.0 3200.0 3400.0 -1700.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1900.0 2400.0 2500.0 3100.0 3300.0 -1400.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1200.0 1900.0 2600.0 2700.0 3300.0 3400.0 -1100.0 2000.0 2600.0 2700.0 3300.0 3400.0 -1100.0 1700.0 2600.0 2700.0 3300.0 3400.0 -1300.0 1600.0 2500.0 2600.0 3100.0 3400.0 -1500.0 1600.0 2400.0 2500.0 3000.0 3400.0 -1600.0 1700.0 2400.0 2500.0 3100.0 3400.0 -1900.0 2000.0 2300.0 2500.0 2900.0 3400.0 -1900.0 2000.0 2400.0 2500.0 2800.0 3300.0 -1900.0 2000.0 2500.0 2700.0 3300.0 3400.0 -1900.0 2000.0 2500.0 2800.0 3300.0 3400.0 -2000.0 2200.0 2700.0 2900.0 3300.0 3400.0 -1900.0 2200.0 2700.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2700.0 2900.0 3200.0 3300.0 -2000.0 2300.0 2700.0 2900.0 3200.0 3300.0 -2200.0 2600.0 2700.0 2900.0 3300.0 3400.0 -2100.0 2400.0 2700.0 2800.0 3300.0 3400.0 -2100.0 2200.0 2500.0 2700.0 3300.0 3400.0 -1900.0 2100.0 2400.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1500.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1200.0 1900.0 2400.0 2500.0 3300.0 3500.0 -1200.0 1600.0 2400.0 2500.0 3200.0 3400.0 -1700.0 2100.0 2600.0 2900.0 3300.0 3400.0 -1800.0 2200.0 2700.0 3000.0 3300.0 3400.0 -1800.0 2200.0 2800.0 3000.0 3300.0 3400.0 -1700.0 2100.0 2600.0 2900.0 3200.0 3400.0 -1700.0 2000.0 2600.0 2800.0 3200.0 3400.0 -1600.0 1800.0 2500.0 2700.0 3200.0 3400.0 -1500.0 1700.0 2500.0 2600.0 3200.0 3400.0 -1500.0 1700.0 2400.0 2600.0 3200.0 3300.0 -1500.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1500.0 1800.0 2300.0 2500.0 3200.0 3400.0 -1400.0 1800.0 2300.0 2500.0 3300.0 3400.0 -1400.0 1800.0 2300.0 2400.0 3200.0 3400.0 -1600.0 1900.0 2500.0 2600.0 3200.0 3400.0 -1500.0 1900.0 2600.0 2700.0 3200.0 3400.0 -1500.0 1900.0 2600.0 2700.0 3300.0 3400.0 -1400.0 1900.0 2600.0 2700.0 3300.0 3400.0 -1400.0 1900.0 2600.0 2700.0 3200.0 3400.0 -1500.0 1700.0 2600.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2600.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2700.0 2900.0 3200.0 3300.0 -2000.0 2100.0 2500.0 2700.0 3200.0 3400.0 -2000.0 2100.0 2400.0 2600.0 3100.0 3400.0 -2000.0 2100.0 2300.0 2600.0 3000.0 3300.0 -1900.0 2000.0 2300.0 2500.0 3000.0 3400.0 -1800.0 1900.0 2300.0 2400.0 3000.0 3400.0 -1600.0 1800.0 2300.0 2400.0 3000.0 3400.0 -1400.0 1700.0 2400.0 2500.0 2900.0 3400.0 -1300.0 1700.0 2400.0 2500.0 3100.0 3400.0 -1400.0 1700.0 2300.0 2600.0 3100.0 3300.0 -1200.0 1600.0 2400.0 2500.0 3200.0 3300.0 -1200.0 1600.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1400.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2600.0 3100.0 3200.0 -1800.0 1900.0 2400.0 2600.0 3000.0 3300.0 -2000.0 2300.0 2700.0 2900.0 3300.0 3400.0 -1900.0 2300.0 2900.0 3100.0 3400.0 3500.0 -1900.0 2100.0 2700.0 3000.0 3300.0 3400.0 -1800.0 1900.0 2300.0 2700.0 3100.0 3300.0 -1800.0 1900.0 2200.0 2500.0 3100.0 3300.0 -1700.0 1800.0 2100.0 2400.0 3000.0 3300.0 -1700.0 1800.0 2200.0 2400.0 3100.0 3300.0 -1400.0 1900.0 2100.0 2300.0 3200.0 3300.0 -1300.0 1800.0 2000.0 2300.0 3200.0 3300.0 -1300.0 1800.0 1900.0 2500.0 3200.0 3300.0 -1300.0 1900.0 2100.0 2600.0 3200.0 3300.0 -2000.0 2100.0 2400.0 2500.0 3100.0 3400.0 -2100.0 2200.0 2400.0 2500.0 3100.0 3400.0 -2100.0 2400.0 2800.0 2900.0 3100.0 3300.0 -2000.0 2200.0 2600.0 2900.0 3200.0 3300.0 -2100.0 2200.0 2700.0 2800.0 3200.0 3300.0 -2000.0 2100.0 2700.0 2800.0 3200.0 3300.0 -2000.0 2100.0 2600.0 2800.0 3200.0 3400.0 -1900.0 2000.0 2600.0 2700.0 3300.0 3400.0 -1800.0 1900.0 2500.0 2700.0 3300.0 3400.0 -2000.0 2100.0 2600.0 2700.0 3200.0 3300.0 -2000.0 2100.0 2600.0 2700.0 3100.0 3400.0 -1900.0 2100.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2000.0 2600.0 2700.0 3300.0 3400.0 -1800.0 2000.0 2600.0 2700.0 3300.0 3500.0 -1700.0 1900.0 2500.0 2700.0 3200.0 3400.0 -1800.0 2100.0 2700.0 2900.0 3200.0 3400.0 -1900.0 2200.0 2600.0 2900.0 3200.0 3300.0 -1900.0 2200.0 2700.0 2900.0 3200.0 3400.0 -1800.0 2200.0 2700.0 3000.0 3200.0 3400.0 -1800.0 2100.0 2700.0 2900.0 3300.0 3400.0 -1900.0 2200.0 2600.0 2900.0 3300.0 3500.0 -1700.0 2100.0 2500.0 2800.0 3400.0 3500.0 -1600.0 1900.0 2400.0 2600.0 3200.0 3400.0 -1600.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1700.0 2000.0 2400.0 2500.0 3200.0 3400.0 -1700.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1700.0 2000.0 2300.0 2400.0 2900.0 3200.0 -1900.0 2000.0 2600.0 2700.0 3100.0 3200.0 -1900.0 2000.0 2600.0 2700.0 3100.0 3400.0 -1800.0 2000.0 2600.0 2700.0 3100.0 3300.0 -1400.0 1800.0 2300.0 2600.0 3000.0 3200.0 -1300.0 1800.0 2200.0 2500.0 3100.0 3300.0 -1300.0 1900.0 2200.0 2600.0 3100.0 3300.0 -1400.0 1800.0 2100.0 2500.0 3000.0 3200.0 -1300.0 1600.0 1700.0 2500.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2400.0 3100.0 3200.0 -1300.0 1600.0 1800.0 2300.0 3100.0 3200.0 -1500.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1500.0 1900.0 2500.0 2600.0 3000.0 3200.0 -1800.0 2200.0 2600.0 2800.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2400.0 2700.0 3100.0 3300.0 -1800.0 1900.0 2500.0 2700.0 3100.0 3300.0 -1800.0 1900.0 2600.0 2700.0 3000.0 3300.0 -2100.0 2200.0 2600.0 2700.0 3200.0 3300.0 -2100.0 2200.0 2600.0 2700.0 3300.0 3400.0 -1900.0 2100.0 2300.0 2500.0 3300.0 3400.0 -1700.0 2100.0 2500.0 2800.0 3100.0 3300.0 -1600.0 2100.0 2500.0 2700.0 3100.0 3300.0 -1500.0 1900.0 2400.0 2700.0 3100.0 3300.0 -1200.0 1700.0 1800.0 2100.0 3200.0 3400.0 -1400.0 1700.0 1800.0 2200.0 3300.0 3400.0 -1600.0 1800.0 1900.0 2400.0 3200.0 3300.0 -1700.0 1900.0 2000.0 2500.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2400.0 2900.0 3100.0 -1800.0 2000.0 2200.0 2400.0 2800.0 3200.0 -1900.0 2100.0 2300.0 2600.0 2900.0 3300.0 -1900.0 2100.0 2300.0 2600.0 3200.0 3400.0 -2000.0 2100.0 2400.0 2500.0 3300.0 3400.0 -1800.0 1900.0 2400.0 2500.0 3200.0 3500.0 -1700.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1800.0 2000.0 2600.0 3000.0 3300.0 3400.0 -1900.0 2000.0 2500.0 2700.0 2900.0 3200.0 -1900.0 2000.0 2500.0 2700.0 2900.0 3100.0 -1900.0 2000.0 2400.0 2600.0 2900.0 3200.0 -1700.0 2000.0 2300.0 2600.0 2900.0 3200.0 -1800.0 2000.0 2300.0 2600.0 2900.0 3200.0 -1900.0 2000.0 2400.0 2600.0 2900.0 3300.0 -1900.0 2000.0 2400.0 2600.0 3000.0 3300.0 -1900.0 2000.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1800.0 2200.0 2600.0 3000.0 3300.0 -1600.0 1800.0 2200.0 2500.0 3000.0 3300.0 -1700.0 1900.0 2300.0 2600.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2600.0 3000.0 3200.0 -1800.0 1900.0 2400.0 2500.0 3000.0 3400.0 -1700.0 1800.0 2400.0 2500.0 3200.0 3400.0 -1600.0 1700.0 2400.0 2600.0 3100.0 3300.0 -1600.0 1700.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1600.0 2400.0 2500.0 3200.0 3400.0 -1400.0 1600.0 2400.0 2500.0 3200.0 3400.0 -1300.0 1600.0 2400.0 2500.0 3200.0 3300.0 -1400.0 2000.0 2500.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2200.0 2500.0 3000.0 3300.0 -1700.0 1900.0 2300.0 2500.0 3100.0 3300.0 -2000.0 2100.0 2400.0 2600.0 3100.0 3300.0 -2000.0 2200.0 2500.0 2600.0 3100.0 3300.0 -1900.0 2000.0 2400.0 2500.0 3200.0 3400.0 -2100.0 2200.0 2300.0 2400.0 3200.0 3400.0 -2000.0 2100.0 2300.0 2500.0 3000.0 3400.0 -1600.0 1800.0 2100.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2200.0 2700.0 3200.0 3300.0 -1800.0 1900.0 2400.0 2800.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2800.0 3200.0 3400.0 -1700.0 2100.0 2600.0 2900.0 3300.0 3500.0 -1800.0 2200.0 2600.0 2900.0 3300.0 3500.0 -1700.0 2200.0 2600.0 2900.0 3300.0 3400.0 -1700.0 2100.0 2500.0 2800.0 3200.0 3400.0 -1700.0 1900.0 2600.0 2700.0 3300.0 3400.0 -1700.0 1800.0 2600.0 2700.0 3100.0 3400.0 -1700.0 1800.0 2600.0 2700.0 3200.0 3400.0 -1700.0 1900.0 2700.0 2800.0 3200.0 3400.0 -1600.0 1900.0 2700.0 2800.0 3200.0 3300.0 -1400.0 1900.0 2800.0 2900.0 3200.0 3300.0 -1600.0 2000.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2600.0 2700.0 3200.0 3400.0 -1700.0 2000.0 2600.0 2700.0 3300.0 3400.0 -1700.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1700.0 1800.0 2500.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2000.0 2400.0 2800.0 3300.0 3400.0 -1600.0 1800.0 2100.0 2400.0 3100.0 3200.0 -1700.0 1800.0 2000.0 2700.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2700.0 3100.0 3200.0 -1800.0 2000.0 2200.0 2700.0 3100.0 3200.0 -1900.0 2000.0 2300.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2300.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2400.0 2700.0 3100.0 3200.0 -2000.0 2100.0 2400.0 2700.0 3100.0 3200.0 -2000.0 2200.0 2400.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1800.0 2100.0 2200.0 2600.0 3100.0 3200.0 -1600.0 2000.0 2200.0 2600.0 3100.0 3200.0 -1500.0 2000.0 2200.0 2700.0 3100.0 3200.0 -1500.0 1900.0 2200.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2200.0 2600.0 3100.0 3200.0 -1800.0 2100.0 2600.0 2700.0 3100.0 3300.0 -1700.0 2100.0 2600.0 2700.0 3100.0 3300.0 -1500.0 1800.0 2600.0 2700.0 3200.0 3400.0 -1200.0 1400.0 2500.0 2700.0 3200.0 3400.0 -1400.0 1700.0 2400.0 2600.0 3200.0 3400.0 -1400.0 1600.0 2400.0 2600.0 3100.0 3400.0 -1500.0 1700.0 2500.0 2600.0 3000.0 3300.0 -1600.0 1800.0 2500.0 2600.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2400.0 2600.0 3000.0 3400.0 -2000.0 2100.0 2500.0 2600.0 3000.0 3300.0 -2100.0 2200.0 2500.0 2600.0 3100.0 3400.0 -2200.0 2300.0 2500.0 2600.0 3100.0 3400.0 -1400.0 1900.0 2300.0 2400.0 2800.0 3200.0 -1400.0 1900.0 2300.0 2400.0 2700.0 3100.0 -1500.0 1700.0 2300.0 2400.0 2800.0 3200.0 -1600.0 1700.0 2100.0 2500.0 3000.0 3300.0 -1700.0 2000.0 2400.0 2800.0 3000.0 3300.0 -1800.0 2000.0 2600.0 2800.0 3100.0 3300.0 -1800.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1800.0 2000.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2000.0 2600.0 2700.0 3200.0 3300.0 -1800.0 2200.0 2600.0 2800.0 3200.0 3300.0 -1800.0 2100.0 2600.0 2800.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2700.0 3000.0 3300.0 -1800.0 1900.0 2500.0 2700.0 3000.0 3300.0 -1900.0 2000.0 2500.0 2700.0 3100.0 3300.0 -1900.0 2000.0 2500.0 2700.0 3100.0 3400.0 -1700.0 1900.0 2600.0 2800.0 3200.0 3400.0 -1600.0 1900.0 2600.0 2800.0 3300.0 3400.0 -1500.0 1800.0 2500.0 2700.0 3300.0 3400.0 -1500.0 1900.0 2400.0 2500.0 3200.0 3400.0 -1200.0 1800.0 2200.0 2300.0 3100.0 3200.0 -1400.0 1900.0 2300.0 2600.0 3000.0 3300.0 -1300.0 1400.0 2300.0 2400.0 2800.0 3100.0 -1300.0 1400.0 2300.0 2500.0 3000.0 3200.0 -1300.0 1600.0 2400.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2400.0 2500.0 2900.0 3200.0 -1500.0 1600.0 2400.0 2600.0 3000.0 3200.0 -1500.0 1700.0 2400.0 2600.0 2900.0 3200.0 -1600.0 1800.0 2400.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2500.0 2700.0 3000.0 3300.0 -1900.0 2100.0 2600.0 2700.0 3000.0 3300.0 -1900.0 2100.0 2500.0 2700.0 3000.0 3200.0 -2000.0 2100.0 2400.0 2700.0 3100.0 3300.0 -2000.0 2200.0 2400.0 2700.0 3100.0 3300.0 -1900.0 2300.0 2600.0 2700.0 3000.0 3200.0 -2000.0 2200.0 2500.0 2600.0 3000.0 3200.0 -1900.0 2000.0 2500.0 2600.0 3000.0 3300.0 -1800.0 2000.0 2400.0 2600.0 3000.0 3300.0 -1500.0 1900.0 2300.0 2500.0 2700.0 3000.0 -1500.0 2000.0 2400.0 2500.0 2700.0 3100.0 -1200.0 1900.0 2300.0 2500.0 2800.0 3000.0 -1300.0 1800.0 2200.0 2300.0 3100.0 3200.0 -1600.0 1900.0 2400.0 2500.0 3100.0 3200.0 -2100.0 2200.0 2600.0 2700.0 3100.0 3300.0 -2100.0 2200.0 2600.0 2700.0 3000.0 3300.0 -2000.0 2200.0 2600.0 2700.0 3100.0 3300.0 -2000.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2300.0 2400.0 3100.0 3300.0 -1500.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1600.0 1900.0 2400.0 2600.0 3100.0 3300.0 -1500.0 1800.0 2200.0 2600.0 3000.0 3200.0 -1500.0 1800.0 2100.0 2600.0 2900.0 3100.0 -1400.0 1700.0 1900.0 2300.0 2800.0 3000.0 -1500.0 1700.0 1900.0 2200.0 2800.0 2900.0 -1500.0 1700.0 2000.0 2200.0 2900.0 3000.0 -1500.0 1700.0 2100.0 2300.0 2900.0 3000.0 -1500.0 1800.0 2200.0 2300.0 3000.0 3100.0 -1500.0 1800.0 2200.0 2400.0 3000.0 3100.0 -1600.0 1800.0 2300.0 2400.0 3100.0 3200.0 -1600.0 1800.0 2300.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2400.0 2500.0 3100.0 3300.0 -1600.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1700.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1700.0 2300.0 2500.0 2900.0 3300.0 -1800.0 2100.0 2500.0 2600.0 3200.0 3300.0 -1900.0 2100.0 2400.0 2500.0 3100.0 3400.0 -1900.0 2100.0 2200.0 2500.0 3100.0 3300.0 -1700.0 1800.0 2200.0 2500.0 2900.0 3300.0 -1700.0 1800.0 2400.0 2500.0 3000.0 3300.0 -1600.0 1700.0 2400.0 2500.0 3100.0 3300.0 -1500.0 1700.0 2400.0 2500.0 3100.0 3300.0 -1400.0 1700.0 2500.0 2600.0 3100.0 3200.0 -1300.0 1600.0 2500.0 2600.0 3100.0 3200.0 -1200.0 1600.0 2500.0 2600.0 3100.0 3200.0 -1100.0 1700.0 2600.0 2700.0 3100.0 3200.0 -1100.0 1500.0 2600.0 2700.0 3100.0 3200.0 -1100.0 1500.0 2600.0 2700.0 3100.0 3300.0 -1100.0 1500.0 2500.0 2700.0 3000.0 3300.0 -1000.0 1600.0 2600.0 2700.0 3100.0 3300.0 -1300.0 1600.0 2600.0 2700.0 3100.0 3300.0 -1300.0 1600.0 2600.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2500.0 2600.0 3100.0 3300.0 -1700.0 1800.0 2500.0 2600.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1800.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2500.0 2700.0 3100.0 3400.0 -1800.0 2100.0 2500.0 2700.0 3100.0 3300.0 -1900.0 2200.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2200.0 2400.0 2600.0 3100.0 3300.0 -1900.0 2300.0 2500.0 2600.0 3100.0 3300.0 -1900.0 2000.0 2200.0 2400.0 3200.0 3300.0 -1600.0 1900.0 2200.0 2300.0 3200.0 3300.0 -1400.0 1600.0 2200.0 2400.0 3100.0 3200.0 -1100.0 1500.0 2300.0 2500.0 3000.0 3100.0 -1400.0 1700.0 2500.0 2700.0 3200.0 3300.0 -1500.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1800.0 2100.0 2500.0 2800.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2500.0 3200.0 3400.0 -1700.0 1900.0 2300.0 2500.0 3200.0 3400.0 -1800.0 2100.0 2500.0 2800.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2800.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2800.0 3100.0 3400.0 -1700.0 2100.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2100.0 2600.0 2700.0 3300.0 3500.0 -1900.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1600.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1400.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2400.0 3000.0 3100.0 -1300.0 1700.0 2300.0 2500.0 3000.0 3100.0 -1600.0 1700.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2300.0 2400.0 3100.0 3300.0 -2200.0 2300.0 2600.0 2800.0 3200.0 3400.0 -2100.0 2300.0 2500.0 2900.0 3200.0 3300.0 -2200.0 2300.0 2500.0 2900.0 3200.0 3300.0 -2000.0 2300.0 2500.0 2700.0 3200.0 3300.0 -2200.0 2400.0 2500.0 2700.0 3200.0 3300.0 -2200.0 2400.0 2600.0 2800.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2700.0 3000.0 3200.0 -1700.0 1900.0 2500.0 2700.0 3000.0 3200.0 -1700.0 1900.0 2600.0 2700.0 3100.0 3300.0 -1500.0 1800.0 2600.0 2700.0 3100.0 3300.0 -1600.0 1700.0 2600.0 2700.0 2900.0 3300.0 -1600.0 1700.0 2600.0 2800.0 3000.0 3300.0 -1700.0 2000.0 2700.0 2800.0 3100.0 3400.0 -1600.0 1900.0 2500.0 2700.0 3000.0 3300.0 -1800.0 2200.0 2800.0 2900.0 3300.0 3400.0 -2000.0 2500.0 2800.0 2900.0 3400.0 3500.0 -2000.0 2400.0 2800.0 2900.0 3400.0 3500.0 -2000.0 2300.0 2700.0 2800.0 3200.0 3400.0 -1600.0 1700.0 2400.0 2600.0 3200.0 3300.0 -1500.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1400.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1400.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1700.0 2500.0 2600.0 3100.0 3300.0 -1300.0 1500.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1400.0 2400.0 2500.0 3100.0 3300.0 -1200.0 1500.0 2400.0 2500.0 3100.0 3300.0 -1200.0 1600.0 2400.0 2500.0 3100.0 3300.0 -1200.0 1700.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1700.0 2500.0 2600.0 3200.0 3300.0 -1200.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1200.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1200.0 1800.0 2400.0 2500.0 3100.0 3300.0 -1200.0 1700.0 2400.0 2500.0 3100.0 3200.0 -1200.0 1600.0 2400.0 2500.0 3000.0 3200.0 -1200.0 1600.0 2400.0 2500.0 2900.0 3100.0 -1200.0 1700.0 2400.0 2500.0 3000.0 3300.0 -1300.0 1700.0 2400.0 2500.0 3100.0 3300.0 -1200.0 1700.0 2400.0 2500.0 3000.0 3100.0 -1200.0 1700.0 2300.0 2400.0 3000.0 3100.0 -1600.0 2000.0 2300.0 2600.0 3000.0 3300.0 -1400.0 1600.0 1900.0 2200.0 3000.0 3100.0 -1400.0 1600.0 1800.0 2100.0 3000.0 3100.0 -1300.0 1500.0 1600.0 2000.0 3100.0 3200.0 -1300.0 1500.0 1700.0 1900.0 3100.0 3200.0 -1400.0 1600.0 1700.0 1900.0 3100.0 3200.0 -1600.0 1700.0 2000.0 2100.0 3100.0 3200.0 -1600.0 1800.0 2100.0 2200.0 3100.0 3200.0 -1800.0 1900.0 2300.0 2400.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2700.0 3100.0 3400.0 -1900.0 2000.0 2500.0 2600.0 3000.0 3400.0 -1800.0 2100.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2300.0 2600.0 2800.0 3300.0 3500.0 -1600.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2500.0 2600.0 3100.0 3300.0 -1300.0 1800.0 2500.0 2600.0 3100.0 3300.0 -1400.0 1800.0 2600.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2500.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1900.0 2000.0 2500.0 2700.0 2900.0 3300.0 -2000.0 2100.0 2400.0 2600.0 2900.0 3200.0 -2000.0 2100.0 2400.0 2600.0 3000.0 3300.0 -2100.0 2200.0 2400.0 2600.0 3000.0 3300.0 -2000.0 2100.0 2500.0 2600.0 3100.0 3400.0 -1900.0 2000.0 2400.0 2600.0 3000.0 3400.0 -1800.0 1900.0 2300.0 2500.0 2900.0 3400.0 -1700.0 1800.0 2500.0 2700.0 3100.0 3400.0 -1700.0 1900.0 2500.0 2700.0 3100.0 3400.0 -1800.0 1900.0 2700.0 2800.0 3200.0 3400.0 -2100.0 2200.0 2600.0 2800.0 3100.0 3400.0 -2200.0 2300.0 2600.0 2800.0 3100.0 3400.0 -1800.0 2300.0 2500.0 2700.0 3100.0 3300.0 -1500.0 2000.0 2400.0 2500.0 2800.0 3100.0 -1600.0 2000.0 2400.0 2500.0 2800.0 3100.0 -1600.0 2000.0 2400.0 2500.0 2800.0 3200.0 -1600.0 2000.0 2400.0 2500.0 2900.0 3300.0 -1800.0 2200.0 2500.0 2600.0 3000.0 3300.0 -2100.0 2300.0 2500.0 2600.0 3100.0 3300.0 -2100.0 2200.0 2600.0 2700.0 3100.0 3200.0 -1800.0 1900.0 2600.0 2700.0 3100.0 3200.0 -1800.0 1900.0 2600.0 2700.0 3100.0 3300.0 -1700.0 1800.0 2600.0 2700.0 3100.0 3300.0 -1700.0 1800.0 2600.0 2700.0 3200.0 3300.0 -1600.0 1700.0 2600.0 2700.0 3200.0 3400.0 -1600.0 1700.0 2500.0 2700.0 3200.0 3300.0 -1500.0 1800.0 2400.0 2500.0 3000.0 3300.0 -1500.0 1900.0 2300.0 2500.0 3000.0 3200.0 -1700.0 2100.0 2300.0 2600.0 3100.0 3300.0 -1800.0 2000.0 2700.0 2800.0 3100.0 3300.0 -1700.0 1800.0 2500.0 2700.0 2900.0 3300.0 -1600.0 1800.0 2500.0 2700.0 3000.0 3300.0 -1700.0 1800.0 2400.0 2600.0 3100.0 3300.0 -1700.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1800.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2500.0 3200.0 3300.0 -2000.0 2100.0 2300.0 2500.0 3200.0 3400.0 -2000.0 2100.0 2200.0 2400.0 3200.0 3400.0 -2000.0 2100.0 2300.0 2400.0 3100.0 3400.0 -1700.0 1900.0 2400.0 2500.0 3200.0 3400.0 -1700.0 1900.0 2400.0 2500.0 3100.0 3400.0 -1700.0 1800.0 2400.0 2600.0 3300.0 3400.0 -1700.0 1800.0 2500.0 2600.0 3300.0 3400.0 -1600.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1700.0 1900.0 2600.0 2800.0 3100.0 3300.0 -1700.0 2100.0 2600.0 2700.0 3300.0 3400.0 -1800.0 2000.0 2400.0 2500.0 3100.0 3300.0 -2000.0 2100.0 2300.0 2400.0 3200.0 3400.0 -1400.0 1900.0 2300.0 2400.0 3000.0 3300.0 -1400.0 2000.0 2300.0 2500.0 3000.0 3100.0 -1400.0 1700.0 2500.0 2600.0 3100.0 3300.0 -1300.0 1600.0 2400.0 2600.0 3100.0 3300.0 -1300.0 1600.0 2400.0 2500.0 3200.0 3400.0 -1500.0 2000.0 2500.0 2700.0 3200.0 3400.0 -1800.0 2100.0 2500.0 2900.0 3200.0 3400.0 -1800.0 2200.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2000.0 2500.0 2900.0 3300.0 3400.0 -1700.0 2100.0 2600.0 2900.0 3400.0 3500.0 -1500.0 1900.0 2400.0 2800.0 3300.0 3400.0 -1800.0 2100.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2000.0 2600.0 2800.0 3300.0 3400.0 -1700.0 2100.0 2600.0 2800.0 3200.0 3400.0 -1900.0 2200.0 2600.0 2800.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2800.0 3200.0 3300.0 -1800.0 2100.0 2700.0 2800.0 3300.0 3400.0 -1700.0 2100.0 2700.0 2800.0 3200.0 3400.0 -1800.0 2200.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2200.0 2600.0 2700.0 3300.0 3400.0 -1800.0 2300.0 2600.0 2700.0 3300.0 3400.0 -1900.0 2300.0 2500.0 2700.0 3300.0 3400.0 -1800.0 2200.0 2500.0 2800.0 3200.0 3400.0 -1800.0 2200.0 2500.0 2700.0 3100.0 3300.0 -1700.0 2200.0 2400.0 2600.0 3100.0 3200.0 -1800.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1800.0 2000.0 2200.0 2500.0 3300.0 3400.0 -1800.0 2000.0 2200.0 2600.0 3300.0 3400.0 -1500.0 1800.0 1900.0 2400.0 3200.0 3300.0 -1500.0 1700.0 1900.0 2500.0 3200.0 3300.0 -1500.0 1800.0 1900.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2400.0 3300.0 3400.0 -1500.0 1700.0 2200.0 2600.0 3000.0 3200.0 -1400.0 1700.0 2000.0 2600.0 3000.0 3200.0 -1500.0 1900.0 2400.0 2600.0 3100.0 3200.0 -1400.0 1900.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1600.0 2500.0 2700.0 3100.0 3300.0 -1200.0 1800.0 2500.0 2600.0 3100.0 3200.0 -1400.0 1800.0 2300.0 2400.0 3100.0 3200.0 -1400.0 1700.0 2200.0 2300.0 3200.0 3300.0 -1800.0 1900.0 2200.0 2300.0 3300.0 3400.0 -1800.0 2100.0 2300.0 2400.0 2900.0 3200.0 -1900.0 2100.0 2300.0 2500.0 3000.0 3300.0 -1900.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1600.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1700.0 2300.0 2400.0 3200.0 3300.0 -1500.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1600.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2200.0 2500.0 2700.0 3300.0 3400.0 -1800.0 2300.0 2500.0 2700.0 3300.0 3400.0 -1800.0 2400.0 2500.0 2900.0 3300.0 3400.0 -1900.0 2400.0 2600.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2700.0 3000.0 3400.0 3500.0 -1800.0 2100.0 2500.0 2900.0 3200.0 3300.0 -1700.0 2100.0 2500.0 2900.0 3200.0 3400.0 -1800.0 2100.0 2600.0 2800.0 3100.0 3400.0 -1800.0 2200.0 2700.0 2800.0 3200.0 3400.0 -1800.0 2300.0 2700.0 2900.0 3300.0 3500.0 -1400.0 2000.0 2600.0 2700.0 3200.0 3400.0 -1300.0 1800.0 2200.0 2300.0 3000.0 3100.0 -1300.0 1700.0 2100.0 2200.0 3100.0 3200.0 -1400.0 1700.0 2000.0 2200.0 3000.0 3100.0 -1400.0 1600.0 2000.0 2100.0 3000.0 3100.0 -1500.0 1800.0 2000.0 2300.0 3100.0 3200.0 -1600.0 1800.0 2000.0 2300.0 3100.0 3200.0 -1600.0 1800.0 2000.0 2200.0 3100.0 3200.0 -1700.0 2000.0 2200.0 2300.0 3000.0 3200.0 -1700.0 2100.0 2400.0 2800.0 3100.0 3300.0 -1800.0 2000.0 2600.0 2800.0 3000.0 3200.0 -1700.0 1900.0 2600.0 2700.0 3200.0 3400.0 -1600.0 1700.0 2400.0 2600.0 3200.0 3400.0 -1600.0 1700.0 2400.0 2500.0 3200.0 3400.0 -1700.0 2100.0 2500.0 2800.0 3200.0 3300.0 -1700.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1700.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2200.0 2500.0 3100.0 3300.0 -1500.0 1900.0 2100.0 2400.0 3100.0 3300.0 -1500.0 1600.0 2000.0 2300.0 3000.0 3200.0 -1500.0 1700.0 2100.0 2500.0 3100.0 3300.0 -1600.0 1800.0 2300.0 2700.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2600.0 3100.0 3200.0 -1500.0 1700.0 2300.0 2500.0 3000.0 3200.0 -1400.0 1700.0 2400.0 2500.0 3000.0 3200.0 -1200.0 1500.0 2500.0 2600.0 3000.0 3100.0 -1100.0 1900.0 2600.0 2700.0 3000.0 3100.0 -1500.0 2000.0 2700.0 2800.0 3200.0 3400.0 -1700.0 2100.0 2700.0 2800.0 3300.0 3400.0 -1800.0 2200.0 2700.0 2800.0 3300.0 3400.0 -1800.0 2400.0 2700.0 2800.0 3200.0 3300.0 -1800.0 2300.0 2500.0 2600.0 3100.0 3200.0 -1500.0 1800.0 2100.0 2400.0 3000.0 3200.0 -1400.0 1600.0 1800.0 2200.0 3000.0 3100.0 -1300.0 1600.0 1700.0 2100.0 3000.0 3100.0 -1200.0 1400.0 1600.0 2400.0 3000.0 3100.0 -1300.0 1500.0 1600.0 2100.0 3000.0 3100.0 -1400.0 1600.0 1700.0 2100.0 3000.0 3100.0 -1400.0 1700.0 2100.0 2300.0 3100.0 3200.0 -1400.0 1700.0 2200.0 2300.0 3100.0 3200.0 -1400.0 1600.0 2200.0 2300.0 3100.0 3200.0 -1400.0 1700.0 2200.0 2400.0 3100.0 3200.0 -1400.0 1700.0 2300.0 2400.0 3100.0 3200.0 -1400.0 1600.0 2300.0 2400.0 3100.0 3200.0 -1400.0 1600.0 2200.0 2300.0 3000.0 3200.0 -1500.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1700.0 2000.0 2700.0 2800.0 3200.0 3400.0 -2100.0 2400.0 2800.0 2900.0 3200.0 3400.0 -2000.0 2500.0 2700.0 2800.0 3400.0 3500.0 -2100.0 2600.0 2800.0 2900.0 3400.0 3500.0 -2000.0 2500.0 2700.0 2800.0 3300.0 3400.0 -1900.0 2100.0 2700.0 2800.0 3200.0 3400.0 -2100.0 2200.0 2700.0 2800.0 3200.0 3400.0 -2100.0 2200.0 2700.0 2900.0 3300.0 3400.0 -2200.0 2300.0 2700.0 2800.0 3200.0 3400.0 -1700.0 2100.0 2400.0 2700.0 3200.0 3400.0 -1600.0 2100.0 2400.0 2600.0 2900.0 3200.0 -1500.0 2100.0 2400.0 2500.0 2800.0 3100.0 -1600.0 2100.0 2400.0 2500.0 2800.0 3200.0 -1600.0 2100.0 2400.0 2500.0 2900.0 3200.0 -1600.0 2100.0 2400.0 2500.0 3000.0 3200.0 -1600.0 2100.0 2300.0 2500.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2600.0 3100.0 3300.0 -1700.0 1900.0 2300.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2500.0 3100.0 3300.0 -1800.0 1900.0 2400.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2200.0 2500.0 3100.0 3300.0 -1500.0 1700.0 1900.0 2200.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2100.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2300.0 3200.0 3300.0 -1500.0 1700.0 1900.0 2400.0 3200.0 3300.0 -1500.0 1700.0 1800.0 2400.0 3200.0 3300.0 -1500.0 1700.0 1900.0 2200.0 3200.0 3300.0 -1500.0 1700.0 1900.0 2100.0 3200.0 3300.0 -1500.0 1600.0 1900.0 2000.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2100.0 3200.0 3300.0 -1600.0 1700.0 2000.0 2100.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2300.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2500.0 3100.0 3200.0 -1700.0 2000.0 2400.0 2600.0 3000.0 3100.0 -1700.0 2100.0 2400.0 2600.0 3000.0 3100.0 -1600.0 2000.0 2400.0 2600.0 2900.0 3100.0 -1800.0 2200.0 2600.0 2800.0 3000.0 3200.0 -2000.0 2400.0 2500.0 2800.0 3100.0 3200.0 -2100.0 2500.0 2600.0 2800.0 3200.0 3300.0 -2200.0 2500.0 2700.0 3000.0 3200.0 3300.0 -2100.0 2500.0 2700.0 3000.0 3200.0 3300.0 -2200.0 2500.0 2600.0 3000.0 3200.0 3300.0 -2200.0 2500.0 2600.0 2900.0 3200.0 3300.0 -2200.0 2400.0 2600.0 2800.0 3100.0 3300.0 -2000.0 2300.0 2500.0 2700.0 3100.0 3200.0 -2000.0 2200.0 2500.0 2700.0 3100.0 3200.0 -2000.0 2300.0 2500.0 2800.0 3100.0 3200.0 -2000.0 2300.0 2400.0 2800.0 3100.0 3200.0 -2100.0 2200.0 2500.0 2800.0 3100.0 3200.0 -2000.0 2100.0 2500.0 2800.0 3200.0 3300.0 -1900.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2400.0 3100.0 3300.0 -1500.0 1600.0 1800.0 2100.0 3200.0 3300.0 -1500.0 1700.0 1800.0 2100.0 3200.0 3300.0 -1500.0 1700.0 1800.0 2300.0 3200.0 3300.0 -2000.0 2200.0 2400.0 2600.0 3000.0 3200.0 -2000.0 2400.0 2600.0 2800.0 3100.0 3300.0 -2000.0 2400.0 2500.0 2700.0 3100.0 3300.0 -1800.0 2200.0 2500.0 2600.0 3100.0 3300.0 -1600.0 1800.0 2400.0 2500.0 3000.0 3200.0 -1500.0 1800.0 2400.0 2500.0 3000.0 3100.0 -1800.0 2000.0 2200.0 2700.0 3000.0 3300.0 -1600.0 1900.0 2100.0 2600.0 3000.0 3200.0 -1500.0 1700.0 1900.0 2300.0 3000.0 3100.0 -1500.0 1700.0 1900.0 2200.0 3000.0 3100.0 -1600.0 1700.0 2200.0 2400.0 2900.0 3000.0 -1600.0 1800.0 2200.0 2400.0 2900.0 3000.0 -1800.0 2300.0 2600.0 2700.0 3200.0 3400.0 -1800.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1800.0 1900.0 2400.0 2600.0 3300.0 3400.0 -1700.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1600.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2400.0 2600.0 3100.0 3200.0 -2000.0 2100.0 2500.0 2600.0 3200.0 3300.0 -2100.0 2200.0 2400.0 2600.0 3200.0 3400.0 -1700.0 2000.0 2400.0 2600.0 3100.0 3400.0 -1700.0 1800.0 2400.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1600.0 1900.0 2200.0 2500.0 3000.0 3100.0 -1500.0 1800.0 2000.0 2300.0 3000.0 3100.0 -1500.0 1700.0 1900.0 2100.0 2900.0 3000.0 -1400.0 1600.0 2400.0 2700.0 2900.0 3100.0 -1400.0 1600.0 2300.0 2600.0 3000.0 3100.0 -1500.0 1600.0 2300.0 2500.0 2900.0 3100.0 -1600.0 1700.0 2400.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2400.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2400.0 2600.0 3100.0 3200.0 -1700.0 2100.0 2400.0 2600.0 3100.0 3200.0 -1600.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2200.0 2300.0 3100.0 3300.0 -1400.0 1600.0 2200.0 2300.0 3200.0 3300.0 -1300.0 1800.0 2300.0 2500.0 3300.0 3400.0 -1200.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1200.0 1700.0 2400.0 2500.0 3300.0 3400.0 -1500.0 1700.0 2300.0 2500.0 3100.0 3200.0 -1900.0 2000.0 2300.0 2400.0 3200.0 3300.0 -2200.0 2300.0 2500.0 2700.0 3200.0 3300.0 -2100.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1300.0 1900.0 2300.0 2400.0 3100.0 3300.0 -1800.0 2000.0 2400.0 2700.0 3200.0 3300.0 -1500.0 2000.0 2300.0 2400.0 3000.0 3300.0 -1600.0 2000.0 2400.0 2700.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2600.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2600.0 3000.0 3300.0 -1800.0 2100.0 2400.0 2500.0 3100.0 3300.0 -1700.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1600.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1500.0 1800.0 2200.0 2300.0 3200.0 3400.0 -1400.0 1600.0 2200.0 2300.0 3200.0 3400.0 -1300.0 1500.0 2200.0 2300.0 3200.0 3300.0 -1200.0 1600.0 2300.0 2400.0 3300.0 3400.0 -1200.0 1500.0 2300.0 2400.0 3200.0 3400.0 -1200.0 1400.0 2300.0 2400.0 3100.0 3400.0 -1300.0 1500.0 2400.0 2500.0 3200.0 3400.0 -1700.0 2300.0 2600.0 2700.0 3300.0 3400.0 -1800.0 2400.0 2700.0 3000.0 3300.0 3400.0 -1800.0 2300.0 2700.0 2800.0 3200.0 3300.0 -1800.0 2200.0 2500.0 2600.0 3300.0 3400.0 -1700.0 1900.0 2400.0 2600.0 3200.0 3400.0 -1700.0 1800.0 2200.0 2500.0 3200.0 3400.0 -1500.0 1700.0 2300.0 2500.0 3100.0 3300.0 -1400.0 1700.0 2200.0 2400.0 3000.0 3200.0 -1300.0 1600.0 2200.0 2300.0 3000.0 3100.0 -1300.0 1900.0 2200.0 2400.0 2900.0 3100.0 -1400.0 1900.0 2300.0 2400.0 3000.0 3100.0 -1400.0 1900.0 2300.0 2500.0 2900.0 3100.0 -1400.0 1800.0 2400.0 2600.0 2800.0 3100.0 -1600.0 2000.0 2500.0 2700.0 3100.0 3300.0 -1500.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1500.0 2100.0 2600.0 2900.0 3300.0 3400.0 -1800.0 2300.0 2600.0 2800.0 3300.0 3400.0 -1700.0 2200.0 2600.0 2700.0 3300.0 3400.0 -2000.0 2200.0 2500.0 2700.0 3000.0 3100.0 -2000.0 2300.0 2600.0 2800.0 3100.0 3200.0 -2100.0 2400.0 2500.0 2900.0 3200.0 3300.0 -2100.0 2300.0 2500.0 2800.0 3100.0 3200.0 -1900.0 2200.0 2300.0 2700.0 3100.0 3200.0 -1200.0 1900.0 2000.0 2300.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2100.0 3200.0 3300.0 -1400.0 1600.0 1700.0 2100.0 3200.0 3300.0 -1400.0 1600.0 1700.0 2200.0 3200.0 3300.0 -1600.0 1700.0 2200.0 2600.0 2900.0 3100.0 -1900.0 2300.0 2700.0 2900.0 3200.0 3300.0 -1700.0 2100.0 2700.0 2900.0 3200.0 3400.0 -1800.0 2100.0 2700.0 2800.0 3100.0 3400.0 -1800.0 2100.0 2600.0 2800.0 3000.0 3200.0 -1800.0 2100.0 2700.0 2800.0 3200.0 3400.0 -1400.0 1600.0 2600.0 2700.0 3000.0 3300.0 -1400.0 1500.0 2600.0 2700.0 3000.0 3400.0 -1300.0 1400.0 2400.0 2800.0 3000.0 3300.0 -1800.0 2200.0 2600.0 2900.0 3200.0 3400.0 -1600.0 2100.0 2600.0 2900.0 3200.0 3400.0 -1200.0 1700.0 2500.0 2600.0 3000.0 3100.0 -1200.0 1800.0 2300.0 2600.0 3000.0 3100.0 -1200.0 1800.0 2300.0 2500.0 3000.0 3100.0 -1300.0 1700.0 2400.0 2500.0 3000.0 3100.0 -1500.0 1800.0 2400.0 2500.0 2900.0 3000.0 -1600.0 2300.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2200.0 2700.0 2900.0 3100.0 3200.0 -1900.0 2200.0 2800.0 2900.0 3100.0 3200.0 -1900.0 2300.0 2800.0 2900.0 3200.0 3300.0 -2200.0 2500.0 2800.0 3000.0 3300.0 3400.0 -2100.0 2500.0 2800.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2700.0 2800.0 3300.0 3500.0 -1900.0 2200.0 2600.0 2800.0 3300.0 3400.0 -1900.0 2100.0 2700.0 2800.0 3300.0 3400.0 -1700.0 1900.0 2600.0 2700.0 3000.0 3300.0 -1600.0 1700.0 2500.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2600.0 2800.0 3100.0 3300.0 -1800.0 1900.0 2500.0 2800.0 3000.0 3300.0 -1900.0 2000.0 2600.0 2800.0 3100.0 3400.0 -2000.0 2100.0 2500.0 2700.0 3000.0 3300.0 -2100.0 2200.0 2500.0 2700.0 3000.0 3300.0 -2100.0 2200.0 2500.0 2800.0 3000.0 3300.0 -2000.0 2100.0 2400.0 2700.0 2900.0 3200.0 -1900.0 2000.0 2400.0 2600.0 2800.0 3100.0 -1700.0 2000.0 2500.0 2700.0 3100.0 3300.0 -1700.0 2100.0 2700.0 2800.0 3100.0 3300.0 -1500.0 1700.0 2400.0 2600.0 3100.0 3400.0 -1500.0 1600.0 2400.0 2500.0 3000.0 3300.0 -1400.0 1600.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1500.0 2300.0 2600.0 3100.0 3300.0 -1500.0 1600.0 2400.0 2600.0 2900.0 3200.0 -1600.0 1700.0 2300.0 2600.0 3000.0 3200.0 -1600.0 1700.0 2300.0 2700.0 3000.0 3200.0 -1700.0 1800.0 2400.0 2600.0 3000.0 3200.0 -1600.0 1700.0 2300.0 2500.0 3100.0 3200.0 -1500.0 1600.0 2200.0 2400.0 3100.0 3200.0 -1300.0 1800.0 2200.0 2400.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2400.0 3000.0 3200.0 -1200.0 1700.0 2300.0 2400.0 2900.0 3100.0 -1200.0 1800.0 2400.0 2500.0 2900.0 3200.0 -1200.0 1800.0 2300.0 2500.0 3100.0 3200.0 -1300.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1300.0 1700.0 2400.0 2500.0 3200.0 3300.0 -1200.0 1700.0 2400.0 2500.0 3200.0 3300.0 -1200.0 1500.0 2400.0 2500.0 3200.0 3300.0 -1900.0 2100.0 2500.0 2800.0 3100.0 3300.0 -1800.0 2000.0 2400.0 2700.0 3000.0 3300.0 -1800.0 2000.0 2300.0 2600.0 3000.0 3300.0 -1900.0 2000.0 2300.0 2400.0 3200.0 3500.0 -1900.0 2000.0 2300.0 2400.0 3100.0 3400.0 -1800.0 2000.0 2300.0 2500.0 3200.0 3400.0 -1700.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1800.0 2100.0 2500.0 2800.0 3100.0 3400.0 -1800.0 2000.0 2500.0 2800.0 3100.0 3300.0 -1800.0 2100.0 2500.0 2600.0 3100.0 3300.0 -1700.0 2100.0 2500.0 2700.0 3100.0 3400.0 -1600.0 1700.0 2500.0 2600.0 3200.0 3300.0 -1500.0 2200.0 2400.0 2700.0 3200.0 3300.0 -1400.0 2000.0 2300.0 2700.0 3300.0 3400.0 -1400.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2400.0 2600.0 3100.0 3300.0 -1600.0 2000.0 2300.0 2600.0 3300.0 3400.0 -1600.0 2100.0 2300.0 2600.0 3300.0 3400.0 -1700.0 1900.0 2300.0 2600.0 3300.0 3400.0 -1900.0 2000.0 2300.0 2400.0 3300.0 3400.0 -1900.0 2000.0 2200.0 2400.0 3300.0 3400.0 -1700.0 1800.0 2200.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2100.0 2500.0 3000.0 3200.0 -1500.0 1700.0 2100.0 2500.0 3000.0 3200.0 -1500.0 1600.0 2100.0 2500.0 3000.0 3200.0 -1500.0 1700.0 2200.0 2700.0 3100.0 3200.0 -1600.0 1900.0 2300.0 2700.0 3200.0 3300.0 -1500.0 1700.0 1800.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2100.0 2500.0 3100.0 3300.0 -2000.0 2300.0 2700.0 2800.0 3100.0 3300.0 -2200.0 2500.0 2900.0 3000.0 3200.0 3300.0 -2300.0 2500.0 2900.0 3000.0 3200.0 3300.0 -1400.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1600.0 2000.0 2300.0 2700.0 3200.0 3300.0 -1500.0 1900.0 2000.0 2400.0 3200.0 3300.0 -1300.0 1800.0 2000.0 2400.0 3300.0 3400.0 -1400.0 1900.0 2200.0 2500.0 3200.0 3300.0 -1800.0 2200.0 2600.0 3000.0 3300.0 3400.0 -1900.0 2200.0 2800.0 2900.0 3300.0 3400.0 -2000.0 2500.0 2900.0 3100.0 3200.0 3300.0 -2000.0 2400.0 2900.0 3000.0 3300.0 3400.0 -2100.0 2400.0 2800.0 3000.0 3200.0 3300.0 -2000.0 2400.0 2700.0 2900.0 3200.0 3300.0 -1700.0 2100.0 2600.0 2800.0 3200.0 3300.0 -1500.0 1900.0 2300.0 2700.0 3100.0 3300.0 -1500.0 1800.0 2200.0 2600.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2500.0 3200.0 3400.0 -1100.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1000.0 2100.0 2500.0 2700.0 3200.0 3300.0 -1000.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1000.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1100.0 1900.0 2400.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2400.0 2700.0 3100.0 3400.0 -1700.0 2100.0 2500.0 2700.0 3000.0 3200.0 -2000.0 2200.0 2600.0 2800.0 3100.0 3300.0 -2100.0 2200.0 2600.0 2800.0 3100.0 3300.0 -1900.0 2100.0 2400.0 2700.0 3100.0 3300.0 -1900.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1800.0 1900.0 2200.0 2600.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2600.0 3100.0 3200.0 -1400.0 1500.0 1800.0 2800.0 3200.0 3300.0 -1300.0 1500.0 1700.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2400.0 2700.0 3100.0 3200.0 -1600.0 1900.0 2400.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2300.0 2700.0 3000.0 3200.0 -1700.0 1900.0 2200.0 2600.0 3000.0 3200.0 -1200.0 1600.0 1800.0 2000.0 3100.0 3400.0 -1100.0 1600.0 2400.0 2500.0 3000.0 3300.0 -1400.0 1700.0 2300.0 2400.0 2900.0 3200.0 -1700.0 2000.0 2300.0 2700.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2400.0 3000.0 3400.0 -1700.0 1800.0 2300.0 2400.0 2900.0 3400.0 -1700.0 1800.0 2300.0 2400.0 2800.0 3300.0 -1800.0 1900.0 2300.0 2400.0 2800.0 3200.0 -1800.0 1900.0 2300.0 2400.0 3000.0 3300.0 -1800.0 1900.0 2300.0 2400.0 2900.0 3300.0 -1700.0 1800.0 2200.0 2300.0 2600.0 3200.0 -1700.0 1800.0 2200.0 2300.0 2700.0 3200.0 -1700.0 1800.0 2300.0 2400.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2400.0 3100.0 3400.0 -1700.0 1800.0 2200.0 2400.0 3200.0 3400.0 -1700.0 1900.0 2200.0 2400.0 3300.0 3400.0 -1800.0 1900.0 2200.0 2400.0 3200.0 3400.0 -1800.0 1900.0 2300.0 2400.0 3200.0 3400.0 -1800.0 1900.0 2300.0 2400.0 3100.0 3400.0 -1800.0 2000.0 2200.0 2400.0 3200.0 3300.0 -1800.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1700.0 1800.0 2000.0 2200.0 3200.0 3300.0 -1400.0 1700.0 1800.0 2200.0 3200.0 3300.0 -1400.0 1800.0 2100.0 2500.0 3100.0 3300.0 -1500.0 1800.0 2200.0 2700.0 3100.0 3200.0 -1600.0 2000.0 2300.0 2500.0 2900.0 3200.0 -1800.0 2200.0 2500.0 2700.0 3000.0 3300.0 -2000.0 2400.0 2700.0 2800.0 3100.0 3300.0 -2200.0 2500.0 2800.0 2900.0 3200.0 3300.0 -1500.0 2300.0 2500.0 2900.0 3300.0 3400.0 -1500.0 1700.0 2300.0 2600.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2600.0 3000.0 3300.0 -1600.0 1700.0 2200.0 2300.0 3200.0 3400.0 -1600.0 1700.0 2200.0 2300.0 3300.0 3400.0 -1200.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1000.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1000.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1300.0 1700.0 2200.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2500.0 2700.0 3000.0 3200.0 -1300.0 1900.0 2400.0 2700.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2700.0 3100.0 3200.0 -1700.0 2100.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2400.0 2500.0 3200.0 3400.0 -1600.0 2000.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2300.0 2400.0 3000.0 3200.0 -1500.0 1900.0 2200.0 2300.0 3000.0 3200.0 -1500.0 2000.0 2200.0 2400.0 3100.0 3200.0 -1400.0 2000.0 2200.0 2400.0 3100.0 3200.0 -1300.0 2000.0 2200.0 2500.0 3100.0 3200.0 -1100.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1000.0 2000.0 2400.0 2500.0 3100.0 3200.0 -1000.0 1700.0 2400.0 2500.0 3100.0 3200.0 -1000.0 1600.0 2400.0 2500.0 3100.0 3200.0 -1100.0 1600.0 2400.0 2500.0 3100.0 3200.0 -1100.0 1600.0 2400.0 2600.0 3100.0 3200.0 -1100.0 1600.0 2500.0 2600.0 3200.0 3300.0 -1100.0 1500.0 2500.0 2600.0 3200.0 3300.0 -1100.0 1500.0 2500.0 2600.0 3100.0 3200.0 -1200.0 1400.0 2400.0 2600.0 3100.0 3200.0 -1300.0 1700.0 2300.0 2400.0 3200.0 3300.0 -1300.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2400.0 3200.0 3300.0 -1400.0 1900.0 2300.0 2400.0 3100.0 3300.0 -1500.0 1700.0 2300.0 2400.0 3000.0 3200.0 -1500.0 1700.0 2300.0 2400.0 3000.0 3300.0 -2100.0 2300.0 2800.0 3000.0 3300.0 3400.0 -2200.0 2400.0 2900.0 3000.0 3200.0 3300.0 -2100.0 2300.0 2900.0 3000.0 3300.0 3400.0 -2000.0 2300.0 2600.0 3000.0 3200.0 3300.0 -1300.0 1600.0 2200.0 2600.0 3100.0 3300.0 -1000.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1000.0 2100.0 2400.0 2600.0 3300.0 3400.0 -1300.0 1700.0 1900.0 2100.0 3100.0 3200.0 -1500.0 1800.0 2000.0 2400.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2100.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2500.0 3300.0 3400.0 -1700.0 1900.0 2100.0 2500.0 2900.0 3200.0 -1600.0 1900.0 2100.0 2300.0 2800.0 3200.0 -1200.0 1700.0 2200.0 2600.0 3000.0 3300.0 -1200.0 1700.0 2300.0 2600.0 3100.0 3300.0 -1600.0 2100.0 2400.0 2700.0 3100.0 3300.0 -1500.0 2000.0 2400.0 2600.0 3100.0 3400.0 -2100.0 2200.0 2700.0 3000.0 3200.0 3300.0 -2100.0 2200.0 2700.0 2900.0 3100.0 3300.0 -1500.0 1800.0 2200.0 2600.0 2900.0 3200.0 -1400.0 1600.0 1800.0 2900.0 3200.0 3300.0 -1600.0 1700.0 1900.0 2500.0 3100.0 3200.0 -1700.0 1800.0 2000.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2600.0 3100.0 3200.0 -1700.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1700.0 1800.0 2200.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2300.0 3100.0 3200.0 -2300.0 2500.0 2800.0 2900.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2800.0 3200.0 3300.0 -1500.0 1900.0 2300.0 2700.0 3200.0 3300.0 -1500.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1600.0 1900.0 2200.0 2500.0 3200.0 3300.0 -1600.0 1900.0 2200.0 2400.0 3100.0 3300.0 -1600.0 1800.0 2200.0 2300.0 3000.0 3300.0 -1700.0 1800.0 2200.0 2300.0 3000.0 3300.0 -1700.0 1900.0 2200.0 2400.0 3100.0 3300.0 -1700.0 1900.0 2200.0 2400.0 3100.0 3400.0 -1700.0 1800.0 2200.0 2400.0 3100.0 3400.0 -1500.0 1800.0 2300.0 2400.0 2900.0 3300.0 -1500.0 1700.0 2200.0 2400.0 3100.0 3400.0 -1400.0 1700.0 2200.0 2300.0 3100.0 3400.0 -1600.0 1900.0 2500.0 2700.0 3200.0 3400.0 -1500.0 1800.0 2400.0 2600.0 3000.0 3300.0 -1400.0 2100.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1800.0 2100.0 2300.0 3200.0 3300.0 -1800.0 2100.0 2600.0 2900.0 3100.0 3200.0 -2000.0 2400.0 2900.0 3100.0 3300.0 3400.0 -1500.0 1800.0 2200.0 2400.0 3300.0 3400.0 -1500.0 2000.0 2100.0 2700.0 3300.0 3400.0 -1600.0 1800.0 2000.0 2400.0 2900.0 3100.0 -1600.0 1800.0 2200.0 2600.0 3000.0 3200.0 -1500.0 1800.0 2100.0 2600.0 3000.0 3200.0 -1600.0 1900.0 2100.0 2400.0 3000.0 3300.0 -1600.0 2000.0 2200.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2100.0 2400.0 3300.0 3400.0 -1400.0 1700.0 2200.0 2600.0 3000.0 3200.0 -1300.0 1600.0 2200.0 2500.0 3000.0 3200.0 -1300.0 1500.0 2100.0 2500.0 3000.0 3300.0 -1200.0 1600.0 1700.0 2400.0 3300.0 3400.0 -1300.0 1600.0 1700.0 2500.0 3300.0 3400.0 -1300.0 1600.0 1700.0 2500.0 3200.0 3300.0 -1400.0 1700.0 1800.0 2500.0 3200.0 3300.0 -1500.0 1800.0 2000.0 2500.0 3200.0 3300.0 -1500.0 1900.0 2000.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2400.0 3200.0 3300.0 -1600.0 1900.0 2100.0 2400.0 3200.0 3300.0 -1500.0 1700.0 2100.0 2200.0 3000.0 3300.0 -1400.0 1600.0 2100.0 2200.0 3000.0 3200.0 -1400.0 1800.0 2100.0 2300.0 3000.0 3200.0 -1600.0 2100.0 2300.0 2700.0 3100.0 3300.0 -1200.0 2100.0 2400.0 2700.0 3300.0 3400.0 -1600.0 2100.0 2200.0 2600.0 3300.0 3400.0 -1300.0 2000.0 2200.0 2500.0 3300.0 3400.0 -1300.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1300.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2800.0 3100.0 3300.0 -1900.0 2200.0 2500.0 2900.0 3100.0 3300.0 -2000.0 2100.0 2600.0 2800.0 3200.0 3300.0 -2000.0 2100.0 2700.0 2900.0 3200.0 3300.0 -1000.0 1900.0 2400.0 2600.0 3300.0 3400.0 -1000.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1000.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1000.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1000.0 1800.0 2400.0 2600.0 3300.0 3400.0 -1000.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1400.0 1700.0 2200.0 2600.0 3100.0 3300.0 -1400.0 1600.0 2100.0 2500.0 3000.0 3300.0 -1300.0 1800.0 2100.0 2400.0 3200.0 3300.0 -1100.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1100.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1100.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1100.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1100.0 1900.0 2300.0 2400.0 3300.0 3400.0 -1200.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2400.0 3300.0 3400.0 -1500.0 1800.0 2200.0 2300.0 3300.0 3400.0 -1700.0 2200.0 2700.0 3000.0 3300.0 3400.0 -1900.0 2200.0 2800.0 3000.0 3200.0 3300.0 -1900.0 2200.0 2500.0 3000.0 3200.0 3300.0 -1600.0 2100.0 2300.0 2700.0 3300.0 3400.0 -1600.0 2000.0 2300.0 2700.0 3300.0 3400.0 -1600.0 2100.0 2500.0 3000.0 3300.0 3400.0 -1600.0 2200.0 2600.0 3000.0 3300.0 3400.0 -1900.0 2400.0 2900.0 3100.0 3300.0 3400.0 -2100.0 2500.0 2900.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2900.0 3000.0 3200.0 3300.0 -1700.0 2200.0 2400.0 2900.0 3200.0 3300.0 -1300.0 1800.0 2100.0 2500.0 3200.0 3300.0 -1500.0 1600.0 1800.0 2300.0 3000.0 3200.0 -1500.0 1600.0 1900.0 2000.0 3000.0 3300.0 -1400.0 1800.0 2200.0 2600.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2400.0 2900.0 3100.0 -1500.0 1700.0 2100.0 2400.0 2900.0 3100.0 -1400.0 1700.0 2100.0 2400.0 3000.0 3200.0 -1400.0 1700.0 2300.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2600.0 3200.0 3300.0 -1000.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1400.0 1900.0 2000.0 2500.0 3200.0 3300.0 -1600.0 1900.0 2100.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2300.0 2500.0 3200.0 3300.0 -2200.0 2400.0 2800.0 3000.0 3200.0 3300.0 -1900.0 2300.0 2400.0 2700.0 3100.0 3200.0 -1900.0 2200.0 2300.0 2600.0 3100.0 3200.0 -1900.0 2100.0 2300.0 2800.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2700.0 3200.0 3300.0 -1900.0 2200.0 2500.0 2700.0 3100.0 3300.0 -1700.0 1800.0 2200.0 2500.0 3300.0 3400.0 -1700.0 1900.0 2200.0 2700.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2700.0 3300.0 3400.0 -1800.0 2000.0 2400.0 2800.0 3300.0 3400.0 -1800.0 2000.0 2300.0 2600.0 3300.0 3400.0 -1900.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1900.0 2100.0 2400.0 2600.0 3200.0 3300.0 -2000.0 2200.0 2400.0 2700.0 3200.0 3300.0 -2100.0 2200.0 2500.0 2900.0 3200.0 3300.0 -2200.0 2300.0 2600.0 2900.0 3200.0 3300.0 -2200.0 2300.0 2700.0 2900.0 3100.0 3300.0 -2100.0 2400.0 2600.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2600.0 2800.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2700.0 3000.0 3200.0 -1800.0 2000.0 2400.0 2700.0 3100.0 3200.0 -1600.0 2000.0 2200.0 2500.0 3100.0 3200.0 -1300.0 1900.0 2100.0 2300.0 3100.0 3300.0 -1200.0 1600.0 2100.0 2200.0 3200.0 3400.0 -1100.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1400.0 1700.0 2100.0 2300.0 3100.0 3300.0 -1400.0 1900.0 2200.0 2500.0 3300.0 3400.0 -1300.0 1800.0 2200.0 2700.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2600.0 3200.0 3300.0 -1400.0 2000.0 2200.0 2700.0 3200.0 3300.0 -1400.0 2000.0 2200.0 2600.0 3300.0 3400.0 -1400.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1400.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1400.0 1800.0 2200.0 2300.0 3000.0 3300.0 -1400.0 1800.0 2200.0 2300.0 3100.0 3300.0 -1400.0 1800.0 2100.0 2300.0 3200.0 3400.0 -1500.0 2000.0 2400.0 2700.0 3300.0 3400.0 -1700.0 2100.0 2500.0 3000.0 3300.0 3400.0 -1400.0 1900.0 2300.0 2800.0 3200.0 3300.0 -1400.0 2000.0 2200.0 2400.0 3200.0 3300.0 -1200.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1200.0 1900.0 2200.0 2500.0 3200.0 3300.0 -1200.0 2000.0 2200.0 2500.0 3300.0 3400.0 -1700.0 2100.0 2300.0 2400.0 3200.0 3400.0 -1400.0 1600.0 1800.0 2500.0 3100.0 3200.0 -1500.0 1800.0 2100.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2200.0 2500.0 3100.0 3300.0 -2000.0 2100.0 2500.0 2800.0 3100.0 3300.0 -1900.0 2100.0 2200.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2100.0 2300.0 3200.0 3400.0 -1600.0 1800.0 2000.0 2300.0 3200.0 3400.0 -1600.0 1800.0 2100.0 2300.0 3200.0 3400.0 -1500.0 1800.0 2000.0 2300.0 3300.0 3400.0 -1500.0 1700.0 1900.0 2400.0 3300.0 3400.0 -1600.0 1900.0 2000.0 2700.0 3100.0 3200.0 -1700.0 1900.0 2200.0 2600.0 3100.0 3300.0 -1700.0 1900.0 2200.0 2500.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2600.0 3100.0 3300.0 -1700.0 2000.0 2400.0 2700.0 3100.0 3200.0 -2300.0 2400.0 2700.0 3000.0 3200.0 3300.0 -2200.0 2400.0 2600.0 2900.0 3200.0 3300.0 -2200.0 2400.0 2500.0 2800.0 3200.0 3300.0 -2100.0 2400.0 2500.0 2800.0 3200.0 3300.0 -2000.0 2400.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2300.0 2400.0 2800.0 3200.0 3300.0 -1900.0 2300.0 2600.0 2700.0 3100.0 3300.0 -2000.0 2400.0 2800.0 2900.0 3200.0 3300.0 -1700.0 2200.0 2500.0 2800.0 3200.0 3400.0 -1500.0 2100.0 2400.0 2600.0 3100.0 3300.0 -1500.0 1900.0 2300.0 2500.0 3200.0 3400.0 -1400.0 1900.0 2300.0 2400.0 3200.0 3300.0 -1100.0 1700.0 2400.0 2600.0 3200.0 3300.0 -1100.0 1700.0 2400.0 2600.0 3300.0 3400.0 -1100.0 1800.0 2400.0 2500.0 3300.0 3400.0 -1100.0 1800.0 2400.0 2500.0 3200.0 3300.0 -1100.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1100.0 2100.0 2500.0 2600.0 3200.0 3300.0 -1100.0 2100.0 2500.0 2700.0 3200.0 3300.0 -1000.0 2200.0 2600.0 2700.0 3200.0 3300.0 -1100.0 2300.0 2600.0 2800.0 3200.0 3300.0 -1100.0 2100.0 2500.0 2700.0 3100.0 3200.0 -1500.0 1700.0 2300.0 2500.0 2900.0 3200.0 -1600.0 1700.0 2200.0 2600.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2600.0 2800.0 3000.0 -1500.0 1700.0 2100.0 2500.0 2800.0 3000.0 -1500.0 1600.0 2200.0 2500.0 2800.0 3100.0 -1500.0 1600.0 2300.0 2600.0 2800.0 3100.0 -1400.0 1500.0 2300.0 2700.0 2900.0 3100.0 -1400.0 1500.0 2200.0 2700.0 2800.0 3100.0 -1400.0 1600.0 2000.0 2700.0 2900.0 3100.0 -1500.0 1700.0 2200.0 2700.0 3100.0 3300.0 -1500.0 1800.0 2300.0 2700.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2700.0 3000.0 3300.0 -1700.0 1800.0 2200.0 2700.0 2900.0 3200.0 -1800.0 1900.0 2200.0 2700.0 2900.0 3100.0 -1700.0 1900.0 2200.0 2600.0 2900.0 3000.0 -1800.0 2000.0 2300.0 2700.0 2900.0 3100.0 -1800.0 2000.0 2300.0 2800.0 3000.0 3200.0 -1800.0 2000.0 2400.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2800.0 3000.0 3200.0 -1500.0 1700.0 2200.0 2500.0 3000.0 3100.0 -1700.0 2100.0 2400.0 2800.0 3100.0 3200.0 -1800.0 2200.0 2700.0 2900.0 3400.0 3500.0 -1900.0 2400.0 2700.0 2900.0 3400.0 3500.0 -2000.0 2400.0 2600.0 2900.0 3300.0 3400.0 -1900.0 2400.0 2500.0 2800.0 3200.0 3300.0 -1900.0 2300.0 2500.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2500.0 3100.0 3200.0 -1600.0 1700.0 2300.0 2600.0 2900.0 3100.0 -1600.0 1700.0 2400.0 2600.0 2900.0 3100.0 -1600.0 2100.0 2600.0 2800.0 3300.0 3400.0 -1700.0 2200.0 2700.0 3000.0 3200.0 3300.0 -1700.0 2300.0 2800.0 2900.0 3200.0 3300.0 -1700.0 2300.0 2700.0 3000.0 3200.0 3300.0 -1600.0 2100.0 2700.0 2900.0 3300.0 3400.0 -1200.0 1600.0 2400.0 2600.0 3000.0 3300.0 -1100.0 1400.0 2400.0 2700.0 2900.0 3100.0 -1200.0 1800.0 2200.0 2500.0 3100.0 3300.0 -1200.0 1700.0 2200.0 2500.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2500.0 2900.0 3200.0 -1900.0 2000.0 2400.0 2500.0 2800.0 3100.0 -2000.0 2200.0 2400.0 2500.0 2800.0 3100.0 -2000.0 2200.0 2400.0 2600.0 2800.0 3200.0 -2000.0 2100.0 2500.0 2700.0 3100.0 3400.0 -1900.0 2000.0 2600.0 2700.0 3100.0 3300.0 -1900.0 2000.0 2600.0 2700.0 3200.0 3300.0 -1900.0 2400.0 2700.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2800.0 2900.0 3200.0 3400.0 -1900.0 2000.0 2300.0 2600.0 3000.0 3200.0 -1900.0 2100.0 2400.0 2700.0 3000.0 3200.0 -1900.0 2100.0 2400.0 2800.0 3100.0 3200.0 -1900.0 2100.0 2400.0 2800.0 3300.0 3400.0 -1500.0 1800.0 2100.0 2600.0 3100.0 3300.0 -1600.0 1800.0 2100.0 2200.0 3000.0 3300.0 -1800.0 2100.0 2300.0 2500.0 3000.0 3200.0 -2000.0 2100.0 2300.0 2500.0 3000.0 3300.0 -2000.0 2100.0 2300.0 2500.0 2900.0 3300.0 -2000.0 2100.0 2300.0 2400.0 2900.0 3300.0 -1600.0 1800.0 2300.0 2500.0 2900.0 3200.0 -1700.0 1900.0 2400.0 2700.0 3000.0 3200.0 -1700.0 2000.0 2400.0 2600.0 3000.0 3300.0 -1600.0 2000.0 2300.0 2700.0 3000.0 3200.0 -1500.0 1800.0 2300.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2400.0 2800.0 3000.0 -1800.0 2000.0 2400.0 2500.0 2900.0 3200.0 -1800.0 2000.0 2400.0 2600.0 3000.0 3200.0 -1900.0 2000.0 2400.0 2500.0 3000.0 3200.0 -1900.0 2000.0 2300.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2400.0 2900.0 3200.0 -1800.0 1900.0 2200.0 2300.0 2900.0 3200.0 -1600.0 1800.0 2200.0 2400.0 3100.0 3300.0 -1600.0 2000.0 2400.0 2700.0 3100.0 3200.0 -1800.0 2100.0 2500.0 2700.0 3000.0 3200.0 -2000.0 2200.0 2500.0 2700.0 3000.0 3200.0 -2000.0 2300.0 2500.0 2700.0 3000.0 3200.0 -2000.0 2300.0 2400.0 2700.0 3000.0 3200.0 -2100.0 2200.0 2400.0 2500.0 3000.0 3300.0 -1900.0 2000.0 2300.0 2600.0 2800.0 3300.0 -1900.0 2000.0 2400.0 2700.0 3100.0 3300.0 -1500.0 2000.0 2400.0 2700.0 3100.0 3300.0 -1600.0 1900.0 2500.0 2800.0 3000.0 3300.0 -1900.0 2000.0 2400.0 2700.0 2900.0 3200.0 -2000.0 2200.0 2400.0 2700.0 2900.0 3200.0 -2100.0 2200.0 2400.0 2700.0 2900.0 3200.0 -2100.0 2300.0 2400.0 2600.0 2800.0 3200.0 -1300.0 2000.0 2300.0 2500.0 2700.0 3100.0 -1800.0 1900.0 2100.0 2400.0 2900.0 3100.0 -1700.0 1900.0 2100.0 2500.0 2900.0 3100.0 -1800.0 1900.0 2300.0 2600.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2600.0 2800.0 3200.0 -1700.0 1800.0 2300.0 2600.0 2800.0 3100.0 -1700.0 1800.0 2300.0 2700.0 2800.0 3200.0 -1500.0 1700.0 2300.0 2600.0 3000.0 3300.0 -1400.0 1700.0 2200.0 2500.0 3000.0 3300.0 -1400.0 1600.0 2200.0 2300.0 3000.0 3300.0 -1400.0 1600.0 2200.0 2400.0 2800.0 3300.0 -1500.0 1600.0 2200.0 2400.0 2900.0 3300.0 -1500.0 1600.0 2200.0 2400.0 2800.0 3300.0 -1500.0 1700.0 2200.0 2500.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2700.0 3000.0 3300.0 -1600.0 1800.0 2400.0 2700.0 3000.0 3200.0 -1600.0 2000.0 2500.0 2800.0 3000.0 3300.0 -2000.0 2200.0 2500.0 2600.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2500.0 3100.0 3200.0 -1500.0 1700.0 1800.0 2300.0 3300.0 3400.0 -1400.0 1600.0 1800.0 2000.0 3200.0 3400.0 -1400.0 1600.0 1800.0 1900.0 3100.0 3400.0 -1400.0 1600.0 1900.0 2000.0 2900.0 3300.0 -1400.0 1500.0 1900.0 2000.0 2900.0 3200.0 -1900.0 2200.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2200.0 2500.0 2700.0 3000.0 3200.0 -1800.0 2200.0 2600.0 2700.0 3100.0 3200.0 -2000.0 2300.0 2700.0 2800.0 3200.0 3300.0 -2100.0 2200.0 2600.0 2800.0 3000.0 3300.0 -2100.0 2200.0 2500.0 2700.0 3100.0 3300.0 -1700.0 1800.0 2000.0 2100.0 2800.0 3200.0 -1600.0 1700.0 1900.0 2000.0 2800.0 3200.0 -1400.0 1500.0 1800.0 1900.0 2800.0 3200.0 -1400.0 1800.0 2100.0 2400.0 3000.0 3200.0 -1600.0 1900.0 2300.0 2600.0 3000.0 3300.0 -1600.0 1900.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2400.0 2700.0 3000.0 3200.0 -1600.0 1900.0 2400.0 2700.0 3000.0 3300.0 -1500.0 1900.0 2400.0 2700.0 3000.0 3300.0 -1100.0 1400.0 2500.0 2800.0 3000.0 3300.0 -1100.0 1300.0 2300.0 2800.0 3000.0 3200.0 -1400.0 1500.0 2100.0 2700.0 2900.0 3100.0 -1500.0 1600.0 2100.0 2700.0 2900.0 3100.0 -1700.0 1800.0 2200.0 2600.0 2800.0 3100.0 -1800.0 2000.0 2300.0 2600.0 2800.0 3000.0 -1900.0 2100.0 2300.0 2600.0 2800.0 3100.0 -2000.0 2100.0 2300.0 2600.0 2800.0 3100.0 -2000.0 2100.0 2400.0 2500.0 2800.0 3200.0 -1900.0 2100.0 2300.0 2500.0 2800.0 3200.0 -1800.0 1900.0 2300.0 2500.0 2800.0 3300.0 -1700.0 1800.0 2300.0 2500.0 3000.0 3300.0 -1700.0 1900.0 2400.0 2600.0 3000.0 3200.0 -1500.0 1900.0 2200.0 2600.0 3100.0 3300.0 -1300.0 1500.0 1800.0 1900.0 2900.0 3200.0 -1300.0 1500.0 1800.0 1900.0 2900.0 3300.0 -1300.0 1500.0 1800.0 1900.0 2800.0 3200.0 -1400.0 1500.0 1700.0 1900.0 2800.0 3200.0 -1400.0 1500.0 1700.0 1800.0 2800.0 3200.0 -1700.0 2000.0 2400.0 2500.0 3100.0 3300.0 -2100.0 2400.0 2700.0 2800.0 3300.0 3500.0 -1800.0 2300.0 2700.0 2900.0 3200.0 3400.0 -1700.0 2300.0 2700.0 2900.0 3300.0 3400.0 -1700.0 2100.0 2700.0 2900.0 3300.0 3400.0 -1800.0 2400.0 2700.0 2900.0 3300.0 3400.0 -1900.0 2500.0 2800.0 3000.0 3300.0 3400.0 -2000.0 2500.0 2800.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2700.0 3000.0 3200.0 3400.0 -1900.0 2300.0 2700.0 3000.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2700.0 2900.0 3200.0 -1800.0 2000.0 2400.0 2700.0 2900.0 3100.0 -1900.0 2000.0 2300.0 2700.0 2900.0 3000.0 -1900.0 2000.0 2400.0 2700.0 2900.0 3100.0 -1800.0 1900.0 2400.0 2700.0 2900.0 3100.0 -1800.0 1900.0 2300.0 2700.0 2800.0 3100.0 -1800.0 1900.0 2300.0 2600.0 2800.0 3100.0 -1500.0 1800.0 2400.0 2700.0 3200.0 3400.0 -1600.0 1800.0 2500.0 2700.0 3100.0 3400.0 -1500.0 1700.0 2400.0 2700.0 3000.0 3300.0 -1400.0 1500.0 2400.0 2700.0 2900.0 3200.0 -1300.0 1500.0 2300.0 2700.0 2900.0 3100.0 -1400.0 1600.0 2100.0 2600.0 2800.0 3000.0 -1500.0 1600.0 2100.0 2600.0 2800.0 3000.0 -1400.0 1600.0 2200.0 2400.0 3000.0 3200.0 -1300.0 1600.0 2200.0 2500.0 2900.0 3200.0 -1300.0 1700.0 2200.0 2600.0 3000.0 3300.0 -1300.0 1700.0 2200.0 2700.0 3100.0 3200.0 -1200.0 1400.0 2200.0 2700.0 2900.0 3100.0 -1100.0 1400.0 2300.0 2700.0 2900.0 3100.0 -1100.0 1300.0 2400.0 2800.0 3000.0 3200.0 -1200.0 1600.0 2300.0 2600.0 3100.0 3200.0 -1500.0 2100.0 2400.0 2700.0 3200.0 3300.0 -1800.0 2100.0 2400.0 2800.0 3200.0 3300.0 -1600.0 2100.0 2400.0 2800.0 3200.0 3300.0 -1600.0 2000.0 2500.0 2900.0 3200.0 3300.0 -1800.0 2000.0 2500.0 2900.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2800.0 3100.0 3300.0 -1600.0 1800.0 2400.0 2700.0 3100.0 3300.0 -1500.0 1600.0 2200.0 2500.0 2900.0 3200.0 -1500.0 1600.0 2200.0 2500.0 2800.0 3200.0 -1400.0 1600.0 2100.0 2500.0 2800.0 3100.0 -1200.0 1400.0 2200.0 2500.0 2700.0 3100.0 -1100.0 1400.0 2400.0 2800.0 2900.0 3100.0 -1400.0 1700.0 2300.0 2600.0 2900.0 3200.0 -1500.0 1800.0 2300.0 2500.0 2900.0 3300.0 -1500.0 1700.0 2000.0 2100.0 3000.0 3300.0 -1500.0 1700.0 2000.0 2200.0 3100.0 3300.0 -1500.0 1700.0 2100.0 2300.0 3100.0 3200.0 -1600.0 1900.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2300.0 2800.0 3100.0 3300.0 3400.0 -1800.0 2200.0 2700.0 2900.0 3200.0 3400.0 -1700.0 2200.0 2700.0 2800.0 3200.0 3400.0 -1500.0 1800.0 2600.0 2700.0 3000.0 3200.0 -1500.0 1700.0 2300.0 2700.0 2800.0 3100.0 -1400.0 1500.0 2100.0 2200.0 2700.0 3200.0 -1400.0 1500.0 2000.0 2100.0 2600.0 3100.0 -1300.0 1500.0 1900.0 2000.0 2500.0 3100.0 -1400.0 1500.0 1800.0 1900.0 2700.0 3200.0 -1500.0 1600.0 2000.0 2100.0 2600.0 3100.0 -1700.0 1800.0 2000.0 2200.0 2600.0 3100.0 -1700.0 1800.0 2100.0 2200.0 2700.0 3100.0 -1600.0 2000.0 2400.0 2500.0 3000.0 3200.0 -2000.0 2200.0 2500.0 2900.0 3100.0 3300.0 -1900.0 2200.0 2400.0 2600.0 2900.0 3100.0 -1600.0 1700.0 2200.0 2400.0 2700.0 3300.0 -1700.0 1800.0 2300.0 2400.0 2800.0 3200.0 -1800.0 1900.0 2300.0 2500.0 2800.0 3200.0 -1900.0 2100.0 2400.0 2500.0 3000.0 3300.0 -2100.0 2200.0 2500.0 2600.0 3000.0 3300.0 -2000.0 2100.0 2500.0 2700.0 2900.0 3200.0 -1700.0 1900.0 2200.0 2700.0 2800.0 3100.0 -1800.0 1900.0 2400.0 2700.0 2800.0 3200.0 -1800.0 1900.0 2400.0 2700.0 2900.0 3200.0 -1700.0 1800.0 2200.0 2700.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2700.0 3000.0 3200.0 -1900.0 2100.0 2500.0 2900.0 3100.0 3300.0 -1700.0 2000.0 2500.0 2700.0 3200.0 3400.0 -1900.0 2200.0 2700.0 3000.0 3300.0 3400.0 -2000.0 2400.0 2800.0 3100.0 3400.0 3500.0 -2100.0 2400.0 2600.0 2900.0 3200.0 3300.0 -2100.0 2400.0 2500.0 2700.0 3100.0 3300.0 -1800.0 2100.0 2500.0 2700.0 3200.0 3300.0 -1700.0 2100.0 2400.0 2700.0 3200.0 3300.0 -1500.0 1600.0 1800.0 1900.0 2600.0 3100.0 -1500.0 1600.0 1900.0 2000.0 2500.0 3100.0 -1600.0 1700.0 2000.0 2100.0 2500.0 3100.0 -1800.0 2100.0 2300.0 2500.0 2800.0 3200.0 -1900.0 2100.0 2300.0 2500.0 2700.0 3200.0 -2000.0 2200.0 2400.0 2600.0 2900.0 3300.0 -2000.0 2200.0 2400.0 2600.0 2900.0 3200.0 -2000.0 2100.0 2400.0 2500.0 2900.0 3300.0 -1800.0 2200.0 2500.0 2900.0 3400.0 3500.0 -1800.0 2300.0 2500.0 2900.0 3300.0 3400.0 -2000.0 2300.0 2500.0 2800.0 3000.0 3300.0 -1800.0 2000.0 2400.0 2500.0 2800.0 3300.0 -1100.0 1400.0 2600.0 2800.0 3000.0 3200.0 -1300.0 1500.0 2200.0 2700.0 2900.0 3200.0 -1400.0 1600.0 2200.0 2700.0 3000.0 3200.0 -1400.0 1600.0 2200.0 2600.0 3100.0 3200.0 -1500.0 1800.0 2200.0 2400.0 3100.0 3300.0 -1700.0 1800.0 2200.0 2500.0 3000.0 3300.0 -1700.0 1800.0 2200.0 2600.0 3000.0 3200.0 -1700.0 1800.0 2300.0 2600.0 3000.0 3200.0 -1700.0 1800.0 2400.0 2700.0 3000.0 3100.0 -1600.0 1700.0 2500.0 2800.0 3000.0 3200.0 -1400.0 1500.0 2200.0 2700.0 2900.0 3100.0 -1300.0 1400.0 2100.0 2700.0 2900.0 3200.0 -1500.0 1900.0 2300.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2200.0 2500.0 2700.0 3100.0 -1600.0 1700.0 2200.0 2500.0 2800.0 3200.0 -1600.0 1800.0 2100.0 2500.0 2900.0 3200.0 -1600.0 1800.0 2100.0 2600.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2800.0 3100.0 3300.0 -1800.0 2100.0 2400.0 2700.0 3000.0 3300.0 -2000.0 2100.0 2500.0 2800.0 3000.0 3200.0 -1800.0 2000.0 2500.0 2700.0 3000.0 3200.0 -1600.0 1900.0 2300.0 2700.0 2900.0 3200.0 -1600.0 1900.0 2100.0 2500.0 2800.0 3100.0 -1700.0 1900.0 2100.0 2500.0 2800.0 3000.0 -1700.0 1800.0 2100.0 2600.0 2800.0 3000.0 -1600.0 1700.0 2000.0 2600.0 2800.0 3000.0 -1400.0 1700.0 2200.0 2700.0 3000.0 3200.0 -1500.0 1800.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1800.0 2300.0 2600.0 3000.0 3300.0 -1600.0 1800.0 2300.0 2600.0 3100.0 3300.0 -1600.0 1900.0 2300.0 2600.0 3100.0 3300.0 -1200.0 1300.0 2100.0 2700.0 3000.0 3100.0 -1300.0 1400.0 2100.0 2700.0 2900.0 3100.0 -1300.0 1400.0 2200.0 2700.0 2900.0 3100.0 -1300.0 1400.0 2100.0 2600.0 2800.0 3100.0 -1300.0 1500.0 2100.0 2600.0 2800.0 3100.0 -1500.0 1600.0 1900.0 2500.0 2900.0 3100.0 -1500.0 1700.0 2100.0 2700.0 2900.0 3200.0 -1600.0 1900.0 2400.0 2700.0 3200.0 3300.0 -1900.0 2100.0 2500.0 2800.0 3200.0 3400.0 -1700.0 2000.0 2400.0 2800.0 3200.0 3400.0 -1600.0 1700.0 2200.0 2400.0 2800.0 3300.0 -1500.0 1600.0 2200.0 2400.0 3000.0 3300.0 -1500.0 1700.0 2300.0 2700.0 3100.0 3300.0 -1400.0 1500.0 2000.0 2600.0 2900.0 3100.0 -1400.0 1500.0 2100.0 2500.0 2800.0 3100.0 -1400.0 1700.0 2200.0 2600.0 3000.0 3300.0 -1000.0 1500.0 2600.0 2800.0 3100.0 3400.0 -1300.0 1500.0 2500.0 2700.0 2900.0 3300.0 -1500.0 1600.0 2200.0 2600.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2400.0 2700.0 3200.0 -1700.0 1800.0 2100.0 2400.0 2600.0 3100.0 -1600.0 1700.0 2100.0 2400.0 2700.0 3200.0 -1600.0 1900.0 2300.0 2700.0 3000.0 3300.0 -1500.0 1600.0 2000.0 2400.0 3000.0 3300.0 -1600.0 1800.0 2300.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2400.0 2600.0 3200.0 3400.0 -1600.0 1800.0 2400.0 2600.0 3200.0 3400.0 -1700.0 1800.0 2300.0 2600.0 3000.0 3300.0 -1700.0 1800.0 2100.0 2500.0 2900.0 3200.0 -1800.0 1900.0 2100.0 2600.0 2800.0 3000.0 -1800.0 1900.0 2200.0 2600.0 2800.0 3000.0 -1800.0 1900.0 2200.0 2600.0 2900.0 3100.0 -1700.0 1800.0 2100.0 2600.0 2900.0 3100.0 -1600.0 1700.0 2100.0 2700.0 2900.0 3100.0 -1400.0 1600.0 2100.0 2700.0 2900.0 3200.0 -1200.0 1600.0 2200.0 2400.0 3000.0 3300.0 -1600.0 1900.0 2300.0 2700.0 3100.0 3400.0 -1200.0 1800.0 2300.0 2700.0 3100.0 3300.0 -1600.0 2000.0 2400.0 2800.0 3100.0 3300.0 -1700.0 1900.0 2100.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2600.0 3100.0 3400.0 -1900.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1900.0 2000.0 2300.0 2600.0 3100.0 3300.0 -1900.0 2100.0 2300.0 2700.0 3100.0 3300.0 -1200.0 1400.0 2200.0 2800.0 3000.0 3100.0 -1800.0 2100.0 2400.0 2700.0 3200.0 3400.0 -1600.0 2100.0 2500.0 2800.0 3100.0 3300.0 -1600.0 2000.0 2500.0 2800.0 3200.0 3300.0 -1700.0 2000.0 2500.0 2800.0 3200.0 3400.0 -1700.0 1900.0 2700.0 2800.0 3100.0 3400.0 -1600.0 1800.0 2400.0 2600.0 3100.0 3400.0 -1600.0 1800.0 2300.0 2500.0 3100.0 3400.0 -1600.0 1800.0 2200.0 2500.0 3100.0 3400.0 -1600.0 1800.0 2100.0 2300.0 3100.0 3400.0 -1500.0 1700.0 2000.0 2200.0 3000.0 3300.0 -1500.0 1600.0 1900.0 2000.0 3000.0 3200.0 -1300.0 1500.0 1700.0 1900.0 2800.0 3200.0 -1800.0 2000.0 2300.0 2600.0 3000.0 3200.0 -1700.0 2000.0 2200.0 2600.0 3000.0 3200.0 -1600.0 1900.0 2400.0 2600.0 3000.0 3300.0 -1300.0 1700.0 2100.0 2400.0 2900.0 3200.0 -1600.0 1800.0 2400.0 2600.0 3000.0 3300.0 -1300.0 1600.0 2200.0 2300.0 2900.0 3200.0 -1300.0 1400.0 2100.0 2200.0 3000.0 3200.0 -1300.0 1500.0 1800.0 2000.0 3000.0 3200.0 -1300.0 1400.0 1800.0 1900.0 2800.0 3200.0 -1300.0 1700.0 2200.0 2500.0 3000.0 3200.0 -1200.0 1800.0 2300.0 2600.0 3200.0 3300.0 -1400.0 1900.0 2300.0 2700.0 3100.0 3300.0 -1500.0 2000.0 2400.0 2600.0 3000.0 3300.0 -1600.0 2000.0 2500.0 2600.0 3100.0 3300.0 -1600.0 1900.0 2500.0 2700.0 3100.0 3300.0 -1600.0 2000.0 2500.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2300.0 2600.0 2800.0 3200.0 -1300.0 1500.0 2000.0 2600.0 2700.0 3000.0 -1300.0 1500.0 2200.0 2600.0 2800.0 3100.0 -1400.0 1500.0 2100.0 2600.0 2800.0 3100.0 -1400.0 1500.0 2100.0 2600.0 2800.0 3000.0 -1500.0 1600.0 2000.0 2500.0 2700.0 3000.0 -1500.0 1700.0 2000.0 2500.0 2700.0 3000.0 -1600.0 1700.0 2000.0 2500.0 2800.0 3000.0 -1700.0 1800.0 2100.0 2500.0 2900.0 3100.0 -1700.0 1900.0 2100.0 2500.0 2900.0 3000.0 -1800.0 2000.0 2200.0 2600.0 2800.0 3000.0 -1800.0 2100.0 2300.0 2600.0 2800.0 3100.0 -1800.0 2100.0 2300.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2200.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2300.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2300.0 2600.0 2800.0 3100.0 -1700.0 1900.0 2200.0 2600.0 2800.0 3000.0 -1700.0 1800.0 2100.0 2500.0 2700.0 3000.0 -1500.0 1700.0 2200.0 2400.0 2800.0 3300.0 -1500.0 1900.0 2300.0 2500.0 3100.0 3300.0 -1700.0 1800.0 2200.0 2800.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2700.0 3000.0 3200.0 -1900.0 2100.0 2400.0 2600.0 3000.0 3200.0 -2000.0 2200.0 2400.0 2700.0 3000.0 3200.0 -1900.0 2300.0 2400.0 2700.0 3100.0 3300.0 -1500.0 1600.0 1800.0 2000.0 3100.0 3300.0 -1200.0 1400.0 1900.0 2500.0 2900.0 3100.0 -1600.0 1700.0 2000.0 2100.0 2900.0 3300.0 -1700.0 1800.0 2100.0 2200.0 2900.0 3300.0 -1800.0 1900.0 2200.0 2300.0 3000.0 3300.0 -1900.0 2000.0 2200.0 2300.0 3100.0 3300.0 -2000.0 2100.0 2300.0 2500.0 3100.0 3400.0 -1900.0 2100.0 2300.0 2500.0 3000.0 3200.0 -1800.0 2000.0 2300.0 2400.0 2900.0 3200.0 -1900.0 2200.0 2600.0 2800.0 3100.0 3300.0 -2000.0 2400.0 2600.0 2700.0 3200.0 3400.0 -1800.0 2200.0 2600.0 2700.0 3100.0 3300.0 -1600.0 2100.0 2600.0 2700.0 3100.0 3300.0 -1600.0 2100.0 2500.0 2800.0 3200.0 3400.0 -1900.0 2200.0 2500.0 2800.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2800.0 3300.0 3400.0 -1700.0 1900.0 2600.0 2800.0 3100.0 3400.0 -1600.0 1700.0 2400.0 2700.0 3100.0 3300.0 -1400.0 1600.0 2200.0 2500.0 2800.0 3200.0 -1400.0 1600.0 2300.0 2500.0 2900.0 3200.0 -1400.0 1500.0 2300.0 2600.0 2900.0 3200.0 -1300.0 1500.0 2400.0 2600.0 3000.0 3300.0 -1200.0 1400.0 2400.0 2600.0 2900.0 3300.0 -1200.0 1300.0 2300.0 2600.0 2800.0 3200.0 -1200.0 1300.0 2300.0 2600.0 2800.0 3100.0 -1200.0 1400.0 2300.0 2600.0 2800.0 3200.0 -1200.0 1400.0 2300.0 2500.0 2800.0 3200.0 -1200.0 1400.0 2300.0 2500.0 2700.0 3200.0 -1300.0 1400.0 2300.0 2500.0 2700.0 3200.0 -1300.0 1400.0 2300.0 2400.0 2900.0 3200.0 -1300.0 1600.0 2300.0 2400.0 2900.0 3200.0 -1600.0 1700.0 2200.0 2500.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2500.0 2900.0 3200.0 -1600.0 1800.0 2300.0 2400.0 2900.0 3200.0 -1600.0 1800.0 2200.0 2400.0 2900.0 3200.0 -1700.0 1900.0 2400.0 2700.0 3000.0 3300.0 -1600.0 1800.0 2400.0 2700.0 3000.0 3300.0 -1600.0 1800.0 2300.0 2600.0 2900.0 3200.0 -1600.0 1800.0 2500.0 2700.0 2900.0 3200.0 -1600.0 1900.0 2500.0 2800.0 3100.0 3300.0 -1600.0 1900.0 2500.0 2800.0 3000.0 3200.0 -1400.0 1700.0 2400.0 2700.0 2900.0 3200.0 -1400.0 1500.0 2200.0 2600.0 2800.0 3100.0 -1300.0 1500.0 2300.0 2600.0 2800.0 3100.0 -1200.0 1400.0 2300.0 2500.0 2700.0 3100.0 -1300.0 1600.0 2200.0 2600.0 3000.0 3300.0 -1200.0 1600.0 2500.0 2700.0 3100.0 3400.0 -1300.0 1800.0 2400.0 2700.0 3200.0 3400.0 -1300.0 1700.0 2300.0 2700.0 3100.0 3300.0 -1300.0 1700.0 2200.0 2500.0 3100.0 3300.0 -1300.0 1600.0 2200.0 2600.0 2900.0 3200.0 -1400.0 1600.0 2200.0 2700.0 2800.0 3100.0 -1600.0 1700.0 2200.0 2700.0 3100.0 3200.0 -1800.0 2000.0 2400.0 2800.0 3100.0 3300.0 -1800.0 2000.0 2400.0 2800.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2700.0 2900.0 3100.0 -1700.0 1800.0 2300.0 2700.0 3000.0 3300.0 -1800.0 1900.0 2600.0 2800.0 3300.0 3400.0 -1900.0 2100.0 2300.0 2600.0 2900.0 3100.0 -1900.0 2200.0 2400.0 2700.0 3000.0 3100.0 -1800.0 2300.0 2400.0 2700.0 3000.0 3100.0 -1800.0 2300.0 2400.0 2600.0 3100.0 3200.0 -2000.0 2300.0 2400.0 2700.0 3100.0 3200.0 -2100.0 2300.0 2500.0 2700.0 3000.0 3200.0 -2000.0 2100.0 2500.0 2700.0 3000.0 3200.0 -1900.0 2000.0 2300.0 2700.0 2900.0 3100.0 -1600.0 1800.0 2200.0 2500.0 2700.0 3000.0 -1500.0 1800.0 2300.0 2500.0 2700.0 3000.0 -1500.0 1800.0 2200.0 2500.0 2700.0 3000.0 -1600.0 1800.0 2300.0 2500.0 2800.0 3000.0 -1700.0 1800.0 2400.0 2700.0 3000.0 3200.0 -1700.0 1800.0 2500.0 2700.0 3000.0 3200.0 -1700.0 1800.0 2400.0 2700.0 3000.0 3300.0 -1600.0 1700.0 2400.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2400.0 2600.0 2800.0 3200.0 -1500.0 1700.0 2400.0 2500.0 2800.0 3200.0 -1400.0 1600.0 2400.0 2500.0 3000.0 3300.0 -1500.0 1700.0 2300.0 2400.0 2900.0 3200.0 -1500.0 1800.0 2200.0 2400.0 2800.0 3000.0 -1600.0 1900.0 2200.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2300.0 2600.0 2900.0 3000.0 -1600.0 2000.0 2300.0 2500.0 2900.0 3100.0 -1600.0 1800.0 2100.0 2300.0 2900.0 3100.0 -1300.0 1500.0 2200.0 2400.0 3000.0 3200.0 -1300.0 1500.0 2200.0 2400.0 2900.0 3200.0 -1300.0 1500.0 2200.0 2500.0 2900.0 3200.0 -1400.0 1500.0 2300.0 2500.0 2900.0 3200.0 -1600.0 1700.0 2100.0 2500.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2600.0 2800.0 3100.0 -1700.0 1800.0 2100.0 2500.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2600.0 2900.0 3100.0 -1700.0 1900.0 2300.0 2600.0 2900.0 3200.0 -1800.0 2100.0 2300.0 2600.0 2900.0 3200.0 -1800.0 2100.0 2300.0 2700.0 2900.0 3200.0 -1900.0 2200.0 2400.0 2700.0 2900.0 3200.0 -1900.0 2100.0 2300.0 2700.0 2900.0 3100.0 -1900.0 2000.0 2300.0 2600.0 2800.0 3100.0 -1900.0 2200.0 2500.0 2800.0 3100.0 3300.0 -1900.0 2200.0 2400.0 2800.0 3000.0 3200.0 -1900.0 2200.0 2400.0 2700.0 2900.0 3100.0 -1900.0 2300.0 2400.0 2800.0 3100.0 3200.0 -2000.0 2300.0 2500.0 2800.0 3100.0 3300.0 -1900.0 2400.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2000.0 2200.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2100.0 2400.0 2900.0 3200.0 -1500.0 1600.0 2200.0 2400.0 2700.0 3200.0 -1300.0 1400.0 2200.0 2500.0 2700.0 3200.0 -1200.0 1500.0 2500.0 2700.0 3000.0 3300.0 -1300.0 1600.0 2400.0 2600.0 3000.0 3300.0 -2000.0 2200.0 2600.0 2700.0 3000.0 3300.0 -2100.0 2300.0 2500.0 2700.0 3000.0 3300.0 -2100.0 2300.0 2600.0 2700.0 3000.0 3300.0 -2000.0 2200.0 2600.0 2700.0 3000.0 3200.0 -1800.0 2300.0 2500.0 2600.0 2900.0 3200.0 -1800.0 2300.0 2500.0 2700.0 2900.0 3100.0 -1800.0 2200.0 2400.0 2600.0 2900.0 3200.0 -1800.0 2200.0 2400.0 2600.0 2800.0 3100.0 -1800.0 2200.0 2300.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2200.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2800.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2800.0 3000.0 3300.0 -1600.0 1800.0 2300.0 2800.0 3000.0 3300.0 -1400.0 1700.0 2200.0 2500.0 2800.0 2900.0 -1400.0 1700.0 2100.0 2500.0 2900.0 3200.0 -1700.0 2000.0 2200.0 2800.0 3200.0 3300.0 -1800.0 1900.0 2200.0 2700.0 2900.0 3200.0 -1800.0 2000.0 2200.0 2700.0 2900.0 3100.0 -1800.0 2000.0 2200.0 2700.0 2800.0 3000.0 -1800.0 2000.0 2200.0 2700.0 2800.0 3100.0 -1600.0 1900.0 2100.0 2600.0 2900.0 3200.0 -2000.0 2100.0 2600.0 2900.0 3000.0 3200.0 -2000.0 2200.0 2700.0 2900.0 3100.0 3300.0 -2000.0 2200.0 2400.0 2800.0 3000.0 3200.0 -2000.0 2200.0 2300.0 2700.0 3000.0 3200.0 -1700.0 2200.0 2400.0 2600.0 2900.0 3100.0 -1800.0 2200.0 2400.0 2700.0 3000.0 3200.0 -1900.0 2300.0 2500.0 2700.0 3000.0 3200.0 -1900.0 2300.0 2500.0 2700.0 2900.0 3100.0 -1900.0 2300.0 2500.0 2800.0 3000.0 3200.0 -1900.0 2300.0 2500.0 2700.0 2900.0 3200.0 -1800.0 2200.0 2400.0 2700.0 2900.0 3100.0 -1800.0 2000.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1700.0 2100.0 2800.0 3100.0 3200.0 -1400.0 1800.0 2200.0 2500.0 3000.0 3100.0 -1400.0 1800.0 2300.0 2500.0 3000.0 3100.0 -1400.0 1800.0 2300.0 2500.0 2900.0 3100.0 -1600.0 1800.0 2500.0 2800.0 3100.0 3200.0 -1700.0 2000.0 2400.0 2700.0 3200.0 3400.0 -1700.0 2000.0 2500.0 2800.0 3100.0 3400.0 -1500.0 1700.0 2300.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2200.0 2600.0 2800.0 3200.0 -1500.0 1700.0 2200.0 2600.0 2900.0 3300.0 -1400.0 1700.0 2200.0 2600.0 2900.0 3300.0 -1200.0 1500.0 2200.0 2300.0 3100.0 3400.0 -1200.0 1600.0 2300.0 2400.0 3200.0 3300.0 -1200.0 1700.0 2300.0 2400.0 3100.0 3300.0 -1100.0 1700.0 2400.0 2500.0 3100.0 3300.0 -1100.0 1800.0 2500.0 2600.0 3100.0 3300.0 -1100.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1000.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1000.0 1700.0 2400.0 2500.0 3200.0 3300.0 -1100.0 1600.0 2400.0 2500.0 3200.0 3300.0 -1100.0 1600.0 2300.0 2400.0 3200.0 3300.0 -1300.0 1600.0 2300.0 2500.0 3100.0 3300.0 -1400.0 1700.0 2300.0 2500.0 3100.0 3300.0 -2000.0 2100.0 2500.0 2600.0 3200.0 3400.0 -1700.0 2100.0 2600.0 2800.0 3100.0 3200.0 -1800.0 2200.0 2700.0 2900.0 3100.0 3300.0 -2100.0 2400.0 2700.0 2900.0 3200.0 3300.0 -2100.0 2500.0 2700.0 2900.0 3300.0 3400.0 -2100.0 2400.0 2600.0 2800.0 3200.0 3400.0 -1700.0 1900.0 2400.0 2600.0 2900.0 3000.0 -1600.0 1900.0 2400.0 2500.0 2800.0 2900.0 -1300.0 2000.0 2400.0 2500.0 2900.0 3200.0 -1500.0 2000.0 2400.0 2500.0 2900.0 3100.0 -1600.0 2000.0 2400.0 2600.0 3000.0 3100.0 -1700.0 1900.0 2500.0 2600.0 3100.0 3200.0 -1600.0 1800.0 2600.0 2700.0 3300.0 3400.0 -1500.0 1600.0 2600.0 2700.0 3200.0 3400.0 -1500.0 1700.0 2600.0 2700.0 3200.0 3400.0 -1500.0 2100.0 2600.0 2800.0 3300.0 3400.0 -1700.0 2200.0 2700.0 2900.0 3300.0 3400.0 -1700.0 2300.0 2700.0 2800.0 3300.0 3400.0 -1800.0 2300.0 2700.0 2800.0 3300.0 3400.0 -1400.0 1700.0 2500.0 2600.0 3000.0 3300.0 -1400.0 1800.0 2500.0 2600.0 3000.0 3300.0 -1800.0 2200.0 2700.0 2900.0 3300.0 3400.0 -1800.0 2300.0 2600.0 2900.0 3300.0 3400.0 -1400.0 1900.0 2500.0 2600.0 3200.0 3400.0 -1400.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1400.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1200.0 2000.0 2400.0 2700.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2600.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2500.0 3100.0 3200.0 -1200.0 1700.0 2300.0 2500.0 3000.0 3100.0 -1200.0 1800.0 2400.0 2500.0 3000.0 3100.0 -1100.0 2100.0 2300.0 2600.0 3000.0 3100.0 -1400.0 1800.0 2200.0 2700.0 3100.0 3200.0 -1600.0 2000.0 2400.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2400.0 2600.0 3300.0 3400.0 -1600.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1600.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1500.0 2400.0 2700.0 2800.0 3100.0 3300.0 -1300.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1400.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1600.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1600.0 2100.0 2300.0 2500.0 3000.0 3100.0 -1800.0 2100.0 2400.0 2700.0 2900.0 3200.0 -1500.0 1700.0 2000.0 2600.0 3200.0 3300.0 -1400.0 1700.0 2000.0 2400.0 3200.0 3300.0 -1400.0 1900.0 2200.0 2500.0 3100.0 3300.0 -1500.0 1900.0 2200.0 2500.0 3100.0 3300.0 -1200.0 1900.0 2500.0 2600.0 3100.0 3300.0 -1000.0 1700.0 2600.0 2800.0 3300.0 3400.0 -1200.0 1500.0 2400.0 2700.0 2900.0 3200.0 -1700.0 2100.0 2400.0 2800.0 3200.0 3400.0 -1700.0 2000.0 2600.0 2800.0 3100.0 3400.0 -1700.0 2000.0 2600.0 2700.0 3000.0 3300.0 -1500.0 1700.0 2500.0 2700.0 3000.0 3300.0 -1600.0 2000.0 2600.0 2800.0 3100.0 3300.0 -1500.0 2000.0 2500.0 2800.0 3200.0 3400.0 -1400.0 1800.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2200.0 2600.0 2900.0 3200.0 3400.0 -1700.0 2200.0 2600.0 2800.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1500.0 1800.0 2200.0 2500.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2700.0 3300.0 3400.0 -1400.0 1800.0 2500.0 2700.0 3000.0 3300.0 -1300.0 1600.0 2500.0 2600.0 3200.0 3400.0 -1400.0 1700.0 2500.0 2600.0 3300.0 3400.0 -1500.0 1700.0 2400.0 2500.0 3200.0 3400.0 -1900.0 2000.0 2300.0 2500.0 3200.0 3400.0 -1600.0 1900.0 2100.0 2500.0 3000.0 3200.0 -1600.0 2100.0 2500.0 2800.0 3200.0 3300.0 -1400.0 2000.0 2400.0 2700.0 3200.0 3300.0 -900.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1100.0 1600.0 2700.0 2800.0 3200.0 3400.0 -1200.0 1600.0 2600.0 2800.0 3200.0 3400.0 -1300.0 1700.0 2500.0 2700.0 3100.0 3300.0 -1400.0 1700.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1800.0 2300.0 2500.0 3100.0 3200.0 -1400.0 2100.0 2400.0 2600.0 2900.0 3100.0 -1300.0 2000.0 2400.0 2600.0 3100.0 3200.0 -1200.0 1800.0 2300.0 2500.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2500.0 3100.0 3300.0 -1600.0 2000.0 2400.0 2600.0 3200.0 3400.0 -1800.0 2000.0 2300.0 2500.0 3100.0 3400.0 -1700.0 1900.0 2300.0 2400.0 3100.0 3300.0 -1600.0 1800.0 2300.0 2400.0 2900.0 3300.0 -1600.0 1800.0 2300.0 2400.0 3000.0 3300.0 -1600.0 1700.0 2300.0 2400.0 3000.0 3300.0 -1600.0 1700.0 2300.0 2400.0 2800.0 3200.0 -1600.0 1700.0 2300.0 2400.0 2900.0 3300.0 -1500.0 1700.0 2300.0 2500.0 3000.0 3300.0 -1400.0 1700.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1600.0 2500.0 2700.0 3100.0 3300.0 -1300.0 1500.0 2500.0 2700.0 3100.0 3300.0 -1300.0 1600.0 2400.0 2700.0 3000.0 3400.0 -1800.0 2300.0 2600.0 2800.0 3100.0 3300.0 -1800.0 2200.0 2500.0 2800.0 3100.0 3300.0 -1700.0 2100.0 2500.0 2700.0 3000.0 3300.0 -1600.0 1900.0 2500.0 2700.0 2900.0 3200.0 -1700.0 2000.0 2500.0 2700.0 3000.0 3200.0 -1700.0 2300.0 2600.0 2700.0 3200.0 3400.0 -1400.0 1700.0 1900.0 2200.0 3200.0 3300.0 -1200.0 1900.0 2100.0 2600.0 3100.0 3200.0 -1200.0 1900.0 2200.0 2700.0 3100.0 3200.0 -1200.0 1900.0 2300.0 2700.0 3200.0 3300.0 -1100.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1200.0 1900.0 2400.0 2700.0 3200.0 3300.0 -1200.0 1800.0 2300.0 2600.0 3200.0 3400.0 -1200.0 1600.0 2400.0 2700.0 3200.0 3400.0 -1200.0 1500.0 2400.0 2600.0 3000.0 3200.0 -1300.0 1500.0 2100.0 2500.0 2700.0 3000.0 -1200.0 1800.0 2400.0 2600.0 3100.0 3200.0 -1200.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1700.0 2400.0 2700.0 3100.0 3300.0 3400.0 -2000.0 2500.0 2700.0 3100.0 3400.0 3500.0 -1900.0 2400.0 2700.0 3100.0 3400.0 3500.0 -1900.0 2200.0 2700.0 3100.0 3300.0 3400.0 -1800.0 2200.0 2700.0 3100.0 3300.0 3400.0 -1500.0 1700.0 2100.0 2500.0 3200.0 3300.0 -1400.0 1800.0 2100.0 2600.0 3200.0 3300.0 -1200.0 1700.0 2000.0 2300.0 3300.0 3400.0 -1300.0 1500.0 1600.0 2300.0 3100.0 3200.0 -1500.0 1900.0 2400.0 2600.0 3000.0 3300.0 -1500.0 2000.0 2400.0 2500.0 2800.0 3200.0 -1400.0 2000.0 2400.0 2500.0 2900.0 3200.0 -1300.0 1600.0 1700.0 2300.0 3300.0 3400.0 -1300.0 1600.0 1700.0 2100.0 3200.0 3400.0 -2000.0 2200.0 2500.0 2900.0 3300.0 3400.0 -2100.0 2300.0 2500.0 2700.0 3300.0 3400.0 -1900.0 2200.0 2400.0 2700.0 3300.0 3400.0 -1500.0 1900.0 2200.0 2400.0 3000.0 3300.0 -1500.0 1900.0 2400.0 2700.0 3300.0 3400.0 -1500.0 1700.0 2500.0 2700.0 3200.0 3400.0 -1500.0 1700.0 2500.0 2600.0 3100.0 3400.0 -1600.0 2000.0 2400.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2600.0 3000.0 3100.0 -1500.0 1800.0 2200.0 2600.0 3000.0 3100.0 -1500.0 1900.0 2400.0 2500.0 3000.0 3200.0 -1200.0 1500.0 2400.0 2600.0 3200.0 3300.0 -1500.0 2000.0 2500.0 2700.0 3100.0 3300.0 -1700.0 2100.0 2500.0 2900.0 3200.0 3300.0 -1400.0 1800.0 2400.0 2500.0 3100.0 3300.0 -1400.0 2000.0 2300.0 2500.0 3200.0 3400.0 -1200.0 1900.0 2200.0 2400.0 3300.0 3400.0 -1200.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1200.0 1900.0 2300.0 2400.0 3300.0 3400.0 -1200.0 1700.0 2300.0 2400.0 3300.0 3400.0 -1200.0 1600.0 2200.0 2300.0 3300.0 3400.0 -1200.0 1600.0 2200.0 2400.0 3300.0 3400.0 -1300.0 1600.0 2100.0 2400.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2600.0 2900.0 3200.0 -2100.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1600.0 1800.0 2300.0 2500.0 3100.0 3300.0 -1500.0 1800.0 2300.0 2500.0 3100.0 3300.0 -1400.0 1800.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1800.0 2400.0 2600.0 3100.0 3300.0 -1300.0 1800.0 2400.0 2700.0 3200.0 3300.0 -1100.0 1800.0 2400.0 2700.0 3200.0 3300.0 -1400.0 2000.0 2500.0 2600.0 2900.0 3200.0 -1500.0 2100.0 2500.0 2600.0 2900.0 3200.0 -1500.0 1900.0 2400.0 2600.0 3100.0 3300.0 -1300.0 1900.0 2400.0 2800.0 3100.0 3300.0 -1300.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1300.0 1800.0 2600.0 2700.0 3100.0 3400.0 -1300.0 1700.0 2600.0 2700.0 3100.0 3300.0 -1300.0 1700.0 2600.0 2700.0 3100.0 3400.0 -1400.0 1900.0 2400.0 2600.0 2900.0 3100.0 -1500.0 1800.0 2300.0 2600.0 2900.0 3100.0 -1600.0 1900.0 2400.0 2600.0 3000.0 3200.0 -1700.0 2000.0 2600.0 2900.0 3100.0 3300.0 -1800.0 2300.0 2500.0 2800.0 3200.0 3400.0 -1900.0 2300.0 2600.0 2900.0 3300.0 3400.0 -1600.0 1900.0 2500.0 2600.0 3000.0 3100.0 -1600.0 1900.0 2500.0 2600.0 3000.0 3200.0 -1500.0 1800.0 2200.0 2500.0 3200.0 3300.0 -1500.0 1900.0 2200.0 2500.0 3300.0 3400.0 -1500.0 1800.0 2200.0 2400.0 3200.0 3400.0 -1500.0 1800.0 2100.0 2400.0 3200.0 3400.0 -1600.0 1800.0 2100.0 2200.0 3200.0 3400.0 -1700.0 1800.0 2100.0 2400.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2400.0 2700.0 3100.0 -1600.0 1900.0 2400.0 2500.0 3000.0 3300.0 -1600.0 2100.0 2500.0 2600.0 3200.0 3400.0 -1200.0 2000.0 2400.0 2500.0 3400.0 3500.0 -1200.0 1600.0 2300.0 2400.0 3200.0 3400.0 -1400.0 1900.0 2400.0 2500.0 3000.0 3200.0 -1300.0 1800.0 2100.0 2500.0 3100.0 3300.0 -1300.0 1700.0 2300.0 2500.0 3100.0 3300.0 -1300.0 1700.0 2200.0 2400.0 3200.0 3300.0 -1300.0 1800.0 2200.0 2400.0 3200.0 3300.0 -1500.0 1800.0 2300.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2300.0 2500.0 3300.0 3400.0 -1700.0 1900.0 2400.0 2600.0 3300.0 3400.0 -1700.0 1900.0 2500.0 2700.0 3000.0 3100.0 -1700.0 1800.0 2500.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2500.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2400.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2400.0 2600.0 3100.0 3300.0 -1500.0 1700.0 2400.0 2600.0 3100.0 3300.0 -1300.0 1700.0 2400.0 2600.0 3100.0 3300.0 -1300.0 1700.0 2400.0 2600.0 3200.0 3300.0 -1400.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1400.0 1800.0 2300.0 2600.0 3200.0 3300.0 -1500.0 1800.0 2300.0 2600.0 3300.0 3400.0 -1500.0 1800.0 2300.0 2500.0 3300.0 3400.0 -1500.0 1700.0 2200.0 2400.0 3300.0 3400.0 -1800.0 2200.0 2400.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2600.0 3200.0 3300.0 -1900.0 2000.0 2200.0 2500.0 3300.0 3400.0 -1900.0 2100.0 2300.0 2600.0 3300.0 3400.0 -1800.0 1900.0 2200.0 2600.0 3100.0 3300.0 -1100.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1000.0 1700.0 2700.0 2800.0 3200.0 3300.0 -1000.0 1800.0 2600.0 2700.0 3000.0 3100.0 -1200.0 2000.0 2600.0 2800.0 3200.0 3300.0 -1200.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1200.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1200.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1300.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1300.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1400.0 1900.0 2300.0 2600.0 3300.0 3400.0 -2200.0 2400.0 2500.0 2900.0 3200.0 3300.0 -2100.0 2200.0 2400.0 2800.0 3200.0 3300.0 -2000.0 2200.0 2400.0 2800.0 3200.0 3300.0 -1900.0 2100.0 2400.0 2800.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2400.0 2800.0 3000.0 -1600.0 1900.0 2300.0 2400.0 2900.0 3300.0 -1800.0 2100.0 2400.0 2500.0 3100.0 3200.0 -1800.0 2300.0 2500.0 2700.0 3200.0 3300.0 -1800.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1500.0 1900.0 2100.0 2700.0 3000.0 3100.0 -1500.0 1700.0 1800.0 2600.0 3300.0 3400.0 -1500.0 1700.0 1800.0 2500.0 3300.0 3400.0 -1300.0 1500.0 1600.0 2500.0 3200.0 3300.0 -1300.0 1500.0 1700.0 2400.0 3000.0 3100.0 -1600.0 2000.0 2500.0 2700.0 3300.0 3400.0 -2000.0 2100.0 2400.0 2700.0 3300.0 3400.0 -1800.0 2000.0 2200.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2100.0 2600.0 3200.0 3300.0 -1700.0 2000.0 2100.0 2700.0 3200.0 3300.0 -1700.0 2100.0 2200.0 2700.0 3200.0 3300.0 -1700.0 2200.0 2400.0 2700.0 3200.0 3300.0 -1700.0 2200.0 2400.0 2600.0 3200.0 3300.0 -1700.0 2100.0 2500.0 2600.0 3200.0 3300.0 -1800.0 2400.0 2600.0 3000.0 3300.0 3400.0 -1800.0 2400.0 2800.0 3100.0 3300.0 3400.0 -1900.0 2400.0 2800.0 3100.0 3300.0 3500.0 -1900.0 2300.0 2800.0 3000.0 3300.0 3400.0 -1600.0 1800.0 2400.0 2600.0 3000.0 3100.0 -1500.0 1700.0 1900.0 2500.0 3300.0 3400.0 -1200.0 1700.0 2200.0 2300.0 3100.0 3300.0 -1100.0 1500.0 2300.0 2400.0 3000.0 3300.0 -1200.0 1600.0 2300.0 2400.0 3100.0 3300.0 -1200.0 1600.0 2300.0 2400.0 3100.0 3400.0 -1300.0 1600.0 2200.0 2400.0 3200.0 3300.0 -1500.0 1600.0 2100.0 2400.0 3000.0 3300.0 -1600.0 1700.0 2100.0 2400.0 3100.0 3300.0 -1500.0 1600.0 2100.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2200.0 2600.0 3100.0 3300.0 -1500.0 1800.0 2200.0 2500.0 3000.0 3200.0 -1400.0 1800.0 2200.0 2500.0 2900.0 3200.0 -1300.0 1600.0 2200.0 2600.0 3000.0 3200.0 -1700.0 2000.0 2400.0 2800.0 3000.0 3100.0 -1700.0 2100.0 2400.0 2700.0 3000.0 3100.0 -1800.0 2200.0 2500.0 2800.0 3000.0 3200.0 -1700.0 2100.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2200.0 2500.0 2700.0 3200.0 3400.0 -1600.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2400.0 3200.0 3300.0 -1500.0 1700.0 1900.0 2300.0 3300.0 3400.0 -1400.0 1600.0 1800.0 2200.0 3300.0 3400.0 -1500.0 1600.0 1900.0 2600.0 3000.0 3200.0 -1500.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1200.0 1900.0 2100.0 2500.0 3200.0 3300.0 -1900.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1800.0 2100.0 2300.0 2600.0 3300.0 3400.0 -1700.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1600.0 2100.0 2300.0 2700.0 3200.0 3300.0 -1500.0 1900.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1900.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1500.0 2100.0 2500.0 2600.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2500.0 2900.0 3100.0 -1800.0 2000.0 2500.0 2800.0 3000.0 3200.0 -1400.0 1600.0 2100.0 2600.0 3000.0 3300.0 -1700.0 2000.0 2400.0 2700.0 3300.0 3400.0 -1700.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1700.0 2100.0 2600.0 2700.0 3000.0 3300.0 -1800.0 2100.0 2500.0 2700.0 3100.0 3200.0 -2200.0 2300.0 2500.0 2800.0 3200.0 3300.0 -2100.0 2300.0 2500.0 2800.0 3200.0 3300.0 -2000.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2700.0 3100.0 3200.0 -1600.0 2000.0 2400.0 2700.0 3100.0 3400.0 -1300.0 1800.0 2100.0 2500.0 3100.0 3200.0 -1300.0 1800.0 2200.0 2800.0 3100.0 3200.0 -1300.0 2000.0 2200.0 2600.0 3200.0 3300.0 -1900.0 2100.0 2400.0 2500.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1500.0 1900.0 2400.0 2600.0 3300.0 3400.0 -1500.0 1800.0 2400.0 2600.0 3200.0 3400.0 -1500.0 1700.0 2400.0 2600.0 3200.0 3400.0 -1400.0 1700.0 2400.0 2600.0 3100.0 3300.0 -1400.0 1900.0 2500.0 2600.0 2900.0 3200.0 -1400.0 1900.0 2400.0 2700.0 3000.0 3200.0 -1400.0 1900.0 2400.0 2600.0 3000.0 3100.0 -1400.0 1900.0 2300.0 2500.0 2700.0 3000.0 -1300.0 1800.0 2200.0 2500.0 3300.0 3400.0 -1300.0 1800.0 2200.0 2400.0 3300.0 3400.0 -1300.0 1700.0 2100.0 2400.0 3200.0 3400.0 -1400.0 1900.0 2300.0 2600.0 3100.0 3300.0 -1900.0 2200.0 2400.0 2800.0 3100.0 3200.0 -1600.0 2200.0 2400.0 2700.0 3300.0 3400.0 -1600.0 2100.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1700.0 2000.0 2500.0 3000.0 3200.0 -1400.0 1800.0 2300.0 2500.0 3000.0 3200.0 -1700.0 1900.0 2100.0 2400.0 3200.0 3300.0 -1800.0 1900.0 2200.0 2500.0 3200.0 3300.0 -1900.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2000.0 2500.0 2600.0 3100.0 3300.0 -1400.0 1900.0 2300.0 2500.0 2800.0 3200.0 -1400.0 1900.0 2300.0 2500.0 2900.0 3300.0 -1400.0 1600.0 2300.0 2500.0 3000.0 3200.0 -1400.0 1600.0 2200.0 2500.0 3100.0 3200.0 -2000.0 2200.0 2500.0 2700.0 3000.0 3300.0 -1600.0 2100.0 2600.0 2900.0 3200.0 3300.0 -1500.0 1700.0 2100.0 2500.0 3100.0 3200.0 -1200.0 2100.0 2600.0 2700.0 3200.0 3300.0 -1100.0 2100.0 2600.0 2800.0 3200.0 3300.0 -1000.0 2000.0 2800.0 2900.0 3100.0 3200.0 -1600.0 1900.0 2100.0 2500.0 3000.0 3100.0 -1700.0 1900.0 2200.0 2500.0 3000.0 3100.0 -1700.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1400.0 2000.0 2300.0 2400.0 3200.0 3300.0 -1300.0 2000.0 2200.0 2400.0 3100.0 3200.0 -1200.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1200.0 1800.0 2300.0 2600.0 3100.0 3200.0 -1300.0 1600.0 2300.0 2700.0 3100.0 3200.0 -1300.0 1700.0 2300.0 2700.0 3100.0 3200.0 -1100.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1300.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1300.0 1900.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1800.0 2100.0 2600.0 3300.0 3400.0 -1500.0 1900.0 2100.0 2500.0 2800.0 3000.0 -1500.0 2000.0 2200.0 2500.0 3000.0 3100.0 -1500.0 2000.0 2200.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2300.0 2500.0 3100.0 3200.0 -1600.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1600.0 1900.0 2400.0 2600.0 2900.0 3100.0 -1900.0 2300.0 2600.0 2800.0 3100.0 3200.0 -2000.0 2400.0 2700.0 2800.0 3100.0 3200.0 -1300.0 1800.0 2000.0 2400.0 3100.0 3200.0 -1100.0 1700.0 2100.0 2400.0 3100.0 3200.0 -1300.0 1600.0 2100.0 2500.0 3000.0 3100.0 -1200.0 1700.0 2200.0 2500.0 3000.0 3200.0 -1400.0 1800.0 2100.0 2300.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2200.0 3200.0 3300.0 -1700.0 1900.0 2100.0 2300.0 3200.0 3300.0 -1800.0 1900.0 2400.0 2800.0 3100.0 3200.0 -2000.0 2300.0 2800.0 3000.0 3100.0 3300.0 -2100.0 2300.0 2700.0 3000.0 3200.0 3300.0 -2100.0 2300.0 2600.0 2900.0 3200.0 3300.0 -2200.0 2400.0 2700.0 2800.0 3200.0 3300.0 -1700.0 2000.0 2300.0 2500.0 3000.0 3100.0 -1600.0 2000.0 2300.0 2400.0 2800.0 3200.0 -1700.0 2100.0 2300.0 2400.0 2900.0 3200.0 -1400.0 1800.0 2300.0 2600.0 3000.0 3300.0 -1500.0 2200.0 2400.0 2700.0 3100.0 3200.0 -1500.0 2200.0 2500.0 2700.0 3200.0 3300.0 -1400.0 1600.0 2400.0 2500.0 3100.0 3400.0 -1600.0 2200.0 2500.0 2800.0 3300.0 3400.0 -1600.0 2000.0 2500.0 2800.0 3300.0 3400.0 -1400.0 1700.0 2400.0 2500.0 3200.0 3400.0 -1400.0 1600.0 2400.0 2600.0 3200.0 3300.0 -1400.0 1700.0 2300.0 2500.0 3200.0 3300.0 -1500.0 2000.0 2300.0 2400.0 2800.0 3200.0 -1500.0 2000.0 2300.0 2400.0 2700.0 3200.0 -1400.0 1900.0 2300.0 2500.0 3000.0 3300.0 -1200.0 1400.0 2300.0 2600.0 2900.0 3100.0 -1500.0 2000.0 2300.0 2500.0 3000.0 3200.0 -1800.0 2000.0 2500.0 2600.0 3100.0 3200.0 -1500.0 1800.0 2400.0 2600.0 3000.0 3200.0 -1200.0 1500.0 2200.0 2400.0 3000.0 3100.0 -1500.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1700.0 2000.0 2600.0 2800.0 3200.0 3300.0 -1500.0 1900.0 2100.0 2500.0 3200.0 3300.0 -1700.0 1800.0 2000.0 2300.0 3000.0 3100.0 -1600.0 1900.0 2300.0 2500.0 2800.0 3100.0 -1600.0 1800.0 2300.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2300.0 2500.0 3200.0 3300.0 -1700.0 1800.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1700.0 2200.0 2400.0 3000.0 3300.0 -1500.0 1700.0 2300.0 2500.0 3200.0 3400.0 -1500.0 1700.0 2300.0 2400.0 2800.0 3300.0 -1600.0 1700.0 2200.0 2400.0 2600.0 3200.0 -1700.0 1800.0 2200.0 2400.0 2900.0 3300.0 -1900.0 2100.0 2400.0 2500.0 3100.0 3300.0 -1900.0 2000.0 2400.0 2500.0 3100.0 3300.0 -1900.0 2300.0 2500.0 2900.0 3200.0 3300.0 -2200.0 2400.0 2700.0 3100.0 3300.0 3400.0 -2200.0 2400.0 2800.0 3100.0 3300.0 3400.0 -1500.0 1900.0 2300.0 2400.0 3200.0 3300.0 -1500.0 1800.0 2200.0 2300.0 3100.0 3300.0 -1700.0 2000.0 2600.0 2900.0 3200.0 3400.0 -1500.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1300.0 1600.0 2000.0 2500.0 3000.0 3200.0 -1800.0 2000.0 2200.0 2500.0 3000.0 3100.0 -1200.0 1800.0 2200.0 2400.0 3100.0 3200.0 -1300.0 1500.0 2100.0 2200.0 3100.0 3200.0 -1400.0 1900.0 2200.0 2300.0 3200.0 3300.0 -1900.0 2300.0 2600.0 3000.0 3200.0 3400.0 -1900.0 2300.0 2600.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2600.0 2900.0 3100.0 3300.0 -1200.0 1500.0 2500.0 2600.0 3100.0 3200.0 -1400.0 1900.0 2300.0 2400.0 2600.0 3100.0 -1500.0 1600.0 2100.0 2400.0 2900.0 3200.0 -1400.0 1600.0 2200.0 2600.0 2900.0 3200.0 -1700.0 1800.0 2100.0 2300.0 3000.0 3100.0 -1700.0 1900.0 2100.0 2300.0 3100.0 3200.0 -1800.0 1900.0 2200.0 2300.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2300.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1600.0 1700.0 2200.0 2300.0 3100.0 3300.0 -1700.0 2100.0 2400.0 2900.0 3300.0 3400.0 -1600.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1500.0 2000.0 2400.0 2600.0 3100.0 3200.0 -1600.0 2000.0 2300.0 2500.0 2800.0 3000.0 -1500.0 1700.0 1800.0 2200.0 2800.0 2900.0 -1500.0 1700.0 1900.0 2100.0 2700.0 2800.0 -1600.0 2000.0 2300.0 2500.0 3000.0 3300.0 -1900.0 2300.0 2500.0 2800.0 3100.0 3200.0 -2200.0 2400.0 2600.0 3000.0 3200.0 3300.0 -2300.0 2500.0 2800.0 3100.0 3300.0 3400.0 -1900.0 2400.0 2700.0 3000.0 3400.0 3500.0 -1900.0 2400.0 2600.0 3000.0 3400.0 3500.0 -1800.0 2300.0 2700.0 3100.0 3400.0 3500.0 -1800.0 2300.0 2700.0 3000.0 3300.0 3400.0 -1400.0 1700.0 2200.0 2500.0 3200.0 3400.0 -1600.0 1900.0 2500.0 2600.0 3100.0 3300.0 -2000.0 2300.0 2600.0 2800.0 3300.0 3400.0 -1900.0 2200.0 2500.0 2800.0 3300.0 3400.0 -1700.0 2100.0 2400.0 2700.0 3300.0 3400.0 -1600.0 1700.0 2300.0 2500.0 3200.0 3400.0 -1600.0 1700.0 2300.0 2400.0 3300.0 3400.0 -1600.0 1800.0 2400.0 2600.0 3300.0 3400.0 -1500.0 1700.0 2300.0 2700.0 3300.0 3400.0 -1400.0 1800.0 2300.0 2400.0 3100.0 3400.0 -1500.0 2000.0 2300.0 2400.0 2900.0 3200.0 -1500.0 1900.0 2300.0 2400.0 2800.0 3200.0 -1300.0 1800.0 2200.0 2500.0 3000.0 3100.0 -1200.0 1700.0 2200.0 2300.0 3200.0 3300.0 -1200.0 1700.0 2200.0 2400.0 3200.0 3300.0 -1100.0 1700.0 2200.0 2400.0 3200.0 3300.0 -1100.0 1700.0 2300.0 2500.0 3100.0 3200.0 -1100.0 1700.0 2300.0 2600.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2600.0 3000.0 3200.0 -1300.0 1900.0 2300.0 2600.0 3000.0 3300.0 -1300.0 1800.0 2300.0 2600.0 3100.0 3300.0 -1400.0 2000.0 2500.0 2800.0 3200.0 3300.0 -1200.0 1600.0 2400.0 2700.0 3200.0 3300.0 -1500.0 1800.0 2300.0 2500.0 3100.0 3200.0 -1500.0 1600.0 2200.0 2600.0 3000.0 3200.0 -1500.0 1600.0 2200.0 2500.0 3000.0 3300.0 -1200.0 1600.0 2400.0 2600.0 3200.0 3400.0 -1000.0 2300.0 2800.0 2900.0 3100.0 3200.0 -900.0 1700.0 2700.0 2800.0 3200.0 3300.0 -1500.0 1700.0 2400.0 2500.0 3100.0 3200.0 -1500.0 1900.0 2400.0 2500.0 3100.0 3200.0 -1400.0 1900.0 2400.0 2500.0 2900.0 3100.0 -1600.0 2100.0 2400.0 2600.0 3000.0 3100.0 -1700.0 1900.0 2300.0 2500.0 3000.0 3100.0 -2100.0 2400.0 2600.0 2900.0 3100.0 3300.0 -2200.0 2400.0 2700.0 2900.0 3200.0 3300.0 -2100.0 2200.0 2700.0 2800.0 3100.0 3300.0 -2000.0 2100.0 2300.0 2600.0 3100.0 3300.0 -1800.0 2000.0 2100.0 2600.0 3100.0 3200.0 -1800.0 1900.0 2200.0 2500.0 2900.0 3000.0 -1800.0 1900.0 2300.0 2400.0 3000.0 3100.0 -1800.0 1900.0 2200.0 2400.0 3000.0 3100.0 -1800.0 2000.0 2200.0 2500.0 3100.0 3200.0 -1800.0 2000.0 2300.0 2800.0 3100.0 3200.0 -1800.0 2000.0 2400.0 2800.0 3100.0 3200.0 -1800.0 2000.0 2400.0 2800.0 3000.0 3100.0 -1700.0 1900.0 2300.0 2700.0 2900.0 3100.0 -1700.0 1900.0 2200.0 2700.0 2900.0 3100.0 -1600.0 1800.0 2000.0 2600.0 2800.0 3000.0 -1500.0 1700.0 2000.0 2500.0 2900.0 3100.0 -1700.0 1900.0 2200.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2300.0 2400.0 3100.0 3300.0 -1800.0 2000.0 2300.0 2500.0 3000.0 3100.0 -1800.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1400.0 1600.0 2100.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2000.0 2500.0 3000.0 3200.0 -1400.0 1800.0 2000.0 2400.0 3200.0 3300.0 -1200.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1100.0 1700.0 2100.0 2300.0 3000.0 3100.0 -1300.0 1500.0 1700.0 2000.0 2900.0 3100.0 -1600.0 1900.0 2200.0 2400.0 2900.0 3100.0 -1700.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1700.0 1800.0 2100.0 2500.0 3100.0 3300.0 -2000.0 2300.0 2500.0 2700.0 3100.0 3400.0 -1900.0 2200.0 2500.0 2600.0 3000.0 3300.0 -1900.0 2000.0 2300.0 2400.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2400.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2500.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2400.0 3000.0 3100.0 -1500.0 1600.0 2500.0 2600.0 2900.0 3300.0 -1500.0 1700.0 2500.0 2600.0 3100.0 3200.0 -1900.0 2300.0 2500.0 2800.0 3200.0 3300.0 -1400.0 1600.0 2000.0 2600.0 3000.0 3200.0 -1700.0 1900.0 2100.0 2600.0 3000.0 3100.0 -1800.0 1900.0 2400.0 2900.0 3100.0 3300.0 -1800.0 1900.0 2500.0 2900.0 3100.0 3300.0 -1600.0 1800.0 2100.0 2700.0 3000.0 3200.0 -1700.0 2000.0 2300.0 2700.0 2900.0 3200.0 -1600.0 2000.0 2400.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2300.0 2500.0 3300.0 3400.0 -1400.0 1600.0 2200.0 2400.0 3100.0 3300.0 -1500.0 1600.0 2200.0 2500.0 3200.0 3400.0 -1600.0 1700.0 2300.0 2400.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2500.0 3200.0 3300.0 -1600.0 1700.0 2200.0 2500.0 3200.0 3300.0 -1700.0 2100.0 2300.0 2400.0 3100.0 3300.0 -1600.0 2000.0 2400.0 2500.0 3000.0 3300.0 -1500.0 1800.0 2300.0 2400.0 2900.0 3200.0 -1600.0 2000.0 2400.0 2800.0 3200.0 3400.0 -1900.0 2200.0 2600.0 2800.0 3200.0 3400.0 -1900.0 2200.0 2500.0 2800.0 3100.0 3400.0 -1300.0 1800.0 2400.0 2600.0 3100.0 3400.0 -1300.0 1500.0 2400.0 2500.0 2900.0 3300.0 -1300.0 1700.0 2500.0 2600.0 3100.0 3200.0 -1300.0 1700.0 2600.0 2700.0 3200.0 3300.0 -1400.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1400.0 2000.0 2600.0 2700.0 3200.0 3300.0 -1700.0 1900.0 2100.0 2600.0 3200.0 3300.0 -1700.0 2000.0 2100.0 2300.0 3200.0 3300.0 -2000.0 2100.0 2400.0 2600.0 3200.0 3400.0 -2100.0 2200.0 2500.0 2700.0 3200.0 3400.0 -1800.0 1900.0 2500.0 2700.0 3200.0 3400.0 -1700.0 2000.0 2500.0 2700.0 3300.0 3400.0 -1400.0 1900.0 2500.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2500.0 2600.0 3100.0 3300.0 -1600.0 2000.0 2300.0 2600.0 3000.0 3200.0 -1600.0 1900.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1800.0 2300.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2100.0 2500.0 3000.0 3200.0 -1400.0 1800.0 2200.0 2500.0 2700.0 3100.0 -1400.0 1900.0 2300.0 2500.0 3100.0 3200.0 -1300.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1300.0 1900.0 2300.0 2500.0 3100.0 3200.0 -1800.0 2100.0 2500.0 2700.0 3000.0 3300.0 -1800.0 2100.0 2400.0 2700.0 3100.0 3300.0 -1900.0 2100.0 2500.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2300.0 2400.0 3200.0 3400.0 -1700.0 1800.0 2400.0 2500.0 3300.0 3400.0 -1900.0 2000.0 2700.0 2800.0 3200.0 3400.0 -1900.0 2000.0 2600.0 2900.0 3100.0 3300.0 -2000.0 2200.0 2800.0 2900.0 3300.0 3400.0 -2000.0 2100.0 2700.0 2800.0 3300.0 3400.0 -1900.0 2100.0 2400.0 2700.0 3300.0 3400.0 -1600.0 1900.0 2100.0 2500.0 3200.0 3300.0 -1400.0 1900.0 2100.0 2400.0 3200.0 3300.0 -1200.0 1900.0 2100.0 2400.0 3100.0 3200.0 -1200.0 1800.0 2100.0 2500.0 2900.0 3200.0 -1300.0 1700.0 1900.0 2400.0 2800.0 2900.0 -1900.0 2300.0 2600.0 3000.0 3200.0 3300.0 -1800.0 2300.0 2600.0 3000.0 3300.0 3400.0 -1800.0 2200.0 2500.0 2800.0 3300.0 3500.0 -1700.0 1900.0 2300.0 2400.0 3200.0 3400.0 -1800.0 1900.0 2400.0 2500.0 3100.0 3300.0 -2100.0 2200.0 2400.0 2500.0 3100.0 3300.0 -1800.0 2100.0 2500.0 2800.0 3100.0 3200.0 -2000.0 2300.0 2600.0 2700.0 3100.0 3300.0 -2100.0 2200.0 2500.0 2600.0 3100.0 3300.0 -2000.0 2200.0 2300.0 2500.0 3100.0 3300.0 -1800.0 1900.0 2100.0 2300.0 3200.0 3300.0 -1800.0 1900.0 2100.0 2400.0 3300.0 3400.0 -1700.0 1800.0 2200.0 2300.0 3300.0 3400.0 -1700.0 1800.0 2200.0 2300.0 3200.0 3400.0 -1600.0 1700.0 2200.0 2300.0 2900.0 3400.0 -1400.0 1600.0 2500.0 2600.0 3100.0 3200.0 -1300.0 1400.0 2400.0 2600.0 3000.0 3100.0 -1300.0 1500.0 2400.0 2500.0 3000.0 3200.0 -1300.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1300.0 1900.0 2400.0 2500.0 3100.0 3200.0 -1800.0 1900.0 2200.0 2400.0 3300.0 3400.0 -1000.0 1500.0 2500.0 2600.0 3200.0 3400.0 -1000.0 1700.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1700.0 2200.0 2600.0 3000.0 3200.0 -900.0 1800.0 2400.0 2600.0 3300.0 3400.0 -900.0 1800.0 2300.0 2400.0 3300.0 3400.0 -1000.0 1600.0 2300.0 2400.0 3300.0 3400.0 -1400.0 1900.0 2200.0 2600.0 3300.0 3400.0 -1500.0 1900.0 2300.0 2600.0 3300.0 3400.0 -1300.0 2000.0 2200.0 2500.0 3000.0 3200.0 -1100.0 1800.0 2300.0 2500.0 3200.0 3300.0 -1100.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1100.0 1900.0 2400.0 2700.0 3200.0 3300.0 -1300.0 2000.0 2200.0 2400.0 3200.0 3300.0 -1800.0 2100.0 2400.0 2800.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2700.0 3300.0 3400.0 -1700.0 2000.0 2300.0 2700.0 3200.0 3400.0 -1200.0 1600.0 2500.0 2600.0 3200.0 3400.0 -1100.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1500.0 1600.0 2400.0 2700.0 2900.0 3200.0 -1500.0 1800.0 2500.0 2700.0 3100.0 3400.0 -1600.0 1900.0 2600.0 2800.0 3100.0 3300.0 -1700.0 1800.0 2600.0 2700.0 3000.0 3300.0 -1700.0 1800.0 2500.0 2600.0 2900.0 3200.0 -1700.0 1800.0 2500.0 2600.0 3000.0 3300.0 -1600.0 1700.0 2500.0 2600.0 3000.0 3300.0 -1700.0 2000.0 2400.0 2700.0 3100.0 3400.0 -1700.0 1800.0 2400.0 2600.0 2900.0 3200.0 -1800.0 1900.0 2500.0 2600.0 2900.0 3200.0 -1700.0 1800.0 2200.0 2500.0 2700.0 3200.0 -1700.0 1800.0 2300.0 2500.0 2800.0 3200.0 -1500.0 1600.0 2000.0 2400.0 2600.0 2900.0 -1200.0 1300.0 2100.0 2400.0 2600.0 3200.0 -1700.0 2200.0 2500.0 2900.0 3200.0 3400.0 -1700.0 2200.0 2600.0 2900.0 3400.0 3500.0 -1700.0 2100.0 2700.0 2900.0 3400.0 3500.0 -1500.0 1800.0 2400.0 2600.0 3100.0 3300.0 -1100.0 1700.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1700.0 2600.0 2700.0 3200.0 3400.0 -1400.0 1900.0 2600.0 2800.0 3200.0 3300.0 -1600.0 2000.0 2500.0 2900.0 3300.0 3400.0 -1500.0 1700.0 2500.0 2700.0 3100.0 3300.0 -1800.0 2000.0 2500.0 2700.0 2900.0 3300.0 -1900.0 2000.0 2600.0 2700.0 2900.0 3300.0 -1900.0 2100.0 2400.0 2700.0 2900.0 3200.0 -1900.0 2000.0 2500.0 2700.0 3000.0 3300.0 -1900.0 2000.0 2400.0 2700.0 3000.0 3300.0 -1700.0 1900.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1900.0 2500.0 2600.0 3200.0 3500.0 -1900.0 2100.0 2600.0 2900.0 3200.0 3400.0 -2100.0 2300.0 2700.0 2900.0 3200.0 3300.0 -1600.0 2000.0 2200.0 2400.0 3100.0 3200.0 -1700.0 1900.0 2200.0 2400.0 2900.0 3100.0 -1700.0 1800.0 2100.0 2400.0 2800.0 3200.0 -1900.0 2200.0 2500.0 2700.0 3000.0 3200.0 -1900.0 2300.0 2600.0 2700.0 3100.0 3200.0 -1800.0 2400.0 2600.0 2900.0 3200.0 3300.0 -1800.0 2300.0 2500.0 2900.0 3200.0 3300.0 -1600.0 1800.0 2500.0 2600.0 3300.0 3400.0 -1500.0 1700.0 2200.0 2400.0 2900.0 3200.0 -1500.0 1600.0 2200.0 2300.0 2800.0 3200.0 -1400.0 1500.0 2100.0 2200.0 2800.0 3200.0 -1400.0 1500.0 2100.0 2300.0 2800.0 3200.0 -1400.0 1500.0 2200.0 2400.0 2700.0 3100.0 -1700.0 1900.0 2400.0 2800.0 3100.0 3200.0 -1700.0 1800.0 2400.0 2700.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2700.0 2900.0 3300.0 -2000.0 2100.0 2400.0 2700.0 3000.0 3300.0 -1400.0 1600.0 2500.0 2700.0 3100.0 3400.0 -1000.0 1600.0 2300.0 2400.0 3100.0 3200.0 -1100.0 1700.0 2400.0 2500.0 3200.0 3300.0 -1200.0 1700.0 2300.0 2400.0 3100.0 3200.0 -2000.0 2100.0 2400.0 2500.0 3100.0 3300.0 -1900.0 2000.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1800.0 2300.0 2500.0 3200.0 3300.0 -1400.0 1600.0 2300.0 2400.0 3100.0 3300.0 -1300.0 1500.0 2300.0 2500.0 3000.0 3300.0 -1300.0 1500.0 2300.0 2500.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2600.0 3100.0 3200.0 -1800.0 1900.0 2400.0 2500.0 3000.0 3200.0 -1900.0 2400.0 2600.0 3000.0 3200.0 3300.0 -1400.0 1500.0 2400.0 2600.0 2900.0 3300.0 -1400.0 1500.0 2200.0 2600.0 2800.0 3300.0 -1400.0 1500.0 2200.0 2500.0 2800.0 3200.0 -1400.0 1500.0 2300.0 2500.0 3000.0 3300.0 -1600.0 2000.0 2400.0 2700.0 3200.0 3400.0 -1700.0 2200.0 2600.0 2800.0 3100.0 3300.0 -1800.0 2100.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2200.0 2500.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2300.0 3000.0 3300.0 -1600.0 1700.0 2200.0 2500.0 3200.0 3400.0 -1600.0 1800.0 2300.0 2400.0 3100.0 3300.0 -1700.0 1800.0 2200.0 2400.0 3000.0 3300.0 -1700.0 1800.0 2200.0 2300.0 3000.0 3200.0 -1700.0 1800.0 2200.0 2300.0 3100.0 3300.0 -1700.0 2000.0 2200.0 2600.0 3200.0 3300.0 -1800.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1600.0 1700.0 2100.0 2400.0 2900.0 3200.0 -1500.0 1800.0 2300.0 2700.0 3000.0 3300.0 -1500.0 1800.0 2200.0 2600.0 3000.0 3300.0 -1700.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2000.0 2600.0 2800.0 3200.0 3400.0 -1800.0 1900.0 2500.0 2800.0 3100.0 3300.0 -1600.0 1800.0 2500.0 2600.0 3000.0 3300.0 -1200.0 1500.0 2500.0 2700.0 3100.0 3200.0 -1100.0 1900.0 2500.0 2600.0 3100.0 3200.0 -1200.0 1900.0 2400.0 2500.0 3100.0 3200.0 -1500.0 1700.0 2100.0 2200.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2200.0 3300.0 3400.0 -1500.0 1600.0 1800.0 2000.0 3300.0 3400.0 -1400.0 1600.0 1800.0 1900.0 3300.0 3400.0 -1400.0 1600.0 2400.0 2600.0 3000.0 3400.0 -1400.0 1800.0 2500.0 2600.0 3100.0 3200.0 -1500.0 1700.0 2400.0 2700.0 3100.0 3300.0 -1500.0 1800.0 2500.0 2700.0 3000.0 3300.0 -1400.0 1500.0 2400.0 2600.0 3000.0 3300.0 -1200.0 1400.0 2300.0 2400.0 3000.0 3200.0 -1200.0 1600.0 2300.0 2400.0 3100.0 3200.0 -1400.0 2000.0 2400.0 2700.0 3100.0 3300.0 -1600.0 1900.0 2300.0 2700.0 3100.0 3200.0 -1500.0 1900.0 2300.0 2700.0 3100.0 3200.0 -1200.0 1400.0 2300.0 2500.0 3100.0 3300.0 -1800.0 1900.0 2400.0 2600.0 3000.0 3100.0 -1800.0 1900.0 2500.0 2600.0 2900.0 3100.0 -1600.0 2000.0 2400.0 2700.0 3000.0 3300.0 -1600.0 1900.0 2400.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2500.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2400.0 2500.0 2900.0 3300.0 -1700.0 1800.0 2300.0 2500.0 2900.0 3200.0 -1700.0 1800.0 2400.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2500.0 3000.0 3200.0 -1700.0 2000.0 2300.0 2500.0 3000.0 3200.0 -1800.0 2000.0 2300.0 2500.0 3000.0 3200.0 -1900.0 2100.0 2300.0 2600.0 3000.0 3200.0 -1900.0 2100.0 2400.0 2600.0 3000.0 3300.0 -2000.0 2100.0 2300.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2300.0 2600.0 3100.0 3300.0 -1700.0 2100.0 2500.0 2700.0 3200.0 3400.0 -1700.0 1900.0 2300.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2400.0 2900.0 3300.0 -1800.0 1900.0 2300.0 2500.0 3000.0 3300.0 -1800.0 2000.0 2200.0 2500.0 2900.0 3200.0 -1900.0 2200.0 2400.0 2600.0 2900.0 3200.0 -1700.0 2100.0 2600.0 2800.0 3100.0 3300.0 -1800.0 2300.0 2700.0 2900.0 3200.0 3300.0 -2000.0 2300.0 2800.0 2900.0 3100.0 3300.0 -2100.0 2200.0 2600.0 2800.0 3200.0 3300.0 -1800.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2600.0 3100.0 3200.0 -1800.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1600.0 1800.0 2000.0 3100.0 3300.0 -1300.0 1700.0 2300.0 2400.0 3100.0 3200.0 -1500.0 1700.0 2300.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2300.0 2500.0 2900.0 3100.0 -1500.0 1700.0 2300.0 2500.0 2900.0 3100.0 -1500.0 1700.0 2300.0 2500.0 2800.0 3000.0 -1500.0 1600.0 2300.0 2500.0 2800.0 3200.0 -1400.0 1500.0 2300.0 2600.0 3000.0 3200.0 -1200.0 1600.0 2400.0 2500.0 3000.0 3300.0 -1400.0 1600.0 2200.0 2500.0 2900.0 3200.0 -1500.0 1900.0 2300.0 2600.0 2900.0 3200.0 -1400.0 1800.0 2400.0 2700.0 3200.0 3400.0 -1500.0 1900.0 2400.0 2700.0 3200.0 3400.0 -1700.0 2100.0 2400.0 2800.0 3000.0 3300.0 -1700.0 2000.0 2500.0 2700.0 3100.0 3400.0 -1800.0 1900.0 2400.0 2800.0 3200.0 3300.0 -1800.0 1900.0 2300.0 2900.0 3200.0 3300.0 -1800.0 1900.0 2500.0 2800.0 3200.0 3300.0 -1700.0 1800.0 2400.0 2800.0 3200.0 3300.0 -1700.0 1800.0 2400.0 2700.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2600.0 3000.0 3300.0 -1600.0 1700.0 2200.0 2500.0 2900.0 3300.0 -1500.0 1600.0 2300.0 2500.0 3000.0 3300.0 -1500.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1500.0 2000.0 2400.0 2800.0 3200.0 3300.0 -1400.0 1800.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1900.0 2400.0 2700.0 3200.0 3400.0 -1300.0 1700.0 2300.0 2500.0 3200.0 3400.0 -1100.0 1700.0 2300.0 2400.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2200.0 3300.0 3400.0 -1900.0 2300.0 2600.0 2800.0 3200.0 3400.0 -1900.0 2400.0 2700.0 2800.0 3300.0 3400.0 -2000.0 2300.0 2700.0 2900.0 3400.0 3500.0 -1900.0 2300.0 2700.0 2900.0 3400.0 3500.0 -1900.0 2100.0 2800.0 2900.0 3300.0 3400.0 -1700.0 1800.0 2700.0 2800.0 3100.0 3300.0 -1500.0 1700.0 2700.0 2800.0 3200.0 3300.0 -1500.0 1600.0 2600.0 2700.0 3000.0 3300.0 -1400.0 1600.0 2600.0 2800.0 3000.0 3200.0 -1200.0 1400.0 2600.0 2700.0 3000.0 3200.0 -1000.0 1500.0 2600.0 2800.0 3200.0 3400.0 -1100.0 1300.0 2500.0 2800.0 3000.0 3200.0 -1500.0 1600.0 2500.0 2600.0 3000.0 3300.0 -1400.0 1500.0 2300.0 2600.0 2800.0 3200.0 -1400.0 1600.0 2200.0 2600.0 2800.0 3100.0 -1500.0 1600.0 2300.0 2700.0 2900.0 3200.0 -1400.0 1500.0 2500.0 2600.0 3100.0 3400.0 -1400.0 1500.0 2400.0 2600.0 2800.0 3300.0 -1400.0 1600.0 2400.0 2600.0 2800.0 3200.0 -1300.0 1600.0 2300.0 2600.0 2900.0 3300.0 -1700.0 2200.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2300.0 2600.0 2700.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2600.0 3100.0 3200.0 -1800.0 2300.0 2500.0 2600.0 3200.0 3300.0 -1900.0 2400.0 2500.0 2800.0 3300.0 3400.0 -1800.0 2000.0 2600.0 2800.0 3300.0 3400.0 -1600.0 1900.0 2400.0 2800.0 3200.0 3300.0 -1700.0 1800.0 2600.0 2800.0 3000.0 3300.0 -1900.0 2000.0 2600.0 2800.0 3200.0 3300.0 -2000.0 2100.0 2700.0 2800.0 3200.0 3400.0 -2000.0 2100.0 2600.0 2800.0 3300.0 3400.0 -1600.0 1700.0 2300.0 2600.0 2900.0 3300.0 -1400.0 1600.0 2400.0 2500.0 2800.0 3200.0 -1800.0 1900.0 2500.0 2700.0 3000.0 3400.0 -1900.0 2000.0 2600.0 2700.0 3000.0 3300.0 -1700.0 2000.0 2400.0 2600.0 2900.0 3200.0 -1500.0 1600.0 2300.0 2600.0 3000.0 3300.0 -1500.0 1600.0 2400.0 2600.0 2900.0 3300.0 -1400.0 1500.0 2300.0 2700.0 3000.0 3300.0 -1600.0 1800.0 2500.0 2600.0 2900.0 3200.0 -2000.0 2100.0 2400.0 2600.0 3000.0 3200.0 -1800.0 2000.0 2300.0 2400.0 3200.0 3300.0 -1600.0 1900.0 2300.0 2400.0 3200.0 3300.0 -1500.0 1800.0 2400.0 2700.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2400.0 3000.0 3200.0 -2000.0 2200.0 2400.0 2500.0 3200.0 3300.0 -2200.0 2300.0 2600.0 2700.0 3200.0 3300.0 -2100.0 2200.0 2400.0 2700.0 3000.0 3200.0 -2100.0 2200.0 2500.0 2700.0 3000.0 3200.0 -2200.0 2300.0 2600.0 2800.0 3000.0 3300.0 -1900.0 2200.0 2600.0 2700.0 3000.0 3300.0 -1700.0 1800.0 2500.0 2700.0 2800.0 3200.0 -1700.0 1800.0 2600.0 2700.0 3000.0 3200.0 -1700.0 1900.0 2500.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2700.0 3300.0 3400.0 -1800.0 2000.0 2400.0 2600.0 3100.0 3200.0 -1700.0 2200.0 2300.0 2500.0 3200.0 3300.0 -1700.0 2200.0 2300.0 2600.0 3100.0 3200.0 -1600.0 1700.0 2400.0 2600.0 3300.0 3400.0 -1600.0 1700.0 2400.0 2500.0 3300.0 3400.0 -1900.0 2100.0 2500.0 2800.0 3000.0 3100.0 -1800.0 2100.0 2500.0 2800.0 3000.0 3100.0 -1800.0 2100.0 2600.0 2800.0 3100.0 3200.0 -1800.0 2000.0 2500.0 2800.0 3100.0 3200.0 -1900.0 2100.0 2500.0 2600.0 3000.0 3200.0 -1800.0 1900.0 2600.0 2800.0 3200.0 3400.0 -1500.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1100.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1100.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1300.0 1500.0 2200.0 2400.0 2900.0 3300.0 -1600.0 1700.0 2300.0 2500.0 2900.0 3300.0 -1600.0 1700.0 2400.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2500.0 2600.0 3100.0 3300.0 -1900.0 2000.0 2500.0 2700.0 3100.0 3200.0 -2100.0 2200.0 2400.0 2600.0 3100.0 3400.0 -2100.0 2200.0 2500.0 2600.0 3000.0 3400.0 -1900.0 2100.0 2400.0 2700.0 3000.0 3100.0 -1600.0 1800.0 2200.0 2400.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2300.0 2900.0 3300.0 -1600.0 1700.0 2100.0 2300.0 2800.0 3100.0 -2200.0 2300.0 2600.0 2800.0 3100.0 3300.0 -2200.0 2300.0 2700.0 2800.0 3100.0 3400.0 -2000.0 2100.0 2600.0 2800.0 3100.0 3400.0 -1700.0 1800.0 2400.0 2700.0 2900.0 3200.0 -1600.0 1800.0 2400.0 2700.0 3100.0 3200.0 -1600.0 1800.0 2300.0 2400.0 3000.0 3200.0 -1800.0 1900.0 2400.0 2600.0 3100.0 3300.0 -1900.0 2000.0 2300.0 2600.0 2900.0 3200.0 -1900.0 2100.0 2300.0 2700.0 2800.0 3000.0 -1800.0 2000.0 2600.0 2700.0 3000.0 3300.0 -1800.0 1900.0 2400.0 2600.0 2900.0 3300.0 -1700.0 1800.0 2300.0 2400.0 2900.0 3300.0 -1600.0 1700.0 2100.0 2500.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2600.0 3100.0 3200.0 -1500.0 1700.0 2200.0 2500.0 2900.0 3300.0 -1500.0 1600.0 2300.0 2400.0 2800.0 3300.0 -1400.0 1600.0 2300.0 2400.0 3000.0 3300.0 -1500.0 2000.0 2500.0 2800.0 3200.0 3300.0 -1300.0 1500.0 2600.0 2700.0 3100.0 3300.0 -1200.0 1400.0 1700.0 1900.0 3100.0 3300.0 -1200.0 1700.0 1900.0 2300.0 3200.0 3300.0 -1200.0 1900.0 2000.0 2300.0 3200.0 3300.0 -1200.0 2000.0 2100.0 2500.0 3300.0 3400.0 -1200.0 2000.0 2200.0 2600.0 3300.0 3400.0 -1200.0 2000.0 2300.0 2400.0 3200.0 3300.0 -1000.0 1900.0 2300.0 2500.0 3200.0 3300.0 -1200.0 1800.0 2200.0 2500.0 3100.0 3200.0 -1400.0 1600.0 2300.0 2500.0 3200.0 3300.0 -1500.0 1600.0 2500.0 2700.0 2900.0 3200.0 -1600.0 1900.0 2400.0 2800.0 3100.0 3300.0 -1700.0 1800.0 2400.0 2800.0 3100.0 3200.0 -1700.0 1800.0 2500.0 2800.0 3100.0 3200.0 -1500.0 1800.0 2400.0 2500.0 2900.0 3100.0 -1500.0 1600.0 2400.0 2500.0 2900.0 3200.0 -1300.0 1500.0 2200.0 2500.0 2800.0 3100.0 -1300.0 1400.0 2000.0 2400.0 2600.0 2900.0 -1400.0 1500.0 2100.0 2500.0 2700.0 3100.0 -1500.0 2000.0 2300.0 2600.0 3000.0 3200.0 -1700.0 2100.0 2400.0 2600.0 2900.0 3100.0 -1400.0 1500.0 2300.0 2600.0 3000.0 3300.0 -1500.0 1700.0 2200.0 2300.0 3200.0 3300.0 -1400.0 1600.0 2000.0 2400.0 3100.0 3300.0 -1500.0 1700.0 2000.0 2100.0 3100.0 3300.0 -1600.0 1900.0 2200.0 2500.0 2900.0 3200.0 -1500.0 1600.0 2200.0 2400.0 2800.0 3200.0 -1500.0 1600.0 2100.0 2500.0 3000.0 3300.0 -1500.0 1600.0 2000.0 2500.0 2900.0 3300.0 -1500.0 1600.0 2100.0 2500.0 2900.0 3200.0 -1500.0 1600.0 2200.0 2700.0 2800.0 3100.0 -1300.0 1400.0 2200.0 2600.0 3000.0 3200.0 -1400.0 1900.0 2400.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2500.0 2600.0 3000.0 3200.0 -1500.0 1700.0 2300.0 2500.0 2800.0 3200.0 -1700.0 1800.0 2200.0 2400.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2300.0 3000.0 3300.0 -1600.0 1700.0 2000.0 2400.0 3000.0 3200.0 -1700.0 1800.0 2300.0 2600.0 2900.0 3200.0 -1500.0 2000.0 2300.0 2600.0 3100.0 3400.0 -1400.0 1900.0 2500.0 2700.0 3100.0 3300.0 -1400.0 1700.0 2600.0 2700.0 3100.0 3300.0 -1500.0 1600.0 2300.0 2600.0 2800.0 3200.0 -1700.0 1800.0 2300.0 2500.0 3100.0 3400.0 -1500.0 1600.0 2200.0 2300.0 3100.0 3300.0 -1400.0 1500.0 2200.0 2400.0 3100.0 3200.0 -1400.0 1600.0 2200.0 2400.0 3000.0 3100.0 -1700.0 2100.0 2300.0 2700.0 3100.0 3200.0 -1900.0 2300.0 2500.0 2700.0 3100.0 3200.0 -1900.0 2300.0 2600.0 2800.0 3100.0 3300.0 -1900.0 2400.0 2600.0 2900.0 3200.0 3300.0 -1900.0 2300.0 2600.0 2800.0 3300.0 3400.0 -1800.0 2400.0 2600.0 2800.0 3300.0 3400.0 -1600.0 1800.0 2600.0 2700.0 3000.0 3300.0 -1600.0 1700.0 2600.0 2700.0 2900.0 3200.0 -1500.0 1600.0 2500.0 2700.0 3000.0 3300.0 -1300.0 1400.0 2400.0 2700.0 2900.0 3300.0 -1300.0 1400.0 2300.0 2700.0 2800.0 3100.0 -1300.0 1400.0 2500.0 2800.0 3000.0 3300.0 -1500.0 1700.0 2400.0 2500.0 2800.0 3300.0 -1900.0 2000.0 2500.0 2600.0 3000.0 3200.0 -1800.0 2000.0 2400.0 2500.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2300.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2400.0 2800.0 3200.0 -1600.0 1700.0 2200.0 2400.0 2800.0 3200.0 -1500.0 1600.0 2200.0 2400.0 2700.0 3300.0 -1400.0 1500.0 2200.0 2400.0 2900.0 3200.0 -1600.0 1700.0 2300.0 2500.0 2700.0 3000.0 -1600.0 1700.0 2200.0 2500.0 2700.0 3000.0 -1700.0 1900.0 2200.0 2500.0 2800.0 3100.0 -1900.0 2000.0 2300.0 2500.0 2900.0 3100.0 -1900.0 2100.0 2300.0 2500.0 2900.0 3200.0 -1900.0 2100.0 2300.0 2500.0 3100.0 3300.0 -2000.0 2200.0 2600.0 2800.0 3000.0 3200.0 -1900.0 2200.0 2500.0 2700.0 2900.0 3200.0 -2100.0 2300.0 2600.0 2800.0 3100.0 3300.0 -2100.0 2300.0 2600.0 2700.0 3000.0 3200.0 -2100.0 2200.0 2500.0 2600.0 3000.0 3200.0 -1500.0 1600.0 2300.0 2400.0 2900.0 3200.0 -1400.0 1500.0 2100.0 2400.0 2800.0 3100.0 -1300.0 1600.0 2100.0 2400.0 3100.0 3200.0 -1300.0 1400.0 2300.0 2600.0 2800.0 3200.0 -1400.0 1500.0 2200.0 2500.0 2700.0 3200.0 -1400.0 1500.0 2300.0 2500.0 2700.0 3200.0 -1500.0 1600.0 2400.0 2500.0 2800.0 3200.0 -1600.0 1700.0 2400.0 2500.0 2900.0 3200.0 -1700.0 1800.0 2400.0 2500.0 2900.0 3100.0 -1800.0 1900.0 2400.0 2600.0 3000.0 3200.0 -2100.0 2200.0 2700.0 2900.0 3200.0 3300.0 -1800.0 2100.0 2500.0 2900.0 3100.0 3300.0 -1700.0 1800.0 2500.0 2800.0 2900.0 3300.0 -1200.0 1600.0 2100.0 2400.0 3000.0 3200.0 -1600.0 1700.0 2100.0 2600.0 2900.0 3000.0 -1600.0 1700.0 2200.0 2700.0 2900.0 3000.0 -1600.0 1800.0 2200.0 2500.0 2900.0 3000.0 -1700.0 1800.0 2300.0 2500.0 2900.0 3100.0 -1700.0 1900.0 2300.0 2600.0 2900.0 3100.0 -1500.0 1700.0 2000.0 2600.0 2900.0 3100.0 -1400.0 1600.0 1800.0 2600.0 3000.0 3100.0 -1300.0 1500.0 1700.0 2700.0 3100.0 3200.0 -1300.0 1700.0 2400.0 2700.0 3100.0 3300.0 -1200.0 1600.0 2400.0 2600.0 2900.0 3200.0 -1300.0 1400.0 2000.0 2700.0 2800.0 3000.0 -1400.0 1500.0 2000.0 2600.0 2800.0 3000.0 -1500.0 1700.0 2100.0 2600.0 2800.0 3000.0 -1600.0 1800.0 2200.0 2700.0 2800.0 3000.0 -1600.0 1800.0 2100.0 2700.0 2900.0 3100.0 -1500.0 1900.0 2300.0 2700.0 3000.0 3100.0 -1500.0 1900.0 2300.0 2700.0 3000.0 3200.0 -1500.0 2000.0 2300.0 2700.0 3000.0 3200.0 -1800.0 2100.0 2300.0 2700.0 3100.0 3300.0 -1500.0 2000.0 2300.0 2600.0 3000.0 3100.0 -1500.0 2100.0 2300.0 2700.0 3100.0 3200.0 -1600.0 2100.0 2200.0 2700.0 3100.0 3200.0 -1500.0 2100.0 2200.0 2600.0 3100.0 3200.0 -1400.0 2300.0 2500.0 2700.0 3100.0 3200.0 -1700.0 2100.0 2300.0 2700.0 2900.0 3100.0 -1500.0 1800.0 2300.0 2700.0 3000.0 3100.0 -1500.0 1700.0 2300.0 2700.0 3000.0 3100.0 -1500.0 1600.0 2100.0 2700.0 3000.0 3100.0 -1400.0 1500.0 1900.0 2600.0 3100.0 3200.0 -1200.0 1300.0 1900.0 2600.0 2900.0 3100.0 -1100.0 1200.0 1800.0 2700.0 3000.0 3100.0 -1200.0 1300.0 1800.0 2700.0 3000.0 3100.0 -1200.0 1400.0 1900.0 2700.0 3000.0 3100.0 -1300.0 1500.0 1800.0 2600.0 3000.0 3100.0 -1200.0 1400.0 2300.0 2700.0 2900.0 3100.0 -1300.0 1400.0 2200.0 2700.0 2800.0 3100.0 -1300.0 1500.0 2000.0 2600.0 2900.0 3100.0 -1300.0 1500.0 2100.0 2700.0 2900.0 3100.0 -1400.0 1800.0 2100.0 2600.0 2800.0 3000.0 -1400.0 1800.0 2100.0 2500.0 2900.0 3100.0 -1700.0 2000.0 2500.0 2800.0 3000.0 3200.0 -1900.0 2000.0 2700.0 2800.0 3100.0 3400.0 -1900.0 2100.0 2600.0 2800.0 3100.0 3300.0 -1600.0 2100.0 2400.0 2700.0 3200.0 3400.0 -1700.0 2000.0 2300.0 2500.0 2800.0 3200.0 -1500.0 1700.0 2100.0 2300.0 3000.0 3200.0 -1400.0 1900.0 2200.0 2500.0 2900.0 3200.0 -1400.0 1900.0 2300.0 2500.0 2700.0 3100.0 -1300.0 1500.0 2100.0 2700.0 2800.0 3100.0 -1300.0 1500.0 2000.0 2600.0 2800.0 3100.0 -1300.0 1400.0 2100.0 2600.0 2800.0 3000.0 -1300.0 1400.0 2000.0 2600.0 2800.0 3000.0 -1200.0 1300.0 2000.0 2700.0 2800.0 3000.0 -1200.0 1400.0 2300.0 2600.0 2900.0 3200.0 -1300.0 1600.0 2300.0 2700.0 2900.0 3200.0 -1600.0 1900.0 2300.0 2800.0 3100.0 3200.0 -1700.0 1900.0 2300.0 2800.0 3000.0 3200.0 -1700.0 1900.0 2100.0 2600.0 2900.0 3000.0 -1700.0 1900.0 2400.0 2600.0 2800.0 3100.0 -1700.0 2100.0 2400.0 2500.0 2800.0 3100.0 -1700.0 2000.0 2400.0 2500.0 2900.0 3100.0 -1900.0 2200.0 2400.0 2600.0 3000.0 3200.0 -1700.0 2000.0 2400.0 2700.0 3000.0 3100.0 -1500.0 1900.0 2300.0 2600.0 3000.0 3100.0 -1500.0 1600.0 2100.0 2600.0 2900.0 3200.0 -1400.0 1600.0 1800.0 2300.0 2800.0 2900.0 -1400.0 1600.0 1700.0 2500.0 3200.0 3300.0 -1400.0 1600.0 1800.0 2400.0 3200.0 3300.0 -1400.0 1700.0 1900.0 2200.0 3100.0 3200.0 -1300.0 1700.0 1900.0 2300.0 3100.0 3200.0 -1100.0 1600.0 2000.0 2300.0 3000.0 3100.0 -1500.0 1900.0 2500.0 2800.0 3200.0 3300.0 -1800.0 2000.0 2300.0 2800.0 3000.0 3100.0 -1800.0 1900.0 2300.0 2700.0 2900.0 3200.0 -1700.0 1900.0 2300.0 2600.0 2800.0 3100.0 -1700.0 1900.0 2100.0 2500.0 2700.0 3000.0 -1700.0 1900.0 2100.0 2600.0 2800.0 3000.0 -1700.0 1900.0 2100.0 2700.0 2900.0 3100.0 -1700.0 1900.0 2500.0 2800.0 3000.0 3300.0 -1400.0 1600.0 1900.0 2600.0 2900.0 3000.0 -1500.0 1600.0 2000.0 2200.0 3200.0 3300.0 -1300.0 1500.0 1700.0 2600.0 3100.0 3200.0 -1300.0 1500.0 1700.0 2700.0 3000.0 3100.0 -1500.0 1700.0 2300.0 2700.0 3000.0 3200.0 -1700.0 2000.0 2500.0 2800.0 3100.0 3200.0 -1200.0 1300.0 1800.0 2600.0 3000.0 3100.0 -1300.0 1600.0 2000.0 2400.0 3000.0 3200.0 -1500.0 1600.0 2000.0 2600.0 3200.0 3300.0 -1600.0 1700.0 2100.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2700.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2700.0 3200.0 3300.0 -1600.0 1900.0 2100.0 2700.0 3200.0 3300.0 -1100.0 1800.0 2200.0 2400.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2800.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2700.0 3000.0 3100.0 -1500.0 1800.0 2200.0 2800.0 3100.0 3200.0 -1600.0 1900.0 2200.0 2800.0 3100.0 3200.0 -1600.0 1900.0 2100.0 2700.0 3100.0 3200.0 -1500.0 1900.0 2100.0 2600.0 3100.0 3200.0 -1700.0 2100.0 2400.0 2700.0 3000.0 3300.0 -1900.0 2400.0 2700.0 2900.0 3200.0 3300.0 -1700.0 2200.0 2700.0 2900.0 3200.0 3300.0 -1700.0 2100.0 2700.0 2900.0 3200.0 3300.0 -1700.0 2200.0 2600.0 2900.0 3200.0 3300.0 -1800.0 2400.0 2600.0 2800.0 3100.0 3200.0 -1800.0 2400.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2300.0 2400.0 2700.0 3100.0 3200.0 -1600.0 2300.0 2500.0 2700.0 3100.0 3200.0 -1500.0 2200.0 2400.0 2600.0 3100.0 3200.0 -1600.0 2200.0 2400.0 2600.0 3100.0 3200.0 -1500.0 2200.0 2500.0 2700.0 3100.0 3200.0 -1500.0 2200.0 2400.0 2600.0 3000.0 3100.0 -1600.0 2200.0 2400.0 2700.0 3000.0 3100.0 -1500.0 2100.0 2400.0 2700.0 3000.0 3100.0 -1400.0 1800.0 2100.0 2400.0 3200.0 3300.0 -1200.0 1300.0 2100.0 2800.0 3000.0 3200.0 -1300.0 1400.0 2100.0 2700.0 3000.0 3200.0 -1500.0 1700.0 2200.0 2800.0 3000.0 3100.0 -1800.0 2200.0 2400.0 2600.0 3000.0 3200.0 -1700.0 1900.0 2400.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2500.0 2800.0 3000.0 3200.0 -1600.0 1800.0 2500.0 2700.0 3000.0 3200.0 -1600.0 1700.0 2300.0 2700.0 2900.0 3100.0 -1500.0 1700.0 2100.0 2700.0 3000.0 3100.0 -1500.0 1600.0 2000.0 2600.0 2900.0 3000.0 -1500.0 1600.0 1900.0 2600.0 3000.0 3100.0 -1500.0 1700.0 2000.0 2500.0 3000.0 3100.0 -1500.0 1700.0 2000.0 2500.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2600.0 3000.0 3100.0 -1500.0 1800.0 2000.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2500.0 2800.0 3100.0 3300.0 -1800.0 2000.0 2600.0 2900.0 3200.0 3300.0 -1800.0 2000.0 2500.0 2900.0 3100.0 3300.0 -1400.0 1600.0 1900.0 2600.0 3000.0 3100.0 -1400.0 1600.0 1900.0 2700.0 3000.0 3100.0 -1500.0 1700.0 2300.0 2800.0 3000.0 3200.0 -1700.0 2000.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2300.0 2600.0 2800.0 3200.0 3300.0 -1800.0 2100.0 2600.0 3000.0 3300.0 3400.0 -1800.0 2100.0 2600.0 3000.0 3200.0 3400.0 -1600.0 1800.0 2300.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2100.0 2600.0 3100.0 3200.0 -1100.0 1400.0 2100.0 2800.0 3100.0 3200.0 -1200.0 1700.0 2200.0 2400.0 3000.0 3200.0 -1500.0 2100.0 2500.0 2800.0 3200.0 3400.0 -1500.0 2000.0 2200.0 2400.0 3100.0 3300.0 -1400.0 1900.0 2200.0 2300.0 3000.0 3200.0 -1500.0 1800.0 2200.0 2400.0 3000.0 3200.0 -1200.0 1600.0 2300.0 2500.0 3100.0 3200.0 -1300.0 1900.0 2200.0 2700.0 3200.0 3300.0 -1100.0 1300.0 2000.0 2700.0 3100.0 3200.0 -1400.0 1500.0 2400.0 2700.0 2900.0 3300.0 -1500.0 1800.0 2500.0 2700.0 3000.0 3100.0 -1500.0 1700.0 2500.0 2800.0 3000.0 3200.0 -1400.0 1600.0 2200.0 2400.0 2700.0 3200.0 -1300.0 1400.0 2000.0 2400.0 2600.0 3000.0 -1200.0 1300.0 2100.0 2500.0 2700.0 3100.0 -1800.0 2100.0 2400.0 2600.0 2800.0 3100.0 -1800.0 2100.0 2400.0 2600.0 2800.0 3000.0 -1900.0 2200.0 2500.0 2700.0 2900.0 3100.0 -1900.0 2300.0 2500.0 2800.0 3000.0 3100.0 -1900.0 2400.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2400.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2400.0 2600.0 2700.0 3100.0 3200.0 -1800.0 2400.0 2600.0 2800.0 3200.0 3300.0 -1900.0 2400.0 2600.0 2800.0 3100.0 3300.0 -1900.0 2400.0 2600.0 2800.0 3200.0 3300.0 -1700.0 2400.0 2600.0 2800.0 3200.0 3300.0 -1700.0 2200.0 2600.0 2800.0 3200.0 3300.0 -2000.0 2200.0 2800.0 3000.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2700.0 3100.0 3300.0 -1900.0 2100.0 2400.0 2800.0 3000.0 3200.0 -1900.0 2100.0 2300.0 2800.0 3000.0 3200.0 -1800.0 2100.0 2300.0 2700.0 3000.0 3200.0 -1600.0 2000.0 2200.0 2700.0 3000.0 3100.0 -1600.0 2000.0 2200.0 2500.0 3000.0 3100.0 -1700.0 2000.0 2200.0 2700.0 3000.0 3200.0 -1700.0 2000.0 2200.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2200.0 2700.0 3100.0 3200.0 -1500.0 1900.0 2200.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2300.0 2800.0 3000.0 3100.0 -1600.0 1900.0 2200.0 2700.0 3000.0 3100.0 -1600.0 1900.0 2300.0 2700.0 3000.0 3100.0 -1600.0 2000.0 2400.0 2800.0 3100.0 3200.0 -1700.0 2000.0 2200.0 2700.0 3100.0 3200.0 -1800.0 2000.0 2200.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2100.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2700.0 3000.0 3100.0 3300.0 -1800.0 2100.0 2700.0 3000.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2900.0 3100.0 3200.0 -1900.0 2100.0 2500.0 3000.0 3100.0 3200.0 -1700.0 2000.0 2500.0 2900.0 3100.0 3200.0 -1800.0 2100.0 2600.0 2900.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2900.0 3200.0 3300.0 -1700.0 2100.0 2500.0 2900.0 3100.0 3300.0 -1800.0 2100.0 2500.0 2900.0 3100.0 3200.0 -1600.0 2000.0 2300.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2100.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2200.0 2700.0 3000.0 3200.0 -2000.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1800.0 2100.0 2300.0 2700.0 3200.0 3300.0 -1700.0 2100.0 2300.0 2700.0 3000.0 3200.0 -1600.0 2200.0 2400.0 2800.0 3200.0 3300.0 -1600.0 1700.0 2000.0 2300.0 2700.0 3100.0 -1800.0 2000.0 2200.0 2400.0 2700.0 3100.0 -1700.0 1800.0 2100.0 2400.0 2700.0 3000.0 -1500.0 1600.0 2200.0 2500.0 2800.0 3300.0 -1500.0 1600.0 2100.0 2500.0 2700.0 3000.0 -1500.0 2000.0 2300.0 2500.0 2700.0 2900.0 -1700.0 2100.0 2300.0 2600.0 2800.0 3000.0 -1700.0 2200.0 2400.0 2700.0 3000.0 3100.0 -1500.0 2200.0 2400.0 2600.0 3000.0 3200.0 -1500.0 2100.0 2400.0 2600.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2600.0 3000.0 3200.0 -1500.0 2100.0 2300.0 2600.0 3000.0 3100.0 -1600.0 2000.0 2300.0 2700.0 3000.0 3100.0 -1600.0 1900.0 2200.0 2600.0 3100.0 3200.0 -1500.0 1800.0 2000.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2000.0 2500.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2300.0 3000.0 3100.0 -1400.0 1800.0 2100.0 2400.0 2900.0 3100.0 -1600.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1600.0 1900.0 2200.0 2500.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2800.0 3100.0 3200.0 -1500.0 1800.0 2100.0 2600.0 3000.0 3100.0 -1600.0 1800.0 2100.0 2600.0 2900.0 3100.0 -1600.0 1900.0 2100.0 2500.0 2900.0 3100.0 -1600.0 1900.0 2100.0 2600.0 2900.0 3100.0 -1600.0 1900.0 2100.0 2600.0 2800.0 3100.0 -1600.0 1800.0 2200.0 2600.0 2800.0 3000.0 -1600.0 1900.0 2200.0 2700.0 2900.0 3100.0 -1600.0 1900.0 2200.0 2600.0 2900.0 3000.0 -1900.0 2000.0 2200.0 2800.0 3000.0 3100.0 -1400.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1400.0 1900.0 2100.0 2400.0 3100.0 3200.0 -1500.0 1800.0 2100.0 2400.0 3200.0 3300.0 -1500.0 1700.0 2100.0 2300.0 3100.0 3300.0 -1400.0 1700.0 2100.0 2300.0 3200.0 3300.0 -1400.0 1600.0 2100.0 2300.0 3200.0 3300.0 -1300.0 1600.0 2100.0 2300.0 3200.0 3300.0 -1300.0 1600.0 2100.0 2300.0 3100.0 3300.0 -1200.0 1400.0 2000.0 2200.0 3100.0 3300.0 -1200.0 1400.0 2000.0 2600.0 3100.0 3200.0 -1200.0 1400.0 2000.0 2800.0 3100.0 3200.0 -1200.0 1400.0 2100.0 2800.0 3100.0 3200.0 -1400.0 1500.0 2200.0 2700.0 3000.0 3100.0 -1700.0 1900.0 2200.0 2500.0 2900.0 3200.0 -1400.0 1600.0 2200.0 2700.0 2900.0 3100.0 -1500.0 1600.0 1900.0 2700.0 2900.0 3000.0 -1500.0 1600.0 1900.0 2700.0 3000.0 3100.0 -1500.0 1600.0 2000.0 2700.0 3000.0 3100.0 -1400.0 1600.0 2000.0 2600.0 2900.0 3100.0 -1300.0 1500.0 2400.0 2700.0 2900.0 3200.0 -1600.0 1800.0 2300.0 2700.0 3100.0 3400.0 -1600.0 2100.0 2400.0 2800.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2700.0 3000.0 3100.0 -1600.0 1900.0 2100.0 2700.0 3000.0 3100.0 -1600.0 1800.0 2100.0 2700.0 3000.0 3100.0 -1700.0 1800.0 2300.0 2800.0 3100.0 3200.0 -1800.0 1900.0 2400.0 2900.0 3100.0 3200.0 -1500.0 1700.0 1800.0 2600.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2800.0 3000.0 3200.0 -1800.0 2100.0 2600.0 2900.0 3100.0 3300.0 -1700.0 2300.0 2500.0 2700.0 3100.0 3200.0 -2000.0 2400.0 2500.0 2700.0 3100.0 3200.0 -1900.0 2500.0 2600.0 2800.0 3100.0 3200.0 -1800.0 2400.0 2700.0 2900.0 3200.0 3300.0 -1900.0 2400.0 2600.0 2800.0 3100.0 3200.0 -1700.0 2200.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2200.0 2300.0 2600.0 3100.0 3200.0 -1800.0 2200.0 2300.0 2700.0 3100.0 3200.0 -1800.0 2200.0 2400.0 2800.0 3100.0 3300.0 -1900.0 2100.0 2500.0 2900.0 3300.0 3400.0 -1900.0 2100.0 2400.0 2900.0 3100.0 3200.0 -1900.0 2200.0 2400.0 2800.0 3000.0 3100.0 -1800.0 2200.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2300.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2300.0 2400.0 2800.0 3100.0 3200.0 -1800.0 2100.0 2300.0 2700.0 2900.0 3100.0 -1700.0 2000.0 2500.0 2800.0 3000.0 3300.0 -1100.0 1300.0 2300.0 2600.0 2800.0 3200.0 -1400.0 1600.0 2200.0 2500.0 2800.0 3100.0 -1400.0 1600.0 2000.0 2500.0 2700.0 3000.0 -1400.0 1500.0 1900.0 2500.0 2800.0 2900.0 -1400.0 1500.0 1900.0 2600.0 2900.0 3000.0 -1400.0 1600.0 1900.0 2700.0 2900.0 3000.0 -1500.0 1600.0 2000.0 2700.0 2900.0 3100.0 -1500.0 1600.0 2000.0 2700.0 2900.0 3000.0 -1500.0 1600.0 2100.0 2800.0 3000.0 3100.0 -1600.0 1700.0 2100.0 2800.0 3000.0 3100.0 -1900.0 2200.0 2600.0 2900.0 3300.0 3400.0 -2000.0 2200.0 2600.0 3000.0 3300.0 3400.0 -2000.0 2200.0 2600.0 3000.0 3200.0 3300.0 -1800.0 2100.0 2700.0 3000.0 3400.0 3500.0 -1300.0 1600.0 2300.0 2500.0 3000.0 3300.0 -1400.0 1700.0 2400.0 2500.0 2800.0 2900.0 -1400.0 1700.0 2400.0 2500.0 2800.0 3000.0 -1500.0 2000.0 2400.0 2500.0 3100.0 3200.0 -1400.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1400.0 1500.0 2400.0 2500.0 3100.0 3300.0 -1900.0 2200.0 2600.0 2900.0 3200.0 3400.0 -1600.0 2000.0 2600.0 2700.0 3300.0 3400.0 -1800.0 2200.0 2800.0 3100.0 3400.0 3500.0 -1900.0 2200.0 2700.0 3000.0 3400.0 3500.0 -1900.0 2400.0 2800.0 3000.0 3200.0 3400.0 -1300.0 1900.0 2100.0 2400.0 2800.0 3000.0 -1800.0 2100.0 2300.0 2500.0 2800.0 3100.0 -1800.0 2100.0 2400.0 2600.0 2900.0 3100.0 -1600.0 1800.0 2500.0 2600.0 2900.0 3000.0 -1700.0 1900.0 2200.0 2400.0 2900.0 3200.0 -1600.0 1800.0 2000.0 2300.0 3000.0 3200.0 -1600.0 1700.0 1900.0 2300.0 3100.0 3300.0 -1400.0 1600.0 1800.0 2200.0 3200.0 3300.0 -1400.0 1600.0 1800.0 2300.0 3100.0 3200.0 -1400.0 1600.0 1800.0 2300.0 3000.0 3200.0 -1100.0 2200.0 2500.0 2600.0 2700.0 2900.0 -1200.0 1900.0 2500.0 2600.0 2800.0 3000.0 -1200.0 1800.0 2500.0 2600.0 2800.0 2900.0 -1300.0 1900.0 2500.0 2600.0 2800.0 3100.0 -1500.0 2100.0 2400.0 2500.0 2900.0 3200.0 -1400.0 2100.0 2400.0 2500.0 3000.0 3200.0 -1400.0 2000.0 2400.0 2500.0 3000.0 3300.0 -1300.0 1700.0 2300.0 2400.0 3200.0 3400.0 -1700.0 1900.0 2400.0 2500.0 3000.0 3300.0 -1900.0 2000.0 2500.0 2600.0 2900.0 3200.0 -1900.0 2100.0 2500.0 2700.0 2900.0 3200.0 -2000.0 2100.0 2600.0 2700.0 3000.0 3200.0 -2000.0 2100.0 2600.0 2700.0 3000.0 3300.0 -1900.0 2100.0 2500.0 2600.0 2900.0 3200.0 -1800.0 1900.0 2500.0 2700.0 3100.0 3400.0 -1600.0 2100.0 2400.0 2600.0 3100.0 3300.0 -1700.0 1800.0 2500.0 2600.0 2900.0 3300.0 -1500.0 1900.0 2400.0 2500.0 2800.0 3200.0 -1500.0 2000.0 2400.0 2500.0 2700.0 3000.0 -2100.0 2400.0 2700.0 3000.0 3300.0 3400.0 -1900.0 2200.0 2600.0 2800.0 3100.0 3400.0 -1800.0 2100.0 2600.0 2700.0 3100.0 3400.0 -1800.0 2000.0 2300.0 2500.0 2800.0 3200.0 -1700.0 2100.0 2200.0 2600.0 2900.0 3100.0 -1400.0 2100.0 2200.0 2600.0 2900.0 3100.0 -1500.0 1700.0 2100.0 2400.0 2800.0 3000.0 -1500.0 2000.0 2400.0 2600.0 3000.0 3200.0 -1500.0 1800.0 2400.0 2500.0 3000.0 3200.0 -1500.0 1700.0 2400.0 2500.0 3000.0 3300.0 -1700.0 2100.0 2500.0 2600.0 3200.0 3400.0 -1800.0 2300.0 2500.0 2800.0 3200.0 3300.0 -1800.0 2300.0 2600.0 2900.0 3200.0 3300.0 -1900.0 2300.0 2600.0 3000.0 3300.0 3400.0 -1800.0 1900.0 2300.0 2400.0 2700.0 3100.0 -1600.0 1800.0 2200.0 2500.0 2900.0 3200.0 -1700.0 1900.0 2400.0 2700.0 3100.0 3400.0 -1800.0 2200.0 2400.0 2800.0 3200.0 3400.0 -1900.0 2200.0 2800.0 3000.0 3300.0 3400.0 -2300.0 2600.0 2700.0 2900.0 3200.0 3300.0 -1700.0 2100.0 2500.0 2600.0 3100.0 3300.0 -1700.0 1900.0 2400.0 2500.0 2900.0 3100.0 -1900.0 2100.0 2400.0 2500.0 2900.0 3200.0 -2000.0 2100.0 2400.0 2500.0 2900.0 3200.0 -2000.0 2100.0 2500.0 2600.0 3000.0 3200.0 -2000.0 2200.0 2500.0 2600.0 3000.0 3300.0 -2000.0 2200.0 2600.0 2700.0 2900.0 3100.0 -1700.0 2000.0 2600.0 2700.0 3000.0 3100.0 -1900.0 2200.0 2700.0 2800.0 3100.0 3200.0 -1900.0 2400.0 2700.0 2800.0 3200.0 3300.0 -2100.0 2400.0 2600.0 2800.0 3100.0 3300.0 -2200.0 2500.0 2700.0 2900.0 3200.0 3300.0 -2000.0 2400.0 2800.0 3000.0 3300.0 3400.0 -1300.0 2000.0 2300.0 2400.0 3200.0 3300.0 -1400.0 1800.0 2200.0 2500.0 3000.0 3200.0 -1300.0 1600.0 2100.0 2500.0 2900.0 3200.0 -1300.0 1500.0 2100.0 2400.0 2900.0 3200.0 -1500.0 1700.0 1800.0 2200.0 2600.0 3200.0 -1500.0 1900.0 2200.0 2400.0 2800.0 3100.0 -1300.0 1600.0 2200.0 2300.0 3200.0 3400.0 -1300.0 1700.0 2200.0 2400.0 3100.0 3300.0 -1500.0 2100.0 2300.0 2700.0 3200.0 3400.0 -2000.0 2300.0 2800.0 3000.0 3300.0 3400.0 -1800.0 2300.0 2800.0 3000.0 3400.0 3500.0 -1800.0 2300.0 2700.0 3000.0 3300.0 3500.0 -2000.0 2500.0 2800.0 3100.0 3400.0 3500.0 -2000.0 2500.0 2800.0 3100.0 3300.0 3400.0 -2000.0 2400.0 2800.0 3100.0 3300.0 3400.0 -2100.0 2500.0 2800.0 2900.0 3300.0 3400.0 -2000.0 2300.0 2800.0 2900.0 3200.0 3300.0 -2000.0 2300.0 2700.0 2800.0 3100.0 3200.0 -1900.0 2200.0 2500.0 2700.0 3100.0 3200.0 -1600.0 2200.0 2400.0 2600.0 2900.0 3100.0 -1500.0 2200.0 2400.0 2600.0 2900.0 3200.0 -1400.0 1900.0 2200.0 2400.0 2700.0 3000.0 -1400.0 1900.0 2300.0 2500.0 2800.0 3100.0 -1600.0 1900.0 2400.0 2500.0 2800.0 3000.0 -1600.0 1800.0 2400.0 2600.0 2900.0 3000.0 -1600.0 1900.0 2500.0 2600.0 2900.0 3100.0 -1600.0 1900.0 2400.0 2500.0 3000.0 3100.0 -1600.0 2000.0 2400.0 2600.0 3000.0 3200.0 -1400.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1900.0 2200.0 2500.0 3000.0 3100.0 -1400.0 1800.0 2000.0 2400.0 3000.0 3100.0 -1400.0 1700.0 1900.0 2400.0 2800.0 2900.0 -1700.0 2100.0 2400.0 2600.0 3000.0 3300.0 -1900.0 2100.0 2500.0 2600.0 3000.0 3300.0 -1900.0 2100.0 2400.0 2500.0 2800.0 3200.0 -1800.0 2000.0 2300.0 2400.0 2900.0 3300.0 -1600.0 1800.0 2000.0 2300.0 2700.0 3200.0 -1300.0 1500.0 2100.0 2500.0 3000.0 3200.0 -1400.0 2000.0 2200.0 2400.0 2900.0 3200.0 -1800.0 1900.0 2300.0 2600.0 3000.0 3300.0 -1900.0 2000.0 2300.0 2500.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2400.0 2800.0 3100.0 -1700.0 2000.0 2400.0 2500.0 2800.0 3000.0 -1600.0 2100.0 2500.0 2700.0 3100.0 3200.0 -1900.0 2200.0 2400.0 2700.0 3000.0 3200.0 -1900.0 2100.0 2300.0 2500.0 2800.0 3000.0 -1700.0 2000.0 2300.0 2500.0 2900.0 3100.0 -1700.0 2100.0 2300.0 2500.0 2900.0 3100.0 -1500.0 1700.0 1900.0 2500.0 2800.0 3100.0 -1600.0 1800.0 2000.0 2500.0 2700.0 3000.0 -1700.0 1800.0 2100.0 2500.0 2700.0 2900.0 -2000.0 2300.0 2700.0 2900.0 3100.0 3200.0 -2000.0 2300.0 2600.0 2900.0 3100.0 3200.0 -1600.0 2000.0 2500.0 2600.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2500.0 2800.0 3000.0 -1400.0 2000.0 2400.0 2500.0 2900.0 3100.0 -1500.0 2000.0 2400.0 2500.0 3100.0 3300.0 -1700.0 2100.0 2500.0 2800.0 3300.0 3500.0 -1500.0 1600.0 2300.0 2500.0 2800.0 3100.0 -1500.0 1800.0 2300.0 2500.0 2700.0 2900.0 -1400.0 2000.0 2300.0 2400.0 2700.0 3100.0 -1400.0 2100.0 2400.0 2500.0 2800.0 3200.0 -1400.0 2100.0 2400.0 2500.0 2900.0 3200.0 -1800.0 2000.0 2300.0 2400.0 3000.0 3300.0 -1900.0 2200.0 2500.0 2600.0 2900.0 3100.0 -1800.0 2200.0 2600.0 2900.0 3100.0 3200.0 -2100.0 2500.0 2700.0 2800.0 3200.0 3300.0 -1900.0 2400.0 2600.0 2700.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2700.0 3100.0 3200.0 -1800.0 2000.0 2500.0 2600.0 2900.0 3100.0 -1800.0 2100.0 2500.0 2600.0 2900.0 3100.0 -1900.0 2100.0 2500.0 2600.0 2900.0 3100.0 -1900.0 2100.0 2400.0 2500.0 2900.0 3100.0 -1900.0 2200.0 2300.0 2500.0 2900.0 3200.0 -1800.0 2200.0 2400.0 2600.0 3000.0 3100.0 -1800.0 2200.0 2400.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2300.0 2800.0 3200.0 3400.0 -1600.0 2100.0 2300.0 2700.0 3200.0 3400.0 -1800.0 2200.0 2600.0 2700.0 3000.0 3200.0 -1900.0 2200.0 2600.0 3000.0 3200.0 3400.0 -2000.0 2400.0 2900.0 3000.0 3300.0 3500.0 -2100.0 2500.0 2800.0 2900.0 3400.0 3500.0 -2100.0 2600.0 2800.0 3000.0 3300.0 3400.0 -2300.0 2600.0 2800.0 3000.0 3200.0 3300.0 -2200.0 2500.0 2600.0 2800.0 3200.0 3300.0 -2200.0 2400.0 2600.0 2700.0 3200.0 3300.0 -2100.0 2300.0 2500.0 2700.0 3100.0 3300.0 -2100.0 2300.0 2500.0 2800.0 3000.0 3200.0 -1900.0 2100.0 2200.0 2500.0 3000.0 3200.0 -1700.0 2000.0 2400.0 2600.0 3000.0 3200.0 -1900.0 2200.0 2700.0 3000.0 3200.0 3300.0 -2000.0 2300.0 2900.0 3000.0 3300.0 3400.0 -2100.0 2400.0 2800.0 3000.0 3300.0 3400.0 -2000.0 2500.0 2800.0 2900.0 3300.0 3400.0 -2100.0 2600.0 2800.0 2900.0 3300.0 3400.0 -1800.0 2100.0 2700.0 2900.0 3200.0 3300.0 -1800.0 2200.0 2600.0 2800.0 3100.0 3300.0 -1700.0 2000.0 2400.0 2500.0 2700.0 2900.0 -1500.0 1800.0 2400.0 2600.0 2900.0 3200.0 -1500.0 2000.0 2400.0 2500.0 2800.0 3000.0 -1500.0 1900.0 2400.0 2500.0 2700.0 3000.0 -1500.0 2000.0 2400.0 2600.0 2800.0 3100.0 -1500.0 1800.0 2500.0 2600.0 3000.0 3300.0 -1500.0 2100.0 2400.0 2500.0 3000.0 3300.0 -1600.0 2100.0 2400.0 2600.0 3000.0 3300.0 -1600.0 2000.0 2400.0 2600.0 2800.0 3100.0 -1900.0 2300.0 2700.0 2900.0 3300.0 3400.0 -1800.0 2300.0 2700.0 3100.0 3300.0 3400.0 -2000.0 2100.0 2300.0 2700.0 3000.0 3300.0 -2100.0 2300.0 2600.0 2700.0 3100.0 3300.0 -2100.0 2300.0 2500.0 2700.0 3200.0 3300.0 -2100.0 2300.0 2600.0 2800.0 3200.0 3300.0 -1600.0 2100.0 2400.0 2600.0 3100.0 3200.0 -1500.0 2100.0 2500.0 2600.0 3000.0 3100.0 -1600.0 2100.0 2300.0 2600.0 3100.0 3300.0 -1800.0 2100.0 2500.0 2600.0 3000.0 3300.0 -1600.0 1800.0 2500.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2500.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2400.0 2600.0 2900.0 3100.0 -1700.0 2100.0 2500.0 2800.0 3000.0 3200.0 -1600.0 1800.0 2300.0 2700.0 3000.0 3300.0 -1600.0 1800.0 2200.0 2700.0 3100.0 3300.0 -1600.0 1700.0 2100.0 2700.0 3100.0 3200.0 -1600.0 1700.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1600.0 2200.0 2500.0 3100.0 3300.0 -1400.0 1600.0 2100.0 2300.0 3100.0 3300.0 -1400.0 1600.0 2100.0 2300.0 3200.0 3400.0 -1300.0 1600.0 2100.0 2200.0 3200.0 3300.0 -1300.0 1700.0 2200.0 2400.0 3200.0 3400.0 -1300.0 1600.0 2200.0 2300.0 3100.0 3400.0 -1400.0 1600.0 2200.0 2300.0 2900.0 3300.0 -1400.0 1600.0 2200.0 2400.0 2900.0 3300.0 -1300.0 1500.0 2200.0 2400.0 3000.0 3300.0 -1300.0 1500.0 2200.0 2400.0 3100.0 3300.0 -1200.0 1500.0 2200.0 2400.0 3100.0 3300.0 -1200.0 1700.0 2300.0 2500.0 3200.0 3300.0 -1800.0 2000.0 2300.0 2400.0 3200.0 3400.0 -2000.0 2100.0 2400.0 2500.0 3000.0 3400.0 -2000.0 2200.0 2500.0 2700.0 3200.0 3400.0 -2000.0 2500.0 2700.0 2900.0 3400.0 3500.0 -1700.0 2000.0 2500.0 2600.0 3000.0 3300.0 -1600.0 1700.0 2100.0 2400.0 2800.0 3200.0 -1400.0 1600.0 2200.0 2300.0 3000.0 3400.0 -1300.0 1500.0 2200.0 2300.0 2800.0 3200.0 -1500.0 1700.0 2400.0 2500.0 3000.0 3200.0 -1600.0 1700.0 2400.0 2500.0 3000.0 3300.0 -1700.0 1800.0 2400.0 2500.0 2900.0 3200.0 -1800.0 1900.0 2400.0 2500.0 2900.0 3100.0 -1700.0 1900.0 2400.0 2500.0 2900.0 3200.0 -1500.0 1700.0 2300.0 2400.0 3100.0 3400.0 -1400.0 1600.0 2200.0 2400.0 2800.0 3100.0 -1400.0 1600.0 2200.0 2400.0 2800.0 3200.0 -1400.0 1600.0 2100.0 2300.0 2800.0 3200.0 -1500.0 1600.0 2100.0 2400.0 2700.0 3100.0 -1600.0 1700.0 2200.0 2400.0 2800.0 3100.0 -1600.0 2200.0 2500.0 2700.0 3300.0 3400.0 -1500.0 2000.0 2500.0 2900.0 3300.0 3400.0 -1400.0 2000.0 2400.0 2800.0 3200.0 3400.0 -1400.0 1700.0 2300.0 2600.0 3000.0 3200.0 -1300.0 1600.0 2300.0 2400.0 3100.0 3200.0 -1300.0 1600.0 2300.0 2400.0 3000.0 3200.0 -1200.0 1500.0 2200.0 2300.0 3000.0 3300.0 -1300.0 1700.0 2300.0 2400.0 3100.0 3300.0 -1300.0 1600.0 2300.0 2400.0 3000.0 3300.0 -1300.0 1700.0 2300.0 2400.0 3000.0 3300.0 -1300.0 1600.0 2200.0 2300.0 3000.0 3300.0 -1300.0 1600.0 2200.0 2300.0 3100.0 3300.0 -1300.0 1400.0 2200.0 2300.0 3000.0 3300.0 -1300.0 1600.0 2200.0 2400.0 3100.0 3300.0 -1400.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1400.0 1600.0 2300.0 2400.0 3200.0 3400.0 -1400.0 1600.0 2300.0 2400.0 3100.0 3400.0 -1400.0 1600.0 2300.0 2400.0 3000.0 3400.0 -1400.0 1500.0 2400.0 2500.0 3000.0 3300.0 -1400.0 1900.0 2300.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2300.0 3200.0 3400.0 -1400.0 1600.0 2100.0 2400.0 3100.0 3400.0 -1600.0 1900.0 2200.0 2500.0 2800.0 3100.0 -1500.0 1800.0 2200.0 2300.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2400.0 3000.0 3200.0 -1700.0 1800.0 2300.0 2400.0 2900.0 3200.0 -1800.0 1900.0 2400.0 2500.0 2800.0 3100.0 -2000.0 2100.0 2500.0 2600.0 3100.0 3300.0 -2000.0 2100.0 2400.0 2500.0 3000.0 3300.0 -1800.0 2100.0 2400.0 2600.0 3200.0 3400.0 -1600.0 1900.0 2300.0 2500.0 3000.0 3300.0 -1400.0 1700.0 2200.0 2300.0 3000.0 3300.0 -1400.0 1700.0 2100.0 2200.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2300.0 3100.0 3200.0 -1900.0 2200.0 2400.0 2500.0 2900.0 3100.0 -1400.0 1600.0 2200.0 2600.0 3100.0 3300.0 -1400.0 1700.0 2300.0 2700.0 3100.0 3300.0 -1500.0 1900.0 2300.0 2600.0 3200.0 3400.0 -1200.0 1600.0 2400.0 2500.0 3100.0 3200.0 -1200.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1700.0 1800.0 2100.0 2300.0 2900.0 3000.0 -1800.0 1900.0 2200.0 2300.0 2900.0 3000.0 -1900.0 2000.0 2500.0 2600.0 3100.0 3200.0 -1700.0 1900.0 2300.0 2600.0 3200.0 3300.0 -1800.0 2100.0 2500.0 2600.0 3300.0 3400.0 -1700.0 2300.0 2500.0 2900.0 3200.0 3300.0 -1900.0 2400.0 2800.0 3000.0 3300.0 3400.0 -1600.0 1800.0 2400.0 2500.0 3000.0 3400.0 -1700.0 1800.0 2400.0 2500.0 3100.0 3400.0 -1600.0 2000.0 2200.0 2600.0 3200.0 3300.0 -1500.0 2100.0 2500.0 2800.0 3200.0 3300.0 -1500.0 2000.0 2500.0 2800.0 3300.0 3400.0 -1800.0 2000.0 2500.0 2900.0 3300.0 3400.0 -1500.0 2100.0 2400.0 2800.0 3300.0 3400.0 -1300.0 2000.0 2400.0 2500.0 3300.0 3400.0 -1600.0 1700.0 2200.0 2400.0 3200.0 3300.0 -1600.0 1700.0 2200.0 2300.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2400.0 3200.0 3300.0 -1600.0 1700.0 2200.0 2400.0 2900.0 3300.0 -1500.0 1700.0 2300.0 2400.0 2900.0 3100.0 -1400.0 1800.0 2500.0 2600.0 3000.0 3200.0 -1300.0 1600.0 2400.0 2500.0 3100.0 3300.0 -1300.0 1500.0 2400.0 2500.0 3000.0 3400.0 -1300.0 1500.0 2500.0 2600.0 3000.0 3300.0 -1300.0 1500.0 2400.0 2500.0 2800.0 3300.0 -1400.0 1500.0 2500.0 2600.0 2900.0 3300.0 -1800.0 2200.0 2700.0 2900.0 3200.0 3300.0 -1600.0 1700.0 2400.0 2500.0 2900.0 3300.0 -1600.0 1700.0 2300.0 2500.0 2800.0 3300.0 -1700.0 1800.0 2200.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2300.0 3100.0 3200.0 -1600.0 1800.0 2200.0 2400.0 3100.0 3200.0 -1500.0 1800.0 2100.0 2300.0 3100.0 3200.0 -1400.0 1800.0 2200.0 2400.0 2900.0 3200.0 -1500.0 2000.0 2200.0 2400.0 2700.0 3200.0 -1600.0 1900.0 2200.0 2400.0 2800.0 3200.0 -1700.0 1800.0 2400.0 2500.0 3300.0 3500.0 -1500.0 1800.0 2300.0 2600.0 3200.0 3400.0 -1300.0 1600.0 2200.0 2400.0 3200.0 3400.0 -1200.0 1600.0 2200.0 2400.0 3100.0 3300.0 -1100.0 1500.0 2100.0 2300.0 3100.0 3200.0 -1400.0 1700.0 2100.0 2400.0 3100.0 3200.0 -1500.0 1600.0 2100.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2100.0 2300.0 2900.0 3000.0 -1600.0 1700.0 2100.0 2400.0 2900.0 3100.0 -1600.0 1700.0 2100.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2100.0 2300.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2300.0 3200.0 3300.0 -1700.0 1900.0 2100.0 2300.0 3200.0 3400.0 -1800.0 1900.0 2100.0 2300.0 3200.0 3400.0 -1700.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2300.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2300.0 2700.0 3100.0 -1600.0 1700.0 2100.0 2300.0 2500.0 3000.0 -1500.0 1800.0 2300.0 2500.0 2900.0 3100.0 -1500.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1500.0 2000.0 2500.0 2900.0 3200.0 3300.0 -1700.0 2400.0 2900.0 3100.0 3300.0 3400.0 -1700.0 2100.0 2400.0 2800.0 3300.0 3400.0 -1800.0 2400.0 2600.0 2800.0 3100.0 3300.0 -1200.0 1600.0 2400.0 2500.0 3100.0 3400.0 -1300.0 1500.0 2400.0 2500.0 3100.0 3400.0 -1400.0 1500.0 2400.0 2500.0 3000.0 3200.0 -1400.0 1600.0 2400.0 2500.0 3000.0 3200.0 -1800.0 2100.0 2500.0 2600.0 3000.0 3200.0 -1700.0 2200.0 2500.0 2800.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2500.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2500.0 3000.0 3200.0 -1400.0 2000.0 2400.0 2500.0 3200.0 3400.0 -1800.0 2100.0 2400.0 2500.0 3200.0 3400.0 -1800.0 1900.0 2200.0 2400.0 3100.0 3300.0 -1700.0 2000.0 2400.0 2600.0 3200.0 3400.0 -1600.0 1700.0 2300.0 2400.0 3100.0 3400.0 -1600.0 1700.0 2300.0 2400.0 3200.0 3400.0 -1200.0 1700.0 2400.0 2500.0 3200.0 3400.0 -1700.0 2200.0 2800.0 3100.0 3400.0 3500.0 -1600.0 2000.0 2400.0 2800.0 3300.0 3400.0 -1300.0 1600.0 2100.0 2300.0 3100.0 3200.0 -1300.0 1600.0 2100.0 2200.0 3100.0 3200.0 -1300.0 1500.0 1800.0 2000.0 3000.0 3100.0 -1300.0 1500.0 1800.0 1900.0 3100.0 3200.0 -1400.0 1500.0 1700.0 1800.0 3100.0 3200.0 -1400.0 1600.0 1700.0 2000.0 2800.0 2900.0 -1500.0 1700.0 2200.0 2400.0 2800.0 3200.0 -1500.0 1700.0 2200.0 2300.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2200.0 3100.0 3200.0 -1300.0 1500.0 1800.0 2200.0 3100.0 3200.0 -1400.0 1800.0 2300.0 2500.0 2900.0 3200.0 -1400.0 1800.0 2300.0 2400.0 2700.0 3200.0 -1500.0 1600.0 2000.0 2500.0 2900.0 3200.0 -1500.0 1600.0 2000.0 2400.0 3100.0 3300.0 -1500.0 1700.0 2200.0 2500.0 2800.0 3200.0 -1700.0 1800.0 2200.0 2500.0 2800.0 3100.0 -1600.0 1700.0 2200.0 2500.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2500.0 2900.0 3100.0 -1900.0 2000.0 2400.0 2600.0 3000.0 3200.0 -1500.0 1700.0 2200.0 2500.0 3000.0 3300.0 -1300.0 1500.0 2200.0 2400.0 3000.0 3400.0 -1200.0 1400.0 2200.0 2500.0 3200.0 3400.0 -1300.0 1600.0 2000.0 2200.0 3100.0 3200.0 -1400.0 1600.0 1900.0 2000.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2400.0 2900.0 3100.0 -1500.0 1600.0 2200.0 2300.0 2800.0 3100.0 -1400.0 1600.0 2200.0 2300.0 2800.0 3100.0 -1300.0 1600.0 2300.0 2400.0 2900.0 3300.0 -1700.0 2200.0 2800.0 3100.0 3300.0 3400.0 -1700.0 2200.0 2600.0 3000.0 3300.0 3500.0 -1100.0 1500.0 2400.0 2500.0 3200.0 3300.0 -1500.0 2000.0 2300.0 2500.0 2700.0 3100.0 -1900.0 2100.0 2500.0 2600.0 3100.0 3300.0 -1900.0 2000.0 2300.0 2400.0 3000.0 3300.0 -1500.0 2100.0 2500.0 2800.0 3300.0 3400.0 -1600.0 2100.0 2500.0 2900.0 3300.0 3400.0 -1200.0 1600.0 2400.0 2500.0 2900.0 3400.0 -1300.0 1500.0 2300.0 2500.0 2700.0 3200.0 -1400.0 1600.0 2500.0 2600.0 3000.0 3300.0 -1300.0 1600.0 2400.0 2500.0 3100.0 3400.0 -1300.0 1800.0 2300.0 2500.0 3100.0 3300.0 -1300.0 1600.0 2300.0 2400.0 3100.0 3300.0 -1200.0 1600.0 2300.0 2400.0 3000.0 3300.0 -1100.0 1700.0 2200.0 2500.0 3100.0 3300.0 -1500.0 1600.0 2200.0 2600.0 3000.0 3300.0 -1500.0 1600.0 2200.0 2600.0 2900.0 3300.0 -1500.0 1700.0 2400.0 2600.0 2900.0 3300.0 -1500.0 1600.0 2300.0 2500.0 2900.0 3200.0 -1700.0 2100.0 2600.0 3000.0 3300.0 3400.0 -1600.0 1800.0 2400.0 2500.0 3100.0 3500.0 -1500.0 1600.0 2400.0 2500.0 3100.0 3400.0 -1500.0 1600.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1500.0 1600.0 2000.0 3200.0 3400.0 -1900.0 2000.0 2300.0 2500.0 2900.0 3200.0 -2000.0 2500.0 2700.0 2800.0 3200.0 3300.0 -2000.0 2200.0 2500.0 2800.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2700.0 2900.0 3100.0 -1700.0 1800.0 2400.0 2800.0 2900.0 3100.0 -1700.0 1800.0 2400.0 2800.0 3000.0 3100.0 -1700.0 1800.0 2300.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2800.0 3100.0 3200.0 -1400.0 1900.0 2200.0 2400.0 3000.0 3200.0 -2100.0 2300.0 2800.0 3000.0 3200.0 3300.0 -2100.0 2400.0 2900.0 3000.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2600.0 3000.0 3100.0 -1700.0 1800.0 2300.0 2600.0 2900.0 3100.0 -1600.0 1700.0 2100.0 2600.0 2900.0 3100.0 -1700.0 1800.0 2100.0 2700.0 2900.0 3100.0 -1800.0 1900.0 2200.0 2700.0 3000.0 3100.0 -1900.0 2100.0 2300.0 2800.0 3100.0 3200.0 -2000.0 2400.0 2600.0 2900.0 3200.0 3300.0 -1300.0 1700.0 2400.0 2700.0 3100.0 3200.0 -1200.0 1500.0 2300.0 2400.0 3000.0 3200.0 -1100.0 1500.0 2300.0 2500.0 3100.0 3200.0 -2000.0 2300.0 2800.0 3000.0 3200.0 3300.0 -2100.0 2400.0 2900.0 3000.0 3300.0 3400.0 -2200.0 2500.0 2900.0 3100.0 3300.0 3400.0 -2300.0 2500.0 2900.0 3100.0 3300.0 3400.0 -2200.0 2500.0 2900.0 3100.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2600.0 3200.0 3400.0 -1500.0 1800.0 2000.0 2300.0 3200.0 3400.0 -1700.0 1800.0 2000.0 2100.0 3200.0 3400.0 -1800.0 1900.0 2200.0 2300.0 3200.0 3400.0 -1900.0 2000.0 2500.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2400.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2500.0 2800.0 3200.0 3400.0 -1800.0 2300.0 2600.0 2800.0 3200.0 3400.0 -1500.0 1900.0 2600.0 2800.0 3100.0 3300.0 -1400.0 1500.0 2400.0 2700.0 2800.0 3100.0 -1400.0 1500.0 2300.0 2700.0 2800.0 3100.0 -1400.0 1500.0 2400.0 2800.0 2900.0 3100.0 -1300.0 1500.0 2300.0 2900.0 3100.0 3200.0 -1300.0 1500.0 2200.0 2900.0 3100.0 3300.0 -1500.0 1600.0 2000.0 2700.0 3200.0 3300.0 -1500.0 1600.0 2000.0 2400.0 3100.0 3200.0 -1700.0 1800.0 2200.0 2400.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2400.0 2900.0 3200.0 -1700.0 1900.0 2100.0 2400.0 2900.0 3200.0 -2000.0 2400.0 2700.0 2900.0 3100.0 3200.0 -1900.0 2000.0 2400.0 2800.0 3100.0 3200.0 -1700.0 1900.0 2500.0 2800.0 3000.0 3200.0 -1100.0 1400.0 2500.0 2900.0 3100.0 3200.0 -2200.0 2500.0 2900.0 3000.0 3200.0 3400.0 -2100.0 2500.0 2900.0 3000.0 3200.0 3400.0 -1900.0 2100.0 2500.0 2900.0 3000.0 3200.0 -1900.0 2000.0 2400.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2800.0 3000.0 3100.0 -1700.0 1900.0 2200.0 2800.0 3000.0 3100.0 -1600.0 1900.0 2000.0 2500.0 2800.0 3000.0 -1300.0 1900.0 2100.0 2500.0 2900.0 3100.0 -1500.0 1900.0 2100.0 2600.0 2900.0 3100.0 -1100.0 1400.0 2500.0 2700.0 3000.0 3300.0 -1300.0 1600.0 2500.0 2700.0 2900.0 3300.0 -1500.0 1700.0 2500.0 2700.0 2900.0 3200.0 -1700.0 1900.0 2600.0 2700.0 3000.0 3200.0 -1800.0 1900.0 2500.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2500.0 2800.0 2900.0 3200.0 -1900.0 2000.0 2400.0 2800.0 2900.0 3200.0 -1900.0 2000.0 2400.0 2800.0 3000.0 3100.0 -1900.0 2100.0 2500.0 2900.0 3100.0 3200.0 -1800.0 2100.0 2500.0 2800.0 3000.0 3200.0 -1500.0 1700.0 2100.0 2600.0 2900.0 3100.0 -1500.0 1700.0 2400.0 2800.0 3000.0 3200.0 -1500.0 1700.0 2400.0 2900.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2600.0 3000.0 3300.0 -1200.0 1700.0 2500.0 2700.0 3000.0 3300.0 -1200.0 1500.0 2600.0 2700.0 3000.0 3300.0 -1300.0 1600.0 2600.0 2700.0 3000.0 3300.0 -1600.0 1800.0 2400.0 2600.0 2900.0 3200.0 -1700.0 1800.0 2500.0 2600.0 2800.0 3200.0 -1900.0 2000.0 2400.0 2700.0 2800.0 3100.0 -2000.0 2100.0 2500.0 2700.0 2800.0 3100.0 -1800.0 1900.0 2400.0 2700.0 2800.0 3100.0 -1700.0 1800.0 2400.0 2700.0 2800.0 3100.0 -1600.0 1700.0 2400.0 2700.0 2800.0 3100.0 -1500.0 1600.0 2400.0 2700.0 2800.0 3200.0 -1400.0 1600.0 2300.0 2600.0 2900.0 3200.0 -1300.0 1500.0 2400.0 2600.0 2800.0 3200.0 -1200.0 1400.0 2500.0 2600.0 2900.0 3200.0 -1300.0 1400.0 2200.0 2600.0 2800.0 3100.0 -1900.0 2100.0 2600.0 2800.0 3200.0 3400.0 -1900.0 2000.0 2500.0 2800.0 3200.0 3300.0 -1800.0 2100.0 2500.0 2700.0 2900.0 3100.0 -1600.0 2000.0 2400.0 2800.0 3000.0 3200.0 -1600.0 1900.0 2400.0 2800.0 3000.0 3300.0 -1800.0 1900.0 2300.0 2700.0 3000.0 3100.0 -1800.0 1900.0 2300.0 2700.0 2900.0 3000.0 -1700.0 1900.0 2200.0 2500.0 2900.0 3000.0 -1400.0 1900.0 2200.0 2500.0 2900.0 3100.0 -1500.0 1800.0 2200.0 2400.0 2900.0 3100.0 -1600.0 1900.0 2300.0 2500.0 3000.0 3200.0 -1800.0 2100.0 2300.0 2700.0 3100.0 3200.0 -1900.0 2300.0 2600.0 2800.0 3000.0 3200.0 -1500.0 1700.0 2300.0 2700.0 2900.0 3100.0 -1700.0 1800.0 2300.0 2800.0 3000.0 3100.0 -2000.0 2100.0 2400.0 2800.0 3100.0 3200.0 -2100.0 2400.0 2500.0 2800.0 3100.0 3200.0 -1900.0 2100.0 2500.0 2800.0 3000.0 3200.0 -1700.0 1800.0 2400.0 2800.0 3000.0 3200.0 -1300.0 1500.0 2200.0 2800.0 3100.0 3200.0 -1400.0 1500.0 2400.0 2800.0 2900.0 3200.0 -1400.0 1600.0 2500.0 2700.0 3000.0 3200.0 -1500.0 1600.0 2400.0 2700.0 3000.0 3200.0 -1600.0 1800.0 2400.0 2700.0 2900.0 3200.0 -1400.0 1600.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1600.0 2600.0 2700.0 3100.0 3300.0 -1000.0 1800.0 2700.0 2800.0 3200.0 3400.0 -1100.0 1700.0 2400.0 2500.0 3200.0 3400.0 -1600.0 1800.0 2000.0 2200.0 3200.0 3400.0 -1800.0 1900.0 2200.0 2400.0 3000.0 3300.0 -1800.0 1900.0 2200.0 2600.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2700.0 3000.0 3200.0 -1300.0 1500.0 2500.0 2800.0 3000.0 3300.0 -1700.0 2000.0 2500.0 2700.0 2900.0 3200.0 -2000.0 2200.0 2500.0 2700.0 2900.0 3200.0 -2200.0 2600.0 2700.0 2800.0 3100.0 3300.0 -2100.0 2600.0 2700.0 2900.0 3300.0 3400.0 -2200.0 2300.0 2600.0 2800.0 3000.0 3200.0 -1600.0 2200.0 2500.0 2700.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2700.0 3100.0 3200.0 -1800.0 2000.0 2500.0 2900.0 3100.0 3200.0 -2200.0 2400.0 2600.0 2900.0 3100.0 3200.0 -2200.0 2500.0 2600.0 2800.0 3100.0 3200.0 -2300.0 2500.0 2600.0 2800.0 3200.0 3300.0 -2200.0 2500.0 2700.0 2800.0 3200.0 3300.0 -2200.0 2500.0 2700.0 2800.0 3100.0 3200.0 -2200.0 2400.0 2600.0 2800.0 3100.0 3200.0 -2000.0 2200.0 2400.0 2800.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2800.0 3000.0 3200.0 -1700.0 2100.0 2300.0 2600.0 3000.0 3200.0 -1900.0 2200.0 2300.0 2600.0 3000.0 3100.0 -1800.0 2000.0 2200.0 2600.0 3000.0 3100.0 -1600.0 1900.0 2300.0 2500.0 2800.0 3000.0 -1700.0 1800.0 2300.0 2500.0 2800.0 2900.0 -1700.0 2100.0 2400.0 2700.0 3100.0 3200.0 -1400.0 1600.0 1700.0 2100.0 3200.0 3400.0 -1500.0 1800.0 2200.0 2300.0 3200.0 3500.0 -1300.0 1700.0 2300.0 2500.0 2900.0 3200.0 -1300.0 1500.0 2100.0 2500.0 2900.0 3200.0 -1700.0 2000.0 2200.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2500.0 2700.0 2900.0 3200.0 -1700.0 1900.0 2400.0 2700.0 2900.0 3200.0 -1600.0 1700.0 2300.0 2600.0 2900.0 3200.0 -1400.0 1600.0 2300.0 2400.0 2800.0 3300.0 -1600.0 1700.0 2400.0 2700.0 3000.0 3300.0 -1600.0 1800.0 2400.0 2700.0 2900.0 3300.0 -1600.0 1800.0 2400.0 2800.0 3000.0 3200.0 -1600.0 1700.0 2100.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2200.0 2500.0 2700.0 3200.0 -1700.0 2000.0 2400.0 2700.0 3000.0 3300.0 -1600.0 1700.0 2400.0 2700.0 3000.0 3200.0 -1500.0 1600.0 2300.0 2700.0 3100.0 3300.0 -1400.0 1600.0 2300.0 2700.0 3100.0 3300.0 -1400.0 1600.0 2200.0 2800.0 3100.0 3200.0 -1500.0 1600.0 2200.0 2800.0 3100.0 3200.0 -1500.0 1600.0 2100.0 2800.0 3100.0 3200.0 -1500.0 1600.0 2000.0 2600.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2800.0 3100.0 3200.0 -1700.0 1900.0 2500.0 2900.0 3100.0 3300.0 -2300.0 2400.0 2600.0 2900.0 3200.0 3300.0 -2200.0 2300.0 2500.0 2800.0 3100.0 3300.0 -2000.0 2200.0 2400.0 2600.0 3000.0 3300.0 -1300.0 1800.0 2200.0 2400.0 3000.0 3300.0 -1500.0 1800.0 2300.0 2400.0 3100.0 3400.0 -1800.0 2100.0 2300.0 2600.0 3000.0 3200.0 -1900.0 2100.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1900.0 2500.0 2600.0 3000.0 3300.0 -1600.0 1800.0 2500.0 2600.0 3000.0 3400.0 -1600.0 1900.0 2400.0 2500.0 3100.0 3400.0 -1600.0 1800.0 2300.0 2400.0 3100.0 3400.0 -1600.0 1800.0 2200.0 2300.0 3100.0 3400.0 -1600.0 1800.0 2000.0 2200.0 3100.0 3400.0 -1700.0 1800.0 2300.0 2600.0 3100.0 3200.0 -2200.0 2300.0 2500.0 2800.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2500.0 3000.0 3200.0 -1300.0 1700.0 2300.0 2400.0 3000.0 3200.0 -1400.0 1800.0 2300.0 2400.0 3000.0 3100.0 -1200.0 1500.0 2600.0 2800.0 3000.0 3300.0 -2200.0 2400.0 2600.0 2800.0 3000.0 3200.0 -2000.0 2500.0 2600.0 2800.0 3100.0 3200.0 -1900.0 2400.0 2600.0 2700.0 3100.0 3200.0 -2000.0 2300.0 2400.0 2600.0 3000.0 3200.0 -1900.0 2200.0 2400.0 2800.0 3100.0 3300.0 -1800.0 2100.0 2300.0 2800.0 3100.0 3300.0 -1900.0 2100.0 2400.0 2600.0 3100.0 3200.0 -2000.0 2300.0 2500.0 2600.0 2900.0 3200.0 -1600.0 2100.0 2400.0 2600.0 2900.0 3300.0 -1400.0 1700.0 2400.0 2800.0 3000.0 3200.0 -1100.0 1700.0 2900.0 3000.0 3200.0 3400.0 -1100.0 1700.0 2300.0 2900.0 3300.0 3400.0 -1100.0 1500.0 2300.0 2400.0 3300.0 3500.0 -1400.0 1700.0 2200.0 2400.0 3000.0 3300.0 -1600.0 1800.0 2300.0 2600.0 2900.0 3300.0 -2000.0 2100.0 2400.0 2800.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2700.0 3000.0 3100.0 -1600.0 1900.0 2100.0 2600.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2600.0 3000.0 3300.0 -1500.0 1700.0 1900.0 2200.0 3200.0 3400.0 -1400.0 1600.0 1800.0 2100.0 3200.0 3400.0 -1300.0 1500.0 1600.0 2200.0 3300.0 3400.0 -1800.0 2000.0 2200.0 2400.0 3000.0 3300.0 -2100.0 2500.0 2700.0 2800.0 3100.0 3200.0 -2100.0 2400.0 2600.0 2800.0 3100.0 3200.0 -1300.0 1800.0 2200.0 2600.0 3000.0 3200.0 -1800.0 2200.0 2400.0 2800.0 3200.0 3300.0 -1700.0 2100.0 2300.0 2700.0 3100.0 3300.0 -1400.0 1600.0 2100.0 2200.0 3000.0 3300.0 -1500.0 1700.0 2100.0 2200.0 3100.0 3400.0 -1500.0 1700.0 2000.0 2200.0 3100.0 3400.0 -1700.0 1800.0 2100.0 2300.0 3100.0 3400.0 -1900.0 2000.0 2400.0 2600.0 3000.0 3100.0 -2100.0 2500.0 2800.0 2900.0 3200.0 3300.0 -1800.0 2200.0 2400.0 2700.0 3100.0 3200.0 -1700.0 2100.0 2300.0 2600.0 3000.0 3100.0 -1900.0 2100.0 2300.0 2700.0 3000.0 3100.0 -2000.0 2200.0 2500.0 2700.0 2900.0 3100.0 -1400.0 1700.0 2000.0 2600.0 3200.0 3300.0 -1400.0 1700.0 2200.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2900.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2600.0 3000.0 3100.0 -1600.0 1900.0 2200.0 2500.0 2900.0 3000.0 -1600.0 1800.0 2000.0 2600.0 3000.0 3100.0 -1600.0 1800.0 2300.0 2700.0 2900.0 3100.0 -1500.0 1900.0 2200.0 2500.0 2600.0 3200.0 -1800.0 1900.0 2400.0 2800.0 2900.0 3200.0 -2000.0 2100.0 2400.0 2800.0 3000.0 3200.0 -2000.0 2300.0 2400.0 2700.0 3200.0 3300.0 -1900.0 2200.0 2400.0 2800.0 3200.0 3300.0 -1300.0 1800.0 2200.0 2600.0 3100.0 3300.0 -2000.0 2400.0 2800.0 3000.0 3200.0 3400.0 -2200.0 2300.0 2800.0 3000.0 3200.0 3300.0 -2100.0 2300.0 2600.0 3000.0 3200.0 3300.0 -2100.0 2200.0 2600.0 2900.0 3100.0 3200.0 -2100.0 2200.0 2500.0 2900.0 3100.0 3200.0 -1800.0 2100.0 2300.0 2800.0 3100.0 3200.0 -1800.0 2000.0 2200.0 2600.0 3100.0 3200.0 -2000.0 2100.0 2400.0 2900.0 3100.0 3200.0 -2200.0 2500.0 2800.0 3000.0 3200.0 3300.0 -2100.0 2400.0 2800.0 3000.0 3200.0 3400.0 -2000.0 2100.0 2500.0 2800.0 3100.0 3200.0 -2000.0 2100.0 2500.0 2900.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2800.0 2900.0 3100.0 -1600.0 1900.0 2100.0 2500.0 2800.0 3000.0 -1700.0 1900.0 2200.0 2500.0 2800.0 3000.0 -2100.0 2400.0 2700.0 3000.0 3200.0 3400.0 -1700.0 1800.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1700.0 2300.0 2800.0 3000.0 3200.0 -1600.0 1900.0 2300.0 2800.0 3100.0 3300.0 -1400.0 1600.0 1700.0 2100.0 3300.0 3400.0 -1600.0 1700.0 2000.0 2300.0 3200.0 3400.0 -1600.0 1800.0 2300.0 2700.0 2900.0 3200.0 -1600.0 1700.0 2300.0 2800.0 2900.0 3200.0 -1600.0 1800.0 2300.0 2800.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2800.0 3000.0 3100.0 -1800.0 1900.0 2300.0 2600.0 2900.0 3300.0 -1700.0 1800.0 2300.0 2500.0 3000.0 3400.0 -1600.0 1700.0 2200.0 2400.0 3000.0 3400.0 -1600.0 1700.0 2200.0 2300.0 3000.0 3400.0 -2000.0 2100.0 2300.0 2400.0 3000.0 3300.0 -2200.0 2500.0 2700.0 2900.0 3200.0 3400.0 -2000.0 2500.0 2600.0 2800.0 3200.0 3300.0 -2100.0 2500.0 2600.0 2900.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2700.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2800.0 3000.0 3100.0 -1700.0 2000.0 2300.0 2700.0 3000.0 3200.0 -2000.0 2100.0 2500.0 2800.0 3000.0 3100.0 -1400.0 1600.0 1800.0 2100.0 3300.0 3400.0 -1500.0 1800.0 2100.0 2300.0 3200.0 3300.0 -1600.0 1700.0 2200.0 2500.0 3000.0 3300.0 -1600.0 1700.0 2200.0 2600.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2700.0 3000.0 3200.0 -1700.0 1800.0 2200.0 2700.0 3000.0 3100.0 -1800.0 2000.0 2200.0 2800.0 3000.0 3100.0 -1300.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1300.0 2000.0 2200.0 2600.0 3100.0 3200.0 -2100.0 2500.0 2800.0 2900.0 3200.0 3400.0 -2200.0 2600.0 2800.0 3000.0 3300.0 3400.0 -1600.0 1900.0 2500.0 2600.0 3100.0 3400.0 -1400.0 1800.0 2500.0 2600.0 3100.0 3400.0 -1100.0 1800.0 2600.0 2700.0 3200.0 3400.0 -1000.0 1800.0 2500.0 2600.0 3300.0 3400.0 -1200.0 1500.0 1700.0 1900.0 3000.0 3400.0 -1700.0 2100.0 2300.0 2700.0 3200.0 3300.0 -2000.0 2100.0 2600.0 2800.0 3100.0 3300.0 -2000.0 2100.0 2500.0 2900.0 3100.0 3200.0 -1700.0 2000.0 2300.0 2800.0 3100.0 3200.0 -1600.0 2000.0 2100.0 2700.0 3000.0 3100.0 -1600.0 2000.0 2100.0 2700.0 3100.0 3200.0 -1800.0 1900.0 2200.0 2500.0 2900.0 3100.0 -1700.0 2000.0 2200.0 2500.0 2900.0 3100.0 -1500.0 2000.0 2200.0 2400.0 2900.0 3100.0 -1600.0 1900.0 2200.0 2600.0 3000.0 3100.0 -1600.0 1900.0 2300.0 2700.0 2900.0 3100.0 -1700.0 2000.0 2200.0 2700.0 2900.0 3000.0 -1700.0 2000.0 2300.0 2700.0 2900.0 3100.0 -1700.0 2000.0 2300.0 2600.0 2900.0 3100.0 -1700.0 1900.0 2400.0 2600.0 2800.0 3000.0 -1700.0 1800.0 2300.0 2600.0 2800.0 3000.0 -1700.0 1900.0 2400.0 2600.0 2900.0 3100.0 -1700.0 1900.0 2300.0 2500.0 2800.0 3100.0 -1700.0 2100.0 2400.0 2600.0 2800.0 3100.0 -2000.0 2200.0 2500.0 2700.0 2800.0 3100.0 -1900.0 2200.0 2400.0 2700.0 2900.0 3000.0 -1800.0 2000.0 2300.0 2700.0 2900.0 3000.0 -1800.0 2300.0 2500.0 2700.0 3000.0 3100.0 -2000.0 2400.0 2600.0 2800.0 3100.0 3200.0 -1900.0 2300.0 2700.0 2800.0 3200.0 3300.0 -1800.0 2400.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2300.0 2600.0 2800.0 3200.0 3300.0 -1700.0 2000.0 2300.0 2500.0 2900.0 3000.0 -1700.0 1800.0 2100.0 2500.0 2900.0 3000.0 -1600.0 1700.0 2000.0 2400.0 2900.0 3100.0 -1600.0 1700.0 2100.0 2400.0 2700.0 2900.0 -1500.0 1600.0 2000.0 2600.0 2800.0 3100.0 -1400.0 1500.0 2000.0 2700.0 3200.0 3300.0 -1500.0 1600.0 2100.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2100.0 2600.0 3100.0 3200.0 -1800.0 1900.0 2200.0 2800.0 3100.0 3300.0 -2000.0 2200.0 2800.0 2900.0 3200.0 3400.0 -2000.0 2200.0 2800.0 2900.0 3100.0 3400.0 -2000.0 2100.0 2700.0 2900.0 3100.0 3400.0 -1800.0 2200.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2200.0 2600.0 2800.0 3100.0 3200.0 -1900.0 2200.0 2500.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2500.0 2900.0 3100.0 -1800.0 1900.0 2200.0 2500.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2500.0 2800.0 3000.0 -1500.0 1700.0 2100.0 2400.0 2700.0 3100.0 -1400.0 1500.0 1900.0 2400.0 3000.0 3100.0 -1400.0 1600.0 2000.0 2400.0 3100.0 3200.0 -1500.0 1700.0 2100.0 2400.0 3000.0 3200.0 -1600.0 1800.0 2100.0 2400.0 2900.0 3100.0 -1600.0 1800.0 2100.0 2300.0 3000.0 3200.0 -1600.0 1800.0 2100.0 2300.0 3100.0 3300.0 -1600.0 1700.0 2000.0 2200.0 3200.0 3300.0 -1600.0 1700.0 1900.0 2100.0 3000.0 3300.0 -1700.0 1800.0 2100.0 2400.0 3100.0 3200.0 -2000.0 2300.0 2500.0 2700.0 2900.0 3100.0 -2000.0 2300.0 2600.0 2700.0 3000.0 3200.0 -1900.0 2100.0 2400.0 2600.0 2900.0 3200.0 -1700.0 1900.0 2200.0 2600.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2600.0 2700.0 3100.0 -1600.0 1700.0 2200.0 2600.0 2800.0 3000.0 -1500.0 1600.0 2100.0 2700.0 2800.0 3000.0 -1300.0 1500.0 2000.0 2700.0 3000.0 3200.0 -1200.0 1500.0 2100.0 2800.0 3000.0 3200.0 -1300.0 1500.0 2100.0 2800.0 3000.0 3100.0 -1600.0 1900.0 2100.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2200.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2100.0 2500.0 3200.0 3300.0 -1500.0 1900.0 2400.0 2500.0 2900.0 3200.0 -1600.0 1700.0 2200.0 2500.0 2900.0 3100.0 -1600.0 1700.0 2200.0 2700.0 2800.0 3000.0 -1600.0 1700.0 2200.0 2700.0 2900.0 3100.0 -1500.0 1700.0 2400.0 2700.0 2900.0 3100.0 -1500.0 1800.0 2400.0 2700.0 2900.0 3200.0 -1700.0 2100.0 2500.0 2700.0 3100.0 3200.0 -1700.0 2100.0 2500.0 2600.0 2900.0 3100.0 -1900.0 2300.0 2600.0 2700.0 3000.0 3100.0 -1800.0 2200.0 2600.0 2700.0 3000.0 3100.0 -1900.0 2200.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2100.0 2400.0 2800.0 3000.0 3100.0 -1800.0 2000.0 2300.0 2500.0 3000.0 3300.0 -1600.0 2000.0 2200.0 2600.0 2800.0 3000.0 -1700.0 1800.0 2100.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2100.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2100.0 2400.0 2900.0 3200.0 -1400.0 1600.0 2100.0 2300.0 3000.0 3200.0 -1400.0 1800.0 2100.0 2500.0 3100.0 3200.0 -1700.0 1900.0 2300.0 2500.0 2700.0 3100.0 -1800.0 1900.0 2200.0 2500.0 2800.0 3200.0 -1700.0 1900.0 2100.0 2500.0 2800.0 3100.0 -1700.0 1900.0 2200.0 2500.0 2800.0 3200.0 -1600.0 1800.0 2100.0 2600.0 2800.0 3100.0 -1600.0 1800.0 2200.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2200.0 2600.0 2800.0 3100.0 -1400.0 1600.0 2200.0 2600.0 2900.0 3100.0 -1400.0 1600.0 2300.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2200.0 2700.0 2900.0 3200.0 -1500.0 1700.0 2100.0 2600.0 3000.0 3100.0 -1600.0 1700.0 2100.0 2600.0 3000.0 3100.0 -1600.0 1800.0 2300.0 2500.0 2900.0 3100.0 -1700.0 1900.0 2300.0 2500.0 2900.0 3100.0 -1600.0 1800.0 2300.0 2500.0 2900.0 3000.0 -1500.0 1700.0 2000.0 2700.0 3000.0 3100.0 -1500.0 1600.0 2000.0 2600.0 2900.0 3100.0 -1500.0 1600.0 1900.0 2500.0 2900.0 3000.0 -1500.0 1600.0 1900.0 2600.0 2900.0 3100.0 -1700.0 1900.0 2500.0 2700.0 3100.0 3200.0 -1600.0 1700.0 2300.0 2700.0 2900.0 3200.0 -1600.0 1700.0 2200.0 2700.0 2800.0 3100.0 -1600.0 1700.0 2300.0 2700.0 2800.0 3100.0 -1500.0 1600.0 2200.0 2700.0 2900.0 3200.0 -1500.0 1600.0 2100.0 2700.0 3000.0 3200.0 -1400.0 1500.0 2100.0 2700.0 3000.0 3100.0 -1600.0 1800.0 2200.0 2500.0 3200.0 3300.0 -1900.0 2200.0 2400.0 2700.0 3100.0 3300.0 -1900.0 2100.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2100.0 2400.0 2800.0 3000.0 3200.0 -1600.0 1800.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2400.0 3000.0 3300.0 -1700.0 1900.0 2100.0 2500.0 3100.0 3300.0 -1600.0 1800.0 2200.0 2500.0 3200.0 3400.0 -1700.0 1900.0 2200.0 2500.0 3200.0 3400.0 -1600.0 1800.0 2200.0 2600.0 3200.0 3300.0 -1900.0 2100.0 2500.0 2700.0 2900.0 3100.0 -1900.0 2200.0 2400.0 2600.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2500.0 2700.0 3000.0 -1600.0 1700.0 2100.0 2500.0 2600.0 3000.0 -1600.0 1700.0 2200.0 2400.0 2700.0 2900.0 -1700.0 1800.0 2300.0 2500.0 2800.0 3000.0 -1700.0 1800.0 2300.0 2500.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2400.0 2800.0 3100.0 -1700.0 1900.0 2200.0 2400.0 2800.0 3100.0 -1500.0 2000.0 2300.0 2700.0 2900.0 3100.0 -1500.0 1900.0 2300.0 2500.0 3000.0 3300.0 -1700.0 2000.0 2400.0 2900.0 3200.0 3300.0 -2000.0 2100.0 2400.0 2700.0 3000.0 3100.0 -1900.0 2200.0 2400.0 2600.0 2900.0 3000.0 -1700.0 2100.0 2300.0 2700.0 2900.0 3000.0 -1600.0 2000.0 2200.0 2600.0 3000.0 3100.0 -1600.0 2100.0 2200.0 2600.0 3000.0 3100.0 -1600.0 2100.0 2300.0 2600.0 3000.0 3100.0 -1700.0 2100.0 2300.0 2600.0 2900.0 3100.0 -1800.0 2300.0 2400.0 2700.0 3000.0 3200.0 -1900.0 2300.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2400.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2400.0 2600.0 2800.0 3000.0 3200.0 -1800.0 2400.0 2600.0 2800.0 3000.0 3200.0 -1800.0 2300.0 2600.0 2700.0 3000.0 3100.0 -1600.0 1800.0 2300.0 2500.0 2800.0 3100.0 -1500.0 1800.0 2200.0 2500.0 2800.0 3000.0 -1500.0 1800.0 2300.0 2500.0 2800.0 3100.0 -1400.0 1900.0 2300.0 2500.0 2800.0 3000.0 -2000.0 2100.0 2500.0 2700.0 3100.0 3200.0 -2000.0 2100.0 2600.0 2800.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2700.0 2900.0 3100.0 -1800.0 2100.0 2400.0 2600.0 2900.0 3200.0 -1800.0 2000.0 2400.0 2600.0 2900.0 3200.0 -1700.0 1900.0 2400.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2100.0 2500.0 2900.0 3200.0 -1200.0 1700.0 2200.0 2400.0 2900.0 3200.0 -1500.0 1600.0 1900.0 2500.0 2800.0 3000.0 -1500.0 1600.0 2000.0 2500.0 2800.0 3000.0 -1600.0 1700.0 2100.0 2500.0 2800.0 3200.0 -1700.0 1800.0 2100.0 2400.0 2800.0 3100.0 -1700.0 1800.0 2100.0 2400.0 2900.0 3100.0 -1700.0 1800.0 2300.0 2700.0 3100.0 3300.0 -1300.0 1700.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1800.0 2300.0 2700.0 3100.0 3300.0 -1500.0 1600.0 1900.0 2100.0 2800.0 3300.0 -1600.0 1700.0 2000.0 2100.0 2700.0 3300.0 -1800.0 2200.0 2400.0 2500.0 3000.0 3300.0 -1700.0 2300.0 2400.0 2600.0 3100.0 3200.0 -1700.0 2200.0 2400.0 2600.0 3000.0 3100.0 -1800.0 2000.0 2300.0 2500.0 2800.0 3100.0 -1800.0 2000.0 2200.0 2500.0 2900.0 3100.0 -1800.0 2100.0 2200.0 2700.0 3000.0 3100.0 -1800.0 2000.0 2200.0 2600.0 2900.0 3000.0 -1700.0 2000.0 2100.0 2600.0 3000.0 3100.0 -1700.0 2000.0 2100.0 2500.0 3000.0 3100.0 -1700.0 1900.0 2300.0 2500.0 2800.0 3200.0 -1600.0 1900.0 2300.0 2500.0 2900.0 3200.0 -1500.0 1800.0 2200.0 2500.0 3100.0 3300.0 -1600.0 1700.0 2300.0 2700.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2600.0 2900.0 3000.0 -1400.0 1600.0 2000.0 2600.0 2900.0 3200.0 -1500.0 1600.0 2000.0 2600.0 2900.0 3200.0 -1600.0 1700.0 2100.0 2500.0 2900.0 3200.0 -1500.0 1900.0 2300.0 2400.0 3000.0 3300.0 -1600.0 1800.0 2300.0 2500.0 3000.0 3300.0 -1800.0 2200.0 2500.0 2700.0 2900.0 3100.0 -1500.0 1900.0 2200.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2700.0 2900.0 3100.0 -1400.0 1600.0 2000.0 2700.0 2800.0 3000.0 -1400.0 1600.0 1900.0 2600.0 2800.0 3000.0 -1400.0 1600.0 2100.0 2600.0 2900.0 3200.0 -1500.0 1600.0 2100.0 2600.0 3000.0 3200.0 -1500.0 1600.0 2100.0 2600.0 2900.0 3100.0 -1600.0 1700.0 2000.0 2600.0 2900.0 3000.0 -1700.0 1900.0 2100.0 2600.0 2800.0 3100.0 -1800.0 2000.0 2400.0 2700.0 2900.0 3200.0 -1900.0 2000.0 2400.0 2700.0 3000.0 3200.0 -1800.0 2200.0 2600.0 2900.0 3100.0 3300.0 -1800.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1800.0 1900.0 2100.0 2400.0 3000.0 3200.0 -1700.0 1900.0 2100.0 2500.0 3000.0 3200.0 -1600.0 1700.0 2300.0 2500.0 2800.0 3200.0 -1600.0 1700.0 2200.0 2600.0 2800.0 3200.0 -1600.0 1700.0 2100.0 2600.0 2800.0 3200.0 -1600.0 1700.0 2000.0 2600.0 2800.0 3100.0 -1400.0 1700.0 2000.0 2600.0 2900.0 3100.0 -1800.0 2200.0 2500.0 2900.0 3100.0 3300.0 -1700.0 2100.0 2500.0 2900.0 3100.0 3200.0 -1500.0 1700.0 2400.0 2700.0 2900.0 3200.0 -1400.0 1500.0 2300.0 2500.0 2800.0 3100.0 -1300.0 1500.0 2300.0 2500.0 2800.0 3100.0 -1300.0 1500.0 2200.0 2600.0 2700.0 3100.0 -1200.0 1600.0 2400.0 2600.0 3000.0 3200.0 -1600.0 2000.0 2500.0 2700.0 3000.0 3300.0 -1500.0 1700.0 2500.0 2700.0 3000.0 3200.0 -1400.0 1500.0 2000.0 2700.0 3000.0 3100.0 -1400.0 1500.0 1900.0 2600.0 3000.0 3100.0 -2000.0 2300.0 2800.0 2900.0 3200.0 3400.0 -2100.0 2500.0 2700.0 2800.0 3200.0 3400.0 -1900.0 2300.0 2500.0 2700.0 3100.0 3400.0 -1800.0 1900.0 2200.0 2500.0 3000.0 3300.0 -1900.0 2200.0 2500.0 2600.0 2900.0 3200.0 -1900.0 2100.0 2300.0 2700.0 2800.0 3100.0 -1900.0 2000.0 2200.0 2600.0 3000.0 3200.0 -1900.0 2000.0 2500.0 2800.0 3100.0 3300.0 -1800.0 1900.0 2200.0 2700.0 2800.0 3100.0 -1700.0 1800.0 2400.0 2600.0 2800.0 3200.0 -1700.0 1900.0 2400.0 2500.0 2900.0 3300.0 -1400.0 1700.0 2300.0 2400.0 2600.0 3000.0 -1600.0 1700.0 2000.0 2200.0 2900.0 3200.0 -1600.0 1700.0 2000.0 2300.0 2900.0 3200.0 -1800.0 1900.0 2100.0 2600.0 2800.0 3100.0 -1800.0 1900.0 2300.0 2600.0 2900.0 3100.0 -1100.0 1800.0 2200.0 2400.0 2900.0 3200.0 -1200.0 1700.0 2300.0 2500.0 3000.0 3200.0 -1500.0 1600.0 2200.0 2600.0 2700.0 3100.0 -1700.0 1800.0 2100.0 2500.0 3000.0 3100.0 -1300.0 1700.0 2000.0 2400.0 3000.0 3200.0 -1300.0 1600.0 2000.0 2300.0 3100.0 3200.0 -1300.0 1600.0 1900.0 2300.0 3100.0 3200.0 -1400.0 1600.0 1900.0 2300.0 3100.0 3200.0 -1400.0 1600.0 1900.0 2400.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2400.0 3100.0 3200.0 -1800.0 2100.0 2200.0 2700.0 3100.0 3200.0 -1700.0 2100.0 2200.0 2700.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2700.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2600.0 3200.0 3400.0 -1900.0 2200.0 2600.0 3000.0 3300.0 3400.0 -1400.0 1800.0 2200.0 2600.0 3000.0 3300.0 -1000.0 1400.0 2400.0 2600.0 2900.0 3200.0 -1200.0 1500.0 2500.0 2600.0 3000.0 3300.0 -1200.0 1500.0 2400.0 2600.0 3000.0 3300.0 -1200.0 1500.0 2400.0 2600.0 2900.0 3300.0 -1200.0 1500.0 2400.0 2500.0 2900.0 3300.0 -1200.0 1500.0 2300.0 2500.0 3000.0 3300.0 -1200.0 1500.0 2300.0 2400.0 3000.0 3300.0 -1300.0 2000.0 2300.0 2700.0 3100.0 3200.0 -1700.0 1800.0 2200.0 2500.0 2800.0 3200.0 -1800.0 1900.0 2300.0 2500.0 2700.0 3200.0 -1800.0 1900.0 2300.0 2600.0 2700.0 3100.0 -1800.0 1900.0 2400.0 2600.0 2800.0 3200.0 -1900.0 2000.0 2700.0 2800.0 3100.0 3300.0 -1900.0 2000.0 2600.0 2800.0 3000.0 3300.0 -1900.0 2000.0 2500.0 2800.0 3000.0 3300.0 -1900.0 2100.0 2700.0 2800.0 3100.0 3300.0 -1900.0 2000.0 2700.0 2800.0 3000.0 3300.0 -1900.0 2000.0 2600.0 2800.0 3000.0 3200.0 -1200.0 1500.0 2200.0 2500.0 3100.0 3300.0 -1600.0 1900.0 2200.0 2600.0 3000.0 3200.0 -1300.0 1700.0 2300.0 2500.0 3100.0 3200.0 -1400.0 1500.0 2100.0 2400.0 2600.0 3100.0 -1500.0 1600.0 2000.0 2400.0 2700.0 3100.0 -1600.0 1700.0 2000.0 2500.0 2700.0 3100.0 -1900.0 2100.0 2300.0 2600.0 2900.0 3200.0 -1900.0 2100.0 2400.0 2600.0 2900.0 3100.0 -1700.0 2000.0 2200.0 2700.0 2900.0 3100.0 -1800.0 2000.0 2100.0 2700.0 3000.0 3100.0 -1800.0 1900.0 2100.0 2700.0 3000.0 3200.0 -1900.0 2100.0 2700.0 2800.0 3000.0 3300.0 -1900.0 2300.0 2700.0 2800.0 3100.0 3300.0 -2000.0 2400.0 2700.0 2800.0 3200.0 3400.0 -1600.0 2000.0 2300.0 2600.0 3000.0 3100.0 -1000.0 1400.0 2200.0 2400.0 3100.0 3300.0 -1400.0 1500.0 2000.0 2100.0 2900.0 3300.0 -1800.0 1900.0 2100.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2700.0 3000.0 3300.0 -1800.0 2000.0 2300.0 2700.0 3100.0 3300.0 -1800.0 2100.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2200.0 2800.0 2900.0 3200.0 3300.0 -2000.0 2200.0 2500.0 2900.0 3200.0 3300.0 -1800.0 2000.0 2300.0 2400.0 3100.0 3200.0 -1800.0 2000.0 2300.0 2400.0 3000.0 3200.0 -1800.0 1900.0 2200.0 2400.0 3000.0 3200.0 -1600.0 1800.0 2100.0 2600.0 2800.0 3000.0 -1500.0 1600.0 2200.0 2600.0 2900.0 3100.0 -1600.0 1700.0 2000.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2000.0 2500.0 3100.0 3200.0 -1600.0 1900.0 2000.0 2500.0 3000.0 3100.0 -1900.0 2300.0 2800.0 2900.0 3200.0 3400.0 -2000.0 2200.0 2700.0 3000.0 3200.0 3300.0 -1900.0 2400.0 2800.0 2900.0 3200.0 3300.0 -2000.0 2400.0 2700.0 2900.0 3100.0 3300.0 -1800.0 2200.0 2400.0 2800.0 3000.0 3200.0 -1900.0 2200.0 2700.0 3000.0 3200.0 3400.0 -1900.0 2200.0 2600.0 2800.0 3000.0 3300.0 -1600.0 1700.0 2400.0 2600.0 2800.0 3200.0 -1600.0 1700.0 2300.0 2700.0 2800.0 3200.0 -1600.0 1700.0 2200.0 2700.0 2800.0 3200.0 -1600.0 1700.0 2000.0 2400.0 2900.0 3200.0 -1600.0 1900.0 2200.0 2500.0 2800.0 3000.0 -1600.0 2000.0 2400.0 2800.0 3200.0 3300.0 -1900.0 2000.0 2300.0 2700.0 3000.0 3200.0 -1600.0 1800.0 2000.0 2700.0 3000.0 3100.0 -1400.0 1600.0 2100.0 2700.0 2900.0 3100.0 -1900.0 2200.0 2800.0 3000.0 3300.0 3500.0 -1700.0 2000.0 2700.0 2800.0 3100.0 3300.0 -1600.0 1800.0 2200.0 2500.0 2800.0 3100.0 -1600.0 1800.0 2100.0 2400.0 2800.0 3000.0 -1600.0 2000.0 2300.0 2600.0 2800.0 3000.0 -1600.0 1900.0 2300.0 2600.0 2800.0 3000.0 -1800.0 2200.0 2500.0 2900.0 3200.0 3400.0 -1700.0 1900.0 2200.0 2800.0 3100.0 3200.0 -1600.0 2000.0 2300.0 2700.0 3000.0 3300.0 -1600.0 2000.0 2200.0 2600.0 3000.0 3200.0 -1800.0 2100.0 2300.0 2600.0 3000.0 3100.0 -1800.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1900.0 2200.0 2400.0 2600.0 3100.0 3200.0 -1800.0 1900.0 2400.0 2600.0 2900.0 3200.0 -1300.0 2000.0 2300.0 2400.0 2800.0 3300.0 -1800.0 2000.0 2400.0 2600.0 2900.0 3300.0 -1900.0 2200.0 2300.0 2700.0 3000.0 3100.0 -1900.0 2200.0 2300.0 2700.0 3000.0 3200.0 -1800.0 2200.0 2400.0 2800.0 3100.0 3200.0 -1600.0 2100.0 2200.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2300.0 2500.0 2900.0 3200.0 -1800.0 2200.0 2400.0 2700.0 3100.0 3300.0 -1200.0 2000.0 2500.0 2600.0 3100.0 3200.0 -1000.0 1600.0 2700.0 2900.0 3200.0 3300.0 -1000.0 1500.0 2700.0 2900.0 3200.0 3300.0 -1500.0 1700.0 2600.0 2800.0 3100.0 3300.0 -1500.0 1700.0 2600.0 2800.0 3000.0 3300.0 -1600.0 1700.0 2500.0 2800.0 3000.0 3300.0 -1600.0 1700.0 2400.0 2800.0 3000.0 3300.0 -1700.0 1800.0 2000.0 2400.0 3000.0 3200.0 -1700.0 1900.0 2100.0 2500.0 3000.0 3100.0 -1700.0 1900.0 2200.0 2500.0 2900.0 3100.0 -1700.0 1800.0 2200.0 2500.0 2800.0 3000.0 -1700.0 1800.0 2400.0 2600.0 2800.0 3100.0 -1200.0 1600.0 2200.0 2400.0 2900.0 3100.0 -1300.0 1800.0 2400.0 2600.0 2900.0 3200.0 -1300.0 1500.0 2000.0 2600.0 3000.0 3200.0 -1500.0 1800.0 2400.0 2700.0 3100.0 3200.0 -1800.0 2100.0 2400.0 2700.0 3100.0 3400.0 -1500.0 1600.0 2000.0 2200.0 3000.0 3300.0 -1600.0 1700.0 2100.0 2200.0 3000.0 3300.0 -1700.0 1800.0 2100.0 2300.0 3100.0 3300.0 -1800.0 1900.0 2200.0 2400.0 2900.0 3100.0 -1800.0 2000.0 2300.0 2700.0 3100.0 3200.0 -1500.0 1900.0 2200.0 2500.0 3000.0 3200.0 -1500.0 2100.0 2300.0 2500.0 3100.0 3300.0 -1700.0 1900.0 2400.0 2700.0 2900.0 3100.0 -1400.0 1800.0 2200.0 2300.0 3100.0 3400.0 -1300.0 1800.0 2300.0 2400.0 3000.0 3300.0 -1800.0 2200.0 2400.0 2600.0 3100.0 3300.0 -1800.0 2100.0 2300.0 2500.0 3100.0 3200.0 -1100.0 1700.0 2200.0 2300.0 3000.0 3200.0 -1100.0 1600.0 2200.0 2400.0 3100.0 3200.0 -1200.0 2000.0 2300.0 2500.0 3000.0 3100.0 -1700.0 2300.0 2500.0 2800.0 3200.0 3300.0 -1500.0 1900.0 2200.0 2400.0 2900.0 3100.0 -1400.0 1900.0 2200.0 2500.0 3000.0 3200.0 -1400.0 2000.0 2200.0 2600.0 3100.0 3200.0 -1700.0 2000.0 2300.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2500.0 2800.0 2900.0 3200.0 -1700.0 1800.0 2500.0 2700.0 2900.0 3200.0 -1600.0 1800.0 2400.0 2600.0 2800.0 3200.0 -1400.0 1700.0 2100.0 2500.0 3000.0 3300.0 -1400.0 1600.0 1900.0 2000.0 3100.0 3300.0 -1400.0 1600.0 2000.0 2100.0 3100.0 3300.0 -1900.0 2000.0 2300.0 2400.0 2900.0 3300.0 -2100.0 2300.0 2600.0 2900.0 3100.0 3300.0 -1200.0 1800.0 2200.0 2400.0 3000.0 3200.0 -1700.0 2000.0 2300.0 2600.0 3000.0 3300.0 -1900.0 2400.0 2700.0 2900.0 3300.0 3400.0 -1400.0 1600.0 2100.0 2500.0 3100.0 3200.0 -1400.0 1700.0 2300.0 2500.0 3200.0 3400.0 -1400.0 1600.0 2300.0 2500.0 3200.0 3400.0 -1400.0 1600.0 2300.0 2500.0 3100.0 3400.0 -1500.0 1700.0 2200.0 2800.0 3100.0 3200.0 -1500.0 1600.0 2300.0 2800.0 3000.0 3200.0 -1400.0 1600.0 2300.0 2800.0 3000.0 3200.0 -1200.0 1400.0 2400.0 2900.0 3100.0 3200.0 -1200.0 1400.0 2400.0 2900.0 3200.0 3300.0 -1100.0 1400.0 2400.0 2900.0 3200.0 3300.0 -1600.0 1800.0 2400.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2400.0 2800.0 3000.0 3200.0 -1900.0 2300.0 2700.0 3000.0 3300.0 3400.0 -1800.0 2300.0 2800.0 3000.0 3200.0 3400.0 -1800.0 1900.0 2400.0 2800.0 3100.0 3300.0 -1700.0 1800.0 2100.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2700.0 3100.0 3200.0 -1600.0 1700.0 2000.0 2500.0 3100.0 3200.0 -1400.0 1700.0 2200.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2600.0 3100.0 3200.0 -1700.0 1900.0 2200.0 2700.0 3100.0 3200.0 -1900.0 2200.0 2500.0 2800.0 3000.0 3100.0 -2000.0 2200.0 2500.0 2700.0 3200.0 3300.0 -1700.0 1800.0 2300.0 2800.0 2900.0 3200.0 -1700.0 1800.0 2400.0 2800.0 2900.0 3200.0 -1600.0 1800.0 2600.0 2800.0 3000.0 3300.0 -2100.0 2300.0 2500.0 2800.0 3000.0 3300.0 -2100.0 2200.0 2500.0 2600.0 2900.0 3200.0 -1900.0 2100.0 2400.0 2600.0 2800.0 3200.0 -1800.0 2000.0 2700.0 2800.0 3000.0 3300.0 -1700.0 2100.0 2400.0 2600.0 3000.0 3200.0 -1800.0 2000.0 2400.0 2500.0 3100.0 3400.0 -1900.0 2200.0 2500.0 2600.0 3100.0 3200.0 -1900.0 2200.0 2500.0 2600.0 3000.0 3200.0 -1800.0 2200.0 2500.0 2600.0 3000.0 3100.0 -2000.0 2200.0 2600.0 2700.0 3100.0 3200.0 -2000.0 2300.0 2600.0 2700.0 3100.0 3200.0 -1800.0 2100.0 2300.0 2500.0 2900.0 3100.0 -1800.0 2100.0 2700.0 3000.0 3300.0 3400.0 -1800.0 2000.0 2700.0 2900.0 3200.0 3300.0 -1900.0 2100.0 2400.0 2700.0 3000.0 3300.0 -1900.0 2100.0 2400.0 2700.0 2900.0 3100.0 -2000.0 2200.0 2400.0 2700.0 2900.0 3100.0 -2000.0 2400.0 2600.0 2700.0 2900.0 3100.0 -1500.0 1700.0 2200.0 2300.0 3100.0 3300.0 -1400.0 1600.0 2300.0 2600.0 2900.0 3300.0 -1600.0 1700.0 2500.0 2700.0 2900.0 3200.0 -1600.0 1700.0 2500.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2300.0 2400.0 3000.0 3400.0 -1500.0 1700.0 2100.0 2300.0 2900.0 3300.0 -1600.0 1700.0 2100.0 2300.0 3000.0 3300.0 -1500.0 2000.0 2300.0 2600.0 3100.0 3300.0 -1500.0 2100.0 2500.0 2600.0 3000.0 3200.0 -1500.0 2000.0 2500.0 2600.0 3100.0 3200.0 -1600.0 1700.0 2000.0 2500.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2600.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2500.0 3000.0 3100.0 -1800.0 1900.0 2200.0 2600.0 3000.0 3100.0 -1700.0 2100.0 2600.0 2900.0 3100.0 3400.0 -1700.0 2000.0 2600.0 2900.0 3200.0 3300.0 -1800.0 1900.0 2300.0 2800.0 2900.0 3100.0 -1800.0 1900.0 2600.0 2800.0 3200.0 3300.0 -1800.0 2000.0 2500.0 2900.0 3200.0 3400.0 -1800.0 2400.0 2800.0 2900.0 3300.0 3400.0 -1500.0 1800.0 2300.0 2700.0 3200.0 3300.0 -1600.0 1700.0 2400.0 2800.0 3000.0 3200.0 -1200.0 1600.0 2200.0 2600.0 2900.0 3200.0 -1400.0 1800.0 2400.0 2800.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2800.0 3100.0 3300.0 -1300.0 1700.0 2300.0 2600.0 3000.0 3200.0 -1500.0 1600.0 2400.0 2600.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2600.0 3000.0 3100.0 -1800.0 2000.0 2600.0 2900.0 3200.0 3400.0 -1900.0 2000.0 2700.0 2900.0 3200.0 3400.0 -1200.0 1800.0 2400.0 2500.0 3000.0 3300.0 -1300.0 1900.0 2400.0 2500.0 3100.0 3300.0 -1700.0 2000.0 2500.0 2900.0 3200.0 3300.0 -1100.0 1400.0 2400.0 2900.0 3100.0 3200.0 -1700.0 1800.0 2200.0 2700.0 3100.0 3200.0 -2000.0 2200.0 2400.0 2600.0 3000.0 3100.0 -1900.0 2100.0 2300.0 2600.0 3000.0 3100.0 -1700.0 1900.0 2500.0 2800.0 3100.0 3200.0 -1400.0 1600.0 2400.0 2800.0 3000.0 3200.0 -1200.0 1500.0 2200.0 2600.0 3100.0 3300.0 -1400.0 1600.0 2100.0 2700.0 3100.0 3200.0 -1500.0 1700.0 2200.0 2400.0 2900.0 3100.0 -1500.0 1800.0 2200.0 2300.0 2800.0 2900.0 -1500.0 1800.0 2200.0 2500.0 2900.0 3100.0 -1600.0 1800.0 2200.0 2500.0 2900.0 3100.0 -1700.0 1800.0 2200.0 2700.0 2900.0 3000.0 -1600.0 1800.0 2100.0 2800.0 3000.0 3100.0 -1800.0 1900.0 2300.0 2800.0 3100.0 3300.0 -1800.0 2000.0 2400.0 2800.0 3200.0 3400.0 -1900.0 2000.0 2500.0 2800.0 3200.0 3400.0 -1900.0 2000.0 2300.0 2700.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2600.0 3000.0 3200.0 -1400.0 1700.0 2200.0 2500.0 3100.0 3300.0 -1900.0 2300.0 2500.0 2800.0 3100.0 3300.0 -1300.0 2000.0 2200.0 2400.0 2800.0 3100.0 -1400.0 1700.0 2300.0 2600.0 3000.0 3300.0 -1500.0 1600.0 2300.0 2700.0 2800.0 3100.0 -1600.0 1800.0 2300.0 2600.0 2800.0 3100.0 -1900.0 2000.0 2400.0 2600.0 2900.0 3100.0 -2000.0 2500.0 2600.0 2700.0 3200.0 3300.0 -2200.0 2500.0 2600.0 2900.0 3100.0 3300.0 -2100.0 2400.0 2600.0 2700.0 3200.0 3300.0 -2100.0 2400.0 2600.0 2700.0 3200.0 3400.0 -1700.0 1900.0 2500.0 2700.0 2900.0 3100.0 -1900.0 2300.0 2400.0 2700.0 3000.0 3200.0 -2000.0 2300.0 2500.0 2700.0 3000.0 3100.0 -2000.0 2400.0 2500.0 2800.0 3200.0 3300.0 -2000.0 2400.0 2600.0 2800.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1600.0 2200.0 2400.0 3000.0 3300.0 -1400.0 1600.0 2100.0 2400.0 2900.0 3200.0 -1600.0 1700.0 2200.0 2300.0 2700.0 3200.0 -1700.0 1800.0 2100.0 2300.0 2800.0 3300.0 -1700.0 1800.0 2200.0 2400.0 2800.0 3300.0 -1900.0 2000.0 2200.0 2500.0 3000.0 3200.0 -1300.0 2000.0 2300.0 2400.0 2900.0 3200.0 -1900.0 2200.0 2400.0 2500.0 2900.0 3200.0 -1600.0 1800.0 2200.0 2500.0 2700.0 3100.0 -1600.0 1700.0 2300.0 2500.0 3000.0 3400.0 -1900.0 2000.0 2400.0 2700.0 2900.0 3300.0 -1800.0 2200.0 2400.0 2600.0 2900.0 3100.0 -1700.0 2000.0 2300.0 2600.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2600.0 2800.0 3000.0 -1600.0 1700.0 2100.0 2700.0 2900.0 3000.0 -1400.0 1600.0 2000.0 2200.0 2800.0 3200.0 -1200.0 1600.0 2000.0 2400.0 3000.0 3200.0 -1200.0 1700.0 2200.0 2500.0 3000.0 3100.0 -1600.0 1900.0 2600.0 2800.0 3000.0 3200.0 -1500.0 1900.0 2300.0 2700.0 2900.0 3200.0 -1200.0 1900.0 2300.0 2400.0 3000.0 3300.0 -1400.0 1600.0 2300.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2500.0 3000.0 3200.0 -1500.0 1600.0 2100.0 2400.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2300.0 3000.0 3300.0 -1600.0 1700.0 2100.0 2200.0 2900.0 3300.0 -1500.0 1600.0 2000.0 2100.0 2800.0 3200.0 -1500.0 1600.0 2000.0 2200.0 2800.0 3200.0 -1500.0 1600.0 2000.0 2200.0 2900.0 3200.0 -1500.0 1800.0 2100.0 2200.0 2900.0 3300.0 -2100.0 2300.0 2500.0 2700.0 2900.0 3100.0 -2000.0 2200.0 2400.0 2600.0 2800.0 3100.0 -1800.0 2100.0 2300.0 2600.0 2800.0 3000.0 -1600.0 1800.0 2400.0 2600.0 2800.0 3000.0 -1200.0 1300.0 2100.0 2700.0 2800.0 3000.0 -1100.0 1300.0 2300.0 2700.0 2900.0 3100.0 -1100.0 1300.0 2300.0 2700.0 2800.0 3100.0 -1100.0 1300.0 2300.0 2800.0 2900.0 3100.0 -1500.0 1800.0 2300.0 2700.0 3100.0 3200.0 -1200.0 1800.0 2300.0 2600.0 3000.0 3200.0 -1700.0 1800.0 2300.0 2600.0 2800.0 3200.0 -1900.0 2000.0 2400.0 2600.0 2800.0 3200.0 -2100.0 2200.0 2400.0 2600.0 3100.0 3300.0 -2000.0 2200.0 2400.0 2600.0 3100.0 3300.0 -2300.0 2500.0 2800.0 3000.0 3200.0 3300.0 -1900.0 2200.0 2700.0 2800.0 3100.0 3300.0 -1600.0 1700.0 2200.0 2600.0 3000.0 3300.0 -1500.0 1700.0 2100.0 2400.0 3100.0 3300.0 -1300.0 1600.0 2100.0 2400.0 3200.0 3400.0 -1400.0 2000.0 2300.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2300.0 2500.0 3000.0 3300.0 -1400.0 1600.0 2300.0 2400.0 2800.0 3200.0 -1400.0 1600.0 2300.0 2500.0 2800.0 3200.0 -1400.0 1500.0 2300.0 2500.0 2800.0 3200.0 -1400.0 1500.0 2200.0 2600.0 3000.0 3300.0 -1500.0 1600.0 2000.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2200.0 2700.0 3000.0 3200.0 -1500.0 1600.0 2300.0 2700.0 3000.0 3200.0 -1800.0 2000.0 2500.0 2800.0 2900.0 3200.0 -1700.0 1900.0 2500.0 2700.0 2900.0 3200.0 -1900.0 2200.0 2600.0 2800.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2200.0 2700.0 3100.0 3200.0 -1300.0 1500.0 2100.0 2800.0 3100.0 3200.0 -1500.0 1600.0 2400.0 2800.0 3000.0 3300.0 -1400.0 1500.0 2500.0 2600.0 2900.0 3200.0 -1500.0 1600.0 2400.0 2600.0 2800.0 3300.0 -1600.0 1700.0 2400.0 2600.0 2800.0 3300.0 -1800.0 2000.0 2300.0 2600.0 3000.0 3100.0 -1800.0 2000.0 2300.0 2700.0 3000.0 3100.0 -1900.0 2100.0 2400.0 2800.0 3100.0 3300.0 -1900.0 2100.0 2400.0 2800.0 3000.0 3300.0 -1800.0 1900.0 2300.0 2700.0 2900.0 3100.0 -1800.0 2100.0 2300.0 2700.0 3000.0 3100.0 -1900.0 2100.0 2300.0 2800.0 3000.0 3100.0 -1400.0 2000.0 2200.0 2500.0 3000.0 3200.0 -1900.0 2200.0 2600.0 3000.0 3200.0 3300.0 -1800.0 2200.0 2600.0 3000.0 3200.0 3300.0 -1500.0 1600.0 2400.0 2600.0 2800.0 3200.0 -1400.0 1600.0 2500.0 2700.0 2900.0 3200.0 -1500.0 1600.0 2400.0 2700.0 2900.0 3100.0 -1500.0 2100.0 2400.0 2700.0 3100.0 3300.0 -1900.0 2000.0 2300.0 2600.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2600.0 2900.0 3100.0 -1700.0 2000.0 2200.0 2600.0 2900.0 3100.0 -1700.0 2200.0 2400.0 2700.0 3000.0 3200.0 -1700.0 1900.0 2500.0 2600.0 2900.0 3100.0 -1500.0 1700.0 2500.0 2600.0 2900.0 3100.0 -1400.0 1600.0 2300.0 2600.0 2900.0 3100.0 -1200.0 1400.0 2200.0 2600.0 2900.0 3200.0 -1600.0 1700.0 2200.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2500.0 3100.0 3200.0 -1600.0 1900.0 2200.0 2700.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2800.0 3100.0 3200.0 -1900.0 2100.0 2500.0 2700.0 3100.0 3400.0 -2100.0 2300.0 2600.0 2800.0 3000.0 3200.0 -2000.0 2300.0 2600.0 2800.0 3000.0 3200.0 -2100.0 2400.0 2700.0 2800.0 3000.0 3200.0 -1600.0 2300.0 2600.0 2800.0 3000.0 3100.0 -1700.0 2300.0 2600.0 2800.0 3000.0 3100.0 -1600.0 1700.0 2400.0 2600.0 3000.0 3300.0 -1500.0 1700.0 2400.0 2500.0 2900.0 3300.0 -1600.0 1900.0 2300.0 2600.0 2700.0 3300.0 -1600.0 1900.0 2300.0 2500.0 3300.0 3400.0 -1600.0 1800.0 2300.0 2500.0 3200.0 3400.0 -1800.0 2200.0 2700.0 2900.0 3300.0 3500.0 -1700.0 2000.0 2400.0 2600.0 3300.0 3400.0 -1800.0 2200.0 2800.0 3000.0 3200.0 3300.0 -2100.0 2400.0 2800.0 3100.0 3400.0 3500.0 -2100.0 2500.0 2800.0 3100.0 3400.0 3500.0 -1900.0 2300.0 2900.0 3000.0 3300.0 3400.0 -1900.0 2000.0 2300.0 2400.0 3200.0 3400.0 -1400.0 1700.0 2000.0 2300.0 3000.0 3100.0 -1400.0 1600.0 1900.0 2100.0 3000.0 3100.0 -1400.0 1600.0 1800.0 2100.0 3100.0 3200.0 -1400.0 1600.0 1800.0 2000.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2300.0 2900.0 3300.0 -1600.0 1800.0 2400.0 2500.0 2900.0 3300.0 -1900.0 2000.0 2200.0 2400.0 3100.0 3300.0 -1900.0 2000.0 2200.0 2400.0 3200.0 3400.0 -1300.0 1500.0 2000.0 2500.0 3000.0 3200.0 -1300.0 1600.0 2100.0 2500.0 3000.0 3200.0 -1300.0 1600.0 2300.0 2600.0 3200.0 3300.0 -1400.0 1800.0 2200.0 2600.0 3200.0 3400.0 -1600.0 1800.0 2100.0 2400.0 3300.0 3400.0 -1700.0 1900.0 2200.0 2400.0 3200.0 3400.0 -1800.0 2000.0 2400.0 2700.0 3200.0 3400.0 -1900.0 2200.0 2600.0 2700.0 3000.0 3200.0 -1800.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2400.0 3100.0 3200.0 -1400.0 1600.0 1800.0 2000.0 3000.0 3100.0 -1400.0 1600.0 1800.0 2000.0 2900.0 3000.0 -1400.0 1600.0 1800.0 2100.0 2800.0 3000.0 -1500.0 1700.0 2100.0 2400.0 3000.0 3300.0 -1400.0 1600.0 2200.0 2500.0 3200.0 3300.0 -1100.0 1700.0 2400.0 2600.0 3100.0 3300.0 -1200.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2800.0 3300.0 3400.0 -1600.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1800.0 2200.0 2700.0 3100.0 3400.0 3500.0 -1800.0 2200.0 2800.0 3000.0 3400.0 3500.0 -1900.0 2300.0 2800.0 3100.0 3400.0 3500.0 -1900.0 2400.0 2800.0 3100.0 3300.0 3400.0 -1800.0 2200.0 2600.0 2900.0 3400.0 3500.0 -1600.0 1800.0 2400.0 2800.0 3200.0 3300.0 -2000.0 2500.0 2600.0 2900.0 3200.0 3300.0 -2100.0 2400.0 2600.0 3000.0 3200.0 3300.0 -2200.0 2500.0 2700.0 3100.0 3200.0 3300.0 -2100.0 2500.0 2600.0 2800.0 3300.0 3400.0 -2000.0 2100.0 2700.0 2900.0 3300.0 3400.0 -1900.0 2000.0 2300.0 2500.0 3100.0 3400.0 -1700.0 1900.0 2300.0 2400.0 3100.0 3400.0 -1600.0 1900.0 2300.0 2500.0 3200.0 3400.0 -1600.0 2200.0 2700.0 3000.0 3300.0 3400.0 -1800.0 2300.0 2700.0 3000.0 3400.0 3500.0 -1700.0 2300.0 2500.0 2800.0 3300.0 3400.0 -1500.0 1900.0 2500.0 2700.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2800.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2500.0 3200.0 3300.0 -1100.0 2000.0 2400.0 2500.0 3200.0 3300.0 -1400.0 1800.0 2400.0 2700.0 3100.0 3300.0 -1500.0 1900.0 2500.0 2700.0 3100.0 3300.0 -1500.0 1900.0 2300.0 2500.0 2700.0 2900.0 -1400.0 1800.0 2200.0 2500.0 2700.0 2900.0 -1400.0 1800.0 2400.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2400.0 2600.0 3000.0 3300.0 -1500.0 1900.0 2100.0 2300.0 3200.0 3300.0 -1400.0 1800.0 2300.0 2400.0 3000.0 3300.0 -2000.0 2300.0 2800.0 3000.0 3400.0 3500.0 -1600.0 1900.0 2200.0 2300.0 3100.0 3400.0 -1600.0 1800.0 2000.0 2500.0 3000.0 3100.0 -1500.0 1700.0 1800.0 2400.0 3100.0 3200.0 -1500.0 1600.0 1800.0 2400.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2600.0 3100.0 3200.0 -1700.0 1900.0 2300.0 2500.0 2900.0 3300.0 -1900.0 2300.0 2700.0 2900.0 3100.0 3300.0 -1400.0 1700.0 2300.0 2500.0 3100.0 3200.0 -1200.0 1700.0 2300.0 2500.0 3100.0 3200.0 -1300.0 2200.0 2600.0 2800.0 3100.0 3300.0 -1100.0 1700.0 2500.0 2600.0 3200.0 3400.0 -1300.0 1600.0 2500.0 2600.0 3200.0 3300.0 -1400.0 1500.0 2500.0 2600.0 3100.0 3300.0 -1700.0 1800.0 2300.0 2500.0 2700.0 3300.0 -1800.0 2000.0 2500.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2400.0 2500.0 2900.0 3200.0 -1800.0 1900.0 2400.0 2500.0 2800.0 3200.0 -1900.0 2000.0 2300.0 2500.0 2800.0 3300.0 -1800.0 2000.0 2200.0 2500.0 2800.0 3300.0 -1900.0 2300.0 2700.0 3000.0 3300.0 3500.0 -2100.0 2300.0 2900.0 3000.0 3200.0 3300.0 -1900.0 2100.0 2800.0 2900.0 3100.0 3300.0 -1700.0 2000.0 2600.0 2700.0 2900.0 3100.0 -1700.0 2100.0 2600.0 2800.0 3000.0 3200.0 -1700.0 2100.0 2600.0 2900.0 3100.0 3300.0 -1400.0 1500.0 1700.0 2900.0 3300.0 3400.0 -1400.0 1700.0 1800.0 2600.0 3300.0 3400.0 -1400.0 1700.0 2000.0 2700.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2300.0 2900.0 3000.0 -1400.0 1700.0 1800.0 2200.0 3000.0 3100.0 -1500.0 1600.0 2000.0 2100.0 3000.0 3200.0 -1300.0 1600.0 1800.0 2000.0 3000.0 3100.0 -1300.0 1600.0 1800.0 2000.0 3100.0 3200.0 -1300.0 1500.0 1700.0 2200.0 3200.0 3300.0 -1300.0 1600.0 1700.0 2200.0 3200.0 3300.0 -1300.0 1500.0 1600.0 2100.0 3200.0 3300.0 -1600.0 1700.0 2100.0 2300.0 3100.0 3300.0 -1500.0 1600.0 2300.0 2400.0 3100.0 3400.0 -1900.0 2400.0 2800.0 3100.0 3400.0 3500.0 -2000.0 2400.0 2800.0 3000.0 3400.0 3500.0 -1600.0 1800.0 2200.0 2600.0 2900.0 3100.0 -1300.0 1600.0 1800.0 2400.0 3100.0 3200.0 -1200.0 1600.0 1800.0 2100.0 3000.0 3100.0 -1400.0 1900.0 2100.0 2400.0 3000.0 3100.0 -1300.0 1900.0 2100.0 2300.0 3000.0 3200.0 -1300.0 1800.0 2100.0 2300.0 3000.0 3200.0 -1400.0 1800.0 2500.0 2700.0 3100.0 3400.0 -1100.0 1800.0 2200.0 2300.0 3100.0 3200.0 -1100.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1200.0 1700.0 2300.0 2400.0 3200.0 3300.0 -1400.0 1700.0 2300.0 2400.0 3000.0 3300.0 -1400.0 1700.0 2400.0 2500.0 3000.0 3300.0 -1900.0 2200.0 2400.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2400.0 3200.0 3400.0 -1300.0 1700.0 2200.0 2400.0 2900.0 3100.0 -1100.0 1600.0 1800.0 2100.0 2900.0 3000.0 -1500.0 1700.0 1900.0 2100.0 3000.0 3100.0 -1600.0 1700.0 1900.0 2100.0 3000.0 3100.0 -1700.0 1900.0 2300.0 2500.0 2900.0 3200.0 -1400.0 1800.0 2200.0 2300.0 3300.0 3400.0 -2100.0 2400.0 2800.0 2900.0 3200.0 3300.0 -2200.0 2500.0 2700.0 2900.0 3100.0 3300.0 -2300.0 2500.0 2700.0 3000.0 3100.0 3300.0 -1700.0 2200.0 2400.0 2800.0 3300.0 3400.0 -1800.0 2300.0 2800.0 3100.0 3400.0 3500.0 -1800.0 2300.0 2600.0 3100.0 3400.0 3500.0 -1800.0 2300.0 2600.0 3100.0 3300.0 3400.0 -1500.0 1700.0 2400.0 2600.0 3000.0 3300.0 -1400.0 1600.0 2400.0 2500.0 2900.0 3300.0 -1200.0 1700.0 2200.0 2400.0 3100.0 3200.0 -1500.0 2000.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1900.0 2300.0 2700.0 3000.0 3200.0 -1300.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1600.0 1900.0 2400.0 2500.0 3000.0 3200.0 -2000.0 2300.0 2600.0 2700.0 3000.0 3100.0 -1800.0 2000.0 2500.0 2800.0 3000.0 3300.0 -2000.0 2400.0 2600.0 2700.0 3100.0 3200.0 -1700.0 2400.0 2600.0 2800.0 3100.0 3200.0 -1200.0 1800.0 2200.0 2300.0 3300.0 3400.0 -1100.0 1600.0 2200.0 2400.0 3200.0 3300.0 -1100.0 1800.0 1900.0 2500.0 3000.0 3100.0 -1200.0 1700.0 1900.0 2500.0 3100.0 3200.0 -1400.0 1800.0 2300.0 2500.0 3200.0 3400.0 -1500.0 1700.0 2400.0 2500.0 3100.0 3400.0 -1500.0 1700.0 2300.0 2400.0 2900.0 3300.0 -1500.0 1900.0 2200.0 2600.0 3000.0 3100.0 -1300.0 1600.0 2100.0 2300.0 3000.0 3100.0 -1400.0 1700.0 2200.0 2300.0 3000.0 3100.0 -1400.0 1700.0 2200.0 2400.0 3000.0 3100.0 -1400.0 1600.0 2200.0 2300.0 3000.0 3100.0 -1500.0 1700.0 2200.0 2400.0 3100.0 3300.0 -1500.0 1700.0 2100.0 2300.0 3200.0 3300.0 -1400.0 1700.0 2000.0 2300.0 3200.0 3300.0 -1300.0 1700.0 2100.0 2500.0 3100.0 3200.0 -1500.0 1800.0 2200.0 2700.0 3000.0 3200.0 -1500.0 1700.0 2300.0 2400.0 3200.0 3400.0 -1500.0 1600.0 2200.0 2400.0 3100.0 3400.0 -1400.0 1600.0 2200.0 2400.0 3100.0 3400.0 -1100.0 1700.0 2300.0 2400.0 3200.0 3300.0 -1100.0 1900.0 2300.0 2500.0 3100.0 3200.0 -1500.0 1700.0 2300.0 2600.0 3100.0 3400.0 -1500.0 1700.0 2300.0 2500.0 3000.0 3400.0 -1500.0 1900.0 2200.0 2600.0 2800.0 3000.0 -1500.0 1800.0 2200.0 2500.0 2900.0 3000.0 -1500.0 1700.0 2200.0 2500.0 3100.0 3400.0 -1300.0 1800.0 2100.0 2300.0 3300.0 3400.0 -1100.0 1600.0 2200.0 2500.0 3000.0 3300.0 -1400.0 1600.0 2100.0 2500.0 2900.0 3200.0 -1500.0 1800.0 2400.0 2600.0 3300.0 3400.0 -1500.0 1900.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2000.0 2100.0 2600.0 3000.0 3200.0 -1500.0 1700.0 2100.0 2600.0 3100.0 3300.0 -1500.0 1600.0 1800.0 2200.0 3200.0 3300.0 -1600.0 1800.0 1900.0 2300.0 3300.0 3400.0 -1500.0 1800.0 2100.0 2200.0 3200.0 3400.0 -1500.0 2000.0 2200.0 2600.0 3200.0 3300.0 -1300.0 1700.0 2100.0 2300.0 3100.0 3300.0 -1400.0 1500.0 2100.0 2300.0 3000.0 3300.0 -1500.0 1600.0 2100.0 2300.0 3000.0 3300.0 -1500.0 1600.0 2200.0 2300.0 3000.0 3300.0 -1400.0 1900.0 2100.0 2200.0 3000.0 3100.0 -1400.0 1800.0 2100.0 2400.0 3100.0 3200.0 -1500.0 1700.0 2300.0 2600.0 3100.0 3300.0 -1600.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2300.0 3200.0 3400.0 -1500.0 1900.0 2200.0 2400.0 2600.0 3300.0 -1500.0 1900.0 2300.0 2400.0 2800.0 3300.0 -1400.0 1600.0 2400.0 2600.0 3100.0 3300.0 -1400.0 1600.0 2400.0 2500.0 3100.0 3300.0 -1500.0 1600.0 2400.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2100.0 2300.0 2800.0 3300.0 -1800.0 2100.0 2600.0 3000.0 3400.0 3500.0 -2100.0 2500.0 2900.0 3100.0 3400.0 3500.0 -1700.0 2100.0 2600.0 2700.0 3100.0 3200.0 -1600.0 1900.0 2300.0 2400.0 3200.0 3400.0 -1500.0 1800.0 2400.0 2500.0 3100.0 3400.0 -1600.0 2300.0 2700.0 3000.0 3300.0 3400.0 -1400.0 1600.0 1700.0 2100.0 3100.0 3200.0 -1400.0 1600.0 1700.0 2000.0 3100.0 3200.0 -1600.0 1700.0 1900.0 2200.0 3100.0 3300.0 -1800.0 1900.0 2500.0 2600.0 3000.0 3300.0 -1800.0 2100.0 2600.0 2900.0 3400.0 3500.0 -1800.0 2000.0 2300.0 2900.0 3200.0 3300.0 -1700.0 1800.0 2300.0 2400.0 2900.0 3100.0 -1100.0 1600.0 2500.0 2700.0 3100.0 3400.0 -1200.0 1700.0 2600.0 2700.0 3200.0 3300.0 -1400.0 2000.0 2600.0 2900.0 3300.0 3400.0 -1800.0 2200.0 2700.0 3000.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2600.0 3100.0 3300.0 -1300.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1800.0 2100.0 2800.0 2900.0 3300.0 3400.0 -1700.0 1800.0 2000.0 2400.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2500.0 3100.0 3300.0 -1800.0 2100.0 2300.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2600.0 2700.0 3000.0 3200.0 -1800.0 2000.0 2600.0 2700.0 3000.0 3200.0 -1900.0 2000.0 2500.0 2700.0 3000.0 3200.0 -2000.0 2100.0 2500.0 2600.0 2900.0 3200.0 -1800.0 1900.0 2500.0 2700.0 2900.0 3300.0 -1700.0 1800.0 2500.0 2700.0 3000.0 3300.0 -1800.0 2200.0 2700.0 2800.0 3200.0 3300.0 -1400.0 1600.0 2400.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2300.0 2700.0 2900.0 3100.0 -1400.0 1600.0 2400.0 2700.0 2900.0 3200.0 -1700.0 2300.0 2700.0 3000.0 3300.0 3400.0 -1400.0 1700.0 2400.0 2700.0 3100.0 3300.0 -1400.0 1700.0 2400.0 2700.0 3000.0 3300.0 -1400.0 1700.0 1800.0 2500.0 3000.0 3100.0 -1300.0 1700.0 1900.0 2300.0 3000.0 3100.0 -1400.0 1800.0 1900.0 2400.0 3000.0 3100.0 -1900.0 2100.0 2500.0 2700.0 3100.0 3200.0 -1200.0 1700.0 2200.0 2300.0 2900.0 3100.0 -1300.0 1700.0 2200.0 2400.0 2800.0 3100.0 -1400.0 1700.0 2200.0 2300.0 2800.0 3100.0 -1500.0 1700.0 2200.0 2300.0 2900.0 3200.0 -1500.0 1700.0 2100.0 2300.0 2900.0 3200.0 -1500.0 1700.0 2000.0 2200.0 2900.0 3100.0 -1500.0 1700.0 1900.0 2200.0 3000.0 3200.0 -1500.0 1700.0 1900.0 2300.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2300.0 3100.0 3200.0 -1600.0 1800.0 2300.0 2600.0 3000.0 3100.0 -2000.0 2500.0 2700.0 2900.0 3200.0 3300.0 -2300.0 2500.0 2800.0 3100.0 3200.0 3300.0 -2300.0 2500.0 2600.0 2900.0 3200.0 3300.0 -1500.0 1700.0 2000.0 2400.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2200.0 3100.0 3300.0 -1600.0 1700.0 1800.0 2100.0 3200.0 3300.0 -1300.0 1600.0 2300.0 2500.0 3000.0 3100.0 -1200.0 1800.0 2300.0 2500.0 3000.0 3200.0 -1400.0 1800.0 2300.0 2400.0 2800.0 3200.0 -1400.0 1700.0 2300.0 2400.0 2900.0 3300.0 -1500.0 2000.0 2500.0 2600.0 2800.0 3100.0 -1800.0 2000.0 2200.0 2600.0 3000.0 3200.0 -1400.0 1700.0 1900.0 2100.0 3000.0 3100.0 -1300.0 1600.0 2300.0 2400.0 2900.0 3100.0 -1400.0 1700.0 2300.0 2500.0 3000.0 3200.0 -1500.0 1700.0 2300.0 2600.0 3100.0 3200.0 -1500.0 1800.0 2400.0 2600.0 3100.0 3200.0 -1600.0 1800.0 2000.0 2600.0 2900.0 3100.0 -1500.0 1700.0 1900.0 2600.0 2900.0 3100.0 -1400.0 1600.0 1700.0 2200.0 3100.0 3200.0 -1300.0 1500.0 1700.0 2100.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2700.0 3100.0 3300.0 -1400.0 1700.0 1900.0 2200.0 3000.0 3100.0 -1400.0 1800.0 2000.0 2200.0 3000.0 3100.0 -2100.0 2300.0 2500.0 2700.0 3100.0 3200.0 -1500.0 1900.0 2300.0 2500.0 3000.0 3100.0 -1500.0 1900.0 2200.0 2500.0 2900.0 3100.0 -1500.0 1800.0 2100.0 2500.0 2900.0 3100.0 -1500.0 1700.0 2300.0 2600.0 2800.0 3200.0 -1500.0 1700.0 2300.0 2500.0 3000.0 3100.0 -1400.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1200.0 1500.0 2600.0 2700.0 2900.0 3000.0 -1300.0 1600.0 2500.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2500.0 2600.0 3000.0 3200.0 -1400.0 1700.0 2500.0 2600.0 3000.0 3200.0 -1500.0 1800.0 2500.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2400.0 2600.0 2900.0 3200.0 -1400.0 1600.0 2400.0 2700.0 3000.0 3300.0 -1400.0 1500.0 2200.0 2600.0 2900.0 3200.0 -1300.0 1700.0 2400.0 2600.0 3000.0 3300.0 -1800.0 2000.0 2500.0 2600.0 3100.0 3400.0 -1100.0 1800.0 2500.0 2600.0 3100.0 3200.0 -1100.0 1800.0 2400.0 2500.0 3100.0 3300.0 -1100.0 1800.0 2400.0 2600.0 3100.0 3300.0 -1000.0 1800.0 2500.0 2700.0 3200.0 3300.0 -1100.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2500.0 2900.0 3300.0 -1700.0 1900.0 2300.0 2500.0 3000.0 3300.0 -1300.0 1700.0 2100.0 2300.0 3000.0 3200.0 -1300.0 1600.0 2000.0 2200.0 3000.0 3100.0 -1300.0 1600.0 1900.0 2100.0 3000.0 3100.0 -1500.0 1700.0 2400.0 2600.0 2900.0 3100.0 -1500.0 1900.0 2600.0 2700.0 3100.0 3200.0 -2100.0 2400.0 2900.0 3100.0 3300.0 3400.0 -2000.0 2500.0 2900.0 3100.0 3400.0 3500.0 -2000.0 2500.0 2700.0 3000.0 3300.0 3400.0 -1600.0 1900.0 2600.0 2700.0 3100.0 3300.0 -1600.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1100.0 1500.0 1600.0 2200.0 2900.0 3000.0 -1200.0 1500.0 1600.0 2100.0 3000.0 3100.0 -2300.0 2500.0 2900.0 3100.0 3400.0 3500.0 -1500.0 1900.0 2300.0 2400.0 2900.0 3200.0 -1500.0 2000.0 2500.0 2600.0 3100.0 3300.0 -1500.0 1900.0 2400.0 2800.0 3200.0 3300.0 -1100.0 1800.0 2200.0 2500.0 3100.0 3200.0 -1200.0 1800.0 2200.0 2400.0 3200.0 3300.0 -1300.0 1700.0 2400.0 2500.0 3100.0 3200.0 -1600.0 2100.0 2300.0 2600.0 3100.0 3200.0 -1300.0 1800.0 2100.0 2300.0 3200.0 3300.0 -1200.0 1800.0 2100.0 2300.0 3100.0 3200.0 -2100.0 2200.0 2700.0 2800.0 3300.0 3400.0 -2000.0 2300.0 2600.0 2900.0 3200.0 3400.0 -2100.0 2400.0 2700.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2600.0 2700.0 3100.0 3300.0 -2100.0 2400.0 2600.0 3000.0 3300.0 3400.0 -1400.0 1800.0 2300.0 2400.0 3000.0 3200.0 -1500.0 1700.0 1900.0 2400.0 2900.0 3000.0 -1500.0 1600.0 1800.0 2300.0 3100.0 3200.0 -1500.0 1700.0 1800.0 2300.0 3100.0 3200.0 -2100.0 2500.0 2700.0 3000.0 3400.0 3500.0 -2000.0 2400.0 2700.0 2900.0 3400.0 3500.0 -1400.0 1800.0 1900.0 2600.0 3100.0 3200.0 -1400.0 1800.0 2100.0 2300.0 3200.0 3300.0 -1600.0 1800.0 2300.0 2500.0 3000.0 3100.0 -1400.0 2000.0 2400.0 2700.0 3100.0 3200.0 -1400.0 1900.0 2300.0 2600.0 3100.0 3200.0 -1700.0 1800.0 2500.0 2800.0 3100.0 3300.0 -1400.0 1800.0 2400.0 2500.0 2900.0 3300.0 -1400.0 2000.0 2400.0 2500.0 3100.0 3300.0 -1300.0 1600.0 2400.0 2600.0 3200.0 3300.0 -1900.0 2400.0 2900.0 3100.0 3400.0 3500.0 -2000.0 2400.0 2900.0 3100.0 3400.0 3500.0 -900.0 1800.0 2500.0 2600.0 3200.0 3300.0 -900.0 1800.0 2600.0 2700.0 3200.0 3300.0 -1000.0 1700.0 2800.0 2900.0 3200.0 3300.0 -1500.0 1600.0 2200.0 2600.0 2900.0 3200.0 -1600.0 1800.0 2100.0 2500.0 2800.0 3000.0 -1800.0 1900.0 2400.0 2600.0 2900.0 3100.0 -1900.0 2100.0 2600.0 2900.0 3100.0 3300.0 -1800.0 1900.0 2600.0 2800.0 3000.0 3200.0 -1900.0 2100.0 2500.0 2900.0 3200.0 3400.0 -1300.0 1500.0 2400.0 2700.0 2900.0 3100.0 -1300.0 1600.0 2500.0 2600.0 2900.0 3100.0 -1400.0 1600.0 2400.0 2600.0 2900.0 3100.0 -1600.0 1700.0 2500.0 2800.0 2900.0 3200.0 -1700.0 2000.0 2600.0 3000.0 3300.0 3400.0 -1900.0 2200.0 2700.0 2800.0 3200.0 3400.0 -2000.0 2100.0 2700.0 2800.0 3100.0 3300.0 -2000.0 2100.0 2600.0 2800.0 3100.0 3200.0 -1700.0 2000.0 2500.0 2600.0 3100.0 3300.0 -1900.0 2100.0 2300.0 2500.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2500.0 3200.0 3400.0 -1300.0 1800.0 2300.0 2400.0 3200.0 3400.0 -1300.0 1900.0 2300.0 2500.0 3200.0 3300.0 -2000.0 2300.0 2600.0 2700.0 3000.0 3300.0 -1800.0 2000.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1800.0 2500.0 2700.0 3100.0 3300.0 -1200.0 1500.0 2500.0 2900.0 3100.0 3200.0 -1400.0 1600.0 2500.0 2700.0 2900.0 3100.0 -2100.0 2400.0 2700.0 2800.0 3100.0 3300.0 -1600.0 2100.0 2400.0 2800.0 3100.0 3300.0 -1400.0 1600.0 2100.0 2600.0 3100.0 3200.0 -1300.0 1500.0 2300.0 2600.0 3100.0 3300.0 -2000.0 2200.0 2700.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2700.0 2800.0 3300.0 3400.0 -1800.0 2400.0 2700.0 3000.0 3400.0 3500.0 -1900.0 2400.0 2800.0 3000.0 3400.0 3500.0 -2000.0 2100.0 2600.0 2800.0 3000.0 3300.0 -2100.0 2200.0 2700.0 2800.0 3000.0 3300.0 -1500.0 2000.0 2400.0 2600.0 3100.0 3300.0 -1300.0 2000.0 2200.0 2500.0 3000.0 3100.0 -1800.0 2100.0 2300.0 2500.0 3100.0 3300.0 -1500.0 1800.0 2500.0 2800.0 3200.0 3300.0 -1500.0 1700.0 2100.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2600.0 3200.0 3400.0 -1400.0 1700.0 2300.0 2400.0 3200.0 3400.0 -1100.0 1800.0 2300.0 2400.0 3300.0 3400.0 -1000.0 1900.0 2400.0 2500.0 3100.0 3400.0 -1600.0 1800.0 2200.0 2300.0 3100.0 3300.0 -1500.0 1600.0 2300.0 2400.0 3100.0 3300.0 -1500.0 1600.0 2200.0 2300.0 3200.0 3400.0 -1400.0 1800.0 2300.0 2700.0 3000.0 3300.0 -1400.0 1800.0 2100.0 2300.0 2800.0 3200.0 -1400.0 1800.0 2100.0 2500.0 2900.0 3200.0 -1200.0 1600.0 1700.0 2100.0 3000.0 3100.0 -1200.0 1600.0 1900.0 2400.0 3000.0 3200.0 -1100.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1100.0 2000.0 2400.0 2700.0 3100.0 3200.0 -1200.0 1400.0 2400.0 2600.0 2900.0 3200.0 -1300.0 1400.0 2300.0 2400.0 2800.0 3300.0 -1300.0 1500.0 2300.0 2400.0 2900.0 3200.0 -1300.0 1600.0 2400.0 2500.0 2800.0 3200.0 -1300.0 1600.0 2300.0 2500.0 2900.0 3200.0 -1300.0 1500.0 1600.0 2100.0 2800.0 2900.0 -1500.0 1800.0 2500.0 2700.0 3200.0 3400.0 -1400.0 1700.0 2300.0 2500.0 2900.0 3100.0 -1300.0 1700.0 2400.0 2500.0 3000.0 3200.0 -1200.0 1600.0 2500.0 2600.0 3100.0 3400.0 -1100.0 1700.0 2500.0 2600.0 3100.0 3400.0 -1400.0 1800.0 2200.0 2300.0 2600.0 3000.0 -1300.0 1800.0 2200.0 2300.0 2500.0 3000.0 -1400.0 1800.0 2300.0 2700.0 3000.0 3200.0 -1300.0 1500.0 2300.0 2400.0 2900.0 3100.0 -1300.0 1600.0 2400.0 2500.0 3000.0 3200.0 -1200.0 1600.0 2400.0 2600.0 3100.0 3300.0 -1200.0 1500.0 2600.0 2700.0 3100.0 3300.0 -1200.0 1500.0 2500.0 2700.0 2900.0 3200.0 -1400.0 1600.0 2300.0 2500.0 3100.0 3300.0 -1400.0 1600.0 2000.0 2200.0 2900.0 3000.0 -1300.0 1500.0 1800.0 1900.0 2800.0 2900.0 -1200.0 1600.0 1700.0 2200.0 2900.0 3000.0 -1300.0 1700.0 1800.0 2100.0 2900.0 3000.0 -1500.0 1700.0 2100.0 2400.0 2600.0 3100.0 -1500.0 2000.0 2500.0 2600.0 3000.0 3200.0 -1700.0 2000.0 2200.0 2600.0 2900.0 3200.0 -1700.0 2200.0 2600.0 2700.0 3100.0 3300.0 -1600.0 1700.0 2400.0 2500.0 3000.0 3400.0 -1900.0 2000.0 2100.0 2300.0 3300.0 3400.0 -1700.0 1900.0 2400.0 2500.0 3100.0 3300.0 -1500.0 1800.0 2200.0 2300.0 3100.0 3400.0 -1900.0 2300.0 2500.0 3000.0 3300.0 3400.0 -1500.0 1700.0 2100.0 2300.0 3000.0 3300.0 -1700.0 1900.0 2200.0 2400.0 2700.0 3200.0 -1800.0 1900.0 2200.0 2300.0 2700.0 3100.0 -1700.0 1900.0 2100.0 2300.0 2700.0 3100.0 -1700.0 2000.0 2600.0 2800.0 3100.0 3300.0 -1200.0 1800.0 2200.0 2400.0 3000.0 3100.0 -1300.0 1900.0 2200.0 2500.0 3000.0 3100.0 -1500.0 1600.0 2300.0 2500.0 3000.0 3200.0 -1400.0 1500.0 2300.0 2500.0 3000.0 3200.0 -1300.0 1700.0 2100.0 2400.0 3100.0 3200.0 -1500.0 1600.0 2200.0 2500.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2300.0 3100.0 3400.0 -1400.0 1600.0 2100.0 2300.0 2900.0 3000.0 -1400.0 1600.0 2000.0 2200.0 2800.0 2900.0 -1400.0 1800.0 2200.0 2500.0 3100.0 3300.0 -1400.0 1800.0 2100.0 2400.0 3100.0 3300.0 -1400.0 1700.0 2000.0 2400.0 3000.0 3200.0 -1900.0 2100.0 2300.0 2500.0 2800.0 3100.0 -1900.0 2100.0 2300.0 2500.0 2900.0 3100.0 -1400.0 1600.0 2100.0 2400.0 3000.0 3200.0 -1400.0 1600.0 2000.0 2300.0 3000.0 3200.0 -1600.0 2000.0 2200.0 2600.0 2900.0 3200.0 -1600.0 2000.0 2200.0 2600.0 3000.0 3300.0 -1300.0 1900.0 2200.0 2400.0 3000.0 3200.0 -1700.0 2000.0 2300.0 2700.0 3000.0 3300.0 -1000.0 1600.0 2600.0 2700.0 3200.0 3300.0 -1100.0 1700.0 2600.0 2700.0 3200.0 3300.0 -1500.0 1800.0 2300.0 2400.0 3300.0 3400.0 -1900.0 2100.0 2300.0 2500.0 3100.0 3200.0 -1400.0 1700.0 2200.0 2500.0 3300.0 3400.0 -1400.0 1900.0 2200.0 2700.0 3200.0 3300.0 -1400.0 2000.0 2300.0 2700.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2700.0 3000.0 3200.0 -1600.0 1800.0 2100.0 2400.0 3000.0 3200.0 -1700.0 1800.0 2100.0 2400.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2500.0 2900.0 3300.0 -1800.0 1900.0 2200.0 2500.0 2900.0 3300.0 -1800.0 1900.0 2200.0 2500.0 2900.0 3200.0 -1700.0 1900.0 2200.0 2400.0 3000.0 3300.0 -1700.0 1900.0 2200.0 2400.0 2600.0 3000.0 -1500.0 1800.0 2500.0 2600.0 3200.0 3300.0 -1600.0 1700.0 2500.0 2600.0 3000.0 3200.0 -1600.0 1700.0 2400.0 2500.0 3100.0 3200.0 -1600.0 1700.0 2500.0 2600.0 3100.0 3200.0 -1600.0 1800.0 2500.0 2600.0 3100.0 3200.0 -1800.0 1900.0 2500.0 2600.0 3000.0 3200.0 -1900.0 2400.0 2700.0 3000.0 3300.0 3500.0 -1900.0 2400.0 2700.0 3100.0 3300.0 3400.0 -2000.0 2400.0 2600.0 3000.0 3300.0 3400.0 -1800.0 2500.0 2700.0 2900.0 3300.0 3400.0 -1800.0 2400.0 2700.0 2900.0 3400.0 3500.0 -1900.0 2400.0 2700.0 3000.0 3200.0 3300.0 -1600.0 1800.0 2400.0 2500.0 3000.0 3300.0 -1700.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1300.0 1800.0 2000.0 2500.0 3100.0 3200.0 -1500.0 1800.0 2300.0 2400.0 3000.0 3100.0 -2100.0 2500.0 2700.0 2900.0 3100.0 3300.0 -1800.0 2000.0 2200.0 2500.0 2800.0 3100.0 -1400.0 1700.0 1900.0 2300.0 2800.0 2900.0 -1800.0 2000.0 2300.0 2700.0 3000.0 3300.0 -1800.0 1900.0 2300.0 2700.0 3200.0 3300.0 -1700.0 1800.0 2400.0 2800.0 3100.0 3300.0 -1500.0 1700.0 2500.0 2600.0 2900.0 3300.0 -1400.0 1500.0 2300.0 2500.0 2900.0 3300.0 -1500.0 1700.0 2200.0 2500.0 2900.0 3200.0 -1700.0 1900.0 2100.0 2300.0 3100.0 3300.0 -1400.0 1800.0 2200.0 2400.0 2700.0 3100.0 -1300.0 1500.0 1700.0 1900.0 2800.0 3000.0 -1300.0 1500.0 1700.0 1900.0 2900.0 3000.0 -1100.0 1600.0 2300.0 2500.0 3100.0 3200.0 -1000.0 1600.0 2300.0 2500.0 3200.0 3300.0 -1000.0 1700.0 2300.0 2400.0 3200.0 3300.0 -900.0 1700.0 2300.0 2400.0 3200.0 3300.0 -900.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1100.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1200.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1200.0 1700.0 2200.0 2300.0 3100.0 3200.0 -1300.0 1700.0 2200.0 2300.0 3100.0 3200.0 -1400.0 1800.0 2200.0 2300.0 3100.0 3200.0 -1500.0 1700.0 2200.0 2300.0 3000.0 3200.0 -1500.0 1600.0 2200.0 2300.0 2900.0 3200.0 -1600.0 2000.0 2300.0 2400.0 3100.0 3300.0 -1600.0 2100.0 2300.0 2400.0 2700.0 3300.0 -1600.0 1800.0 2100.0 2300.0 2900.0 3000.0 -1400.0 1600.0 1700.0 2300.0 2900.0 3000.0 -1600.0 1800.0 2100.0 2300.0 3000.0 3100.0 -1600.0 1700.0 2000.0 2200.0 3000.0 3100.0 -1500.0 1600.0 2300.0 2400.0 2900.0 3100.0 -1500.0 1600.0 2400.0 2500.0 3000.0 3200.0 -1800.0 2100.0 2600.0 2700.0 3100.0 3200.0 -1500.0 1600.0 1900.0 2300.0 2900.0 3100.0 -1500.0 1700.0 2300.0 2700.0 3100.0 3200.0 -1500.0 2100.0 2500.0 2700.0 3100.0 3300.0 -1000.0 1500.0 2400.0 2500.0 3100.0 3300.0 -1200.0 1400.0 2400.0 2500.0 2900.0 3300.0 -1300.0 1700.0 2200.0 2400.0 2900.0 3000.0 -1200.0 2000.0 2400.0 2500.0 3000.0 3200.0 -1200.0 1900.0 2400.0 2500.0 3100.0 3300.0 -1300.0 1800.0 2400.0 2500.0 3100.0 3400.0 -1500.0 1800.0 2300.0 2400.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2400.0 3000.0 3200.0 -1600.0 1900.0 2100.0 2400.0 2900.0 3200.0 -1400.0 1600.0 2200.0 2400.0 2900.0 3100.0 -1500.0 1700.0 2200.0 2400.0 3000.0 3100.0 -1400.0 1600.0 2300.0 2400.0 3000.0 3200.0 -1400.0 1600.0 2200.0 2300.0 2900.0 3200.0 -1600.0 1700.0 2000.0 2200.0 3000.0 3200.0 -1600.0 1800.0 2100.0 2400.0 2900.0 3200.0 -1600.0 1700.0 2100.0 2300.0 2900.0 3200.0 -1400.0 1600.0 2100.0 2400.0 3200.0 3300.0 -1200.0 1600.0 2100.0 2300.0 3100.0 3200.0 -1600.0 2100.0 2300.0 2500.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2600.0 3100.0 3300.0 -1400.0 1600.0 2300.0 2400.0 2900.0 3200.0 -1400.0 1500.0 2100.0 2400.0 2700.0 3100.0 -1200.0 1400.0 2100.0 2200.0 3000.0 3300.0 -1300.0 1800.0 2200.0 2300.0 2800.0 3200.0 -1300.0 1700.0 2200.0 2300.0 2800.0 3300.0 -1400.0 1800.0 2200.0 2300.0 2800.0 3200.0 -1800.0 2100.0 2500.0 3000.0 3200.0 3400.0 -1700.0 1900.0 2200.0 2500.0 3100.0 3300.0 -1800.0 1900.0 2100.0 2400.0 3200.0 3300.0 -1500.0 1600.0 2200.0 2300.0 3200.0 3300.0 -1400.0 1700.0 2200.0 2300.0 3100.0 3300.0 -1400.0 1900.0 2200.0 2600.0 3100.0 3300.0 -1600.0 1900.0 2500.0 2900.0 3200.0 3300.0 -1400.0 1900.0 2400.0 2700.0 3100.0 3200.0 -1400.0 1600.0 2200.0 2300.0 2900.0 3100.0 -1600.0 1800.0 2200.0 2400.0 3000.0 3100.0 -1800.0 2000.0 2400.0 2900.0 3100.0 3200.0 -1900.0 2000.0 2500.0 2900.0 3100.0 3300.0 -1500.0 1600.0 2100.0 2200.0 3000.0 3300.0 -1500.0 1600.0 2100.0 2300.0 2900.0 3200.0 -1300.0 1500.0 2200.0 2300.0 2800.0 3100.0 -1100.0 1900.0 2500.0 2700.0 3100.0 3200.0 -1300.0 1800.0 2300.0 2700.0 3100.0 3200.0 -1100.0 1700.0 2200.0 2600.0 3000.0 3200.0 -1300.0 1600.0 1900.0 2100.0 3000.0 3200.0 -1300.0 1500.0 1800.0 1900.0 3000.0 3100.0 -1100.0 1400.0 2500.0 2600.0 3000.0 3300.0 -1300.0 1500.0 2400.0 2600.0 2900.0 3300.0 -1700.0 1900.0 2300.0 2400.0 3000.0 3300.0 -1600.0 1800.0 2100.0 2400.0 2800.0 3100.0 -1500.0 1700.0 2000.0 2500.0 2800.0 3000.0 -1400.0 1700.0 2200.0 2500.0 2900.0 3100.0 -1300.0 1500.0 2300.0 2600.0 3000.0 3300.0 -1000.0 1600.0 2200.0 2500.0 3000.0 3100.0 -1000.0 1500.0 2500.0 2600.0 3100.0 3300.0 -1000.0 1600.0 2500.0 2600.0 3200.0 3300.0 -1000.0 1700.0 2600.0 2700.0 3200.0 3300.0 -2000.0 2400.0 2800.0 3000.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2700.0 3100.0 3200.0 -1800.0 1900.0 2400.0 2700.0 3000.0 3300.0 -1700.0 2100.0 2300.0 2500.0 3000.0 3200.0 -1200.0 1400.0 1500.0 2100.0 3100.0 3200.0 -1400.0 1600.0 1700.0 2200.0 3000.0 3200.0 -1600.0 1800.0 1900.0 2200.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2300.0 3000.0 3200.0 -1900.0 2000.0 2400.0 2500.0 3000.0 3300.0 -1800.0 1900.0 2400.0 2500.0 2900.0 3300.0 -1800.0 1900.0 2300.0 2500.0 3100.0 3400.0 -1800.0 2000.0 2400.0 2600.0 3200.0 3400.0 -1400.0 1600.0 2100.0 2200.0 3100.0 3400.0 -1500.0 1700.0 1900.0 2500.0 3000.0 3200.0 -1300.0 1400.0 2200.0 2500.0 2900.0 3200.0 -1300.0 1700.0 2100.0 2600.0 3100.0 3300.0 -1900.0 2100.0 2400.0 2700.0 3200.0 3400.0 -1700.0 2000.0 2300.0 2500.0 3000.0 3300.0 -1600.0 1700.0 2100.0 2600.0 3000.0 3200.0 -1400.0 1600.0 1700.0 2000.0 3000.0 3100.0 -1300.0 1500.0 1600.0 2000.0 3000.0 3100.0 -1400.0 1600.0 2100.0 2200.0 2700.0 3200.0 -1300.0 1600.0 1700.0 2300.0 3100.0 3300.0 -1500.0 1700.0 2200.0 2500.0 3100.0 3200.0 -2100.0 2200.0 2600.0 2900.0 3200.0 3400.0 -2100.0 2300.0 2700.0 3000.0 3300.0 3400.0 -1900.0 2300.0 2800.0 3100.0 3300.0 3500.0 -1900.0 2300.0 2700.0 3100.0 3400.0 3500.0 -1900.0 2300.0 2700.0 3100.0 3300.0 3400.0 -1400.0 1800.0 2200.0 2300.0 2900.0 3200.0 -1400.0 1600.0 2100.0 2300.0 2800.0 3300.0 -1300.0 1700.0 2200.0 2300.0 2800.0 3200.0 -1300.0 1600.0 2200.0 2300.0 2900.0 3300.0 -1400.0 1800.0 2200.0 2600.0 3100.0 3300.0 -1700.0 2100.0 2400.0 2700.0 3000.0 3200.0 -1300.0 1800.0 2200.0 2500.0 3000.0 3300.0 -1900.0 2000.0 2500.0 2600.0 2900.0 3300.0 -2100.0 2200.0 2400.0 2600.0 2900.0 3200.0 -2100.0 2200.0 2400.0 2600.0 3000.0 3200.0 -2000.0 2100.0 2400.0 2500.0 3000.0 3200.0 -1800.0 2000.0 2200.0 2400.0 3100.0 3200.0 -1400.0 2000.0 2300.0 2400.0 3000.0 3100.0 -1300.0 1600.0 2100.0 2300.0 2700.0 3200.0 -1200.0 1800.0 2200.0 2400.0 3200.0 3400.0 -1200.0 1800.0 2300.0 2400.0 3200.0 3400.0 -1200.0 1900.0 2300.0 2400.0 3100.0 3400.0 -1700.0 1800.0 2100.0 2300.0 2800.0 3200.0 -1500.0 1600.0 2200.0 2300.0 2900.0 3300.0 -1500.0 1600.0 2100.0 2300.0 2800.0 3200.0 -1500.0 1600.0 2000.0 2200.0 2700.0 3200.0 -1400.0 1900.0 2200.0 2600.0 3200.0 3300.0 -1400.0 1600.0 2100.0 2200.0 2800.0 3200.0 -1900.0 2100.0 2300.0 2600.0 3100.0 3300.0 -2000.0 2300.0 2600.0 2800.0 3200.0 3400.0 -1700.0 1800.0 2300.0 2500.0 2700.0 3200.0 -1700.0 1800.0 2300.0 2500.0 2700.0 3100.0 -1800.0 1900.0 2400.0 2500.0 2700.0 3100.0 -1700.0 1800.0 2400.0 2500.0 2800.0 3200.0 -1600.0 1800.0 2500.0 2600.0 2900.0 3100.0 -1500.0 1800.0 2500.0 2600.0 3200.0 3400.0 -1400.0 1500.0 2100.0 2300.0 2900.0 3300.0 -1400.0 1600.0 2100.0 2300.0 3000.0 3300.0 -1600.0 1700.0 2200.0 2500.0 3100.0 3400.0 -1600.0 2000.0 2200.0 2400.0 2900.0 3100.0 -2000.0 2200.0 2600.0 2900.0 3200.0 3400.0 -1200.0 1400.0 2200.0 2300.0 3100.0 3300.0 -1300.0 1500.0 2200.0 2300.0 3100.0 3300.0 -1700.0 1800.0 2200.0 2300.0 3100.0 3400.0 -1800.0 1900.0 2200.0 2300.0 2900.0 3300.0 -1800.0 2000.0 2400.0 2700.0 3100.0 3400.0 -1600.0 1700.0 2000.0 2100.0 2700.0 3100.0 -1700.0 1900.0 2200.0 2300.0 2900.0 3200.0 -2200.0 2500.0 2700.0 2800.0 3100.0 3300.0 -1600.0 1700.0 2200.0 2300.0 2900.0 3100.0 -1400.0 1500.0 1600.0 2000.0 3000.0 3200.0 -1500.0 1700.0 1900.0 2400.0 3000.0 3200.0 -1900.0 2200.0 2500.0 2900.0 3200.0 3300.0 -1900.0 2400.0 2600.0 2900.0 3300.0 3400.0 -1800.0 2100.0 2200.0 2400.0 3000.0 3300.0 -1400.0 1600.0 1700.0 2300.0 3200.0 3300.0 -1400.0 1600.0 1900.0 2500.0 3200.0 3300.0 -1700.0 2100.0 2700.0 3000.0 3300.0 3400.0 -1400.0 1800.0 2300.0 2700.0 3100.0 3200.0 -1400.0 1600.0 2300.0 2700.0 3000.0 3200.0 -1400.0 2000.0 2200.0 2500.0 3100.0 3300.0 -1600.0 2100.0 2400.0 2900.0 3200.0 3400.0 -1400.0 1600.0 1800.0 2600.0 3300.0 3400.0 -1400.0 1500.0 1700.0 2200.0 3200.0 3300.0 -1400.0 1500.0 1700.0 2100.0 3100.0 3200.0 -1300.0 1500.0 2200.0 2400.0 2800.0 3100.0 -1300.0 1600.0 1800.0 2400.0 3000.0 3100.0 -1400.0 1600.0 2000.0 2200.0 3000.0 3300.0 -1500.0 1600.0 2100.0 2400.0 3100.0 3300.0 -1500.0 1700.0 2100.0 2300.0 2700.0 3100.0 -1500.0 1600.0 2000.0 2200.0 2600.0 3100.0 -1400.0 1500.0 2000.0 2300.0 3100.0 3300.0 -1400.0 1500.0 2000.0 2200.0 3100.0 3300.0 -1600.0 1800.0 2200.0 2300.0 3000.0 3200.0 -1400.0 1700.0 2100.0 2500.0 2900.0 3100.0 -1400.0 1800.0 2200.0 2400.0 2900.0 3000.0 -1500.0 1800.0 2300.0 2500.0 3000.0 3200.0 -2000.0 2300.0 2800.0 3100.0 3400.0 3500.0 -2000.0 2500.0 2800.0 2900.0 3200.0 3300.0 -1400.0 2000.0 2300.0 2600.0 3000.0 3300.0 -1600.0 1900.0 2300.0 2700.0 3200.0 3400.0 -2000.0 2400.0 2800.0 2900.0 3300.0 3400.0 -1200.0 1400.0 2000.0 2200.0 3200.0 3400.0 -1200.0 1600.0 2400.0 2500.0 2900.0 3200.0 -1500.0 1600.0 2300.0 2400.0 2800.0 3200.0 -1100.0 1600.0 2200.0 2300.0 3300.0 3400.0 -1300.0 1600.0 2200.0 2400.0 3000.0 3300.0 -1300.0 1600.0 2200.0 2400.0 2700.0 3200.0 -1400.0 1700.0 2300.0 2500.0 2700.0 3100.0 -1500.0 1700.0 2400.0 2500.0 2800.0 3100.0 -1800.0 2000.0 2200.0 2300.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2400.0 2900.0 3200.0 -1700.0 1900.0 2200.0 2400.0 2900.0 3300.0 -1300.0 1700.0 2200.0 2300.0 3200.0 3400.0 -1500.0 1600.0 2300.0 2400.0 3000.0 3400.0 -1600.0 1900.0 2400.0 2800.0 3200.0 3400.0 -1500.0 1600.0 2300.0 2400.0 2900.0 3300.0 -1600.0 1700.0 2300.0 2400.0 2800.0 3300.0 -1800.0 2000.0 2200.0 2500.0 3000.0 3300.0 -1900.0 2000.0 2300.0 2500.0 2800.0 3100.0 -1600.0 1700.0 2400.0 2600.0 3100.0 3400.0 -1600.0 1800.0 2400.0 2700.0 3200.0 3300.0 -1600.0 1900.0 2400.0 2700.0 3200.0 3400.0 -1500.0 1800.0 2200.0 2500.0 3200.0 3400.0 -1200.0 1800.0 2300.0 2600.0 3100.0 3300.0 -1900.0 2000.0 2400.0 2600.0 3100.0 3400.0 -1700.0 1800.0 2400.0 2500.0 3000.0 3400.0 -1400.0 2000.0 2300.0 2400.0 2600.0 3100.0 -1800.0 1900.0 2100.0 2200.0 3300.0 3400.0 -1400.0 1600.0 1700.0 2300.0 3300.0 3400.0 -1400.0 1600.0 1700.0 2200.0 3300.0 3400.0 -1400.0 1600.0 1700.0 2300.0 3200.0 3400.0 -1600.0 1800.0 2000.0 2300.0 2900.0 3100.0 -1700.0 1800.0 2000.0 2300.0 2900.0 3100.0 -1600.0 1800.0 2100.0 2300.0 2800.0 3100.0 -1500.0 1700.0 2100.0 2300.0 2800.0 3100.0 -1500.0 1600.0 2100.0 2300.0 2700.0 3100.0 -1500.0 1600.0 2100.0 2200.0 2700.0 3100.0 -1400.0 1800.0 2300.0 2400.0 2800.0 3100.0 -1400.0 1600.0 2300.0 2400.0 2900.0 3300.0 -1200.0 1700.0 2200.0 2300.0 2900.0 3200.0 -1400.0 1500.0 2100.0 2400.0 3200.0 3400.0 -1700.0 2100.0 2400.0 2500.0 2900.0 3100.0 -1500.0 1700.0 2000.0 2400.0 3000.0 3200.0 -1400.0 1900.0 2200.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2700.0 3000.0 3100.0 -1600.0 1800.0 2100.0 2500.0 2800.0 3100.0 -2000.0 2300.0 2500.0 2800.0 3000.0 3100.0 -1900.0 2400.0 2700.0 2800.0 3100.0 3200.0 -1800.0 2300.0 2700.0 2800.0 3100.0 3200.0 -1700.0 2400.0 2700.0 2800.0 3200.0 3300.0 -1700.0 2400.0 2700.0 2800.0 3100.0 3200.0 -1600.0 2400.0 2700.0 2800.0 3100.0 3200.0 -1600.0 2000.0 2200.0 2700.0 3100.0 3200.0 -1800.0 2200.0 2600.0 2800.0 3100.0 3400.0 -1800.0 2200.0 2600.0 3000.0 3200.0 3400.0 -1800.0 2200.0 2300.0 2700.0 3200.0 3300.0 -1600.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2600.0 3000.0 3100.0 -1600.0 1800.0 2200.0 2500.0 2800.0 3000.0 -2000.0 2400.0 2800.0 3100.0 3200.0 3300.0 -1500.0 1700.0 1900.0 2000.0 2600.0 3100.0 -1400.0 1600.0 1900.0 2000.0 2500.0 3100.0 -1400.0 1600.0 1800.0 2000.0 2500.0 3100.0 -1400.0 1500.0 1800.0 1900.0 2500.0 3100.0 -1400.0 1500.0 1800.0 1900.0 2600.0 3200.0 -1400.0 1500.0 1700.0 2000.0 2900.0 3200.0 -1300.0 1700.0 2100.0 2600.0 3100.0 3200.0 -1200.0 1700.0 2200.0 2500.0 3100.0 3200.0 -1800.0 2000.0 2500.0 2600.0 3000.0 3200.0 -1700.0 1900.0 2200.0 2700.0 2900.0 3200.0 -1500.0 1700.0 2100.0 2600.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2400.0 2700.0 3100.0 -1600.0 1900.0 2200.0 2600.0 2800.0 3100.0 -1600.0 1800.0 2100.0 2500.0 3000.0 3100.0 -1600.0 1800.0 2000.0 2200.0 2600.0 3100.0 -1200.0 1400.0 2300.0 2700.0 2800.0 3100.0 -1300.0 1600.0 2100.0 2600.0 3100.0 3300.0 -1400.0 1600.0 2100.0 2500.0 2700.0 3000.0 -1300.0 1600.0 2300.0 2600.0 3000.0 3300.0 -1300.0 1700.0 2300.0 2700.0 3000.0 3300.0 -1400.0 1600.0 2000.0 2500.0 2800.0 3000.0 -1800.0 2000.0 2200.0 2600.0 2800.0 3100.0 -1800.0 1900.0 2400.0 2600.0 2800.0 3100.0 -1500.0 1700.0 2200.0 2700.0 2900.0 3100.0 -1400.0 1700.0 2300.0 2700.0 3000.0 3100.0 -1700.0 2200.0 2500.0 2900.0 3200.0 3300.0 -1500.0 1700.0 2100.0 2700.0 3000.0 3200.0 -1700.0 2000.0 2600.0 2700.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2500.0 3100.0 3200.0 -1500.0 2000.0 2200.0 2600.0 3000.0 3100.0 -1500.0 1800.0 2000.0 2800.0 3200.0 3300.0 -1700.0 1900.0 2500.0 2600.0 2900.0 3200.0 -1800.0 2000.0 2400.0 2600.0 3000.0 3100.0 -1400.0 1700.0 2100.0 2500.0 2700.0 3000.0 -1500.0 1900.0 2200.0 2400.0 2800.0 3200.0 -1300.0 1500.0 2100.0 2400.0 3100.0 3300.0 -1200.0 1600.0 2200.0 2500.0 3200.0 3300.0 -1300.0 1800.0 2300.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1300.0 1800.0 2200.0 2400.0 3000.0 3100.0 -1500.0 1700.0 2100.0 2700.0 3100.0 3200.0 -1500.0 1700.0 2100.0 2800.0 3100.0 3200.0 -1700.0 2000.0 2200.0 2500.0 3100.0 3200.0 -1800.0 1900.0 2100.0 2300.0 2600.0 3100.0 -1500.0 1600.0 1800.0 2000.0 2500.0 3100.0 -1700.0 2000.0 2200.0 2400.0 3100.0 3300.0 -1600.0 1800.0 2000.0 2400.0 2900.0 3200.0 -1400.0 1500.0 1700.0 1900.0 3000.0 3200.0 -1600.0 1700.0 2000.0 2600.0 3000.0 3200.0 -1700.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1700.0 2200.0 2600.0 2800.0 3100.0 3200.0 -1600.0 2200.0 2500.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2200.0 2500.0 3000.0 3100.0 -1600.0 2000.0 2500.0 2800.0 3100.0 3300.0 -1700.0 2100.0 2400.0 2900.0 3200.0 3300.0 -1800.0 2000.0 2400.0 2700.0 3000.0 3100.0 -1800.0 2000.0 2500.0 2700.0 3000.0 3100.0 -1600.0 1900.0 2300.0 2600.0 3000.0 3100.0 -1500.0 1900.0 2100.0 2500.0 3000.0 3200.0 -1900.0 2300.0 2500.0 2600.0 2900.0 3100.0 -2000.0 2200.0 2500.0 2800.0 3300.0 3400.0 -2100.0 2300.0 2600.0 2800.0 3200.0 3400.0 -2200.0 2400.0 2800.0 2900.0 3200.0 3300.0 -2100.0 2500.0 2700.0 2900.0 3200.0 3300.0 -1800.0 2300.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2300.0 2500.0 2700.0 3000.0 3200.0 -1400.0 1800.0 2500.0 2700.0 3200.0 3300.0 -1400.0 1600.0 2500.0 2700.0 3200.0 3300.0 -1400.0 1700.0 2200.0 2700.0 3100.0 3300.0 -1500.0 1700.0 2200.0 2700.0 3000.0 3200.0 -1500.0 1700.0 2100.0 2700.0 2900.0 3100.0 -1800.0 2300.0 2600.0 2700.0 3200.0 3300.0 -1800.0 2400.0 2700.0 2800.0 3300.0 3400.0 -1800.0 2500.0 2700.0 2900.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2400.0 2800.0 3000.0 -1600.0 1800.0 2200.0 2400.0 2800.0 3100.0 -1900.0 2000.0 2200.0 2700.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2700.0 3100.0 3300.0 -2000.0 2200.0 2500.0 2600.0 2900.0 3100.0 -1400.0 1900.0 2400.0 2700.0 3000.0 3300.0 -1500.0 1900.0 2300.0 2700.0 3000.0 3300.0 -1300.0 1800.0 2100.0 2400.0 3100.0 3200.0 -1500.0 1800.0 2200.0 2500.0 2700.0 3100.0 -1600.0 2000.0 2200.0 2600.0 2900.0 3100.0 -1700.0 2100.0 2700.0 3000.0 3200.0 3300.0 -1600.0 1800.0 2600.0 2800.0 3200.0 3300.0 -1200.0 1600.0 2200.0 2600.0 3000.0 3300.0 -1800.0 2300.0 2600.0 2800.0 3100.0 3200.0 -1800.0 2400.0 2700.0 2800.0 3100.0 3200.0 -1700.0 2300.0 2700.0 2800.0 3100.0 3200.0 -1900.0 2200.0 2700.0 2900.0 3100.0 3300.0 -1600.0 2200.0 2500.0 2700.0 3000.0 3200.0 -1600.0 2000.0 2500.0 2700.0 3000.0 3100.0 -1800.0 2200.0 2500.0 2600.0 3100.0 3200.0 -1800.0 2500.0 2700.0 2800.0 3200.0 3300.0 -1700.0 2300.0 2600.0 2700.0 3100.0 3200.0 -1400.0 1600.0 2000.0 2500.0 2900.0 3100.0 -1700.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1200.0 1400.0 1700.0 1800.0 2700.0 3200.0 -1500.0 1700.0 2000.0 2400.0 2700.0 3000.0 -1600.0 1800.0 2300.0 2400.0 2800.0 3100.0 -1800.0 2000.0 2400.0 2500.0 2900.0 3100.0 -1700.0 2000.0 2400.0 2600.0 2900.0 3000.0 -1500.0 1900.0 2300.0 2600.0 2900.0 3100.0 -1500.0 1900.0 2200.0 2600.0 2900.0 3100.0 -1500.0 1900.0 2100.0 2400.0 2900.0 3100.0 -1700.0 2300.0 2500.0 2800.0 3100.0 3200.0 -1600.0 2400.0 2700.0 2800.0 3200.0 3300.0 -1500.0 2400.0 2800.0 2900.0 3200.0 3300.0 -1200.0 1700.0 2300.0 2400.0 3000.0 3200.0 -1300.0 1900.0 2400.0 2600.0 3200.0 3300.0 -1500.0 2100.0 2300.0 2700.0 3100.0 3300.0 -1700.0 2200.0 2500.0 2700.0 3100.0 3300.0 -1400.0 1600.0 2000.0 2500.0 3000.0 3300.0 -1600.0 2000.0 2400.0 2500.0 3100.0 3300.0 -1400.0 1900.0 2300.0 2500.0 3200.0 3400.0 -1100.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1100.0 2200.0 2400.0 2700.0 3200.0 3300.0 -1200.0 2000.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2500.0 2900.0 3000.0 -1500.0 1900.0 2200.0 2400.0 2600.0 3100.0 -1800.0 2000.0 2500.0 2600.0 2900.0 3200.0 -2000.0 2100.0 2500.0 2700.0 3100.0 3300.0 -1800.0 2100.0 2400.0 2600.0 3000.0 3400.0 -1600.0 1800.0 2200.0 2400.0 3300.0 3400.0 -1400.0 1800.0 2200.0 2400.0 3200.0 3300.0 -1600.0 1900.0 2200.0 2700.0 3200.0 3300.0 -1500.0 1900.0 2300.0 2400.0 3000.0 3200.0 -1500.0 1900.0 2300.0 2500.0 2900.0 3200.0 -2200.0 2500.0 2900.0 3000.0 3300.0 3400.0 -1500.0 1800.0 2400.0 2700.0 3300.0 3400.0 -1400.0 1800.0 2100.0 2700.0 3100.0 3200.0 -1400.0 1600.0 2000.0 2700.0 3100.0 3200.0 -1900.0 2000.0 2300.0 2800.0 3100.0 3200.0 -2100.0 2200.0 2400.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2400.0 2500.0 2900.0 3100.0 -1800.0 1900.0 2200.0 2700.0 3200.0 3300.0 -1800.0 2200.0 2800.0 3000.0 3300.0 3500.0 -1800.0 2300.0 2600.0 2900.0 3300.0 3500.0 -2100.0 2400.0 2700.0 3000.0 3300.0 3500.0 -1600.0 1800.0 2200.0 2400.0 2900.0 3300.0 -1500.0 1900.0 2500.0 2600.0 2900.0 3100.0 -1600.0 2100.0 2400.0 2600.0 2800.0 3100.0 -1500.0 1600.0 2100.0 2400.0 2900.0 3300.0 -1500.0 1700.0 2200.0 2400.0 2900.0 3300.0 -1400.0 1500.0 2300.0 2500.0 3200.0 3300.0 -1400.0 1700.0 2400.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2400.0 2500.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2400.0 2900.0 3200.0 -1700.0 2400.0 2600.0 2900.0 3300.0 3400.0 -1600.0 1700.0 2100.0 2300.0 2700.0 3200.0 -1800.0 2300.0 2600.0 2900.0 3100.0 3300.0 -1800.0 2400.0 2600.0 2900.0 3300.0 3400.0 -1900.0 2300.0 2700.0 2900.0 3200.0 3400.0 -1400.0 1800.0 2200.0 2500.0 3300.0 3400.0 -1300.0 1900.0 2300.0 2700.0 3100.0 3300.0 -1500.0 1800.0 2300.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2400.0 2500.0 3000.0 3300.0 -1900.0 2300.0 2600.0 2700.0 3200.0 3300.0 -1900.0 2100.0 2700.0 2900.0 3100.0 3300.0 -1600.0 1800.0 2000.0 2500.0 2900.0 3000.0 -1800.0 2100.0 2400.0 2500.0 2900.0 3100.0 -1500.0 1700.0 2400.0 2500.0 2700.0 3000.0 -1400.0 1600.0 2200.0 2500.0 2600.0 3000.0 -1300.0 2100.0 2300.0 2800.0 3100.0 3200.0 -1300.0 2100.0 2200.0 2700.0 3100.0 3200.0 -1500.0 2000.0 2300.0 2500.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2400.0 2800.0 3200.0 -1900.0 2000.0 2300.0 2500.0 2900.0 3300.0 -1600.0 1900.0 2500.0 2800.0 3100.0 3200.0 -1400.0 2000.0 2400.0 2600.0 3000.0 3100.0 -1200.0 1900.0 2000.0 2400.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2000.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2600.0 2900.0 3000.0 -1700.0 1900.0 2300.0 2600.0 3000.0 3100.0 -1800.0 2200.0 2800.0 3000.0 3200.0 3400.0 -2000.0 2300.0 2900.0 3100.0 3300.0 3400.0 -1500.0 2000.0 2300.0 2700.0 3300.0 3400.0 -1200.0 1700.0 2300.0 2500.0 3100.0 3300.0 -1300.0 1800.0 2200.0 2600.0 3200.0 3300.0 -1200.0 2000.0 2200.0 2600.0 3100.0 3200.0 -2000.0 2300.0 2500.0 2900.0 3200.0 3300.0 -2200.0 2300.0 2700.0 3000.0 3200.0 3300.0 -1500.0 2000.0 2300.0 2500.0 2800.0 3000.0 -1200.0 1800.0 2300.0 2400.0 3200.0 3300.0 -1200.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1200.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1600.0 2100.0 2500.0 2700.0 3200.0 3300.0 -1500.0 1700.0 1900.0 2400.0 2800.0 3000.0 -1500.0 1700.0 1900.0 2500.0 2800.0 3000.0 -1500.0 1800.0 2100.0 2700.0 3000.0 3200.0 -2000.0 2200.0 2700.0 3000.0 3300.0 3400.0 -2100.0 2400.0 2800.0 3000.0 3400.0 3500.0 -2000.0 2200.0 2700.0 2900.0 3200.0 3300.0 -2100.0 2500.0 2800.0 3000.0 3400.0 3500.0 -2000.0 2300.0 2600.0 2700.0 3200.0 3300.0 -1900.0 2300.0 2600.0 2700.0 3200.0 3400.0 -1500.0 1800.0 2300.0 2600.0 3000.0 3300.0 -1400.0 1900.0 2400.0 2500.0 2700.0 3000.0 -2200.0 2300.0 2700.0 2900.0 3200.0 3300.0 -2100.0 2300.0 2700.0 2800.0 3200.0 3300.0 -2000.0 2300.0 2500.0 2700.0 3300.0 3400.0 -2300.0 2500.0 2800.0 3100.0 3400.0 3500.0 -2200.0 2600.0 2800.0 3100.0 3300.0 3400.0 -2200.0 2600.0 2700.0 3000.0 3300.0 3400.0 -1900.0 2200.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2400.0 2600.0 2900.0 3100.0 -1700.0 1800.0 2300.0 2500.0 2700.0 3000.0 -1500.0 1800.0 2200.0 2400.0 2800.0 3200.0 -1300.0 2100.0 2400.0 2700.0 3300.0 3400.0 -1200.0 1900.0 2400.0 2600.0 3100.0 3300.0 -1200.0 1500.0 2400.0 2500.0 3100.0 3400.0 -1400.0 1500.0 2400.0 2600.0 3000.0 3400.0 -1500.0 1600.0 2500.0 2600.0 3100.0 3400.0 -1600.0 2100.0 2400.0 2500.0 3100.0 3300.0 -1600.0 2200.0 2400.0 2600.0 3100.0 3300.0 -1800.0 2300.0 2600.0 2900.0 3200.0 3400.0 -2100.0 2200.0 2500.0 2700.0 2900.0 3200.0 -1700.0 2000.0 2300.0 2400.0 2700.0 3000.0 -2000.0 2200.0 2400.0 2700.0 3300.0 3400.0 -1500.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1200.0 1700.0 2200.0 2400.0 3300.0 3400.0 -1400.0 1900.0 2000.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2200.0 2600.0 3200.0 3300.0 -1200.0 2100.0 2300.0 2600.0 3300.0 3400.0 -1100.0 2100.0 2300.0 2600.0 3300.0 3400.0 -1900.0 2100.0 2600.0 2700.0 3100.0 3300.0 -1200.0 1600.0 2100.0 2400.0 3000.0 3300.0 -1200.0 1700.0 2100.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2100.0 2300.0 2600.0 3000.0 -1900.0 2200.0 2300.0 2700.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2500.0 2900.0 3200.0 -1500.0 1900.0 2100.0 2500.0 2900.0 3100.0 -1300.0 1900.0 2100.0 2400.0 3000.0 3100.0 -1800.0 2400.0 2800.0 3000.0 3400.0 3500.0 -1600.0 2000.0 2300.0 2800.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2400.0 3000.0 3300.0 -1400.0 2100.0 2300.0 2500.0 3200.0 3400.0 -1700.0 2000.0 2500.0 2700.0 3000.0 3300.0 -1800.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1400.0 1700.0 1900.0 2800.0 3100.0 3200.0 -1300.0 1600.0 1800.0 2600.0 3100.0 3200.0 -1300.0 1500.0 1600.0 2400.0 3100.0 3200.0 -1400.0 1600.0 1700.0 2200.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2500.0 2900.0 3200.0 -1500.0 1900.0 2100.0 2400.0 3200.0 3300.0 -1800.0 2000.0 2100.0 2500.0 3200.0 3300.0 -1400.0 2000.0 2400.0 2500.0 3100.0 3200.0 -1200.0 1800.0 2500.0 2600.0 3100.0 3300.0 -1100.0 1800.0 2300.0 2600.0 3100.0 3300.0 -1400.0 1700.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2300.0 2600.0 3100.0 3200.0 -1500.0 1800.0 2500.0 2700.0 3100.0 3300.0 -1500.0 1900.0 2500.0 2700.0 3000.0 3200.0 -1600.0 1900.0 2500.0 2800.0 3200.0 3400.0 -1600.0 1700.0 2400.0 2700.0 2900.0 3200.0 -1500.0 1600.0 2100.0 2600.0 2800.0 3100.0 -1300.0 1500.0 1700.0 1900.0 3000.0 3100.0 -1400.0 1500.0 2200.0 2400.0 3100.0 3300.0 -1100.0 1400.0 2200.0 2500.0 3200.0 3300.0 -1200.0 1500.0 1700.0 1900.0 3200.0 3300.0 -1500.0 1700.0 2300.0 2700.0 3000.0 3300.0 -1900.0 2200.0 2700.0 2800.0 3100.0 3400.0 -1900.0 2200.0 2700.0 2900.0 3300.0 3500.0 -1400.0 1900.0 2300.0 2400.0 3000.0 3200.0 -1500.0 1600.0 2300.0 2600.0 2900.0 3200.0 -1800.0 2100.0 2700.0 2800.0 3200.0 3300.0 -1500.0 1700.0 2400.0 2800.0 3100.0 3300.0 -1700.0 1900.0 2700.0 2800.0 3300.0 3400.0 -1700.0 2100.0 2600.0 2800.0 3100.0 3400.0 -1700.0 2200.0 2700.0 2900.0 3200.0 3400.0 -1900.0 2100.0 2400.0 2800.0 3200.0 3400.0 -1800.0 2100.0 2300.0 2600.0 3000.0 3300.0 -1800.0 2000.0 2200.0 2500.0 3100.0 3300.0 -1400.0 1600.0 2300.0 2400.0 3200.0 3300.0 -1600.0 1800.0 2300.0 2400.0 2900.0 3100.0 -1800.0 2200.0 2700.0 2800.0 3100.0 3300.0 -1800.0 2100.0 2700.0 2800.0 3000.0 3300.0 -1800.0 2100.0 2700.0 2800.0 3100.0 3300.0 -1500.0 1900.0 2200.0 2500.0 3200.0 3300.0 -1200.0 1800.0 2200.0 2400.0 3100.0 3300.0 -1000.0 1400.0 2300.0 2400.0 3200.0 3300.0 -1100.0 1500.0 2200.0 2400.0 3200.0 3300.0 -1200.0 1500.0 2100.0 2200.0 3200.0 3300.0 -1900.0 2000.0 2300.0 2600.0 3200.0 3400.0 -1100.0 1500.0 2100.0 2200.0 3200.0 3300.0 -1500.0 2000.0 2600.0 2800.0 3200.0 3400.0 -1400.0 1600.0 2500.0 2800.0 3000.0 3300.0 -1500.0 1600.0 2500.0 2700.0 3100.0 3300.0 -1400.0 1700.0 2600.0 2800.0 3000.0 3300.0 -1100.0 1900.0 2200.0 2400.0 3100.0 3300.0 -1000.0 1800.0 2200.0 2400.0 3200.0 3300.0 -1000.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1300.0 1600.0 1800.0 2000.0 3200.0 3300.0 -1300.0 1500.0 1800.0 1900.0 3200.0 3300.0 -1500.0 1700.0 2100.0 2500.0 3000.0 3300.0 -1700.0 1800.0 2400.0 2600.0 3100.0 3400.0 -1500.0 1600.0 2100.0 2600.0 2800.0 3200.0 -1500.0 1600.0 2200.0 2600.0 2800.0 3000.0 -1600.0 1700.0 2100.0 2500.0 2900.0 3100.0 -1500.0 1600.0 2100.0 2500.0 2800.0 3200.0 -1500.0 1600.0 2100.0 2500.0 2700.0 3100.0 -1500.0 1600.0 2100.0 2400.0 2800.0 3100.0 -1500.0 1700.0 2200.0 2400.0 2800.0 3100.0 -2000.0 2300.0 2600.0 2700.0 3200.0 3400.0 -1600.0 1800.0 2100.0 2600.0 3100.0 3300.0 -1600.0 1700.0 2200.0 2700.0 3100.0 3300.0 -1300.0 1800.0 2400.0 2600.0 3100.0 3300.0 -1300.0 1500.0 2400.0 2700.0 3000.0 3300.0 -1500.0 1600.0 1900.0 2600.0 2900.0 3000.0 -1800.0 1900.0 2200.0 2700.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2700.0 3000.0 3300.0 -1800.0 1900.0 2400.0 2700.0 2900.0 3300.0 -1900.0 2000.0 2600.0 2700.0 3000.0 3200.0 -1900.0 2200.0 2700.0 2800.0 3000.0 3200.0 -1500.0 1600.0 2100.0 2500.0 2800.0 3100.0 -1100.0 1300.0 2400.0 2600.0 2800.0 3200.0 -1200.0 1500.0 2300.0 2600.0 3100.0 3300.0 -1200.0 1600.0 1800.0 2000.0 3200.0 3300.0 -1400.0 1600.0 1900.0 2000.0 3200.0 3300.0 -1300.0 1500.0 1700.0 1900.0 3200.0 3300.0 -2000.0 2200.0 2700.0 2800.0 3200.0 3400.0 -1500.0 1600.0 2400.0 2500.0 2900.0 3300.0 -1100.0 1700.0 2100.0 2300.0 3100.0 3200.0 -1500.0 1600.0 2100.0 2700.0 2900.0 3000.0 -1500.0 1900.0 2300.0 2600.0 2900.0 3000.0 -1600.0 2000.0 2200.0 2600.0 3100.0 3300.0 -1400.0 1600.0 1800.0 2000.0 3100.0 3200.0 -1900.0 2000.0 2300.0 2500.0 3000.0 3300.0 -1900.0 2100.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2400.0 2700.0 2800.0 3200.0 3400.0 -1900.0 2500.0 2700.0 2800.0 3300.0 3400.0 -2000.0 2500.0 2800.0 2900.0 3300.0 3500.0 -2100.0 2600.0 2800.0 3000.0 3400.0 3500.0 -1500.0 1600.0 2300.0 2600.0 2900.0 3300.0 -1600.0 2100.0 2600.0 2800.0 3200.0 3300.0 -1300.0 1500.0 2300.0 2700.0 3000.0 3300.0 -1400.0 1800.0 2300.0 2500.0 2700.0 3100.0 -1400.0 1600.0 2400.0 2700.0 3200.0 3300.0 -1400.0 1500.0 2300.0 2600.0 3200.0 3300.0 -1400.0 1600.0 2200.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2100.0 2300.0 3200.0 3400.0 -2100.0 2400.0 2700.0 2800.0 3100.0 3400.0 -2100.0 2400.0 2700.0 2800.0 3200.0 3400.0 -1600.0 1800.0 2600.0 2700.0 3000.0 3400.0 -1500.0 1700.0 2600.0 2700.0 2900.0 3300.0 -1600.0 1800.0 2600.0 2700.0 3000.0 3200.0 -1900.0 2500.0 2700.0 3000.0 3400.0 3500.0 -2000.0 2500.0 2600.0 3100.0 3300.0 3400.0 -2100.0 2300.0 2700.0 3000.0 3200.0 3400.0 -1600.0 1700.0 2100.0 2500.0 3100.0 3300.0 -1600.0 1700.0 2000.0 2400.0 3200.0 3300.0 -1600.0 1700.0 2000.0 2500.0 3200.0 3300.0 -2200.0 2500.0 2700.0 2900.0 3300.0 3400.0 -1200.0 1400.0 2100.0 2500.0 3000.0 3100.0 -1400.0 1700.0 2200.0 2400.0 3100.0 3300.0 -1300.0 1700.0 2000.0 2200.0 3100.0 3200.0 -1200.0 1600.0 1700.0 2100.0 3100.0 3200.0 -1800.0 2100.0 2700.0 2900.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2800.0 2900.0 3100.0 -1900.0 2000.0 2300.0 2700.0 2900.0 3200.0 -2000.0 2100.0 2400.0 2700.0 3000.0 3200.0 -1800.0 1900.0 2400.0 2700.0 3100.0 3400.0 -1700.0 1800.0 2500.0 2800.0 3000.0 3300.0 -2200.0 2600.0 2800.0 2900.0 3300.0 3400.0 -1500.0 1700.0 2200.0 2500.0 3200.0 3300.0 -1300.0 1600.0 2200.0 2500.0 3100.0 3200.0 -1700.0 1900.0 2300.0 2700.0 3100.0 3200.0 -1700.0 1900.0 2400.0 2800.0 3000.0 3200.0 -1300.0 1800.0 2200.0 2600.0 3000.0 3300.0 -1200.0 1500.0 2300.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2400.0 3100.0 3400.0 -1300.0 1700.0 2200.0 2300.0 3100.0 3300.0 -1500.0 1700.0 2300.0 2500.0 3200.0 3300.0 -1500.0 1600.0 2400.0 2600.0 3200.0 3300.0 -1600.0 1700.0 2400.0 2700.0 3100.0 3400.0 -1600.0 1700.0 2300.0 2800.0 3000.0 3300.0 -1300.0 1700.0 2300.0 2600.0 2700.0 2900.0 -1500.0 1600.0 2200.0 2600.0 2800.0 3200.0 -1300.0 1700.0 2200.0 2400.0 3000.0 3200.0 -1400.0 1900.0 2300.0 2600.0 2900.0 3300.0 -1200.0 1400.0 2500.0 2600.0 3100.0 3400.0 -1500.0 1600.0 2200.0 2500.0 2700.0 3200.0 -1600.0 1700.0 2300.0 2500.0 2700.0 3300.0 -1100.0 1300.0 2200.0 2700.0 3000.0 3200.0 -1200.0 1300.0 2000.0 2700.0 2900.0 3100.0 -1800.0 2000.0 2700.0 2900.0 3100.0 3300.0 -1800.0 1900.0 2400.0 2800.0 3000.0 3300.0 -1900.0 2000.0 2400.0 2800.0 3000.0 3300.0 -2000.0 2100.0 2400.0 2700.0 2900.0 3100.0 -1700.0 1800.0 2300.0 2600.0 2700.0 3100.0 -1500.0 1700.0 2100.0 2500.0 2700.0 2900.0 -1400.0 1800.0 2400.0 2600.0 2800.0 3200.0 -2000.0 2100.0 2500.0 2900.0 3100.0 3300.0 -2000.0 2100.0 2600.0 2900.0 3100.0 3300.0 -2100.0 2200.0 2500.0 2800.0 3100.0 3300.0 -1900.0 2000.0 2500.0 2600.0 2900.0 3100.0 -1800.0 1900.0 2500.0 2700.0 2800.0 3100.0 -1900.0 2300.0 2800.0 2900.0 3300.0 3400.0 -1700.0 1800.0 2100.0 2200.0 3100.0 3200.0 -1800.0 1900.0 2200.0 2300.0 3100.0 3200.0 -1200.0 1700.0 2100.0 2300.0 3200.0 3300.0 -1400.0 1600.0 2000.0 2200.0 3000.0 3100.0 -1500.0 1600.0 2200.0 2500.0 2900.0 3100.0 -1900.0 2200.0 2400.0 2600.0 2800.0 3000.0 -1900.0 2100.0 2400.0 2700.0 2800.0 3000.0 -1900.0 2100.0 2300.0 2700.0 2900.0 3000.0 -1800.0 2000.0 2400.0 2900.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2800.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2500.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2200.0 2700.0 3100.0 -1600.0 1700.0 2100.0 2200.0 2600.0 3100.0 -1900.0 2200.0 2400.0 2900.0 3300.0 3400.0 -1600.0 1800.0 2400.0 2500.0 2900.0 3200.0 -2000.0 2200.0 2400.0 2500.0 2800.0 3200.0 -2000.0 2400.0 2500.0 2700.0 2900.0 3100.0 -1900.0 2000.0 2200.0 2300.0 3100.0 3400.0 -2000.0 2100.0 2300.0 2600.0 3000.0 3200.0 -2000.0 2100.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2600.0 2900.0 3000.0 -1300.0 1500.0 2300.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2100.0 2600.0 2900.0 3000.0 -1700.0 1800.0 2200.0 2500.0 2700.0 3100.0 -1900.0 2400.0 2600.0 2700.0 3000.0 3100.0 -2000.0 2400.0 2500.0 2900.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2600.0 2800.0 3100.0 -1900.0 2100.0 2600.0 3000.0 3200.0 3300.0 -1800.0 2300.0 2400.0 2600.0 3200.0 3300.0 -1900.0 2200.0 2300.0 2600.0 3200.0 3300.0 -1900.0 2400.0 2800.0 2900.0 3200.0 3400.0 -1800.0 2400.0 2700.0 2800.0 3200.0 3400.0 -1700.0 2100.0 2200.0 2600.0 3000.0 3100.0 -1900.0 2200.0 2500.0 2900.0 3200.0 3400.0 -1800.0 2400.0 2600.0 2700.0 3300.0 3400.0 -1900.0 2500.0 2700.0 2900.0 3300.0 3400.0 -1900.0 2400.0 2800.0 2900.0 3300.0 3400.0 -1800.0 2400.0 2800.0 2900.0 3200.0 3400.0 -1200.0 1300.0 2400.0 2800.0 2900.0 3100.0 -1600.0 1800.0 2000.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2300.0 2700.0 3200.0 3300.0 -1800.0 2100.0 2300.0 2800.0 3200.0 3300.0 -1500.0 1600.0 2100.0 2200.0 2800.0 3100.0 -1500.0 1600.0 2000.0 2200.0 2500.0 3100.0 -1400.0 1500.0 2200.0 2500.0 2700.0 3000.0 -1200.0 1400.0 2300.0 2600.0 2800.0 3100.0 -1700.0 1800.0 2100.0 2400.0 2800.0 3000.0 -1700.0 2100.0 2200.0 2600.0 2800.0 2900.0 -2000.0 2200.0 2400.0 2700.0 3000.0 3100.0 -1500.0 2100.0 2500.0 2600.0 3100.0 3200.0 -1800.0 2400.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2400.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2300.0 2400.0 2600.0 3200.0 3300.0 -1900.0 2000.0 2400.0 2700.0 3000.0 3100.0 -2000.0 2200.0 2700.0 2900.0 3100.0 3200.0 -1800.0 1900.0 2300.0 2800.0 3200.0 3300.0 -1900.0 2000.0 2200.0 2700.0 3200.0 3300.0 -1900.0 2100.0 2200.0 2700.0 3200.0 3300.0 -1600.0 2000.0 2200.0 2700.0 3200.0 3300.0 -1800.0 2000.0 2300.0 2800.0 3200.0 3300.0 -2000.0 2200.0 2500.0 2800.0 3200.0 3400.0 -1800.0 2100.0 2400.0 2900.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2700.0 3000.0 3100.0 -1500.0 1700.0 2100.0 2300.0 2600.0 3100.0 -1400.0 1500.0 1800.0 1900.0 2400.0 3000.0 -1400.0 1500.0 1800.0 1900.0 2300.0 3000.0 -1400.0 1600.0 1900.0 2000.0 2600.0 3200.0 -1700.0 1800.0 2200.0 2300.0 2700.0 3100.0 -1500.0 1600.0 2100.0 2700.0 3100.0 3200.0 -1400.0 1500.0 2100.0 2700.0 3100.0 3200.0 -1700.0 1800.0 2200.0 2600.0 2900.0 3000.0 -1800.0 1900.0 2200.0 2600.0 2900.0 3000.0 -1400.0 1600.0 2100.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2000.0 2500.0 2900.0 3100.0 -1600.0 1800.0 2400.0 2800.0 3100.0 3200.0 -1400.0 1900.0 2300.0 2700.0 3100.0 3200.0 -1900.0 2200.0 2500.0 2900.0 3300.0 3400.0 -1500.0 1600.0 2100.0 2800.0 3200.0 3300.0 -1400.0 1500.0 1700.0 1900.0 2800.0 3100.0 -1400.0 1600.0 2100.0 2600.0 2800.0 3100.0 -1500.0 1700.0 2300.0 2600.0 2800.0 3000.0 -1600.0 1700.0 2500.0 2700.0 3100.0 3200.0 -1600.0 1900.0 2400.0 2800.0 3000.0 3200.0 -1800.0 2300.0 2600.0 2700.0 3100.0 3300.0 -1900.0 2300.0 2500.0 2700.0 3100.0 3300.0 -1700.0 2000.0 2200.0 2600.0 3000.0 3100.0 -1600.0 1900.0 2100.0 2700.0 2900.0 3100.0 -1600.0 2200.0 2400.0 2700.0 3200.0 3300.0 -1700.0 2300.0 2500.0 2700.0 3200.0 3300.0 -1600.0 2100.0 2300.0 2500.0 3100.0 3200.0 -1700.0 2100.0 2300.0 2500.0 3100.0 3200.0 -1800.0 2200.0 2300.0 2600.0 3200.0 3300.0 -1700.0 2200.0 2400.0 2600.0 3300.0 3400.0 -1700.0 2200.0 2300.0 2600.0 3200.0 3300.0 -1800.0 1900.0 2300.0 2600.0 2900.0 3200.0 -1700.0 1800.0 2200.0 2400.0 2700.0 3000.0 -1800.0 1900.0 2200.0 2500.0 2700.0 3100.0 -1700.0 1900.0 2100.0 2600.0 3100.0 3200.0 -1900.0 2000.0 2300.0 2800.0 3200.0 3300.0 -1800.0 2000.0 2200.0 2700.0 3200.0 3300.0 -1700.0 1800.0 2100.0 2400.0 3200.0 3300.0 -1200.0 1500.0 2400.0 2700.0 2900.0 3000.0 -1700.0 1800.0 2100.0 2200.0 2500.0 3000.0 -1700.0 1800.0 2100.0 2200.0 2400.0 3000.0 -1600.0 1700.0 2000.0 2100.0 2400.0 3000.0 -1600.0 1700.0 1900.0 2000.0 2500.0 3000.0 -1700.0 1900.0 2100.0 2400.0 2600.0 2900.0 -1800.0 2000.0 2200.0 2400.0 2600.0 3000.0 -1600.0 1900.0 2400.0 2500.0 2900.0 3200.0 -1900.0 2100.0 2300.0 2700.0 3200.0 3300.0 -1900.0 2000.0 2300.0 2700.0 2800.0 3000.0 -1900.0 2000.0 2300.0 2700.0 2800.0 3100.0 -1500.0 1600.0 2300.0 2700.0 2900.0 3100.0 -1700.0 2200.0 2700.0 2800.0 3100.0 3300.0 -1600.0 2000.0 2600.0 2800.0 3200.0 3300.0 -1800.0 2200.0 2400.0 2600.0 3100.0 3200.0 -1600.0 2200.0 2600.0 2700.0 3000.0 3100.0 -2000.0 2200.0 2400.0 2600.0 2900.0 3100.0 -1400.0 1600.0 2000.0 2600.0 2800.0 3000.0 -1500.0 1600.0 2500.0 2700.0 3000.0 3100.0 -1300.0 1500.0 2200.0 2600.0 3100.0 3300.0 -1100.0 1600.0 2200.0 2500.0 3000.0 3200.0 -1200.0 1400.0 2200.0 2700.0 2800.0 3000.0 -1200.0 1400.0 2300.0 2600.0 2700.0 3000.0 -1600.0 1700.0 2000.0 2100.0 2600.0 3100.0 -1800.0 2300.0 2400.0 2600.0 2800.0 3100.0 -1700.0 2300.0 2700.0 2800.0 3200.0 3300.0 -1300.0 1600.0 2300.0 2700.0 2900.0 3000.0 -1500.0 1600.0 2200.0 2700.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2700.0 3000.0 3100.0 -1900.0 2000.0 2300.0 2600.0 2800.0 3000.0 -1900.0 2100.0 2300.0 2600.0 2800.0 3000.0 -1500.0 1900.0 2500.0 2700.0 3000.0 3100.0 -1900.0 2400.0 2700.0 2900.0 3100.0 3300.0 -1300.0 1600.0 1800.0 2100.0 2900.0 3200.0 -1700.0 1800.0 2000.0 2200.0 3100.0 3200.0 -2000.0 2300.0 2700.0 3100.0 3300.0 3400.0 -1900.0 2200.0 2300.0 2600.0 3000.0 3200.0 -1900.0 2300.0 2800.0 3000.0 3200.0 3300.0 -2100.0 2300.0 2800.0 2900.0 3200.0 3300.0 -2000.0 2200.0 2800.0 2900.0 3200.0 3300.0 -1700.0 1900.0 2400.0 2800.0 3200.0 3300.0 -1500.0 1600.0 2200.0 2800.0 3200.0 3300.0 -1400.0 1500.0 2200.0 2500.0 2900.0 3200.0 -1300.0 1800.0 2200.0 2500.0 3100.0 3200.0 -1200.0 1800.0 2300.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2500.0 2700.0 3200.0 3300.0 -1900.0 2300.0 2400.0 2700.0 2900.0 3100.0 -1900.0 2200.0 2400.0 2600.0 3000.0 3100.0 -1600.0 1800.0 2100.0 2800.0 3100.0 3200.0 -1800.0 2400.0 2600.0 2700.0 3000.0 3100.0 -1600.0 1700.0 1900.0 2000.0 2500.0 3100.0 -1800.0 1900.0 2100.0 2300.0 2900.0 3300.0 -1300.0 1700.0 2400.0 2700.0 3200.0 3300.0 -1500.0 2000.0 2500.0 2800.0 3100.0 3300.0 -1900.0 2300.0 2400.0 2600.0 3300.0 3400.0 -1900.0 2300.0 2500.0 2700.0 3200.0 3300.0 -1400.0 1600.0 2100.0 2800.0 3100.0 3200.0 -1500.0 1600.0 2100.0 2200.0 2700.0 3200.0 -1500.0 1600.0 1900.0 2000.0 2600.0 3100.0 -1400.0 1500.0 1900.0 2000.0 2600.0 3100.0 -1400.0 1600.0 1900.0 2000.0 2700.0 3200.0 -1700.0 1900.0 2100.0 2400.0 3000.0 3100.0 -1800.0 2000.0 2200.0 2400.0 2900.0 3200.0 -1700.0 2000.0 2200.0 2400.0 2800.0 3100.0 -1800.0 2000.0 2300.0 2700.0 2900.0 3200.0 -1700.0 2000.0 2200.0 2400.0 3000.0 3200.0 -1600.0 1900.0 2100.0 2300.0 3000.0 3200.0 -1700.0 1900.0 2100.0 2300.0 3000.0 3200.0 -1600.0 1900.0 2100.0 2400.0 3000.0 3200.0 -1700.0 1900.0 2200.0 2600.0 2900.0 3100.0 -1500.0 1800.0 1900.0 2400.0 2800.0 3000.0 -1700.0 2000.0 2400.0 2900.0 3100.0 3300.0 -1800.0 2000.0 2700.0 2900.0 3200.0 3400.0 -2000.0 2200.0 2600.0 2900.0 3100.0 3200.0 -1600.0 2200.0 2500.0 2700.0 3200.0 3300.0 -1800.0 2000.0 2200.0 2400.0 2600.0 3100.0 -1700.0 1800.0 2000.0 2100.0 2600.0 3100.0 -1600.0 1700.0 1900.0 2000.0 2700.0 3200.0 -1700.0 1900.0 2100.0 2300.0 2600.0 3100.0 -2000.0 2300.0 2500.0 2600.0 3200.0 3300.0 -1500.0 2100.0 2500.0 2700.0 3100.0 3200.0 -1500.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1600.0 2200.0 2500.0 2800.0 3100.0 3200.0 -1500.0 2100.0 2400.0 2700.0 3100.0 3200.0 -1600.0 2100.0 2400.0 2700.0 3000.0 3100.0 -1800.0 2100.0 2400.0 2700.0 3000.0 3100.0 -1500.0 1600.0 2000.0 2600.0 3000.0 3200.0 -1400.0 1900.0 2400.0 2600.0 3000.0 3300.0 -1400.0 1500.0 2100.0 2600.0 3000.0 3100.0 -1300.0 1500.0 2300.0 2600.0 2800.0 3200.0 -1400.0 1600.0 2200.0 2600.0 3000.0 3200.0 -1700.0 1800.0 2200.0 2600.0 2900.0 3200.0 -1700.0 1800.0 2000.0 2600.0 2900.0 3100.0 -1600.0 1800.0 2000.0 2500.0 3000.0 3200.0 -1300.0 1500.0 2300.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2300.0 2800.0 3200.0 3300.0 -1900.0 2000.0 2300.0 2400.0 3000.0 3200.0 -1700.0 1900.0 2200.0 2600.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2600.0 2800.0 2900.0 -1600.0 1700.0 2000.0 2300.0 3100.0 3200.0 -1600.0 1700.0 2100.0 2400.0 3000.0 3200.0 -2000.0 2100.0 2400.0 2800.0 3100.0 3300.0 -1700.0 2200.0 2300.0 2700.0 3000.0 3100.0 -1700.0 2200.0 2400.0 2600.0 3000.0 3200.0 -1900.0 2300.0 2400.0 2600.0 3000.0 3200.0 -2100.0 2200.0 2600.0 2800.0 3200.0 3400.0 -2100.0 2200.0 2700.0 2900.0 3200.0 3400.0 -2000.0 2200.0 2800.0 3000.0 3200.0 3400.0 -2000.0 2200.0 2700.0 3000.0 3200.0 3400.0 -2000.0 2200.0 2700.0 2900.0 3200.0 3400.0 -1700.0 2100.0 2400.0 2900.0 3100.0 3200.0 -1500.0 1800.0 1900.0 2500.0 3000.0 3100.0 -1700.0 1800.0 2100.0 2400.0 2900.0 3300.0 -1800.0 2000.0 2300.0 2400.0 2700.0 3100.0 -1800.0 2100.0 2300.0 2800.0 3000.0 3200.0 -1600.0 2300.0 2500.0 2800.0 3100.0 3200.0 -1600.0 2100.0 2500.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2100.0 2800.0 3000.0 3100.0 -1800.0 2300.0 2600.0 2700.0 3100.0 3200.0 -2000.0 2200.0 2800.0 3000.0 3300.0 3400.0 -2000.0 2200.0 2600.0 2800.0 3200.0 3400.0 -1700.0 1800.0 2200.0 2600.0 2800.0 3200.0 -1600.0 1800.0 2200.0 2500.0 2800.0 3200.0 -1600.0 1700.0 1900.0 2000.0 2600.0 3100.0 -1600.0 1700.0 2200.0 2800.0 3000.0 3200.0 -1700.0 1800.0 2400.0 2900.0 3100.0 3300.0 -1900.0 2200.0 2700.0 2900.0 3400.0 3500.0 -1700.0 1800.0 2000.0 2200.0 2900.0 3200.0 -1700.0 1900.0 2100.0 2300.0 2900.0 3200.0 -1200.0 1400.0 2200.0 2900.0 3100.0 3200.0 -1800.0 1900.0 2300.0 2600.0 2800.0 3200.0 -1600.0 1700.0 2000.0 2200.0 2700.0 3200.0 -1600.0 1700.0 2000.0 2200.0 2800.0 3200.0 -1600.0 1700.0 2000.0 2100.0 2800.0 3200.0 -1600.0 1800.0 2000.0 2100.0 2800.0 3200.0 -1700.0 1800.0 2000.0 2300.0 2900.0 3200.0 -1800.0 1900.0 2200.0 2600.0 3200.0 3300.0 -1800.0 2000.0 2200.0 2500.0 3200.0 3300.0 -1300.0 1500.0 1900.0 2600.0 3100.0 3200.0 -1300.0 1400.0 2000.0 2600.0 3200.0 3300.0 -1600.0 1700.0 2100.0 2700.0 3000.0 3200.0 -1400.0 1500.0 2000.0 2600.0 3100.0 3200.0 -1400.0 1500.0 2000.0 2700.0 3100.0 3200.0 -1500.0 1800.0 2400.0 2700.0 3000.0 3300.0 -1500.0 1600.0 2200.0 2300.0 2700.0 3300.0 -1400.0 1500.0 2200.0 2400.0 2700.0 3200.0 -1300.0 1500.0 2300.0 2600.0 2900.0 3200.0 -1400.0 1700.0 2400.0 2600.0 3000.0 3200.0 -1300.0 1600.0 2400.0 2500.0 2900.0 3200.0 -1400.0 1500.0 2200.0 2400.0 2900.0 3300.0 -1400.0 1600.0 2100.0 2200.0 3200.0 3300.0 -1400.0 1800.0 2200.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2500.0 2600.0 3100.0 3200.0 -1500.0 1700.0 1900.0 2600.0 3200.0 3300.0 -1500.0 1600.0 1800.0 2000.0 2800.0 3200.0 -1500.0 1600.0 1900.0 2000.0 2700.0 3200.0 -1500.0 1600.0 1900.0 2000.0 2800.0 3200.0 -1600.0 1700.0 2000.0 2500.0 3000.0 3200.0 -1600.0 1700.0 2200.0 2700.0 2900.0 3200.0 -1300.0 1500.0 2300.0 2700.0 2900.0 3200.0 -1600.0 1700.0 2600.0 2800.0 2900.0 3200.0 -1300.0 1500.0 2300.0 2500.0 2800.0 3200.0 -1300.0 1400.0 2300.0 2500.0 2800.0 3200.0 -1500.0 1700.0 2200.0 2600.0 2700.0 3100.0 -1500.0 1700.0 2200.0 2600.0 2800.0 3000.0 -1500.0 1700.0 2000.0 2600.0 2700.0 3000.0 -1100.0 1300.0 2300.0 2800.0 3100.0 3200.0 -1600.0 1700.0 2100.0 2500.0 3200.0 3300.0 -1700.0 1800.0 2300.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2300.0 2700.0 2900.0 3200.0 -1800.0 2000.0 2500.0 2800.0 3100.0 3400.0 -1900.0 2000.0 2800.0 2900.0 3300.0 3400.0 -1800.0 2000.0 2700.0 2800.0 3300.0 3400.0 -1700.0 1800.0 2100.0 2200.0 2600.0 3100.0 -1500.0 1600.0 1800.0 1900.0 2600.0 3200.0 -1600.0 1700.0 1900.0 2000.0 2600.0 3200.0 -1600.0 1700.0 2000.0 2100.0 2600.0 3200.0 -1700.0 1800.0 2000.0 2100.0 2800.0 3300.0 -1600.0 1900.0 2100.0 2400.0 3000.0 3100.0 -1600.0 1800.0 2300.0 2600.0 2900.0 3000.0 -1400.0 1500.0 2100.0 2600.0 2900.0 3100.0 -1400.0 1500.0 2200.0 2600.0 2900.0 3100.0 -1000.0 1200.0 2300.0 2900.0 3100.0 3200.0 -1300.0 1700.0 2400.0 2600.0 3000.0 3200.0 -1100.0 1600.0 2300.0 2600.0 3200.0 3300.0 -1200.0 1600.0 2300.0 2600.0 3100.0 3300.0 -1100.0 1600.0 2200.0 2600.0 3100.0 3300.0 -1600.0 2200.0 2400.0 2700.0 3100.0 3200.0 -1700.0 1800.0 2300.0 2700.0 2800.0 3000.0 -1400.0 1700.0 1900.0 2500.0 3200.0 3300.0 -1700.0 1900.0 2200.0 2400.0 2800.0 3000.0 -1400.0 1600.0 2100.0 2200.0 2700.0 3000.0 -1500.0 1700.0 2200.0 2400.0 2700.0 3100.0 -1500.0 1600.0 2200.0 2400.0 2800.0 3100.0 -1000.0 1900.0 2200.0 2500.0 3200.0 3300.0 -1200.0 1700.0 2100.0 2400.0 3200.0 3300.0 -1700.0 2000.0 2500.0 2600.0 3100.0 3400.0 -1600.0 2200.0 2400.0 2600.0 3200.0 3300.0 -2000.0 2500.0 2600.0 3000.0 3300.0 3400.0 -1400.0 1500.0 2100.0 2300.0 3200.0 3300.0 -1500.0 1700.0 2100.0 2400.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2300.0 3300.0 3400.0 -1800.0 2200.0 2500.0 2700.0 3100.0 3400.0 -1500.0 1900.0 2300.0 2600.0 3200.0 3300.0 -2100.0 2200.0 2600.0 2900.0 3100.0 3300.0 -1500.0 1600.0 1800.0 2600.0 3200.0 3300.0 -1300.0 1500.0 1600.0 2200.0 3100.0 3200.0 -1200.0 1800.0 2300.0 2400.0 3000.0 3200.0 -1100.0 1900.0 2100.0 2500.0 3200.0 3300.0 -1400.0 1700.0 2200.0 2500.0 3100.0 3200.0 -1900.0 2100.0 2300.0 2600.0 3000.0 3300.0 -1900.0 2100.0 2500.0 2800.0 3300.0 3400.0 -1700.0 1900.0 2300.0 2500.0 3100.0 3400.0 -1500.0 1900.0 2200.0 2500.0 2900.0 3200.0 -1200.0 2000.0 2300.0 2400.0 2500.0 3100.0 -1200.0 2000.0 2300.0 2400.0 2600.0 3100.0 -1900.0 2200.0 2500.0 2600.0 3100.0 3300.0 -1900.0 2200.0 2500.0 2700.0 3200.0 3400.0 -1800.0 2100.0 2400.0 2500.0 3200.0 3300.0 -1800.0 2100.0 2300.0 2500.0 3300.0 3400.0 -1500.0 1700.0 1800.0 2500.0 3200.0 3300.0 -1400.0 1600.0 1800.0 2300.0 3200.0 3300.0 -1300.0 1600.0 2300.0 2400.0 3200.0 3400.0 -1200.0 1500.0 1700.0 2100.0 3100.0 3200.0 -2100.0 2300.0 2400.0 2800.0 3200.0 3300.0 -1500.0 2000.0 2300.0 2400.0 3100.0 3300.0 -1400.0 1600.0 2000.0 2100.0 3000.0 3300.0 -1900.0 2000.0 2200.0 2400.0 3000.0 3300.0 -1500.0 1800.0 2200.0 2300.0 3000.0 3300.0 -1300.0 1500.0 2100.0 2200.0 2800.0 3300.0 -1500.0 1800.0 2200.0 2400.0 3000.0 3300.0 -1600.0 1900.0 2300.0 2600.0 3200.0 3400.0 -1300.0 1800.0 2200.0 2500.0 3000.0 3200.0 -1100.0 1600.0 2200.0 2300.0 3100.0 3200.0 -1300.0 1500.0 2000.0 2200.0 3100.0 3300.0 -2300.0 2500.0 2900.0 3100.0 3200.0 3300.0 -2300.0 2400.0 2700.0 2800.0 3100.0 3300.0 -2000.0 2100.0 2400.0 2700.0 3200.0 3300.0 -1600.0 1700.0 1900.0 2100.0 3200.0 3300.0 -1600.0 1800.0 1900.0 2300.0 3200.0 3300.0 -1500.0 1600.0 1900.0 2600.0 3100.0 3200.0 -1300.0 1500.0 1900.0 2300.0 3000.0 3100.0 -1200.0 1600.0 2000.0 2100.0 3200.0 3300.0 -1300.0 2000.0 2200.0 2400.0 2700.0 3100.0 -1100.0 1900.0 2300.0 2400.0 3000.0 3100.0 -1200.0 1500.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1600.0 1900.0 2500.0 3000.0 3100.0 -1300.0 1500.0 1600.0 2300.0 3200.0 3300.0 -1500.0 1800.0 2100.0 2400.0 3100.0 3200.0 -1900.0 2200.0 2500.0 2600.0 3200.0 3400.0 -1400.0 1500.0 2100.0 2300.0 2900.0 3200.0 -1100.0 1600.0 2100.0 2300.0 3100.0 3200.0 -1100.0 1600.0 2100.0 2300.0 3200.0 3300.0 -1000.0 1600.0 2200.0 2300.0 3100.0 3300.0 -1100.0 1600.0 2100.0 2300.0 3000.0 3100.0 -1100.0 1400.0 2300.0 2500.0 3200.0 3300.0 -1700.0 2100.0 2500.0 2800.0 3100.0 3400.0 -1300.0 1600.0 2300.0 2400.0 3200.0 3300.0 -1400.0 1700.0 2300.0 2400.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2400.0 3000.0 3300.0 -1700.0 1900.0 2500.0 2600.0 3000.0 3200.0 -1100.0 1500.0 2400.0 2500.0 3100.0 3200.0 -1700.0 1900.0 2100.0 2400.0 3100.0 3300.0 -1300.0 1700.0 2200.0 2600.0 3100.0 3300.0 -1600.0 1700.0 2000.0 2200.0 3100.0 3300.0 -1800.0 2000.0 2200.0 2400.0 3200.0 3400.0 -1900.0 2100.0 2600.0 2800.0 3000.0 3200.0 -1900.0 2100.0 2600.0 2800.0 3100.0 3200.0 -1400.0 1900.0 2400.0 2500.0 3100.0 3300.0 -1100.0 2100.0 2300.0 2700.0 3100.0 3200.0 -1100.0 1800.0 2200.0 2500.0 3000.0 3100.0 -1100.0 1800.0 2200.0 2400.0 3000.0 3100.0 -1500.0 1800.0 2400.0 2500.0 3100.0 3300.0 -1500.0 2000.0 2400.0 2500.0 3200.0 3400.0 -1800.0 2000.0 2500.0 2600.0 3000.0 3300.0 -1900.0 2400.0 2600.0 2900.0 3200.0 3400.0 -1500.0 2100.0 2500.0 2700.0 3200.0 3300.0 -1400.0 2100.0 2400.0 2700.0 3100.0 3200.0 -1500.0 2100.0 2500.0 2700.0 3000.0 3200.0 -1600.0 2100.0 2500.0 2600.0 3100.0 3300.0 -1500.0 1800.0 2100.0 2700.0 3100.0 3300.0 -1300.0 1600.0 1800.0 2500.0 3200.0 3300.0 -1300.0 1500.0 1600.0 2800.0 3300.0 3400.0 -1300.0 1400.0 2200.0 2300.0 3100.0 3300.0 -1300.0 1600.0 2400.0 2500.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2500.0 3200.0 3400.0 -1400.0 2000.0 2100.0 2400.0 3000.0 3100.0 -1300.0 1900.0 2100.0 2400.0 3100.0 3200.0 -1600.0 1700.0 2200.0 2600.0 3200.0 3300.0 -1400.0 1800.0 2300.0 2400.0 2900.0 3200.0 -1300.0 1600.0 2200.0 2400.0 3000.0 3200.0 -1200.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1500.0 1600.0 2200.0 2400.0 3100.0 3300.0 -1000.0 1600.0 2500.0 2600.0 3100.0 3200.0 -900.0 1600.0 2500.0 2600.0 3200.0 3300.0 -1400.0 1700.0 2500.0 2700.0 3100.0 3300.0 -1300.0 1900.0 2500.0 2700.0 3200.0 3300.0 -1600.0 2000.0 2400.0 2500.0 2900.0 3100.0 -1400.0 1600.0 2500.0 2600.0 3200.0 3400.0 -1400.0 1600.0 2600.0 2700.0 3100.0 3300.0 -1400.0 1600.0 2600.0 2700.0 3100.0 3400.0 -1600.0 2100.0 2600.0 2900.0 3300.0 3400.0 -1800.0 2100.0 2800.0 3000.0 3300.0 3400.0 -1800.0 2300.0 2700.0 2900.0 3400.0 3500.0 -1800.0 2400.0 2900.0 3100.0 3300.0 3400.0 -1200.0 1800.0 2300.0 2400.0 3000.0 3100.0 -1300.0 1600.0 2400.0 2500.0 3100.0 3200.0 -1400.0 1800.0 2400.0 2500.0 3200.0 3400.0 -2000.0 2500.0 2700.0 3100.0 3300.0 3400.0 -1900.0 2000.0 2400.0 2800.0 3100.0 3300.0 -1500.0 1800.0 1900.0 2500.0 3100.0 3200.0 -1600.0 1800.0 2000.0 2600.0 3100.0 3200.0 -1700.0 2000.0 2200.0 2700.0 3000.0 3100.0 -1700.0 2000.0 2300.0 2600.0 2900.0 3000.0 -2300.0 2400.0 2700.0 2900.0 3200.0 3300.0 -1200.0 1600.0 2200.0 2300.0 3000.0 3100.0 -1400.0 2000.0 2300.0 2500.0 3100.0 3200.0 -1500.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1300.0 1700.0 1800.0 2400.0 2900.0 3000.0 -1300.0 1500.0 1600.0 2200.0 2800.0 2900.0 -1900.0 2100.0 2500.0 2700.0 3000.0 3300.0 -1500.0 1900.0 2400.0 2600.0 2900.0 3300.0 -1400.0 1800.0 2300.0 2500.0 3100.0 3300.0 -1300.0 1800.0 2500.0 2700.0 3100.0 3300.0 -1300.0 1800.0 2400.0 2600.0 3100.0 3200.0 -1200.0 1700.0 2400.0 2500.0 2900.0 3100.0 -1100.0 1800.0 2000.0 2200.0 3000.0 3100.0 -1300.0 1600.0 1700.0 2600.0 3100.0 3200.0 -1700.0 1900.0 2200.0 2400.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2400.0 3000.0 3100.0 -1800.0 1900.0 2400.0 2500.0 3000.0 3100.0 -1500.0 2200.0 2500.0 2700.0 3300.0 3400.0 -1900.0 2500.0 2700.0 3000.0 3300.0 3400.0 -1400.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1400.0 1800.0 2100.0 2500.0 3000.0 3100.0 -1200.0 1500.0 1600.0 2600.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2300.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2200.0 3100.0 3200.0 -1200.0 1500.0 1600.0 2200.0 3100.0 3200.0 -1200.0 1500.0 1600.0 2300.0 3000.0 3100.0 -1300.0 1800.0 2400.0 2600.0 3000.0 3200.0 -1300.0 1800.0 2200.0 2400.0 3100.0 3300.0 -1400.0 1800.0 2200.0 2400.0 3100.0 3300.0 -1600.0 1700.0 2100.0 2300.0 2700.0 3100.0 -1700.0 1800.0 2100.0 2300.0 2700.0 3200.0 -1700.0 1800.0 2200.0 2300.0 2800.0 3200.0 -1700.0 2200.0 2400.0 2800.0 3100.0 3200.0 -1100.0 2000.0 2200.0 2400.0 3000.0 3100.0 -1100.0 1900.0 2000.0 2400.0 3000.0 3100.0 -1300.0 1500.0 1600.0 2700.0 3200.0 3300.0 -1300.0 1500.0 1600.0 2600.0 3300.0 3400.0 -1600.0 1700.0 2000.0 2600.0 3100.0 3200.0 -1700.0 2200.0 2500.0 2700.0 2900.0 3200.0 -1100.0 1700.0 2200.0 2300.0 3100.0 3200.0 -1100.0 1800.0 2100.0 2200.0 3100.0 3200.0 -1100.0 1600.0 2000.0 2100.0 3100.0 3200.0 -1100.0 1600.0 1900.0 2100.0 3100.0 3200.0 -1200.0 1600.0 1800.0 2000.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2000.0 3100.0 3200.0 -1300.0 1600.0 1700.0 2000.0 3000.0 3100.0 -1200.0 1500.0 1600.0 2000.0 3000.0 3100.0 -1500.0 1700.0 1900.0 2400.0 2800.0 2900.0 -1600.0 2000.0 2300.0 2600.0 2900.0 3100.0 -2200.0 2400.0 2700.0 2800.0 3100.0 3300.0 -1700.0 2100.0 2300.0 2400.0 2800.0 3200.0 -1600.0 1800.0 2300.0 2400.0 2800.0 3200.0 -1000.0 2000.0 2600.0 2700.0 3200.0 3300.0 -1000.0 1900.0 2800.0 2900.0 3300.0 3400.0 -1400.0 1600.0 1800.0 2400.0 2700.0 3000.0 -1800.0 2000.0 2300.0 2500.0 2900.0 3100.0 -1200.0 1800.0 2600.0 2700.0 3200.0 3300.0 -1300.0 1800.0 2400.0 2500.0 3000.0 3300.0 -1500.0 1900.0 2500.0 2700.0 3200.0 3400.0 -1400.0 1800.0 2500.0 2600.0 3100.0 3300.0 -1600.0 1800.0 2200.0 2300.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2400.0 2700.0 3100.0 -1700.0 1900.0 2200.0 2500.0 2700.0 3100.0 -1300.0 1400.0 2200.0 2800.0 3100.0 3200.0 -1700.0 2100.0 2300.0 2500.0 2800.0 3100.0 -1500.0 1600.0 2200.0 2700.0 2900.0 3100.0 -1200.0 1400.0 2200.0 2800.0 3000.0 3200.0 -1200.0 1400.0 2300.0 2800.0 3100.0 3200.0 -1900.0 2000.0 2600.0 2800.0 3100.0 3300.0 -1900.0 2100.0 2500.0 2800.0 3000.0 3300.0 -2100.0 2300.0 2500.0 2700.0 2900.0 3200.0 -1900.0 2000.0 2700.0 2900.0 3100.0 3400.0 -1900.0 2000.0 2600.0 2900.0 3200.0 3300.0 -1900.0 2000.0 2600.0 2900.0 3200.0 3400.0 -900.0 1500.0 2500.0 2600.0 3200.0 3400.0 -1800.0 1900.0 2400.0 2800.0 2900.0 3100.0 -1600.0 1900.0 2300.0 2600.0 2900.0 3100.0 -1400.0 1500.0 2000.0 2400.0 2900.0 3100.0 -1500.0 1800.0 2200.0 2400.0 2600.0 2800.0 -2000.0 2400.0 2800.0 2900.0 3100.0 3400.0 -1900.0 2300.0 2800.0 2900.0 3100.0 3300.0 -1200.0 1400.0 1900.0 2600.0 3100.0 3200.0 -2100.0 2300.0 2800.0 2900.0 3100.0 3200.0 -2000.0 2400.0 2600.0 2700.0 3100.0 3300.0 -2000.0 2400.0 2600.0 2700.0 3000.0 3200.0 -2000.0 2300.0 2600.0 2700.0 2900.0 3200.0 -1800.0 1900.0 2300.0 2600.0 2800.0 3000.0 -2000.0 2300.0 2500.0 2800.0 3000.0 3200.0 -1700.0 2000.0 2200.0 2600.0 2800.0 3000.0 -1900.0 2000.0 2400.0 2800.0 2900.0 3100.0 -2200.0 2600.0 2800.0 2900.0 3200.0 3400.0 -1600.0 1700.0 2200.0 2400.0 2700.0 3200.0 -1500.0 1600.0 2300.0 2400.0 2700.0 3200.0 -1300.0 1500.0 2200.0 2500.0 2700.0 3100.0 -1700.0 1800.0 2100.0 2200.0 2700.0 3200.0 -1900.0 2000.0 2600.0 2900.0 3000.0 3200.0 -1800.0 2100.0 2400.0 2500.0 2800.0 3100.0 -1400.0 1500.0 2200.0 2500.0 2700.0 3100.0 -1500.0 1600.0 2200.0 2400.0 2700.0 3100.0 -1700.0 1800.0 2300.0 2400.0 2700.0 3100.0 -1900.0 2000.0 2300.0 2500.0 2700.0 3100.0 -1900.0 2200.0 2400.0 2700.0 2800.0 3100.0 -1600.0 1700.0 2200.0 2600.0 2700.0 3100.0 -2100.0 2400.0 2600.0 2800.0 3000.0 3200.0 -2100.0 2300.0 2700.0 2800.0 3200.0 3400.0 -1800.0 2300.0 2600.0 2800.0 3000.0 3200.0 -2000.0 2200.0 2400.0 2700.0 3000.0 3300.0 -1900.0 2200.0 2400.0 2600.0 3000.0 3300.0 -1700.0 2000.0 2300.0 2600.0 2800.0 3000.0 -1600.0 1800.0 2100.0 2500.0 2700.0 3000.0 -1600.0 1700.0 2300.0 2600.0 2800.0 3000.0 -1600.0 1700.0 2400.0 2600.0 2800.0 3000.0 -2000.0 2300.0 2600.0 2700.0 3300.0 3400.0 -1700.0 1800.0 2100.0 2500.0 3000.0 3300.0 -1300.0 1500.0 2300.0 2400.0 3000.0 3300.0 -1500.0 1600.0 1900.0 2100.0 3000.0 3100.0 -1900.0 2000.0 2500.0 2800.0 3100.0 3200.0 -2000.0 2400.0 2900.0 3000.0 3200.0 3400.0 -1700.0 1800.0 2100.0 2500.0 2700.0 3100.0 -1500.0 2000.0 2400.0 2500.0 3000.0 3300.0 -1500.0 1600.0 2300.0 2400.0 2700.0 3100.0 -1600.0 1700.0 2300.0 2400.0 2700.0 3200.0 -1700.0 1800.0 2200.0 2500.0 2600.0 3000.0 -1800.0 1900.0 2200.0 2500.0 2700.0 3000.0 -1800.0 1900.0 2200.0 2600.0 2700.0 3000.0 -1800.0 2200.0 2500.0 2700.0 2900.0 3200.0 -1200.0 1600.0 2500.0 2600.0 3000.0 3300.0 -1000.0 1300.0 2400.0 2900.0 3100.0 3200.0 -1300.0 1600.0 2500.0 2800.0 3000.0 3200.0 -1800.0 2100.0 2600.0 2800.0 3000.0 3300.0 -1300.0 1600.0 2500.0 2800.0 2900.0 3200.0 -1200.0 1500.0 2300.0 2700.0 2900.0 3200.0 -1200.0 1400.0 2300.0 2700.0 2900.0 3200.0 -1400.0 1600.0 2100.0 2500.0 3100.0 3300.0 -1700.0 2300.0 2600.0 2800.0 3100.0 3200.0 -2000.0 2200.0 2400.0 2700.0 2800.0 3100.0 -1400.0 1500.0 2300.0 2800.0 3000.0 3100.0 -1500.0 1600.0 2300.0 2800.0 2900.0 3100.0 -1500.0 1600.0 2400.0 2800.0 2900.0 3100.0 -1700.0 1800.0 2200.0 2700.0 2800.0 3000.0 -1800.0 1900.0 2600.0 2700.0 2900.0 3200.0 -1800.0 2000.0 2700.0 2800.0 3200.0 3400.0 -1800.0 2000.0 2600.0 2800.0 3000.0 3300.0 -1700.0 1800.0 2400.0 2600.0 2900.0 3100.0 -2000.0 2200.0 2500.0 2600.0 3000.0 3100.0 -2000.0 2100.0 2500.0 2900.0 3200.0 3300.0 -1800.0 2000.0 2600.0 2900.0 3100.0 3300.0 -1700.0 1900.0 2200.0 2700.0 2800.0 3000.0 -1700.0 2000.0 2500.0 2600.0 3200.0 3300.0 -1400.0 1600.0 2300.0 2500.0 2700.0 3100.0 -1900.0 2300.0 2800.0 3000.0 3400.0 3500.0 -1600.0 1800.0 2300.0 2400.0 2800.0 3300.0 -1600.0 1700.0 2200.0 2400.0 2800.0 3000.0 -1600.0 1700.0 2300.0 2600.0 3000.0 3100.0 -1800.0 2100.0 2700.0 2900.0 3300.0 3500.0 -1600.0 1700.0 2300.0 2800.0 2900.0 3100.0 -1300.0 1500.0 2200.0 2700.0 2900.0 3100.0 -1200.0 1400.0 2500.0 2900.0 3000.0 3200.0 -1900.0 2200.0 2400.0 2700.0 3200.0 3400.0 -1800.0 2000.0 2600.0 2900.0 3100.0 3400.0 -1600.0 1700.0 2100.0 2600.0 2700.0 3100.0 -1500.0 1600.0 2300.0 2500.0 2700.0 3100.0 -1500.0 1600.0 2200.0 2800.0 3100.0 3300.0 -1300.0 1500.0 2000.0 2700.0 3100.0 3200.0 -1300.0 1500.0 1900.0 2600.0 3200.0 3300.0 -1300.0 1400.0 2000.0 2400.0 3200.0 3300.0 -1300.0 1400.0 2000.0 2300.0 3100.0 3300.0 -1300.0 1500.0 2000.0 2300.0 3100.0 3200.0 -1800.0 2000.0 2200.0 2400.0 3100.0 3300.0 -1700.0 1900.0 2300.0 2400.0 2800.0 3300.0 -1200.0 2200.0 2500.0 2700.0 3200.0 3300.0 -1300.0 2100.0 2300.0 2700.0 3200.0 3300.0 -1400.0 2200.0 2400.0 2900.0 3300.0 3400.0 -1500.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1200.0 1900.0 2400.0 2500.0 3000.0 3200.0 -1200.0 2000.0 2400.0 2600.0 3000.0 3200.0 -1200.0 1900.0 2400.0 2500.0 3200.0 3300.0 -2000.0 2300.0 2700.0 3000.0 3200.0 3400.0 -1900.0 2100.0 2600.0 3000.0 3300.0 3400.0 -1500.0 1900.0 2200.0 2600.0 3000.0 3300.0 -1400.0 1800.0 2200.0 2500.0 3000.0 3300.0 -1800.0 2000.0 2300.0 2400.0 3300.0 3400.0 -1600.0 2100.0 2300.0 2400.0 3100.0 3300.0 -1900.0 2300.0 2800.0 3000.0 3200.0 3400.0 -1700.0 2100.0 2400.0 2700.0 3100.0 3400.0 -1400.0 1800.0 2300.0 2600.0 3200.0 3400.0 -1700.0 2000.0 2200.0 2400.0 3100.0 3200.0 -1500.0 1800.0 2200.0 2500.0 3000.0 3300.0 -1700.0 1900.0 2200.0 2600.0 2900.0 3200.0 -1400.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1500.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1600.0 2100.0 2300.0 2700.0 3100.0 3200.0 -1600.0 1700.0 1900.0 2800.0 3000.0 3100.0 -1500.0 1700.0 1900.0 2600.0 3000.0 3100.0 -1500.0 1600.0 2100.0 2600.0 3200.0 3300.0 -2200.0 2300.0 2600.0 2900.0 3100.0 3300.0 -1900.0 2200.0 2400.0 2700.0 3000.0 3300.0 -1400.0 1700.0 2300.0 2400.0 3000.0 3100.0 -1900.0 2000.0 2400.0 2500.0 3100.0 3200.0 -2000.0 2500.0 2600.0 2800.0 3300.0 3400.0 -2000.0 2400.0 2600.0 3000.0 3200.0 3300.0 -1500.0 1800.0 2300.0 2500.0 2900.0 3200.0 -1300.0 1900.0 2200.0 2300.0 3000.0 3200.0 -1600.0 1700.0 2500.0 2800.0 3200.0 3400.0 -1500.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1900.0 2200.0 2500.0 2700.0 3000.0 3300.0 -1300.0 1600.0 1800.0 2100.0 3000.0 3100.0 -1000.0 1900.0 2200.0 2500.0 3100.0 3200.0 -1200.0 2000.0 2300.0 2600.0 3300.0 3400.0 -1400.0 1600.0 1800.0 2600.0 2900.0 3100.0 -1400.0 1700.0 2000.0 2600.0 3100.0 3200.0 -1300.0 1800.0 2000.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2300.0 2400.0 2700.0 3100.0 -1700.0 1800.0 2000.0 2400.0 3100.0 3200.0 -1800.0 1900.0 2100.0 2500.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2500.0 2800.0 3100.0 -1600.0 1800.0 2100.0 2400.0 2700.0 2800.0 -1300.0 1700.0 2100.0 2200.0 3100.0 3300.0 -1300.0 1700.0 2100.0 2200.0 3000.0 3200.0 -1500.0 1800.0 2200.0 2400.0 2700.0 3200.0 -1600.0 1800.0 2200.0 2300.0 2900.0 3200.0 -1500.0 1800.0 2100.0 2400.0 2900.0 3200.0 -1400.0 1700.0 1900.0 2200.0 2800.0 2900.0 -1500.0 1800.0 2100.0 2500.0 3000.0 3100.0 -1500.0 1900.0 2100.0 2500.0 3000.0 3100.0 -1500.0 2000.0 2200.0 2700.0 3200.0 3300.0 -1400.0 1800.0 2200.0 2500.0 3200.0 3300.0 -1500.0 2000.0 2200.0 2400.0 2900.0 3200.0 -1800.0 2000.0 2700.0 2900.0 3300.0 3400.0 -1500.0 1800.0 2100.0 2500.0 3200.0 3300.0 -1400.0 1700.0 1800.0 2200.0 3100.0 3200.0 -1400.0 1600.0 1700.0 2300.0 3000.0 3100.0 -1300.0 2000.0 2100.0 2700.0 3100.0 3200.0 -1400.0 1800.0 2200.0 2500.0 3100.0 3200.0 -1400.0 1700.0 1800.0 2300.0 3000.0 3100.0 -1600.0 1700.0 1900.0 2600.0 3000.0 3100.0 -1800.0 2100.0 2300.0 2700.0 3300.0 3400.0 -1700.0 2100.0 2300.0 2700.0 3300.0 3400.0 -1800.0 2100.0 2300.0 2400.0 2700.0 3100.0 -1500.0 1700.0 1900.0 2600.0 3100.0 3200.0 -1300.0 2000.0 2200.0 2800.0 3200.0 3300.0 -1700.0 1900.0 2600.0 2900.0 3200.0 3400.0 -1200.0 1800.0 2600.0 2700.0 3100.0 3200.0 -1900.0 2000.0 2200.0 2500.0 3200.0 3400.0 -1300.0 1700.0 2300.0 2400.0 2900.0 3200.0 -1200.0 1600.0 2200.0 2400.0 2800.0 3100.0 -1200.0 1800.0 2200.0 2600.0 3200.0 3300.0 -1300.0 1800.0 2300.0 2700.0 3300.0 3400.0 -1700.0 2000.0 2400.0 2500.0 3000.0 3200.0 -1600.0 1900.0 2200.0 2300.0 2900.0 3100.0 -1400.0 1700.0 1900.0 2400.0 3000.0 3100.0 -1600.0 1900.0 2400.0 2700.0 3300.0 3400.0 -1800.0 2300.0 2700.0 3000.0 3200.0 3400.0 -1300.0 1700.0 2300.0 2600.0 3000.0 3300.0 -1200.0 1800.0 2200.0 2600.0 3100.0 3300.0 -1700.0 2000.0 2400.0 2800.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2400.0 2600.0 3000.0 -1600.0 1700.0 2100.0 2400.0 2600.0 3000.0 -1700.0 1900.0 2200.0 2400.0 2800.0 3200.0 -1700.0 2100.0 2300.0 2700.0 2800.0 3000.0 -1600.0 1900.0 2100.0 2600.0 2900.0 3000.0 -1800.0 2000.0 2700.0 2800.0 3100.0 3400.0 -1500.0 1600.0 2200.0 2800.0 3000.0 3100.0 -1300.0 1500.0 2100.0 2700.0 3000.0 3100.0 -1500.0 1800.0 2300.0 2600.0 3000.0 3100.0 -1600.0 1700.0 2300.0 2700.0 2900.0 3000.0 -1600.0 1800.0 2200.0 2600.0 2800.0 3100.0 -1500.0 1600.0 2300.0 2600.0 2900.0 3100.0 -1600.0 1800.0 2200.0 2700.0 3000.0 3300.0 -2100.0 2200.0 2600.0 2700.0 2900.0 3100.0 -1800.0 1900.0 2300.0 2700.0 2800.0 3000.0 -1800.0 1900.0 2200.0 2700.0 2800.0 3000.0 -1500.0 1800.0 2000.0 2600.0 3000.0 3100.0 -1500.0 1700.0 2100.0 2500.0 2700.0 3000.0 -1500.0 1600.0 1900.0 2000.0 2400.0 3100.0 -1200.0 1500.0 2100.0 2200.0 2700.0 3200.0 -1300.0 1700.0 2400.0 2700.0 3000.0 3200.0 -1600.0 1700.0 2400.0 2800.0 2900.0 3200.0 -1500.0 1800.0 2000.0 2500.0 2900.0 3200.0 -1800.0 2000.0 2200.0 2500.0 2700.0 3000.0 -1800.0 1900.0 2300.0 2600.0 2700.0 3200.0 -1500.0 1700.0 2200.0 2700.0 2900.0 3200.0 -1300.0 1400.0 2100.0 2600.0 3000.0 3200.0 -1400.0 1500.0 2100.0 2700.0 3000.0 3200.0 -1500.0 1600.0 2300.0 2800.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2600.0 2900.0 3300.0 -1600.0 1700.0 2100.0 2400.0 2900.0 3300.0 -1500.0 1600.0 1900.0 2100.0 2500.0 3100.0 -1700.0 1900.0 2100.0 2400.0 2700.0 3100.0 -1400.0 1500.0 2100.0 2800.0 3100.0 3200.0 -1400.0 1600.0 2100.0 2800.0 3000.0 3200.0 -1700.0 1800.0 2100.0 2700.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2600.0 2700.0 3000.0 -1500.0 1600.0 2100.0 2600.0 2700.0 3100.0 -1600.0 1700.0 2000.0 2500.0 2900.0 3200.0 -1900.0 2000.0 2300.0 2400.0 2700.0 3100.0 -1900.0 2100.0 2300.0 2500.0 2700.0 3100.0 -1900.0 2100.0 2400.0 2600.0 2800.0 3100.0 -1700.0 2200.0 2400.0 2700.0 3100.0 3200.0 -1600.0 2000.0 2600.0 2900.0 3200.0 3300.0 -2000.0 2100.0 2300.0 2500.0 2800.0 3100.0 -1800.0 1900.0 2200.0 2400.0 2800.0 3200.0 -1900.0 2100.0 2700.0 2900.0 3200.0 3400.0 -1800.0 2100.0 2300.0 2800.0 2900.0 3100.0 -1800.0 2000.0 2200.0 2700.0 2900.0 3000.0 -1800.0 1900.0 2200.0 2700.0 2900.0 3000.0 -2100.0 2200.0 2600.0 2800.0 3000.0 3200.0 -1600.0 1700.0 2100.0 2400.0 2700.0 3100.0 -1800.0 2000.0 2200.0 2300.0 2600.0 3100.0 -1700.0 1900.0 2300.0 2600.0 2700.0 3000.0 -1800.0 2000.0 2300.0 2500.0 2900.0 3200.0 -1200.0 1400.0 2300.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2300.0 2800.0 3000.0 3200.0 -1600.0 1800.0 2300.0 2700.0 3000.0 3100.0 -1700.0 1800.0 2300.0 2700.0 2900.0 3000.0 -1400.0 1500.0 2000.0 2200.0 2900.0 3200.0 -2000.0 2300.0 2400.0 2700.0 2900.0 3100.0 -1400.0 2100.0 2400.0 2800.0 3100.0 3200.0 -1500.0 1600.0 1900.0 2100.0 2900.0 3200.0 -1500.0 1700.0 2400.0 2600.0 3000.0 3200.0 -1300.0 1500.0 2300.0 2700.0 3100.0 3300.0 -1600.0 2100.0 2300.0 2600.0 3000.0 3200.0 -1900.0 2300.0 2400.0 2700.0 3000.0 3100.0 -1700.0 2300.0 2600.0 2900.0 3200.0 3300.0 -1700.0 2000.0 2200.0 2600.0 2800.0 3100.0 -1800.0 1900.0 2200.0 2600.0 2800.0 3100.0 -2000.0 2100.0 2500.0 2800.0 3000.0 3300.0 -2000.0 2100.0 2700.0 2900.0 3100.0 3300.0 -2100.0 2300.0 2800.0 2900.0 3100.0 3300.0 -1800.0 1900.0 2100.0 2500.0 2800.0 3200.0 -1700.0 1800.0 2200.0 2500.0 2700.0 3000.0 -1500.0 1700.0 2100.0 2500.0 2800.0 3100.0 -1800.0 2100.0 2400.0 2900.0 3200.0 3300.0 -1800.0 2100.0 2700.0 2900.0 3100.0 3300.0 -1700.0 2000.0 2200.0 2500.0 2800.0 3100.0 -1300.0 1900.0 2200.0 2600.0 2800.0 3000.0 -1400.0 1900.0 2300.0 2700.0 2900.0 3200.0 -1800.0 2200.0 2500.0 2800.0 3000.0 3100.0 -1800.0 2300.0 2600.0 2700.0 3000.0 3200.0 -1500.0 1700.0 2200.0 2500.0 2800.0 3100.0 -1500.0 1700.0 2100.0 2600.0 2800.0 3100.0 -1400.0 1500.0 1900.0 2700.0 3100.0 3200.0 -2000.0 2500.0 2900.0 3100.0 3300.0 3400.0 -1200.0 1800.0 2400.0 2700.0 3100.0 3300.0 -1700.0 1900.0 2100.0 2500.0 2700.0 3100.0 -1500.0 2300.0 2500.0 2700.0 2900.0 3100.0 -1700.0 1800.0 2200.0 2600.0 2700.0 3000.0 -1800.0 1900.0 2300.0 2500.0 2700.0 3100.0 -1900.0 2000.0 2300.0 2600.0 3000.0 3300.0 -1400.0 1600.0 2200.0 2600.0 2800.0 3200.0 -1400.0 1700.0 2300.0 2600.0 3000.0 3100.0 -1500.0 1700.0 2100.0 2500.0 2800.0 3200.0 -2200.0 2600.0 2900.0 3100.0 3400.0 3500.0 -2200.0 2500.0 2900.0 3100.0 3300.0 3500.0 -1800.0 2100.0 2400.0 2900.0 3100.0 3300.0 -1600.0 1800.0 2300.0 2600.0 2900.0 3100.0 -1200.0 1400.0 2200.0 2400.0 3000.0 3200.0 -1300.0 1700.0 2100.0 2400.0 2900.0 3100.0 -1600.0 1700.0 2100.0 2200.0 3000.0 3200.0 -1500.0 1600.0 2500.0 2800.0 3100.0 3300.0 -1400.0 1600.0 2300.0 2700.0 3000.0 3300.0 -1400.0 1600.0 2200.0 2500.0 2900.0 3100.0 -1300.0 1600.0 2300.0 2600.0 3100.0 3300.0 -1600.0 1700.0 2200.0 2400.0 2900.0 3200.0 -1700.0 1800.0 2100.0 2300.0 3000.0 3300.0 -1300.0 1400.0 2300.0 2600.0 2900.0 3200.0 -1300.0 1500.0 2300.0 2500.0 2900.0 3200.0 -1800.0 1900.0 2200.0 2400.0 2700.0 3100.0 -1800.0 1900.0 2200.0 2400.0 2800.0 3100.0 -1600.0 1700.0 2200.0 2400.0 2700.0 3100.0 -1400.0 1600.0 2200.0 2500.0 3000.0 3300.0 -1500.0 1700.0 2200.0 2400.0 3000.0 3400.0 -1600.0 1700.0 2200.0 2500.0 2700.0 3200.0 -1700.0 1800.0 2100.0 2200.0 2800.0 3200.0 -1600.0 1700.0 2100.0 2200.0 3100.0 3300.0 -1500.0 1600.0 2100.0 2200.0 3100.0 3300.0 -1000.0 1800.0 2200.0 2500.0 3100.0 3300.0 -1100.0 1700.0 2200.0 2500.0 3000.0 3200.0 -1400.0 1800.0 2100.0 2400.0 2800.0 3000.0 -1500.0 1800.0 2500.0 2700.0 3000.0 3200.0 -1900.0 2500.0 2800.0 3000.0 3400.0 3500.0 -2000.0 2500.0 2900.0 3200.0 3400.0 3500.0 -1400.0 1700.0 2300.0 2500.0 3000.0 3300.0 -1400.0 1900.0 2300.0 2500.0 3000.0 3200.0 -1400.0 2000.0 2300.0 2600.0 2900.0 3100.0 -1400.0 1900.0 2200.0 2500.0 2700.0 3100.0 -1600.0 1800.0 2000.0 2400.0 3000.0 3200.0 -1300.0 1800.0 2400.0 2700.0 3100.0 3300.0 -1400.0 1600.0 2400.0 2600.0 3100.0 3200.0 -1400.0 1500.0 1600.0 2400.0 3200.0 3300.0 -1900.0 2300.0 2600.0 2900.0 3100.0 3200.0 -1100.0 1700.0 2500.0 2600.0 3100.0 3300.0 -1300.0 1700.0 2400.0 2500.0 3000.0 3300.0 -1400.0 1700.0 2400.0 2500.0 3000.0 3400.0 -1400.0 1600.0 2400.0 2500.0 2900.0 3400.0 -1400.0 1700.0 2400.0 2500.0 3100.0 3400.0 -1500.0 1600.0 2300.0 2600.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2400.0 3000.0 3200.0 -1600.0 1800.0 2200.0 2300.0 3000.0 3100.0 -1500.0 1900.0 2400.0 2700.0 3000.0 3200.0 -1300.0 1800.0 2400.0 2700.0 3300.0 3400.0 -1400.0 1700.0 2200.0 2500.0 2900.0 3200.0 -1800.0 2100.0 2500.0 2700.0 3100.0 3400.0 -1000.0 1500.0 1800.0 2200.0 3000.0 3100.0 -2100.0 2600.0 2900.0 3100.0 3300.0 3400.0 -1900.0 2000.0 2200.0 2500.0 3100.0 3300.0 -1700.0 1900.0 2300.0 2600.0 2900.0 3300.0 -1600.0 1800.0 2000.0 2200.0 3100.0 3300.0 -1300.0 1700.0 2300.0 2600.0 3100.0 3200.0 -1400.0 2100.0 2400.0 2700.0 3100.0 3300.0 -1200.0 1500.0 2200.0 2600.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2500.0 3000.0 3100.0 -1600.0 1900.0 2300.0 2500.0 3000.0 3100.0 -1500.0 1800.0 2600.0 2800.0 3200.0 3400.0 -1600.0 1700.0 2300.0 2500.0 3100.0 3400.0 -1500.0 1600.0 2300.0 2600.0 3100.0 3400.0 -1200.0 1500.0 2500.0 2600.0 3100.0 3400.0 -1200.0 1500.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1600.0 2500.0 2600.0 3100.0 3300.0 -1900.0 2300.0 2600.0 2900.0 3400.0 3500.0 -900.0 1500.0 2600.0 2700.0 3100.0 3200.0 -2100.0 2500.0 2900.0 3100.0 3300.0 3400.0 -1400.0 2100.0 2300.0 2500.0 3000.0 3300.0 -1200.0 1600.0 1700.0 2300.0 3100.0 3200.0 -1100.0 1800.0 2200.0 2600.0 3000.0 3200.0 -1500.0 2000.0 2400.0 2700.0 3100.0 3200.0 -2000.0 2100.0 2400.0 2600.0 2900.0 3300.0 -1400.0 2100.0 2500.0 2700.0 3100.0 3200.0 -1200.0 1600.0 2300.0 2500.0 3000.0 3200.0 -1500.0 1600.0 2300.0 2500.0 3100.0 3200.0 -2300.0 2500.0 2700.0 2800.0 3100.0 3300.0 -2200.0 2300.0 2500.0 2700.0 3100.0 3200.0 -1300.0 1900.0 2300.0 2500.0 2800.0 3000.0 -1200.0 1800.0 2300.0 2500.0 3000.0 3300.0 -1400.0 1600.0 2400.0 2600.0 3200.0 3400.0 -1500.0 1600.0 2300.0 2500.0 3100.0 3400.0 -1400.0 1900.0 2400.0 2500.0 2700.0 3100.0 -1200.0 1600.0 2200.0 2600.0 3100.0 3300.0 -1300.0 1600.0 2300.0 2600.0 3100.0 3400.0 -1500.0 1600.0 2200.0 2500.0 3100.0 3400.0 -1600.0 2000.0 2500.0 2700.0 3000.0 3200.0 -1600.0 1700.0 2000.0 2300.0 3000.0 3200.0 -1400.0 1700.0 1800.0 2300.0 3100.0 3200.0 -2100.0 2200.0 2400.0 2600.0 3200.0 3300.0 -1600.0 1900.0 2400.0 2500.0 2700.0 3200.0 -2200.0 2300.0 2500.0 2700.0 3100.0 3300.0 -2200.0 2300.0 2600.0 2700.0 3100.0 3300.0 -1400.0 1800.0 2300.0 2500.0 2800.0 3200.0 -1600.0 1800.0 2300.0 2500.0 2700.0 3100.0 -1400.0 1600.0 1800.0 2500.0 2900.0 3000.0 -1400.0 1600.0 1900.0 2600.0 3000.0 3200.0 -1500.0 1700.0 2000.0 2600.0 3000.0 3200.0 -1400.0 1700.0 2400.0 2500.0 3100.0 3300.0 -2300.0 2400.0 2700.0 3000.0 3200.0 3400.0 -1300.0 1700.0 2100.0 2300.0 3100.0 3200.0 -1300.0 1700.0 2100.0 2300.0 3000.0 3100.0 -1300.0 1700.0 2000.0 2200.0 3000.0 3100.0 -1400.0 1700.0 1900.0 2300.0 3000.0 3100.0 -1400.0 1600.0 1800.0 2300.0 2900.0 3000.0 -1300.0 1800.0 2400.0 2600.0 3000.0 3300.0 -2200.0 2300.0 2500.0 2800.0 3000.0 3200.0 -1900.0 2200.0 2400.0 2600.0 2900.0 3300.0 -1900.0 2100.0 2400.0 2600.0 3200.0 3400.0 -1900.0 2400.0 2600.0 2800.0 3200.0 3400.0 -1800.0 2100.0 2500.0 2600.0 3200.0 3400.0 -1500.0 1900.0 2400.0 2600.0 2900.0 3100.0 -1200.0 1600.0 2300.0 2500.0 3200.0 3300.0 -1100.0 1400.0 2300.0 2400.0 3000.0 3300.0 -1000.0 1800.0 2400.0 2500.0 3300.0 3400.0 -1000.0 1700.0 2400.0 2500.0 3300.0 3400.0 -2000.0 2400.0 2800.0 3000.0 3300.0 3500.0 -1400.0 2100.0 2500.0 2700.0 3300.0 3400.0 -1200.0 1900.0 2500.0 2600.0 3200.0 3300.0 -1400.0 2000.0 2500.0 2600.0 3100.0 3300.0 -1800.0 2200.0 2700.0 3000.0 3300.0 3500.0 -1700.0 2200.0 2400.0 2700.0 3100.0 3300.0 -1000.0 2000.0 2300.0 2400.0 3300.0 3400.0 -1400.0 1900.0 2400.0 2600.0 3300.0 3400.0 -1300.0 1800.0 2400.0 2500.0 3100.0 3300.0 -1600.0 2000.0 2500.0 2600.0 3200.0 3300.0 -2100.0 2500.0 2700.0 3000.0 3200.0 3400.0 -1600.0 2000.0 2300.0 2400.0 3200.0 3300.0 -1400.0 1700.0 1900.0 2100.0 3300.0 3400.0 -1500.0 1700.0 2000.0 2200.0 3200.0 3300.0 -1500.0 1800.0 2200.0 2300.0 2600.0 2900.0 -1600.0 1700.0 2300.0 2500.0 2800.0 3000.0 -1600.0 1700.0 2200.0 2300.0 2900.0 3200.0 -1300.0 1500.0 2300.0 2400.0 2800.0 3200.0 -1400.0 1700.0 2300.0 2400.0 3000.0 3200.0 -1600.0 1700.0 2100.0 2300.0 2900.0 3300.0 -1500.0 2100.0 2300.0 2600.0 3100.0 3300.0 -1100.0 1500.0 2200.0 2300.0 3100.0 3300.0 -1000.0 1800.0 2300.0 2400.0 3100.0 3200.0 -900.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1000.0 1800.0 2400.0 2500.0 3100.0 3200.0 -1700.0 2200.0 2500.0 2900.0 3400.0 3500.0 -1300.0 1900.0 2300.0 2400.0 3300.0 3400.0 -1100.0 1900.0 2300.0 2400.0 3200.0 3300.0 -1200.0 1700.0 2300.0 2400.0 3200.0 3400.0 -1300.0 1700.0 2300.0 2500.0 3200.0 3300.0 -1200.0 1500.0 2200.0 2300.0 3000.0 3200.0 -1200.0 1800.0 2200.0 2300.0 3000.0 3200.0 -1000.0 1800.0 2400.0 2500.0 3100.0 3300.0 -900.0 1800.0 2600.0 2700.0 3300.0 3400.0 -900.0 1900.0 2700.0 2800.0 3300.0 3400.0 -1800.0 2400.0 2700.0 3100.0 3400.0 3500.0 -1400.0 1600.0 2200.0 2400.0 2900.0 3200.0 -1700.0 2300.0 2500.0 2700.0 3300.0 3400.0 -1400.0 1900.0 2400.0 2600.0 3200.0 3400.0 -1300.0 1500.0 2200.0 2400.0 2700.0 3100.0 -1500.0 1600.0 2000.0 2200.0 2900.0 3100.0 -1500.0 1600.0 1800.0 1900.0 2800.0 3300.0 -1700.0 1800.0 2000.0 2300.0 3000.0 3300.0 -2200.0 2400.0 2600.0 2700.0 3300.0 3400.0 -1700.0 1900.0 2300.0 2400.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2400.0 2700.0 3100.0 -1700.0 2300.0 2600.0 3000.0 3300.0 3400.0 -2200.0 2300.0 2500.0 2700.0 3100.0 3400.0 -1600.0 1800.0 2000.0 2200.0 3200.0 3300.0 -2100.0 2500.0 2700.0 2900.0 3400.0 3500.0 -2100.0 2400.0 2600.0 2700.0 3100.0 3300.0 -2100.0 2400.0 2700.0 3100.0 3300.0 3400.0 -1400.0 1700.0 2200.0 2600.0 2900.0 3200.0 -1000.0 1900.0 2200.0 2400.0 3100.0 3200.0 -1100.0 1600.0 2500.0 2600.0 3100.0 3300.0 -1300.0 1600.0 2200.0 2300.0 2800.0 3300.0 -1000.0 2000.0 2500.0 2600.0 3300.0 3400.0 -1700.0 2200.0 2400.0 2700.0 3200.0 3400.0 -1200.0 2000.0 2400.0 2500.0 3100.0 3200.0 -1100.0 1700.0 2100.0 2200.0 3000.0 3200.0 -1100.0 1600.0 2100.0 2200.0 3100.0 3300.0 -1100.0 1600.0 2200.0 2300.0 3200.0 3300.0 -1300.0 1700.0 2300.0 2400.0 3300.0 3400.0 -1300.0 1800.0 2300.0 2400.0 3300.0 3400.0 -1000.0 1800.0 2300.0 2400.0 3100.0 3300.0 -1400.0 2000.0 2300.0 2500.0 2900.0 3200.0 -1100.0 1900.0 2400.0 2500.0 3100.0 3200.0 -1000.0 2000.0 2600.0 2700.0 3300.0 3400.0 -1200.0 1600.0 2200.0 2300.0 3100.0 3300.0 -1300.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1000.0 1700.0 2400.0 2600.0 3300.0 3400.0 -1000.0 1700.0 2400.0 2600.0 3200.0 3300.0 -2000.0 2400.0 2700.0 3100.0 3300.0 3400.0 -1500.0 1900.0 2200.0 2400.0 3200.0 3300.0 -1400.0 1700.0 2100.0 2200.0 3100.0 3300.0 -2200.0 2400.0 2600.0 2900.0 3300.0 3400.0 -1300.0 1900.0 2100.0 2500.0 3000.0 3200.0 -1900.0 2100.0 2300.0 2400.0 3000.0 3300.0 -1100.0 2200.0 2600.0 2700.0 3300.0 3400.0 -1700.0 1900.0 2400.0 2500.0 3000.0 3400.0 -1800.0 2100.0 2600.0 2900.0 3100.0 3400.0 -1900.0 2300.0 2900.0 3100.0 3300.0 3400.0 -1900.0 2400.0 2600.0 3000.0 3300.0 3500.0 -1400.0 2100.0 2400.0 2500.0 2700.0 3000.0 -1300.0 1600.0 1900.0 2100.0 2900.0 3000.0 -1900.0 2000.0 2200.0 2300.0 3000.0 3300.0 -1300.0 1600.0 2200.0 2500.0 3000.0 3300.0 -1100.0 1800.0 2300.0 2500.0 3100.0 3300.0 -1100.0 1700.0 2300.0 2500.0 3000.0 3200.0 -1200.0 1600.0 2300.0 2400.0 3000.0 3200.0 -1300.0 1600.0 2200.0 2400.0 2900.0 3200.0 -1800.0 2300.0 2600.0 3000.0 3300.0 3500.0 -1500.0 2000.0 2400.0 2700.0 3200.0 3400.0 -1800.0 2000.0 2200.0 2500.0 2800.0 3000.0 -1800.0 2100.0 2300.0 2400.0 2700.0 3000.0 -1800.0 2100.0 2300.0 2500.0 2900.0 3200.0 -1700.0 1900.0 2100.0 2700.0 2900.0 3200.0 -1800.0 2100.0 2300.0 2600.0 2900.0 3000.0 -1600.0 1800.0 2100.0 2400.0 2600.0 2900.0 -1800.0 1900.0 2400.0 2800.0 3000.0 3100.0 -2000.0 2400.0 2700.0 2900.0 3200.0 3400.0 -1900.0 2100.0 2800.0 2900.0 3200.0 3400.0 -2000.0 2100.0 2500.0 2800.0 2900.0 3100.0 -1800.0 1900.0 2500.0 2600.0 2900.0 3300.0 -1600.0 1700.0 2000.0 2100.0 3000.0 3200.0 -1600.0 1700.0 2000.0 2100.0 2900.0 3200.0 -2000.0 2200.0 2400.0 2800.0 3100.0 3300.0 -2100.0 2300.0 2800.0 2900.0 3300.0 3400.0 -1900.0 2000.0 2300.0 2400.0 2900.0 3100.0 -1500.0 1800.0 2300.0 2500.0 3000.0 3300.0 -1200.0 1800.0 2500.0 2600.0 2900.0 3000.0 -1400.0 1700.0 2200.0 2600.0 2900.0 3000.0 -1500.0 1700.0 2200.0 2600.0 3000.0 3100.0 -1700.0 1800.0 2100.0 2400.0 2900.0 3200.0 -1800.0 1900.0 2200.0 2600.0 2900.0 3200.0 -1800.0 2000.0 2200.0 2400.0 2800.0 3100.0 -1400.0 1600.0 1900.0 2100.0 2700.0 3200.0 -1500.0 2000.0 2200.0 2500.0 3000.0 3200.0 -1700.0 1800.0 2000.0 2200.0 3100.0 3300.0 -1800.0 1900.0 2100.0 2400.0 3000.0 3100.0 -1800.0 2100.0 2400.0 2600.0 3000.0 3100.0 -2000.0 2300.0 2600.0 2800.0 3000.0 3300.0 -2100.0 2300.0 2800.0 2900.0 3200.0 3400.0 -1800.0 1900.0 2500.0 2800.0 3100.0 3200.0 -1800.0 2000.0 2200.0 2500.0 2900.0 3000.0 -1700.0 1800.0 2100.0 2700.0 2900.0 3000.0 -1700.0 1800.0 2600.0 2800.0 3100.0 3300.0 -1600.0 2000.0 2300.0 2800.0 3100.0 3300.0 -1500.0 1600.0 1900.0 2000.0 2900.0 3200.0 -2100.0 2300.0 2700.0 2800.0 3000.0 3200.0 -2000.0 2200.0 2400.0 2600.0 3100.0 3200.0 -1800.0 2100.0 2400.0 2500.0 3000.0 3200.0 -1800.0 2100.0 2500.0 2600.0 2900.0 3200.0 -2100.0 2400.0 2800.0 2900.0 3300.0 3400.0 -1800.0 2000.0 2300.0 2600.0 3100.0 3400.0 -1700.0 2000.0 2300.0 2600.0 2900.0 3300.0 -1800.0 1900.0 2300.0 2500.0 2800.0 3000.0 -1400.0 1600.0 2200.0 2500.0 2900.0 3300.0 -1600.0 1700.0 2100.0 2300.0 2600.0 3100.0 -1700.0 1800.0 2100.0 2500.0 2800.0 3200.0 -1500.0 1600.0 2200.0 2700.0 2800.0 3200.0 -2100.0 2300.0 2700.0 2800.0 3100.0 3300.0 -1600.0 1700.0 2000.0 2400.0 3000.0 3300.0 -1500.0 1600.0 2600.0 2800.0 3100.0 3300.0 -1800.0 2000.0 2400.0 2600.0 2900.0 3100.0 -1700.0 1800.0 2300.0 2500.0 2600.0 3100.0 -1500.0 1800.0 2100.0 2500.0 2900.0 3300.0 -1600.0 1800.0 2100.0 2500.0 3000.0 3300.0 -1700.0 1800.0 2300.0 2400.0 2800.0 3100.0 -1600.0 1700.0 2000.0 2300.0 2800.0 3100.0 -1700.0 1800.0 2200.0 2400.0 2700.0 3100.0 -2000.0 2500.0 2800.0 3000.0 3400.0 3500.0 -1900.0 2400.0 2800.0 2900.0 3400.0 3500.0 -1600.0 1700.0 2400.0 2700.0 2900.0 3100.0 -1600.0 1700.0 2500.0 2600.0 2900.0 3100.0 -1500.0 1700.0 2200.0 2600.0 2900.0 3100.0 -1700.0 2000.0 2200.0 2500.0 2900.0 3200.0 -1500.0 1700.0 2200.0 2700.0 3200.0 3300.0 -1400.0 1500.0 2100.0 2500.0 3000.0 3200.0 -1200.0 1500.0 2200.0 2400.0 2800.0 3200.0 -1500.0 1600.0 2000.0 2100.0 2900.0 3200.0 -1800.0 1900.0 2100.0 2500.0 2900.0 3200.0 -1500.0 1800.0 2300.0 2500.0 2800.0 3200.0 -1500.0 1800.0 2500.0 2800.0 3100.0 3300.0 -1300.0 1800.0 2500.0 2600.0 3000.0 3100.0 -1600.0 1800.0 2300.0 2700.0 2900.0 3000.0 -1500.0 1600.0 2200.0 2400.0 2600.0 3100.0 -1600.0 2000.0 2500.0 2600.0 3000.0 3300.0 -1500.0 1600.0 2000.0 2600.0 2800.0 3000.0 -1500.0 1600.0 2200.0 2600.0 2700.0 3000.0 -1200.0 1600.0 2200.0 2400.0 3000.0 3200.0 -1800.0 2300.0 2500.0 2800.0 3000.0 3100.0 -1500.0 1600.0 2500.0 2800.0 2900.0 3200.0 -1300.0 1500.0 2300.0 2800.0 3100.0 3200.0 -1700.0 1800.0 2100.0 2500.0 2800.0 3000.0 -1400.0 1800.0 2200.0 2600.0 3000.0 3200.0 -1500.0 1700.0 2000.0 2700.0 3100.0 3200.0 -1400.0 1600.0 2300.0 2600.0 3000.0 3300.0 -1700.0 2100.0 2700.0 2900.0 3300.0 3500.0 -1700.0 1800.0 2300.0 2700.0 2800.0 3100.0 -1600.0 1800.0 2200.0 2600.0 2700.0 3000.0 -1900.0 2300.0 2400.0 2600.0 2800.0 3100.0 -1300.0 1600.0 2100.0 2200.0 3100.0 3300.0 -1500.0 1800.0 2400.0 2700.0 3000.0 3100.0 -1600.0 1800.0 2000.0 2600.0 2900.0 3000.0 -1600.0 1800.0 2100.0 2700.0 2900.0 3000.0 -1600.0 1700.0 2300.0 2700.0 3000.0 3100.0 -1700.0 1800.0 2400.0 2700.0 2900.0 3100.0 -1800.0 1900.0 2500.0 2600.0 3000.0 3100.0 -1700.0 1800.0 2100.0 2400.0 2700.0 3200.0 -1700.0 2000.0 2200.0 2500.0 2800.0 3000.0 -2000.0 2400.0 2500.0 2700.0 3000.0 3100.0 -1800.0 2000.0 2600.0 2700.0 3100.0 3200.0 -2200.0 2400.0 2700.0 2900.0 3100.0 3300.0 -2300.0 2500.0 2700.0 2900.0 3100.0 3300.0 -1800.0 2200.0 2300.0 2600.0 3000.0 3100.0 -1700.0 2100.0 2300.0 2800.0 3100.0 3200.0 -2000.0 2400.0 2600.0 2800.0 3000.0 3200.0 -1500.0 2000.0 2200.0 2600.0 3100.0 3300.0 -1100.0 1600.0 2200.0 2600.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2500.0 2700.0 3000.0 -1900.0 2300.0 2400.0 2600.0 2800.0 3000.0 -1700.0 2100.0 2300.0 2600.0 2900.0 3000.0 -1600.0 1700.0 2000.0 2200.0 2600.0 3100.0 -1600.0 1900.0 2200.0 2400.0 3000.0 3100.0 -1300.0 2000.0 2300.0 2600.0 3100.0 3300.0 -1600.0 2100.0 2300.0 2600.0 2900.0 3000.0 -1700.0 2100.0 2300.0 2500.0 2800.0 3000.0 -1600.0 2100.0 2300.0 2500.0 2800.0 3000.0 -1500.0 1800.0 2000.0 2300.0 2800.0 2900.0 -1300.0 1600.0 2300.0 2600.0 2900.0 3200.0 -1200.0 1700.0 2100.0 2600.0 3100.0 3300.0 -1800.0 2200.0 2600.0 2700.0 3200.0 3300.0 -1600.0 1700.0 1900.0 2100.0 3100.0 3200.0 -1500.0 2000.0 2300.0 2500.0 3000.0 3300.0 -1600.0 1700.0 2000.0 2500.0 2700.0 2900.0 -1600.0 1800.0 2100.0 2500.0 2900.0 3000.0 -1600.0 1700.0 2100.0 2500.0 2700.0 2900.0 -1600.0 1700.0 2200.0 2500.0 2700.0 2900.0 -1500.0 1700.0 2000.0 2600.0 2800.0 3000.0 -1200.0 1600.0 2200.0 2400.0 2800.0 3000.0 -1800.0 2200.0 2400.0 2600.0 2800.0 3000.0 -1700.0 2000.0 2200.0 2500.0 2700.0 3100.0 -1700.0 2000.0 2200.0 2500.0 2700.0 3000.0 -1600.0 1900.0 2300.0 2600.0 2800.0 3200.0 -1200.0 1400.0 2000.0 2600.0 2800.0 3000.0 -1400.0 1600.0 2200.0 2600.0 3000.0 3300.0 -1500.0 1700.0 2200.0 2400.0 2700.0 2900.0 -1600.0 1700.0 2200.0 2500.0 2800.0 3000.0 -1600.0 1700.0 2100.0 2400.0 2700.0 3000.0 -1900.0 2100.0 2400.0 2600.0 3000.0 3100.0 -1900.0 2500.0 2700.0 2800.0 3100.0 3200.0 -1800.0 2200.0 2500.0 2600.0 3000.0 3200.0 -1900.0 2200.0 2400.0 2500.0 2800.0 3100.0 -1800.0 2100.0 2300.0 2500.0 2700.0 3000.0 -2000.0 2300.0 2400.0 2600.0 2900.0 3100.0 -1400.0 1600.0 1800.0 1900.0 2700.0 3200.0 -1400.0 1600.0 1700.0 1900.0 2800.0 3100.0 -2100.0 2200.0 2600.0 3000.0 3200.0 3300.0 -1700.0 2000.0 2200.0 2400.0 2700.0 2900.0 -1500.0 1600.0 1900.0 2400.0 2600.0 2700.0 -1600.0 1700.0 2000.0 2400.0 2600.0 2800.0 -1900.0 2000.0 2500.0 2800.0 2900.0 3200.0 -1500.0 1600.0 1900.0 2100.0 2700.0 3200.0 -1500.0 1700.0 2000.0 2200.0 2900.0 3300.0 -1800.0 2000.0 2700.0 2800.0 3200.0 3300.0 -1700.0 1800.0 2400.0 2700.0 3300.0 3400.0 -1600.0 1900.0 2500.0 2700.0 3300.0 3400.0 -1200.0 1800.0 2100.0 2400.0 3100.0 3200.0 -1200.0 1800.0 2100.0 2500.0 3200.0 3300.0 -1600.0 1700.0 2200.0 2600.0 2900.0 3200.0 -1800.0 2200.0 2500.0 2600.0 3200.0 3400.0 -1000.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1100.0 2000.0 2600.0 2700.0 3200.0 3300.0 -1300.0 1800.0 2500.0 2700.0 3200.0 3300.0 -1400.0 1700.0 1800.0 2400.0 3000.0 3100.0 -1500.0 1800.0 2000.0 2400.0 3100.0 3200.0 -1200.0 1400.0 1500.0 2300.0 3100.0 3200.0 -2100.0 2200.0 2500.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2100.0 2400.0 2900.0 3100.0 -1400.0 1500.0 2100.0 2400.0 2800.0 3200.0 -1100.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1200.0 2000.0 2300.0 2700.0 3100.0 3200.0 -1300.0 1700.0 2200.0 2500.0 2900.0 3000.0 -1400.0 1700.0 1900.0 2600.0 2900.0 3100.0 -1200.0 2000.0 2300.0 2700.0 3200.0 3300.0 -1500.0 2200.0 2400.0 2600.0 3200.0 3300.0 -1400.0 1800.0 2000.0 2500.0 3000.0 3100.0 -1400.0 2000.0 2300.0 2500.0 3200.0 3300.0 -1900.0 2400.0 2600.0 2700.0 3100.0 3300.0 -1300.0 1600.0 1700.0 2200.0 3000.0 3100.0 -1300.0 1600.0 2500.0 2600.0 3100.0 3300.0 -1500.0 1700.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1600.0 2400.0 2600.0 3200.0 3400.0 -1400.0 2000.0 2300.0 2500.0 2700.0 3000.0 -1500.0 1900.0 2300.0 2500.0 2700.0 3100.0 -1500.0 1600.0 1800.0 2500.0 2800.0 3000.0 -1300.0 1800.0 2200.0 2600.0 3100.0 3200.0 -1300.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1300.0 1700.0 2100.0 2400.0 3100.0 3300.0 -1300.0 1900.0 2300.0 2600.0 3000.0 3200.0 -1200.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1700.0 2200.0 2500.0 2600.0 3200.0 3400.0 -1600.0 2000.0 2200.0 2300.0 3100.0 3200.0 -1800.0 1900.0 2300.0 2600.0 3200.0 3300.0 -1800.0 1900.0 2100.0 2500.0 3200.0 3300.0 -1900.0 2000.0 2100.0 2500.0 3300.0 3400.0 -1700.0 2100.0 2600.0 2800.0 3300.0 3500.0 -1600.0 1800.0 2200.0 2700.0 3200.0 3300.0 -1400.0 2000.0 2300.0 2400.0 2600.0 3000.0 -1400.0 1600.0 2100.0 2300.0 3100.0 3200.0 -1100.0 1900.0 2500.0 2600.0 3300.0 3400.0 -1200.0 1600.0 2300.0 2600.0 3100.0 3400.0 -1400.0 1600.0 2100.0 2400.0 3000.0 3300.0 -1400.0 1700.0 2100.0 2500.0 3100.0 3300.0 -1200.0 2000.0 2700.0 2800.0 3300.0 3400.0 -1700.0 1800.0 2000.0 2300.0 3300.0 3400.0 -1300.0 1600.0 1800.0 2100.0 3100.0 3200.0 -1800.0 1900.0 2100.0 2200.0 3200.0 3400.0 -1800.0 1900.0 2100.0 2300.0 3300.0 3400.0 -1800.0 1900.0 2200.0 2300.0 3100.0 3300.0 -1800.0 2300.0 2800.0 2900.0 3200.0 3300.0 -1900.0 2200.0 2500.0 2600.0 3200.0 3300.0 -1300.0 1600.0 2300.0 2500.0 2900.0 3300.0 -1400.0 1600.0 2300.0 2500.0 2900.0 3300.0 -1400.0 1700.0 2400.0 2500.0 2900.0 3200.0 -1500.0 1700.0 2100.0 2200.0 3100.0 3200.0 -1500.0 1700.0 2100.0 2200.0 3100.0 3300.0 -1500.0 1600.0 2100.0 2300.0 2900.0 3300.0 -1300.0 1900.0 2200.0 2500.0 3000.0 3200.0 -1200.0 1900.0 2200.0 2500.0 3000.0 3200.0 -1000.0 1300.0 2100.0 2200.0 2900.0 3200.0 -1400.0 1600.0 1700.0 2000.0 3300.0 3400.0 -1300.0 1500.0 1600.0 2000.0 3300.0 3400.0 -1300.0 1500.0 1700.0 1900.0 3300.0 3400.0 -1500.0 1600.0 2100.0 2300.0 3100.0 3400.0 -1500.0 1600.0 2300.0 2500.0 2700.0 3200.0 -1400.0 2000.0 2300.0 2400.0 2700.0 3200.0 -1200.0 1500.0 2400.0 2600.0 2900.0 3200.0 -1500.0 1600.0 2300.0 2400.0 2700.0 3300.0 -1500.0 1700.0 2200.0 2400.0 2600.0 3100.0 -1500.0 1700.0 2300.0 2500.0 3100.0 3400.0 -1600.0 1700.0 2400.0 2600.0 3000.0 3400.0 -1600.0 1700.0 2500.0 2700.0 3100.0 3400.0 -1400.0 1500.0 2300.0 2400.0 3000.0 3300.0 -1500.0 1600.0 2100.0 2300.0 3000.0 3200.0 -1500.0 1600.0 2200.0 2400.0 2900.0 3200.0 -1500.0 1700.0 2400.0 2500.0 2900.0 3200.0 -1400.0 1900.0 2200.0 2300.0 2800.0 3200.0 -1500.0 1800.0 2100.0 2200.0 3000.0 3300.0 -2000.0 2100.0 2500.0 2600.0 3000.0 3400.0 -1000.0 1600.0 2200.0 2300.0 3200.0 3400.0 -1300.0 1500.0 2300.0 2600.0 2900.0 3300.0 -1400.0 1600.0 2500.0 2600.0 2900.0 3200.0 -1400.0 1600.0 2100.0 2400.0 3100.0 3300.0 -1500.0 2000.0 2300.0 2500.0 3100.0 3300.0 -1000.0 1700.0 2100.0 2200.0 3200.0 3300.0 -1500.0 1700.0 2200.0 2400.0 3200.0 3400.0 -1600.0 1800.0 2300.0 2400.0 3000.0 3100.0 -1300.0 1500.0 2100.0 2200.0 3000.0 3300.0 -1200.0 1400.0 2200.0 2300.0 3000.0 3300.0 -1600.0 1700.0 1900.0 2200.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2300.0 3000.0 3400.0 -1400.0 1500.0 2200.0 2500.0 2800.0 3100.0 -1800.0 1900.0 2300.0 2500.0 3000.0 3400.0 -1500.0 1700.0 2100.0 2500.0 2700.0 3100.0 -1600.0 1900.0 2400.0 2700.0 2900.0 3100.0 -1700.0 1800.0 2200.0 2500.0 2700.0 3300.0 -1800.0 1900.0 2400.0 2500.0 2800.0 3300.0 -1300.0 1600.0 2100.0 2300.0 3000.0 3300.0 -1300.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1100.0 1500.0 2500.0 2600.0 3100.0 3400.0 -1600.0 1700.0 2200.0 2500.0 2600.0 3100.0 -1500.0 1600.0 2200.0 2500.0 2600.0 3100.0 -1600.0 2200.0 2600.0 2800.0 3100.0 3300.0 -2000.0 2200.0 2600.0 2700.0 3300.0 3400.0 -1500.0 2000.0 2200.0 2400.0 2600.0 2900.0 -1500.0 1800.0 2200.0 2400.0 3100.0 3400.0 -1800.0 2200.0 2600.0 2800.0 3400.0 3500.0 -1600.0 1700.0 2200.0 2600.0 3200.0 3400.0 -1800.0 2000.0 2300.0 2600.0 3200.0 3400.0 -1600.0 1800.0 2200.0 2600.0 3200.0 3400.0 -1500.0 1600.0 2100.0 2400.0 2800.0 3200.0 -1500.0 1800.0 2000.0 2600.0 3200.0 3300.0 -1200.0 1800.0 1900.0 2200.0 3100.0 3200.0 -1500.0 1600.0 2200.0 2400.0 3200.0 3300.0 -1800.0 1900.0 2600.0 2800.0 3000.0 3300.0 -1300.0 1600.0 2300.0 2400.0 3000.0 3100.0 -2000.0 2100.0 2400.0 2600.0 3000.0 3100.0 -2000.0 2100.0 2500.0 2600.0 2900.0 3100.0 -1800.0 2000.0 2500.0 2600.0 3000.0 3100.0 -1800.0 2300.0 2700.0 2800.0 3400.0 3500.0 -1200.0 1900.0 2200.0 2600.0 3100.0 3200.0 -1600.0 2000.0 2500.0 2700.0 3100.0 3400.0 -1900.0 2100.0 2600.0 2700.0 3000.0 3200.0 -1500.0 1900.0 2600.0 2800.0 3200.0 3300.0 -1600.0 1800.0 2200.0 2700.0 3200.0 3400.0 -1400.0 1800.0 2400.0 2600.0 2900.0 3200.0 -1500.0 1700.0 2500.0 2600.0 3000.0 3200.0 -1800.0 2100.0 2600.0 2800.0 3400.0 3500.0 -1700.0 2000.0 2600.0 2800.0 3000.0 3300.0 -1800.0 2100.0 2700.0 2900.0 3400.0 3500.0 -1600.0 1700.0 2600.0 2700.0 3100.0 3400.0 -1800.0 1900.0 2400.0 2600.0 2800.0 3000.0 -1600.0 2000.0 2500.0 2600.0 2900.0 3200.0 -1400.0 1800.0 2400.0 2500.0 2900.0 3100.0 -1500.0 1800.0 2400.0 2500.0 2900.0 3200.0 -1200.0 1400.0 2300.0 2500.0 2900.0 3200.0 -1400.0 1600.0 2500.0 2700.0 3000.0 3300.0 -1500.0 1900.0 2500.0 2700.0 3000.0 3300.0 -1000.0 1400.0 2600.0 2700.0 3100.0 3300.0 -1400.0 1700.0 2100.0 2300.0 2900.0 3000.0 -1700.0 1800.0 2400.0 2600.0 2800.0 3000.0 -1500.0 2000.0 2100.0 2500.0 3000.0 3100.0 -2000.0 2100.0 2300.0 2400.0 3100.0 3300.0 -2100.0 2200.0 2600.0 2800.0 3100.0 3200.0 -2100.0 2200.0 2600.0 2700.0 3000.0 3200.0 -1800.0 2000.0 2600.0 2800.0 3100.0 3400.0 -1700.0 2000.0 2500.0 2900.0 3100.0 3300.0 -1700.0 2000.0 2500.0 2900.0 3100.0 3400.0 -1600.0 1800.0 2500.0 2800.0 3000.0 3200.0 -1500.0 1800.0 2200.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2300.0 2600.0 3200.0 3300.0 -1500.0 1600.0 2400.0 2600.0 2800.0 3100.0 -1200.0 1600.0 2200.0 2600.0 3000.0 3200.0 -1500.0 1600.0 2000.0 2300.0 2900.0 3200.0 -1900.0 2000.0 2400.0 2700.0 3200.0 3400.0 -1900.0 2000.0 2400.0 2700.0 2800.0 3200.0 -1500.0 1700.0 2300.0 2600.0 3200.0 3400.0 -1700.0 1800.0 2400.0 2500.0 2800.0 3100.0 -1500.0 1600.0 2200.0 2400.0 2900.0 3100.0 -1500.0 1600.0 2200.0 2500.0 3100.0 3300.0 -1600.0 2000.0 2200.0 2400.0 2700.0 3100.0 -1500.0 1700.0 2300.0 2600.0 2900.0 3300.0 -1700.0 1800.0 2100.0 2300.0 2900.0 3100.0 -1400.0 1500.0 2000.0 2500.0 2700.0 3000.0 -1800.0 1900.0 2300.0 2400.0 2800.0 3100.0 -1300.0 1800.0 2200.0 2500.0 2900.0 3100.0 -1300.0 1900.0 2300.0 2700.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2500.0 2700.0 3100.0 -1600.0 1700.0 2200.0 2600.0 3100.0 3300.0 -1400.0 1500.0 2300.0 2500.0 2800.0 3000.0 -1300.0 1700.0 2100.0 2500.0 3000.0 3300.0 -1600.0 1800.0 2200.0 2400.0 2800.0 3200.0 -1400.0 1500.0 2200.0 2500.0 3200.0 3300.0 -1800.0 1900.0 2200.0 2500.0 3000.0 3100.0 -1300.0 1500.0 2200.0 2400.0 2900.0 3100.0 -1300.0 1500.0 2300.0 2500.0 3100.0 3300.0 -1100.0 1500.0 2400.0 2500.0 3000.0 3200.0 -1600.0 1700.0 2400.0 2600.0 2800.0 3100.0 -1500.0 1600.0 2400.0 2500.0 2800.0 3100.0 -1500.0 1600.0 2000.0 2500.0 2800.0 3100.0 -1200.0 1700.0 2400.0 2600.0 3200.0 3300.0 -1100.0 1600.0 2400.0 2500.0 3200.0 3400.0 -1100.0 1500.0 2400.0 2500.0 3000.0 3400.0 -1100.0 1600.0 2400.0 2500.0 3100.0 3300.0 -1900.0 2000.0 2400.0 2500.0 2900.0 3100.0 -1300.0 1500.0 2200.0 2300.0 2700.0 3100.0 -1600.0 1900.0 2500.0 2800.0 3200.0 3300.0 -1900.0 2100.0 2600.0 2900.0 3300.0 3400.0 -1700.0 2100.0 2500.0 2600.0 3000.0 3300.0 -1800.0 1900.0 2400.0 2500.0 2900.0 3000.0 -1300.0 1500.0 2300.0 2400.0 2900.0 3000.0 -1200.0 1700.0 1800.0 2300.0 2900.0 3000.0 -1200.0 1600.0 1800.0 2200.0 2900.0 3000.0 -1200.0 1700.0 2100.0 2300.0 3100.0 3200.0 -1400.0 1900.0 2100.0 2400.0 3000.0 3200.0 -1100.0 1500.0 2500.0 2600.0 3000.0 3300.0 -1300.0 1400.0 2400.0 2500.0 2800.0 3300.0 -1300.0 1500.0 2300.0 2500.0 3200.0 3400.0 -1300.0 1900.0 2300.0 2700.0 3100.0 3200.0 -1700.0 1900.0 2200.0 2400.0 2700.0 3100.0 -1400.0 1500.0 2000.0 2500.0 2600.0 3000.0 -1500.0 1600.0 2000.0 2400.0 2600.0 3000.0 -1400.0 1700.0 2400.0 2600.0 3000.0 3300.0 -2000.0 2100.0 2300.0 2500.0 2900.0 3100.0 -1900.0 2000.0 2400.0 2500.0 2800.0 3000.0 -1800.0 1900.0 2200.0 2400.0 2700.0 3000.0 -1400.0 1600.0 1900.0 2300.0 2600.0 3000.0 -1600.0 2000.0 2600.0 2800.0 3300.0 3400.0 -1200.0 1600.0 1800.0 2100.0 3200.0 3300.0 -1900.0 2300.0 2700.0 2800.0 3400.0 3500.0 -1500.0 1600.0 2200.0 2500.0 2700.0 3100.0 -1700.0 2100.0 2300.0 2500.0 2900.0 3200.0 -1300.0 1500.0 2200.0 2500.0 3000.0 3300.0 -1400.0 1500.0 2100.0 2500.0 2600.0 2900.0 -1500.0 1600.0 2200.0 2300.0 2800.0 3300.0 -1500.0 1600.0 1800.0 2100.0 2800.0 2900.0 -1700.0 1800.0 2200.0 2400.0 2600.0 3100.0 -1600.0 1900.0 2600.0 2700.0 3200.0 3400.0 -1500.0 1700.0 2400.0 2600.0 3000.0 3400.0 -1200.0 1500.0 2300.0 2400.0 2900.0 3300.0 -1600.0 2100.0 2500.0 2700.0 3200.0 3400.0 -1500.0 1700.0 2300.0 2500.0 2600.0 2900.0 -1500.0 1600.0 2400.0 2600.0 3000.0 3100.0 -1600.0 1800.0 2600.0 2800.0 3000.0 3200.0 -1400.0 1700.0 2200.0 2500.0 3100.0 3400.0 -1600.0 1700.0 2300.0 2600.0 2700.0 3100.0 -1600.0 1700.0 2100.0 2500.0 2700.0 3100.0 -2000.0 2200.0 2500.0 2700.0 3100.0 3400.0 -1900.0 2100.0 2400.0 2600.0 3000.0 3400.0 -1400.0 1800.0 2100.0 2600.0 2900.0 3100.0 -1000.0 1800.0 2100.0 2300.0 3100.0 3200.0 -1400.0 1500.0 2200.0 2400.0 3000.0 3300.0 -1300.0 1800.0 2200.0 2300.0 3000.0 3200.0 -1100.0 1500.0 2300.0 2400.0 3000.0 3200.0 -1400.0 1500.0 2300.0 2400.0 2900.0 3300.0 -1400.0 1500.0 2200.0 2400.0 2800.0 3300.0 -1200.0 1600.0 2100.0 2200.0 3200.0 3300.0 -1600.0 1800.0 2100.0 2300.0 2500.0 3100.0 -1500.0 1600.0 2400.0 2600.0 3000.0 3400.0 -1500.0 1800.0 2500.0 2600.0 3300.0 3400.0 -1900.0 2500.0 2600.0 2900.0 3200.0 3300.0 -1300.0 1500.0 2100.0 2500.0 2700.0 3100.0 -1200.0 1400.0 2400.0 2500.0 2800.0 3200.0 -1600.0 1700.0 2300.0 2400.0 2900.0 3400.0 -1100.0 1800.0 2200.0 2300.0 3300.0 3400.0 -1800.0 2200.0 2500.0 2800.0 3100.0 3400.0 -1200.0 1700.0 2100.0 2700.0 3100.0 3200.0 -1300.0 1600.0 2100.0 2600.0 3000.0 3200.0 -2000.0 2200.0 2300.0 2400.0 3100.0 3300.0 -1700.0 1900.0 2400.0 2600.0 3100.0 3400.0 -1300.0 1700.0 2000.0 2600.0 3200.0 3300.0 -1100.0 1700.0 2300.0 2400.0 3200.0 3400.0 -1100.0 1600.0 2300.0 2400.0 3200.0 3400.0 -1700.0 2300.0 2800.0 3000.0 3300.0 3400.0 -1700.0 2000.0 2300.0 2800.0 3200.0 3300.0 -1800.0 1900.0 2100.0 2600.0 3000.0 3200.0 -1300.0 2000.0 2200.0 2600.0 3000.0 3200.0 -1300.0 1500.0 2300.0 2400.0 3000.0 3400.0 -1600.0 1700.0 2100.0 2300.0 2800.0 3200.0 -1700.0 1800.0 2400.0 2700.0 2800.0 3200.0 -1800.0 1900.0 2500.0 2700.0 2800.0 3200.0 -1700.0 1800.0 2100.0 2300.0 2900.0 3300.0 -1500.0 1700.0 2300.0 2400.0 2700.0 3200.0 -1600.0 2100.0 2500.0 2800.0 3100.0 3200.0 -1400.0 1700.0 2300.0 2700.0 3000.0 3300.0 -900.0 1400.0 2300.0 2500.0 3100.0 3300.0 -1700.0 1800.0 2300.0 2400.0 3000.0 3400.0 -2000.0 2100.0 2400.0 2600.0 2900.0 3100.0 -1900.0 2500.0 2600.0 2800.0 3300.0 3400.0 -1400.0 1500.0 2200.0 2300.0 2900.0 3300.0 -1600.0 1700.0 2000.0 2500.0 2600.0 3100.0 -1700.0 1800.0 2200.0 2300.0 2900.0 3200.0 -2100.0 2500.0 2800.0 3100.0 3300.0 3500.0 -1900.0 2400.0 2600.0 2700.0 3300.0 3400.0 -1700.0 2100.0 2500.0 2600.0 3300.0 3400.0 -1100.0 1500.0 2300.0 2400.0 3100.0 3400.0 -1200.0 1500.0 2300.0 2400.0 3300.0 3400.0 -1200.0 1800.0 2200.0 2400.0 3300.0 3400.0 -1500.0 1900.0 2200.0 2300.0 3100.0 3300.0 -1300.0 1600.0 1800.0 2100.0 3200.0 3300.0 -1600.0 1800.0 2400.0 2600.0 2900.0 3300.0 -1700.0 1900.0 2400.0 2600.0 3000.0 3400.0 -1300.0 1800.0 2200.0 2300.0 2900.0 3200.0 -1400.0 1700.0 2200.0 2300.0 3200.0 3400.0 -1400.0 1600.0 2200.0 2400.0 3200.0 3400.0 -1700.0 1800.0 2400.0 2500.0 3200.0 3500.0 -1600.0 1700.0 2500.0 2600.0 3200.0 3400.0 -1500.0 1700.0 2400.0 2500.0 2900.0 3400.0 -1700.0 1800.0 2300.0 2400.0 2900.0 3500.0 -1700.0 1800.0 2300.0 2400.0 3000.0 3500.0 -1600.0 1700.0 2300.0 2500.0 2700.0 3400.0 -1800.0 1900.0 2400.0 2500.0 3000.0 3500.0 -1300.0 1600.0 1800.0 2500.0 3100.0 3300.0 -1200.0 1700.0 2000.0 2200.0 3200.0 3300.0 -1200.0 1600.0 2200.0 2300.0 3200.0 3400.0 -1200.0 1600.0 2200.0 2400.0 3200.0 3400.0 -1600.0 2300.0 2600.0 2900.0 3300.0 3400.0 -1300.0 1600.0 2200.0 2300.0 3000.0 3400.0 -1900.0 2100.0 2400.0 2500.0 2800.0 3100.0 -1400.0 2000.0 2500.0 2700.0 3100.0 3200.0 -1700.0 1800.0 2400.0 2500.0 2800.0 3300.0 -1900.0 2000.0 2400.0 2600.0 2800.0 3400.0 -1600.0 2200.0 2500.0 2800.0 3200.0 3300.0 -1200.0 1700.0 2300.0 2400.0 3000.0 3300.0 -1200.0 1400.0 2200.0 2300.0 2900.0 3200.0 -1600.0 1800.0 2400.0 2700.0 3200.0 3400.0 -1600.0 1900.0 2400.0 2600.0 3100.0 3400.0 -1500.0 1800.0 2400.0 2600.0 3000.0 3400.0 -1600.0 1700.0 2400.0 2500.0 3100.0 3500.0 -1500.0 1600.0 2100.0 2300.0 2700.0 3200.0 -1500.0 1600.0 2100.0 2200.0 2600.0 3100.0 -1700.0 1900.0 2400.0 2700.0 3300.0 3400.0 -1200.0 1500.0 2200.0 2300.0 3300.0 3400.0 -1300.0 1600.0 2100.0 2200.0 3300.0 3400.0 -1400.0 1500.0 2100.0 2200.0 3200.0 3400.0 -1800.0 1900.0 2300.0 2400.0 2800.0 3300.0 -1900.0 2000.0 2400.0 2500.0 2800.0 3200.0 -2000.0 2100.0 2400.0 2600.0 2800.0 3200.0 -1500.0 2100.0 2300.0 2500.0 2800.0 3200.0 -1500.0 1800.0 2300.0 2400.0 3000.0 3200.0 -1700.0 1800.0 2600.0 2800.0 3000.0 3200.0 -1900.0 2500.0 2800.0 2900.0 3200.0 3300.0 -1100.0 1400.0 2500.0 2800.0 3000.0 3200.0 -1200.0 1400.0 2700.0 2900.0 3100.0 3300.0 -1200.0 1400.0 2600.0 2900.0 3000.0 3300.0 -1200.0 1400.0 2700.0 2900.0 3000.0 3400.0 -1200.0 1600.0 2600.0 2800.0 3100.0 3400.0 -1300.0 1800.0 2400.0 2500.0 2900.0 3200.0 -1400.0 1700.0 2500.0 2600.0 3200.0 3400.0 -1400.0 1900.0 2300.0 2400.0 2900.0 3300.0 -1800.0 1900.0 2600.0 2700.0 3100.0 3400.0 -1800.0 2000.0 2600.0 2700.0 3100.0 3400.0 -1800.0 1900.0 2600.0 2700.0 3000.0 3400.0 -1400.0 1800.0 2300.0 2500.0 2700.0 3000.0 -1600.0 1700.0 2500.0 2700.0 3200.0 3400.0 -1500.0 1700.0 2400.0 2700.0 3000.0 3200.0 -1500.0 1900.0 2400.0 2700.0 3100.0 3200.0 -1900.0 2100.0 2700.0 2800.0 3200.0 3300.0 -1600.0 2000.0 2300.0 2400.0 3200.0 3400.0 -1500.0 1700.0 2500.0 2700.0 3200.0 3300.0 -1700.0 1800.0 2500.0 2700.0 3200.0 3300.0 -1800.0 1900.0 2600.0 2800.0 3100.0 3400.0 -1700.0 1800.0 2500.0 2800.0 2900.0 3200.0 -1600.0 1700.0 2500.0 2700.0 3000.0 3300.0 -1200.0 1700.0 2700.0 2800.0 3100.0 3300.0 -1200.0 1500.0 2700.0 2900.0 3100.0 3300.0 -1500.0 1800.0 2400.0 2700.0 3100.0 3400.0 -1400.0 1600.0 2600.0 2800.0 3000.0 3300.0 -1600.0 1800.0 2500.0 2700.0 3000.0 3400.0 -1500.0 1800.0 2300.0 2600.0 3100.0 3400.0 -1500.0 1700.0 2300.0 2500.0 2700.0 3300.0 -2000.0 2100.0 2500.0 2700.0 2900.0 3300.0 -2200.0 2300.0 2600.0 2700.0 3200.0 3400.0 -1400.0 1800.0 2300.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2600.0 2700.0 3100.0 3400.0 -1300.0 1700.0 2100.0 2500.0 3100.0 3300.0 -2100.0 2200.0 2600.0 2800.0 3300.0 3400.0 -2100.0 2300.0 2700.0 2800.0 3300.0 3400.0 -1600.0 1700.0 2500.0 2700.0 3100.0 3300.0 -1400.0 1700.0 2600.0 2700.0 3200.0 3400.0 -1200.0 1500.0 2600.0 2800.0 3100.0 3300.0 -1800.0 1900.0 2500.0 2600.0 3000.0 3400.0 -1700.0 1800.0 2400.0 2600.0 2900.0 3000.0 -1200.0 1600.0 2800.0 3000.0 3200.0 3300.0 -1600.0 1700.0 2300.0 2600.0 3200.0 3400.0 -1700.0 1800.0 2200.0 2500.0 2800.0 3300.0 -1700.0 1800.0 2600.0 2700.0 3000.0 3400.0 -1500.0 1600.0 2600.0 2800.0 3000.0 3300.0 -1100.0 1300.0 2400.0 2900.0 3000.0 3200.0 -1100.0 1500.0 2700.0 2800.0 3100.0 3300.0 -1600.0 1800.0 2000.0 2300.0 3300.0 3400.0 -1800.0 2000.0 2100.0 2400.0 3300.0 3400.0 -1800.0 2000.0 2500.0 2600.0 2900.0 3300.0 -1600.0 1700.0 2400.0 2700.0 2900.0 3300.0 -1600.0 1700.0 2600.0 2800.0 3100.0 3300.0 -1500.0 1700.0 1900.0 2100.0 3000.0 3300.0 -1900.0 2000.0 2100.0 2300.0 3200.0 3400.0 -2100.0 2200.0 2500.0 2600.0 2900.0 3300.0 -1800.0 2000.0 2200.0 2400.0 3300.0 3400.0 -1700.0 1800.0 2100.0 2300.0 3300.0 3400.0 -2000.0 2200.0 2500.0 2600.0 3200.0 3400.0 -1700.0 1900.0 2100.0 2800.0 3100.0 3200.0 -1800.0 1900.0 2500.0 2900.0 3100.0 3200.0 -1800.0 1900.0 2500.0 2900.0 3000.0 3200.0 -1300.0 1500.0 1800.0 1900.0 2700.0 3200.0 -1000.0 1300.0 2400.0 3000.0 3300.0 3400.0 -1400.0 1600.0 1800.0 1900.0 2900.0 3300.0 -1500.0 1700.0 1900.0 2000.0 2800.0 3200.0 -1800.0 2000.0 2300.0 2500.0 2700.0 3100.0 -1800.0 1900.0 2200.0 2300.0 2800.0 3200.0 -1200.0 1900.0 2500.0 2600.0 2900.0 3000.0 -1200.0 1900.0 2400.0 2600.0 2900.0 3000.0 -1800.0 2000.0 2100.0 2400.0 3000.0 3200.0 -1900.0 2200.0 2600.0 2900.0 3100.0 3200.0 -1600.0 1700.0 2000.0 2100.0 2700.0 3200.0 -1600.0 1800.0 2300.0 2800.0 3100.0 3200.0 -1700.0 1900.0 2400.0 2700.0 2900.0 3300.0 -1900.0 2000.0 2400.0 2800.0 3200.0 3300.0 -1400.0 1600.0 2300.0 2500.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2200.0 2700.0 3200.0 -2000.0 2100.0 2600.0 2900.0 3300.0 3400.0 -1200.0 1500.0 2300.0 2500.0 2900.0 3200.0 -1200.0 1400.0 2200.0 2400.0 2900.0 3200.0 -1600.0 2200.0 2400.0 2600.0 3200.0 3400.0 -1700.0 1800.0 2400.0 2500.0 3000.0 3100.0 -1700.0 1800.0 2200.0 2600.0 3100.0 3200.0 -1200.0 1900.0 2300.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2000.0 2800.0 3200.0 3300.0 -1500.0 1700.0 2400.0 2500.0 3000.0 3100.0 -1400.0 2000.0 2400.0 2600.0 3000.0 3300.0 -1200.0 1400.0 2400.0 2800.0 3000.0 3100.0 -1500.0 1600.0 2000.0 2100.0 2900.0 3300.0 -1500.0 1600.0 2000.0 2200.0 2800.0 3300.0 -1200.0 1500.0 2100.0 2200.0 3000.0 3300.0 -1400.0 2000.0 2300.0 2700.0 3100.0 3300.0 -1600.0 1700.0 2000.0 2700.0 3200.0 3300.0 -1700.0 1900.0 2300.0 2600.0 2800.0 3200.0 -2100.0 2300.0 2600.0 2800.0 3100.0 3200.0 -1400.0 1800.0 2400.0 2500.0 3000.0 3200.0 -1500.0 2100.0 2400.0 2700.0 3000.0 3300.0 -1600.0 1700.0 2100.0 2700.0 3000.0 3100.0 -1500.0 1800.0 2200.0 2700.0 3100.0 3300.0 -1300.0 1500.0 2400.0 2500.0 2900.0 3200.0 -1200.0 1500.0 2500.0 2600.0 3000.0 3200.0 -1100.0 1500.0 2400.0 2500.0 2900.0 3300.0 -1800.0 1900.0 2400.0 2500.0 2800.0 3000.0 -1700.0 1800.0 2100.0 2800.0 3100.0 3200.0 -1900.0 2200.0 2400.0 2900.0 3100.0 3200.0 -1500.0 1700.0 2300.0 2600.0 2800.0 3100.0 -1300.0 1500.0 1900.0 2500.0 3000.0 3100.0 -1700.0 1800.0 2400.0 2700.0 3100.0 3200.0 -1900.0 2500.0 2900.0 3100.0 3300.0 3400.0 -1500.0 1800.0 2000.0 2600.0 2900.0 3100.0 -1900.0 2300.0 2500.0 2800.0 3200.0 3400.0 -1500.0 2100.0 2500.0 2700.0 3200.0 3400.0 -1500.0 2100.0 2500.0 2700.0 2900.0 3200.0 -1800.0 2300.0 2800.0 2900.0 3300.0 3400.0 -1600.0 1900.0 2200.0 2600.0 3000.0 3300.0 -1400.0 1900.0 2400.0 2600.0 2800.0 3100.0 -1300.0 1700.0 2500.0 2600.0 3000.0 3200.0 -1400.0 1800.0 2100.0 2500.0 2800.0 3100.0 -1700.0 2400.0 2600.0 3000.0 3300.0 3400.0 -2200.0 2400.0 2700.0 3000.0 3200.0 3300.0 -1400.0 1800.0 2400.0 2700.0 3000.0 3200.0 -1300.0 1700.0 2300.0 2600.0 2900.0 3200.0 -1400.0 1900.0 2200.0 2500.0 2700.0 3000.0 -1500.0 1900.0 2200.0 2800.0 3100.0 3300.0 -1400.0 1600.0 1800.0 2200.0 3200.0 3400.0 -1700.0 2000.0 2200.0 2700.0 3200.0 3300.0 -1400.0 1900.0 2500.0 2700.0 3300.0 3400.0 -1500.0 2100.0 2300.0 2500.0 2800.0 3100.0 -1500.0 2000.0 2300.0 2500.0 2800.0 3100.0 -1500.0 1600.0 2400.0 2800.0 3000.0 3200.0 -1400.0 1600.0 2200.0 2700.0 3000.0 3100.0 -1200.0 1800.0 2000.0 2300.0 2900.0 3100.0 -1300.0 1900.0 2400.0 2700.0 3200.0 3300.0 -2200.0 2500.0 2800.0 3100.0 3400.0 3500.0 -2100.0 2400.0 2900.0 3000.0 3100.0 3300.0 -1200.0 1500.0 1700.0 2300.0 2900.0 3000.0 -1600.0 2200.0 2600.0 2800.0 3200.0 3300.0 -1700.0 2300.0 2500.0 2800.0 3100.0 3300.0 -1400.0 1900.0 2500.0 2600.0 3100.0 3200.0 -1400.0 1700.0 2500.0 2600.0 3100.0 3400.0 -1300.0 1700.0 2500.0 2600.0 3100.0 3400.0 -1400.0 2100.0 2300.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2600.0 3100.0 3200.0 -1100.0 1900.0 2100.0 2500.0 3100.0 3200.0 -1300.0 1400.0 2500.0 2600.0 3000.0 3300.0 -1300.0 2000.0 2400.0 2600.0 3100.0 3300.0 -1500.0 2000.0 2300.0 2600.0 3200.0 3400.0 -1400.0 1900.0 2200.0 2700.0 3000.0 3200.0 -1600.0 2100.0 2500.0 2600.0 3000.0 3200.0 -1600.0 2100.0 2500.0 2700.0 3000.0 3200.0 -1500.0 2000.0 2500.0 2700.0 3000.0 3200.0 -1900.0 2400.0 2600.0 2900.0 3400.0 3500.0 -1400.0 1700.0 2300.0 2700.0 3000.0 3200.0 -1800.0 2300.0 2900.0 3100.0 3400.0 3500.0 -1700.0 2100.0 2300.0 2500.0 3000.0 3100.0 -1900.0 2100.0 2500.0 3000.0 3300.0 3400.0 -1300.0 1500.0 1800.0 2500.0 2800.0 3000.0 -1300.0 1400.0 2000.0 2400.0 2800.0 3200.0 -1300.0 2100.0 2400.0 2600.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2600.0 3000.0 3200.0 -1400.0 1900.0 2400.0 2600.0 3100.0 3200.0 -1300.0 1800.0 2500.0 2600.0 3100.0 3200.0 -1500.0 2100.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1700.0 2000.0 2700.0 2900.0 3100.0 -1400.0 2000.0 2200.0 2400.0 2700.0 3100.0 -1200.0 1400.0 2600.0 2700.0 2900.0 3100.0 -1500.0 2100.0 2300.0 2500.0 2700.0 3100.0 -1800.0 2100.0 2500.0 2600.0 3100.0 3200.0 -1200.0 1700.0 2100.0 2500.0 3200.0 3300.0 -1400.0 2100.0 2300.0 2700.0 3200.0 3300.0 -1700.0 2000.0 2600.0 2800.0 3100.0 3200.0 -1400.0 1700.0 2300.0 2700.0 3200.0 3300.0 -1300.0 1600.0 2200.0 2400.0 3100.0 3200.0 -1400.0 1500.0 2200.0 2500.0 3000.0 3200.0 -1400.0 1700.0 2300.0 2500.0 2800.0 3100.0 -1500.0 1700.0 2200.0 2500.0 2700.0 3100.0 -1500.0 1700.0 2200.0 2500.0 2900.0 3100.0 -1800.0 2000.0 2700.0 2900.0 3100.0 3400.0 -1300.0 1700.0 2100.0 2200.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2700.0 2900.0 3300.0 -1500.0 1600.0 2700.0 2800.0 3000.0 3300.0 -1400.0 1500.0 2500.0 2700.0 2900.0 3200.0 -1100.0 1600.0 2400.0 2600.0 3000.0 3200.0 -1600.0 2000.0 2700.0 2900.0 3300.0 3400.0 -1400.0 1500.0 2600.0 2800.0 3000.0 3300.0 -1400.0 1500.0 2600.0 2700.0 3000.0 3300.0 -1400.0 1500.0 2500.0 2700.0 2900.0 3300.0 -1700.0 1900.0 2600.0 2900.0 3100.0 3300.0 -1500.0 1600.0 2300.0 2700.0 3100.0 3200.0 -1200.0 1700.0 2300.0 2700.0 3000.0 3200.0 -1500.0 1600.0 2500.0 2800.0 3000.0 3300.0 -1500.0 1600.0 1700.0 1800.0 3100.0 3400.0 -1500.0 1600.0 2300.0 2700.0 3000.0 3300.0 -1300.0 1500.0 2600.0 2700.0 3200.0 3300.0 -2100.0 2200.0 2500.0 2700.0 3100.0 3200.0 -2100.0 2200.0 2800.0 3000.0 3200.0 3300.0 -1500.0 1700.0 2400.0 2600.0 2800.0 3100.0 -1500.0 1800.0 2400.0 2700.0 3000.0 3200.0 -1400.0 1700.0 2400.0 2700.0 3100.0 3200.0 -900.0 1500.0 2800.0 2900.0 3100.0 3300.0 -1400.0 1700.0 2500.0 2700.0 3100.0 3400.0 -1800.0 2000.0 2300.0 2800.0 3100.0 3300.0 -1200.0 1600.0 2300.0 2400.0 2900.0 3200.0 -1800.0 1900.0 2300.0 2600.0 3000.0 3100.0 -1300.0 1600.0 1900.0 2400.0 2900.0 3200.0 -1400.0 1600.0 2500.0 2700.0 2900.0 3300.0 -900.0 1600.0 2200.0 2300.0 3200.0 3300.0 -1300.0 1900.0 2200.0 2300.0 3100.0 3300.0 -1700.0 1900.0 2500.0 2900.0 3200.0 3300.0 -1400.0 1900.0 2500.0 2700.0 3200.0 3400.0 -1700.0 2000.0 2200.0 2500.0 2900.0 3000.0 -1200.0 1500.0 2600.0 2800.0 3100.0 3400.0 -1400.0 1700.0 2100.0 2600.0 3000.0 3300.0 -1400.0 1700.0 2500.0 2800.0 3200.0 3300.0 -1800.0 2400.0 2600.0 2900.0 3400.0 3500.0 -1900.0 2100.0 2500.0 2600.0 3100.0 3200.0 -2200.0 2500.0 2800.0 3000.0 3400.0 3500.0 -1600.0 1800.0 1900.0 2500.0 3100.0 3200.0 -1100.0 1600.0 2500.0 2600.0 3200.0 3400.0 -1700.0 2200.0 2500.0 2700.0 3100.0 3400.0 -1000.0 1700.0 2200.0 2300.0 3200.0 3300.0 -1100.0 1700.0 2200.0 2600.0 3100.0 3300.0 -1100.0 1700.0 2300.0 2700.0 3200.0 3300.0 -1500.0 1800.0 2100.0 2600.0 3200.0 3300.0 -1300.0 2100.0 2400.0 2600.0 2800.0 3200.0 -1800.0 1900.0 2200.0 2600.0 2800.0 3200.0 -1800.0 1900.0 2500.0 2600.0 3100.0 3200.0 -1400.0 2100.0 2300.0 2500.0 2700.0 3100.0 -1300.0 2000.0 2400.0 2500.0 2800.0 3200.0 -1600.0 2100.0 2600.0 2800.0 3200.0 3400.0 -1400.0 1800.0 2200.0 2400.0 3300.0 3400.0 -1300.0 1700.0 2200.0 2300.0 3300.0 3400.0 -1300.0 1600.0 2200.0 2300.0 3300.0 3400.0 -1300.0 1600.0 2300.0 2400.0 3300.0 3400.0 -1100.0 1700.0 2200.0 2300.0 3300.0 3400.0 -1500.0 1900.0 2200.0 2500.0 2700.0 3100.0 -1300.0 1700.0 1900.0 2200.0 3000.0 3100.0 -1400.0 1600.0 2500.0 2600.0 3300.0 3400.0 -1500.0 1600.0 2500.0 2600.0 3200.0 3400.0 -1000.0 1700.0 2600.0 2700.0 3300.0 3400.0 -1000.0 1600.0 2600.0 2700.0 3300.0 3400.0 -1400.0 1700.0 2500.0 2600.0 3000.0 3400.0 -1400.0 1800.0 2500.0 2600.0 3300.0 3400.0 -1500.0 1600.0 2400.0 2600.0 3200.0 3400.0 -1600.0 2200.0 2500.0 2600.0 3200.0 3300.0 -1000.0 1900.0 2400.0 2500.0 3300.0 3400.0 -1200.0 1700.0 2200.0 2400.0 3200.0 3400.0 -2000.0 2200.0 2600.0 2900.0 3300.0 3400.0 -2200.0 2300.0 2700.0 2800.0 3300.0 3400.0 -2200.0 2300.0 2700.0 2800.0 3200.0 3300.0 -2000.0 2300.0 2400.0 2700.0 3100.0 3300.0 -2200.0 2300.0 2600.0 2800.0 3200.0 3300.0 -1500.0 2000.0 2300.0 2400.0 3200.0 3300.0 -1500.0 1600.0 1800.0 2500.0 3200.0 3300.0 -1100.0 1900.0 2200.0 2400.0 3000.0 3300.0 -1500.0 2100.0 2600.0 2700.0 3200.0 3400.0 -1400.0 1900.0 2400.0 2600.0 3000.0 3200.0 -1200.0 1800.0 2400.0 2600.0 3200.0 3300.0 -1200.0 1700.0 2700.0 2800.0 3200.0 3300.0 -1200.0 1600.0 2600.0 2700.0 3200.0 3300.0 -1300.0 1600.0 2500.0 2600.0 3000.0 3300.0 -1500.0 1600.0 2500.0 2700.0 2900.0 3300.0 -1500.0 1700.0 1800.0 2500.0 3100.0 3200.0 -1400.0 1700.0 1900.0 2600.0 3100.0 3200.0 -1300.0 1700.0 2500.0 2600.0 3200.0 3300.0 -1100.0 1400.0 2600.0 3000.0 3200.0 3300.0 -1100.0 1400.0 2600.0 2900.0 3100.0 3300.0 -1600.0 1800.0 1900.0 2600.0 3200.0 3300.0 -2000.0 2100.0 2600.0 2700.0 3100.0 3200.0 -1300.0 1700.0 2100.0 2300.0 3200.0 3300.0 -1100.0 1700.0 2800.0 2900.0 3200.0 3300.0 -1500.0 1700.0 2500.0 2600.0 2900.0 3200.0 -1400.0 1800.0 2600.0 2700.0 3200.0 3300.0 -1600.0 1700.0 2100.0 2400.0 3000.0 3300.0 -1300.0 1500.0 1600.0 2200.0 3000.0 3100.0 -1300.0 2000.0 2500.0 2700.0 3100.0 3200.0 -1800.0 2200.0 2500.0 2600.0 3200.0 3300.0 -1700.0 2200.0 2400.0 2600.0 2800.0 3100.0 -2000.0 2200.0 2600.0 2800.0 3000.0 3300.0 -1300.0 1400.0 2400.0 2700.0 3100.0 3300.0 -1500.0 1600.0 1900.0 2000.0 2900.0 3300.0 -1000.0 1200.0 2400.0 2500.0 3100.0 3400.0 -1800.0 1900.0 2200.0 2400.0 2600.0 3000.0 -1900.0 2000.0 2200.0 2600.0 2800.0 3000.0 -1300.0 1800.0 2200.0 2400.0 2900.0 3200.0 -1800.0 2100.0 2300.0 2500.0 2800.0 3000.0 -1500.0 2000.0 2300.0 2600.0 2800.0 3100.0 -1000.0 1400.0 2400.0 2500.0 3100.0 3300.0 -1300.0 1900.0 2700.0 2800.0 3200.0 3300.0 -1900.0 2200.0 2300.0 2500.0 2800.0 3100.0 -1900.0 2000.0 2200.0 2600.0 2800.0 3100.0 -1600.0 1700.0 2100.0 2200.0 2900.0 3200.0 -1500.0 1900.0 2200.0 2500.0 3000.0 3300.0 -1400.0 1900.0 2400.0 2800.0 3100.0 3300.0 -1900.0 2000.0 2300.0 2600.0 2800.0 3200.0 -1900.0 2100.0 2300.0 2600.0 2800.0 3200.0 -1600.0 1700.0 2300.0 2700.0 3100.0 3300.0 -1600.0 1800.0 2100.0 2300.0 2600.0 3000.0 -1600.0 1800.0 2100.0 2400.0 2600.0 3000.0 -1700.0 2000.0 2200.0 2500.0 3100.0 3300.0 -1600.0 1700.0 2000.0 2400.0 2600.0 3000.0 -1300.0 1500.0 2200.0 2400.0 2800.0 3200.0 -1300.0 1700.0 2200.0 2400.0 2900.0 3200.0 -1700.0 1900.0 2100.0 2300.0 2800.0 3100.0 -1200.0 1400.0 2300.0 2400.0 2900.0 3300.0 -1400.0 1500.0 2000.0 2200.0 2700.0 3000.0 -1200.0 1900.0 2400.0 2600.0 3000.0 3300.0 -1700.0 1800.0 2100.0 2300.0 2600.0 3100.0 -1900.0 2000.0 2200.0 2400.0 2700.0 3000.0 -1900.0 2100.0 2300.0 2400.0 2700.0 3000.0 -1400.0 1800.0 2200.0 2400.0 2700.0 3200.0 -1700.0 1800.0 2200.0 2300.0 2900.0 3300.0 -1700.0 2000.0 2500.0 2800.0 3400.0 3500.0 -1300.0 1500.0 2200.0 2300.0 3100.0 3200.0 -1400.0 1800.0 2100.0 2600.0 3000.0 3200.0 -1300.0 1900.0 2200.0 2500.0 3100.0 3300.0 -1500.0 2100.0 2600.0 2700.0 3200.0 3300.0 -1300.0 1800.0 2600.0 2700.0 3200.0 3300.0 -1000.0 1500.0 2700.0 2800.0 3100.0 3300.0 -2200.0 2300.0 2500.0 2900.0 3200.0 3400.0 -2100.0 2200.0 2500.0 2900.0 3100.0 3300.0 -1500.0 1600.0 2400.0 2700.0 3000.0 3300.0 -1300.0 1500.0 1600.0 2000.0 3200.0 3400.0 -1400.0 1600.0 1700.0 2000.0 3200.0 3400.0 -1700.0 1900.0 2700.0 2800.0 3200.0 3300.0 -1700.0 1900.0 2700.0 2800.0 3100.0 3300.0 -1500.0 1600.0 2300.0 2700.0 2800.0 3200.0 -1500.0 1600.0 2200.0 2500.0 2900.0 3300.0 -1200.0 1500.0 2100.0 2600.0 3000.0 3300.0 -1800.0 2300.0 2700.0 2800.0 3200.0 3400.0 -1000.0 1400.0 2400.0 2500.0 2900.0 3300.0 -1000.0 1500.0 2500.0 2600.0 2900.0 3200.0 -1900.0 2400.0 2700.0 3000.0 3200.0 3400.0 -1700.0 1900.0 2300.0 2400.0 3000.0 3400.0 -1300.0 1600.0 1700.0 2200.0 3100.0 3300.0 -1800.0 1900.0 2600.0 2900.0 3100.0 3300.0 -2300.0 2600.0 2800.0 2900.0 3300.0 3400.0 -1000.0 1500.0 2400.0 2500.0 3200.0 3300.0 -1400.0 1600.0 2100.0 2300.0 2900.0 3200.0 -1500.0 2000.0 2400.0 2600.0 2800.0 3000.0 -1400.0 1900.0 2300.0 2600.0 2800.0 3100.0 -1600.0 1700.0 2500.0 2600.0 2800.0 3200.0 -2000.0 2200.0 2800.0 3000.0 3300.0 3500.0 -2000.0 2400.0 2700.0 2800.0 3200.0 3300.0 -1400.0 1600.0 1700.0 1900.0 3200.0 3400.0 -2100.0 2200.0 2400.0 2700.0 3000.0 3300.0 -2100.0 2400.0 2800.0 3000.0 3100.0 3300.0 -1800.0 2000.0 2300.0 2400.0 3100.0 3400.0 -1400.0 1700.0 2600.0 2700.0 3000.0 3300.0 -1300.0 1700.0 2200.0 2500.0 3200.0 3400.0 -1500.0 1900.0 2300.0 2600.0 2800.0 3100.0 -2200.0 2500.0 2700.0 2800.0 3200.0 3400.0 -2100.0 2200.0 2500.0 2800.0 3000.0 3200.0 -1700.0 1900.0 2300.0 2600.0 2800.0 3000.0 -1800.0 2000.0 2400.0 2700.0 2900.0 3300.0 -1500.0 1800.0 2000.0 2400.0 3000.0 3100.0 -1500.0 1700.0 1800.0 2600.0 3100.0 3200.0 -1200.0 1700.0 2300.0 2600.0 3000.0 3200.0 -1400.0 1500.0 1900.0 2700.0 3000.0 3100.0 -1600.0 2100.0 2300.0 2700.0 3000.0 3100.0 -1700.0 2300.0 2400.0 2700.0 3100.0 3200.0 -1800.0 2300.0 2400.0 2700.0 2900.0 3100.0 -1400.0 1500.0 1900.0 2500.0 2800.0 3000.0 -1300.0 1500.0 1900.0 2600.0 3000.0 3100.0 -1500.0 1600.0 2000.0 2500.0 2900.0 3100.0 -1500.0 1900.0 2300.0 2800.0 3200.0 3300.0 -1900.0 2000.0 2500.0 2700.0 3000.0 3100.0 -1400.0 1500.0 2000.0 2500.0 2800.0 3000.0 -1400.0 1500.0 2000.0 2600.0 3000.0 3100.0 -1700.0 2000.0 2200.0 2600.0 2700.0 3000.0 -1400.0 1700.0 2000.0 2500.0 3100.0 3200.0 -1700.0 1900.0 2400.0 2700.0 2800.0 3100.0 -1700.0 2000.0 2300.0 2500.0 2800.0 3100.0 -1400.0 1600.0 1900.0 2400.0 2700.0 3000.0 -1500.0 1700.0 1900.0 2400.0 2700.0 3000.0 -1400.0 1500.0 1900.0 2800.0 3100.0 3200.0 -1400.0 1900.0 2200.0 2600.0 3100.0 3200.0 -1200.0 1600.0 2200.0 2500.0 3000.0 3100.0 -1500.0 1800.0 2500.0 2800.0 3000.0 3200.0 -1200.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1700.0 2100.0 2300.0 2500.0 2700.0 3200.0 -1300.0 1600.0 2100.0 2300.0 2800.0 3200.0 -1800.0 2000.0 2200.0 2800.0 3100.0 3200.0 -2100.0 2400.0 2900.0 3000.0 3300.0 3500.0 -1700.0 1900.0 2600.0 2900.0 3200.0 3300.0 -2100.0 2500.0 2900.0 3000.0 3200.0 3300.0 -2000.0 2300.0 2800.0 2900.0 3100.0 3400.0 -1300.0 1500.0 2100.0 2400.0 2800.0 3200.0 -1600.0 1700.0 2000.0 2700.0 3000.0 3100.0 -1500.0 1800.0 2000.0 2500.0 3000.0 3100.0 -1500.0 1800.0 2200.0 2700.0 2900.0 3100.0 -1600.0 1700.0 2100.0 2400.0 2600.0 3100.0 -1500.0 1900.0 2300.0 2400.0 2900.0 3300.0 -1300.0 2000.0 2400.0 2700.0 3100.0 3200.0 -1300.0 2000.0 2300.0 2700.0 3300.0 3400.0 -1700.0 2200.0 2400.0 2800.0 3200.0 3300.0 -1400.0 1900.0 2600.0 2900.0 3200.0 3300.0 -1400.0 1700.0 2000.0 2400.0 3100.0 3200.0 -1400.0 1600.0 2300.0 2500.0 2700.0 3000.0 -1500.0 1600.0 2300.0 2600.0 3100.0 3200.0 -1500.0 1900.0 2200.0 2400.0 3300.0 3400.0 -1200.0 1900.0 2100.0 2400.0 2900.0 3100.0 -1000.0 2300.0 2600.0 2800.0 3200.0 3300.0 -2200.0 2300.0 2600.0 2900.0 3300.0 3400.0 -1400.0 1600.0 2600.0 2700.0 3200.0 3300.0 -1300.0 2100.0 2500.0 2700.0 3100.0 3200.0 -1400.0 1600.0 2500.0 2600.0 3000.0 3400.0 -1200.0 1800.0 2700.0 2800.0 3000.0 3100.0 -1100.0 2000.0 2600.0 2700.0 3100.0 3200.0 -1000.0 1900.0 2700.0 2800.0 3100.0 3200.0 -1100.0 1900.0 2700.0 2800.0 3200.0 3300.0 -1200.0 1800.0 2500.0 2600.0 3000.0 3200.0 -2000.0 2100.0 2500.0 2600.0 3100.0 3200.0 -1400.0 2000.0 2500.0 2700.0 3200.0 3300.0 -2300.0 2400.0 2900.0 3100.0 3300.0 3400.0 -1600.0 1900.0 2300.0 2500.0 2900.0 3100.0 -1300.0 2200.0 2400.0 2900.0 3300.0 3400.0 -1300.0 2100.0 2200.0 2500.0 3200.0 3300.0 -1300.0 1900.0 2500.0 2600.0 3000.0 3100.0 -1300.0 1900.0 2500.0 2600.0 3100.0 3200.0 -1300.0 2000.0 2500.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2500.0 2600.0 3200.0 3300.0 -1700.0 1800.0 2300.0 2600.0 3000.0 3400.0 -1600.0 1800.0 2300.0 2700.0 3200.0 3400.0 -1300.0 1500.0 1600.0 2600.0 3200.0 3300.0 -1300.0 1500.0 1600.0 2500.0 3300.0 3400.0 -1300.0 1500.0 1600.0 2700.0 3300.0 3400.0 -2100.0 2500.0 3000.0 3100.0 3300.0 3400.0 -1400.0 1900.0 2300.0 2400.0 3100.0 3200.0 -1600.0 2200.0 2300.0 2600.0 3300.0 3400.0 -1300.0 1600.0 1700.0 2700.0 3100.0 3200.0 -1800.0 2300.0 2500.0 2800.0 3100.0 3300.0 -1500.0 1600.0 2400.0 2600.0 3100.0 3400.0 -1200.0 1900.0 2200.0 2400.0 3000.0 3100.0 -1400.0 1900.0 2200.0 2700.0 3100.0 3200.0 -1300.0 1700.0 2300.0 2600.0 2900.0 3100.0 -1300.0 2000.0 2300.0 2600.0 3200.0 3300.0 -1800.0 1900.0 2400.0 2600.0 3200.0 3500.0 -1700.0 1800.0 2400.0 2700.0 2900.0 3300.0 -1400.0 2000.0 2400.0 2500.0 2700.0 2900.0 -1400.0 2100.0 2400.0 2500.0 2700.0 3100.0 -1500.0 1700.0 2300.0 2700.0 2900.0 3200.0 -1200.0 1300.0 2300.0 2800.0 3000.0 3200.0 -1200.0 1400.0 2100.0 2600.0 3000.0 3300.0 -1600.0 1700.0 2500.0 2700.0 2800.0 3200.0 -1700.0 2100.0 2200.0 2700.0 3000.0 3100.0 -1400.0 1500.0 2100.0 2400.0 2900.0 3200.0 -1700.0 2100.0 2200.0 2600.0 3100.0 3200.0 -1600.0 1900.0 2300.0 2500.0 2900.0 3000.0 -1300.0 1500.0 2000.0 2600.0 2900.0 3000.0 -1800.0 1900.0 2100.0 2300.0 3000.0 3200.0 -1100.0 1500.0 2500.0 2800.0 3000.0 3200.0 -1900.0 2000.0 2200.0 2400.0 2800.0 3200.0 -1800.0 1900.0 2700.0 2800.0 3100.0 3300.0 -1200.0 1400.0 2000.0 2700.0 3000.0 3100.0 -1300.0 1400.0 1900.0 2000.0 2600.0 3200.0 -1000.0 1300.0 2400.0 2600.0 2800.0 3200.0 -1700.0 1800.0 2200.0 2400.0 2600.0 3000.0 -2000.0 2300.0 2400.0 2700.0 2900.0 3000.0 -1600.0 1700.0 2000.0 2200.0 2500.0 3100.0 -1700.0 2300.0 2700.0 2800.0 3200.0 3400.0 -1600.0 1700.0 2300.0 2600.0 2700.0 3000.0 -1400.0 1500.0 2000.0 2700.0 2900.0 3100.0 -1100.0 1400.0 2200.0 2600.0 2800.0 3000.0 -1700.0 2100.0 2300.0 2600.0 3000.0 3300.0 -1400.0 1500.0 1700.0 1800.0 2700.0 3200.0 -1500.0 1600.0 1900.0 2000.0 2600.0 3200.0 -1000.0 1300.0 2400.0 2600.0 2900.0 3300.0 -1300.0 1500.0 1900.0 2500.0 2700.0 3000.0 -1800.0 1900.0 2200.0 2600.0 2900.0 3300.0 -1300.0 1400.0 1700.0 1800.0 2700.0 3200.0 -1700.0 1800.0 2000.0 2500.0 2700.0 2900.0 -1800.0 2000.0 2300.0 2700.0 2800.0 3100.0 -1600.0 1700.0 2200.0 2800.0 2900.0 3100.0 -1800.0 2100.0 2800.0 2900.0 3200.0 3400.0 -1700.0 2100.0 2800.0 2900.0 3100.0 3400.0 -1900.0 2400.0 2700.0 2800.0 3400.0 3500.0 -1600.0 1700.0 2400.0 2700.0 2800.0 3200.0 -1600.0 1900.0 2200.0 2500.0 3000.0 3300.0 -1400.0 1500.0 2000.0 2500.0 2800.0 3100.0 -1200.0 1300.0 2100.0 2500.0 2700.0 3000.0 -1900.0 2200.0 2600.0 2800.0 3400.0 3500.0 -1500.0 1900.0 2600.0 2700.0 2900.0 3300.0 -1400.0 1500.0 2000.0 2100.0 2700.0 3100.0 -1600.0 1700.0 2100.0 2200.0 2600.0 3200.0 -1700.0 2200.0 2500.0 2700.0 3000.0 3100.0 -1800.0 2300.0 2500.0 2600.0 2900.0 3100.0 -1100.0 1300.0 2500.0 2700.0 2900.0 3200.0 -1400.0 1500.0 1900.0 2000.0 2600.0 3200.0 -1600.0 1700.0 2000.0 2100.0 2800.0 3300.0 -1300.0 1900.0 2300.0 2600.0 2700.0 3000.0 -1800.0 1900.0 2500.0 2700.0 2900.0 3100.0 -2100.0 2200.0 2700.0 3000.0 3100.0 3300.0 -2000.0 2100.0 2700.0 2900.0 3200.0 3400.0 -1500.0 1700.0 1800.0 2200.0 3200.0 3300.0 -1500.0 1800.0 2000.0 2700.0 3200.0 3300.0 -1800.0 1900.0 2100.0 2400.0 3100.0 3200.0 -1500.0 1600.0 2400.0 2500.0 3200.0 3300.0 -1400.0 1800.0 2400.0 2600.0 3300.0 3400.0 -1400.0 1800.0 2400.0 2600.0 3200.0 3400.0 -2300.0 2600.0 2800.0 3100.0 3300.0 3400.0 -2000.0 2100.0 2800.0 2900.0 3300.0 3400.0 -1400.0 1700.0 2600.0 2700.0 3200.0 3300.0 -1300.0 1700.0 2500.0 2700.0 3200.0 3300.0 -1500.0 1800.0 2200.0 2700.0 3000.0 3300.0 -1800.0 2000.0 2300.0 2500.0 2900.0 3300.0 -1300.0 1800.0 2400.0 2500.0 3200.0 3400.0 -1500.0 1900.0 2500.0 2600.0 3000.0 3300.0 -1700.0 1800.0 2700.0 2800.0 3200.0 3400.0 -1500.0 1800.0 2700.0 2800.0 3200.0 3400.0 -1500.0 1800.0 2700.0 2800.0 3300.0 3400.0 -1400.0 1600.0 2400.0 2500.0 3200.0 3300.0 -1600.0 1800.0 2400.0 2800.0 3100.0 3300.0 -1500.0 2100.0 2500.0 2600.0 3100.0 3300.0 -1500.0 1600.0 2500.0 2600.0 3000.0 3400.0 -1200.0 1900.0 2300.0 2500.0 3100.0 3300.0 -1500.0 1600.0 2300.0 2500.0 3200.0 3300.0 -1600.0 2300.0 2600.0 2800.0 3300.0 3400.0 -2100.0 2400.0 2500.0 2700.0 3200.0 3300.0 -1100.0 1800.0 2500.0 2600.0 2900.0 3200.0 -1400.0 1700.0 2100.0 2600.0 3000.0 3200.0 -1700.0 2000.0 2500.0 2600.0 3000.0 3100.0 -1100.0 1500.0 2500.0 2600.0 3100.0 3300.0 -1500.0 1600.0 2200.0 2400.0 2600.0 3200.0 -1600.0 1800.0 2300.0 2500.0 2900.0 3300.0 -1600.0 1700.0 2100.0 2300.0 3000.0 3200.0 -2000.0 2200.0 2600.0 2800.0 3300.0 3400.0 -1600.0 1700.0 1900.0 2400.0 3100.0 3300.0 -1200.0 1700.0 2300.0 2500.0 3100.0 3400.0 -1100.0 1600.0 1900.0 2200.0 3000.0 3100.0 -1400.0 1900.0 2300.0 2600.0 2900.0 3000.0 -1900.0 2200.0 2800.0 3000.0 3200.0 3400.0 -1400.0 1500.0 2200.0 2300.0 2700.0 3100.0 -1800.0 1900.0 2200.0 2600.0 3000.0 3300.0 -1700.0 1900.0 2200.0 2500.0 2700.0 3000.0 -1600.0 1800.0 2000.0 2400.0 2700.0 2800.0 -1900.0 2300.0 2700.0 2900.0 3100.0 3200.0 -1400.0 1500.0 2000.0 2400.0 2900.0 3000.0 -1800.0 2100.0 2200.0 2500.0 2700.0 3000.0 -1200.0 1300.0 1900.0 2500.0 3000.0 3100.0 -1100.0 1200.0 2500.0 2900.0 3000.0 3200.0 -1400.0 1500.0 1900.0 2000.0 2500.0 3100.0 -1400.0 1600.0 2000.0 2200.0 2500.0 3100.0 -1200.0 1700.0 2300.0 2700.0 3100.0 3300.0 -1900.0 2200.0 2300.0 2500.0 2700.0 3100.0 -1500.0 1600.0 2000.0 2100.0 2800.0 3300.0 -1500.0 1800.0 2000.0 2300.0 2600.0 2900.0 -2100.0 2200.0 2600.0 2700.0 3000.0 3100.0 -2100.0 2300.0 2700.0 2900.0 3200.0 3400.0 -1600.0 1700.0 1900.0 2000.0 2700.0 3100.0 -1300.0 1500.0 1800.0 1900.0 2500.0 3100.0 -1900.0 2500.0 2700.0 2900.0 3200.0 3300.0 -1200.0 1400.0 2000.0 2700.0 3200.0 3300.0 -1900.0 2500.0 2700.0 2800.0 3200.0 3300.0 -1200.0 1600.0 2200.0 2400.0 2900.0 3200.0 -2000.0 2200.0 2600.0 2700.0 3100.0 3400.0 -1500.0 1700.0 2000.0 2300.0 2600.0 3000.0 -1700.0 2100.0 2500.0 2700.0 3000.0 3100.0 -1800.0 2200.0 2500.0 2700.0 3000.0 3100.0 -2000.0 2400.0 2600.0 2900.0 3100.0 3200.0 -1700.0 2400.0 2500.0 2700.0 3100.0 3200.0 -1600.0 2000.0 2100.0 2600.0 3000.0 3100.0 -1500.0 2100.0 2400.0 2600.0 3000.0 3200.0 -1400.0 1600.0 2000.0 2600.0 3100.0 3200.0 -1500.0 1700.0 2000.0 2800.0 3100.0 3200.0 -1600.0 1700.0 2000.0 2700.0 3100.0 3200.0 -1400.0 2000.0 2300.0 2500.0 3000.0 3200.0 -1600.0 1800.0 2000.0 2300.0 3100.0 3300.0 -1500.0 1800.0 2300.0 2700.0 2900.0 3200.0 -1100.0 1400.0 2200.0 2300.0 3200.0 3300.0 -1800.0 2400.0 2800.0 2900.0 3200.0 3300.0 -1700.0 2400.0 2800.0 2900.0 3200.0 3300.0 -2000.0 2200.0 2800.0 3000.0 3400.0 3500.0 -1300.0 1400.0 2200.0 2900.0 3100.0 3200.0 -1200.0 1400.0 2300.0 2900.0 3100.0 3200.0 -1600.0 1900.0 2300.0 2600.0 2900.0 3300.0 -1700.0 2200.0 2300.0 2700.0 3100.0 3200.0 -1200.0 1700.0 2400.0 2700.0 3000.0 3300.0 -1500.0 1700.0 1900.0 2500.0 2900.0 3100.0 -1700.0 1800.0 2200.0 2600.0 2900.0 3300.0 -1300.0 1400.0 1900.0 2600.0 3000.0 3100.0 -1200.0 1400.0 2200.0 2500.0 2900.0 3300.0 -1500.0 1800.0 2000.0 2500.0 2900.0 3000.0 -1300.0 1400.0 2300.0 2500.0 2900.0 3300.0 -1700.0 2100.0 2300.0 2700.0 3000.0 3100.0 -1700.0 2100.0 2300.0 2800.0 3000.0 3100.0 -1200.0 1300.0 2100.0 2800.0 3200.0 3300.0 -1300.0 1600.0 2100.0 2600.0 2900.0 3100.0 -1300.0 1400.0 1800.0 2500.0 2800.0 3000.0 -1500.0 1700.0 2400.0 2600.0 2900.0 3000.0 -2100.0 2200.0 2500.0 2600.0 3000.0 3100.0 -2200.0 2300.0 2500.0 2700.0 3000.0 3200.0 -1400.0 1800.0 2000.0 2300.0 3200.0 3300.0 -1600.0 1700.0 2400.0 2700.0 3100.0 3200.0 -1600.0 1700.0 2500.0 2700.0 3000.0 3200.0 -1900.0 2500.0 2600.0 2800.0 3200.0 3300.0 -1200.0 1400.0 2600.0 2800.0 3000.0 3300.0 -1800.0 2300.0 2500.0 3000.0 3300.0 3400.0 -1200.0 1400.0 2200.0 2700.0 3200.0 3300.0 -1100.0 1400.0 2400.0 2500.0 3100.0 3400.0 -1100.0 1300.0 2400.0 2500.0 3200.0 3400.0 -1000.0 1400.0 2400.0 2500.0 3000.0 3300.0 -1800.0 1900.0 2400.0 2700.0 3200.0 3400.0 -1600.0 1700.0 2200.0 2500.0 2800.0 3300.0 -2000.0 2200.0 2400.0 2800.0 2900.0 3100.0 -1300.0 1800.0 2700.0 2800.0 3200.0 3400.0 -1800.0 2200.0 2700.0 3000.0 3400.0 3500.0 -1800.0 1900.0 2300.0 2600.0 2700.0 3000.0 -1900.0 2000.0 2400.0 2600.0 2900.0 3400.0 -1600.0 1700.0 2300.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2500.0 2700.0 3200.0 3300.0 -2100.0 2500.0 2800.0 3000.0 3200.0 3400.0 -1800.0 2000.0 2300.0 2400.0 3000.0 3100.0 -2300.0 2400.0 2600.0 2900.0 3100.0 3300.0 -1600.0 1800.0 2400.0 2500.0 3000.0 3100.0 -2100.0 2500.0 2900.0 3100.0 3200.0 3300.0 -1600.0 1900.0 2500.0 2900.0 3100.0 3300.0 -1500.0 1800.0 2300.0 2400.0 3200.0 3400.0 -1300.0 1500.0 2700.0 2800.0 3100.0 3300.0 -1200.0 1500.0 2600.0 2700.0 3200.0 3300.0 -1000.0 1500.0 2700.0 2800.0 3200.0 3300.0 -1100.0 1600.0 2600.0 2700.0 3200.0 3300.0 -1500.0 1700.0 2600.0 2700.0 3000.0 3300.0 -1100.0 1700.0 2800.0 2900.0 3200.0 3400.0 -1300.0 1700.0 2300.0 2500.0 3300.0 3400.0 -1700.0 2100.0 2400.0 2500.0 3200.0 3300.0 -1500.0 1800.0 2100.0 2400.0 3300.0 3400.0 -2000.0 2100.0 2400.0 2600.0 2800.0 3100.0 -1600.0 1700.0 2300.0 2800.0 3100.0 3300.0 -1900.0 2100.0 2800.0 3000.0 3300.0 3400.0 -2000.0 2100.0 2300.0 2600.0 2900.0 3200.0 -1100.0 1500.0 2500.0 2700.0 2900.0 3300.0 -1600.0 1800.0 2200.0 2500.0 2700.0 2800.0 -2000.0 2200.0 2500.0 2600.0 3100.0 3200.0 -1400.0 1600.0 2100.0 2900.0 3100.0 3200.0 -1900.0 2400.0 2800.0 3000.0 3200.0 3300.0 -2000.0 2300.0 2500.0 2700.0 2900.0 3200.0 -1700.0 2100.0 2300.0 2800.0 3200.0 3300.0 -1400.0 2000.0 2300.0 2500.0 3100.0 3300.0 -2000.0 2500.0 2600.0 3000.0 3200.0 3300.0 -1500.0 1700.0 2500.0 2600.0 3000.0 3400.0 -1100.0 2000.0 2500.0 2700.0 3200.0 3300.0 -1400.0 1600.0 2600.0 2900.0 3100.0 3400.0 -1800.0 2300.0 2800.0 3000.0 3200.0 3300.0 -1700.0 2000.0 2100.0 2300.0 3300.0 3400.0 -1400.0 1700.0 1800.0 2300.0 3300.0 3400.0 -1400.0 1500.0 2300.0 2500.0 3000.0 3400.0 -1400.0 1700.0 2600.0 2700.0 3100.0 3200.0 -1500.0 1700.0 2600.0 2700.0 3200.0 3300.0 -1600.0 1800.0 2600.0 2700.0 3100.0 3300.0 -1200.0 1400.0 1500.0 2200.0 3100.0 3200.0 -1500.0 1600.0 2100.0 2400.0 2700.0 3200.0 -1000.0 1500.0 2600.0 2700.0 3000.0 3300.0 -1200.0 1500.0 1600.0 2100.0 3100.0 3200.0 -1800.0 2200.0 2600.0 3000.0 3400.0 3500.0 -1000.0 2300.0 2600.0 2700.0 3200.0 3300.0 -1400.0 1600.0 2100.0 2500.0 2800.0 3200.0 -1300.0 1900.0 2300.0 2500.0 2900.0 3300.0 -1500.0 1600.0 2400.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2500.0 2800.0 3100.0 3200.0 -1000.0 2100.0 2500.0 2600.0 3100.0 3400.0 -1700.0 1800.0 2100.0 2400.0 3000.0 3100.0 -2200.0 2300.0 2600.0 2700.0 3000.0 3300.0 -1900.0 2000.0 2700.0 2800.0 3300.0 3400.0 -1500.0 1700.0 2400.0 2500.0 2900.0 3100.0 -1100.0 1600.0 2800.0 2900.0 3200.0 3300.0 -2000.0 2600.0 2800.0 3000.0 3400.0 3500.0 -1900.0 2500.0 2800.0 3100.0 3400.0 3500.0 -1200.0 1700.0 2700.0 2800.0 3200.0 3400.0 -1300.0 1600.0 2700.0 2800.0 3100.0 3400.0 -1500.0 1700.0 2700.0 2800.0 3100.0 3400.0 -1300.0 1400.0 2500.0 2800.0 3200.0 3400.0 -1700.0 2000.0 2700.0 2800.0 3300.0 3400.0 -1800.0 1900.0 2600.0 2700.0 3300.0 3400.0 -1100.0 1800.0 2700.0 2800.0 3200.0 3300.0 -2100.0 2600.0 2700.0 3000.0 3300.0 3400.0 -1300.0 1600.0 1800.0 2100.0 2900.0 3000.0 -1300.0 1500.0 2200.0 2400.0 3100.0 3400.0 -1200.0 1500.0 1700.0 2000.0 3000.0 3100.0 -1200.0 1500.0 1700.0 2100.0 3000.0 3100.0 -1300.0 2000.0 2200.0 2400.0 2700.0 3000.0 -1500.0 1800.0 2100.0 2300.0 3300.0 3400.0 -1100.0 1600.0 1800.0 2200.0 3000.0 3100.0 -1000.0 1800.0 2100.0 2400.0 3000.0 3100.0 -1500.0 1600.0 2300.0 2400.0 2900.0 3400.0 -1400.0 1600.0 1800.0 2100.0 2900.0 3000.0 -1100.0 1500.0 2100.0 2200.0 3100.0 3200.0 -1300.0 1700.0 1800.0 2200.0 3000.0 3100.0 -1500.0 1700.0 2100.0 2300.0 2700.0 2900.0 -1100.0 1700.0 1900.0 2100.0 2900.0 3000.0 -1400.0 1700.0 2100.0 2400.0 2900.0 3200.0 -1300.0 1600.0 1800.0 2300.0 3000.0 3100.0 -1200.0 1500.0 1700.0 2300.0 3000.0 3100.0 -1600.0 1800.0 1900.0 2300.0 3000.0 3100.0 -1700.0 2200.0 2600.0 2900.0 3100.0 3300.0 -1900.0 2400.0 2500.0 2700.0 2900.0 3100.0 -1800.0 2000.0 2100.0 2400.0 3100.0 3200.0 -1700.0 2400.0 2700.0 2800.0 3000.0 3200.0 -1800.0 1900.0 2300.0 2600.0 2800.0 3300.0 -1300.0 1900.0 2500.0 2600.0 3200.0 3400.0 -1400.0 1600.0 2300.0 2400.0 2800.0 3100.0 -1900.0 2000.0 2300.0 2700.0 3000.0 3300.0 -1700.0 1800.0 2400.0 2700.0 3200.0 3400.0 -1800.0 2000.0 2300.0 2600.0 2900.0 3300.0 -2100.0 2300.0 2600.0 2700.0 3300.0 3400.0 -1400.0 1600.0 2200.0 2400.0 3200.0 3300.0 -1300.0 1600.0 1800.0 2200.0 2800.0 2900.0 -1500.0 1700.0 1900.0 2600.0 2800.0 3000.0 -1700.0 2200.0 2500.0 2600.0 3100.0 3300.0 -1200.0 1700.0 1800.0 2100.0 3000.0 3100.0 -1100.0 1800.0 2500.0 2600.0 3300.0 3400.0 -1100.0 1900.0 2100.0 2300.0 2900.0 3000.0 -1200.0 1700.0 2400.0 2600.0 3100.0 3400.0 -1100.0 1700.0 2600.0 2700.0 3000.0 3300.0 -1000.0 1700.0 2700.0 2800.0 3200.0 3400.0 -1100.0 1900.0 2200.0 2300.0 3200.0 3300.0 -1300.0 1900.0 2300.0 2500.0 3000.0 3300.0 -1200.0 1600.0 2600.0 2700.0 3100.0 3400.0 -1300.0 1600.0 1800.0 2400.0 3000.0 3200.0 -1400.0 1700.0 1800.0 2100.0 3200.0 3400.0 -1000.0 1500.0 2300.0 2400.0 3200.0 3400.0 -900.0 1700.0 2600.0 2700.0 3300.0 3400.0 -1100.0 1400.0 2500.0 2700.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2500.0 2800.0 2900.0 -2100.0 2300.0 2700.0 2900.0 3400.0 3500.0 -2100.0 2200.0 2300.0 2400.0 3000.0 3300.0 -1800.0 2000.0 2400.0 2500.0 2800.0 3000.0 -1700.0 1900.0 2300.0 2500.0 2700.0 3000.0 -1300.0 1400.0 2300.0 2900.0 3100.0 3200.0 -2100.0 2300.0 2600.0 2900.0 3100.0 3200.0 -1400.0 1800.0 2200.0 2300.0 3200.0 3400.0 -2100.0 2500.0 2900.0 3200.0 3400.0 3500.0 -1700.0 1900.0 2100.0 2400.0 3200.0 3400.0 -1600.0 1700.0 2300.0 2600.0 2800.0 2900.0 -1800.0 2000.0 2300.0 2700.0 2800.0 3000.0 -1900.0 2300.0 2600.0 2800.0 3000.0 3100.0 -1300.0 1600.0 2200.0 2600.0 3100.0 3200.0 -1500.0 1600.0 2400.0 2500.0 2900.0 3400.0 -1600.0 1800.0 2000.0 2700.0 3100.0 3200.0 -1000.0 1800.0 2600.0 2700.0 3200.0 3400.0 -900.0 1800.0 2500.0 2600.0 3300.0 3400.0 -1300.0 2200.0 2300.0 2700.0 3200.0 3300.0 -1200.0 2000.0 2300.0 2500.0 3300.0 3400.0 -1100.0 1500.0 2400.0 2500.0 3100.0 3400.0 -1300.0 1700.0 1900.0 2100.0 3000.0 3100.0 -2000.0 2100.0 2500.0 2600.0 3300.0 3500.0 -1500.0 1800.0 2000.0 2500.0 3300.0 3400.0 -2000.0 2100.0 2800.0 2900.0 3100.0 3300.0 -2300.0 2400.0 2600.0 2800.0 3200.0 3300.0 -1400.0 1900.0 2200.0 2300.0 3100.0 3200.0 -1500.0 1900.0 2600.0 2700.0 3200.0 3300.0 -1500.0 1600.0 2200.0 2600.0 3100.0 3400.0 -1700.0 1800.0 2500.0 2700.0 3300.0 3400.0 -1100.0 1600.0 2400.0 2500.0 3300.0 3400.0 -900.0 1600.0 2600.0 2700.0 3300.0 3400.0 -1400.0 1500.0 2200.0 2600.0 3200.0 3400.0 -1200.0 2000.0 2400.0 2500.0 2700.0 3200.0 -1300.0 1500.0 2500.0 2600.0 3200.0 3300.0 -1500.0 1600.0 2300.0 2600.0 3200.0 3400.0 -1300.0 2000.0 2300.0 2800.0 3000.0 3200.0 -2000.0 2100.0 2600.0 2700.0 3000.0 3100.0 -2000.0 2200.0 2600.0 2700.0 3000.0 3100.0 -2100.0 2200.0 2800.0 2900.0 3100.0 3200.0 -1900.0 2100.0 2500.0 2600.0 3000.0 3100.0 -1900.0 2100.0 2300.0 2500.0 2800.0 2900.0 -1800.0 2000.0 2600.0 2700.0 3000.0 3400.0 -1400.0 1700.0 1800.0 2500.0 2800.0 3200.0 -1300.0 1800.0 2200.0 2300.0 3200.0 3400.0 -1400.0 1600.0 1700.0 2200.0 3200.0 3400.0 -1400.0 1500.0 1600.0 2100.0 3200.0 3400.0 -1700.0 2100.0 2300.0 2500.0 3300.0 3400.0 -1600.0 2000.0 2600.0 2800.0 3200.0 3400.0 -1400.0 1600.0 2700.0 2800.0 3000.0 3300.0 -1400.0 1500.0 1600.0 2200.0 3300.0 3400.0 -1600.0 1700.0 2500.0 2600.0 3300.0 3400.0 -1000.0 1500.0 2300.0 2400.0 3000.0 3100.0 -1400.0 1500.0 1700.0 1800.0 3200.0 3300.0 -1600.0 2000.0 2300.0 2500.0 2800.0 3100.0 -1900.0 2500.0 2600.0 2900.0 3400.0 3500.0 -1800.0 1900.0 2500.0 2600.0 3300.0 3500.0 -1500.0 1900.0 2200.0 2300.0 3200.0 3300.0 -1900.0 2200.0 2500.0 2600.0 3300.0 3400.0 -1400.0 2000.0 2300.0 2600.0 3100.0 3300.0 -1800.0 1900.0 2300.0 2400.0 3200.0 3500.0 -1100.0 1900.0 2500.0 2600.0 2900.0 3000.0 -1600.0 1700.0 2300.0 2400.0 2900.0 3000.0 -1700.0 2300.0 2500.0 2700.0 3000.0 3100.0 -2100.0 2200.0 2700.0 2900.0 3100.0 3400.0 -1400.0 1900.0 2300.0 2600.0 2800.0 2900.0 -1800.0 2000.0 2200.0 2400.0 2600.0 2900.0 -1400.0 2100.0 2500.0 2600.0 2900.0 3100.0 -1700.0 1900.0 2400.0 2800.0 3200.0 3400.0 -1000.0 1500.0 2300.0 2400.0 3000.0 3300.0 -1500.0 2000.0 2300.0 2800.0 3200.0 3300.0 -1900.0 2000.0 2300.0 2600.0 3100.0 3400.0 -1300.0 1500.0 2400.0 2600.0 3300.0 3400.0 -2100.0 2500.0 2900.0 3100.0 3200.0 3400.0 -1400.0 1700.0 1800.0 2400.0 3200.0 3300.0 -1400.0 1500.0 2300.0 2600.0 3100.0 3400.0 -1000.0 1900.0 2600.0 2700.0 3000.0 3100.0 -1100.0 1800.0 2500.0 2700.0 3200.0 3300.0 -1700.0 1800.0 2200.0 2700.0 2800.0 3200.0 -2000.0 2200.0 2700.0 2800.0 3100.0 3200.0 -1300.0 2100.0 2400.0 2500.0 2900.0 3100.0 -1300.0 2000.0 2400.0 2500.0 2800.0 3000.0 -1500.0 2100.0 2500.0 2600.0 2900.0 3100.0 -1700.0 2200.0 2500.0 2700.0 3000.0 3200.0 -1600.0 2100.0 2500.0 2600.0 3000.0 3100.0 -1700.0 2200.0 2500.0 2600.0 3000.0 3200.0 -1800.0 2200.0 2300.0 2600.0 3000.0 3200.0 -1300.0 1500.0 1700.0 2100.0 3300.0 3400.0 -1300.0 1500.0 1700.0 2000.0 3300.0 3400.0 -1300.0 1900.0 2700.0 2800.0 3200.0 3400.0 -1700.0 2500.0 2700.0 2900.0 3300.0 3400.0 -1100.0 1700.0 2100.0 2200.0 3300.0 3400.0 -1000.0 1800.0 2700.0 2900.0 3300.0 3400.0 -1500.0 1600.0 2500.0 2600.0 3200.0 3300.0 -1100.0 1900.0 2600.0 2800.0 3000.0 3100.0 -1300.0 1500.0 2400.0 2500.0 3200.0 3300.0 -1700.0 2100.0 2300.0 2400.0 2800.0 3300.0 -1300.0 1500.0 1700.0 1800.0 3200.0 3400.0 -2000.0 2100.0 2400.0 2700.0 2900.0 3300.0 -1400.0 1500.0 2500.0 2600.0 3000.0 3200.0 -1400.0 1500.0 2000.0 2900.0 3300.0 3400.0 -1300.0 1500.0 2600.0 2700.0 3100.0 3200.0 -1100.0 1300.0 2700.0 2800.0 3200.0 3300.0 -1100.0 1300.0 2500.0 2600.0 2900.0 3100.0 -1900.0 2300.0 2400.0 2600.0 2700.0 3100.0 -1300.0 2100.0 2200.0 2600.0 3200.0 3300.0 -1100.0 1800.0 2400.0 2500.0 2900.0 3100.0 -1000.0 1800.0 2200.0 2300.0 3200.0 3300.0 -1500.0 1700.0 1800.0 2600.0 3200.0 3400.0 -1500.0 2000.0 2400.0 2600.0 2700.0 3100.0 -2000.0 2100.0 2300.0 2500.0 2700.0 3300.0 -1000.0 1500.0 2700.0 2800.0 3300.0 3400.0 diff --git a/gr-vocoder/lib/codec2/codebook/lspjvm1.txt b/gr-vocoder/lib/codec2/codebook/lspjvm1.txt deleted file mode 100644 index 9cd10ed35c..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspjvm1.txt +++ /dev/null @@ -1,513 +0,0 @@ -10 512 -0.435217 0.668864 1.010296 1.220420 1.503978 1.784675 2.135458 2.357467 2.618905 2.738042 -0.179285 0.333160 0.500638 0.796950 1.039987 1.234969 1.652301 1.848233 2.625555 2.804968 -0.268785 0.356576 0.595753 1.044339 1.249382 1.428680 1.686986 1.864689 2.339905 2.513801 -0.120070 0.165585 0.484694 0.959160 1.237528 1.529146 1.837513 2.107730 2.487495 2.766846 -0.150214 0.229487 0.628240 0.961255 1.337065 1.598306 1.919745 2.217861 2.537318 2.759560 -0.268624 0.345980 0.569637 0.754737 0.916538 1.508543 1.786354 1.954418 2.369530 2.501822 -0.246064 0.468874 0.662711 0.890015 1.147153 1.510431 1.781056 2.095943 2.655391 2.800369 -0.191631 0.280628 0.393229 0.611761 1.420170 1.707741 1.873032 2.101553 2.280348 2.499488 -0.361668 0.507047 0.789974 1.045992 1.502378 1.677032 1.905337 2.162555 2.432259 2.590873 -0.208160 0.294285 0.448634 0.694229 0.872517 1.070315 1.703352 2.168742 2.426189 2.603657 -0.316939 0.513618 0.705487 0.917036 1.175989 1.311140 1.618599 2.037840 2.450523 2.579395 -0.241068 0.377728 0.521595 0.717203 1.310414 1.539991 1.736431 2.098926 2.297917 2.587348 -0.234937 0.281875 0.780422 1.440733 1.609428 1.756430 1.977206 2.148605 2.602032 2.722501 -0.178679 0.242672 0.416988 0.708348 0.955620 1.176671 1.781798 2.054488 2.281591 2.448112 -0.345036 0.421080 0.740887 1.165442 1.324944 1.488798 1.763463 1.906174 2.395050 2.649158 -0.249586 0.357494 0.520747 0.847195 1.428408 1.597779 1.778194 2.178502 2.413437 2.564662 -0.295235 0.574231 1.249097 1.464097 1.727559 1.926790 2.095363 2.284830 2.567065 2.722480 -0.341930 0.427307 0.634001 0.804212 0.905629 1.333373 1.790329 1.892756 2.445823 2.602828 -0.363948 0.508985 0.667357 0.946354 1.437562 1.626545 1.811141 2.039091 2.291882 2.435493 -0.163514 0.277407 0.409207 0.902065 1.189070 1.339636 1.802411 1.960770 2.652930 2.818987 -0.302643 0.359753 0.651207 1.208021 1.423702 1.548149 1.882130 2.015591 2.260535 2.578896 -0.155928 0.216908 0.381812 0.654803 1.112373 1.589935 1.847562 1.976716 2.224078 2.725337 -0.274981 0.347675 0.572000 0.736046 0.894248 1.632373 1.891391 2.056890 2.602900 2.721779 -0.154496 0.243461 0.348174 0.689505 1.573807 1.700306 1.943182 2.101580 2.564661 2.773169 -0.292612 0.466612 0.795936 1.047468 1.413693 1.750848 2.062894 2.340073 2.613612 2.769493 -0.242896 0.361500 0.555859 0.793597 0.932291 1.409467 1.863863 2.009534 2.464500 2.677491 -0.221646 0.344724 0.554564 0.729403 1.136575 1.301772 1.529181 2.163590 2.395821 2.610805 -0.160969 0.224467 0.371545 0.626879 1.160953 1.444229 1.675966 1.879779 2.478590 2.672023 -0.214172 0.341585 0.676575 0.977397 1.325429 1.720096 2.072595 2.369539 2.635285 2.778792 -0.203311 0.289438 0.458739 0.914153 1.122885 1.302925 1.583844 1.886828 2.187869 2.427039 -0.280383 0.371600 0.824827 1.100246 1.236225 1.398923 1.578041 2.016000 2.368973 2.506732 -0.170627 0.251778 0.393686 0.608347 1.287599 1.446665 1.793278 2.036554 2.310153 2.752439 -0.180580 0.288746 0.987854 1.431706 1.677216 1.915661 2.124939 2.289452 2.589612 2.754264 -0.176335 0.266263 0.445421 0.706403 0.875402 1.422918 1.758670 1.960910 2.410676 2.601751 -0.216173 0.287404 0.480696 1.009765 1.291304 1.476644 1.895584 2.064286 2.284064 2.483108 -0.176523 0.273934 0.403407 0.966139 1.304724 1.436612 1.944728 2.084836 2.544458 2.762416 -0.311836 0.550501 0.879591 1.096228 1.276661 1.477859 1.817706 2.154340 2.560467 2.779841 -0.179765 0.250560 0.455939 1.023886 1.225132 1.475662 1.734617 1.918713 2.147342 2.438235 -0.271033 0.457235 0.599622 0.821049 0.940125 1.200937 1.849716 1.986656 2.548168 2.751578 -0.179326 0.248002 0.426405 0.817060 1.285888 1.565019 2.117359 2.298712 2.572404 2.752701 -0.374409 0.535936 0.897009 1.185070 1.591569 1.757202 1.967944 2.179985 2.457394 2.622641 -0.185472 0.282752 0.409439 0.657499 0.856446 1.029396 1.879933 2.069323 2.344742 2.753103 -0.375964 0.578457 0.758945 0.929339 1.127475 1.259437 1.704109 2.122973 2.336031 2.498298 -0.225641 0.361030 0.501679 0.783379 1.314851 1.452621 1.714150 1.987157 2.225703 2.724361 -0.144996 0.252919 0.632145 1.226038 1.575343 1.901549 2.171481 2.390554 2.682293 2.809834 -0.172022 0.263338 0.448634 0.729435 0.984007 1.171597 1.757049 1.990232 2.321305 2.771210 -0.235731 0.351117 0.796871 1.055711 1.300224 1.591818 1.895875 2.122918 2.417888 2.599817 -0.254053 0.319371 0.455623 1.086141 1.664667 1.915882 2.059084 2.233416 2.452037 2.586788 -0.375538 0.742993 1.139911 1.337758 1.735562 2.013906 2.315012 2.483433 2.651575 2.755211 -0.247245 0.481131 0.710366 0.897602 1.121094 1.271709 1.787346 2.199502 2.429663 2.740668 -0.226103 0.311441 0.501648 0.844424 1.362818 1.531338 1.777474 1.989925 2.187493 2.358501 -0.195862 0.296224 0.609554 0.783241 1.243472 1.445477 1.637032 2.022645 2.483557 2.646137 -0.233302 0.299441 0.472792 1.249457 1.457875 1.601860 1.831433 1.993719 2.597193 2.755433 -0.168096 0.224183 0.382700 0.596214 1.060587 1.294418 1.605760 1.848489 2.357695 2.569186 -0.330050 0.445912 0.661713 0.874446 1.000792 1.452973 1.943987 2.076916 2.423883 2.612359 -0.226382 0.287303 0.517631 0.806229 1.309009 1.885280 2.160514 2.286410 2.526377 2.660822 -0.203170 0.499314 0.887358 1.235074 1.462922 1.698260 1.999316 2.229225 2.571613 2.766691 -0.307531 0.378353 0.573606 0.712218 0.850169 1.308996 2.059092 2.263816 2.497943 2.676815 -0.276203 0.510250 0.686800 0.902844 1.205197 1.327979 1.718894 2.038947 2.256393 2.697149 -0.161948 0.229115 0.393619 0.683613 1.137811 1.322692 1.783723 1.961584 2.389073 2.636082 -0.201334 0.276773 0.468994 0.967017 1.475971 1.632424 1.965774 2.197278 2.480593 2.701553 -0.214587 0.315421 0.469498 0.733397 1.146003 1.277911 1.727839 2.227135 2.440264 2.681122 -0.255602 0.394609 0.743393 0.977796 1.199085 1.405972 1.918336 2.224828 2.479187 2.663394 -0.245989 0.352625 0.517055 0.802830 1.558712 1.795653 1.944055 2.133640 2.333267 2.479982 -0.337423 0.480433 0.869036 1.139571 1.630764 1.822959 2.074843 2.292613 2.479130 2.625317 -0.220974 0.358850 0.571640 0.752791 0.937013 1.151721 1.674398 2.062466 2.558717 2.784838 -0.267518 0.331708 0.541111 1.116547 1.411121 1.532868 1.792949 1.933520 2.248940 2.628644 -0.084613 0.105083 0.297424 0.916949 1.256301 1.567029 1.885388 2.189875 2.522795 2.792102 -0.205328 0.287223 0.724462 1.032395 1.457708 1.642169 1.925628 2.175524 2.429638 2.605488 -0.232554 0.338724 0.502115 0.859975 1.044090 1.245652 1.806555 1.999641 2.261164 2.459984 -0.291638 0.379172 0.626072 0.792796 0.959124 1.504886 1.734465 1.919612 2.614359 2.722709 -0.191554 0.263114 0.426797 0.610628 1.077406 1.829543 2.021948 2.210572 2.427652 2.613828 -0.389151 0.679476 0.915414 1.036635 1.250846 1.586610 2.040972 2.281500 2.567941 2.718815 -0.203200 0.301280 0.470357 0.668716 0.851737 0.980327 1.570862 2.037617 2.289067 2.693877 -0.304064 0.405934 0.710274 0.962705 1.128820 1.341667 1.635050 1.845382 2.079916 2.507510 -0.171777 0.240705 0.409371 0.786432 1.223202 1.375689 1.691760 1.866080 2.350406 2.493942 -0.231251 0.277994 0.557867 1.325822 1.660352 1.779477 2.007138 2.172322 2.440457 2.652308 -0.188101 0.259494 0.412543 0.624843 0.839549 1.033700 1.634128 1.931944 2.246076 2.425773 -0.361304 0.419465 0.795676 1.184605 1.296796 1.578447 1.841746 1.997361 2.540538 2.687139 -0.274372 0.338938 0.492443 0.963516 1.509514 1.706378 1.869885 2.077166 2.261281 2.444183 -0.415990 0.652103 1.031293 1.269551 1.572746 1.772975 2.004659 2.175272 2.430606 2.596553 -0.242045 0.370942 0.534392 0.763529 1.001165 1.129764 1.682192 2.144644 2.324478 2.715697 -0.377438 0.588168 0.765394 0.976873 1.356652 1.490088 1.737970 2.006774 2.213691 2.389973 -0.191625 0.284123 0.405342 1.016777 1.432730 1.547592 1.813930 1.958317 2.470765 2.649257 -0.272672 0.349555 0.633911 1.152234 1.303938 1.547640 1.919504 2.047696 2.562779 2.730575 -0.168423 0.236330 0.421468 0.831345 1.083543 1.553448 1.880726 2.064701 2.370864 2.632945 -0.219318 0.301481 0.513617 0.765086 1.026019 1.514647 2.048203 2.248568 2.499810 2.657069 -0.232695 0.347947 0.495203 0.718830 1.423013 1.722493 1.879584 2.165044 2.420251 2.589658 -0.270284 0.336865 0.684929 1.155789 1.690421 1.876744 2.027359 2.226178 2.446748 2.582000 -0.149701 0.193747 0.352019 0.520123 0.823974 1.434753 1.686592 1.961148 2.370914 2.693067 -0.254818 0.412303 0.601514 0.771438 1.175450 1.376569 1.539029 1.937039 2.408576 2.563621 -0.233713 0.355886 0.593725 0.762880 1.271479 1.563900 1.797523 2.094688 2.538627 2.711734 -0.179028 0.237103 0.396818 1.042021 1.633539 1.762676 2.123935 2.322391 2.588193 2.751345 -0.182027 0.251039 0.434581 0.714302 0.950997 1.437895 1.813570 1.969103 2.145882 2.353968 -0.501538 0.692148 0.848860 1.071308 1.350543 1.489476 1.841643 2.104284 2.341536 2.515294 -0.274530 0.381470 0.526682 0.922143 1.444946 1.573605 1.858767 2.066747 2.284796 2.626819 -0.360617 0.583131 0.979491 1.254083 1.488351 1.797557 2.219518 2.482176 2.742366 2.862025 -0.140913 0.220301 0.619552 0.818307 1.052429 1.339972 1.830726 2.133953 2.536378 2.751128 -0.293514 0.391691 0.790080 0.962740 1.160319 1.526602 1.805491 2.041462 2.361619 2.564962 -0.199542 0.290571 0.452891 0.689515 1.258530 1.409879 1.886242 2.228126 2.465677 2.726646 -0.296920 0.356356 0.784287 0.996540 1.146175 1.623865 1.815498 2.038297 2.600627 2.705700 -0.206451 0.276025 0.537547 0.802572 1.220407 1.642060 1.863625 2.001978 2.215339 2.585384 -0.333650 0.464751 0.653772 0.966306 1.103865 1.340203 1.784701 1.914591 2.470171 2.686916 -0.181861 0.244870 0.376456 0.554383 1.329897 1.810440 2.047836 2.202318 2.660855 2.817057 -0.450565 0.647291 0.951172 1.229431 1.519644 1.686812 2.049107 2.267169 2.501284 2.650596 -0.219996 0.320591 0.427747 0.601183 0.753448 0.929578 1.741979 2.285789 2.472633 2.749566 -0.333848 0.423373 0.658791 1.031299 1.222625 1.365771 1.901889 2.121101 2.290306 2.531185 -0.166064 0.233902 0.383355 0.661806 1.226567 1.399684 1.771269 1.974537 2.173487 2.566344 -0.189286 0.243602 0.390584 1.387930 1.588719 1.763237 2.091118 2.316314 2.593526 2.755080 -0.158404 0.224878 0.385000 0.668463 0.942954 1.411967 1.700313 1.828069 2.059396 2.692546 -0.325989 0.461263 0.851471 1.045709 1.284028 1.516199 1.797341 2.088387 2.437669 2.627215 -0.223709 0.289190 0.632812 0.858738 1.541903 1.746766 1.935738 2.184816 2.404330 2.583013 -0.545842 0.952420 1.340820 1.516838 1.838879 2.012890 2.244968 2.403170 2.592285 2.691119 -0.238526 0.349079 0.494582 0.987665 1.170746 1.348229 1.468645 2.296964 2.644160 2.787381 -0.270857 0.442003 0.655998 0.881913 1.259254 1.428358 1.769867 1.998528 2.395589 2.652840 -0.154384 0.211806 0.489481 0.997257 1.249817 1.541232 1.778865 1.949397 2.319136 2.623391 -0.268258 0.312888 0.589114 1.258625 1.572705 1.675430 1.912780 2.070458 2.279933 2.564230 -0.170715 0.224965 0.374011 0.540197 1.161887 1.499072 1.925865 2.082569 2.246619 2.469724 -0.324358 0.391989 0.706816 0.833614 1.015725 1.568995 1.735976 2.127068 2.558411 2.653871 -0.178059 0.258575 0.374125 0.536831 1.334827 1.798628 1.986978 2.189252 2.432266 2.626696 -0.198857 0.420955 0.817664 1.178363 1.466742 1.821295 2.207327 2.474411 2.738275 2.851185 -0.188344 0.324302 0.470468 0.790033 0.934101 1.188722 1.887171 2.052833 2.448325 2.630236 -0.201295 0.365646 0.526513 0.758388 1.140096 1.267331 1.650173 1.879342 2.102889 2.600286 -0.135058 0.169428 0.307348 0.503160 1.018083 1.447946 1.810984 2.134002 2.480277 2.759846 -0.178006 0.266610 0.390327 0.928681 1.501613 1.621327 1.871356 2.025864 2.580442 2.770801 -0.246182 0.424290 0.644023 0.801168 1.114876 1.277757 1.503317 2.074888 2.295695 2.501380 -0.322996 0.430355 0.631600 1.047698 1.221840 1.426726 1.903081 2.032223 2.516726 2.708452 -0.292994 0.430599 0.619178 0.794567 1.283029 1.652817 1.840836 2.069946 2.385375 2.528246 -0.525494 0.787797 1.121816 1.387482 1.674574 1.936221 2.224042 2.390624 2.634276 2.743234 -0.299504 0.409196 0.602235 0.892336 1.056426 1.253766 1.489136 1.639876 2.427480 2.650368 -0.423758 0.520480 0.758987 1.041257 1.173655 1.423676 1.818235 1.936407 2.363001 2.626644 -0.155042 0.247496 0.641445 0.954509 1.224970 1.465850 1.837841 2.090456 2.451501 2.716155 -0.251949 0.421094 0.706797 0.975659 1.259906 1.520067 1.816310 2.122017 2.474913 2.716671 -0.215220 0.302248 0.730598 0.896343 1.145567 1.370192 1.700685 2.022563 2.283265 2.489220 -0.285230 0.453559 0.663670 0.861526 1.011602 1.247419 1.655985 1.861291 2.578936 2.731333 -0.162067 0.219409 0.373433 0.544669 1.103298 1.597178 1.921040 2.143402 2.406499 2.660484 -0.342367 0.511499 0.931350 1.163219 1.393645 1.611146 1.972769 2.194416 2.470766 2.649264 -0.251010 0.364125 0.560956 0.746545 1.019837 1.170725 1.532945 2.288671 2.577088 2.723074 -0.315001 0.489412 0.720682 0.877607 1.090466 1.253848 1.448221 1.922954 2.255887 2.408634 -0.174666 0.235793 0.387644 0.554402 1.231089 1.456137 1.688034 2.127450 2.367035 2.597270 -0.215113 0.341915 1.043717 1.322751 1.495414 1.741895 1.961164 2.239824 2.544905 2.703945 -0.219852 0.301770 0.513912 0.705474 0.877540 1.295896 1.699002 1.987057 2.287968 2.496966 -0.290638 0.366442 0.655155 1.044990 1.172154 1.532536 1.800791 1.948931 2.509679 2.660055 -0.232252 0.313770 0.658552 0.941977 1.463174 1.665488 1.862461 2.027843 2.534016 2.701236 -0.326539 0.552681 1.121731 1.331381 1.520072 1.867084 2.082861 2.332474 2.606039 2.737092 -0.190254 0.340428 0.492777 0.739738 0.895461 1.079371 1.643156 1.795290 2.491822 2.729382 -0.283586 0.418440 0.587306 0.870866 1.418553 1.577030 1.799498 2.069398 2.274484 2.438103 -0.235752 0.357650 0.502891 1.012434 1.258853 1.407789 1.820057 1.955830 2.505903 2.734330 -0.278412 0.343137 0.849977 1.232895 1.350504 1.590626 1.787519 2.091578 2.541360 2.663856 -0.162966 0.243159 0.439238 0.684821 0.887783 1.462899 1.881739 2.044253 2.289393 2.705002 -0.235063 0.371799 0.578210 0.752199 1.008546 1.476284 1.804912 2.271399 2.655042 2.789653 -0.154939 0.223696 0.344718 0.667555 1.495659 1.669436 2.069883 2.307215 2.627692 2.811343 -0.239702 0.335917 0.716616 1.131805 1.452514 1.639133 2.105515 2.279822 2.502030 2.669220 -0.226818 0.331261 0.472705 0.651974 0.781639 1.219798 1.822904 2.082732 2.439327 2.610900 -0.223413 0.359594 0.534704 0.741518 1.225894 1.389874 1.618191 2.009911 2.207000 2.459844 -0.171308 0.268378 0.383799 0.858926 1.376293 1.519165 1.780601 1.922915 2.623094 2.802402 -0.140134 0.212320 0.443224 0.967457 1.264241 1.562153 1.929148 2.217388 2.668341 2.830751 -0.221323 0.322124 0.485563 0.818589 1.011837 1.198984 1.423616 1.669403 2.157523 2.363190 -0.369687 0.525655 0.719213 0.939654 1.137631 1.312217 1.599935 1.826813 2.355221 2.580680 -0.211975 0.314411 0.489148 0.739213 1.377801 1.554504 1.824373 2.158875 2.352992 2.722621 -0.170698 0.296368 0.934285 1.243133 1.555900 1.866544 2.159940 2.363436 2.585032 2.738530 -0.189263 0.305887 0.439912 0.784610 1.227264 1.342508 1.587650 1.754907 2.439893 2.721315 -0.296339 0.385169 0.612012 1.081322 1.276361 1.437178 1.871470 2.001718 2.339094 2.640217 -0.229588 0.320544 0.517278 0.969137 1.142560 1.626089 1.877916 2.115461 2.546741 2.708025 -0.248869 0.420193 0.732388 1.049015 1.303410 1.601458 1.949210 2.239464 2.648223 2.822614 -0.207600 0.292320 0.496539 0.857149 1.182294 1.399849 1.714165 1.868238 2.027936 2.200737 -0.225558 0.396897 0.541783 0.873366 1.178972 1.299579 1.677191 1.849602 2.330475 2.752717 -0.176821 0.231377 0.372767 0.508565 1.152819 1.808050 2.112679 2.250073 2.571342 2.748550 -0.352149 0.515765 1.023238 1.260221 1.443565 1.622067 1.872804 2.100177 2.489280 2.671043 -0.166138 0.263444 0.370151 0.590066 0.754819 0.940533 1.761870 1.946611 2.445015 2.758191 -0.342082 0.476411 0.656223 0.851774 1.003992 1.153372 1.694401 2.065625 2.255642 2.440148 -0.227237 0.376514 0.514329 0.894887 1.141673 1.283052 1.831377 1.985902 2.334470 2.784878 -0.215891 0.269548 0.684111 1.405658 1.674813 1.800925 2.172085 2.339395 2.591569 2.730100 -0.236240 0.400377 0.533684 0.750343 0.910405 1.089112 1.737729 1.912807 2.192519 2.688733 -0.169242 0.284879 0.916252 1.169769 1.433683 1.644376 1.919124 2.161625 2.482664 2.682591 -0.270731 0.336506 0.477594 1.042714 1.605840 1.796859 1.945909 2.160039 2.354913 2.520950 -0.420586 0.652563 1.117162 1.406006 1.747537 1.947424 2.203094 2.359970 2.547902 2.682168 -0.281552 0.395037 0.640181 0.944531 1.193959 1.330492 1.718657 2.188389 2.444591 2.578673 -0.311824 0.476892 0.633431 0.845825 1.332518 1.491656 1.693614 2.041082 2.289317 2.439399 -0.133945 0.200790 0.647237 0.927687 1.188883 1.369658 1.699557 1.972777 2.295259 2.678185 -0.204796 0.278215 0.443465 1.270484 1.405209 1.640920 1.824252 2.327085 2.599637 2.772533 -0.183970 0.244116 0.410594 0.639103 1.221589 1.404867 1.628358 1.902439 2.168632 2.306804 -0.343622 0.434735 0.666599 0.868069 1.048942 1.532778 1.819835 1.971884 2.288701 2.448745 -0.238017 0.320361 0.657255 0.917611 1.303306 1.727361 1.988909 2.181455 2.442965 2.613322 -0.323613 0.545056 0.930173 1.226059 1.440181 1.772300 2.056890 2.347811 2.689382 2.820616 -0.288930 0.401387 0.617124 0.836453 0.990306 1.261227 1.913283 2.110049 2.324584 2.557162 -0.332670 0.480804 0.656147 0.880536 1.029566 1.230493 1.769063 1.932296 2.200370 2.585210 -0.185551 0.265352 0.409432 0.608847 1.034698 1.222821 1.876965 2.171647 2.403502 2.666441 -0.155026 0.223348 0.401684 1.079141 1.415789 1.620021 2.045515 2.258512 2.631625 2.802291 -0.183461 0.263081 0.425694 0.635685 1.188664 1.357556 1.574991 2.085982 2.288725 2.511108 -0.314738 0.463011 0.648733 0.877651 1.002890 1.265811 2.005414 2.198095 2.481535 2.714178 -0.244411 0.318444 0.546578 0.793615 1.326150 1.735479 1.945598 2.114662 2.315350 2.478535 -0.326237 0.543540 0.987361 1.304413 1.684932 1.902147 2.207172 2.374273 2.557527 2.716216 -0.157795 0.283302 0.430398 0.660379 0.811060 1.142539 1.479298 1.718714 2.670264 2.847556 -0.220856 0.283872 0.779935 1.074940 1.312211 1.626329 1.837609 1.968885 2.155988 2.602381 -0.140763 0.205719 0.406561 0.762459 1.041266 1.486993 1.838306 2.114606 2.552810 2.772285 -0.140451 0.395920 0.792110 1.108001 1.402642 1.623079 1.943151 2.227952 2.546163 2.773998 -0.229862 0.336462 0.546590 0.810150 1.201906 1.346787 1.825323 2.092925 2.285730 2.473359 -0.224913 0.328246 0.517269 0.874793 1.012587 1.452178 1.695778 2.014930 2.511447 2.672574 -0.247745 0.335741 0.546558 0.710177 1.170556 1.727789 1.970678 2.158532 2.482819 2.628913 -0.398252 0.555087 0.890367 1.121205 1.381533 1.601228 1.866647 2.066612 2.405164 2.588016 -0.198563 0.288867 0.478054 0.658477 0.851841 1.027105 1.539739 2.021106 2.579462 2.784184 -0.304271 0.371642 0.661590 1.068976 1.224249 1.411927 1.680524 1.869770 2.100073 2.308554 -0.188223 0.257939 0.432402 0.735050 1.318038 1.485528 1.828110 2.046435 2.307018 2.457237 -0.246723 0.297276 0.604475 1.310901 1.570442 1.688851 1.913658 2.051334 2.556011 2.714965 -0.158309 0.234509 0.435792 0.667900 0.957567 1.235918 1.592945 1.818158 2.307389 2.768973 -0.419843 0.501412 0.766892 1.073173 1.189374 1.480225 1.766597 1.922151 2.537937 2.694771 -0.275140 0.335563 0.678421 1.081521 1.592379 1.772635 1.931245 2.140699 2.333804 2.490857 -0.372056 0.856814 1.239538 1.409989 1.690297 1.863018 2.072702 2.273547 2.532657 2.690517 -0.321254 0.422981 0.604856 0.793437 0.912112 1.128454 1.795979 2.173232 2.360146 2.536137 -0.395214 0.598779 0.771997 0.946713 1.213777 1.330433 1.660335 1.977154 2.165056 2.344018 -0.225286 0.317828 0.464801 1.112329 1.369512 1.511999 1.921954 2.053407 2.593519 2.777285 -0.330612 0.407807 0.730129 1.259731 1.459811 1.605671 1.981307 2.137009 2.465971 2.679722 -0.213145 0.305305 0.507016 0.662299 1.056848 1.479862 1.671904 2.102707 2.369871 2.581994 -0.219658 0.296096 0.443507 0.610973 0.799691 1.676579 1.965487 2.153235 2.502228 2.692999 -0.174947 0.257739 0.373547 0.552567 1.405316 1.614249 1.848917 2.117795 2.317884 2.711904 -0.209667 0.297529 0.756195 1.095304 1.564196 1.844775 2.103697 2.292657 2.520051 2.679489 -0.170138 0.240310 0.452247 0.684414 0.880102 1.366921 1.741648 2.131295 2.505730 2.732611 -0.278164 0.468635 0.707518 0.853693 1.054780 1.210458 1.540941 2.174562 2.410662 2.612138 -0.155738 0.238890 0.352836 0.621012 1.441438 1.619698 1.825165 1.975331 2.525373 2.748574 -0.223776 0.274424 0.479048 0.797871 1.694190 1.878135 2.135285 2.373726 2.595422 2.729787 -0.151088 0.198286 0.326558 0.536276 0.845893 1.141653 1.460565 1.762868 2.025851 2.177303 -0.434445 0.614208 0.887657 1.028446 1.191359 1.392204 1.786886 2.062481 2.423405 2.619356 -0.180755 0.275311 0.397787 0.859366 1.409762 1.523325 1.908846 2.082319 2.389720 2.743887 -0.275975 0.508416 0.889894 1.318925 1.633314 1.904728 2.169012 2.374655 2.726973 2.847666 -0.156239 0.262624 0.406657 0.739074 1.044495 1.201234 1.810887 2.005600 2.581700 2.804889 -0.195391 0.258771 0.654924 0.824371 1.315259 1.500728 1.765938 2.063992 2.341176 2.513659 -0.178034 0.301047 0.463020 0.716172 1.198868 1.340454 1.834558 2.022132 2.400750 2.776294 -0.340368 0.404236 0.843747 1.039238 1.202107 1.708051 1.914952 2.169509 2.521521 2.623348 -0.218465 0.289694 0.528045 0.817051 1.132337 1.580464 1.838891 1.983392 2.147493 2.348131 -0.322509 0.458058 0.654679 0.958976 1.118211 1.321565 1.901390 2.046409 2.360931 2.664215 -0.191821 0.252321 0.389176 0.581111 1.529667 1.931689 2.083614 2.270465 2.566855 2.713879 -0.493961 0.710827 0.982260 1.196274 1.419327 1.620910 1.928015 2.145652 2.429769 2.601973 -0.213148 0.311589 0.424636 0.602664 0.736895 1.022165 1.992278 2.218533 2.611628 2.850324 -0.288129 0.434441 0.629313 0.856153 1.289667 1.424520 1.875795 2.150240 2.351814 2.536843 -0.160031 0.230716 0.406654 0.870424 1.156517 1.392317 1.804098 1.951437 2.210479 2.735164 -0.229340 0.293962 0.503222 1.242097 1.475824 1.624647 1.998680 2.144499 2.578549 2.753270 -0.158770 0.220035 0.363386 0.577761 0.963090 1.174939 1.738169 1.979202 2.162436 2.661916 -0.346062 0.444816 0.716985 1.180717 1.370580 1.522996 1.892173 2.066682 2.395796 2.627659 -0.307495 0.389330 0.612607 0.969283 1.557708 1.839939 1.996737 2.172382 2.420627 2.539195 -0.437804 0.726957 1.291168 1.503297 1.765428 1.962121 2.163647 2.336227 2.579616 2.708524 -0.232184 0.333678 0.528368 0.706749 1.203280 1.379018 1.611161 2.154678 2.592903 2.750319 -0.272652 0.461710 0.625777 0.839609 1.342021 1.496726 1.715376 2.137572 2.370040 2.597390 -0.184908 0.302324 0.454883 0.880307 1.104383 1.292526 1.777203 1.943364 2.444174 2.622726 -0.265644 0.341261 0.553228 1.139475 1.427148 1.560441 1.933941 2.084129 2.393307 2.654135 -0.167920 0.207301 0.370331 0.525538 1.030891 1.368163 1.782474 2.062404 2.332762 2.526299 -0.343172 0.433912 0.717501 0.889734 1.052060 1.695278 2.053156 2.208456 2.608869 2.718320 -0.216527 0.305247 0.445890 0.729271 1.639736 1.903284 2.053351 2.221254 2.432253 2.568018 -0.110545 0.209955 0.844788 1.174205 1.492201 1.810243 2.177274 2.440496 2.697294 2.835232 -0.217384 0.337412 0.488999 0.761842 0.879715 1.209528 1.970747 2.120795 2.611654 2.791762 -0.190459 0.296484 0.469967 0.800649 1.105561 1.278527 1.516938 1.693066 2.114420 2.716739 -0.134814 0.175978 0.300425 0.496817 1.244295 1.485308 1.861721 2.131233 2.485046 2.773884 -0.210174 0.278266 0.435508 0.927538 1.606908 1.753898 1.957554 2.166283 2.398518 2.749609 -0.213766 0.315300 0.509924 0.709930 0.964724 1.106776 1.382615 2.001070 2.323214 2.565314 -0.400615 0.524954 0.798552 1.012852 1.135488 1.474850 1.989029 2.130909 2.507971 2.679460 -0.249400 0.377023 0.519635 0.754227 1.459559 1.642762 1.828961 2.077882 2.298228 2.467534 -0.473365 0.683973 1.052341 1.375830 1.548106 1.747589 2.139299 2.318768 2.609977 2.739255 -0.203877 0.341791 0.485180 0.884069 1.097592 1.269532 1.479924 1.757879 2.648399 2.822387 -0.273046 0.404254 0.555403 0.954547 1.291233 1.399022 1.722890 1.903441 2.171984 2.645312 -0.040369 0.117266 0.617136 0.892043 1.260331 1.541653 1.859383 2.153096 2.498232 2.761886 -0.132414 0.211358 0.742445 1.066857 1.331084 1.570793 1.867458 2.132535 2.479624 2.731076 -0.237329 0.326529 0.612538 0.790663 0.990133 1.413736 1.738235 1.936914 2.167728 2.451626 -0.273960 0.405794 0.572530 0.933672 1.057816 1.397952 1.856531 1.997548 2.599486 2.760042 -0.199334 0.298380 0.442931 0.628638 1.303213 1.640138 1.804023 2.113020 2.375455 2.548946 -0.350188 0.502010 0.821298 1.038639 1.369294 1.592404 1.910815 2.156486 2.460508 2.653260 -0.281558 0.399892 0.573105 0.753299 0.900613 1.054574 1.581987 2.178437 2.430354 2.616044 -0.344653 0.543532 0.703715 0.862285 1.198215 1.338208 1.579080 2.060769 2.306749 2.485749 -0.220701 0.326795 0.520618 0.755133 1.295552 1.451886 1.690502 2.200045 2.414271 2.615909 -0.279478 0.332193 0.801527 1.345966 1.487477 1.678499 1.922202 2.100025 2.585571 2.713387 -0.163502 0.212169 0.365096 0.525464 0.869846 1.208807 1.793988 2.040314 2.297180 2.469797 -0.285531 0.341488 0.754059 1.170016 1.300835 1.513696 1.699861 1.889918 2.581459 2.706874 -0.249595 0.366997 0.626427 0.945219 1.407043 1.560558 1.831657 2.231149 2.466354 2.654518 -0.271671 0.443136 1.156412 1.406456 1.676521 1.856481 2.063218 2.230498 2.475840 2.639575 -0.286620 0.427806 0.637320 0.803409 0.996161 1.266383 1.681751 2.003968 2.394651 2.588547 -0.314906 0.440519 0.612129 0.896126 1.472415 1.717693 1.881351 2.099437 2.369166 2.495466 -0.170277 0.251270 0.405477 0.915641 1.126887 1.436630 1.714771 1.893198 2.552995 2.738519 -0.279410 0.337137 0.734563 1.281046 1.480602 1.611880 1.853215 1.994883 2.416054 2.654827 -0.165776 0.226083 0.417544 0.744574 1.044468 1.534891 1.808494 1.944946 2.138491 2.601790 -0.264579 0.336652 0.542033 0.710190 0.913338 1.655751 1.817762 2.231956 2.524436 2.658519 -0.158194 0.235588 0.338347 0.541657 1.583377 1.766293 2.009135 2.243336 2.503941 2.775158 -0.332612 0.509620 0.822935 1.075876 1.454286 1.650788 1.974450 2.251279 2.537342 2.745115 -0.262817 0.359709 0.520893 0.707667 0.818364 1.438849 1.971249 2.087666 2.497014 2.646442 -0.233200 0.399599 0.612456 0.775547 1.199192 1.355765 1.646901 2.136245 2.342490 2.695742 -0.149687 0.238538 0.372248 0.634520 1.255813 1.433790 1.770041 1.928752 2.611905 2.824930 -0.137016 0.210297 0.591489 1.125451 1.375648 1.685296 2.089612 2.390888 2.704458 2.844434 -0.213490 0.341024 0.541716 0.750061 1.088199 1.244576 1.555338 1.965568 2.187900 2.383714 -0.300159 0.489291 0.825022 1.037100 1.194088 1.347375 1.684747 2.024936 2.465611 2.740973 -0.170029 0.255033 0.392758 0.727117 1.382065 1.579676 1.800912 1.959072 2.282335 2.728796 -0.175883 0.365509 1.112175 1.385866 1.720391 1.977810 2.245295 2.421614 2.629567 2.754004 -0.162590 0.248164 0.454630 0.763209 0.966031 1.282338 1.730743 1.938052 2.479376 2.667563 -0.258043 0.345866 0.556520 0.981312 1.361528 1.482377 1.872244 2.158226 2.362269 2.555030 -0.234139 0.348843 0.528234 0.987884 1.195217 1.422145 1.960028 2.127365 2.603321 2.793004 -0.179699 0.559209 0.867682 1.088835 1.316888 1.571498 1.922198 2.197391 2.501118 2.728679 -0.216784 0.310791 0.487492 0.932903 1.201954 1.366554 1.800398 1.977499 2.174265 2.537065 -0.186878 0.400655 0.580952 0.846287 1.103872 1.266778 1.842772 2.019592 2.488005 2.717222 -0.164641 0.248712 0.389358 0.772822 1.212561 1.369916 2.025869 2.277615 2.617524 2.809527 -0.351899 0.520326 0.926597 1.219651 1.509839 1.676837 1.921744 2.111253 2.356380 2.545934 -0.242182 0.365285 0.506156 0.716020 0.865221 1.011688 1.786917 2.122981 2.350877 2.767729 -0.413776 0.559566 0.735800 0.928997 1.079117 1.267179 1.880069 2.152492 2.324834 2.539856 -0.210597 0.329568 0.469735 0.788590 1.215495 1.319810 1.711456 2.058991 2.245438 2.653727 -0.197937 0.254148 0.477985 1.227090 1.629920 1.767432 2.186975 2.385104 2.594869 2.725544 -0.205489 0.333855 0.523915 0.706275 1.102152 1.246608 1.648901 2.026835 2.281695 2.759313 -0.230328 0.322431 0.861834 1.145614 1.347211 1.576111 1.807275 2.004824 2.354365 2.572251 -0.224898 0.282022 0.506636 1.152298 1.626560 1.752095 2.028178 2.218821 2.488955 2.670460 -0.313732 0.625469 1.164472 1.499077 1.749612 2.018528 2.262230 2.429601 2.692165 2.822502 -0.375623 0.575307 0.791200 0.935770 1.096937 1.343393 1.807992 2.187306 2.519720 2.694803 -0.236981 0.332412 0.479270 0.844461 1.347641 1.490733 1.683942 2.039143 2.297619 2.458431 -0.129047 0.206250 0.636751 0.865101 1.136893 1.356610 1.704798 1.916685 2.518358 2.756320 -0.195171 0.266517 0.414793 1.239561 1.452906 1.608357 1.833045 2.047802 2.473522 2.621994 -0.165853 0.212720 0.372757 0.536136 1.013938 1.339627 1.555122 1.945745 2.236281 2.440949 -0.256981 0.368868 0.635878 0.802543 1.084757 1.439120 1.814729 2.120519 2.458154 2.621456 -0.214382 0.297135 0.445091 0.702050 1.365102 1.851262 2.067026 2.207298 2.470728 2.612432 -0.340710 0.532103 0.935278 1.171022 1.377886 1.638598 1.965274 2.246164 2.631266 2.806341 -0.310524 0.412051 0.582478 0.768755 0.871594 1.119854 1.926346 2.207508 2.407091 2.636633 -0.249349 0.443517 0.631532 0.810096 1.205129 1.357206 1.607396 1.984157 2.208016 2.645111 -0.143090 0.185312 0.325214 0.504000 1.134467 1.327913 1.673654 2.006903 2.389284 2.746094 -0.226575 0.298946 0.453938 0.998061 1.394600 1.597283 2.064183 2.223246 2.425469 2.569458 -0.183924 0.255181 0.415834 0.624247 1.042338 1.203077 1.555240 2.125309 2.400352 2.661916 -0.275610 0.365968 0.654909 0.990108 1.170799 1.455333 2.077561 2.252672 2.502315 2.685945 -0.204334 0.287844 0.394810 0.761295 1.501200 1.784709 1.935569 2.152830 2.349263 2.545639 -0.342976 0.527539 0.917466 1.160585 1.499531 1.761830 2.095272 2.301872 2.540570 2.694692 -0.202374 0.333367 0.480179 0.708677 0.819505 1.105285 1.806641 1.953348 2.610844 2.797497 -0.307033 0.368471 0.602486 1.108611 1.413347 1.528636 1.798519 1.986138 2.169052 2.437256 -0.144073 0.196932 0.386988 0.819061 1.289767 1.625073 1.901924 2.136105 2.483019 2.707970 -0.176760 0.268627 0.662082 1.056866 1.547973 1.711386 1.972939 2.249909 2.544471 2.761094 -0.191409 0.292985 0.492193 0.800526 1.041836 1.278546 1.836626 2.028677 2.249387 2.627785 -0.324102 0.399146 0.687435 0.868704 1.022957 1.582084 1.853847 1.981885 2.554914 2.677057 -0.229172 0.302836 0.481418 0.704363 0.967567 1.828269 2.097295 2.258467 2.549112 2.704652 -0.467124 0.696788 0.939500 1.094987 1.277543 1.488496 1.896279 2.158470 2.474182 2.659994 -0.175418 0.234039 0.367674 0.513586 0.747619 1.008405 1.583161 2.053114 2.363292 2.681153 -0.410273 0.561949 0.736215 0.956685 1.135688 1.288424 1.750612 1.937714 2.151318 2.489336 -0.204541 0.277613 0.529607 0.722971 1.199975 1.447336 1.715634 1.921054 2.357781 2.507488 -0.253116 0.311907 0.696982 1.320082 1.575418 1.705324 2.005068 2.168666 2.461879 2.665053 -0.163657 0.237902 0.393374 0.609490 0.854272 1.089980 1.526387 1.842337 2.126252 2.679051 -0.448627 0.530664 0.812719 1.095201 1.207641 1.575411 1.884209 2.034297 2.553007 2.688355 -0.262717 0.338748 0.512685 1.003543 1.480178 1.622083 1.828518 2.142415 2.356457 2.511530 -0.417111 0.636688 1.036571 1.319877 1.679924 1.873389 2.073722 2.249396 2.507732 2.651054 -0.263698 0.461151 0.618737 0.830471 1.004041 1.158874 1.801566 2.020222 2.306558 2.743041 -0.387779 0.575108 0.729791 0.932981 1.361163 1.505161 1.751183 2.068466 2.338260 2.487637 -0.181510 0.265666 0.454631 1.082382 1.287303 1.579202 1.851178 2.096963 2.467237 2.646930 -0.277668 0.345119 0.602341 1.179200 1.378990 1.545625 1.813861 1.962590 2.491799 2.664453 -0.179320 0.248080 0.456925 0.722589 1.126932 1.579450 1.799397 1.950668 2.484125 2.707238 -0.314322 0.381145 0.608651 0.727613 0.890472 1.610280 2.136172 2.258358 2.596376 2.709780 -0.189539 0.266068 0.419729 0.651693 1.410161 1.643106 1.854810 2.275582 2.492054 2.722009 -0.254466 0.313038 0.594149 1.012536 1.688813 1.935465 2.119184 2.287869 2.535543 2.667926 -0.134691 0.171906 0.302740 0.492936 0.899551 1.229188 1.733940 2.012878 2.446339 2.742762 -0.231556 0.365068 0.680761 0.889142 1.111338 1.295904 1.542636 1.971784 2.427562 2.631912 -0.222525 0.305606 0.527193 0.687519 1.181381 1.671764 1.863683 2.072023 2.634517 2.779272 -0.178770 0.237415 0.375160 0.856692 1.673680 1.813743 2.016791 2.272421 2.522601 2.735959 -0.193532 0.268731 0.451328 0.753471 0.984854 1.285349 1.685647 1.884123 2.091677 2.243418 -0.476037 0.651610 0.801054 1.010162 1.241374 1.355840 1.775976 2.086152 2.272907 2.454351 -0.211657 0.308331 0.421366 0.865966 1.418774 1.556743 1.786149 2.020332 2.198585 2.631981 -0.203789 0.490794 1.010137 1.275006 1.472213 1.810140 2.170639 2.437660 2.662122 2.788061 -0.174355 0.252095 0.674715 0.842194 1.055087 1.278000 1.698680 2.070561 2.399385 2.657430 -0.245109 0.324049 0.628822 0.927910 1.123601 1.580066 1.878640 2.054601 2.358721 2.546838 -0.182644 0.253804 0.386248 0.614056 1.364821 1.545877 2.040174 2.218827 2.419010 2.624609 -0.295605 0.367794 0.690701 1.055162 1.186600 1.644453 1.944154 2.101444 2.562120 2.691268 -0.220878 0.289573 0.640307 0.822072 1.144055 1.567797 1.766410 1.908109 2.103459 2.560489 -0.403453 0.526298 0.732204 0.901150 1.035869 1.339383 1.783990 1.941961 2.371032 2.626653 -0.212825 0.258570 0.471588 0.685549 1.263740 1.821051 2.163822 2.288398 2.628063 2.788155 -0.401181 0.642053 1.032473 1.236110 1.444450 1.686678 2.006722 2.228515 2.572112 2.723964 -0.239433 0.341091 0.492629 0.707630 0.881426 1.030816 1.719255 2.344056 2.579063 2.756942 -0.294093 0.382770 0.577412 1.009281 1.313036 1.419303 1.744673 2.094230 2.289039 2.475843 -0.169805 0.236922 0.403314 0.638995 1.176446 1.352145 1.665573 1.909756 2.150120 2.716243 -0.210447 0.277913 0.452474 1.402686 1.513430 1.720944 1.903938 2.278499 2.583756 2.743179 -0.159574 0.225382 0.374008 0.714137 1.011253 1.371713 1.699162 1.871587 2.027056 2.491194 -0.258602 0.557253 0.819720 1.038856 1.301470 1.445358 1.830613 2.098171 2.320809 2.541075 -0.232756 0.282242 0.631974 0.898694 1.537444 1.869217 2.063967 2.234463 2.498226 2.633517 -0.580133 0.997946 1.320956 1.481874 1.731605 1.898579 2.120712 2.290128 2.530088 2.651657 -0.211840 0.307093 0.453360 0.945579 1.250815 1.490290 1.724135 2.281097 2.562699 2.752602 -0.314276 0.493555 0.667782 0.896500 1.323006 1.482618 1.667487 1.974415 2.427345 2.555679 -0.182455 0.261592 0.418011 1.050927 1.261387 1.443370 1.665467 1.939030 2.444695 2.638451 -0.241570 0.306934 0.491293 1.105950 1.554827 1.666520 1.923917 2.087652 2.367600 2.654889 -0.190084 0.254850 0.454062 0.724519 1.083362 1.393887 1.892335 2.088856 2.321764 2.484299 -0.306497 0.389831 0.721793 0.839714 1.124754 1.652401 1.822919 2.273310 2.569195 2.669599 -0.186200 0.273460 0.383201 0.564758 1.511073 1.845018 1.998284 2.194096 2.388693 2.587923 -0.300722 0.478218 0.823364 1.127490 1.591141 1.871349 2.174720 2.403181 2.624785 2.782405 -0.228884 0.358342 0.504622 0.795874 1.005622 1.152613 1.908053 2.124794 2.372473 2.797584 -0.171885 0.248234 0.432842 0.833143 1.040892 1.269289 1.661635 1.918629 2.158962 2.653403 -0.140943 0.193684 0.343025 0.562303 1.069552 1.543330 1.824473 1.961637 2.463513 2.770537 -0.173053 0.245656 0.360656 0.960618 1.589535 1.689906 1.984141 2.142998 2.588389 2.759403 -0.240180 0.429951 0.637440 0.786596 1.069147 1.226573 1.470883 1.952052 2.195064 2.615973 -0.367862 0.471897 0.730834 1.082320 1.226293 1.462927 1.928169 2.052466 2.406737 2.662458 -0.247175 0.358209 0.535946 0.781876 1.363697 1.635239 1.807233 1.993776 2.452769 2.601039 -0.445578 0.687898 1.114108 1.301027 1.577397 1.886042 2.224903 2.436534 2.659695 2.761031 -0.214389 0.336025 0.487794 0.759534 0.970518 1.141100 1.457335 1.624644 2.306922 2.715265 -0.377300 0.466775 0.716121 1.083781 1.256543 1.411238 1.789433 1.936372 2.205572 2.562355 -0.148362 0.214593 0.545023 0.840437 1.193325 1.480659 1.791868 2.083419 2.410537 2.676129 -0.150403 0.278398 0.792676 0.976680 1.218845 1.405245 1.775056 2.162458 2.547861 2.746383 -0.236301 0.328633 0.630867 0.839915 1.042349 1.298870 1.627752 1.839491 2.298928 2.493962 -0.337889 0.497920 0.711277 0.850420 0.992027 1.246884 1.710746 2.086682 2.527158 2.707162 -0.172215 0.236540 0.372897 0.525146 1.182577 1.735727 1.927035 2.114619 2.319170 2.542782 -0.415304 0.624807 0.906616 1.117841 1.446155 1.669417 1.948413 2.172815 2.504530 2.670754 -0.265417 0.407241 0.613894 0.816534 0.980063 1.156061 1.756747 2.274851 2.497193 2.712242 -0.276440 0.468209 0.649518 0.816686 1.195171 1.355517 1.549226 1.935272 2.217871 2.426979 -0.188925 0.277012 0.412665 0.672627 1.354807 1.514523 1.699988 2.144554 2.382186 2.586077 -0.242630 0.352485 0.912974 1.343781 1.604428 1.801867 2.014791 2.193072 2.460809 2.631999 -0.190903 0.285841 0.449070 0.760328 0.954285 1.182936 1.692638 1.878163 2.276840 2.465963 -0.220659 0.300374 0.721694 0.947306 1.298330 1.562980 1.760618 1.888247 2.506445 2.689675 -0.213168 0.290928 0.695227 0.918179 1.378186 1.631987 1.847886 2.003072 2.358358 2.619347 -0.328586 0.517244 0.937320 1.376238 1.574840 1.764347 2.058630 2.224334 2.584444 2.756653 -0.248486 0.367007 0.562147 0.750632 0.902785 1.147563 1.637415 1.912062 2.413993 2.605696 -0.310691 0.477895 0.670796 0.940507 1.418293 1.563497 1.805141 2.114076 2.376358 2.535155 -0.256555 0.414210 0.559427 0.981289 1.191646 1.378307 1.678398 1.849306 2.576704 2.756630 -0.291424 0.335003 0.750149 1.289655 1.437209 1.599989 1.803177 1.967415 2.601748 2.733761 -0.195254 0.279513 0.451755 0.649111 0.828694 1.609509 1.914906 2.091219 2.319589 2.534899 -0.222304 0.332624 0.475678 0.685205 1.030332 1.737223 1.920979 2.378290 2.706719 2.817726 -0.164833 0.240093 0.359862 0.801929 1.513677 1.641713 2.040524 2.248843 2.488659 2.714025 -0.214777 0.287322 0.572644 1.145070 1.367112 1.752687 2.042424 2.222067 2.543047 2.697885 -0.226099 0.330382 0.474439 0.687757 0.799187 1.319837 1.944566 2.078099 2.367800 2.508460 -0.244540 0.392163 0.553692 0.729765 1.247865 1.448376 1.617590 2.074636 2.340052 2.518064 -0.175381 0.314231 0.446023 0.797404 1.328458 1.439727 1.793346 1.939571 2.468800 2.721651 -0.205808 0.293670 0.452447 1.074268 1.288235 1.655635 1.857504 2.364687 2.639812 2.798144 -0.253926 0.392653 0.587584 0.800134 0.976310 1.185587 1.570687 1.821414 2.090893 2.349021 -0.322461 0.410912 0.723569 1.060644 1.201524 1.400360 1.579189 1.788759 2.460242 2.616602 -0.211266 0.304981 0.436011 0.771978 1.490623 1.677748 1.886227 2.113497 2.326353 2.727265 -0.235012 0.406911 0.864785 1.291485 1.708295 1.938554 2.179896 2.352404 2.563792 2.711446 -0.176814 0.268620 0.445837 0.823113 1.029776 1.271571 1.623388 1.811215 2.402140 2.614165 -0.241865 0.339268 0.507509 1.003677 1.204347 1.372561 1.940795 2.101371 2.385606 2.669975 -0.230878 0.334743 0.500370 0.879929 1.021894 1.533770 1.970789 2.128971 2.567262 2.717288 -0.297505 0.451574 0.748848 0.988527 1.366237 1.606668 1.894660 2.174481 2.521427 2.759168 -0.199265 0.271145 0.498160 0.854679 1.172103 1.364148 1.762079 1.969095 2.173538 2.311630 -0.222173 0.424864 0.564942 0.829809 1.038172 1.194055 1.720601 1.858086 2.431760 2.741461 -0.181961 0.226819 0.390513 0.556339 1.056596 1.553065 2.128349 2.258018 2.602497 2.802121 -0.357600 0.565047 1.153012 1.350312 1.533576 1.718542 1.957892 2.175347 2.505650 2.678495 -0.162257 0.236808 0.374039 0.570569 0.748034 1.172262 1.823392 2.053032 2.513769 2.772072 -0.305794 0.465870 0.645121 0.882650 1.141294 1.266856 1.701581 2.002881 2.184124 2.411254 -0.231652 0.380738 0.549642 0.837410 1.225266 1.332971 1.851582 2.119371 2.315077 2.732108 -0.235449 0.286771 0.684809 1.346663 1.526630 1.703476 2.101486 2.254546 2.577181 2.718994 -0.233870 0.446515 0.605080 0.814654 1.054963 1.178801 1.633158 1.849743 2.139379 2.732772 -0.271706 0.335152 0.857227 1.253741 1.387189 1.702170 1.896767 2.191114 2.479999 2.601359 -0.237386 0.314549 0.438339 0.912164 1.577764 1.877791 2.032790 2.197037 2.412322 2.536484 -0.361168 0.574093 1.023843 1.468517 1.690562 1.917374 2.187368 2.334035 2.669095 2.806291 -0.278480 0.398742 0.573342 0.839212 1.073888 1.222093 1.691681 2.165258 2.377410 2.536882 -0.286018 0.447947 0.615060 0.849446 1.319465 1.463583 1.769948 2.001035 2.189431 2.450384 -0.219440 0.301601 0.668534 0.861094 1.210001 1.498673 1.745120 1.877765 2.314377 2.619597 -0.223591 0.352153 0.598841 1.217893 1.359082 1.591744 1.771089 2.213856 2.561538 2.735416 -0.176857 0.236601 0.395107 0.634632 1.133495 1.335116 1.770374 1.981313 2.206556 2.339716 -0.334735 0.402265 0.659168 0.781639 0.975228 1.664999 1.872069 2.047533 2.476961 2.573979 -0.215968 0.284755 0.524241 0.781460 1.334811 1.772379 1.953878 2.194209 2.578250 2.741939 -0.298193 0.489879 0.812985 1.183691 1.496418 1.679975 2.108792 2.316557 2.673779 2.851610 -0.312989 0.415446 0.618011 0.899096 1.083683 1.263384 1.887396 2.243064 2.419448 2.570481 -0.244471 0.431115 0.601512 0.813139 1.102163 1.221061 1.692440 2.033163 2.221795 2.619838 -0.150949 0.219060 0.349217 0.611327 1.077112 1.250547 1.915518 2.083980 2.449999 2.792543 -0.161611 0.218964 0.445377 0.927863 1.451151 1.768464 2.130012 2.366724 2.666003 2.814049 -0.196000 0.297256 0.497266 0.691900 1.089877 1.273685 1.513723 2.006472 2.273782 2.572221 -0.335268 0.460795 0.685187 0.867664 1.013807 1.479554 2.011994 2.168476 2.572643 2.717564 -0.257604 0.340872 0.499757 0.843052 1.396548 1.831688 2.034226 2.170332 2.422618 2.540496 -0.417663 0.631718 0.955424 1.197319 1.659797 1.879883 2.168797 2.359053 2.578087 2.698249 -0.162052 0.251583 0.439900 0.660911 0.903902 1.320296 1.624758 1.778577 2.530531 2.799705 -0.256861 0.322803 0.685370 1.086437 1.263276 1.569879 1.851654 2.014946 2.264711 2.447006 -0.125192 0.176171 0.336135 0.781600 1.200220 1.439966 1.805419 2.077525 2.462470 2.738186 -0.102286 0.191322 0.774556 1.076151 1.369456 1.627146 1.973015 2.236001 2.609367 2.812985 -0.173442 0.232622 0.491622 0.844157 1.095241 1.370797 1.696966 2.051411 2.316061 2.502053 -0.257531 0.343598 0.654071 0.838985 1.048102 1.487473 1.725385 1.897417 2.430505 2.585998 -0.197900 0.276312 0.440283 0.705103 1.267341 1.740297 1.934483 2.154007 2.400200 2.624136 -0.409590 0.596785 0.983751 1.181770 1.371153 1.502380 1.758280 2.018571 2.380053 2.592151 -0.231819 0.332890 0.483514 0.644585 0.816808 0.926308 1.403298 2.233007 2.467857 2.678461 -0.258610 0.340064 0.670485 0.908467 1.107611 1.456243 1.759580 1.932179 2.113118 2.310135 -0.184377 0.249203 0.410806 0.587907 1.302501 1.510319 1.724432 1.981890 2.282904 2.422125 -0.254110 0.313328 0.659859 1.265819 1.412949 1.665930 1.927154 2.101984 2.551446 2.673030 -0.161592 0.237480 0.376535 0.637094 0.823028 1.137613 1.696425 1.875770 2.403632 2.639617 -0.384501 0.466812 0.740791 0.938093 1.062352 1.509284 1.749143 1.917797 2.548157 2.671506 -0.333872 0.419367 0.638994 1.092624 1.520550 1.649447 1.866619 2.148941 2.346723 2.506140 -0.426216 0.686997 1.235881 1.428854 1.611591 1.792860 2.017593 2.233715 2.547773 2.696609 -0.262949 0.367509 0.530429 0.741867 0.872474 1.069602 1.745566 2.061187 2.283843 2.494178 -0.335782 0.547236 0.716211 0.919077 1.275686 1.408437 1.685118 1.967394 2.217639 2.446679 -0.227629 0.330991 0.486068 1.117571 1.304983 1.510130 1.757258 1.946972 2.625557 2.782597 -0.359850 0.436633 0.750634 1.201513 1.337571 1.594835 1.970273 2.113840 2.573808 2.729963 -0.211871 0.304028 0.512758 0.663762 1.086354 1.633335 1.818017 2.129577 2.391080 2.600766 -0.196092 0.279726 0.434488 0.624802 0.772358 1.404377 1.948777 2.160918 2.629996 2.775175 -0.176304 0.262521 0.373719 0.581101 1.520108 1.736172 1.933230 2.140172 2.358130 2.753524 -0.254932 0.381411 0.806187 1.102292 1.534523 1.750280 1.970904 2.159871 2.455922 2.658405 -0.190385 0.288656 0.449066 0.678174 0.812376 1.449326 1.728657 1.966320 2.638812 2.789546 -0.251178 0.386509 0.609363 0.797102 1.024159 1.181726 1.454661 2.012630 2.493092 2.698933 -0.166654 0.266226 0.385171 0.711990 1.397897 1.532347 1.915974 2.088003 2.565270 2.789532 -0.238453 0.306036 0.449309 0.876277 1.521437 1.933982 2.134420 2.267986 2.537601 2.658253 -0.161634 0.219919 0.353206 0.524346 0.961806 1.207713 1.687918 1.916939 2.161870 2.320657 -0.413612 0.597095 0.793763 0.986290 1.281786 1.412660 1.652465 2.016091 2.384164 2.528578 -0.228655 0.341562 0.480989 0.988605 1.371003 1.477423 1.861026 2.015852 2.339752 2.773153 -0.259092 0.597012 0.985224 1.321740 1.643354 1.957367 2.288682 2.497474 2.716492 2.844467 -0.185652 0.304664 0.446232 0.864434 1.091795 1.273770 1.942575 2.095543 2.524648 2.768245 -0.176687 0.256678 0.745652 0.934909 1.283760 1.440062 1.765242 2.122092 2.388099 2.590551 -0.189805 0.275637 0.440995 0.821356 1.256020 1.410985 1.929781 2.120144 2.396030 2.604643 -0.266823 0.337688 0.819408 1.134754 1.289204 1.777028 1.982886 2.221748 2.590286 2.698098 -0.205348 0.276512 0.527305 0.727412 1.024647 1.653979 1.904178 2.046613 2.217922 2.455661 -0.293498 0.424494 0.613795 0.956130 1.133981 1.324804 1.809031 1.953922 2.293854 2.575884 -0.183120 0.249650 0.376204 0.543914 1.350827 1.907220 2.092551 2.255705 2.514391 2.687901 -0.541205 0.789796 1.058955 1.269415 1.503899 1.702191 1.970176 2.175444 2.496810 2.652238 -0.229326 0.339475 0.451881 0.661210 0.795832 1.073796 2.027104 2.206371 2.478903 2.726784 -0.330006 0.506868 0.673076 0.887406 1.228765 1.349226 1.781290 2.086583 2.277762 2.480029 -0.138389 0.200001 0.396259 0.811975 1.090712 1.460413 1.745493 1.904269 2.348250 2.699886 -0.176584 0.242161 0.378270 1.177848 1.564718 1.678166 1.951618 2.121413 2.580109 2.737132 -0.145852 0.198423 0.335644 0.550505 1.019727 1.371188 1.797635 1.943825 2.207490 2.746470 -0.385078 0.503696 0.703239 1.069987 1.365736 1.472054 1.825827 2.159636 2.371283 2.520972 -0.284950 0.388050 0.507352 0.879125 1.523530 1.776238 1.929597 2.157558 2.447986 2.586398 -0.491116 0.756155 1.255200 1.522460 1.776579 2.028121 2.286059 2.429774 2.679106 2.776164 -0.252477 0.396081 0.713022 0.861502 1.152223 1.370802 1.614010 2.144798 2.574072 2.712530 -0.282756 0.438437 0.613566 0.847746 1.260772 1.379059 1.642202 2.137540 2.368369 2.522163 -0.203971 0.322195 0.479842 0.953133 1.211278 1.397635 1.800812 1.954516 2.403478 2.573713 -0.264533 0.358424 0.628768 1.111242 1.340246 1.506485 1.999590 2.194109 2.461411 2.667361 -0.177730 0.223680 0.394553 0.556177 0.947415 1.500640 1.733528 1.926046 2.261466 2.436054 -0.314223 0.363636 0.727886 0.851880 1.053844 1.798132 1.974354 2.182595 2.537995 2.629683 -0.201778 0.275500 0.404891 0.747466 1.500050 1.841184 1.998843 2.226807 2.481989 2.669506 -0.132164 0.314955 0.821473 1.196038 1.426590 1.699934 2.036856 2.323497 2.685471 2.828965 -0.223374 0.347335 0.507730 0.773547 0.967916 1.134129 1.991403 2.306567 2.521364 2.788746 -0.312742 0.449784 0.583287 0.934234 1.268567 1.365063 1.569295 1.687046 2.077299 2.595022 -0.124286 0.162126 0.290730 0.654031 1.231658 1.538458 1.893070 2.184784 2.562637 2.798224 -0.177049 0.251654 0.367891 0.912504 1.557576 1.693045 1.898991 2.072136 2.350163 2.646045 -0.240517 0.378333 0.547809 0.754272 0.973321 1.103670 1.574418 2.028049 2.211127 2.562709 -0.427795 0.519003 0.771284 0.937240 1.086617 1.609879 1.878750 2.052791 2.534118 2.657149 -0.224370 0.317969 0.439666 0.812931 1.398497 1.626632 1.794178 2.114000 2.309157 2.496836 diff --git a/gr-vocoder/lib/codec2/codebook/lspjvm2.txt b/gr-vocoder/lib/codec2/codebook/lspjvm2.txt deleted file mode 100644 index 2b7cabf940..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspjvm2.txt +++ /dev/null @@ -1,513 +0,0 @@ -5 512 -0.005167 -0.037310 -0.002159 0.016849 0.130396 -0.039445 0.031680 -0.074412 -0.031499 0.060536 -0.019479 -0.030564 -0.048137 -0.056279 -0.027829 -0.020585 -0.011270 0.023913 -0.005706 0.011407 --0.023217 0.107455 -0.037777 0.004070 -0.017279 --0.090444 0.007641 0.099001 -0.047913 -0.017199 -0.022700 -0.063865 0.047213 0.043843 -0.036225 -0.001312 -0.123861 -0.038988 0.058666 0.074541 -0.039508 0.110300 0.013954 -0.119228 -0.035807 --0.047392 0.027035 -0.004412 -0.032650 -0.037150 -0.002491 -0.045447 0.158260 0.022828 -0.030124 --0.047856 0.088744 -0.009678 0.106688 0.087690 --0.027941 0.044084 -0.028500 0.018736 -0.069969 --0.035358 -0.051568 -0.030459 -0.017899 0.027632 --0.018607 -0.123557 0.019228 0.057485 -0.028907 -0.019057 0.038151 -0.080220 0.034222 0.023081 -0.021312 0.041905 0.112903 0.024092 0.093974 --0.116679 0.015344 -0.066059 -0.096437 0.004041 --0.022464 -0.116260 0.047819 -0.003921 -0.073504 -0.001975 -0.025869 0.028200 0.122690 0.010627 --0.035672 0.078963 -0.009686 0.000743 -0.147582 -0.016932 -0.020291 -0.096896 -0.237875 -0.029121 -0.017376 -0.040130 -0.053865 0.154060 -0.013215 -0.015215 -0.019023 -0.070604 0.032265 0.040340 -0.102365 -0.022746 0.019895 0.050570 0.008845 --0.034134 0.044441 -0.049387 -0.140481 0.072570 -0.013023 -0.006079 0.037574 0.004937 -0.081501 -0.003696 0.049908 0.007355 0.000403 0.026006 --0.008466 0.080680 0.061382 -0.108985 -0.088060 --0.012275 -0.081061 0.020333 -0.079001 0.068724 --0.014081 -0.042609 0.093365 0.044120 0.000303 -0.063391 0.096574 -0.105424 0.039041 0.010412 --0.054031 -0.084948 0.080406 -0.035883 0.137428 -0.063037 0.050562 0.024690 -0.031394 0.130320 --0.015501 -0.078884 -0.076886 -0.013864 -0.073587 -0.048778 0.003814 -0.031125 0.046897 0.028304 -0.048692 0.132795 0.065450 0.059487 -0.042396 --0.176999 0.056943 -0.004135 -0.049378 -0.041083 --0.039445 -0.016292 -0.004550 0.062010 -0.079613 --0.054566 -0.008476 -0.016710 0.049202 0.025758 --0.078723 0.092091 0.096536 -0.065079 0.021161 -0.076657 0.009203 -0.036866 -0.016559 0.012823 -0.008225 -0.003006 0.108033 0.043120 -0.060870 --0.019346 0.022790 -0.001728 0.062304 -0.016965 --0.001302 -0.014490 -0.041803 -0.034058 -0.197066 --0.033655 -0.127217 -0.108681 -0.010571 -0.004705 --0.015553 -0.086069 0.034109 -0.101379 0.002068 --0.004003 -0.044637 -0.068617 0.052228 -0.047812 --0.043307 0.035681 0.042207 -0.055946 0.055944 --0.026792 -0.012601 -0.056710 -0.021094 0.105842 --0.025598 -0.078858 -0.013487 0.030728 -0.031956 -0.031444 0.022763 0.025364 0.121366 0.070736 --0.084556 0.098118 -0.024301 -0.058655 -0.043194 --0.011752 -0.043781 0.091051 -0.071201 -0.020980 -0.082904 -0.031657 -0.088247 0.066709 -0.079182 --0.012151 0.011796 -0.010589 0.100656 0.094539 -0.035967 0.025338 0.071826 0.009741 -0.040209 -0.006866 -0.015095 -0.168469 -0.056133 0.060145 -0.045830 -0.068969 0.034551 0.015842 -0.092809 -0.054699 0.138744 0.001726 0.006927 0.005167 -0.016978 0.046384 -0.060183 -0.040742 -0.072692 --0.022489 -0.029728 -0.065018 -0.124741 0.044927 --0.029057 -0.037154 0.031068 0.060086 0.009984 -0.009311 -0.006957 -0.105508 0.059637 -0.019564 --0.068154 -0.066443 0.000799 0.028579 0.097063 -0.096936 0.030230 -0.034623 -0.088918 0.040334 -0.019439 -0.050707 -0.003294 -0.028505 -0.053599 -0.062460 -0.070688 -0.016465 -0.035680 0.017378 -0.009363 0.048761 0.043374 0.039587 -0.023232 --0.067033 0.042663 0.054070 -0.042797 -0.089391 --0.030497 -0.050249 0.059528 0.089089 -0.029633 -0.064125 -0.086614 -0.002005 0.080620 0.000502 --0.003490 0.097336 0.099565 0.015648 0.006691 -0.077668 0.016572 0.035404 -0.046026 0.017237 --0.048631 0.009314 0.141479 0.017079 0.043796 --0.106474 0.145951 0.057740 0.011250 -0.059443 -0.027572 0.026650 0.008527 0.002949 -0.037680 --0.077991 -0.090617 0.003420 -0.046010 0.007354 -0.019056 -0.128651 0.016464 0.004584 -0.030883 --0.092069 0.038976 -0.081840 0.066695 -0.047340 -0.003513 0.040613 0.046815 -0.023406 0.062389 -0.021759 0.024928 -0.018922 -0.048006 0.063800 --0.014416 -0.050333 0.042628 -0.114934 -0.101450 -0.062139 0.029295 -0.065908 0.111463 0.050781 --0.022707 0.135414 0.003548 0.134535 -0.048259 --0.092344 -0.027727 0.016343 -0.060786 -0.081502 --0.005412 -0.026229 -0.143331 0.052404 -0.077298 --0.035919 -0.041968 -0.106108 -0.004369 0.065028 -0.096370 -0.053299 0.043317 -0.049735 0.049815 -0.032324 0.051309 -0.009607 -0.205917 0.005023 --0.054316 -0.022895 0.099327 -0.006927 -0.076574 --0.111024 0.111026 0.038381 -0.060368 0.064238 --0.034316 0.026846 0.025740 -0.076162 -0.163904 -0.055955 -0.056885 0.014831 -0.120715 0.090938 -0.035289 -0.036439 0.060012 0.080302 0.036215 -0.065250 0.083030 -0.058784 0.104826 -0.051805 --0.011099 -0.006420 0.053042 0.024127 0.092534 -0.058569 -0.033442 0.025186 -0.018222 0.117744 -0.044345 -0.042456 -0.043767 -0.021378 -0.121965 -0.027371 0.052731 -0.020316 0.036912 0.115357 -0.031150 0.041547 0.059267 -0.039672 -0.086918 --0.162369 0.024801 0.031725 0.083400 -0.034463 -0.000272 -0.008147 -0.002016 0.131953 -0.092911 --0.091944 -0.062864 -0.005221 0.063647 -0.012658 -0.042685 0.067952 0.038644 -0.153221 0.096841 -0.108299 0.089446 -0.047164 0.004196 -0.043268 --0.035456 0.050838 0.070444 0.084465 -0.079980 --0.048916 0.057726 0.023894 0.027653 0.017775 -0.015461 -0.030287 -0.022245 0.052081 -0.150947 --0.002682 -0.056774 -0.123366 -0.091754 0.006536 -0.006473 -0.143025 0.054690 -0.043189 0.032970 -0.027446 0.033127 -0.132722 -0.010417 -0.080097 --0.018187 0.001858 0.111290 -0.090749 0.059434 --0.068738 0.090679 -0.145070 -0.065277 0.063514 --0.003982 -0.056382 -0.003673 0.015845 -0.073396 -0.043688 0.002836 0.069211 0.124852 -0.053313 --0.040946 0.070440 -0.107024 -0.019199 -0.033672 --0.001440 0.021680 0.110595 -0.053452 -0.052426 -0.035461 -0.028179 -0.049041 0.022580 -0.010989 --0.002913 -0.051691 -0.075881 0.037241 0.076377 -0.034735 -0.031556 0.073516 -0.001427 0.016296 --0.017537 0.003346 -0.099774 -0.067624 -0.044257 --0.018202 0.030622 0.012773 0.046475 -0.121785 --0.057265 0.116179 -0.079916 0.066396 0.050104 --0.013177 0.057766 -0.047879 -0.109526 -0.146491 -0.032675 -0.049318 -0.057045 -0.080068 0.089621 --0.046564 -0.029992 0.040828 0.029281 -0.037369 --0.009731 -0.082145 -0.117622 0.117077 0.037369 -0.000820 -0.106634 -0.007967 0.000812 0.140637 -0.036530 0.062121 -0.065504 -0.094930 0.121336 -0.017530 -0.017330 -0.040402 -0.018255 0.010992 -0.019746 -0.027564 0.033588 0.042466 -0.003143 -0.013767 0.084179 0.033753 -0.017279 -0.009676 --0.006452 0.032645 0.031852 -0.030975 -0.043384 --0.005433 -0.015258 0.053273 0.054748 -0.064736 -0.008959 -0.141223 -0.032957 -0.015079 0.018198 --0.001681 0.143079 0.076000 0.001037 -0.048744 -0.022062 0.026030 -0.008263 -0.050353 -0.023037 --0.036477 -0.051733 0.137823 -0.034438 -0.007573 --0.004256 0.064218 0.075183 0.095106 0.026497 -0.026360 0.009791 -0.058039 0.053315 -0.077817 --0.033283 -0.081151 -0.055220 0.004268 0.017539 --0.007329 -0.117200 0.093220 0.037359 0.002718 -0.010749 0.018281 -0.075800 -0.024889 0.005720 -0.022129 0.035613 0.036187 0.032246 0.105439 --0.073766 0.016887 -0.059934 -0.049471 0.073520 --0.024041 -0.104642 0.023557 -0.059746 -0.043871 -0.022311 -0.000250 -0.074027 0.198593 0.102732 -0.024478 0.077658 -0.060042 -0.018229 -0.149648 --0.009871 -0.105822 0.007585 -0.161459 -0.041121 --0.021460 0.009020 -0.065018 0.111801 -0.024953 -0.074594 -0.026041 -0.062859 0.009199 0.069609 -0.078672 -0.033414 0.054128 0.005408 -0.016273 -0.052076 0.107610 -0.067518 -0.096400 0.033703 --0.014350 -0.024676 0.056254 -0.043770 -0.060847 --0.004185 0.073550 -0.057830 -0.016644 0.029096 -0.005755 0.026472 0.040449 -0.091950 -0.048538 --0.034439 -0.107938 0.090712 -0.117001 0.043170 --0.006505 -0.035277 0.117316 0.127002 0.047906 --0.001441 0.118379 -0.132165 0.007380 0.023823 --0.020120 -0.083725 0.047284 0.023795 0.074123 --0.013439 0.024994 0.060254 -0.069120 0.166373 --0.024228 -0.063150 -0.046506 -0.077202 -0.054592 --0.006571 0.010335 -0.006568 0.003982 0.075837 -0.008643 0.136339 -0.005502 0.033910 -0.066379 --0.127371 -0.006954 0.039770 -0.070123 0.060925 --0.046386 -0.026420 -0.005280 0.103509 -0.022310 --0.003740 -0.014999 -0.037770 0.080005 0.025231 --0.054995 0.071017 0.009442 -0.075737 0.013441 -0.051947 0.027097 -0.070351 -0.055705 -0.021115 -0.021387 0.029232 0.163331 -0.032380 0.010008 --0.011987 -0.028631 0.002665 0.014770 -0.009558 --0.034325 0.015830 -0.091253 -0.012677 -0.107378 --0.034624 -0.047725 -0.102330 0.042525 -0.006869 -0.014048 -0.043127 0.052384 -0.047473 0.055102 -0.009744 -0.033646 -0.081755 -0.001464 -0.016223 --0.036697 -0.002279 0.023279 -0.036221 0.101478 --0.058454 0.065074 0.003524 0.005010 0.097182 --0.038171 -0.037943 -0.009994 -0.033355 -0.044552 -0.041318 0.065041 0.000092 0.100816 0.029007 --0.031803 0.183537 -0.009617 -0.010544 -0.028465 -0.006900 -0.014988 0.090490 -0.174817 0.027464 -0.063314 -0.049281 -0.001567 0.091421 -0.078603 --0.004869 -0.063266 -0.001922 0.069338 0.081771 -0.058737 0.073195 0.081676 -0.047808 -0.025797 --0.004185 0.033203 -0.125472 -0.108148 0.031258 -0.035192 0.029957 0.046675 0.047238 -0.088197 -0.033315 0.114919 -0.049180 0.025707 0.053843 -0.035182 0.140206 -0.058660 -0.025978 -0.019658 --0.014847 -0.021051 -0.034385 -0.121789 0.173406 --0.112251 -0.022333 0.071206 0.028998 0.046468 -0.067704 -0.026159 -0.158316 0.014936 0.040216 --0.010137 -0.053492 0.004935 -0.011277 0.073852 -0.091261 0.114794 -0.014060 -0.051545 0.077316 -0.101258 -0.046137 0.022994 -0.066767 -0.065537 -0.049952 -0.043582 0.012823 0.009313 0.036343 -0.054885 0.037796 0.021940 0.013211 0.006019 --0.099578 0.058596 -0.045463 -0.015632 -0.087141 --0.019273 -0.033140 0.043796 0.119057 -0.081813 --0.021538 -0.070453 -0.052551 0.077213 0.000094 -0.050268 0.092271 0.051688 -0.025224 0.075437 -0.027983 0.069205 0.031787 -0.099975 0.004387 --0.002747 -0.056567 0.161394 0.000164 0.084189 --0.124844 0.050329 0.009844 0.055877 0.055701 -0.030479 0.028843 -0.001076 -0.017173 -0.102770 --0.038426 -0.133841 -0.035840 -0.072046 0.020206 -0.016438 -0.097885 0.041857 0.034601 0.030422 --0.089192 -0.014112 -0.052276 0.012005 -0.029335 --0.011331 0.101833 0.063827 0.044288 0.101597 --0.034689 -0.027434 -0.017801 -0.079224 0.067103 --0.027456 -0.098034 0.009448 -0.038986 -0.156729 -0.085023 0.033136 -0.021343 0.110701 -0.011901 --0.006484 0.082023 -0.027094 0.091208 -0.013163 --0.012223 0.005933 0.010653 -0.098119 -0.005304 --0.021061 -0.058077 -0.073035 0.097856 -0.102847 --0.035329 -0.092754 -0.101463 -0.048671 0.055015 -0.102145 0.062017 0.016002 0.036489 0.059000 -0.042861 0.025447 -0.019735 -0.107841 -0.033752 --0.043982 -0.067059 0.051092 0.025235 -0.147107 --0.016269 0.123009 0.035894 -0.020453 0.040013 -0.015557 0.015825 0.080712 -0.069630 -0.149739 -0.022006 -0.008848 0.040169 -0.095688 0.059575 --0.030641 -0.061353 0.046302 0.104489 0.043372 --0.001579 0.059737 -0.104073 0.042342 -0.048611 --0.013811 -0.056255 0.107179 0.057433 0.084815 -0.030217 0.022360 -0.040342 -0.028775 0.120588 -0.041270 -0.045775 -0.030195 -0.106859 -0.104349 -0.072418 -0.003603 -0.013072 0.040728 0.086869 -0.091943 0.066517 0.024442 -0.030929 -0.032920 --0.160336 -0.010347 -0.068458 0.017458 0.044823 -0.050694 0.067625 0.040303 0.113164 -0.038747 --0.065558 -0.106357 -0.028352 0.121488 0.026548 --0.007820 0.054872 0.094674 -0.099533 0.005231 -0.118132 0.042780 -0.065079 0.031440 0.043229 --0.050024 0.015943 0.073917 0.034049 0.010548 --0.024979 0.022639 0.027795 0.049491 0.048762 --0.002738 -0.010783 -0.027637 -0.006986 -0.104141 --0.066719 -0.061742 -0.067028 -0.053057 -0.003478 --0.050948 -0.122196 0.022082 0.002595 0.015094 -0.006014 0.005784 -0.184537 -0.034872 -0.036104 -0.055412 0.006886 0.103488 -0.063001 0.096665 --0.035533 0.009847 -0.095114 0.008588 0.023736 --0.034278 -0.111970 -0.041172 0.039730 -0.102952 -0.063775 0.039273 0.109863 0.091800 0.030306 --0.082206 0.089449 -0.058478 -0.029341 0.038389 -0.061057 -0.024711 0.111044 -0.035079 -0.027985 -0.014570 0.002046 -0.031545 0.058848 -0.019500 --0.002475 -0.025589 -0.144358 0.063478 0.124927 --0.014094 -0.010970 0.031621 -0.040043 0.004389 -0.025003 0.052397 -0.054526 -0.073469 0.026795 --0.024697 0.024739 0.118299 0.014948 -0.132109 -0.020192 0.037815 -0.090270 0.049313 0.082764 --0.022642 -0.006053 -0.038073 -0.057363 -0.107347 -0.033166 -0.027556 -0.019765 -0.111958 0.027773 --0.063001 -0.052998 0.019353 -0.009646 -0.011270 -0.011872 -0.006508 -0.122226 0.059824 0.041779 -0.016445 -0.031890 -0.036310 0.013085 0.091631 -0.062866 0.054501 -0.117523 -0.010907 0.087026 --0.014974 -0.035920 -0.048565 -0.019246 -0.043405 --0.006959 0.006211 0.042370 0.014603 -0.006435 -0.019149 0.078038 -0.020556 0.018114 -0.036521 --0.054036 0.007325 0.056349 -0.033497 -0.025960 -0.050184 -0.066536 0.091501 0.071356 -0.049044 --0.032263 -0.095268 -0.008784 0.049033 0.036929 -0.020357 0.152151 0.040814 -0.063159 -0.024324 --0.017084 0.011876 -0.015442 -0.019811 -0.000366 --0.002700 -0.072981 0.109288 0.007473 -0.049442 --0.054040 0.051947 0.019359 0.129160 0.021981 -0.002248 0.035262 -0.023141 0.064666 -0.078273 --0.031663 -0.031343 -0.006058 -0.045421 0.017466 --0.067122 -0.130784 0.067057 0.052460 -0.041165 --0.004411 0.046453 -0.055461 0.048162 -0.009687 -0.021530 0.007211 0.104764 0.079849 0.086248 --0.072791 0.001112 -0.027964 -0.071233 -0.013339 -0.007979 -0.118231 0.076826 -0.060762 -0.084358 --0.011447 0.009765 0.014163 0.164784 -0.015892 --0.020756 0.152509 -0.014014 -0.041853 -0.117008 --0.011755 -0.005766 -0.086896 -0.139650 -0.032342 -0.025651 -0.007843 -0.039073 0.103397 -0.042591 --0.005971 -0.001324 -0.053945 -0.000716 0.048977 -0.130185 0.028226 0.061179 0.024489 -0.021939 --0.007019 0.054336 -0.010040 -0.095411 0.082406 --0.032130 -0.015054 0.033059 0.002802 -0.080159 --0.022452 0.077426 -0.015314 0.033583 0.028479 -0.023293 0.035078 0.006442 -0.110541 -0.106244 --0.034737 -0.104140 -0.034570 -0.114316 0.079382 -0.006009 0.003901 0.080081 0.055082 0.012896 -0.064981 0.057219 -0.112986 0.003906 -0.028414 --0.012383 -0.054541 0.077483 0.004267 0.123567 -0.007369 0.099856 0.023273 -0.028194 0.122030 --0.036635 -0.126589 -0.034567 -0.028288 -0.065040 -0.014280 0.011435 -0.004867 0.043901 0.035395 -0.028599 0.075858 0.118460 0.070581 -0.051903 --0.170905 0.050352 0.053514 -0.017139 0.021748 --0.096610 0.008904 -0.001049 0.078787 -0.101201 --0.026229 -0.019757 -0.035771 0.054142 0.068041 --0.020328 0.099979 0.096623 -0.046957 -0.001733 -0.049586 0.052458 -0.031724 -0.028332 -0.005418 -0.046710 0.014238 0.133125 -0.005428 -0.080055 --0.033226 0.034007 0.025272 0.033924 -0.044662 --0.034690 -0.079173 -0.160689 -0.153893 -0.228771 --0.002450 -0.083966 -0.168294 0.010694 -0.012167 -0.000004 -0.044377 0.023373 -0.077437 0.012178 --0.015899 -0.010828 -0.062847 0.029927 -0.074557 --0.053306 0.049688 0.057017 -0.022571 0.015337 --0.046545 0.018895 -0.024848 -0.004424 0.165442 --0.060201 -0.098629 -0.065190 0.036582 -0.038566 -0.051453 0.093478 0.039619 0.117535 0.090386 --0.029366 0.108075 -0.016568 -0.093576 -0.048799 --0.045599 -0.023619 0.070072 -0.109294 0.001548 -0.076285 -0.091274 -0.068829 0.000215 -0.046519 --0.022512 -0.027067 0.014905 0.079017 0.140699 -0.061141 0.009178 0.097811 0.033468 -0.006666 -0.007163 -0.007578 -0.124238 -0.025271 0.017581 -0.042405 -0.034252 0.064890 0.002500 -0.139083 -0.009733 0.158179 0.014474 0.038913 0.056290 --0.004998 0.075401 -0.030557 -0.038595 -0.049070 --0.014680 -0.076306 -0.132365 -0.177693 0.091760 --0.057238 -0.072379 0.050877 0.051489 0.028125 -0.004991 0.032621 -0.167359 0.041002 -0.007072 --0.086405 -0.042263 -0.019757 -0.011524 0.066004 -0.085670 0.008071 -0.013614 -0.062142 0.083280 -0.000887 -0.075820 0.008295 -0.020136 -0.016886 -0.089657 -0.106260 -0.051491 -0.012687 0.054778 -0.011535 0.086613 0.053803 0.027164 -0.023825 --0.040009 0.080987 0.026309 -0.000334 -0.085288 --0.024208 -0.085040 0.096077 0.120527 -0.044181 -0.003034 -0.091142 0.006471 0.115971 -0.026358 -0.003489 0.083633 0.109975 -0.029425 0.061726 -0.056115 -0.006711 0.013158 -0.062917 -0.015029 -0.003354 0.031574 0.119045 0.022859 0.023777 --0.068292 0.115604 0.031617 0.008953 0.006943 -0.014420 0.008569 -0.031547 -0.006857 -0.051690 --0.086683 -0.108339 0.005093 -0.108646 -0.034720 -0.054273 -0.096753 0.050806 -0.021115 -0.025278 --0.079997 0.027008 -0.034211 0.090949 0.005678 -0.019288 0.042083 0.062119 0.019301 0.040859 --0.009113 0.022427 -0.004019 -0.060890 0.032884 --0.012373 -0.037976 0.017625 -0.079369 -0.050788 -0.079720 -0.039347 -0.085324 0.091044 0.026653 --0.063122 0.099371 -0.024736 0.084631 -0.100421 --0.073313 0.014317 0.022555 -0.116051 -0.063966 --0.009688 -0.063666 -0.131709 0.016744 -0.135028 --0.003708 -0.043685 -0.121631 -0.036930 0.125776 -0.084333 0.010114 0.071231 -0.010395 0.059391 -0.017760 0.033034 -0.018996 -0.130540 0.025758 --0.018261 -0.060044 0.127025 -0.032724 -0.107299 --0.064538 0.090073 -0.010186 -0.066127 0.107025 --0.010940 0.003083 0.019030 -0.023935 -0.140176 -0.003549 -0.042402 -0.010695 -0.185915 0.060835 -0.005405 -0.013822 0.029205 0.079338 0.068155 -0.071485 0.030282 -0.087207 0.073480 -0.027940 -0.004896 -0.033246 0.072637 0.018017 0.054712 -0.026184 -0.005287 0.034456 -0.036753 0.079232 -0.072707 0.004506 -0.039353 -0.015560 -0.071466 -0.010257 0.067446 -0.006598 0.047396 0.072218 -0.023405 0.082663 0.015319 -0.035436 -0.075461 --0.124036 -0.032046 0.060837 0.010231 -0.053024 -0.022800 0.042891 -0.041549 0.132395 -0.095330 --0.077091 -0.058554 -0.070632 0.047570 0.031856 -0.000127 0.114996 0.058660 -0.092472 0.064503 -0.096450 0.066200 -0.001059 0.039487 -0.032859 --0.065721 0.001601 0.088037 0.059828 -0.047411 --0.077714 0.010275 0.013629 0.003304 0.005407 -0.000665 0.012927 -0.077525 0.069202 -0.157417 -0.014547 -0.095965 -0.087546 -0.067375 -0.027867 -0.005458 -0.095839 0.105294 -0.044892 0.045151 --0.001349 0.038356 -0.127152 -0.080503 -0.105423 --0.018484 0.008439 0.104398 -0.027959 0.082086 --0.020605 0.042785 -0.109139 -0.025958 0.079733 -0.036289 -0.083773 -0.033819 0.032566 -0.065556 -0.006659 0.002090 0.097027 0.115715 -0.013271 --0.067514 0.128365 -0.089129 0.026160 -0.040584 --0.002443 -0.017254 0.129204 -0.110078 -0.064943 -0.089215 -0.022299 -0.034959 0.022446 -0.019254 --0.038900 -0.069862 -0.070540 0.069949 0.111993 --0.006311 -0.009057 0.094278 -0.014932 0.003657 --0.019323 0.026145 -0.062611 -0.073753 -0.007182 -0.014101 0.015776 0.052537 0.064728 -0.160187 --0.005122 0.076356 -0.104763 0.091493 0.020225 --0.000433 0.062698 -0.060457 -0.147540 -0.066168 -0.007195 -0.061498 -0.037801 -0.039763 0.059551 --0.028410 -0.074510 0.057667 0.020584 -0.042510 --0.025311 -0.037825 -0.188010 0.077423 0.030749 --0.025465 -0.067541 0.003073 -0.049778 0.127789 -0.002786 0.120009 -0.067812 -0.026565 0.111272 -0.023219 -0.024403 -0.014507 -0.048624 0.022163 -0.014596 -0.052136 0.001580 0.064595 0.017963 -0.021330 0.098862 -0.009253 -0.041062 0.008903 --0.013829 0.031967 0.076571 -0.005348 -0.044010 -0.031252 0.000369 0.036818 0.072854 -0.038569 -0.004161 -0.128017 -0.053152 0.050896 -0.015212 --0.036159 0.097995 0.068397 -0.048472 -0.056131 --0.011920 0.059188 0.010215 -0.061152 -0.011717 --0.035949 -0.057039 0.090859 -0.029682 0.041466 --0.025106 0.131191 0.059327 0.085383 0.021699 -0.049230 0.036630 -0.077086 0.017806 -0.088790 -0.004040 -0.069533 -0.026785 0.009666 0.014017 --0.055897 -0.096299 0.120693 0.029995 0.032602 --0.001365 0.034015 -0.053512 0.001573 -0.019170 -0.003956 0.006452 0.067313 0.028301 0.160615 --0.053111 0.013990 -0.027060 -0.013638 0.039376 --0.054462 -0.096553 0.079994 -0.043791 -0.025051 --0.003222 0.019418 -0.049525 0.151136 0.034123 -0.055117 0.058918 -0.017393 0.026169 -0.126380 --0.019008 -0.028939 -0.014027 -0.173373 -0.032841 --0.003370 0.039680 -0.118311 0.114094 -0.041869 -0.041121 -0.038391 -0.096074 -0.032479 0.060222 -0.063968 -0.024528 0.018158 -0.009892 -0.043882 --0.005004 0.129800 -0.025438 -0.121186 0.049860 -0.010448 -0.040388 0.061853 -0.017304 -0.035088 --0.008678 0.061476 -0.039493 -0.005055 0.079169 -0.046134 0.009770 0.068294 -0.078965 -0.043792 --0.030529 -0.053845 0.053853 -0.140682 0.111461 -0.003549 -0.014939 0.148955 0.072861 0.004332 -0.015386 0.062006 -0.122325 -0.032529 0.010241 --0.047982 -0.126440 0.055840 0.067128 0.101189 --0.002630 0.031969 0.046076 -0.080194 0.104740 --0.033486 -0.077818 -0.058697 -0.095258 -0.111074 -0.037236 0.011711 0.001113 -0.005664 0.048588 -0.041131 0.098257 0.033126 0.029317 -0.095311 --0.071555 -0.039999 0.026678 -0.072182 0.035031 --0.007997 -0.048174 -0.006796 0.075959 -0.052060 --0.007645 0.037076 -0.035574 0.085576 0.034126 --0.050676 0.051430 0.031999 -0.134308 -0.001489 -0.084564 -0.018394 -0.097410 -0.042931 -0.025608 --0.025489 0.041919 0.142482 0.004617 -0.041085 --0.028816 -0.015527 -0.031005 0.028405 -0.022240 --0.067737 -0.025241 -0.052578 0.012322 -0.120556 -0.016278 -0.081744 -0.099160 0.025144 0.025441 -0.003176 -0.073871 0.031718 -0.028622 0.029031 -0.017910 -0.030693 -0.104215 -0.015422 -0.065738 --0.048346 -0.012847 0.046849 -0.008621 0.058771 --0.054495 0.031597 -0.038844 0.043138 0.092588 --0.071371 -0.059093 -0.001197 0.001766 -0.074762 -0.029470 0.089616 0.005009 0.052977 0.015899 --0.045424 0.158466 -0.038717 -0.032506 0.028687 -0.011435 -0.006772 0.047605 -0.144659 -0.031229 -0.073577 0.011530 -0.008172 0.058883 -0.088412 -0.033615 -0.034120 -0.030701 0.101215 0.096645 -0.027368 0.041249 0.081502 -0.025440 0.007592 -0.059893 0.012106 -0.112009 -0.114692 0.016397 -0.087068 0.016199 0.051263 0.011915 -0.085364 -0.026046 0.145258 -0.047521 0.077134 -0.000345 -0.034532 0.099801 -0.087591 -0.059719 -0.058671 -0.022737 -0.001887 -0.107049 -0.116757 0.134115 --0.055403 0.005157 0.067618 0.081074 0.071787 -0.063802 -0.003430 -0.106491 0.017543 0.002214 --0.013785 -0.032962 0.010084 0.024325 0.045963 -0.059883 0.072282 -0.008608 -0.015127 0.048225 -0.041752 -0.068845 0.012227 -0.090748 -0.035309 -0.045353 -0.078624 -0.019489 0.035531 0.058571 -0.045414 0.039032 -0.011106 0.048787 -0.025336 --0.084893 0.031896 0.010850 0.012526 -0.053205 -0.016952 -0.044041 0.068766 0.097328 -0.122229 -0.027016 -0.051759 -0.057246 0.074566 0.006201 -0.069904 0.100068 0.076124 0.004278 0.029466 -0.045229 0.055683 0.018790 -0.067806 0.039373 -0.029179 -0.036787 0.129921 -0.028993 0.037711 --0.105011 0.138747 -0.004370 0.052080 0.050835 -0.025511 -0.002962 0.007852 -0.055234 -0.075055 -0.000460 -0.089231 -0.030467 -0.080347 0.007488 -0.067460 -0.076368 0.084991 0.039544 0.033391 --0.044318 0.006390 -0.079387 -0.002909 -0.029708 --0.047882 0.063040 0.065719 0.021811 0.070945 --0.007571 -0.001302 -0.064119 -0.068005 0.051040 --0.017747 -0.063938 0.018673 -0.038391 -0.099966 -0.057475 -0.007669 0.009384 0.109283 0.012248 --0.048858 0.092498 0.011967 0.061525 -0.028819 --0.015131 -0.024160 -0.033220 -0.101648 -0.017980 --0.003342 -0.049829 -0.125096 0.128241 -0.047377 --0.028943 -0.109072 -0.066133 -0.015454 0.098334 -0.053371 0.011324 0.042781 0.044313 0.062510 -0.098408 0.065410 -0.040693 -0.116351 -0.032327 --0.013634 -0.058591 0.081507 0.042019 -0.099770 --0.018275 0.084624 -0.007512 -0.041113 0.054203 -0.017879 -0.029747 0.059865 -0.048281 -0.111513 --0.022478 0.002059 0.022383 -0.125360 0.058216 -0.002386 -0.081600 0.049288 0.157428 0.057724 -0.005046 0.102125 -0.083473 0.044059 -0.094864 -0.039120 -0.063306 0.057341 0.060519 0.107383 -0.007076 -0.009373 -0.012555 -0.066630 0.117121 -0.025254 -0.008796 -0.062102 -0.083164 -0.079007 -0.084839 0.042308 -0.055353 0.036386 0.132641 -0.084464 0.056288 -0.011636 -0.059554 -0.087748 --0.147377 -0.052414 -0.010203 -0.009159 -0.018829 -0.009621 0.061633 0.015716 0.086332 -0.061465 --0.011833 -0.062998 -0.021168 0.125194 0.045025 -0.052316 0.025720 0.095155 -0.093252 0.028720 -0.056113 0.063321 -0.045315 0.025199 0.023591 --0.070481 0.072350 0.092458 0.047973 -0.025439 --0.001281 0.021028 0.034576 0.084779 0.006867 --0.010323 -0.046330 -0.009172 0.030485 -0.117679 --0.021782 -0.034737 -0.086292 -0.045885 0.009655 --0.037167 -0.123331 0.017291 -0.028319 0.071447 --0.057180 -0.032912 -0.139418 -0.025966 -0.039305 -0.009411 -0.054017 0.076307 -0.060252 0.110087 --0.061366 0.038897 -0.098107 0.046119 0.043021 --0.029130 -0.096885 0.007623 0.090513 -0.097416 -0.053264 0.058296 0.054372 0.060769 0.015586 --0.067956 0.059996 -0.037850 0.005986 0.000778 -0.045873 -0.065546 0.077900 -0.085638 0.000698 -0.027694 -0.021241 -0.002777 0.034509 -0.048173 -0.009988 0.001008 -0.077434 0.026002 0.139490 -0.008910 0.007791 0.059292 -0.057047 0.014127 --0.022959 0.085710 -0.068087 -0.081561 0.005935 -0.007577 0.061544 0.076542 0.001660 -0.113279 -0.024973 0.086750 -0.061674 0.095059 0.089352 --0.024436 0.024181 -0.016117 -0.073634 -0.067986 -0.074701 -0.046868 -0.054634 -0.092485 0.006662 --0.033256 -0.053774 0.049001 -0.002339 0.013545 --0.006432 -0.012089 -0.086842 0.104105 0.061991 diff --git a/gr-vocoder/lib/codec2/codebook/lspjvm3.txt b/gr-vocoder/lib/codec2/codebook/lspjvm3.txt deleted file mode 100644 index 72767df8ea..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspjvm3.txt +++ /dev/null @@ -1,513 +0,0 @@ -5 512 -0.007066 0.075781 -0.070082 -0.092014 -0.066477 -0.090510 0.106622 0.025911 -0.016760 0.003724 --0.024628 0.058332 0.012876 0.059557 -0.002092 --0.065092 -0.096975 -0.041837 -0.002432 0.058918 -0.014358 0.080049 -0.008803 -0.002091 -0.097584 -0.085323 -0.026053 -0.086585 -0.009541 0.130555 -0.045391 0.037557 0.074726 -0.050453 0.033517 --0.035576 -0.084211 -0.086430 0.008910 -0.072674 --0.098699 -0.024540 -0.048972 -0.066975 -0.048791 -0.032184 0.070992 -0.014416 0.141892 -0.044249 --0.108921 -0.020450 0.115988 0.011287 -0.026273 -0.024341 0.138519 -0.036467 0.020684 0.074258 --0.053563 0.077463 0.072166 0.032112 -0.079303 --0.025039 0.079675 0.094211 -0.115754 0.038892 -0.050897 -0.024639 0.057826 -0.110429 0.071184 -0.015309 -0.034027 -0.055726 0.043179 -0.063089 -0.043359 -0.011698 0.006637 0.002751 0.030110 --0.001261 0.111470 0.043277 -0.004205 -0.021599 --0.005698 0.058842 0.168422 0.059313 -0.007971 --0.087599 0.073891 -0.083238 0.099279 -0.017364 --0.018429 0.014040 -0.014864 -0.111512 0.089450 --0.028498 -0.087983 -0.077320 -0.062602 0.000328 --0.027152 -0.093796 0.111381 -0.018603 0.092394 --0.007256 0.025391 0.011454 0.012802 -0.041680 -0.008078 0.020905 -0.105401 -0.083265 0.027756 --0.049630 -0.044085 -0.051424 0.104125 -0.000779 --0.063079 -0.130699 0.070500 0.033468 -0.019802 --0.061011 0.094839 -0.040122 0.118409 0.056950 -0.086391 -0.006615 0.045337 -0.044190 -0.106474 --0.081912 0.067557 -0.031649 -0.014437 0.057585 --0.121755 -0.049113 0.057109 -0.049872 0.044104 -0.064705 -0.091589 0.037286 -0.048606 -0.045398 -0.003456 0.057230 0.006262 -0.055206 -0.063871 --0.005249 0.081783 0.134969 -0.002331 0.052643 --0.093346 0.072093 0.116025 -0.031453 -0.006012 --0.038574 -0.030841 0.010288 0.024420 0.051657 --0.086584 0.046381 0.005410 0.052622 -0.072741 -0.079023 0.078099 -0.093912 0.005477 -0.006721 -0.100232 -0.017587 0.044819 0.036655 0.021580 --0.006829 -0.050076 -0.003020 0.088246 0.013560 --0.015690 0.012477 -0.052595 -0.048861 -0.033688 -0.055615 0.092298 -0.066194 0.016416 -0.066059 -0.046976 0.003023 0.104646 0.109136 0.018293 --0.016507 -0.006859 0.004326 0.070843 0.140750 -0.025774 0.034730 -0.079590 0.050054 -0.107950 -0.002378 0.097498 0.027111 -0.122953 -0.002423 --0.020539 -0.063263 -0.095493 -0.157361 -0.039183 -0.025721 0.026897 -0.001200 0.033997 -0.001749 -0.061593 -0.013053 -0.106317 -0.068190 0.046352 --0.056060 0.157084 -0.049365 0.053959 -0.051065 --0.047672 0.081570 0.064342 -0.030705 -0.070806 --0.076503 -0.059471 0.012419 0.073968 -0.026179 --0.038473 0.059013 -0.035783 -0.030057 -0.036346 --0.052692 -0.015346 -0.022687 -0.035279 0.013314 -0.068397 -0.046609 -0.009593 -0.040796 0.157438 --0.075360 -0.110464 0.031839 -0.029035 -0.015222 -0.041013 -0.099212 -0.108920 -0.008627 0.012095 -0.020855 0.009935 -0.086917 0.058827 -0.006536 -0.022104 -0.005013 0.003496 0.046663 -0.051061 --0.036803 -0.067317 -0.007075 0.180870 -0.027434 --0.025056 -0.039341 -0.073918 -0.003180 -0.110930 --0.042711 0.005519 -0.035005 -0.088419 0.170942 -0.001503 -0.121485 0.066383 -0.067346 0.005643 -0.080088 -0.042562 -0.006668 -0.036538 0.020683 -0.042848 0.027852 -0.029088 -0.156468 0.006503 -0.037716 0.032082 0.038416 0.021835 -0.106963 --0.043017 0.018166 0.070409 -0.005426 -0.035585 --0.111071 -0.039986 0.050430 0.035157 0.066902 --0.040684 0.060527 0.036225 0.002527 -0.015087 -0.059243 0.021268 -0.010682 -0.018434 0.059128 -0.111314 -0.054070 0.105744 -0.051476 -0.012970 --0.000358 -0.099249 -0.077385 0.069924 -0.039101 --0.072139 -0.049069 -0.088018 0.006144 0.000712 -0.081030 0.021987 -0.046031 0.058087 -0.001320 --0.046851 -0.011062 0.108321 -0.001146 -0.071193 -0.044973 -0.002915 -0.003323 0.041735 0.094566 -0.053530 0.035927 0.100282 0.059082 -0.054059 --0.012158 -0.035417 0.020412 -0.073193 0.059296 --0.040489 -0.095250 -0.003821 -0.084904 0.053925 -0.109183 -0.005862 -0.036538 0.080962 -0.040647 -0.020070 0.057778 -0.020197 -0.079626 -0.003186 --0.050855 0.128185 0.034731 0.057460 -0.035236 --0.057096 -0.001238 0.122018 -0.071204 -0.047253 --0.051767 0.048301 -0.052678 0.025990 -0.017481 --0.029379 0.030738 0.047207 -0.047864 -0.033561 -0.029884 -0.091175 -0.085446 -0.026140 0.092628 -0.067706 -0.085617 0.081433 0.047305 0.031945 --0.048728 -0.040387 0.046206 0.010578 -0.037639 -0.011328 -0.042458 -0.149597 0.033882 -0.061869 -0.008800 0.057754 -0.095876 0.038230 0.096876 --0.033487 -0.141669 -0.014172 0.028439 -0.092764 --0.053714 0.086926 0.034786 0.136053 -0.005569 -0.028753 0.009630 0.044114 -0.050365 -0.066224 -0.006017 0.014348 0.024471 0.000489 0.067234 --0.021678 -0.118760 0.036349 -0.040295 0.076358 --0.008444 -0.086082 -0.044018 -0.025804 0.028971 --0.009233 0.053026 -0.035341 -0.182193 -0.102515 -0.089210 0.066812 0.032417 0.046882 -0.034815 --0.052293 0.022814 0.129622 0.128232 -0.012105 --0.087084 0.004762 0.086538 0.046566 0.098359 --0.018713 0.039204 -0.021707 -0.060110 -0.117527 --0.005459 0.060994 -0.057718 -0.021783 0.035154 -0.100557 -0.015470 -0.025818 0.008450 0.051535 --0.001388 -0.114610 -0.057903 0.041862 0.061778 -0.045701 -0.078563 -0.070166 -0.048450 -0.088530 -0.021375 -0.004598 -0.090710 -0.009399 -0.073952 --0.035575 -0.050280 0.114780 0.137866 0.065234 -0.003594 -0.066802 -0.144989 0.166201 0.039564 --0.022457 -0.030090 0.016187 0.115443 -0.097331 --0.019139 0.099440 0.002198 -0.030953 0.021099 --0.045399 -0.046871 0.022533 -0.064657 0.005776 -0.049063 -0.028478 0.019268 0.054265 0.028042 -0.045559 -0.005541 -0.014410 -0.024165 -0.054976 --0.073258 0.084205 0.036077 -0.068683 0.004708 --0.085228 0.001234 0.046261 -0.050496 -0.028227 --0.086828 -0.001218 0.021865 0.003791 -0.000568 --0.088733 -0.040041 -0.035891 -0.054915 0.073463 --0.132031 -0.012844 -0.068544 0.013052 0.087335 -0.038603 -0.115382 -0.010433 -0.007113 0.095126 --0.047378 -0.081353 0.018021 -0.021156 -0.120774 -0.040038 0.007633 -0.088728 -0.009928 0.020142 -0.052024 -0.021063 -0.118121 0.102739 -0.055837 -0.005253 -0.061924 0.063680 -0.014512 -0.020259 -0.029493 -0.013435 -0.020638 0.089342 0.001092 --0.046491 -0.145634 -0.083159 -0.158142 -0.279281 -0.003611 0.055863 -0.064655 -0.088773 0.089283 --0.029619 -0.089949 0.017197 -0.066633 -0.052347 -0.090828 -0.087551 0.000338 0.085238 -0.005313 -0.096211 0.071381 -0.076546 -0.077927 -0.040864 -0.062936 0.041559 0.016235 -0.017513 0.014773 --0.025734 0.028586 0.070292 0.055794 -0.026131 --0.076954 -0.082228 0.043947 -0.035921 0.152668 --0.049510 0.023159 0.008506 -0.044773 -0.160358 -0.024984 -0.025587 -0.071627 -0.038376 0.088478 -0.120568 0.046723 0.086731 0.000695 -0.015751 --0.027837 -0.160937 -0.095031 0.036271 -0.009061 --0.015078 -0.036281 -0.103665 -0.058258 -0.049573 -0.022021 0.108296 -0.002586 0.065655 -0.018584 --0.046441 -0.031018 0.067350 0.014328 0.008860 --0.000245 0.063400 -0.001810 0.043515 0.090344 --0.063845 0.020485 0.079401 0.070558 -0.116428 -0.032628 0.068949 0.052238 -0.044530 0.096813 -0.029911 -0.008814 0.044352 -0.168172 0.009604 -0.055828 -0.100739 -0.026013 0.021193 -0.051425 -0.035891 -0.004085 0.030216 -0.060801 0.037202 -0.007262 0.120686 0.026846 0.058464 -0.100792 --0.009176 0.027589 0.123957 -0.011283 -0.025744 --0.105081 0.118244 -0.042122 -0.025404 0.000873 --0.012703 0.084159 -0.067539 -0.140536 0.041637 --0.014485 -0.043382 -0.048004 -0.075416 0.054401 --0.018651 -0.032908 0.164231 -0.053236 0.033946 --0.021681 -0.012655 -0.037049 -0.001613 -0.053393 --0.014635 0.017954 -0.116115 -0.027232 0.034005 --0.035376 0.026492 -0.037250 0.070733 0.074835 --0.021378 -0.142980 0.123195 0.003699 0.025398 -0.015629 0.077370 0.032623 0.121580 0.097100 -0.000946 -0.056355 0.042065 0.008184 -0.081824 --0.101937 0.065473 0.003360 0.069241 0.073002 --0.053844 -0.044301 0.080351 -0.091833 0.044288 -0.007447 -0.120723 -0.013806 -0.023636 -0.064616 -0.030556 0.072630 0.074428 -0.087759 -0.026440 -0.064840 0.049162 0.091053 0.023891 0.033811 --0.027746 0.116392 0.106126 -0.056644 -0.014781 -0.036137 -0.002632 0.055512 0.070077 0.067819 --0.030625 0.053772 -0.078457 -0.021351 -0.113011 -0.052797 0.044875 -0.077269 -0.009867 0.101493 -0.073477 -0.024103 0.049145 -0.004706 -0.025211 --0.053731 -0.049009 -0.035786 0.054430 0.046515 -0.025154 -0.043569 -0.034789 -0.058610 0.006931 -0.012049 0.046809 -0.129441 0.025541 -0.030933 -0.000297 -0.054058 0.179837 0.081515 0.004932 --0.028445 -0.073753 0.010629 0.080042 0.098710 --0.014017 0.057597 0.001010 0.071658 -0.067570 -0.074384 0.110366 -0.018121 -0.108754 0.037793 -0.028041 -0.047508 -0.031359 -0.098913 -0.036486 --0.017311 -0.001279 -0.013694 0.051968 0.036512 -0.088201 0.031155 -0.043442 -0.065045 0.023486 -0.027000 0.104768 -0.015176 -0.038754 -0.004178 -0.003732 0.062166 0.085438 -0.077368 -0.101645 --0.118347 0.007589 -0.056489 0.082268 0.020253 --0.035623 0.034235 -0.099354 -0.061237 -0.024285 -0.005441 -0.039694 -0.025957 -0.004411 0.049903 -0.003040 0.036243 0.023552 -0.007334 0.128963 --0.077727 -0.059175 -0.019437 -0.024872 0.004339 -0.084006 -0.076605 -0.102261 0.036714 -0.035205 --0.007642 -0.005125 -0.030525 0.096390 -0.053138 --0.002192 -0.024851 0.050645 0.041490 -0.043183 -0.046796 -0.050894 0.055023 0.133834 -0.024013 -0.000872 -0.057072 -0.000630 0.042070 -0.129339 --0.064283 0.037836 -0.066393 0.004438 0.125379 --0.062213 -0.067468 0.090177 -0.046094 -0.025725 -0.079101 -0.074909 -0.043730 -0.073483 0.069672 --0.020413 -0.000079 -0.049725 -0.120751 -0.046980 -0.039894 0.072305 0.009798 0.005613 -0.045217 -0.006862 0.036285 0.074819 -0.006747 0.015144 --0.071562 0.012324 -0.001082 0.014835 0.079960 --0.027804 0.103358 -0.017203 0.014914 -0.056687 -0.030827 0.028076 0.003395 -0.073255 0.110310 -0.056498 -0.044893 0.110122 -0.109058 -0.052302 --0.001604 -0.089977 -0.060548 0.107808 0.025463 --0.070203 -0.000513 -0.123913 0.046247 -0.085392 -0.096343 0.095890 -0.064950 0.070363 0.034272 -0.037773 -0.076950 0.124858 -0.009008 -0.010115 -0.083868 0.051242 0.039149 0.015185 0.083375 -0.029773 -0.045961 0.100395 0.003743 -0.138294 --0.041755 0.010806 0.057797 -0.147374 0.095858 --0.009929 -0.103347 -0.032310 -0.110560 0.121377 -0.145244 0.017079 -0.080587 0.020516 -0.044939 --0.010477 0.038347 -0.003466 -0.001618 0.019600 --0.021762 0.125482 0.011074 0.065815 0.040298 -0.009202 -0.051686 0.129684 -0.131135 0.044536 -0.009313 0.102518 -0.075351 0.054338 0.020273 --0.045753 0.031345 0.000407 -0.097294 -0.000416 --0.007466 -0.044972 -0.078744 0.042414 0.066624 -0.030318 -0.067852 0.061416 -0.028992 0.056606 -0.004038 -0.036253 -0.014279 0.023123 -0.007832 --0.000137 -0.027684 -0.127648 -0.007713 -0.008746 --0.026500 0.049032 -0.183319 0.059107 0.066500 -0.016902 -0.093331 0.090129 0.016648 -0.083492 --0.023669 -0.010473 0.027614 0.145068 0.000681 -0.044133 -0.035809 0.005668 -0.090461 -0.090732 --0.033927 0.042997 0.021700 -0.046955 0.044487 --0.026444 -0.061011 0.010110 -0.023804 0.030427 --0.015195 -0.155603 -0.016584 0.021461 -0.003528 --0.059784 0.032214 0.000847 -0.098859 -0.078980 -0.043188 0.066433 0.062309 0.144507 0.006865 --0.068953 0.046698 0.099369 0.043354 -0.014309 --0.033202 -0.002950 0.040734 0.083454 0.039319 -0.051358 0.006074 -0.073465 -0.090554 -0.120787 --0.040676 0.092412 -0.085151 -0.021699 0.005813 -0.103135 0.024964 0.025832 -0.075982 0.035699 --0.027310 -0.153007 0.036420 0.057600 0.081630 -0.001605 -0.054191 -0.033043 -0.014390 -0.071383 -0.036180 0.035860 -0.046980 0.038541 -0.044757 --0.078032 -0.029878 0.078183 0.082251 0.010549 -0.053317 -0.038231 -0.065610 0.055798 0.037504 -0.076317 -0.027605 0.010349 0.095361 -0.088636 -0.049089 0.113316 0.051084 0.038589 0.034330 --0.055948 -0.037217 -0.015418 -0.139976 0.036306 -0.039306 -0.009889 -0.044910 0.016559 -0.000050 -0.106073 0.015280 -0.002563 -0.109085 -0.048475 --0.035319 0.163860 0.032981 -0.044932 0.003227 --0.123233 -0.010638 0.055479 -0.003666 -0.072249 --0.111158 0.065365 0.010691 0.039119 -0.001837 --0.118729 0.061470 -0.002077 -0.033335 -0.060165 --0.026081 -0.001806 -0.079616 -0.000075 0.080598 -0.032908 -0.035140 -0.003136 -0.029024 0.094622 --0.075773 -0.022898 -0.014817 0.058393 -0.111505 -0.036794 -0.015760 -0.112602 0.030323 0.085897 --0.020834 0.056079 -0.103762 0.117671 -0.041205 -0.041684 -0.084336 0.034186 0.011973 -0.006313 -0.040836 -0.035709 0.034170 0.122672 0.090973 --0.053182 -0.059371 0.091017 -0.090998 -0.116986 -0.001405 0.138364 0.017107 -0.064076 0.103486 --0.031142 -0.030068 0.046547 -0.133471 -0.042055 -0.140418 -0.125084 0.035218 -0.001162 -0.021130 --0.012034 0.097413 -0.079006 -0.039030 -0.054011 -0.143887 0.078835 -0.000601 -0.021173 -0.039895 --0.025050 0.075865 0.039221 0.032458 0.038206 --0.038873 -0.085003 -0.032736 -0.026956 0.113525 --0.023933 0.120794 -0.003862 -0.026459 -0.138724 -0.089559 0.029002 -0.052098 -0.085692 0.115174 -0.083497 0.024179 0.119021 -0.067541 0.019047 --0.027720 -0.086083 -0.055329 0.020087 -0.027086 --0.047858 -0.051975 -0.035205 -0.059342 -0.068582 -0.058936 0.044141 -0.080315 0.119744 -0.046518 --0.064588 -0.027212 0.147823 0.032404 0.016690 -0.024302 0.085560 -0.001525 0.016469 0.038891 --0.020146 0.019943 0.045067 0.038070 -0.086274 --0.025769 0.044192 0.102141 -0.064765 0.055849 -0.048803 -0.030066 -0.009220 -0.116655 0.068295 -0.047580 -0.076138 -0.070307 0.047582 -0.111342 -0.004656 -0.004452 0.029703 -0.004259 0.011130 -0.014446 0.166086 0.059565 0.000985 -0.052607 -0.013251 0.094476 0.106216 0.016715 -0.025581 --0.101244 0.072897 -0.114526 0.024681 0.010784 --0.051759 0.032389 -0.050202 -0.083316 0.052334 --0.035100 -0.116721 -0.110336 -0.053391 0.065541 --0.029790 -0.020457 0.135285 -0.004142 0.111508 --0.030936 0.018549 -0.016034 0.018572 -0.084336 --0.048615 -0.018739 -0.096815 -0.090162 0.019410 --0.040821 -0.009925 -0.097427 0.091891 0.031793 --0.024598 -0.132848 0.078353 0.089339 -0.068562 --0.020779 0.040974 -0.055675 0.169131 0.029649 -0.078165 -0.050679 -0.005881 -0.004983 -0.104324 --0.069096 0.127960 0.011392 -0.000769 0.062168 --0.079842 0.001606 0.089284 -0.035465 0.031075 -0.029519 -0.102956 -0.010902 -0.064030 -0.019669 -0.057492 0.075802 -0.008904 -0.060743 -0.053144 -0.005126 0.062980 0.085674 0.019895 0.104448 --0.086473 0.056906 0.056795 -0.012940 0.036606 --0.008604 -0.040450 0.042062 0.041810 0.027680 --0.092256 0.091237 -0.039500 0.024761 -0.088978 -0.068585 0.088295 -0.048033 -0.017808 0.045370 -0.124600 -0.035320 0.056751 0.092751 0.054025 --0.015725 -0.061938 0.036806 0.078768 -0.016065 -0.002444 -0.023887 -0.072177 -0.029790 -0.005860 -0.015478 0.129142 -0.091024 0.071482 -0.065445 -0.005867 -0.006051 0.098646 0.054089 0.018713 -0.033837 -0.008355 -0.051959 0.057440 0.160305 --0.001863 0.016738 -0.033705 0.062233 -0.140759 -0.027342 0.060074 0.030362 -0.117875 0.061020 --0.028026 -0.088238 -0.003782 -0.146288 -0.080395 -0.050048 0.036136 0.019500 0.066902 0.020355 -0.024817 -0.056254 -0.140918 -0.085803 0.020540 --0.003730 0.161411 -0.049408 0.000219 -0.002348 --0.055021 0.067820 0.126483 -0.031063 -0.119299 --0.102834 0.001133 0.010172 0.107707 -0.029106 --0.059813 0.036698 -0.021720 -0.043189 -0.002270 --0.031694 0.009605 -0.022459 -0.036417 0.053675 -0.061561 -0.012723 0.050040 -0.029450 0.131044 --0.124516 -0.107579 -0.012171 0.011761 0.002599 -0.016327 -0.060854 -0.080910 0.030875 -0.002997 --0.020970 -0.011880 -0.086096 0.037912 0.012421 -0.055253 -0.007250 0.041740 0.055596 -0.024420 --0.017564 -0.079202 0.008897 0.180091 0.054490 -0.001772 -0.022151 -0.082048 -0.010559 -0.163377 --0.020660 -0.017827 -0.030800 -0.045856 0.122405 --0.052946 -0.130490 0.097383 -0.116737 0.039855 -0.056504 -0.059549 -0.059931 -0.018658 0.034898 -0.054889 0.005373 -0.066796 -0.127360 0.047960 -0.071746 0.027410 -0.006212 0.024132 -0.094062 -0.005369 -0.008926 0.073085 -0.014265 -0.029204 --0.100025 -0.072076 0.014651 0.069368 0.048275 --0.066823 0.086074 0.014921 -0.015395 -0.045138 -0.026224 0.000902 -0.038208 -0.035221 0.057397 -0.097606 -0.073195 0.051626 -0.033488 0.027813 -0.002070 -0.097510 -0.057877 0.126680 -0.082194 --0.072597 0.006014 -0.093185 -0.016853 -0.022790 -0.138461 0.005394 -0.056485 0.102778 0.028918 --0.045604 -0.060041 0.121251 0.029260 -0.101404 -0.061194 0.033039 -0.016798 0.064263 0.065144 -0.010925 0.023151 0.107623 0.027977 -0.090356 --0.024863 -0.006440 0.047870 -0.047486 0.088211 --0.012139 -0.116121 -0.000525 -0.140961 0.016604 -0.063490 -0.022732 -0.046944 0.066970 -0.068838 -0.016143 0.026202 -0.043344 -0.064881 0.024877 --0.072845 0.120531 0.077901 0.047272 0.011713 --0.044646 0.040932 0.076164 -0.101233 -0.029615 --0.065118 0.050966 -0.023273 0.053517 0.023710 --0.007489 0.035822 0.023439 -0.055528 -0.004033 --0.007662 -0.096546 -0.081662 0.037141 0.137562 -0.075526 -0.097496 0.123990 0.013996 0.087005 --0.019788 -0.082043 0.020524 0.007027 -0.021537 --0.036264 -0.090952 -0.177722 -0.009306 -0.031473 --0.009287 0.047557 -0.090241 0.089347 0.056375 --0.005506 -0.112128 0.004356 0.064421 -0.038478 --0.035674 0.040616 0.007731 0.160236 -0.054199 --0.007537 0.012434 0.022001 -0.021567 -0.075163 --0.026053 0.015909 0.041015 0.021832 0.034152 --0.048539 -0.086655 0.047465 0.000682 0.042640 -0.023697 -0.095971 -0.022874 -0.000369 0.003413 -0.046005 0.064807 0.010131 -0.129517 -0.092254 -0.116469 0.053796 0.038110 0.094470 0.018435 --0.034803 0.073591 0.108348 0.104096 0.049884 --0.021274 0.022097 0.065347 0.065555 0.089319 -0.000474 -0.004186 -0.040493 -0.065543 -0.083167 --0.017425 0.049177 -0.044248 0.008399 0.068180 -0.154778 0.027549 -0.008012 0.014950 0.043254 -0.039599 -0.136415 -0.018716 0.061900 0.031263 -0.058118 -0.037200 -0.114692 -0.080876 -0.053238 -0.077436 0.015015 -0.092517 0.005804 -0.065541 --0.005653 -0.073184 0.095594 0.082470 0.060989 --0.000262 -0.035766 -0.083441 0.122634 0.088429 --0.014397 -0.055434 -0.005659 0.069697 -0.064892 -0.008824 0.082498 0.051866 -0.036070 0.033403 --0.082855 -0.087376 0.002714 -0.097121 -0.019170 -0.027179 -0.069870 -0.009316 0.047450 0.040657 -0.060527 0.004620 -0.040264 -0.051228 -0.029023 --0.071384 0.101421 0.009538 -0.099185 0.060100 --0.048395 -0.024677 0.025125 -0.056043 -0.058045 --0.054059 0.008107 0.021078 0.045290 -0.018459 --0.113359 0.014009 -0.006826 -0.052747 0.046922 --0.075976 0.008538 -0.084411 -0.004369 0.045801 -0.075392 -0.067340 0.014454 0.032407 0.092478 --0.061859 -0.083458 0.051442 0.031695 -0.080233 -0.054028 0.027000 -0.073549 0.032300 0.036501 --0.011384 -0.020780 -0.124142 0.093905 -0.028332 -0.039139 -0.030944 0.079952 -0.001717 0.013976 -0.038005 -0.001751 -0.044097 0.129827 0.014385 --0.001682 -0.063458 -0.002511 -0.078150 -0.141236 -0.021955 0.104851 -0.093246 -0.060019 0.069998 -0.004399 -0.096408 0.059327 -0.062268 -0.074327 -0.108063 -0.090534 -0.045654 0.048119 0.049187 -0.042105 0.043964 -0.091516 -0.047999 -0.028881 -0.070471 0.055401 -0.025605 0.011176 0.008475 -0.022254 0.038266 0.048106 0.047176 -0.017967 --0.010978 -0.088762 0.034806 0.019311 0.126815 --0.010571 0.053073 0.032162 -0.000780 -0.152200 --0.014253 -0.021954 -0.131040 -0.061376 0.113838 -0.060725 0.020201 0.102533 -0.011392 -0.052046 --0.069625 -0.091011 -0.097954 0.067847 0.017856 --0.053461 -0.040679 -0.121664 -0.077208 -0.106919 -0.057996 0.069756 -0.012433 0.069569 -0.055159 --0.024801 -0.060448 0.101700 0.014619 0.036580 --0.004526 0.093977 -0.028211 0.045261 0.149736 --0.014691 -0.007959 0.097708 0.107128 -0.079723 -0.029157 0.020116 0.104828 -0.064208 0.119172 -0.039583 -0.029446 0.006628 -0.110398 0.004062 -0.048132 -0.060601 0.009448 0.051777 -0.053127 -0.050551 -0.001924 0.028079 -0.050618 -0.013698 -0.001920 0.088162 0.073078 0.085795 -0.066788 -0.014025 0.042699 0.176241 -0.046674 -0.034822 --0.051433 0.121729 -0.057076 0.023901 0.045075 --0.057182 0.054780 -0.017280 -0.146674 0.002090 --0.016223 -0.044841 -0.084524 -0.152479 0.072688 --0.006962 0.008711 0.127455 -0.003876 0.053162 --0.013682 -0.025386 -0.000427 -0.024811 -0.024474 --0.056267 0.062116 -0.121311 -0.053011 0.065651 --0.075385 -0.008680 -0.063033 0.083039 0.110577 --0.000152 -0.127017 0.055904 0.013659 0.005664 --0.002852 0.047248 0.001128 0.100773 0.037274 -0.026368 -0.042205 0.021887 -0.020247 -0.056678 --0.077475 0.089799 0.058003 0.039741 0.106663 --0.016853 -0.015972 0.075741 -0.048829 0.015374 --0.032657 -0.125677 -0.062060 -0.057409 -0.061287 -0.073151 0.050357 0.053547 -0.059886 -0.051298 -0.057954 -0.003817 0.076028 0.006757 0.061109 --0.038030 0.143209 0.092207 -0.018493 0.062291 -0.005751 -0.036449 0.067582 0.031449 0.101894 --0.080754 0.011515 -0.049485 -0.016137 -0.087818 -0.108851 0.038222 -0.099315 -0.003117 0.052278 -0.107517 -0.036233 0.065370 0.040409 -0.057029 --0.033167 -0.081758 -0.019502 0.033438 0.013365 --0.017760 -0.025906 -0.020244 -0.078722 -0.011697 --0.028246 0.068647 -0.106417 0.026956 -0.064914 -0.062711 -0.017857 0.151539 0.044613 -0.017820 -0.009085 -0.032785 -0.025795 0.075790 0.075667 --0.040398 0.058556 -0.042634 0.093973 -0.099529 -0.057103 0.073562 0.012640 -0.066141 0.029558 -0.060219 -0.083699 -0.054799 -0.120442 -0.000374 -0.006521 0.034512 -0.039558 0.042191 0.033865 -0.103992 -0.014977 -0.077384 -0.051340 0.001873 -0.047451 0.140612 -0.024885 -0.021420 -0.046604 -0.030606 0.100660 0.076356 -0.019288 -0.098570 --0.114463 -0.010855 -0.034657 0.025618 -0.003356 --0.087913 0.064346 -0.075540 -0.091569 -0.024965 --0.021232 -0.017255 -0.056931 -0.003104 0.030219 --0.020112 -0.012334 0.035298 0.001405 0.161753 --0.064618 -0.064401 -0.007218 -0.000120 -0.047208 -0.116105 -0.056464 -0.069645 -0.007032 -0.012090 --0.023237 0.016000 -0.039802 0.074319 -0.012604 -0.014863 -0.058081 0.093219 0.062253 -0.040302 -0.027405 -0.128683 0.039923 0.116808 -0.011706 -0.012483 -0.017698 0.003645 -0.007588 -0.120662 --0.032868 0.066217 -0.031343 -0.034166 0.146334 --0.031228 -0.125921 0.117756 -0.042686 -0.062094 -0.049375 -0.112262 0.010166 -0.073599 0.048690 -0.028292 0.020076 -0.062865 -0.106114 -0.025300 -0.066916 0.029279 0.028191 -0.003599 -0.040614 -0.020491 0.060238 0.052747 -0.010390 -0.022389 --0.063358 -0.028707 0.035907 -0.011898 0.079703 --0.003758 0.078051 -0.017869 0.009045 -0.018982 -0.034974 0.069405 -0.018909 -0.038613 0.083909 -0.033935 -0.036607 0.088891 -0.052599 -0.059839 -0.052758 -0.068308 -0.063615 0.126093 -0.009460 --0.042175 -0.011113 -0.073071 0.052086 -0.052619 -0.049226 0.066898 -0.045666 0.117923 0.053656 --0.010739 -0.043962 0.141903 0.001792 -0.035469 -0.090671 0.043993 -0.013655 0.018989 0.127223 -0.001030 -0.001154 0.081839 -0.024979 -0.103704 --0.077920 0.036083 0.068220 -0.062210 0.113730 --0.010501 -0.065801 0.050885 -0.104304 0.121937 -0.111850 0.009680 -0.011791 0.001677 -0.035029 -0.010677 0.024572 -0.012860 -0.030323 -0.010466 -0.011279 0.167752 0.003136 0.109709 0.007292 -0.000987 0.004572 0.108706 -0.113192 -0.012431 --0.015225 0.073653 -0.051275 0.077928 -0.012752 --0.011708 0.014172 0.025162 -0.095378 0.026382 --0.028889 -0.058569 -0.129329 0.011087 0.061452 -0.056893 -0.058004 0.103586 -0.060752 0.081824 --0.042805 -0.015991 -0.024444 0.028952 -0.013528 -0.042851 0.019988 -0.165741 -0.031012 -0.014713 --0.026059 0.031698 -0.134343 0.032090 0.020828 -0.051674 -0.128006 0.050856 0.022220 -0.073513 --0.009340 0.013756 0.036163 0.098407 -0.023495 -0.023858 0.008121 0.022220 -0.103489 -0.046663 --0.033000 0.063565 0.029224 -0.012693 0.084202 -0.012187 -0.051000 0.026126 -0.043293 0.008675 --0.019812 -0.165070 -0.014555 -0.047431 0.017990 --0.040073 0.107192 0.022228 -0.089023 -0.066885 -0.014630 0.073186 0.069902 0.072634 0.019593 --0.041539 0.031788 0.092310 0.027223 0.034027 --0.051855 0.000391 0.007869 0.131910 0.069384 -0.046276 0.040440 -0.037093 -0.031393 -0.112828 -0.015709 0.096749 -0.103205 -0.021284 0.011405 -0.158287 -0.021028 0.042219 -0.050759 0.069715 --0.042907 -0.116980 0.014224 0.094648 0.028395 -0.041535 -0.057033 -0.047607 -0.024419 -0.034905 -0.010125 0.036728 -0.052503 -0.001839 -0.033477 --0.053414 -0.070394 0.092895 0.100600 -0.026352 -0.080574 -0.028763 -0.059548 0.094571 0.091787 -0.041437 0.014312 0.045792 0.108269 -0.081586 -0.056288 0.137447 0.054718 -0.032474 0.054502 --0.100144 -0.006460 0.024739 -0.117043 -0.008919 -0.070299 -0.036862 -0.014543 0.024500 -0.015222 -0.114975 -0.043705 0.000421 -0.061872 -0.035148 --0.022797 0.128575 -0.031798 -0.086718 -0.007172 --0.071706 -0.006833 0.028645 -0.007011 -0.096745 --0.142269 0.027996 0.065210 0.061381 0.000741 --0.140531 0.017480 -0.014986 -0.040893 -0.012718 --0.012494 -0.021869 -0.032923 0.016456 0.104475 -0.010792 -0.066178 0.019097 -0.001893 0.067513 --0.092673 -0.059851 -0.045936 0.052642 -0.062500 -0.065013 -0.025659 -0.149301 0.051705 0.035692 --0.045790 -0.007482 -0.069141 0.149365 -0.042039 -0.018492 -0.081315 0.055880 0.058158 0.019669 -0.063836 -0.012391 0.007057 0.155454 0.033854 --0.016532 -0.007661 0.043113 -0.080283 -0.108670 --0.029344 0.093781 -0.015840 -0.068134 0.091804 -0.004148 -0.058507 0.059633 -0.095883 -0.004939 -0.086151 -0.113571 -0.019466 -0.009167 0.003662 diff --git a/gr-vocoder/lib/codec2/codebook/lspvqanssi1.txt b/gr-vocoder/lib/codec2/codebook/lspvqanssi1.txt deleted file mode 100644 index 0b9dd90205..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspvqanssi1.txt +++ /dev/null @@ -1,257 +0,0 @@ -10 256 -0.5862 0.7213 0.9146 1.0909 1.2910 1.4954 1.8370 2.0840 2.3771 2.5518 -0.0871 0.2049 0.5849 0.8552 1.2096 1.4686 1.8210 2.0926 2.4508 2.7389 -0.2274 0.3126 0.6088 0.8338 1.1824 1.5948 1.8228 1.9856 2.1832 2.4793 -0.1827 0.2706 0.5842 0.7761 1.0301 1.2462 1.6313 1.9786 2.3479 2.6790 -0.3055 0.3863 0.7194 1.1609 1.3303 1.5017 1.7265 1.9412 2.4659 2.6315 -0.1794 0.2522 0.5477 0.7892 1.3887 1.7101 1.9471 2.1667 2.4361 2.6310 -0.1825 0.2729 0.4185 0.6024 1.2531 1.7291 1.9937 2.1849 2.5865 2.7748 -0.3219 0.4045 0.7357 1.2708 1.4626 1.6439 1.9388 2.1212 2.5005 2.6749 -0.2234 0.3496 0.5054 0.6981 0.8672 1.0431 1.7091 2.0690 2.3290 2.6195 -0.3009 0.3957 0.7576 0.9751 1.1955 1.7727 2.0383 2.2474 2.5612 2.7188 -0.3841 0.5544 0.9209 1.1811 1.5441 1.8126 2.1175 2.3192 2.5486 2.6935 -0.2153 0.3105 0.5597 0.8313 1.2168 1.4512 1.7012 1.8962 2.3893 2.5852 -0.3196 0.4814 0.7629 1.0869 1.5517 1.7780 2.0462 2.2547 2.5023 2.6706 -0.1964 0.3055 0.4307 0.7178 1.4260 1.6240 1.8392 2.0576 2.2976 2.5492 -0.4260 0.6888 1.2019 1.4194 1.6437 1.8221 2.0469 2.2508 2.5142 2.6795 -0.3004 0.3944 0.5847 1.0050 1.1812 1.3559 1.5479 1.7847 2.4924 2.6703 -0.1595 0.2398 0.4336 0.9228 1.2602 1.5064 1.7915 1.9840 2.2320 2.5692 -0.1832 0.2985 0.4205 0.5980 0.7620 0.9894 1.7499 2.1151 2.4814 2.7214 -0.2234 0.3207 0.5457 0.9799 1.2074 1.7079 1.9734 2.1742 2.4575 2.6366 -0.3598 0.4819 0.6385 0.8878 1.3226 1.4910 1.7257 1.9456 2.2061 2.4579 -0.4671 0.5911 0.8513 1.0923 1.5104 1.7043 1.9727 2.1839 2.4484 2.6111 -0.2418 0.3937 0.5420 0.8971 1.1152 1.3054 1.7928 1.9796 2.5441 2.7572 -0.3541 0.4730 0.6546 0.9063 1.0792 1.2743 1.8545 2.0555 2.3083 2.5404 -0.3121 0.4016 0.7137 0.8835 1.0736 1.5907 1.8624 2.0857 2.5075 2.6668 -0.2232 0.3631 0.5273 0.7438 1.0492 1.2235 1.5449 2.2198 2.5160 2.6852 -0.2557 0.3528 0.5051 0.6528 0.8351 1.5688 1.8838 2.1056 2.4401 2.6111 -0.4342 0.5318 0.9234 1.1146 1.3015 1.5198 1.8211 2.0340 2.3694 2.5506 -0.4310 0.5269 0.7431 0.9018 1.0734 1.5196 1.8267 2.0244 2.4508 2.6177 -0.2150 0.3249 0.4966 0.9434 1.1627 1.3497 1.8003 2.0045 2.3567 2.5909 -0.2798 0.4111 0.5786 0.7971 1.0414 1.2142 1.6947 2.0866 2.3351 2.5545 -0.1688 0.2693 0.4004 0.6337 1.3058 1.5064 1.7535 1.9689 2.5542 2.7424 -0.4419 0.6209 1.0127 1.2135 1.4104 1.6111 1.8820 2.1005 2.4238 2.5966 -0.3645 0.5120 0.8977 1.2209 1.5286 1.7204 1.9787 2.1779 2.4390 2.6114 -0.2897 0.4136 0.5504 0.8515 1.2641 1.4334 1.8079 2.0656 2.3509 2.7593 -0.1611 0.4723 0.7420 1.0071 1.2571 1.5891 1.9224 2.2345 2.5647 2.7991 -0.2528 0.4178 0.8909 1.3117 1.6622 1.8641 2.1017 2.2974 2.5299 2.6982 -0.1749 0.2700 0.4116 0.6036 1.1430 1.7776 2.0394 2.2220 2.4667 2.6598 -0.3451 0.4325 0.6194 0.7406 0.9176 1.5540 1.8426 2.0479 2.4401 2.5965 -0.3672 0.5164 0.6558 0.8441 1.2332 1.4114 1.6955 2.0875 2.3674 2.5471 -0.2194 0.3467 0.7384 1.1079 1.5398 1.8437 2.1212 2.3296 2.5800 2.7403 -0.1525 0.2343 0.3915 0.6843 1.0517 1.5020 1.7905 1.9667 2.2027 2.6725 -0.3531 0.5908 0.7462 0.9441 1.2774 1.4743 1.8268 2.1059 2.4478 2.6484 -0.3611 0.4981 0.7598 0.9676 1.4024 1.6330 1.9094 2.1433 2.4408 2.6130 -0.2153 0.3366 0.4974 0.6693 1.1944 1.6791 1.9002 2.1105 2.4100 2.5922 -0.2421 0.3392 0.5123 0.9818 1.5411 1.7092 1.9989 2.1981 2.5659 2.7656 -0.2116 0.3250 0.4845 0.8021 1.0088 1.2158 1.8038 2.0223 2.2975 2.5810 -0.1902 0.2942 0.8003 1.1086 1.3606 1.6008 1.8956 2.1328 2.4481 2.6405 -0.2772 0.3914 0.5826 0.7654 0.9495 1.1240 1.3949 2.0411 2.3891 2.5959 -0.2678 0.5220 0.7630 1.1000 1.3747 1.6432 1.9391 2.2237 2.5511 2.7893 -0.3200 0.4245 0.6174 0.9904 1.1662 1.3882 1.7601 1.9524 2.3998 2.5819 -0.1702 0.4871 0.8370 1.0989 1.3593 1.5830 1.8750 2.1277 2.4666 2.6885 -0.2280 0.3748 0.6554 0.9113 1.2081 1.4619 1.8181 2.0541 2.3791 2.5701 -0.1752 0.4363 0.6454 0.8798 1.1079 1.5367 1.8667 2.1716 2.4804 2.7249 -0.3804 0.4700 0.8224 1.0099 1.1892 1.5906 1.8879 2.0907 2.4544 2.6238 -0.1808 0.2910 0.4683 0.7059 0.8980 1.4031 1.7063 1.9444 2.4658 2.6776 -0.2418 0.3803 0.5443 0.7589 1.1496 1.3185 1.5451 1.7433 2.1310 2.6523 -0.2698 0.3690 0.5362 1.0732 1.2921 1.4696 1.7440 1.9470 2.5051 2.6841 -0.4099 0.5102 0.6983 1.0468 1.2459 1.4185 1.8851 2.0815 2.3464 2.5605 -0.0669 0.1354 0.3764 0.8433 1.1719 1.4834 1.8181 2.1312 2.4626 2.8044 -0.1614 0.2372 0.3878 0.5708 1.2759 1.4950 1.8052 2.0807 2.3485 2.6293 -0.1688 0.2875 0.4301 0.9059 1.2361 1.4054 1.8057 1.9924 2.5589 2.7495 -0.2864 0.3783 0.7032 1.0817 1.2382 1.5741 1.8619 2.0656 2.5139 2.6848 -0.3829 0.4781 0.6766 0.8340 1.0056 1.4147 1.6650 1.8840 2.3922 2.5619 -0.3259 0.4187 0.6139 0.7338 1.1831 1.6497 1.9000 2.1278 2.4322 2.5930 -0.2569 0.3790 0.5426 0.8390 0.9871 1.4850 1.8652 2.0732 2.4314 2.6005 -0.1408 0.2283 0.4024 0.8784 1.1485 1.4003 1.7004 1.9205 2.3723 2.6522 -0.2971 0.5039 0.8005 1.1212 1.4232 1.7801 2.1255 2.3907 2.6795 2.8487 -0.1515 0.2344 0.4684 0.8040 1.0401 1.3774 1.8329 2.1235 2.5555 2.7770 -0.5778 0.7157 0.8910 1.0966 1.4235 1.6482 1.9551 2.1831 2.4572 2.6234 -0.3017 0.4161 0.8088 0.9971 1.2000 1.4419 1.7867 2.0224 2.3473 2.5400 -0.1208 0.2814 0.6564 0.9448 1.2377 1.5663 1.9084 2.2112 2.5583 2.8155 -0.2127 0.3127 0.4635 0.6416 0.8449 1.6652 2.0577 2.2656 2.5811 2.7434 -0.1942 0.3011 0.4212 0.6901 1.5369 1.7639 1.9608 2.1766 2.4435 2.6663 -0.3510 0.4345 0.7146 0.9086 1.0678 1.2579 1.4425 2.0265 2.4574 2.6252 -0.3225 0.4323 0.6168 0.8580 1.5388 1.7910 1.9927 2.2013 2.4494 2.6160 -0.2271 0.4488 0.6287 0.7857 1.2086 1.3830 1.6194 2.1955 2.5236 2.6945 -0.2568 0.3510 0.5613 1.0500 1.2521 1.4359 1.6995 1.9187 2.2148 2.4275 -0.2933 0.3941 0.6128 0.8899 1.0720 1.2862 1.5331 1.8301 2.1553 2.3865 -0.3480 0.4626 0.6009 0.7630 0.9044 1.1225 1.8539 2.1845 2.5035 2.7091 -0.1337 0.4722 0.8099 1.1273 1.4252 1.6990 2.0188 2.2922 2.6018 2.8168 -0.1138 0.3263 0.8059 1.0473 1.3262 1.6202 1.9439 2.2007 2.5347 2.7702 -0.1979 0.3130 0.4635 0.8504 1.1143 1.3221 2.0371 2.2421 2.5406 2.7491 -0.3321 0.4194 0.8239 1.0458 1.1981 1.3733 1.5661 1.9985 2.3747 2.5416 -0.3729 0.5958 0.9551 1.2650 1.5484 1.9255 2.2256 2.4809 2.7276 2.8935 -0.1664 0.2516 0.5347 0.7545 1.1971 1.4089 1.7400 2.0871 2.4098 2.6795 -0.2370 0.3178 0.6123 1.3315 1.5470 1.7257 2.0063 2.1977 2.5449 2.7252 -0.2030 0.3328 0.4766 0.7357 1.2780 1.4439 1.7229 1.9405 2.2278 2.6816 -0.1702 0.2919 0.4598 0.7123 0.9077 1.1450 1.8632 2.0806 2.4990 2.7100 -0.2421 0.3578 0.5400 0.7217 0.8971 1.4898 1.8518 2.1205 2.6077 2.7894 -0.3030 0.3935 0.5812 0.7404 0.9425 1.8342 2.0887 2.2811 2.5596 2.7118 -0.1322 0.1997 0.3466 0.6981 1.1811 1.4849 1.8594 2.1114 2.4708 2.7804 -0.2317 0.3069 0.6860 1.4306 1.7121 1.8671 2.1249 2.2995 2.5705 2.7456 -0.3778 0.4863 0.6639 0.9163 1.1560 1.3186 1.5389 1.7169 2.1603 2.5797 -0.2118 0.3499 0.5259 0.7200 1.1348 1.3140 1.5657 2.0241 2.2873 2.5184 -0.2902 0.4368 0.6331 0.8971 1.3102 1.5219 1.8674 2.1512 2.4708 2.6809 -0.1418 0.3988 0.6251 0.8544 1.1268 1.3964 1.7585 2.0322 2.3964 2.6928 -0.2314 0.3462 0.7282 0.9211 1.1766 1.4941 1.7368 1.9546 2.5170 2.7066 -0.2076 0.3251 0.7423 0.9590 1.1936 1.5329 1.8887 2.1588 2.4667 2.6709 -0.2058 0.4139 0.5745 0.7832 0.9595 1.1688 1.7561 1.9562 2.4840 2.7001 -0.1834 0.2971 0.4643 0.6625 0.8802 1.1137 1.5183 1.8417 2.3842 2.7042 -0.1688 0.4218 0.7070 1.0465 1.4496 1.6953 1.9560 2.2174 2.5172 2.7404 -0.2323 0.3981 0.5489 0.7227 1.2886 1.5221 1.7158 2.1184 2.4066 2.5898 -0.3470 0.5265 0.8140 1.0152 1.3206 1.5411 1.8490 2.0588 2.3556 2.5393 -0.1707 0.2595 0.6762 0.9037 1.2781 1.4903 1.7946 2.0610 2.3741 2.5771 -0.1457 0.2318 0.6039 1.0078 1.3461 1.5908 1.8818 2.1248 2.4432 2.6714 -0.6574 0.8086 1.0243 1.2183 1.4837 1.7129 2.0197 2.2464 2.5059 2.6716 -0.2546 0.4983 0.8674 1.2536 1.6704 1.9529 2.2134 2.4319 2.6532 2.8109 -0.2455 0.3379 0.4632 0.8635 1.5286 1.8047 1.9909 2.1806 2.4031 2.5729 -0.4772 0.6742 1.0000 1.2474 1.5288 1.7415 2.0102 2.2168 2.4770 2.6449 -0.3357 0.4382 0.6033 1.1317 1.3681 1.5576 1.9251 2.1119 2.5548 2.7395 -0.2588 0.7015 0.8953 1.0830 1.2828 1.5160 1.8965 2.1921 2.5150 2.7258 -0.2466 0.3512 0.5047 0.6646 0.8161 1.2577 1.8046 2.0214 2.4447 2.6491 -0.1631 0.2283 0.4070 0.5955 1.1126 1.3894 1.8978 2.1849 2.5384 2.7382 -0.3424 0.4748 0.6222 0.8020 0.9706 1.1568 1.7044 1.9297 2.2127 2.5627 -0.2088 0.5143 0.7400 0.9277 1.1032 1.3561 1.8841 2.2004 2.5882 2.7993 -0.2016 0.3488 0.5894 0.7419 1.1488 1.3626 1.5566 1.9694 2.5488 2.7209 -0.2558 0.3914 0.5360 0.7521 1.4330 1.6955 1.8886 2.1428 2.4190 2.5966 -0.4021 0.5034 0.6653 0.8123 0.9586 1.2825 1.9184 2.1120 2.4090 2.5970 -0.2343 0.4800 0.6934 0.8523 1.2786 1.4763 1.7235 2.0400 2.3602 2.5562 -0.2460 0.3687 0.5325 0.7044 1.1488 1.3608 1.8112 2.0757 2.4183 2.6630 -0.1616 0.3644 0.5725 0.9166 1.2481 1.4938 1.8388 2.1175 2.4712 2.7464 -0.3760 0.4841 0.6350 1.0082 1.2110 1.4003 1.8127 2.0018 2.5199 2.7238 -0.1988 0.2824 0.6553 1.0337 1.5413 1.7369 1.9751 2.1751 2.4372 2.6265 -0.2728 0.4094 0.7498 1.0645 1.3516 1.5946 1.9910 2.2172 2.4830 2.6614 -0.1657 0.5327 0.7281 0.9966 1.2385 1.4629 1.8119 2.0973 2.4469 2.6979 -0.1413 0.2098 0.3540 0.5492 0.8486 1.1288 1.6320 1.9056 2.2805 2.5438 -0.2856 0.3666 0.6259 1.1424 1.6605 1.8197 2.0147 2.1986 2.4121 2.5919 -0.2725 0.4829 0.7650 1.0119 1.2977 1.5488 1.8755 2.1155 2.4383 2.6377 -0.2736 0.3804 0.5537 1.0258 1.2269 1.4186 1.9718 2.1468 2.5665 2.7689 -0.2341 0.5953 1.1030 1.4549 1.7361 1.9758 2.2126 2.4213 2.6405 2.8181 -0.2273 0.4638 0.6228 0.8500 1.1016 1.2823 1.7094 1.9523 2.2669 2.7029 -0.2438 0.3798 0.7299 0.9600 1.3765 1.6104 1.8644 2.1161 2.5073 2.7137 -0.1551 0.4869 0.8676 1.2274 1.5069 1.8857 2.1868 2.4411 2.7106 2.8767 -0.2746 0.5454 0.7589 0.9458 1.1597 1.3349 1.6653 2.1142 2.4356 2.6239 -0.1793 0.2646 0.4344 0.7482 1.1502 1.3733 1.8558 2.0817 2.3248 2.5171 -0.2698 0.4202 0.5765 0.8301 1.0073 1.2101 1.9714 2.2051 2.5138 2.7395 -0.1929 0.3091 0.4460 0.6266 1.1805 1.3672 1.5990 2.1514 2.4729 2.6468 -0.1901 0.3047 0.4607 1.1019 1.3168 1.5343 1.9234 2.1365 2.5924 2.7807 -0.3139 0.5009 0.6700 0.8268 1.0117 1.1810 1.6539 2.1984 2.4828 2.6576 -0.1403 0.2173 0.4117 0.7302 1.0038 1.2732 1.7392 2.0337 2.3809 2.7386 -0.4166 0.5101 0.7449 1.1663 1.3492 1.5543 1.9000 2.0941 2.4588 2.6365 -0.3342 0.4335 0.6160 0.8559 1.0112 1.2097 1.4029 1.6361 2.4129 2.6324 -0.4543 0.6159 0.7932 0.9843 1.2562 1.4308 1.7116 1.9919 2.2671 2.4631 -0.2153 0.3609 0.5302 0.7089 0.8756 1.0376 1.6496 2.2826 2.5680 2.7441 -0.4380 0.6439 0.8282 1.0651 1.3650 1.5829 1.8838 2.1005 2.4006 2.5771 -0.2523 0.3636 0.5879 1.1628 1.3542 1.6756 2.0488 2.2543 2.6093 2.7953 -0.4179 0.5426 0.7065 0.8996 1.0684 1.3146 1.9705 2.2021 2.5051 2.7061 -0.1659 0.2860 0.6693 0.9229 1.3959 1.6544 1.9709 2.2257 2.5236 2.7460 -0.2540 0.4356 0.5946 0.7627 1.2274 1.4222 1.6573 1.9601 2.2514 2.4711 -0.1633 0.2337 0.3698 0.5421 1.1757 1.5916 2.1561 2.3371 2.5534 2.7737 -0.1953 0.2730 0.4521 1.2005 1.7062 1.8627 2.1313 2.3266 2.5906 2.7667 -0.3053 0.4054 0.5651 0.7470 0.8910 1.1720 1.8864 2.1074 2.3705 2.5744 -0.1761 0.3033 0.6501 0.8268 1.0369 1.2687 1.8534 2.1889 2.5074 2.7339 -0.2265 0.3990 1.1359 1.4137 1.6839 1.8912 2.0948 2.3042 2.5489 2.7234 -0.3326 0.5400 0.8711 1.0948 1.3752 1.6155 1.9360 2.1537 2.4451 2.6133 -0.2162 0.3522 0.5309 0.7470 0.9677 1.1747 1.5056 1.7942 2.1615 2.4800 -0.1872 0.2761 0.4053 0.7469 1.5858 1.8945 2.1198 2.3197 2.5819 2.7758 -0.5381 0.8651 1.2695 1.4918 1.7774 1.9696 2.1865 2.3687 2.5739 2.7158 -0.2663 0.3422 0.6098 1.2120 1.4516 1.6092 1.8506 2.0376 2.2929 2.5088 -0.1904 0.3051 0.5663 0.7391 1.1589 1.5705 1.8756 2.1653 2.5518 2.7693 -0.1543 0.3519 0.6976 1.0664 1.3696 1.7817 2.1308 2.4259 2.7070 2.8753 -0.3304 0.4283 0.5942 0.7425 0.8906 1.4067 2.0676 2.2460 2.5394 2.7006 -0.2080 0.3215 0.6278 0.7882 1.3123 1.5592 1.8048 2.0831 2.4303 2.6266 -0.1188 0.2481 0.8270 1.2420 1.5824 1.8976 2.1816 2.4248 2.6645 2.8459 -0.0635 0.1528 0.5973 0.9377 1.2653 1.5465 1.8818 2.1681 2.5089 2.7924 -0.3249 0.5179 0.9143 1.2973 1.4966 1.7550 2.0715 2.3166 2.6500 2.8305 -0.1918 0.3107 0.4506 0.6994 1.3463 1.5348 1.8447 2.1903 2.4480 2.6877 -0.3405 0.4644 0.7232 0.9199 1.2611 1.5175 1.8446 2.0652 2.3915 2.5781 -0.3289 0.5152 0.6602 1.0213 1.1886 1.5496 1.9553 2.1883 2.5394 2.7362 -0.3000 0.4097 0.8372 1.0793 1.3095 1.5684 1.8746 2.0783 2.3643 2.5490 -0.2421 0.3280 0.5288 0.9261 1.6911 1.8959 2.1013 2.2823 2.5238 2.6960 -0.1070 0.3131 0.6226 0.8881 1.1808 1.4867 1.8146 2.1088 2.4594 2.7186 -0.4400 0.5533 0.7025 0.9206 1.4089 1.5820 1.8080 2.0832 2.3577 2.5300 -0.2250 0.3434 0.4808 0.6721 0.8198 1.1446 2.0201 2.2625 2.5520 2.7604 -0.1671 0.2551 0.4603 0.6777 0.9661 1.5579 1.8659 2.1196 2.4425 2.6551 -0.3910 0.5877 1.0287 1.3547 1.6899 1.9166 2.1451 2.3337 2.5519 2.7071 -0.1435 0.2165 0.3968 0.8376 1.2572 1.5298 1.8791 2.1352 2.4636 2.7011 -0.1756 0.2799 0.4120 0.5808 0.7573 1.3340 1.8235 2.1200 2.4993 2.7365 -0.1332 0.2174 0.4716 0.9483 1.2723 1.6028 1.9272 2.2190 2.5588 2.7990 -0.2122 0.3143 0.7042 0.8849 1.1312 1.3711 1.6832 1.9633 2.2685 2.5156 -0.2089 0.3339 0.4817 0.8526 1.0657 1.2741 1.5747 1.8000 2.4860 2.6843 -0.1636 0.2617 0.4400 0.7357 1.0355 1.2638 1.5672 1.8504 2.1904 2.6588 -0.1945 0.2934 0.4869 0.8567 1.1262 1.3604 1.6898 1.9143 2.1475 2.3503 -0.1606 0.2442 0.3931 0.9237 1.5811 1.7529 2.0133 2.2272 2.5250 2.7265 -0.4866 0.7045 1.0593 1.2795 1.5326 1.8221 2.1461 2.3665 2.6041 2.7599 -0.4012 0.4911 0.7103 0.8585 1.0495 1.7244 2.0116 2.2041 2.5189 2.6643 -0.4365 0.6694 0.8644 1.1330 1.4510 1.7627 2.1032 2.3690 2.6280 2.8306 -0.2072 0.4018 0.6227 0.8913 1.3038 1.6056 1.9704 2.2816 2.6135 2.8182 -0.3302 0.4968 0.8713 1.0761 1.2576 1.4654 1.8152 2.1400 2.5404 2.7493 -0.1385 0.2292 0.3530 0.6006 1.4699 1.6571 1.9438 2.1663 2.5027 2.7308 -0.1894 0.2915 0.4345 0.6341 1.0024 1.1896 1.6896 2.0966 2.4086 2.6768 -0.3841 0.5197 0.8889 1.1480 1.4383 1.6285 1.8642 2.0669 2.3466 2.5325 -0.2008 0.3097 0.4664 0.6638 1.2798 1.4940 1.7270 2.0264 2.2915 2.4750 -0.1864 0.2857 0.4481 1.1025 1.3096 1.5035 1.7614 1.9891 2.4255 2.6031 -0.4081 0.6134 0.9514 1.1818 1.3943 1.6361 1.9891 2.2395 2.5547 2.7287 -0.2964 0.3876 0.9450 1.2247 1.3906 1.5882 1.8241 2.0589 2.4188 2.5871 -0.3127 0.4038 0.6168 1.0810 1.3067 1.4759 1.8817 2.0781 2.3394 2.5539 -0.2066 0.3059 0.4989 0.7132 0.9066 1.4460 1.7584 1.9755 2.2210 2.4741 -0.2634 0.3956 0.5667 0.8777 1.0517 1.6029 2.0590 2.2607 2.6064 2.7647 -0.4331 0.5315 0.7764 1.0444 1.2269 1.4311 1.7093 1.9187 2.4337 2.6149 -0.2161 0.4429 0.6851 0.8336 1.1037 1.2966 1.5283 2.0299 2.3407 2.5384 -0.2814 0.3637 0.5416 0.9475 1.5137 1.6945 1.8892 2.1017 2.3190 2.5007 -0.4454 0.6883 1.1402 1.4098 1.7435 2.0014 2.2521 2.4457 2.6495 2.7985 -0.1641 0.4083 0.6426 1.0592 1.3258 1.5754 1.8666 2.1381 2.4572 2.7177 -0.3391 0.4607 0.6072 0.8463 1.4207 1.6062 1.8303 2.0887 2.3615 2.5348 -0.2414 0.3396 0.5100 0.7470 1.3329 1.8618 2.0751 2.2564 2.5147 2.6874 -0.1694 0.2535 0.4156 0.8302 1.2853 1.5838 2.0907 2.3085 2.5929 2.7951 -0.2047 0.3652 0.6500 0.8068 1.0178 1.1865 1.4889 2.0671 2.5966 2.7634 -0.2425 0.3247 0.6020 1.2226 1.4272 1.5996 1.8377 2.0413 2.5333 2.7021 -0.3842 0.5030 0.6541 0.8771 1.0576 1.2612 1.6744 1.8735 2.4781 2.6803 -0.2042 0.3280 0.7283 0.8985 1.1444 1.3299 1.6032 2.1539 2.4739 2.6547 -0.1268 0.1924 0.3208 0.5153 1.1304 1.4443 1.8047 2.0552 2.4385 2.7572 -0.2713 0.3659 0.5395 1.0705 1.4228 1.5836 1.9763 2.1641 2.4459 2.6301 -0.3047 0.4043 0.5727 0.7368 0.8997 1.3242 1.6473 1.8879 2.4330 2.6295 -0.1224 0.3948 0.6903 0.9199 1.2852 1.5516 1.8645 2.1231 2.4657 2.7044 -0.2157 0.3281 0.5036 0.9272 1.0975 1.5285 1.8080 2.0569 2.5448 2.7221 -0.1670 0.2490 0.3696 0.5921 1.3019 1.8398 2.2165 2.3725 2.6142 2.8338 -0.3899 0.5573 0.8100 1.0732 1.3966 1.6598 2.0001 2.2517 2.5548 2.7403 -0.4905 0.6064 0.8222 0.9966 1.1912 1.5714 1.9628 2.1727 2.5300 2.7055 -0.1309 0.2342 0.6232 0.8795 1.1283 1.3655 1.7371 2.0251 2.3992 2.6885 -0.1805 0.2672 0.4297 1.2440 1.4967 1.6796 1.9592 2.1784 2.5439 2.7289 -0.2280 0.5429 0.6967 0.8732 1.4074 1.6074 1.9516 2.2124 2.5486 2.7722 -0.2339 0.3379 0.4924 0.9061 1.3074 1.4719 1.8884 2.1110 2.3618 2.5545 -0.1384 0.2291 0.5127 1.0450 1.4017 1.7884 2.1134 2.3664 2.6588 2.8435 -0.2196 0.6359 0.9100 1.2007 1.4589 1.7053 2.0128 2.2722 2.5520 2.7643 -0.1698 0.2615 0.3810 0.5706 1.4297 1.8686 2.0728 2.2559 2.4860 2.6701 -0.1445 0.2158 0.3658 0.5451 0.9389 1.3669 1.7900 2.0846 2.3924 2.7161 -0.2789 0.3816 0.5277 0.8487 1.3751 1.5461 1.7832 2.0264 2.2695 2.4665 -0.1733 0.3023 0.9216 1.2368 1.4776 1.7229 1.9952 2.2471 2.5390 2.7265 -0.3374 0.5033 1.0951 1.3262 1.5284 1.7336 1.9733 2.2009 2.4992 2.6751 -0.1293 0.2743 0.7533 1.0166 1.2416 1.4444 1.7962 2.0851 2.4770 2.7204 -0.3106 0.4176 0.6358 0.9434 1.1419 1.3458 1.9638 2.1678 2.4390 2.6235 -0.4533 0.5760 0.7392 0.9136 1.0829 1.2759 1.7903 2.0360 2.3124 2.5325 -0.3702 0.5218 0.6977 0.8776 1.1096 1.2855 1.5612 1.9480 2.2170 2.4361 -0.1637 0.2647 0.4185 0.6666 1.1584 1.3270 1.7829 1.9821 2.4361 2.7094 -0.1769 0.2767 0.3942 0.5746 1.3595 1.7110 1.9176 2.1405 2.3722 2.5705 -0.2712 0.3820 0.6524 0.8317 1.0341 1.3972 1.7312 1.9918 2.3854 2.5886 -0.1003 0.2046 0.7261 1.1004 1.4057 1.6697 1.9903 2.2603 2.5813 2.8009 -0.2534 0.3752 0.7192 0.9323 1.3698 1.5955 1.8653 2.0656 2.3368 2.5340 -0.3589 0.4508 0.6631 1.0521 1.5065 1.6697 1.8929 2.1074 2.3466 2.5242 -0.1955 0.2862 0.6111 0.8053 1.0501 1.5218 1.7996 2.0303 2.3788 2.5973 -0.2982 0.4033 0.5660 0.8924 1.1933 1.3465 1.7895 2.0173 2.2606 2.5069 -0.3356 0.4711 0.6310 0.8491 1.0049 1.4364 1.8176 2.0292 2.5710 2.7525 -0.2016 0.2912 0.4363 0.9800 1.4897 1.6494 1.8862 2.0819 2.3636 2.6091 -0.4549 0.6491 0.8450 1.0209 1.1747 1.3745 1.8824 2.1130 2.3760 2.5768 -0.2510 0.3524 0.5171 0.8931 1.4094 1.5710 1.8536 2.0478 2.4766 2.7320 -0.1576 0.2547 0.3891 0.8551 1.4282 1.5880 1.8583 2.0521 2.5359 2.7340 -0.3481 0.4382 0.7720 1.1289 1.3203 1.5019 1.7665 1.9570 2.2231 2.4465 -0.3116 0.4068 0.6991 0.8894 1.0912 1.5356 1.8084 2.0006 2.2323 2.4367 -0.2706 0.4033 0.8272 1.0851 1.4820 1.6927 1.9292 2.1267 2.4049 2.5857 -0.2745 0.3550 0.8663 1.3742 1.5545 1.7324 1.9664 2.1538 2.4581 2.6245 -0.1736 0.2553 0.5357 0.9009 1.1888 1.5132 1.8579 2.1181 2.4273 2.6847 -0.3026 0.4148 0.9044 1.1695 1.3657 1.7036 1.9891 2.2226 2.5441 2.7085 -0.3998 0.5108 0.7205 0.9848 1.1828 1.3716 1.7154 1.9191 2.1875 2.4257 -0.2141 0.3095 0.7428 1.0426 1.2851 1.5571 1.7901 1.9804 2.2462 2.5265 -0.1574 0.2290 0.3869 0.5735 1.0925 1.3383 1.6598 1.9364 2.2095 2.4195 diff --git a/gr-vocoder/lib/codec2/codebook/lspvqanssi2.txt b/gr-vocoder/lib/codec2/codebook/lspvqanssi2.txt deleted file mode 100644 index 607cb47a9f..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspvqanssi2.txt +++ /dev/null @@ -1,129 +0,0 @@ -10 128 -0.0120 0.0022 0.0068 -0.0112 -0.0508 -0.0490 0.2249 0.1476 0.0133 -0.0379 -0.0598 0.0477 0.0380 0.0660 0.0517 0.0150 0.0617 0.0081 -0.0768 -0.1007 --0.0087 -0.0440 0.0873 0.0882 0.0391 -0.0060 0.1100 0.0569 -0.0241 -0.0468 -0.0146 -0.0005 0.0322 -0.0650 -0.0778 -0.0780 -0.0255 -0.0527 -0.0301 -0.0401 --0.0240 -0.0560 -0.0374 0.0274 0.0484 -0.0227 0.0328 0.1135 0.0117 -0.0300 --0.0324 -0.0574 0.0302 0.0137 -0.0603 -0.1194 -0.0105 -0.0513 0.0698 0.0538 -0.0635 0.0382 0.0531 0.0897 0.0495 0.0039 -0.0421 -0.0919 0.0407 0.0167 -0.0954 0.0854 0.0360 -0.0025 -0.0252 -0.0528 -0.0435 -0.0561 -0.0405 -0.0432 -0.0110 -0.0010 -0.0433 -0.0167 0.1402 0.0738 0.0423 -0.0024 -0.0920 -0.1099 -0.0179 0.0184 -0.0041 -0.0640 0.1004 0.0608 -0.0023 -0.0357 0.1509 0.1262 --0.0145 -0.0240 -0.0595 -0.1063 0.0597 -0.0040 -0.0886 0.1184 0.0380 0.0126 --0.0072 0.0172 0.0076 0.0288 0.0810 0.0278 0.0709 0.0051 0.0214 -0.0301 -0.0127 -0.0126 -0.0434 0.1610 0.1178 0.0704 0.0257 -0.0073 -0.0425 -0.0610 --0.0165 -0.0369 -0.0785 0.1007 0.0309 -0.0651 0.0142 -0.0614 0.0426 0.0289 --0.0374 -0.0712 0.0049 -0.0382 0.0472 0.0095 -0.0268 -0.0747 -0.0457 -0.0758 --0.0211 -0.0432 -0.0547 -0.0446 -0.1078 0.0090 -0.0565 -0.1298 0.0721 0.0351 --0.0014 -0.0072 -0.0283 -0.0324 -0.0208 -0.0703 0.0979 0.0865 -0.0007 0.1881 --0.0077 -0.0302 0.1231 0.0905 0.0786 0.0432 -0.0286 -0.0661 -0.0055 -0.0275 -0.0010 0.0043 0.0044 0.0380 -0.1201 -0.0098 -0.0166 0.0105 0.0153 0.0134 -0.0843 0.0636 0.0416 -0.0004 -0.0570 -0.0592 0.1158 0.0590 0.0126 0.0034 -0.0346 0.0290 -0.0037 -0.0026 -0.0457 0.1824 0.1469 0.0870 0.0291 -0.0074 -0.0066 0.0682 -0.0148 0.0287 0.0095 -0.0563 0.1296 0.0426 0.1215 0.0886 --0.0132 -0.0399 0.0960 0.0474 0.0140 0.0306 -0.0192 -0.0703 -0.1559 -0.1556 --0.0600 0.0482 0.1257 0.0521 0.0229 -0.0031 0.0817 0.0571 -0.0138 -0.0277 -0.0013 -0.0103 -0.0470 -0.0687 -0.1444 0.0181 0.1350 0.0559 -0.0177 -0.0598 --0.0215 -0.0318 -0.0689 -0.0268 0.0917 0.0307 0.0135 -0.0184 -0.0857 0.1231 -0.0137 -0.0152 0.0199 -0.0291 -0.0685 0.0438 -0.1137 0.0231 -0.0632 -0.0802 --0.0011 0.0314 0.0535 -0.0135 -0.0291 -0.0579 -0.1049 0.0288 -0.0628 0.1355 --0.0901 0.0041 -0.0170 0.0351 0.0144 -0.0505 0.0396 0.0638 -0.0145 0.0141 --0.0400 -0.0603 -0.0714 0.0329 -0.0049 -0.0529 -0.1251 0.0022 -0.0449 -0.0778 -0.0247 0.0296 0.0239 0.0122 -0.0348 -0.1224 -0.0033 0.1237 -0.0016 -0.0436 -0.0246 0.0050 0.0322 0.0818 0.0203 0.0846 0.0022 0.0876 0.0149 -0.0184 --0.0204 -0.0228 0.0365 -0.0164 0.1087 0.0374 -0.0550 0.0330 -0.0582 -0.0736 --0.0305 -0.0485 -0.0572 0.0275 -0.0271 -0.0436 0.1217 0.0700 0.1253 0.0990 --0.0079 -0.0204 -0.0325 0.0491 0.0158 -0.0365 -0.1309 -0.1812 0.1428 0.1148 -0.0680 0.0547 0.0309 0.0079 -0.0332 0.0391 -0.0287 0.1258 0.1123 0.1016 --0.0264 -0.0409 -0.0538 -0.0192 -0.0393 -0.0713 -0.0618 -0.1078 -0.1850 0.0532 -0.0081 -0.0115 -0.0090 0.1201 -0.0413 -0.0995 0.0445 -0.0032 -0.0286 -0.0497 --0.0023 -0.0184 -0.0358 0.1279 0.0847 0.0530 0.0230 -0.0212 0.1245 0.0965 -0.0111 0.1038 0.0597 0.0413 0.0533 0.0011 0.0031 0.0705 0.0242 0.0198 -0.0020 -0.0071 -0.0262 -0.0496 -0.0750 -0.1273 -0.1785 0.0606 -0.0223 -0.0583 --0.0202 0.0669 0.0081 0.0335 -0.0218 -0.1073 -0.0146 -0.0673 0.0490 0.0210 --0.0108 -0.0230 -0.0614 -0.0986 0.0629 0.0006 0.1496 0.1099 0.0316 0.0098 --0.0368 -0.0685 0.0138 -0.0213 -0.0009 0.0344 -0.0249 0.0311 0.0803 0.0759 -0.0038 -0.0158 0.0142 0.0254 0.0970 0.0021 -0.1029 0.0006 0.0576 0.0261 --0.0083 0.0698 0.0406 -0.0348 0.0200 0.0833 0.0186 -0.0145 -0.0725 -0.0872 --0.0506 -0.0673 0.0776 -0.0172 -0.0444 -0.0531 -0.0799 0.0005 -0.0359 -0.0446 -0.0368 0.0376 -0.0407 -0.0190 0.0987 0.0212 -0.0349 -0.0951 -0.0084 -0.0342 --0.0309 -0.0561 0.0950 -0.0125 -0.1028 -0.0133 0.0920 0.0965 0.0668 0.0409 --0.0898 0.0036 -0.0353 -0.0024 -0.0365 -0.0259 -0.0485 -0.0843 -0.0063 -0.0167 --0.0255 -0.0407 -0.0456 -0.0931 -0.0892 -0.0293 -0.0510 0.0183 -0.0104 0.0472 --0.0172 -0.0399 -0.0731 0.0546 0.0320 -0.0283 0.0415 -0.0107 -0.1237 -0.1102 -0.0210 0.0294 -0.0038 -0.0090 -0.0551 -0.0922 0.0261 -0.0334 -0.1181 -0.1536 -0.0092 0.0032 -0.0162 0.0398 0.0205 0.1266 -0.0107 -0.0858 0.0392 0.0032 --0.0038 -0.0269 -0.0737 0.1138 0.0263 -0.0031 -0.1188 0.1621 0.0831 0.0526 -0.0023 -0.0149 -0.0497 0.0898 0.0456 -0.0145 -0.0928 -0.1507 -0.0611 -0.0938 -0.0120 0.0124 -0.0286 -0.1319 0.0219 0.0311 -0.0398 -0.0465 -0.0008 -0.0375 -0.0138 0.0023 0.0024 0.1072 0.0531 0.0006 0.0292 -0.0115 -0.0620 0.1650 -0.0070 -0.0251 0.0715 0.0380 -0.0404 0.1230 0.0629 0.0096 0.0973 0.0641 --0.0586 0.0772 0.0128 0.1060 0.0715 0.0374 -0.0074 -0.0365 -0.0543 -0.0489 --0.0392 0.0871 -0.0069 -0.1084 0.0264 -0.0495 0.0396 0.0005 -0.0293 -0.0240 --0.0327 0.0605 0.0662 0.0100 -0.0007 -0.0525 -0.0812 -0.0686 -0.0873 -0.0830 -0.0119 0.0058 0.0030 -0.0307 0.0650 0.0175 -0.0741 -0.1500 -0.1947 0.0881 -0.0572 0.0411 0.0152 -0.0127 -0.0589 -0.0510 -0.0212 -0.0834 0.1434 0.1318 -0.0518 0.0417 -0.0430 0.0963 -0.0014 0.0173 0.0234 -0.0273 0.0359 -0.0118 -0.0652 0.0587 0.0013 -0.0700 0.1262 0.0975 0.0680 0.0598 0.0048 -0.0305 --0.0185 -0.0440 0.1178 0.0656 0.0052 -0.0534 -0.1151 0.1116 0.0659 0.0344 -0.0788 0.0577 0.0452 0.0283 -0.0278 0.0911 0.0280 -0.0254 0.0029 -0.0361 --0.0165 -0.0322 -0.0526 -0.1057 0.0927 0.0293 -0.1026 -0.1671 0.0470 0.0355 -0.0100 0.0001 -0.0221 -0.0775 -0.1109 -0.1416 0.0884 0.0441 0.0632 0.0409 -0.0204 0.0432 0.0141 -0.0296 0.1073 0.0580 0.0383 0.0270 -0.0857 0.1246 -0.0488 0.0231 0.0648 -0.0179 0.0747 0.0156 -0.0384 -0.0733 -0.0732 -0.0970 -0.0005 -0.0199 -0.0260 -0.0511 -0.1110 0.0670 -0.0413 0.1571 0.0498 0.0191 -0.0037 -0.0085 -0.0796 0.0086 -0.0852 0.0850 0.0115 -0.0065 0.1161 0.0727 -0.0023 0.0483 0.0285 -0.0642 -0.0477 0.0175 0.0346 0.0452 0.0655 0.0284 --0.0986 0.0463 0.0326 -0.0055 0.0702 0.0194 -0.0423 -0.0107 0.0338 0.0619 -0.0126 -0.0138 -0.1115 0.0159 -0.0331 0.0217 -0.0376 -0.0407 -0.0222 -0.0503 -0.0222 0.0071 -0.0490 0.1017 0.0551 -0.0164 0.1578 0.1059 0.0025 -0.0107 -0.0124 -0.0090 0.0322 0.0930 0.0281 -0.0403 -0.0781 0.0125 -0.0670 -0.1058 -0.0363 0.0077 0.1052 0.0039 0.0676 0.0891 0.0433 0.0252 0.0224 -0.0043 --0.0045 -0.0194 -0.0193 -0.0480 -0.0640 -0.0695 -0.1597 -0.0030 0.1728 0.1231 -0.0297 0.0025 0.0619 -0.0347 -0.1171 0.1043 0.0868 0.0191 -0.0739 -0.1075 -0.0073 0.0914 0.0367 -0.0236 0.0232 0.0304 -0.0787 -0.1099 0.0460 0.0082 -0.0296 0.0297 -0.0444 0.0184 0.0602 -0.0295 -0.0934 0.0636 -0.0347 -0.0722 --0.0290 -0.0629 0.0598 0.0013 0.0064 0.1431 0.0920 0.0468 -0.0311 -0.0614 --0.0152 -0.0311 -0.0500 -0.0672 -0.1257 -0.0134 -0.0220 -0.0612 -0.1131 -0.1417 -0.0371 0.0153 -0.0817 -0.0007 0.0837 0.0481 0.0460 0.0678 0.0524 0.0432 -0.0126 -0.0069 -0.0092 -0.0693 -0.0250 0.1510 0.0098 -0.0683 -0.0566 -0.0769 --0.0199 -0.0423 0.0806 0.0562 0.0009 -0.0563 -0.1358 -0.1578 -0.0456 0.0032 -0.0091 0.0101 -0.0090 -0.0279 -0.0489 -0.1038 -0.0815 0.2184 0.1172 0.0902 --0.0024 -0.0135 0.0392 0.0028 0.0792 0.0404 0.0867 0.1610 0.0954 0.0846 --0.0004 -0.0220 -0.0282 -0.1022 -0.0799 0.1278 0.0765 0.0402 0.0850 0.0611 -0.0443 0.0320 -0.0384 -0.0964 0.0030 -0.0398 -0.0730 -0.0052 -0.0267 0.1209 --0.0706 0.1151 0.0722 -0.0175 -0.0927 -0.0559 0.0316 0.0186 0.0105 0.0314 --0.0145 -0.0263 -0.0564 0.0248 -0.0181 -0.0817 -0.0938 0.0366 -0.0315 0.1253 -0.0307 0.0039 0.1290 0.0402 -0.0439 -0.0384 0.0044 -0.0177 -0.0172 -0.0310 -0.0447 0.0298 0.0287 0.0273 -0.0350 -0.0708 -0.1829 -0.0317 0.0643 0.0057 --0.0820 -0.0326 0.0209 -0.0711 0.0084 0.0111 0.0426 0.0262 -0.0061 0.0005 -0.0545 0.0377 -0.0417 -0.0625 0.0114 -0.0405 0.0573 0.0191 -0.0263 -0.0472 --0.0053 -0.0049 -0.0255 -0.0578 -0.0237 -0.0721 -0.1487 -0.1636 0.0046 -0.0355 -0.0309 0.0107 0.0163 0.0132 -0.0536 -0.0009 -0.0706 -0.1350 -0.0514 -0.0960 -0.0306 0.0003 0.0494 0.0701 0.0027 -0.0458 0.0780 0.0327 0.0937 0.0605 --0.0017 -0.0275 0.0797 -0.0268 -0.1014 0.0593 -0.0528 -0.1103 0.0682 0.0322 --0.0507 -0.0806 -0.0646 -0.0052 -0.0576 0.0451 0.0489 0.0150 0.0029 -0.0189 -0.0270 0.0143 -0.0375 -0.0071 -0.0607 -0.1157 -0.0345 -0.1115 0.0201 -0.0104 --0.0807 -0.1088 0.0845 0.0720 0.0441 0.0301 0.0043 0.0052 0.0016 0.0201 --0.0290 -0.0532 0.0036 -0.0201 -0.0723 -0.1321 0.0867 0.0479 -0.0556 -0.0850 --0.0271 0.0126 0.1283 0.0533 -0.0030 -0.0352 -0.0326 -0.0553 0.1402 0.1121 --0.0358 -0.0518 -0.1080 0.0134 0.0950 0.0384 -0.0040 -0.0254 0.0026 -0.0217 --0.0152 -0.0375 -0.0827 0.0916 0.0188 0.1306 0.0983 0.0606 0.0381 0.0080 --0.0107 -0.0269 -0.0573 -0.1189 0.0258 0.1009 0.0565 0.0270 -0.0557 -0.0778 --0.0193 -0.0242 -0.0784 -0.0816 0.0287 -0.0484 0.0292 -0.0414 0.1124 0.0767 -0.0177 -0.0148 0.0472 -0.0808 0.0623 -0.0636 0.0750 -0.0107 0.0673 0.0425 --0.0220 0.0577 -0.0769 -0.0247 -0.0321 0.0341 -0.0108 0.0109 -0.0142 0.0122 -0.0194 0.0248 -0.0096 -0.0205 -0.0460 -0.1160 0.0492 -0.0188 -0.1535 0.0816 -0.0301 -0.0286 -0.0077 -0.0117 -0.0036 -0.0026 0.0133 -0.0032 0.0007 -0.0160 -0.0115 -0.0111 0.0246 -0.0639 0.0325 -0.0313 0.0808 0.0435 -0.0777 -0.1108 --0.0079 -0.0334 -0.0144 -0.0539 0.1564 0.1175 0.0549 0.0340 0.0319 0.0027 --0.0155 -0.0275 -0.0739 -0.0932 0.0108 -0.0698 0.0036 -0.0213 -0.0486 -0.0670 --0.0234 -0.0567 0.0020 0.0908 -0.0151 0.0460 -0.0175 -0.0523 0.0098 -0.0237 -0.0057 -0.0066 -0.0418 0.0418 -0.0449 0.1069 0.0629 -0.0016 -0.1068 -0.1492 --0.0791 0.0403 -0.0009 0.0285 -0.0065 0.0963 0.0550 0.0634 0.0693 0.0694 --0.0068 -0.0197 -0.0919 0.0071 -0.0551 -0.1173 0.0926 0.0413 0.0127 -0.0158 -0.0540 0.0389 -0.0195 -0.0800 -0.1383 0.0440 -0.0139 -0.0405 0.0147 -0.0183 -0.0380 0.0248 0.0520 -0.0609 0.0339 -0.0070 -0.0974 0.1182 0.0221 -0.0310 -0.0043 0.0046 -0.0274 -0.0502 0.0326 -0.0143 -0.0586 -0.0866 -0.1673 -0.1624 -0.0428 0.0385 -0.0228 0.0704 0.0069 -0.0145 -0.0623 -0.0639 -0.1479 0.0212 --0.0078 -0.0297 0.0025 -0.0239 -0.0793 0.0896 0.0315 -0.0546 -0.1309 0.1080 diff --git a/gr-vocoder/lib/codec2/codebook/lspvqanssi3.txt b/gr-vocoder/lib/codec2/codebook/lspvqanssi3.txt deleted file mode 100644 index a28c3e7fba..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspvqanssi3.txt +++ /dev/null @@ -1,65 +0,0 @@ -10 64 --0.0291 0.0272 -0.0364 -0.0313 -0.0487 -0.0205 0.0501 0.0225 0.0178 0.0080 --0.0406 -0.0383 0.0013 -0.0155 -0.0261 -0.0598 0.0003 -0.0242 0.0151 -0.0140 --0.0445 0.0356 0.0180 -0.0272 -0.0018 -0.0177 -0.0703 0.0471 0.0128 -0.0068 --0.0033 -0.0285 -0.0560 -0.0186 -0.0499 -0.0070 0.0068 -0.0126 0.0388 -0.0097 --0.0071 -0.0114 -0.0308 -0.0094 -0.0541 -0.0272 -0.0756 0.0477 -0.0234 0.0678 -0.0048 0.0307 -0.0174 -0.0593 0.0097 -0.0134 0.0034 -0.0212 -0.0418 0.0869 --0.0189 0.0165 -0.0269 0.0744 0.0344 -0.0177 -0.0603 0.0212 -0.0104 0.0345 --0.0130 -0.0352 -0.0086 -0.0257 -0.0286 0.0409 0.0656 0.0106 -0.0598 0.0252 -0.0041 0.0097 -0.0032 -0.0154 -0.0405 0.0670 -0.0164 0.0451 0.0774 0.0504 -0.0010 -0.0091 -0.0345 0.0511 0.0016 0.0011 0.0684 0.0167 0.0601 0.0512 -0.0204 -0.0038 -0.0426 0.0185 -0.0191 -0.0630 0.0295 -0.0153 -0.0559 0.0560 --0.0461 -0.0041 0.0515 0.0219 0.0322 0.0093 0.0044 0.0106 -0.0329 -0.0521 -0.0304 0.0017 0.0209 -0.0002 0.0689 0.0136 0.0216 -0.0268 -0.0682 0.0333 --0.0175 -0.0425 0.0153 -0.0050 -0.0113 0.0297 -0.0659 -0.0344 0.0302 -0.0272 --0.0217 -0.0362 0.0426 0.0233 -0.0393 0.0052 0.0138 0.0657 0.0427 0.0220 --0.0039 -0.0011 -0.0002 -0.0453 -0.0835 0.0144 -0.0268 -0.0589 -0.0185 0.0133 -0.0081 -0.0032 0.0638 0.0032 0.0060 0.0002 -0.0303 -0.0823 0.0124 -0.0308 -0.0108 0.0011 0.0059 0.0396 0.0392 0.0351 -0.0045 -0.0323 -0.0512 -0.0975 --0.0144 -0.0306 -0.0302 -0.0070 0.0123 -0.0042 -0.0083 -0.0514 0.0120 0.1116 --0.0046 -0.0131 0.0472 0.0144 -0.0296 -0.0518 0.0337 -0.0145 -0.0733 0.0793 --0.0064 -0.0162 -0.0327 -0.0711 0.0108 -0.0131 0.0025 -0.0254 -0.0277 -0.0680 --0.0306 0.0055 0.0272 -0.0189 -0.0173 0.0221 0.0773 0.0043 0.0458 -0.0169 --0.0006 0.0299 0.0259 0.0227 -0.0530 -0.0596 -0.0271 -0.0091 0.0181 -0.0233 --0.0116 -0.0398 0.0089 0.0708 -0.0028 -0.0084 -0.0206 -0.0354 -0.0275 -0.0037 -0.0259 -0.0064 -0.0380 0.0572 0.0083 0.0286 -0.0565 0.0158 0.0396 -0.0123 -0.0552 0.0331 -0.0052 -0.0346 -0.0180 -0.0194 -0.0237 0.0184 0.0056 -0.0199 -0.0143 0.0131 -0.0166 0.0196 0.0154 0.0310 -0.0048 0.0901 -0.0333 0.0761 -0.0118 -0.0107 0.0099 0.0078 0.0002 -0.0716 -0.0233 0.0793 0.0516 0.0300 -0.0204 0.0243 0.0192 0.0181 0.0001 -0.0243 -0.0764 -0.0622 -0.0324 0.0640 -0.0132 0.0016 -0.0187 -0.0425 0.0627 0.0094 -0.0786 0.0304 0.0294 -0.0146 --0.0221 -0.0154 0.0285 -0.0709 0.0406 0.0114 0.0073 -0.0199 0.0081 0.0268 -0.0227 0.0055 0.0163 -0.0447 0.0246 0.0795 0.0239 0.0211 -0.0145 -0.0576 --0.0119 0.0637 0.0278 0.0202 -0.0086 0.0389 0.0320 -0.0049 -0.0272 -0.0274 -0.0040 -0.0211 0.0426 0.0480 0.0415 0.0659 0.0408 0.0198 0.0327 0.0029 -0.0430 0.0311 0.0083 0.0353 0.0250 0.0143 0.0106 -0.0305 0.0633 0.0227 --0.0277 0.0302 0.0337 0.0176 0.0191 -0.0156 0.0231 0.0118 0.0465 0.0875 -0.0221 0.0146 0.0147 -0.0211 -0.0317 -0.0179 -0.0049 -0.0297 -0.1078 -0.0413 --0.0531 0.0180 -0.0066 0.0365 -0.0033 0.0090 -0.0158 -0.0698 0.0315 -0.0048 -0.0289 0.0053 0.0082 0.0077 -0.0664 0.0474 0.0407 -0.0096 0.0028 -0.0526 --0.0106 -0.0129 -0.0315 0.0335 -0.0217 -0.0427 0.0582 0.0193 -0.0288 -0.0777 --0.0003 -0.0141 -0.0102 0.0007 -0.0077 -0.0517 -0.0909 0.0128 -0.0349 -0.0769 --0.0227 -0.0159 -0.0327 0.0011 0.0312 0.0100 -0.0180 -0.0537 -0.0997 0.0122 -0.0190 -0.0139 0.0341 -0.0131 -0.0368 -0.0138 -0.0074 -0.0415 0.0791 0.0503 -0.0182 0.0027 0.0032 -0.0325 -0.0309 -0.0898 0.0509 -0.0170 0.0301 -0.0137 -0.0233 0.0100 0.0231 0.0730 0.0212 -0.0299 0.0440 0.0041 -0.0101 -0.0251 -0.0074 -0.0033 -0.0285 -0.0350 0.0101 0.0735 0.0036 -0.0659 0.0429 -0.0052 -0.0148 -0.0035 -0.0233 0.0079 -0.0142 -0.0402 -0.0358 -0.0985 -0.0080 -0.0549 -0.0203 0.0057 -0.0604 0.0098 0.0402 0.0151 0.0500 0.0058 -0.0086 -0.0401 -0.0056 -0.0381 0.0420 -0.0125 0.0157 -0.0268 0.0433 0.0123 -0.0176 -0.0685 -0.0030 0.0502 0.0067 -0.0222 0.0405 -0.0226 0.0020 -0.0401 -0.0026 -0.0521 -0.0317 0.0089 0.0620 0.0251 0.0066 0.0089 -0.0565 0.0414 0.0005 -0.0365 --0.0058 0.0086 -0.0291 -0.0164 -0.0134 -0.0490 -0.0427 -0.0451 0.0869 0.0334 -0.0024 0.0328 -0.0415 0.0003 -0.0287 0.0193 -0.0547 -0.0222 -0.0196 -0.0571 --0.0271 -0.0397 -0.0431 -0.0043 0.0332 0.0093 0.0082 0.0585 0.0282 0.0004 --0.0251 -0.0167 -0.0289 0.0196 -0.0363 0.0850 0.0028 0.0319 -0.0202 -0.0512 -0.0389 0.0226 0.0401 -0.0091 -0.0152 0.0001 0.0738 0.0402 0.0097 0.0310 --0.0126 0.0130 -0.0046 -0.0216 0.0298 -0.0344 0.0713 0.0547 -0.0470 -0.0294 -0.0125 0.0044 -0.0028 0.0209 -0.0200 0.0854 0.0018 -0.0386 -0.0703 0.0778 --0.0036 -0.0347 0.0309 -0.0184 0.0290 -0.0025 -0.0644 0.0347 -0.0523 0.0644 -0.0064 0.0295 -0.0017 0.0282 0.0176 0.0027 0.0246 0.0967 0.0401 -0.0231 -0.0054 -0.0109 0.0055 -0.0479 -0.0490 -0.0136 -0.0245 0.0839 0.0026 -0.0493 -0.0128 -0.0050 -0.0219 -0.0621 0.0313 0.0019 0.0696 0.0459 0.0574 0.0299 --0.0091 -0.0290 -0.0068 0.0276 0.0645 -0.0150 0.0015 -0.0374 0.0415 -0.0124 --0.0171 0.0177 -0.0138 0.0034 0.0840 0.0584 0.0233 0.0100 0.0122 0.0047 diff --git a/gr-vocoder/lib/codec2/codebook/lspvqanssi4.txt b/gr-vocoder/lib/codec2/codebook/lspvqanssi4.txt deleted file mode 100644 index 01867d40f6..0000000000 --- a/gr-vocoder/lib/codec2/codebook/lspvqanssi4.txt +++ /dev/null @@ -1,65 +0,0 @@ -10 64 -0.0221 -0.0035 -0.0032 -0.0177 -0.0327 0.0518 -0.0110 -0.0150 -0.0136 -0.0327 -0.0099 -0.0059 0.0031 -0.0174 0.0464 -0.0240 0.0251 -0.0270 0.0454 -0.0082 --0.0029 0.0025 -0.0267 -0.0318 -0.0157 0.0173 0.0253 0.0063 -0.0481 0.0419 --0.0332 -0.0179 -0.0042 0.0241 0.0044 -0.0098 -0.0081 0.0024 -0.0414 0.0339 --0.0060 0.0182 -0.0051 -0.0479 0.0016 -0.0179 0.0316 0.0222 -0.0029 -0.0351 -0.0074 0.0015 0.0337 -0.0082 -0.0008 0.0129 0.0001 0.0650 0.0175 0.0309 --0.0212 -0.0261 0.0196 -0.0309 0.0093 -0.0272 0.0260 0.0169 0.0132 0.0116 --0.0010 0.0202 0.0228 -0.0227 -0.0141 0.0192 -0.0423 -0.0097 -0.0342 0.0338 --0.0149 -0.0110 -0.0156 0.0290 0.0028 0.0123 -0.0350 -0.0501 0.0272 -0.0245 --0.0005 -0.0194 0.0460 -0.0001 -0.0280 0.0216 -0.0028 -0.0162 0.0177 -0.0254 --0.0109 -0.0026 0.0038 -0.0150 -0.0421 -0.0422 0.0164 -0.0436 0.0054 -0.0098 -0.0061 -0.0106 0.0062 0.0207 -0.0329 0.0177 -0.0578 0.0408 0.0077 -0.0260 -0.0001 -0.0098 0.0106 -0.0003 -0.0292 0.0032 0.0560 0.0311 -0.0282 -0.0445 -0.0033 0.0345 -0.0022 -0.0029 -0.0228 0.0242 0.0197 -0.0286 0.0194 -0.0328 -0.0094 -0.0010 0.0121 0.0229 0.0161 0.0363 -0.0124 0.0179 -0.0626 0.0020 --0.0070 -0.0272 -0.0171 -0.0249 -0.0039 0.0254 0.0317 -0.0324 0.0276 -0.0090 --0.0002 0.0057 -0.0204 0.0512 -0.0170 0.0113 0.0157 0.0427 -0.0024 0.0162 --0.0064 -0.0144 0.0216 0.0053 -0.0361 0.0287 0.0230 -0.0161 -0.0189 0.0589 -0.0091 -0.0059 -0.0308 0.0171 -0.0137 -0.0033 -0.0505 -0.0155 -0.0527 0.0133 --0.0121 -0.0051 0.0219 0.0136 0.0476 -0.0090 -0.0460 0.0208 0.0072 -0.0076 -0.0098 -0.0328 -0.0211 0.0054 -0.0146 -0.0263 0.0248 0.0045 -0.0183 0.0301 -0.0101 0.0139 -0.0073 0.0234 0.0083 -0.0194 -0.0365 0.0307 0.0580 0.0153 --0.0111 0.0019 0.0265 -0.0150 0.0311 0.0362 0.0244 -0.0213 -0.0224 -0.0299 -0.0061 0.0082 -0.0181 0.0081 -0.0344 0.0133 -0.0095 -0.0411 0.0462 0.0371 -0.0089 -0.0157 0.0179 -0.0256 -0.0118 -0.0302 -0.0329 0.0212 -0.0463 -0.0162 --0.0313 0.0096 -0.0040 0.0186 0.0248 -0.0126 0.0472 -0.0079 0.0115 -0.0270 -0.0055 0.0044 0.0172 0.0079 -0.0089 -0.0202 -0.0233 -0.0397 -0.0305 -0.0620 --0.0282 -0.0104 -0.0071 -0.0242 -0.0255 0.0204 -0.0187 -0.0103 -0.0227 -0.0424 --0.0056 0.0065 0.0151 -0.0376 0.0039 0.0009 -0.0507 -0.0040 0.0393 -0.0201 -0.0128 -0.0228 0.0115 -0.0446 0.0316 0.0266 -0.0036 0.0117 -0.0009 0.0048 --0.0088 0.0226 0.0125 0.0090 0.0008 -0.0341 0.0243 -0.0178 -0.0589 0.0278 -0.0151 0.0021 -0.0349 -0.0365 -0.0098 -0.0179 -0.0212 -0.0313 0.0109 -0.0164 --0.0211 -0.0112 -0.0446 0.0014 -0.0034 -0.0179 0.0110 0.0176 0.0286 0.0045 -0.0034 -0.0151 0.0380 0.0331 -0.0034 -0.0439 0.0145 0.0120 0.0036 0.0017 --0.0348 0.0192 0.0167 0.0069 -0.0266 -0.0085 -0.0076 0.0260 0.0234 0.0075 --0.0237 0.0150 -0.0094 -0.0201 0.0234 -0.0041 -0.0160 -0.0549 -0.0021 0.0239 --0.0019 0.0173 0.0295 0.0443 0.0081 0.0181 -0.0039 -0.0270 0.0155 0.0107 -0.0065 -0.0055 -0.0368 0.0232 0.0370 0.0367 0.0046 -0.0167 0.0047 0.0173 -0.0116 0.0053 -0.0229 0.0382 0.0160 -0.0453 0.0057 -0.0267 0.0020 -0.0051 --0.0140 0.0302 -0.0208 0.0106 0.0101 -0.0049 -0.0319 0.0227 -0.0206 -0.0371 --0.0007 -0.0109 -0.0053 0.0078 0.0410 -0.0001 0.0543 0.0328 -0.0196 0.0332 --0.0043 -0.0028 -0.0246 0.0285 -0.0248 0.0153 0.0303 -0.0310 -0.0335 -0.0315 --0.0417 0.1029 0.0377 0.0069 0.0012 0.0065 0.0007 -0.0144 -0.0083 0.0004 -0.0295 0.0099 -0.0144 -0.0145 0.0141 -0.0013 0.0362 -0.0142 -0.0428 -0.0161 --0.0095 -0.0206 0.0116 0.0132 0.0164 0.0158 0.0012 -0.0024 0.0640 0.0364 -0.0005 -0.0022 -0.0165 -0.0057 0.0263 0.0339 0.0014 0.0541 0.0164 -0.0411 -0.0039 -0.0143 -0.0107 0.0032 -0.0160 -0.0502 0.0010 0.0272 0.0161 -0.0500 -0.0083 0.0292 -0.0076 -0.0201 0.0313 0.0213 0.0120 0.0087 0.0285 0.0332 -0.0170 0.0018 0.0001 0.0205 0.0106 -0.0064 -0.0082 -0.0083 -0.0082 0.0886 -0.0075 -0.0078 -0.0038 -0.0337 -0.0491 0.0048 0.0069 0.0300 0.0369 0.0088 --0.0091 -0.0327 0.0041 0.0376 0.0170 0.0154 0.0126 0.0153 -0.0024 -0.0353 -0.0289 -0.0080 0.0063 0.0274 -0.0061 0.0208 0.0390 -0.0060 0.0294 -0.0088 --0.0037 -0.0195 0.0058 0.0023 -0.0149 -0.0360 -0.0587 -0.0248 0.0288 0.0203 --0.0031 0.0081 -0.0112 -0.0221 0.0067 -0.0505 -0.0233 0.0353 -0.0131 0.0417 -0.0243 0.0231 -0.0013 0.0049 -0.0423 -0.0245 -0.0029 0.0184 -0.0162 -0.0010 -0.0045 0.0101 -0.0042 0.0014 -0.0133 -0.0321 0.0642 0.0153 0.0377 0.0277 -0.0275 0.0083 0.0286 -0.0243 -0.0084 -0.0236 0.0027 -0.0289 0.0201 0.0235 -0.0281 0.0078 0.0038 0.0069 0.0302 0.0170 -0.0423 -0.0340 0.0104 -0.0181 -0.0334 -0.0034 -0.0257 -0.0061 0.0140 -0.0099 -0.0195 0.0529 0.0019 0.0010 --0.0114 0.0012 -0.0038 -0.0016 -0.0140 0.0697 0.0372 0.0243 0.0172 0.0066 -0.0192 0.0149 0.0285 0.0077 0.0246 -0.0135 0.0145 0.0317 -0.0074 -0.0438 --0.0034 -0.0175 -0.0245 -0.0153 0.0357 -0.0102 -0.0062 -0.0053 -0.0308 -0.0499 -0.0025 -0.0253 0.0148 0.0031 0.0189 -0.0023 -0.0085 -0.0596 -0.0337 0.0175 --0.0091 -0.0171 -0.0217 -0.0189 0.0056 0.0249 -0.0499 0.0236 0.0042 0.0449 diff --git a/gr-vocoder/lib/codec2/codec2.c b/gr-vocoder/lib/codec2/codec2.c deleted file mode 100644 index 5bf998064b..0000000000 --- a/gr-vocoder/lib/codec2/codec2.c +++ /dev/null @@ -1,1539 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: codec2.c - AUTHOR......: David Rowe - DATE CREATED: 21/8/2010 - - Codec2 fully quantised encoder and decoder functions. If you want use - codec2, the codec2_xxx functions are for you. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2010 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include <assert.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "defines.h" -#include "sine.h" -#include "nlp.h" -#include "dump.h" -#include "lpc.h" -#include "quantise.h" -#include "phase.h" -#include "interp.h" -#include "postfilter.h" -#include "codec2.h" -#include "lsp.h" -#include "codec2_internal.h" -#include "machdep.h" - -/*---------------------------------------------------------------------------*\ - - FUNCTION HEADERS - -\*---------------------------------------------------------------------------*/ - -void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]); -void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, - float ak[]); -void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[]); -void codec2_decode_3200(struct CODEC2 *c2, short speech[], const unsigned char * bits); -void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[]); -void codec2_decode_2400(struct CODEC2 *c2, short speech[], const unsigned char * bits); -void codec2_encode_1600(struct CODEC2 *c2, unsigned char * bits, short speech[]); -void codec2_decode_1600(struct CODEC2 *c2, short speech[], const unsigned char * bits); -void codec2_encode_1400(struct CODEC2 *c2, unsigned char * bits, short speech[]); -void codec2_decode_1400(struct CODEC2 *c2, short speech[], const unsigned char * bits); -void codec2_encode_1300(struct CODEC2 *c2, unsigned char * bits, short speech[]); -void codec2_decode_1300(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est); -void codec2_encode_1200(struct CODEC2 *c2, unsigned char * bits, short speech[]); -void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * bits); -static void ear_protection(float in_out[], int n); - -/*---------------------------------------------------------------------------*\ - - FUNCTIONS - -\*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_create - AUTHOR......: David Rowe - DATE CREATED: 21/8/2010 - - Create and initialise an instance of the codec. Returns a pointer - to the codec states or NULL on failure. One set of states is - sufficient for a full duuplex codec (i.e. an encoder and decoder). - You don't need separate states for encoders and decoders. See - c2enc.c and c2dec.c for examples. - -\*---------------------------------------------------------------------------*/ - -struct CODEC2 * CODEC2_WIN32SUPPORT codec2_create(int mode) -{ - struct CODEC2 *c2; - int i,l; - - c2 = (struct CODEC2*)malloc(sizeof(struct CODEC2)); - if (c2 == NULL) - return NULL; - - assert( - (mode == CODEC2_MODE_3200) || - (mode == CODEC2_MODE_2400) || - (mode == CODEC2_MODE_1600) || - (mode == CODEC2_MODE_1400) || - (mode == CODEC2_MODE_1300) || - (mode == CODEC2_MODE_1200) - ); - c2->mode = mode; - for(i=0; i<M; i++) - c2->Sn[i] = 1.0; - c2->hpf_states[0] = c2->hpf_states[1] = 0.0; - for(i=0; i<2*N; i++) - c2->Sn_[i] = 0; - c2->fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL); - make_analysis_window(c2->fft_fwd_cfg, c2->w,c2->W); - make_synthesis_window(c2->Pn); - c2->fft_inv_cfg = kiss_fft_alloc(FFT_DEC, 1, NULL, NULL); - quantise_init(); - c2->prev_Wo_enc = 0.0; - c2->bg_est = 0.0; - c2->ex_phase = 0.0; - - for(l=1; l<=MAX_AMP; l++) - c2->prev_model_dec.A[l] = 0.0; - c2->prev_model_dec.Wo = TWO_PI/P_MAX; - c2->prev_model_dec.L = PI/c2->prev_model_dec.Wo; - c2->prev_model_dec.voiced = 0; - - for(i=0; i<LPC_ORD; i++) { - c2->prev_lsps_dec[i] = i*PI/(LPC_ORD+1); - } - c2->prev_e_dec = 1; - - c2->nlp = nlp_create(M); - if (c2->nlp == NULL) { - free (c2); - return NULL; - } - - c2->gray = 1; - - c2->lpc_pf = 1; c2->bass_boost = 1; c2->beta = LPCPF_BETA; c2->gamma = LPCPF_GAMMA; - - c2->xq_enc[0] = c2->xq_enc[1] = 0.0; - c2->xq_dec[0] = c2->xq_dec[1] = 0.0; - - c2->smoothing = 0; - - return c2; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_destroy - AUTHOR......: David Rowe - DATE CREATED: 21/8/2010 - - Destroy an instance of the codec. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT codec2_destroy(struct CODEC2 *c2) -{ - assert(c2 != NULL); - nlp_destroy(c2->nlp); - KISS_FFT_FREE(c2->fft_fwd_cfg); - KISS_FFT_FREE(c2->fft_inv_cfg); - free(c2); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_bits_per_frame - AUTHOR......: David Rowe - DATE CREATED: Nov 14 2011 - - Returns the number of bits per frame. - -\*---------------------------------------------------------------------------*/ - -int CODEC2_WIN32SUPPORT codec2_bits_per_frame(struct CODEC2 *c2) { - if (c2->mode == CODEC2_MODE_3200) - return 64; - if (c2->mode == CODEC2_MODE_2400) - return 48; - if (c2->mode == CODEC2_MODE_1600) - return 64; - if (c2->mode == CODEC2_MODE_1400) - return 56; - if (c2->mode == CODEC2_MODE_1300) - return 52; - if (c2->mode == CODEC2_MODE_1200) - return 48; - - return 0; /* shouldn't get here */ -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_samples_per_frame - AUTHOR......: David Rowe - DATE CREATED: Nov 14 2011 - - Returns the number of bits per frame. - -\*---------------------------------------------------------------------------*/ - -int CODEC2_WIN32SUPPORT codec2_samples_per_frame(struct CODEC2 *c2) { - if (c2->mode == CODEC2_MODE_3200) - return 160; - if (c2->mode == CODEC2_MODE_2400) - return 160; - if (c2->mode == CODEC2_MODE_1600) - return 320; - if (c2->mode == CODEC2_MODE_1400) - return 320; - if (c2->mode == CODEC2_MODE_1300) - return 320; - if (c2->mode == CODEC2_MODE_1200) - return 320; - - return 0; /* shouldnt get here */ -} - -void CODEC2_WIN32SUPPORT codec2_encode(struct CODEC2 *c2, unsigned char *bits, short speech[]) -{ - assert(c2 != NULL); - assert( - (c2->mode == CODEC2_MODE_3200) || - (c2->mode == CODEC2_MODE_2400) || - (c2->mode == CODEC2_MODE_1600) || - (c2->mode == CODEC2_MODE_1400) || - (c2->mode == CODEC2_MODE_1300) || - (c2->mode == CODEC2_MODE_1200) - ); - - if (c2->mode == CODEC2_MODE_3200) - codec2_encode_3200(c2, bits, speech); - if (c2->mode == CODEC2_MODE_2400) - codec2_encode_2400(c2, bits, speech); - if (c2->mode == CODEC2_MODE_1600) - codec2_encode_1600(c2, bits, speech); - if (c2->mode == CODEC2_MODE_1400) - codec2_encode_1400(c2, bits, speech); - if (c2->mode == CODEC2_MODE_1300) - codec2_encode_1300(c2, bits, speech); - if (c2->mode == CODEC2_MODE_1200) - codec2_encode_1200(c2, bits, speech); -} - -void CODEC2_WIN32SUPPORT codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bits) -{ - codec2_decode_ber(c2, speech, bits, 0.0); -} - -void CODEC2_WIN32SUPPORT codec2_decode_ber(struct CODEC2 *c2, short speech[], const unsigned char *bits, float ber_est) -{ - assert(c2 != NULL); - assert( - (c2->mode == CODEC2_MODE_3200) || - (c2->mode == CODEC2_MODE_2400) || - (c2->mode == CODEC2_MODE_1600) || - (c2->mode == CODEC2_MODE_1400) || - (c2->mode == CODEC2_MODE_1300) || - (c2->mode == CODEC2_MODE_1200) - ); - - if (c2->mode == CODEC2_MODE_3200) - codec2_decode_3200(c2, speech, bits); - if (c2->mode == CODEC2_MODE_2400) - codec2_decode_2400(c2, speech, bits); - if (c2->mode == CODEC2_MODE_1600) - codec2_decode_1600(c2, speech, bits); - if (c2->mode == CODEC2_MODE_1400) - codec2_decode_1400(c2, speech, bits); - if (c2->mode == CODEC2_MODE_1300) - codec2_decode_1300(c2, speech, bits, ber_est); - if (c2->mode == CODEC2_MODE_1200) - codec2_decode_1200(c2, speech, bits); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_encode_3200 - AUTHOR......: David Rowe - DATE CREATED: 13 Sep 2012 - - Encodes 160 speech samples (20ms of speech) into 64 bits. - - The codec2 algorithm actually operates internally on 10ms (80 - sample) frames, so we run the encoding algorithm twice. On the - first frame we just send the voicing bits. On the second frame we - send all model parameters. Compared to 2400 we use a larger number - of bits for the LSPs and non-VQ pitch and energy. - - The bit allocation is: - - Parameter bits/frame - -------------------------------------- - Harmonic magnitudes (LSPs) 50 - Pitch (Wo) 7 - Energy 5 - Voicing (10ms update) 2 - TOTAL 64 - -\*---------------------------------------------------------------------------*/ - -void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[]) -{ - MODEL model; - float ak[LPC_ORD+1]; - float lsps[LPC_ORD]; - float e; - int Wo_index, e_index; - int lspd_indexes[LPC_ORD]; - int i; - unsigned int nbit = 0; - - assert(c2 != NULL); - - memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); - - /* first 10ms analysis frame - we just want voicing */ - - analyse_one_frame(c2, &model, speech); - pack(bits, &nbit, model.voiced, 1); - - /* second 10ms analysis frame */ - - analyse_one_frame(c2, &model, &speech[N]); - pack(bits, &nbit, model.voiced, 1); - Wo_index = encode_Wo(model.Wo); - pack(bits, &nbit, Wo_index, WO_BITS); - - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - e_index = encode_energy(e); - pack(bits, &nbit, e_index, E_BITS); - - encode_lspds_scalar(lspd_indexes, lsps, LPC_ORD); - for(i=0; i<LSPD_SCALAR_INDEXES; i++) { - pack(bits, &nbit, lspd_indexes[i], lspd_bits(i)); - } - assert(nbit == (unsigned)codec2_bits_per_frame(c2)); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_decode_3200 - AUTHOR......: David Rowe - DATE CREATED: 13 Sep 2012 - - Decodes a frame of 64 bits into 160 samples (20ms) of speech. - -\*---------------------------------------------------------------------------*/ - -void codec2_decode_3200(struct CODEC2 *c2, short speech[], const unsigned char * bits) -{ - MODEL model[2]; - int lspd_indexes[LPC_ORD]; - float lsps[2][LPC_ORD]; - int Wo_index, e_index; - float e[2]; - float snr; - float ak[2][LPC_ORD+1]; - int i,j; - unsigned int nbit = 0; - - assert(c2 != NULL); - - /* only need to zero these out due to (unused) snr calculation */ - - for(i=0; i<2; i++) - for(j=1; j<=MAX_AMP; j++) - model[i].A[j] = 0.0; - - /* unpack bits from channel ------------------------------------*/ - - /* this will partially fill the model params for the 2 x 10ms - frames */ - - model[0].voiced = unpack(bits, &nbit, 1); - model[1].voiced = unpack(bits, &nbit, 1); - - Wo_index = unpack(bits, &nbit, WO_BITS); - model[1].Wo = decode_Wo(Wo_index); - model[1].L = PI/model[1].Wo; - - e_index = unpack(bits, &nbit, E_BITS); - e[1] = decode_energy(e_index); - - for(i=0; i<LSPD_SCALAR_INDEXES; i++) { - lspd_indexes[i] = unpack(bits, &nbit, lspd_bits(i)); - } - decode_lspds_scalar(&lsps[1][0], lspd_indexes, LPC_ORD); - - /* interpolate ------------------------------------------------*/ - - /* Wo and energy are sampled every 20ms, so we interpolate just 1 - 10ms frame between 20ms samples */ - - interp_Wo(&model[0], &c2->prev_model_dec, &model[1]); - e[0] = interp_energy(c2->prev_e_dec, e[1]); - - /* LSPs are sampled every 20ms so we interpolate the frame in - between, then recover spectral amplitudes */ - - interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5); - for(i=0; i<2; i++) { - lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, - c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); - apply_lpc_correction(&model[i]); - } - - /* synthesise ------------------------------------------------*/ - - for(i=0; i<2; i++) - synthesise_one_frame(c2, &speech[N*i], &model[i], &ak[i][0]); - - /* update memories for next frame ----------------------------*/ - - c2->prev_model_dec = model[1]; - c2->prev_e_dec = e[1]; - for(i=0; i<LPC_ORD; i++) - c2->prev_lsps_dec[i] = lsps[1][i]; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_encode_2400 - AUTHOR......: David Rowe - DATE CREATED: 21/8/2010 - - Encodes 160 speech samples (20ms of speech) into 48 bits. - - The codec2 algorithm actually operates internally on 10ms (80 - sample) frames, so we run the encoding algorithm twice. On the - first frame we just send the voicing bit. On the second frame we - send all model parameters. - - The bit allocation is: - - Parameter bits/frame - -------------------------------------- - Harmonic magnitudes (LSPs) 36 - Joint VQ of Energy and Wo 8 - Voicing (10ms update) 2 - Spare 2 - TOTAL 48 - -\*---------------------------------------------------------------------------*/ - -void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[]) -{ - MODEL model; - float ak[LPC_ORD+1]; - float lsps[LPC_ORD]; - float e; - int WoE_index; - int lsp_indexes[LPC_ORD]; - int i; - int spare = 0; - unsigned int nbit = 0; - - assert(c2 != NULL); - - memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); - - /* first 10ms analysis frame - we just want voicing */ - - analyse_one_frame(c2, &model, speech); - pack(bits, &nbit, model.voiced, 1); - - /* second 10ms analysis frame */ - - analyse_one_frame(c2, &model, &speech[N]); - pack(bits, &nbit, model.voiced, 1); - - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - WoE_index = encode_WoE(&model, e, c2->xq_enc); - pack(bits, &nbit, WoE_index, WO_E_BITS); - - encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - pack(bits, &nbit, lsp_indexes[i], lsp_bits(i)); - } - pack(bits, &nbit, spare, 2); - - assert(nbit == (unsigned)codec2_bits_per_frame(c2)); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_decode_2400 - AUTHOR......: David Rowe - DATE CREATED: 21/8/2010 - - Decodes frames of 48 bits into 160 samples (20ms) of speech. - -\*---------------------------------------------------------------------------*/ - -void codec2_decode_2400(struct CODEC2 *c2, short speech[], const unsigned char * bits) -{ - MODEL model[2]; - int lsp_indexes[LPC_ORD]; - float lsps[2][LPC_ORD]; - int WoE_index; - float e[2]; - float snr; - float ak[2][LPC_ORD+1]; - int i,j; - unsigned int nbit = 0; - - assert(c2 != NULL); - - /* only need to zero these out due to (unused) snr calculation */ - - for(i=0; i<2; i++) - for(j=1; j<=MAX_AMP; j++) - model[i].A[j] = 0.0; - - /* unpack bits from channel ------------------------------------*/ - - /* this will partially fill the model params for the 2 x 10ms - frames */ - - model[0].voiced = unpack(bits, &nbit, 1); - - model[1].voiced = unpack(bits, &nbit, 1); - WoE_index = unpack(bits, &nbit, WO_E_BITS); - decode_WoE(&model[1], &e[1], c2->xq_dec, WoE_index); - - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - lsp_indexes[i] = unpack(bits, &nbit, lsp_bits(i)); - } - decode_lsps_scalar(&lsps[1][0], lsp_indexes, LPC_ORD); - check_lsp_order(&lsps[1][0], LPC_ORD); - bw_expand_lsps(&lsps[1][0], LPC_ORD, 50.0, 100.0); - - /* interpolate ------------------------------------------------*/ - - /* Wo and energy are sampled every 20ms, so we interpolate just 1 - 10ms frame between 20ms samples */ - - interp_Wo(&model[0], &c2->prev_model_dec, &model[1]); - e[0] = interp_energy(c2->prev_e_dec, e[1]); - - /* LSPs are sampled every 20ms so we interpolate the frame in - between, then recover spectral amplitudes */ - - interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5); - for(i=0; i<2; i++) { - lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, - c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); - apply_lpc_correction(&model[i]); - } - - /* synthesise ------------------------------------------------*/ - - for(i=0; i<2; i++) - synthesise_one_frame(c2, &speech[N*i], &model[i], &ak[i][0]); - - /* update memories for next frame ----------------------------*/ - - c2->prev_model_dec = model[1]; - c2->prev_e_dec = e[1]; - for(i=0; i<LPC_ORD; i++) - c2->prev_lsps_dec[i] = lsps[1][i]; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_encode_1600 - AUTHOR......: David Rowe - DATE CREATED: Feb 28 2013 - - Encodes 320 speech samples (40ms of speech) into 64 bits. - - The codec2 algorithm actually operates internally on 10ms (80 - sample) frames, so we run the encoding algorithm 4 times: - - frame 0: voicing bit - frame 1: voicing bit, Wo and E - frame 2: voicing bit - frame 3: voicing bit, Wo and E, scalar LSPs - - The bit allocation is: - - Parameter frame 2 frame 4 Total - ------------------------------------------------------- - Harmonic magnitudes (LSPs) 0 36 36 - Pitch (Wo) 7 7 14 - Energy 5 5 10 - Voicing (10ms update) 2 2 4 - TOTAL 14 50 64 - -\*---------------------------------------------------------------------------*/ - -void codec2_encode_1600(struct CODEC2 *c2, unsigned char * bits, short speech[]) -{ - MODEL model; - float lsps[LPC_ORD]; - float ak[LPC_ORD+1]; - float e; - int lsp_indexes[LPC_ORD]; - int Wo_index, e_index; - int i; - unsigned int nbit = 0; - - assert(c2 != NULL); - - memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); - - /* frame 1: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, speech); - pack(bits, &nbit, model.voiced, 1); - - /* frame 2: - voicing, scalar Wo & E -------------------------------*/ - - analyse_one_frame(c2, &model, &speech[N]); - pack(bits, &nbit, model.voiced, 1); - - Wo_index = encode_Wo(model.Wo); - pack(bits, &nbit, Wo_index, WO_BITS); - - /* need to run this just to get LPC energy */ - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - e_index = encode_energy(e); - pack(bits, &nbit, e_index, E_BITS); - - /* frame 3: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, &speech[2*N]); - pack(bits, &nbit, model.voiced, 1); - - /* frame 4: - voicing, scalar Wo & E, scalar LSPs ------------------*/ - - analyse_one_frame(c2, &model, &speech[3*N]); - pack(bits, &nbit, model.voiced, 1); - - Wo_index = encode_Wo(model.Wo); - pack(bits, &nbit, Wo_index, WO_BITS); - - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - e_index = encode_energy(e); - pack(bits, &nbit, e_index, E_BITS); - - encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - pack(bits, &nbit, lsp_indexes[i], lsp_bits(i)); - } - - assert(nbit == (unsigned)codec2_bits_per_frame(c2)); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_decode_1600 - AUTHOR......: David Rowe - DATE CREATED: 11 May 2012 - - Decodes frames of 64 bits into 320 samples (40ms) of speech. - -\*---------------------------------------------------------------------------*/ - -void codec2_decode_1600(struct CODEC2 *c2, short speech[], const unsigned char * bits) -{ - MODEL model[4]; - int lsp_indexes[LPC_ORD]; - float lsps[4][LPC_ORD]; - int Wo_index, e_index; - float e[4]; - float snr; - float ak[4][LPC_ORD+1]; - int i,j; - unsigned int nbit = 0; - float weight; - - assert(c2 != NULL); - - /* only need to zero these out due to (unused) snr calculation */ - - for(i=0; i<4; i++) - for(j=1; j<=MAX_AMP; j++) - model[i].A[j] = 0.0; - - /* unpack bits from channel ------------------------------------*/ - - /* this will partially fill the model params for the 4 x 10ms - frames */ - - model[0].voiced = unpack(bits, &nbit, 1); - - model[1].voiced = unpack(bits, &nbit, 1); - Wo_index = unpack(bits, &nbit, WO_BITS); - model[1].Wo = decode_Wo(Wo_index); - model[1].L = PI/model[1].Wo; - - e_index = unpack(bits, &nbit, E_BITS); - e[1] = decode_energy(e_index); - - model[2].voiced = unpack(bits, &nbit, 1); - - model[3].voiced = unpack(bits, &nbit, 1); - Wo_index = unpack(bits, &nbit, WO_BITS); - model[3].Wo = decode_Wo(Wo_index); - model[3].L = PI/model[3].Wo; - - e_index = unpack(bits, &nbit, E_BITS); - e[3] = decode_energy(e_index); - - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - lsp_indexes[i] = unpack(bits, &nbit, lsp_bits(i)); - } - decode_lsps_scalar(&lsps[3][0], lsp_indexes, LPC_ORD); - check_lsp_order(&lsps[3][0], LPC_ORD); - bw_expand_lsps(&lsps[3][0], LPC_ORD, 50.0, 100.0); - - /* interpolate ------------------------------------------------*/ - - /* Wo and energy are sampled every 20ms, so we interpolate just 1 - 10ms frame between 20ms samples */ - - interp_Wo(&model[0], &c2->prev_model_dec, &model[1]); - e[0] = interp_energy(c2->prev_e_dec, e[1]); - interp_Wo(&model[2], &model[1], &model[3]); - e[2] = interp_energy(e[1], e[3]); - - /* LSPs are sampled every 40ms so we interpolate the 3 frames in - between, then recover spectral amplitudes */ - - for(i=0, weight=0.25; i<3; i++, weight += 0.25) { - interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight); - } - for(i=0; i<4; i++) { - lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, - c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); - apply_lpc_correction(&model[i]); - } - - /* synthesise ------------------------------------------------*/ - - for(i=0; i<4; i++) - synthesise_one_frame(c2, &speech[N*i], &model[i], &ak[i][0]); - - /* update memories for next frame ----------------------------*/ - - c2->prev_model_dec = model[3]; - c2->prev_e_dec = e[3]; - for(i=0; i<LPC_ORD; i++) - c2->prev_lsps_dec[i] = lsps[3][i]; - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_encode_1400 - AUTHOR......: David Rowe - DATE CREATED: May 11 2012 - - Encodes 320 speech samples (40ms of speech) into 56 bits. - - The codec2 algorithm actually operates internally on 10ms (80 - sample) frames, so we run the encoding algorithm 4 times: - - frame 0: voicing bit - frame 1: voicing bit, joint VQ of Wo and E - frame 2: voicing bit - frame 3: voicing bit, joint VQ of Wo and E, scalar LSPs - - The bit allocation is: - - Parameter frame 2 frame 4 Total - ------------------------------------------------------- - Harmonic magnitudes (LSPs) 0 36 36 - Energy+Wo 8 8 16 - Voicing (10ms update) 2 2 4 - TOTAL 10 46 56 - -\*---------------------------------------------------------------------------*/ - -void codec2_encode_1400(struct CODEC2 *c2, unsigned char * bits, short speech[]) -{ - MODEL model; - float lsps[LPC_ORD]; - float ak[LPC_ORD+1]; - float e; - int lsp_indexes[LPC_ORD]; - int WoE_index; - int i; - unsigned int nbit = 0; - - assert(c2 != NULL); - - memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); - - /* frame 1: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, speech); - pack(bits, &nbit, model.voiced, 1); - - /* frame 2: - voicing, joint Wo & E -------------------------------*/ - - analyse_one_frame(c2, &model, &speech[N]); - pack(bits, &nbit, model.voiced, 1); - - /* need to run this just to get LPC energy */ - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - - WoE_index = encode_WoE(&model, e, c2->xq_enc); - pack(bits, &nbit, WoE_index, WO_E_BITS); - - /* frame 3: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, &speech[2*N]); - pack(bits, &nbit, model.voiced, 1); - - /* frame 4: - voicing, joint Wo & E, scalar LSPs ------------------*/ - - analyse_one_frame(c2, &model, &speech[3*N]); - pack(bits, &nbit, model.voiced, 1); - - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - WoE_index = encode_WoE(&model, e, c2->xq_enc); - pack(bits, &nbit, WoE_index, WO_E_BITS); - - encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - pack(bits, &nbit, lsp_indexes[i], lsp_bits(i)); - } - - assert(nbit == (unsigned)codec2_bits_per_frame(c2)); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_decode_1400 - AUTHOR......: David Rowe - DATE CREATED: 11 May 2012 - - Decodes frames of 56 bits into 320 samples (40ms) of speech. - -\*---------------------------------------------------------------------------*/ - -void codec2_decode_1400(struct CODEC2 *c2, short speech[], const unsigned char * bits) -{ - MODEL model[4]; - int lsp_indexes[LPC_ORD]; - float lsps[4][LPC_ORD]; - int WoE_index; - float e[4]; - float snr; - float ak[4][LPC_ORD+1]; - int i,j; - unsigned int nbit = 0; - float weight; - - assert(c2 != NULL); - - /* only need to zero these out due to (unused) snr calculation */ - - for(i=0; i<4; i++) - for(j=1; j<=MAX_AMP; j++) - model[i].A[j] = 0.0; - - /* unpack bits from channel ------------------------------------*/ - - /* this will partially fill the model params for the 4 x 10ms - frames */ - - model[0].voiced = unpack(bits, &nbit, 1); - - model[1].voiced = unpack(bits, &nbit, 1); - WoE_index = unpack(bits, &nbit, WO_E_BITS); - decode_WoE(&model[1], &e[1], c2->xq_dec, WoE_index); - - model[2].voiced = unpack(bits, &nbit, 1); - - model[3].voiced = unpack(bits, &nbit, 1); - WoE_index = unpack(bits, &nbit, WO_E_BITS); - decode_WoE(&model[3], &e[3], c2->xq_dec, WoE_index); - - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - lsp_indexes[i] = unpack(bits, &nbit, lsp_bits(i)); - } - decode_lsps_scalar(&lsps[3][0], lsp_indexes, LPC_ORD); - check_lsp_order(&lsps[3][0], LPC_ORD); - bw_expand_lsps(&lsps[3][0], LPC_ORD, 50.0, 100.0); - - /* interpolate ------------------------------------------------*/ - - /* Wo and energy are sampled every 20ms, so we interpolate just 1 - 10ms frame between 20ms samples */ - - interp_Wo(&model[0], &c2->prev_model_dec, &model[1]); - e[0] = interp_energy(c2->prev_e_dec, e[1]); - interp_Wo(&model[2], &model[1], &model[3]); - e[2] = interp_energy(e[1], e[3]); - - /* LSPs are sampled every 40ms so we interpolate the 3 frames in - between, then recover spectral amplitudes */ - - for(i=0, weight=0.25; i<3; i++, weight += 0.25) { - interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight); - } - for(i=0; i<4; i++) { - lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, - c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); - apply_lpc_correction(&model[i]); - } - - /* synthesise ------------------------------------------------*/ - - for(i=0; i<4; i++) - synthesise_one_frame(c2, &speech[N*i], &model[i], &ak[i][0]); - - /* update memories for next frame ----------------------------*/ - - c2->prev_model_dec = model[3]; - c2->prev_e_dec = e[3]; - for(i=0; i<LPC_ORD; i++) - c2->prev_lsps_dec[i] = lsps[3][i]; - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_encode_1300 - AUTHOR......: David Rowe - DATE CREATED: March 14 2013 - - Encodes 320 speech samples (40ms of speech) into 52 bits. - - The codec2 algorithm actually operates internally on 10ms (80 - sample) frames, so we run the encoding algorithm 4 times: - - frame 0: voicing bit - frame 1: voicing bit, - frame 2: voicing bit - frame 3: voicing bit, Wo and E, scalar LSPs - - The bit allocation is: - - Parameter frame 2 frame 4 Total - ------------------------------------------------------- - Harmonic magnitudes (LSPs) 0 36 36 - Pitch (Wo) 0 7 7 - Energy 0 5 5 - Voicing (10ms update) 2 2 4 - TOTAL 2 50 52 - -\*---------------------------------------------------------------------------*/ - -void codec2_encode_1300(struct CODEC2 *c2, unsigned char * bits, short speech[]) -{ - MODEL model; - float lsps[LPC_ORD]; - float ak[LPC_ORD+1]; - float e; - int lsp_indexes[LPC_ORD]; - int Wo_index, e_index; - int i; - unsigned int nbit = 0; - #ifdef TIMER - unsigned int quant_start; - #endif - - assert(c2 != NULL); - - memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); - - /* frame 1: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, speech); - pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); - - /* frame 2: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, &speech[N]); - pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); - - /* frame 3: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, &speech[2*N]); - pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); - - /* frame 4: - voicing, scalar Wo & E, scalar LSPs ------------------*/ - - analyse_one_frame(c2, &model, &speech[3*N]); - pack_natural_or_gray(bits, &nbit, model.voiced, 1, c2->gray); - - Wo_index = encode_Wo(model.Wo); - pack_natural_or_gray(bits, &nbit, Wo_index, WO_BITS, c2->gray); - - #ifdef TIMER - quant_start = machdep_timer_sample(); - #endif - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - e_index = encode_energy(e); - pack_natural_or_gray(bits, &nbit, e_index, E_BITS, c2->gray); - - encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD); - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - pack_natural_or_gray(bits, &nbit, lsp_indexes[i], lsp_bits(i), c2->gray); - } - #ifdef TIMER - machdep_timer_sample_and_log(quant_start, " quant/packing"); - #endif - - assert(nbit == (unsigned)codec2_bits_per_frame(c2)); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_decode_1300 - AUTHOR......: David Rowe - DATE CREATED: 11 May 2012 - - Decodes frames of 52 bits into 320 samples (40ms) of speech. - -\*---------------------------------------------------------------------------*/ - -void codec2_decode_1300(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est) -{ - MODEL model[4]; - int lsp_indexes[LPC_ORD]; - float lsps[4][LPC_ORD]; - int Wo_index, e_index; - float e[4]; - float snr; - float ak[4][LPC_ORD+1]; - int i,j; - unsigned int nbit = 0; - float weight; - TIMER_VAR(recover_start); - - assert(c2 != NULL); - - /* only need to zero these out due to (unused) snr calculation */ - - for(i=0; i<4; i++) - for(j=1; j<=MAX_AMP; j++) - model[i].A[j] = 0.0; - - /* unpack bits from channel ------------------------------------*/ - - /* this will partially fill the model params for the 4 x 10ms - frames */ - - model[0].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); - model[1].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); - model[2].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); - model[3].voiced = unpack_natural_or_gray(bits, &nbit, 1, c2->gray); - - Wo_index = unpack_natural_or_gray(bits, &nbit, WO_BITS, c2->gray); - model[3].Wo = decode_Wo(Wo_index); - model[3].L = PI/model[3].Wo; - - e_index = unpack_natural_or_gray(bits, &nbit, E_BITS, c2->gray); - e[3] = decode_energy(e_index); - - for(i=0; i<LSP_SCALAR_INDEXES; i++) { - lsp_indexes[i] = unpack_natural_or_gray(bits, &nbit, lsp_bits(i), c2->gray); - } - decode_lsps_scalar(&lsps[3][0], lsp_indexes, LPC_ORD); - check_lsp_order(&lsps[3][0], LPC_ORD); - bw_expand_lsps(&lsps[3][0], LPC_ORD, 50.0, 100.0); - - if (ber_est > 0.15) { - model[0].voiced = model[1].voiced = model[2].voiced = model[3].voiced = 0; - e[3] = decode_energy(10); - bw_expand_lsps(&lsps[3][0], LPC_ORD, 200.0, 200.0); - fprintf(stderr, "soft mute\n"); - } - - /* interpolate ------------------------------------------------*/ - - /* Wo, energy, and LSPs are sampled every 40ms so we interpolate - the 3 frames in between */ - - TIMER_SAMPLE(recover_start); - for(i=0, weight=0.25; i<3; i++, weight += 0.25) { - interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight); - interp_Wo2(&model[i], &c2->prev_model_dec, &model[3], weight); - e[i] = interp_energy2(c2->prev_e_dec, e[3],weight); - } - - /* then recover spectral amplitudes */ - - for(i=0; i<4; i++) { - lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, - c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); - apply_lpc_correction(&model[i]); - } - TIMER_SAMPLE_AND_LOG2(recover_start, " recover"); - #ifdef DUMP - dump_lsp_(&lsps[3][0]); - dump_ak_(&ak[3][0], LPC_ORD); - #endif - - /* synthesise ------------------------------------------------*/ - - for(i=0; i<4; i++) - synthesise_one_frame(c2, &speech[N*i], &model[i], &ak[i][0]); - - /* update memories for next frame ----------------------------*/ - - c2->prev_model_dec = model[3]; - c2->prev_e_dec = e[3]; - for(i=0; i<LPC_ORD; i++) - c2->prev_lsps_dec[i] = lsps[3][i]; - -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_encode_1200 - AUTHOR......: David Rowe - DATE CREATED: Nov 14 2011 - - Encodes 320 speech samples (40ms of speech) into 48 bits. - - The codec2 algorithm actually operates internally on 10ms (80 - sample) frames, so we run the encoding algorithm four times: - - frame 0: voicing bit - frame 1: voicing bit, joint VQ of Wo and E - frame 2: voicing bit - frame 3: voicing bit, joint VQ of Wo and E, VQ LSPs - - The bit allocation is: - - Parameter frame 2 frame 4 Total - ------------------------------------------------------- - Harmonic magnitudes (LSPs) 0 27 27 - Energy+Wo 8 8 16 - Voicing (10ms update) 2 2 4 - Spare 0 1 1 - TOTAL 10 38 48 - -\*---------------------------------------------------------------------------*/ - -void codec2_encode_1200(struct CODEC2 *c2, unsigned char * bits, short speech[]) -{ - MODEL model; - float lsps[LPC_ORD]; - float lsps_[LPC_ORD]; - float ak[LPC_ORD+1]; - float e; - int lsp_indexes[LPC_ORD]; - int WoE_index; - int i; - int spare = 0; - unsigned int nbit = 0; - - assert(c2 != NULL); - - memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8)); - - /* frame 1: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, speech); - pack(bits, &nbit, model.voiced, 1); - - /* frame 2: - voicing, joint Wo & E -------------------------------*/ - - analyse_one_frame(c2, &model, &speech[N]); - pack(bits, &nbit, model.voiced, 1); - - /* need to run this just to get LPC energy */ - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - - WoE_index = encode_WoE(&model, e, c2->xq_enc); - pack(bits, &nbit, WoE_index, WO_E_BITS); - - /* frame 3: - voicing ---------------------------------------------*/ - - analyse_one_frame(c2, &model, &speech[2*N]); - pack(bits, &nbit, model.voiced, 1); - - /* frame 4: - voicing, joint Wo & E, scalar LSPs ------------------*/ - - analyse_one_frame(c2, &model, &speech[3*N]); - pack(bits, &nbit, model.voiced, 1); - - e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD); - WoE_index = encode_WoE(&model, e, c2->xq_enc); - pack(bits, &nbit, WoE_index, WO_E_BITS); - - encode_lsps_vq(lsp_indexes, lsps, lsps_, LPC_ORD); - for(i=0; i<LSP_PRED_VQ_INDEXES; i++) { - pack(bits, &nbit, lsp_indexes[i], lsp_pred_vq_bits(i)); - } - pack(bits, &nbit, spare, 1); - - assert(nbit == (unsigned)codec2_bits_per_frame(c2)); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: codec2_decode_1200 - AUTHOR......: David Rowe - DATE CREATED: 14 Feb 2012 - - Decodes frames of 48 bits into 320 samples (40ms) of speech. - -\*---------------------------------------------------------------------------*/ - -void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * bits) -{ - MODEL model[4]; - int lsp_indexes[LPC_ORD]; - float lsps[4][LPC_ORD]; - int WoE_index; - float e[4]; - float snr; - float ak[4][LPC_ORD+1]; - int i,j; - unsigned int nbit = 0; - float weight; - - assert(c2 != NULL); - - /* only need to zero these out due to (unused) snr calculation */ - - for(i=0; i<4; i++) - for(j=1; j<=MAX_AMP; j++) - model[i].A[j] = 0.0; - - /* unpack bits from channel ------------------------------------*/ - - /* this will partially fill the model params for the 4 x 10ms - frames */ - - model[0].voiced = unpack(bits, &nbit, 1); - - model[1].voiced = unpack(bits, &nbit, 1); - WoE_index = unpack(bits, &nbit, WO_E_BITS); - decode_WoE(&model[1], &e[1], c2->xq_dec, WoE_index); - - model[2].voiced = unpack(bits, &nbit, 1); - - model[3].voiced = unpack(bits, &nbit, 1); - WoE_index = unpack(bits, &nbit, WO_E_BITS); - decode_WoE(&model[3], &e[3], c2->xq_dec, WoE_index); - - for(i=0; i<LSP_PRED_VQ_INDEXES; i++) { - lsp_indexes[i] = unpack(bits, &nbit, lsp_pred_vq_bits(i)); - } - decode_lsps_vq(lsp_indexes, &lsps[3][0], LPC_ORD); - check_lsp_order(&lsps[3][0], LPC_ORD); - bw_expand_lsps(&lsps[3][0], LPC_ORD, 50.0, 100.0); - - /* interpolate ------------------------------------------------*/ - - /* Wo and energy are sampled every 20ms, so we interpolate just 1 - 10ms frame between 20ms samples */ - - interp_Wo(&model[0], &c2->prev_model_dec, &model[1]); - e[0] = interp_energy(c2->prev_e_dec, e[1]); - interp_Wo(&model[2], &model[1], &model[3]); - e[2] = interp_energy(e[1], e[3]); - - /* LSPs are sampled every 40ms so we interpolate the 3 frames in - between, then recover spectral amplitudes */ - - for(i=0, weight=0.25; i<3; i++, weight += 0.25) { - interpolate_lsp_ver2(&lsps[i][0], c2->prev_lsps_dec, &lsps[3][0], weight); - } - for(i=0; i<4; i++) { - lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD); - aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0, - c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma); - apply_lpc_correction(&model[i]); - } - - /* synthesise ------------------------------------------------*/ - - for(i=0; i<4; i++) - synthesise_one_frame(c2, &speech[N*i], &model[i], &ak[i][0]); - - /* update memories for next frame ----------------------------*/ - - c2->prev_model_dec = model[3]; - c2->prev_e_dec = e[3]; - for(i=0; i<LPC_ORD; i++) - c2->prev_lsps_dec[i] = lsps[3][i]; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: synthesise_one_frame() - AUTHOR......: David Rowe - DATE CREATED: 23/8/2010 - - Synthesise 80 speech samples (10ms) from model parameters. - -\*---------------------------------------------------------------------------*/ - -void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model, float ak[]) -{ - int i; - TIMER_VAR(phase_start, pf_start, synth_start); - - #ifdef DUMP - dump_quantised_model(model); - #endif - - TIMER_SAMPLE(phase_start); - - phase_synth_zero_order(c2->fft_fwd_cfg, model, ak, &c2->ex_phase, LPC_ORD); - - TIMER_SAMPLE_AND_LOG(pf_start,phase_start, " phase_synth"); - - postfilter(model, &c2->bg_est); - - TIMER_SAMPLE_AND_LOG(synth_start, pf_start, " postfilter"); - - synthesise(c2->fft_inv_cfg, c2->Sn_, model, c2->Pn, 1); - - TIMER_SAMPLE_AND_LOG2(synth_start, " synth"); - - ear_protection(c2->Sn_, N); - - for(i=0; i<N; i++) { - if (c2->Sn_[i] > 32767.0) - speech[i] = 32767; - else if (c2->Sn_[i] < -32767.0) - speech[i] = -32767; - else - speech[i] = c2->Sn_[i]; - } - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: analyse_one_frame() - AUTHOR......: David Rowe - DATE CREATED: 23/8/2010 - - Extract sinusoidal model parameters from 80 speech samples (10ms of - speech). - -\*---------------------------------------------------------------------------*/ - -void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]) -{ - COMP Sw[FFT_ENC]; - COMP Sw_[FFT_ENC]; - COMP Ew[FFT_ENC]; - float pitch; - int i; - TIMER_VAR(dft_start, nlp_start, model_start, two_stage, estamps); - - /* Read input speech */ - - for(i=0; i<M-N; i++) - c2->Sn[i] = c2->Sn[i+N]; - for(i=0; i<N; i++) - c2->Sn[i+M-N] = speech[i]; - - TIMER_SAMPLE(dft_start); - dft_speech(c2->fft_fwd_cfg, Sw, c2->Sn, c2->w); - TIMER_SAMPLE_AND_LOG(nlp_start, dft_start, " dft_speech"); - - /* Estimate pitch */ - - nlp(c2->nlp,c2->Sn,N,P_MIN,P_MAX,&pitch,Sw, c2->W, &c2->prev_Wo_enc); - TIMER_SAMPLE_AND_LOG(model_start, nlp_start, " nlp"); - - model->Wo = TWO_PI/pitch; - model->L = PI/model->Wo; - - /* estimate model parameters */ - - two_stage_pitch_refinement(model, Sw); - TIMER_SAMPLE_AND_LOG(two_stage, model_start, " two_stage"); - estimate_amplitudes(model, Sw, c2->W, 0); - TIMER_SAMPLE_AND_LOG(estamps, two_stage, " est_amps"); - est_voicing_mbe(model, Sw, c2->W, Sw_, Ew, c2->prev_Wo_enc); - c2->prev_Wo_enc = model->Wo; - TIMER_SAMPLE_AND_LOG2(estamps, " est_voicing"); - #ifdef DUMP - dump_model(model); - #endif -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: ear_protection() - AUTHOR......: David Rowe - DATE CREATED: Nov 7 2012 - - Limits output level to protect ears when there are bit errors or the input - is overdriven. This doesn't correct or mask bit erros, just reduces the - worst of their damage. - -\*---------------------------------------------------------------------------*/ - -static void ear_protection(float in_out[], int n) { - float max_sample, over, gain; - int i; - - /* find maximum sample in frame */ - - max_sample = 0.0; - for(i=0; i<n; i++) - if (in_out[i] > max_sample) - max_sample = in_out[i]; - - /* determine how far above set point */ - - over = max_sample/30000.0; - - /* If we are x dB over set point we reduce level by 2x dB, this - attenuates major excursions in amplitude (likely to be caused - by bit errors) more than smaller ones */ - - if (over > 1.0) { - gain = 1.0/(over*over); - //fprintf(stderr, "gain: %f\n", gain); - for(i=0; i<n; i++) - in_out[i] *= gain; - } -} - -void CODEC2_WIN32SUPPORT codec2_set_lpc_post_filter(struct CODEC2 *c2, int enable, int bass_boost, float beta, float gamma) -{ - assert((beta >= 0.0) && (beta <= 1.0)); - assert((gamma >= 0.0) && (gamma <= 1.0)); - c2->lpc_pf = enable; - c2->bass_boost = bass_boost; - c2->beta = beta; - c2->gamma = gamma; -} - -/* - Allows optional stealing of one of the voicing bits for use as a - spare bit, only 1300 & 1400 & 1600 bit/s supported for now. - Experimental method of sending voice/data frames for FreeDV. -*/ - -int CODEC2_WIN32SUPPORT codec2_get_spare_bit_index(struct CODEC2 *c2) -{ - assert(c2 != NULL); - - switch(c2->mode) { - case CODEC2_MODE_1300: - return 2; // bit 2 (3th bit) is v2 (third voicing bit) - break; - case CODEC2_MODE_1400: - return 10; // bit 10 (11th bit) is v2 (third voicing bit) - break; - case CODEC2_MODE_1600: - return 15; // bit 15 (16th bit) is v2 (third voicing bit) - break; - } - - return -1; -} - -/* - Reconstructs the spare voicing bit. Note works on unpacked bits - for convenience. -*/ - -int CODEC2_WIN32SUPPORT codec2_rebuild_spare_bit(struct CODEC2 *c2, int unpacked_bits[]) -{ - int v1,v3; - - assert(c2 != NULL); - - v1 = unpacked_bits[1]; - - switch(c2->mode) { - case CODEC2_MODE_1300: - - v3 = unpacked_bits[1+1+1]; - - /* if either adjacent frame is voiced, make this one voiced */ - - unpacked_bits[2] = (v1 || v3); - - return 0; - - break; - - case CODEC2_MODE_1400: - - v3 = unpacked_bits[1+1+8+1]; - - /* if either adjacent frame is voiced, make this one voiced */ - - unpacked_bits[10] = (v1 || v3); - - return 0; - - break; - - case CODEC2_MODE_1600: - v3 = unpacked_bits[1+1+8+5+1]; - - /* if either adjacent frame is voiced, make this one voiced */ - - unpacked_bits[15] = (v1 || v3); - - return 0; - - break; - } - - return -1; -} - -void CODEC2_WIN32SUPPORT codec2_set_natural_or_gray(struct CODEC2 *c2, int gray) -{ - assert(c2 != NULL); - c2->gray = gray; -} - diff --git a/gr-vocoder/lib/codec2/codec2.h b/gr-vocoder/lib/codec2/codec2.h deleted file mode 100644 index 1e870db4f5..0000000000 --- a/gr-vocoder/lib/codec2/codec2.h +++ /dev/null @@ -1,76 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: codec2.h - AUTHOR......: David Rowe - DATE CREATED: 21 August 2010 - - Codec 2 fully quantised encoder and decoder functions. If you want use - Codec 2, these are the functions you need to call. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2010 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifdef __cplusplus - extern "C" { -#endif - -#ifndef __CODEC2__ -#define __CODEC2__ - -/* set up the calling convention for DLL function import/export for - WIN32 cross compiling */ - -#ifdef __CODEC2_WIN32__ -#ifdef __CODEC2_BUILDING_DLL__ -#define CODEC2_WIN32SUPPORT __declspec(dllexport) __stdcall -#else -#define CODEC2_WIN32SUPPORT __declspec(dllimport) __stdcall -#endif -#else -#define CODEC2_WIN32SUPPORT -#endif - -#define CODEC2_MODE_3200 0 -#define CODEC2_MODE_2400 1 -#define CODEC2_MODE_1600 2 -#define CODEC2_MODE_1400 3 -#define CODEC2_MODE_1300 4 -#define CODEC2_MODE_1200 5 - -struct CODEC2; - -struct CODEC2 * CODEC2_WIN32SUPPORT codec2_create(int mode); -void CODEC2_WIN32SUPPORT codec2_destroy(struct CODEC2 *codec2_state); -void CODEC2_WIN32SUPPORT codec2_encode(struct CODEC2 *codec2_state, unsigned char * bits, short speech_in[]); -void CODEC2_WIN32SUPPORT codec2_decode(struct CODEC2 *codec2_state, short speech_out[], const unsigned char *bits); -void CODEC2_WIN32SUPPORT codec2_decode_ber(struct CODEC2 *codec2_state, short speech_out[], const unsigned char *bits, float ber_est); -int CODEC2_WIN32SUPPORT codec2_samples_per_frame(struct CODEC2 *codec2_state); -int CODEC2_WIN32SUPPORT codec2_bits_per_frame(struct CODEC2 *codec2_state); - -void CODEC2_WIN32SUPPORT codec2_set_lpc_post_filter(struct CODEC2 *codec2_state, int enable, int bass_boost, float beta, float gamma); -int CODEC2_WIN32SUPPORT codec2_get_spare_bit_index(struct CODEC2 *codec2_state); -int CODEC2_WIN32SUPPORT codec2_rebuild_spare_bit(struct CODEC2 *codec2_state, int unpacked_bits[]); -void CODEC2_WIN32SUPPORT codec2_set_natural_or_gray(struct CODEC2 *codec2_state, int gray); - -#endif - -#ifdef __cplusplus -} -#endif - diff --git a/gr-vocoder/lib/codec2/codec2_fdmdv.h b/gr-vocoder/lib/codec2/codec2_fdmdv.h deleted file mode 100644 index b7da96f629..0000000000 --- a/gr-vocoder/lib/codec2/codec2_fdmdv.h +++ /dev/null @@ -1,124 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: codec2_fdmdv.h - AUTHOR......: David Rowe - DATE CREATED: April 14 2012 - - A 1400 bit/s (nominal) Frequency Division Multiplexed Digital Voice - (FDMDV) modem. Used for digital audio over HF SSB. See - README_fdmdv.txt for more information, and fdmdv_mod.c and - fdmdv_demod.c for example usage. - - The name codec2_fdmdv.h is used to make it unique when "make - installed". - - References: - - [1] http://n1su.com/fdmdv/FDMDV_Docs_Rel_1_4b.pdf - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __FDMDV__ -#define __FDMDV__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* set up the calling convention for DLL function import/export for - WIN32 cross compiling */ - -#ifdef __CODEC2_WIN32__ -#ifdef __CODEC2_BUILDING_DLL__ -#define CODEC2_WIN32SUPPORT __declspec(dllexport) __stdcall -#else -#define CODEC2_WIN32SUPPORT __declspec(dllimport) __stdcall -#endif -#else -#define CODEC2_WIN32SUPPORT -#endif - -#include "comp.h" - -#define FDMDV_NC 14 /* default number of data carriers */ -#define FDMDV_NC_MAX 20 /* maximum number of data carriers */ -#define FDMDV_BITS_PER_FRAME 28 /* 20ms frames, for nominal 1400 bit/s */ -#define FDMDV_NOM_SAMPLES_PER_FRAME 160 /* modulator output samples/frame and nominal demod samples/frame */ - /* at 8000 Hz sample rate */ -#define FDMDV_MAX_SAMPLES_PER_FRAME 200 /* max demod samples/frame, use this to allocate storage */ -#define FDMDV_SCALE 1000 /* suggested scaling for 16 bit shorts */ -#define FDMDV_FCENTRE 1500 /* Centre frequency, Nc/2 carriers below this, Nc/2 carriers above (Hz) */ - -/* 8 to 48 kHz sample rate conversion */ - -#define FDMDV_OS 6 /* oversampling rate */ -#define FDMDV_OS_TAPS 48 /* number of OS filter taps */ - -/* FFT points */ - -#define FDMDV_NSPEC 512 -#define FDMDV_MAX_F_HZ 4000 - -/* FDMDV states and stats structures */ - -struct FDMDV; - -struct FDMDV_STATS { - int Nc; - float snr_est; /* estimated SNR of rx signal in dB (3 kHz noise BW) */ - COMP rx_symbols[FDMDV_NC_MAX+1]; /* latest received symbols, for scatter plot */ - int sync; /* demod sync state */ - float foff; /* estimated freq offset in Hz */ - float rx_timing; /* estimated optimum timing offset in samples */ - float clock_offset; /* Estimated tx/rx sample clock offset in ppm */ -}; - -struct FDMDV * CODEC2_WIN32SUPPORT fdmdv_create(int Nc); -void CODEC2_WIN32SUPPORT fdmdv_destroy(struct FDMDV *fdmdv_state); -void CODEC2_WIN32SUPPORT fdmdv_use_old_qpsk_mapping(struct FDMDV *fdmdv_state); -int CODEC2_WIN32SUPPORT fdmdv_bits_per_frame(struct FDMDV *fdmdv_state); -float CODEC2_WIN32SUPPORT fdmdv_get_fsep(struct FDMDV *fdmdv_state); -void CODEC2_WIN32SUPPORT fdmdv_set_fsep(struct FDMDV *fdmdv_state, float fsep); - -void CODEC2_WIN32SUPPORT fdmdv_mod(struct FDMDV *fdmdv_state, COMP tx_fdm[], int tx_bits[], int *sync_bit); -void CODEC2_WIN32SUPPORT fdmdv_demod(struct FDMDV *fdmdv_state, int rx_bits[], int *reliable_sync_bit, COMP rx_fdm[], int *nin); - -void CODEC2_WIN32SUPPORT fdmdv_get_test_bits(struct FDMDV *fdmdv_state, int tx_bits[]); -int CODEC2_WIN32SUPPORT fdmdv_error_pattern_size(struct FDMDV *fdmdv_state); -void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], int *bit_errors, int *ntest_bits, int rx_bits[]); - -void CODEC2_WIN32SUPPORT fdmdv_get_demod_stats(struct FDMDV *fdmdv_state, struct FDMDV_STATS *fdmdv_stats); -void CODEC2_WIN32SUPPORT fdmdv_get_rx_spectrum(struct FDMDV *fdmdv_state, float mag_dB[], COMP rx_fdm[], int nin); - -void CODEC2_WIN32SUPPORT fdmdv_8_to_48(float out48k[], float in8k[], int n); -void CODEC2_WIN32SUPPORT fdmdv_48_to_8(float out8k[], float in48k[], int n); - -void CODEC2_WIN32SUPPORT fdmdv_freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, COMP *foff_rect, COMP *foff_phase_rect, int nin); - -/* debug/development function(s) */ - -void CODEC2_WIN32SUPPORT fdmdv_dump_osc_mags(struct FDMDV *f); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/gr-vocoder/lib/codec2/codec2_fifo.h b/gr-vocoder/lib/codec2/codec2_fifo.h deleted file mode 100644 index 9140fd7f78..0000000000 --- a/gr-vocoder/lib/codec2/codec2_fifo.h +++ /dev/null @@ -1,51 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: codec2_fifo.h - AUTHOR......: David Rowe - DATE CREATED: Oct 15 2012 - - A FIFO design useful in gluing the FDMDV modem and codec together in - integrated applications. - - The name codec2_fifo.h is used to make it unique when "make - installed". - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __FIFO__ -#define __FIFO__ - -#ifdef __cplusplus -extern "C" { -#endif - -struct FIFO; - -struct FIFO *fifo_create(int nshort); -void fifo_destroy(struct FIFO *fifo); -int fifo_write(struct FIFO *fifo, short data[], int n); -int fifo_read(struct FIFO *fifo, short data[], int n); -int fifo_used(struct FIFO *fifo); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/gr-vocoder/lib/codec2/codec2_internal.h b/gr-vocoder/lib/codec2/codec2_internal.h deleted file mode 100644 index c4bb1fc42a..0000000000 --- a/gr-vocoder/lib/codec2/codec2_internal.h +++ /dev/null @@ -1,63 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: codec2_internal.h - AUTHOR......: David Rowe - DATE CREATED: April 16 2012 - - Header file for Codec2 internal states, exposed via this header - file to assist in testing. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __CODEC2_INTERNAL__ -#define __CODEC2_INTERNAL__ - -struct CODEC2 { - int mode; - kiss_fft_cfg fft_fwd_cfg; /* forward FFT config */ - float w[M]; /* time domain hamming window */ - COMP W[FFT_ENC]; /* DFT of w[] */ - float Pn[2*N]; /* trapezoidal synthesis window */ - float Sn[M]; /* input speech */ - float hpf_states[2]; /* high pass filter states */ - void *nlp; /* pitch predictor states */ - int gray; /* non-zero for gray encoding */ - - kiss_fft_cfg fft_inv_cfg; /* inverse FFT config */ - float Sn_[2*N]; /* synthesised output speech */ - float ex_phase; /* excitation model phase track */ - float bg_est; /* background noise estimate for post filter */ - float prev_Wo_enc; /* previous frame's pitch estimate */ - MODEL prev_model_dec; /* previous frame's model parameters */ - float prev_lsps_dec[LPC_ORD]; /* previous frame's LSPs */ - float prev_e_dec; /* previous frame's LPC energy */ - - int lpc_pf; /* LPC post filter on */ - int bass_boost; /* LPC post filter bass boost */ - float beta; /* LPC post filter parameters */ - float gamma; - - float xq_enc[2]; /* joint pitch and energy VQ states */ - float xq_dec[2]; - - int smoothing; /* enable smoothing for channels with errors */ -}; - -#endif diff --git a/gr-vocoder/lib/codec2/comp.h b/gr-vocoder/lib/codec2/comp.h deleted file mode 100644 index ffc20c163d..0000000000 --- a/gr-vocoder/lib/codec2/comp.h +++ /dev/null @@ -1,38 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: comp.h - AUTHOR......: David Rowe - DATE CREATED: 24/08/09 - - Complex number definition. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __COMP__ -#define __COMP__ - -/* Complex number */ - -typedef struct { - float real; - float imag; -} COMP; - -#endif diff --git a/gr-vocoder/lib/codec2/defines.h b/gr-vocoder/lib/codec2/defines.h deleted file mode 100644 index 4b81357ea6..0000000000 --- a/gr-vocoder/lib/codec2/defines.h +++ /dev/null @@ -1,94 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: defines.h - AUTHOR......: David Rowe - DATE CREATED: 23/4/93 - - Defines and structures used throughout the codec. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __DEFINES__ -#define __DEFINES__ - -/*---------------------------------------------------------------------------*\ - - DEFINES - -\*---------------------------------------------------------------------------*/ - -/* General defines */ - -#define N 80 /* number of samples per frame */ -#define MAX_AMP 80 /* maximum number of harmonics */ -#define PI 3.141592654 /* mathematical constant */ -#define TWO_PI 6.283185307 /* mathematical constant */ -#define FS 8000 /* sample rate in Hz */ -#define MAX_STR 256 /* maximum string size */ - -#define NW 279 /* analysis window size */ -#define FFT_ENC 512 /* size of FFT used for encoder */ -#define FFT_DEC 512 /* size of FFT used in decoder */ -#define TW 40 /* Trapezoidal synthesis window overlap */ -#define V_THRESH 6.0 /* voicing threshold in dB */ -#define LPC_MAX 20 /* maximum LPC order */ -#define LPC_ORD 10 /* phase modelling LPC order */ - -/* Pitch estimation defines */ - -#define M 320 /* pitch analysis frame size */ -#define P_MIN 20 /* minimum pitch */ -#define P_MAX 160 /* maximum pitch */ - -/*---------------------------------------------------------------------------*\ - - TYPEDEFS - -\*---------------------------------------------------------------------------*/ - -/* Structure to hold model parameters for one frame */ - -typedef struct { - float Wo; /* fundamental frequency estimate in radians */ - int L; /* number of harmonics */ - float A[MAX_AMP+1]; /* amplitiude of each harmonic */ - float phi[MAX_AMP+1]; /* phase of each harmonic */ - int voiced; /* non-zero if this frame is voiced */ -} MODEL; - -/* describes each codebook */ - -struct lsp_codebook { - int k; /* dimension of vector */ - int log2m; /* number of bits in m */ - int m; /* elements in codebook */ - const float * cb; /* The elements */ -}; - -extern const struct lsp_codebook lsp_cb[]; -extern const struct lsp_codebook lsp_cbd[]; -extern const struct lsp_codebook lsp_cbvq[]; -extern const struct lsp_codebook lsp_cbjnd[]; -extern const struct lsp_codebook lsp_cbdt[]; -extern const struct lsp_codebook lsp_cbjvm[]; -extern const struct lsp_codebook lsp_cbvqanssi[]; -extern const struct lsp_codebook ge_cb[]; - -#endif diff --git a/gr-vocoder/lib/codec2/dump.c b/gr-vocoder/lib/codec2/dump.c deleted file mode 100644 index af966e5005..0000000000 --- a/gr-vocoder/lib/codec2/dump.c +++ /dev/null @@ -1,629 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: dump.c - AUTHOR......: David Rowe - DATE CREATED: 25/8/09 - - Routines to dump data to text files for Octave analysis. - -\*---------------------------------------------------------------------------*/ - -/* - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "defines.h" -#include "comp.h" -#include "dump.h" -#include <assert.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> - -#ifdef __EMBEDDED__ -#include "gdb_stdio.h" -#define fprintf gdb_stdio_fprintf -#define fopen gdb_stdio_fopen -#define fclose gdb_stdio_fclose -#endif - -#ifdef DUMP -static int dumpon = 0; - -static FILE *fsn = NULL; -static FILE *fsw = NULL; -static FILE *few = NULL; -static FILE *fsw_ = NULL; -static FILE *fmodel = NULL; -static FILE *fqmodel = NULL; -static FILE *fpwb = NULL; -static FILE *fpw = NULL; -static FILE *frw = NULL; -static FILE *flsp = NULL; -static FILE *fweights = NULL; -static FILE *flsp_ = NULL; -static FILE *fmel = NULL; -static FILE *fphase = NULL; -static FILE *fphase_ = NULL; -static FILE *ffw = NULL; -static FILE *fe = NULL; -static FILE *fsq = NULL; -static FILE *fdec = NULL; -static FILE *fsnr = NULL; -static FILE *flpcsnr = NULL; -static FILE *fak = NULL; -static FILE *fak_ = NULL; -static FILE *fbg = NULL; -static FILE *fE = NULL; -static FILE *frk = NULL; -static FILE *fhephase = NULL; - -static char prefix[MAX_STR]; - -void dump_on(char p[]) { - dumpon = 1; - strcpy(prefix, p); -} - -void dump_off(){ - if (fsn != NULL) - fclose(fsn); - if (fsw != NULL) - fclose(fsw); - if (fsw_ != NULL) - fclose(fsw_); - if (few != NULL) - fclose(few); - if (fmodel != NULL) - fclose(fmodel); - if (fqmodel != NULL) - fclose(fqmodel); - if (fpwb != NULL) - fclose(fpwb); - if (fpw != NULL) - fclose(fpw); - if (frw != NULL) - fclose(frw); - if (flsp != NULL) - fclose(flsp); - if (fweights != NULL) - fclose(fweights); - if (flsp_ != NULL) - fclose(flsp_); - if (fmel != NULL) - fclose(fmel); - if (fphase != NULL) - fclose(fphase); - if (fphase_ != NULL) - fclose(fphase_); - if (ffw != NULL) - fclose(ffw); - if (fe != NULL) - fclose(fe); - if (fsq != NULL) - fclose(fsq); - if (fdec != NULL) - fclose(fdec); - if (fsnr != NULL) - fclose(fsnr); - if (flpcsnr != NULL) - fclose(flpcsnr); - if (fak != NULL) - fclose(fak); - if (fak_ != NULL) - fclose(fak_); - if (fbg != NULL) - fclose(fbg); - if (fE != NULL) - fclose(fE); - if (frk != NULL) - fclose(frk); - if (fhephase != NULL) - fclose(fhephase); -} - -void dump_Sn(float Sn[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fsn == NULL) { - sprintf(s,"%s_sn.txt", prefix); - fsn = fopen(s, "wt"); - assert(fsn != NULL); - } - - /* split across two lines to avoid max line length problems */ - /* reconstruct in Octave */ - - for(i=0; i<M/2; i++) - fprintf(fsn,"%f\t",Sn[i]); - fprintf(fsn,"\n"); - for(i=M/2; i<M; i++) - fprintf(fsn,"%f\t",Sn[i]); - fprintf(fsn,"\n"); -} - -void dump_Sw(COMP Sw[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fsw == NULL) { - sprintf(s,"%s_sw.txt", prefix); - fsw = fopen(s, "wt"); - assert(fsw != NULL); - } - - for(i=0; i<FFT_ENC/2; i++) - fprintf(fsw,"%f\t", - 10.0*log10(Sw[i].real*Sw[i].real + Sw[i].imag*Sw[i].imag)); - fprintf(fsw,"\n"); -} - -void dump_Sw_(COMP Sw_[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fsw_ == NULL) { - sprintf(s,"%s_sw_.txt", prefix); - fsw_ = fopen(s, "wt"); - assert(fsw_ != NULL); - } - - for(i=0; i<FFT_ENC/2; i++) - fprintf(fsw_,"%f\t", - 10.0*log10(Sw_[i].real*Sw_[i].real + Sw_[i].imag*Sw_[i].imag)); - fprintf(fsw_,"\n"); -} - -void dump_Ew(COMP Ew[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (few == NULL) { - sprintf(s,"%s_ew.txt", prefix); - few = fopen(s, "wt"); - assert(few != NULL); - } - - for(i=0; i<FFT_ENC/2; i++) - fprintf(few,"%f\t", - 10.0*log10(Ew[i].real*Ew[i].real + Ew[i].imag*Ew[i].imag)); - fprintf(few,"\n"); -} - -void dump_model(MODEL *model) { - int l; - char s[MAX_STR]; - char line[2048]; - - if (!dumpon) return; - - if (fmodel == NULL) { - sprintf(s,"%s_model.txt", prefix); - fmodel = fopen(s, "wt"); - assert(fmodel != NULL); - } - - sprintf(line,"%12f %12d ", model->Wo, model->L); - for(l=1; l<=model->L; l++) { - sprintf(s,"%12f ",model->A[l]); - strcat(line, s); - } - for(l=model->L+1; l<=MAX_AMP; l++) { - sprintf(s,"%12f ", 0.0); - strcat(line,s); - } - - sprintf(s,"%d\n",model->voiced); - strcat(line,s); - fprintf(fmodel,"%s",line); -} - -void dump_quantised_model(MODEL *model) { - int l; - char s[MAX_STR]; - char line[2048]; - - if (!dumpon) return; - - if (fqmodel == NULL) { - sprintf(s,"%s_qmodel.txt", prefix); - fqmodel = fopen(s, "wt"); - assert(fqmodel != NULL); - } - - sprintf(line,"%12f %12d ", model->Wo, model->L); - for(l=1; l<=model->L; l++) { - sprintf(s,"%12f ",model->A[l]); - strcat(line, s); - } - for(l=model->L+1; l<=MAX_AMP; l++) { - sprintf(s,"%12f ", 0.0); - strcat(line, s); - } - - sprintf(s,"%d\n",model->voiced); - strcat(line, s); - fprintf(fqmodel, "%s", line); -} - -void dump_phase(float phase[], int L) { - int l; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fphase == NULL) { - sprintf(s,"%s_phase.txt", prefix); - fphase = fopen(s, "wt"); - assert(fphase != NULL); - } - - for(l=1; l<=L; l++) - fprintf(fphase,"%f\t",phase[l]); - for(l=L+1; l<=MAX_AMP; l++) - fprintf(fphase,"%f\t",0.0); - fprintf(fphase,"\n"); -} - -void dump_phase_(float phase_[], int L) { - int l; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fphase_ == NULL) { - sprintf(s,"%s_phase_.txt", prefix); - fphase_ = fopen(s, "wt"); - assert(fphase_ != NULL); - } - - for(l=1; l<=L; l++) - fprintf(fphase_,"%f\t",phase_[l]); - for(l=L+1; l<MAX_AMP; l++) - fprintf(fphase_,"%f\t",0.0); - fprintf(fphase_,"\n"); -} - - -void dump_hephase(int ind[], int dim) { - int m; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fhephase == NULL) { - sprintf(s,"%s_hephase.txt", prefix); - fhephase = fopen(s, "wt"); - assert(fhephase != NULL); - } - - for(m=0; m<dim; m++) - fprintf(fhephase,"%d\t",ind[m]); - fprintf(fhephase,"\n"); -} - - -void dump_snr(float snr) { - char s[MAX_STR]; - - if (!dumpon) return; - - if (fsnr == NULL) { - sprintf(s,"%s_snr.txt", prefix); - fsnr = fopen(s, "wt"); - assert(fsnr != NULL); - } - - fprintf(fsnr,"%f\n",snr); -} - -void dump_lpc_snr(float snr) { - char s[MAX_STR]; - - if (!dumpon) return; - - if (flpcsnr == NULL) { - sprintf(s,"%s_lpc_snr.txt", prefix); - flpcsnr = fopen(s, "wt"); - assert(flpcsnr != NULL); - } - - fprintf(flpcsnr,"%f\n",snr); -} - -/* Pw "before" post filter so we can plot before and after */ - -void dump_Pwb(COMP Pwb[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fpwb == NULL) { - sprintf(s,"%s_pwb.txt", prefix); - fpwb = fopen(s, "wt"); - assert(fpwb != NULL); - } - - for(i=0; i<FFT_ENC/2; i++) - fprintf(fpwb,"%f\t",Pwb[i].real); - fprintf(fpwb,"\n"); -} - -void dump_Pw(COMP Pw[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fpw == NULL) { - sprintf(s,"%s_pw.txt", prefix); - fpw = fopen(s, "wt"); - assert(fpw != NULL); - } - - for(i=0; i<FFT_ENC/2; i++) - fprintf(fpw,"%f\t",Pw[i].real); - fprintf(fpw,"\n"); -} - -void dump_Rw(float Rw[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (frw == NULL) { - sprintf(s,"%s_rw.txt", prefix); - frw = fopen(s, "wt"); - assert(frw != NULL); - } - - for(i=0; i<FFT_ENC/2; i++) - fprintf(frw,"%f\t",Rw[i]); - fprintf(frw,"\n"); -} - -void dump_weights(float w[], int order) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fweights == NULL) { - sprintf(s,"%s_weights.txt", prefix); - fweights = fopen(s, "wt"); - assert(fweights != NULL); - } - - for(i=0; i<order; i++) - fprintf(fweights,"%f\t", w[i]); - fprintf(fweights,"\n"); -} - -void dump_lsp(float lsp[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (flsp == NULL) { - sprintf(s,"%s_lsp.txt", prefix); - flsp = fopen(s, "wt"); - assert(flsp != NULL); - } - - for(i=0; i<10; i++) - fprintf(flsp,"%f\t",lsp[i]); - fprintf(flsp,"\n"); -} - -void dump_lsp_(float lsp_[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (flsp_ == NULL) { - sprintf(s,"%s_lsp_.txt", prefix); - flsp_ = fopen(s, "wt"); - assert(flsp_ != NULL); - } - - for(i=0; i<10; i++) - fprintf(flsp_,"%f\t",lsp_[i]); - fprintf(flsp_,"\n"); -} - -void dump_mel(int mel[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fmel == NULL) { - sprintf(s,"%s_mel.txt", prefix); - fmel = fopen(s, "wt"); - assert(fmel != NULL); - } - - for(i=0; i<10; i++) - fprintf(fmel,"%d\t",mel[i]); - fprintf(fmel,"\n"); -} - -void dump_ak(float ak[], int order) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fak == NULL) { - sprintf(s,"%s_ak.txt", prefix); - fak = fopen(s, "wt"); - assert(fak != NULL); - } - - for(i=0; i<=order; i++) - fprintf(fak,"%f\t",ak[i]); - fprintf(fak,"\n"); -} - -void dump_ak_(float ak_[], int order) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fak_ == NULL) { - sprintf(s,"%s_ak_.txt", prefix); - fak_ = fopen(s, "wt"); - assert(fak_ != NULL); - } - - for(i=0; i<=order; i++) - fprintf(fak_,"%f\t",ak_[i]); - fprintf(fak_,"\n"); -} - -void dump_Fw(COMP Fw[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (ffw == NULL) { - sprintf(s,"%s_fw.txt", prefix); - ffw = fopen(s, "wt"); - assert(ffw != NULL); - } - - for(i=0; i<256; i++) - fprintf(ffw,"%f\t",Fw[i].real); - fprintf(ffw,"\n"); -} - -void dump_e(float e_hz[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fe == NULL) { - sprintf(s,"%s_e.txt", prefix); - fe = fopen(s, "wt"); - assert(fe != NULL); - } - - for(i=0; i<500/2; i++) - fprintf(fe,"%f\t",e_hz[i]); - fprintf(fe,"\n"); - for(i=500/2; i<500; i++) - fprintf(fe,"%f\t",e_hz[i]); - fprintf(fe,"\n"); -} - -void dump_sq(float sq[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fsq == NULL) { - sprintf(s,"%s_sq.txt", prefix); - fsq = fopen(s, "wt"); - assert(fsq != NULL); - } - - for(i=0; i<M/2; i++) - fprintf(fsq,"%f\t",sq[i]); - fprintf(fsq,"\n"); - for(i=M/2; i<M; i++) - fprintf(fsq,"%f\t",sq[i]); - fprintf(fsq,"\n"); -} - -void dump_dec(COMP Fw[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (fdec == NULL) { - sprintf(s,"%s_dec.txt", prefix); - fdec = fopen(s, "wt"); - assert(fdec != NULL); - } - - for(i=0; i<320/5; i++) - fprintf(fdec,"%f\t",Fw[i].real); - fprintf(fdec,"\n"); -} - -void dump_bg(float e, float bg_est, float percent_uv) { - char s[MAX_STR]; - - if (!dumpon) return; - - if (fbg == NULL) { - sprintf(s,"%s_bg.txt", prefix); - fbg = fopen(s, "wt"); - assert(fbg != NULL); - } - - fprintf(fbg,"%f\t%f\t%f\n", e, bg_est, percent_uv); -} - -void dump_E(float E) { - char s[MAX_STR]; - - if (!dumpon) return; - - if (fE == NULL) { - sprintf(s,"%s_E.txt", prefix); - fE = fopen(s, "wt"); - assert(fE != NULL); - } - - fprintf(fE,"%f\n", 10.0*log10(E)); -} - -void dump_Rk(float Rk[]) { - int i; - char s[MAX_STR]; - - if (!dumpon) return; - - if (frk == NULL) { - sprintf(s,"%s_rk.txt", prefix); - frk = fopen(s, "wt"); - assert(frk != NULL); - } - - for(i=0; i<P_MAX; i++) - fprintf(frk,"%f\t",Rk[i]); - fprintf(frk,"\n"); -} - -#endif diff --git a/gr-vocoder/lib/codec2/dump.h b/gr-vocoder/lib/codec2/dump.h deleted file mode 100644 index dd95f5adad..0000000000 --- a/gr-vocoder/lib/codec2/dump.h +++ /dev/null @@ -1,78 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: dump.h - AUTHOR......: David Rowe - DATE CREATED: 25/8/09 - - Routines to dump data to text files for Octave analysis. - -\*---------------------------------------------------------------------------*/ - -/* - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __DUMP__ -#define __DUMP__ - -#include "defines.h" -#include "comp.h" -#include "kiss_fft.h" -#include "codec2_internal.h" - -void dump_on(char filename_prefix[]); -void dump_off(); - -void dump_Sn(float Sn[]); -void dump_Sw(COMP Sw[]); -void dump_Sw_(COMP Sw_[]); -void dump_Ew(COMP Ew[]); - -/* amplitude modelling */ - -void dump_model(MODEL *m); -void dump_quantised_model(MODEL *m); -void dump_Pwn(COMP Pw[]); -void dump_Pw(COMP Pw[]); -void dump_Rw(float Rw[]); -void dump_lsp(float lsp[]); -void dump_weights(float w[], int ndim); -void dump_lsp_(float lsp_[]); -void dump_mel(int mel[]); -void dump_ak(float ak[], int order); -void dump_ak_(float ak[], int order); -void dump_E(float E); -void dump_lpc_snr(float snr); - -/* phase modelling */ - -void dump_snr(float snr); -void dump_phase(float phase[], int L); -void dump_phase_(float phase[], int L); -void dump_hephase(int ind[], int dim); - -/* NLP states */ - -void dump_sq(float sq[]); -void dump_dec(COMP Fw[]); -void dump_Fw(COMP Fw[]); -void dump_e(float e_hz[]); -void dump_Rk(float Rk[]); - -/* post filter */ - -void dump_bg(float e, float bg_est, float percent_uv); -void dump_Pwb(COMP Pwb[]); - -#endif diff --git a/gr-vocoder/lib/codec2/fdmdv.c b/gr-vocoder/lib/codec2/fdmdv.c deleted file mode 100644 index 51d6bef544..0000000000 --- a/gr-vocoder/lib/codec2/fdmdv.c +++ /dev/null @@ -1,1573 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: fdmdv.c - AUTHOR......: David Rowe - DATE CREATED: April 14 2012 - - Functions that implement the FDMDV modem. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#if defined(_MSC_VER) && (_MSC_VER < 1800) // round() not available before VS 2013 -#define round(number) number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5) -#endif - -/*---------------------------------------------------------------------------*\ - - INCLUDES - -\*---------------------------------------------------------------------------*/ - -#include <assert.h> -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <math.h> - -#include "fdmdv_internal.h" -#include "codec2_fdmdv.h" -#include "rn.h" -#include "test_bits.h" -#include "pilot_coeff.h" -#include "kiss_fft.h" -#include "hanning.h" -#include "os.h" - -static int sync_uw[] = {1,-1,1,-1,1,-1}; - -/*---------------------------------------------------------------------------* \ - - FUNCTIONS - -\*---------------------------------------------------------------------------*/ - -static COMP cneg(COMP a) -{ - COMP res; - - res.real = -a.real; - res.imag = -a.imag; - - return res; -} - -static COMP cconj(COMP a) -{ - COMP res; - - res.real = a.real; - res.imag = -a.imag; - - return res; -} - -static COMP cmult(COMP a, COMP b) -{ - COMP res; - - res.real = a.real*b.real - a.imag*b.imag; - res.imag = a.real*b.imag + a.imag*b.real; - - return res; -} - -static COMP fcmult(float a, COMP b) -{ - COMP res; - - res.real = a*b.real; - res.imag = a*b.imag; - - return res; -} - -static COMP cadd(COMP a, COMP b) -{ - COMP res; - - res.real = a.real + b.real; - res.imag = a.imag + b.imag; - - return res; -} - -static float cabsolute(COMP a) -{ - return sqrt(pow(a.real, 2.0) + pow(a.imag, 2.0)); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_create - AUTHOR......: David Rowe - DATE CREATED: 16/4/2012 - - Create and initialise an instance of the modem. Returns a pointer - to the modem states or NULL on failure. One set of states is - sufficient for a full duplex modem. - -\*---------------------------------------------------------------------------*/ - -struct FDMDV * CODEC2_WIN32SUPPORT fdmdv_create(int Nc) -{ - struct FDMDV *f; - int c, i, k; - - assert(NC == FDMDV_NC_MAX); /* check public and private #defines match */ - assert(Nc <= NC); - assert(FDMDV_NOM_SAMPLES_PER_FRAME == M); - assert(FDMDV_MAX_SAMPLES_PER_FRAME == (M+M/P)); - - f = (struct FDMDV*)malloc(sizeof(struct FDMDV)); - if (f == NULL) - return NULL; - - f->Nc = Nc; - - f->ntest_bits = Nc*NB*4; - f->current_test_bit = 0; - f->rx_test_bits_mem = (int*)malloc(sizeof(int)*f->ntest_bits); - assert(f->rx_test_bits_mem != NULL); - for(i=0; i<f->ntest_bits; i++) - f->rx_test_bits_mem[i] = 0; - assert((sizeof(test_bits)/sizeof(int)) >= f->ntest_bits); - - f->old_qpsk_mapping = 0; - - f->tx_pilot_bit = 0; - - for(c=0; c<Nc+1; c++) { - f->prev_tx_symbols[c].real = 1.0; - f->prev_tx_symbols[c].imag = 0.0; - f->prev_rx_symbols[c].real = 1.0; - f->prev_rx_symbols[c].imag = 0.0; - - for(k=0; k<NSYM; k++) { - f->tx_filter_memory[c][k].real = 0.0; - f->tx_filter_memory[c][k].imag = 0.0; - } - - for(k=0; k<NFILTER; k++) { - f->rx_filter_memory[c][k].real = 0.0; - f->rx_filter_memory[c][k].imag = 0.0; - } - - /* Spread initial FDM carrier phase out as far as possible. - This helped PAPR for a few dB. We don't need to adjust rx - phase as DQPSK takes care of that. */ - - f->phase_tx[c].real = cos(2.0*PI*c/(Nc+1)); - f->phase_tx[c].imag = sin(2.0*PI*c/(Nc+1)); - - f->phase_rx[c].real = 1.0; - f->phase_rx[c].imag = 0.0; - - for(k=0; k<NT*P; k++) { - f->rx_filter_mem_timing[c][k].real = 0.0; - f->rx_filter_mem_timing[c][k].imag = 0.0; - } - for(k=0; k<NFILTERTIMING; k++) { - f->rx_baseband_mem_timing[c][k].real = 0.0; - f->rx_baseband_mem_timing[c][k].imag = 0.0; - } - } - - fdmdv_set_fsep(f, FSEP); - f->freq[Nc].real = cos(2.0*PI*FDMDV_FCENTRE/FS); - f->freq[Nc].imag = sin(2.0*PI*FDMDV_FCENTRE/FS); - - /* Generate DBPSK pilot Look Up Table (LUT) */ - - generate_pilot_lut(f->pilot_lut, &f->freq[Nc]); - - /* freq Offset estimation states */ - - f->fft_pilot_cfg = kiss_fft_alloc (MPILOTFFT, 0, NULL, NULL); - assert(f->fft_pilot_cfg != NULL); - - for(i=0; i<NPILOTBASEBAND; i++) { - f->pilot_baseband1[i].real = f->pilot_baseband2[i].real = 0.0; - f->pilot_baseband1[i].imag = f->pilot_baseband2[i].imag = 0.0; - } - f->pilot_lut_index = 0; - f->prev_pilot_lut_index = 3*M; - - for(i=0; i<NPILOTLPF; i++) { - f->pilot_lpf1[i].real = f->pilot_lpf2[i].real = 0.0; - f->pilot_lpf1[i].imag = f->pilot_lpf2[i].imag = 0.0; - } - - f->foff = 0.0; - f->foff_rect.real = 1.0; - f->foff_rect.imag = 0.0; - f->foff_phase_rect.real = 1.0; - f->foff_phase_rect.imag = 0.0; - - f->fest_state = 0; - f->sync = 0; - f->timer = 0; - for(i=0; i<NSYNC_MEM; i++) - f->sync_mem[i] = 0; - - for(c=0; c<Nc+1; c++) { - f->sig_est[c] = 0.0; - f->noise_est[c] = 0.0; - } - - for(i=0; i<2*FDMDV_NSPEC; i++) - f->fft_buf[i] = 0.0; - f->fft_cfg = kiss_fft_alloc (2*FDMDV_NSPEC, 0, NULL, NULL); - assert(f->fft_cfg != NULL); - - - return f; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_destroy - AUTHOR......: David Rowe - DATE CREATED: 16/4/2012 - - Destroy an instance of the modem. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_destroy(struct FDMDV *fdmdv) -{ - assert(fdmdv != NULL); - KISS_FFT_FREE(fdmdv->fft_pilot_cfg); - KISS_FFT_FREE(fdmdv->fft_cfg); - free(fdmdv->rx_test_bits_mem); - free(fdmdv); -} - - -void CODEC2_WIN32SUPPORT fdmdv_use_old_qpsk_mapping(struct FDMDV *fdmdv) { - fdmdv->old_qpsk_mapping = 1; -} - - -int CODEC2_WIN32SUPPORT fdmdv_bits_per_frame(struct FDMDV *fdmdv) -{ - return (fdmdv->Nc * NB); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_get_test_bits() - AUTHOR......: David Rowe - DATE CREATED: 16/4/2012 - - Generate a frame of bits from a repeating sequence of random data. OK so - it's not very random if it repeats but it makes syncing at the demod easier - for test purposes. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_get_test_bits(struct FDMDV *f, int tx_bits[]) -{ - int i; - int bits_per_frame = fdmdv_bits_per_frame(f); - - for(i=0; i<bits_per_frame; i++) { - tx_bits[i] = test_bits[f->current_test_bit]; - f->current_test_bit++; - if (f->current_test_bit > (f->ntest_bits-1)) - f->current_test_bit = 0; - } - } - -float CODEC2_WIN32SUPPORT fdmdv_get_fsep(struct FDMDV *f) -{ - return f->fsep; -} - -void CODEC2_WIN32SUPPORT fdmdv_set_fsep(struct FDMDV *f, float fsep) { - int c; - float carrier_freq; - - f->fsep = fsep; - /* Set up frequency of each carrier */ - - for(c=0; c<f->Nc/2; c++) { - carrier_freq = (-f->Nc/2 + c)*f->fsep + FDMDV_FCENTRE; - f->freq[c].real = cos(2.0*PI*carrier_freq/FS); - f->freq[c].imag = sin(2.0*PI*carrier_freq/FS); - } - - for(c=f->Nc/2; c<f->Nc; c++) { - carrier_freq = (-f->Nc/2 + c + 1)*f->fsep + FDMDV_FCENTRE; - f->freq[c].real = cos(2.0*PI*carrier_freq/FS); - f->freq[c].imag = sin(2.0*PI*carrier_freq/FS); - } -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: bits_to_dqpsk_symbols() - AUTHOR......: David Rowe - DATE CREATED: 16/4/2012 - - Maps bits to parallel DQPSK symbols. Generate Nc+1 QPSK symbols from - vector of (1,Nc*Nb) input tx_bits. The Nc+1 symbol is the +1 -1 +1 - .... BPSK sync carrier. - -\*---------------------------------------------------------------------------*/ - -void bits_to_dqpsk_symbols(COMP tx_symbols[], int Nc, COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit, int old_qpsk_mapping) -{ - int c, msb, lsb; - COMP j = {0.0,1.0}; - - /* Map tx_bits to to Nc DQPSK symbols. Note legacy support for - old (suboptimal) V0.91 FreeDV mapping */ - - for(c=0; c<Nc; c++) { - msb = tx_bits[2*c]; - lsb = tx_bits[2*c+1]; - if ((msb == 0) && (lsb == 0)) - tx_symbols[c] = prev_tx_symbols[c]; - if ((msb == 0) && (lsb == 1)) - tx_symbols[c] = cmult(j, prev_tx_symbols[c]); - if ((msb == 1) && (lsb == 0)) { - if (old_qpsk_mapping) - tx_symbols[c] = cneg(prev_tx_symbols[c]); - else - tx_symbols[c] = cmult(cneg(j),prev_tx_symbols[c]); - } - if ((msb == 1) && (lsb == 1)) { - if (old_qpsk_mapping) - tx_symbols[c] = cmult(cneg(j),prev_tx_symbols[c]); - else - tx_symbols[c] = cneg(prev_tx_symbols[c]); - } - } - - /* +1 -1 +1 -1 BPSK sync carrier, once filtered becomes (roughly) - two spectral lines at +/- Rs/2 */ - - if (*pilot_bit) - tx_symbols[Nc] = cneg(prev_tx_symbols[Nc]); - else - tx_symbols[Nc] = prev_tx_symbols[Nc]; - - if (*pilot_bit) - *pilot_bit = 0; - else - *pilot_bit = 1; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: tx_filter() - AUTHOR......: David Rowe - DATE CREATED: 17/4/2012 - - Given Nc*NB bits construct M samples (1 symbol) of Nc+1 filtered - symbols streams. - -\*---------------------------------------------------------------------------*/ - -void tx_filter(COMP tx_baseband[NC+1][M], int Nc, COMP tx_symbols[], COMP tx_filter_memory[NC+1][NSYM]) -{ - int c; - int i,j,k; - float acc; - COMP gain; - - gain.real = sqrt(2.0)/2.0; - gain.imag = 0.0; - - for(c=0; c<Nc+1; c++) - tx_filter_memory[c][NSYM-1] = cmult(tx_symbols[c], gain); - - /* - tx filter each symbol, generate M filtered output samples for each symbol. - Efficient polyphase filter techniques used as tx_filter_memory is sparse - */ - - for(i=0; i<M; i++) { - for(c=0; c<Nc+1; c++) { - - /* filter real sample of symbol for carrier c */ - - acc = 0.0; - for(j=0,k=M-i-1; j<NSYM; j++,k+=M) - acc += M * tx_filter_memory[c][j].real * gt_alpha5_root[k]; - tx_baseband[c][i].real = acc; - - /* filter imag sample of symbol for carrier c */ - - acc = 0.0; - for(j=0,k=M-i-1; j<NSYM; j++,k+=M) - acc += M * tx_filter_memory[c][j].imag * gt_alpha5_root[k]; - tx_baseband[c][i].imag = acc; - - } - } - - /* shift memory, inserting zeros at end */ - - for(i=0; i<NSYM-1; i++) - for(c=0; c<Nc+1; c++) - tx_filter_memory[c][i] = tx_filter_memory[c][i+1]; - - for(c=0; c<Nc+1; c++) { - tx_filter_memory[c][NSYM-1].real = 0.0; - tx_filter_memory[c][NSYM-1].imag = 0.0; - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdm_upconvert() - AUTHOR......: David Rowe - DATE CREATED: 17/4/2012 - - Construct FDM signal by frequency shifting each filtered symbol - stream. Returns complex signal so we can apply frequency offsets - easily. - -\*---------------------------------------------------------------------------*/ - -void fdm_upconvert(COMP tx_fdm[], int Nc, COMP tx_baseband[NC+1][M], COMP phase_tx[], COMP freq[]) -{ - int i,c; - COMP two = {2.0, 0.0}; - COMP pilot; - - for(i=0; i<M; i++) { - tx_fdm[i].real = 0.0; - tx_fdm[i].imag = 0.0; - } - - /* Nc/2 tones below centre freq */ - - for (c=0; c<Nc/2; c++) - for (i=0; i<M; i++) { - phase_tx[c] = cmult(phase_tx[c], freq[c]); - tx_fdm[i] = cadd(tx_fdm[i], cmult(tx_baseband[c][i], phase_tx[c])); - } - - /* Nc/2 tones above centre freq */ - - for (c=Nc/2; c<Nc; c++) - for (i=0; i<M; i++) { - phase_tx[c] = cmult(phase_tx[c], freq[c]); - tx_fdm[i] = cadd(tx_fdm[i], cmult(tx_baseband[c][i], phase_tx[c])); - } - - /* add centre pilot tone */ - - c = Nc; - for (i=0; i<M; i++) { - phase_tx[c] = cmult(phase_tx[c], freq[c]); - pilot = cmult(cmult(two, tx_baseband[c][i]), phase_tx[c]); - tx_fdm[i] = cadd(tx_fdm[i], pilot); - } - - /* - Scale such that total Carrier power C of real(tx_fdm) = Nc. This - excludes the power of the pilot tone. - We return the complex (single sided) signal to make frequency - shifting for the purpose of testing easier - */ - - for (i=0; i<M; i++) - tx_fdm[i] = cmult(two, tx_fdm[i]); - - /* normalise digital oscilators as the magnitude can drfift over time */ - - for (c=0; c<Nc+1; c++) { - phase_tx[c].real /= cabsolute(phase_tx[c]); - phase_tx[c].imag /= cabsolute(phase_tx[c]); - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_mod() - AUTHOR......: David Rowe - DATE CREATED: 26/4/2012 - - FDMDV modulator, take a frame of FDMDV_BITS_PER_FRAME bits and - generates a frame of FDMDV_SAMPLES_PER_FRAME modulated symbols. - Sync bit is returned to aid alignment of your next frame. - - The sync_bit value returned will be used for the _next_ frame. - - The output signal is complex to support single sided frequency - shifting, for example when testing frequency offsets in channel - simulation. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_mod(struct FDMDV *fdmdv, COMP tx_fdm[], - int tx_bits[], int *sync_bit) -{ - COMP tx_symbols[NC+1]; - COMP tx_baseband[NC+1][M]; - - bits_to_dqpsk_symbols(tx_symbols, fdmdv->Nc, fdmdv->prev_tx_symbols, tx_bits, &fdmdv->tx_pilot_bit, fdmdv->old_qpsk_mapping); - memcpy(fdmdv->prev_tx_symbols, tx_symbols, sizeof(COMP)*(fdmdv->Nc+1)); - tx_filter(tx_baseband, fdmdv->Nc, tx_symbols, fdmdv->tx_filter_memory); - fdm_upconvert(tx_fdm, fdmdv->Nc, tx_baseband, fdmdv->phase_tx, fdmdv->freq); - - *sync_bit = fdmdv->tx_pilot_bit; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: generate_pilot_fdm() - AUTHOR......: David Rowe - DATE CREATED: 19/4/2012 - - Generate M samples of DBPSK pilot signal for Freq offset estimation. - -\*---------------------------------------------------------------------------*/ - -void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, - float *filter_mem, COMP *phase, COMP *freq) -{ - int i,j,k; - float tx_baseband[M]; - - /* +1 -1 +1 -1 DBPSK sync carrier, once filtered becomes (roughly) - two spectral lines at +/- RS/2 */ - - if (*bit) - *symbol = -*symbol; - else - *symbol = *symbol; - if (*bit) - *bit = 0; - else - *bit = 1; - - /* filter DPSK symbol to create M baseband samples */ - - filter_mem[NFILTER-1] = (sqrt(2)/2) * *symbol; - for(i=0; i<M; i++) { - tx_baseband[i] = 0.0; - for(j=M-1,k=M-i-1; j<NFILTER; j+=M,k+=M) - tx_baseband[i] += M * filter_mem[j] * gt_alpha5_root[k]; - } - - /* shift memory, inserting zeros at end */ - - for(i=0; i<NFILTER-M; i++) - filter_mem[i] = filter_mem[i+M]; - - for(i=NFILTER-M; i<NFILTER; i++) - filter_mem[i] = 0.0; - - /* upconvert */ - - for(i=0; i<M; i++) { - *phase = cmult(*phase, *freq); - pilot_fdm[i].real = sqrt(2)*2*tx_baseband[i] * phase->real; - pilot_fdm[i].imag = sqrt(2)*2*tx_baseband[i] * phase->imag; - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: generate_pilot_lut() - AUTHOR......: David Rowe - DATE CREATED: 19/4/2012 - - Generate a 4M sample vector of DBPSK pilot signal. As the pilot signal - is periodic in 4M samples we can then use this vector as a look up table - for pilot signal generation in the demod. - -\*---------------------------------------------------------------------------*/ - -void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq) -{ - int pilot_rx_bit = 0; - float pilot_symbol = sqrt(2.0); - COMP pilot_phase = {1.0, 0.0}; - float pilot_filter_mem[NFILTER]; - COMP pilot[M]; - int i,f; - - for(i=0; i<NFILTER; i++) - pilot_filter_mem[i] = 0.0; - - /* discard first 4 symbols as filter memory is filling, just keep - last four symbols */ - - for(f=0; f<8; f++) { - generate_pilot_fdm(pilot, &pilot_rx_bit, &pilot_symbol, pilot_filter_mem, &pilot_phase, pilot_freq); - if (f >= 4) - memcpy(&pilot_lut[M*(f-4)], pilot, M*sizeof(COMP)); - } - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: lpf_peak_pick() - AUTHOR......: David Rowe - DATE CREATED: 20/4/2012 - - LPF and peak pick part of freq est, put in a function as we call it twice. - -\*---------------------------------------------------------------------------*/ - -void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], - COMP pilot_lpf[], kiss_fft_cfg fft_pilot_cfg, COMP S[], int nin) -{ - int i,j,k; - int mpilot; - COMP s[MPILOTFFT]; - float mag, imax; - int ix; - float r; - - /* LPF cutoff 200Hz, so we can handle max +/- 200 Hz freq offset */ - - for(i=0; i<NPILOTLPF-nin; i++) - pilot_lpf[i] = pilot_lpf[nin+i]; - for(i=NPILOTLPF-nin, j=0; i<NPILOTLPF; i++,j++) { - pilot_lpf[i].real = 0.0; pilot_lpf[i].imag = 0.0; - for(k=0; k<NPILOTCOEFF; k++) - pilot_lpf[i] = cadd(pilot_lpf[i], fcmult(pilot_coeff[k], pilot_baseband[j+k])); - } - - /* decimate to improve DFT resolution, window and DFT */ - - mpilot = FS/(2*200); /* calc decimation rate given new sample rate is twice LPF freq */ - for(i=0; i<MPILOTFFT; i++) { - s[i].real = 0.0; s[i].imag = 0.0; - } - for(i=0,j=0; i<NPILOTLPF; i+=mpilot,j++) { - s[j] = fcmult(hanning[i], pilot_lpf[i]); - } - - kiss_fft(fft_pilot_cfg, (kiss_fft_cpx *)s, (kiss_fft_cpx *)S); - - /* peak pick and convert to Hz */ - - imax = 0.0; - ix = 0; - for(i=0; i<MPILOTFFT; i++) { - mag = S[i].real*S[i].real + S[i].imag*S[i].imag; - if (mag > imax) { - imax = mag; - ix = i; - } - } - r = 2.0*200.0/MPILOTFFT; /* maps FFT bin to frequency in Hz */ - - if (ix >= MPILOTFFT/2) - *foff = (ix - MPILOTFFT)*r; - else - *foff = (ix)*r; - *max = imax; - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: rx_est_freq_offset() - AUTHOR......: David Rowe - DATE CREATED: 19/4/2012 - - Estimate frequency offset of FDM signal using BPSK pilot. Note that - this algorithm is quite sensitive to pilot tone level wrt other - carriers, so test variations to the pilot amplitude carefully. - -\*---------------------------------------------------------------------------*/ - -float rx_est_freq_offset(struct FDMDV *f, COMP rx_fdm[], int nin) -{ - int i,j; - COMP pilot[M+M/P]; - COMP prev_pilot[M+M/P]; - float foff, foff1, foff2; - float max1, max2; - - assert(nin <= M+M/P); - - /* get pilot samples used for correlation/down conversion of rx signal */ - - for (i=0; i<nin; i++) { - pilot[i] = f->pilot_lut[f->pilot_lut_index]; - f->pilot_lut_index++; - if (f->pilot_lut_index >= 4*M) - f->pilot_lut_index = 0; - - prev_pilot[i] = f->pilot_lut[f->prev_pilot_lut_index]; - f->prev_pilot_lut_index++; - if (f->prev_pilot_lut_index >= 4*M) - f->prev_pilot_lut_index = 0; - } - - /* - Down convert latest M samples of pilot by multiplying by ideal - BPSK pilot signal we have generated locally. The peak of the - resulting signal is sensitive to the time shift between the - received and local version of the pilot, so we do it twice at - different time shifts and choose the maximum. - */ - - for(i=0; i<NPILOTBASEBAND-nin; i++) { - f->pilot_baseband1[i] = f->pilot_baseband1[i+nin]; - f->pilot_baseband2[i] = f->pilot_baseband2[i+nin]; - } - - for(i=0,j=NPILOTBASEBAND-nin; i<nin; i++,j++) { - f->pilot_baseband1[j] = cmult(rx_fdm[i], cconj(pilot[i])); - f->pilot_baseband2[j] = cmult(rx_fdm[i], cconj(prev_pilot[i])); - } - - lpf_peak_pick(&foff1, &max1, f->pilot_baseband1, f->pilot_lpf1, f->fft_pilot_cfg, f->S1, nin); - lpf_peak_pick(&foff2, &max2, f->pilot_baseband2, f->pilot_lpf2, f->fft_pilot_cfg, f->S2, nin); - - if (max1 > max2) - foff = foff1; - else - foff = foff2; - - return foff; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_freq_shift() - AUTHOR......: David Rowe - DATE CREATED: 26/4/2012 - - Frequency shift modem signal. The use of complex input and output allows - single sided frequency shifting (no images). - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, - COMP *foff_rect, COMP *foff_phase_rect, int nin) -{ - int i; - - foff_rect->real = cos(2.0*PI*foff/FS); - foff_rect->imag = sin(2.0*PI*foff/FS); - for(i=0; i<nin; i++) { - *foff_phase_rect = cmult(*foff_phase_rect, *foff_rect); - rx_fdm_fcorr[i] = cmult(rx_fdm[i], *foff_phase_rect); - } - - /* normalise digital oscilator as the magnitude can drfift over time */ - - foff_phase_rect->real /= cabsolute(*foff_phase_rect); - foff_phase_rect->imag /= cabsolute(*foff_phase_rect); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdm_downconvert() - AUTHOR......: David Rowe - DATE CREATED: 22/4/2012 - - Frequency shift each modem carrier down to Nc+1 baseband signals. - -\*---------------------------------------------------------------------------*/ - -void fdm_downconvert(COMP rx_baseband[NC+1][M+M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin) -{ - int i,c; - - /* maximum number of input samples to demod */ - - assert(nin <= (M+M/P)); - - /* Nc/2 tones below centre freq */ - - for (c=0; c<Nc/2; c++) - for (i=0; i<nin; i++) { - phase_rx[c] = cmult(phase_rx[c], freq[c]); - rx_baseband[c][i] = cmult(rx_fdm[i], cconj(phase_rx[c])); - } - - /* Nc/2 tones above centre freq */ - - for (c=Nc/2; c<Nc; c++) - for (i=0; i<nin; i++) { - phase_rx[c] = cmult(phase_rx[c], freq[c]); - rx_baseband[c][i] = cmult(rx_fdm[i], cconj(phase_rx[c])); - } - - /* centre pilot tone */ - - c = Nc; - for (i=0; i<nin; i++) { - phase_rx[c] = cmult(phase_rx[c], freq[c]); - rx_baseband[c][i] = cmult(rx_fdm[i], cconj(phase_rx[c])); - } - - /* normalise digital oscilators as the magnitude can drift over time */ - - for (c=0; c<Nc+1; c++) { - phase_rx[c].real /= cabsolute(phase_rx[c]); - phase_rx[c].imag /= cabsolute(phase_rx[c]); - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: rx_filter() - AUTHOR......: David Rowe - DATE CREATED: 22/4/2012 - - Receive filter each baseband signal at oversample rate P. Filtering at - rate P lowers CPU compared to rate M. - - Depending on the number of input samples to the demod nin, we - produce P-1, P (usually), or P+1 filtered samples at rate P. nin is - occasionally adjusted to compensate for timing slips due to - different tx and rx sample clocks. - -\*---------------------------------------------------------------------------*/ - -void rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_baseband[NC+1][M+M/P], COMP rx_filter_memory[NC+1][NFILTER], int nin) -{ - int c, i,j,k,l; - int n=M/P; - - /* rx filter each symbol, generate P filtered output samples for - each symbol. Note we keep filter memory at rate M, it's just - the filter output at rate P */ - - for(i=0, j=0; i<nin; i+=n,j++) { - - /* latest input sample */ - - for(c=0; c<Nc+1; c++) - for(k=NFILTER-n,l=i; k<NFILTER; k++,l++) - rx_filter_memory[c][k] = rx_baseband[c][l]; - - /* convolution (filtering) */ - - for(c=0; c<Nc+1; c++) { - rx_filt[c][j].real = 0.0; rx_filt[c][j].imag = 0.0; - for(k=0; k<NFILTER; k++) - rx_filt[c][j] = cadd(rx_filt[c][j], fcmult(gt_alpha5_root[k], rx_filter_memory[c][k])); - } - - /* make room for next input sample */ - - for(c=0; c<Nc+1; c++) - for(k=0,l=n; k<NFILTER-n; k++,l++) - rx_filter_memory[c][k] = rx_filter_memory[c][l]; - } - - assert(j <= (P+1)); /* check for any over runs */ -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: rx_est_timing() - AUTHOR......: David Rowe - DATE CREATED: 23/4/2012 - - Estimate optimum timing offset, re-filter receive symbols at optimum - timing estimate. - -\*---------------------------------------------------------------------------*/ - -float rx_est_timing(COMP rx_symbols[], - int Nc, - COMP rx_filt[NC+1][P+1], - COMP rx_baseband[NC+1][M+M/P], - COMP rx_filter_mem_timing[NC+1][NT*P], - float env[], - COMP rx_baseband_mem_timing[NC+1][NFILTERTIMING], - int nin) -{ - int c,i,j,k; - int adjust, s; - COMP x, phase, freq; - float rx_timing; - - /* - nin adjust - -------------------------------- - 120 -1 (one less rate P sample) - 160 0 (nominal) - 200 1 (one more rate P sample) - */ - - adjust = P - nin*P/M; - - /* update buffer of NT rate P filtered symbols */ - - for(c=0; c<Nc+1; c++) - for(i=0,j=P-adjust; i<(NT-1)*P+adjust; i++,j++) - rx_filter_mem_timing[c][i] = rx_filter_mem_timing[c][j]; - for(c=0; c<Nc+1; c++) - for(i=(NT-1)*P+adjust,j=0; i<NT*P; i++,j++) - rx_filter_mem_timing[c][i] = rx_filt[c][j]; - - /* sum envelopes of all carriers */ - - for(i=0; i<NT*P; i++) { - env[i] = 0.0; - for(c=0; c<Nc+1; c++) - env[i] += cabsolute(rx_filter_mem_timing[c][i]); - } - - /* The envelope has a frequency component at the symbol rate. The - phase of this frequency component indicates the timing. So work - out single DFT at frequency 2*pi/P */ - - x.real = 0.0; x.imag = 0.0; - freq.real = cos(2*PI/P); - freq.imag = sin(2*PI/P); - phase.real = 1.0; - phase.imag = 0.0; - - for(i=0; i<NT*P; i++) { - x = cadd(x, fcmult(env[i], phase)); - phase = cmult(phase, freq); - } - - /* Map phase to estimated optimum timing instant at rate M. The - M/4 part was adjusted by experiment, I know not why.... */ - - rx_timing = atan2(x.imag, x.real)*M/(2*PI) + M/4; - - if (rx_timing > M) - rx_timing -= M; - if (rx_timing < -M) - rx_timing += M; - - /* rx_filt_mem_timing contains M + Nfilter + M samples of the - baseband signal at rate M this enables us to resample the - filtered rx symbol with M sample precision once we have - rx_timing */ - - for(c=0; c<Nc+1; c++) - for(i=0,j=nin; i<NFILTERTIMING-nin; i++,j++) - rx_baseband_mem_timing[c][i] = rx_baseband_mem_timing[c][j]; - for(c=0; c<Nc+1; c++) - for(i=NFILTERTIMING-nin,j=0; i<NFILTERTIMING; i++,j++) - rx_baseband_mem_timing[c][i] = rx_baseband[c][j]; - - /* rx filter to get symbol for each carrier at estimated optimum - timing instant. We use rate M filter memory to get fine timing - resolution. */ - - s = round(rx_timing) + M; - for(c=0; c<Nc+1; c++) { - rx_symbols[c].real = 0.0; - rx_symbols[c].imag = 0.0; - for(k=s,j=0; k<s+NFILTER; k++,j++) - rx_symbols[c] = cadd(rx_symbols[c], fcmult(gt_alpha5_root[j], rx_baseband_mem_timing[c][k])); - } - - return rx_timing; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: qpsk_to_bits() - AUTHOR......: David Rowe - DATE CREATED: 24/4/2012 - - Convert DQPSK symbols back to an array of bits, extracts sync bit - from DBPSK pilot, and also uses pilot to estimate fine frequency - error. - -\*---------------------------------------------------------------------------*/ - -float qpsk_to_bits(int rx_bits[], int *sync_bit, int Nc, COMP phase_difference[], COMP prev_rx_symbols[], - COMP rx_symbols[], int old_qpsk_mapping) -{ - int c; - COMP pi_on_4; - COMP d; - int msb=0, lsb=0; - float ferr, norm; - - pi_on_4.real = cos(PI/4.0); - pi_on_4.imag = sin(PI/4.0); - - /* Extra 45 degree clockwise lets us use real and imag axis as - decision boundaries. "norm" makes sure the phase subtraction - from the previous symbol doesn't affect the amplitude, which - leads to sensible scatter plots */ - - for(c=0; c<Nc; c++) { - norm = 1.0/(cabsolute(prev_rx_symbols[c])+1E-6); - phase_difference[c] = cmult(cmult(rx_symbols[c], fcmult(norm,cconj(prev_rx_symbols[c]))), pi_on_4); - } - - /* map (Nc,1) DQPSK symbols back into an (1,Nc*Nb) array of bits */ - - for (c=0; c<Nc; c++) { - d = phase_difference[c]; - if ((d.real >= 0) && (d.imag >= 0)) { - msb = 0; lsb = 0; - } - if ((d.real < 0) && (d.imag >= 0)) { - msb = 0; lsb = 1; - } - if ((d.real < 0) && (d.imag < 0)) { - if (old_qpsk_mapping) { - msb = 1; lsb = 0; - } else { - msb = 1; lsb = 1; - } - } - if ((d.real >= 0) && (d.imag < 0)) { - if (old_qpsk_mapping) { - msb = 1; lsb = 1; - } else { - msb = 1; lsb = 0; - } - } - rx_bits[2*c] = msb; - rx_bits[2*c+1] = lsb; - } - - /* Extract DBPSK encoded Sync bit and fine freq offset estimate */ - - norm = 1.0/(cabsolute(prev_rx_symbols[Nc])+1E-6); - phase_difference[Nc] = cmult(rx_symbols[Nc], fcmult(norm, cconj(prev_rx_symbols[Nc]))); - if (phase_difference[Nc].real < 0) { - *sync_bit = 1; - ferr = phase_difference[Nc].imag; - } - else { - *sync_bit = 0; - ferr = -phase_difference[Nc].imag; - } - - /* pilot carrier gets an extra pi/4 rotation to make it consistent - with other carriers, as we need it for snr_update and scatter - diagram */ - - phase_difference[Nc] = cmult(phase_difference[Nc], pi_on_4); - - return ferr; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: snr_update() - AUTHOR......: David Rowe - DATE CREATED: 17 May 2012 - - Given phase differences update estimates of signal and noise levels. - -\*---------------------------------------------------------------------------*/ - -void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_difference[]) -{ - float s[NC+1]; - COMP refl_symbols[NC+1]; - float n[NC+1]; - COMP pi_on_4; - int c; - - pi_on_4.real = cos(PI/4.0); - pi_on_4.imag = sin(PI/4.0); - - /* mag of each symbol is distance from origin, this gives us a - vector of mags, one for each carrier. */ - - for(c=0; c<Nc+1; c++) - s[c] = cabsolute(phase_difference[c]); - - /* signal mag estimate for each carrier is a smoothed version of - instantaneous magntitude, this gives us a vector of smoothed - mag estimates, one for each carrier. */ - - for(c=0; c<Nc+1; c++) - sig_est[c] = SNR_COEFF*sig_est[c] + (1.0 - SNR_COEFF)*s[c]; - - /* noise mag estimate is distance of current symbol from average - location of that symbol. We reflect all symbols into the first - quadrant for convenience. */ - - for(c=0; c<Nc+1; c++) { - refl_symbols[c].real = fabs(phase_difference[c].real); - refl_symbols[c].imag = fabs(phase_difference[c].imag); - n[c] = cabsolute(cadd(fcmult(sig_est[c], pi_on_4), cneg(refl_symbols[c]))); - } - - /* noise mag estimate for each carrier is a smoothed version of - instantaneous noise mag, this gives us a vector of smoothed - noise power estimates, one for each carrier. */ - - for(c=0; c<Nc+1; c++) - noise_est[c] = SNR_COEFF*noise_est[c] + (1 - SNR_COEFF)*n[c]; -} - -// returns number of shorts in error_pattern[], one short per error - -int CODEC2_WIN32SUPPORT fdmdv_error_pattern_size(struct FDMDV *f) { - return f->ntest_bits; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_put_test_bits() - AUTHOR......: David Rowe - DATE CREATED: 24/4/2012 - - Accepts nbits from rx and attempts to sync with test_bits sequence. - If sync OK measures bit errors. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync, short error_pattern[], - int *bit_errors, int *ntest_bits, - int rx_bits[]) -{ - int i,j; - float ber; - int bits_per_frame = fdmdv_bits_per_frame(f); - - /* Append to our memory */ - - for(i=0,j=bits_per_frame; i<f->ntest_bits-bits_per_frame; i++,j++) - f->rx_test_bits_mem[i] = f->rx_test_bits_mem[j]; - for(i=f->ntest_bits-bits_per_frame,j=0; i<f->ntest_bits; i++,j++) - f->rx_test_bits_mem[i] = rx_bits[j]; - - /* see how many bit errors we get when checked against test sequence */ - - *bit_errors = 0; - for(i=0; i<f->ntest_bits; i++) { - error_pattern[i] = test_bits[i] ^ f->rx_test_bits_mem[i]; - *bit_errors += error_pattern[i]; - //printf("%d %d %d %d\n", i, test_bits[i], f->rx_test_bits_mem[i], test_bits[i] ^ f->rx_test_bits_mem[i]); - } - - /* if less than a thresh we are aligned and in sync with test sequence */ - - ber = (float)*bit_errors/f->ntest_bits; - - *sync = 0; - if (ber < 0.2) - *sync = 1; - - *ntest_bits = f->ntest_bits; - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: freq_state(() - AUTHOR......: David Rowe - DATE CREATED: 24/4/2012 - - Freq offset state machine. Moves between coarse and fine states - based on BPSK pilot sequence. Freq offset estimator occasionally - makes mistakes when used continuously. So we use it until we have - acquired the BPSK pilot, then switch to a more robust "fine" - tracking algorithm. If we lose sync we switch back to coarse mode - for fast re-acquisition of large frequency offsets. - - The sync state is also useful for higher layers to determine when - there is valid FDMDV data for decoding. We want to reliably and - quickly get into sync, stay in sync even on fading channels, and - fall out of sync quickly if tx stops or it's a false sync. - - In multipath fading channels the BPSK sync carrier may be pushed - down in the noise, despite other carriers being at full strength. - We want to avoid loss of sync in these cases. - -\*---------------------------------------------------------------------------*/ - -int freq_state(int *reliable_sync_bit, int sync_bit, int *state, int *timer, int *sync_mem) -{ - int next_state, sync, unique_word, i, corr; - - /* look for 6 symbols (120ms) 101010 of sync sequence */ - - unique_word = 0; - for(i=0; i<NSYNC_MEM-1; i++) - sync_mem[i] = sync_mem[i+1]; - sync_mem[i] = 1 - 2*sync_bit; - corr = 0; - for(i=0; i<NSYNC_MEM; i++) - corr += sync_mem[i]*sync_uw[i]; - if (abs(corr) == NSYNC_MEM) - unique_word = 1; - *reliable_sync_bit = (corr == NSYNC_MEM); - - /* iterate state machine */ - - next_state = *state; - switch(*state) { - case 0: - if (unique_word) { - next_state = 1; - *timer = 0; - } - break; - case 1: /* tentative sync state */ - if (unique_word) { - (*timer)++; - if (*timer == 25) /* sync has been good for 500ms */ - next_state = 2; - } - else - next_state = 0; /* quickly fall out of sync */ - break; - case 2: /* good sync state */ - if (unique_word == 0) { - *timer = 0; - next_state = 3; - } - break; - case 3: /* tentative bad state, but could be a fade */ - if (unique_word) - next_state = 2; - else { - (*timer)++; - if (*timer == 50) /* wait for 1000ms in case sync comes back */ - next_state = 0; - } - break; - } - - //printf("state: %d next_state: %d uw: %d timer: %d\n", *state, next_state, unique_word, *timer); - *state = next_state; - if (*state) - sync = 1; - else - sync = 0; - - return sync; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_demod() - AUTHOR......: David Rowe - DATE CREATED: 26/4/2012 - - FDMDV demodulator, take an array of FDMDV_SAMPLES_PER_FRAME - modulated samples, returns an array of FDMDV_BITS_PER_FRAME bits, - plus the sync bit. - - The input signal is complex to support single sided frequency shifting - before the demod input (e.g. fdmdv2 click to tune feature). - - The number of input samples nin will normally be M == - FDMDV_SAMPLES_PER_FRAME. However to adjust for differences in - transmit and receive sample clocks nin will occasionally be M-M/P, - or M+M/P. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_demod(struct FDMDV *fdmdv, int rx_bits[], - int *reliable_sync_bit, COMP rx_fdm[], int *nin) -{ - float foff_coarse, foff_fine; - COMP rx_fdm_fcorr[M+M/P]; - COMP rx_baseband[NC+1][M+M/P]; - COMP rx_filt[NC+1][P+1]; - COMP rx_symbols[NC+1]; - float env[NT*P]; - int sync_bit; - - /* freq offset estimation and correction */ - - foff_coarse = rx_est_freq_offset(fdmdv, rx_fdm, *nin); - - if (fdmdv->sync == 0) - fdmdv->foff = foff_coarse; - fdmdv_freq_shift(rx_fdm_fcorr, rx_fdm, -fdmdv->foff, &fdmdv->foff_rect, &fdmdv->foff_phase_rect, *nin); - - /* baseband processing */ - - fdm_downconvert(rx_baseband, fdmdv->Nc, rx_fdm_fcorr, fdmdv->phase_rx, fdmdv->freq, *nin); - rx_filter(rx_filt, fdmdv->Nc, rx_baseband, fdmdv->rx_filter_memory, *nin); - fdmdv->rx_timing = rx_est_timing(rx_symbols, fdmdv->Nc, rx_filt, rx_baseband, fdmdv->rx_filter_mem_timing, env, fdmdv->rx_baseband_mem_timing, *nin); - - /* Adjust number of input samples to keep timing within bounds */ - - *nin = M; - - if (fdmdv->rx_timing > 2*M/P) - *nin += M/P; - - if (fdmdv->rx_timing < 0) - *nin -= M/P; - - foff_fine = qpsk_to_bits(rx_bits, &sync_bit, fdmdv->Nc, fdmdv->phase_difference, fdmdv->prev_rx_symbols, rx_symbols, - fdmdv->old_qpsk_mapping); - memcpy(fdmdv->prev_rx_symbols, rx_symbols, sizeof(COMP)*(fdmdv->Nc+1)); - snr_update(fdmdv->sig_est, fdmdv->noise_est, fdmdv->Nc, fdmdv->phase_difference); - - /* freq offset estimation state machine */ - - fdmdv->sync = freq_state(reliable_sync_bit, sync_bit, &fdmdv->fest_state, &fdmdv->timer, fdmdv->sync_mem); - fdmdv->foff -= TRACK_COEFF*foff_fine; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: calc_snr() - AUTHOR......: David Rowe - DATE CREATED: 17 May 2012 - - Calculate current SNR estimate (3000Hz noise BW) - -\*---------------------------------------------------------------------------*/ - -float calc_snr(int Nc, float sig_est[], float noise_est[]) -{ - float S, SdB; - float mean, N50, N50dB, N3000dB; - float snr_dB; - int c; - - S = 0.0; - for(c=0; c<Nc+1; c++) - S += pow(sig_est[c], 2.0); - SdB = 10.0*log10(S+1E-12); - - /* Average noise mag across all carriers and square to get an - average noise power. This is an estimate of the noise power in - Rs = 50Hz of BW (note for raised root cosine filters Rs is the - noise BW of the filter) */ - - mean = 0.0; - for(c=0; c<Nc+1; c++) - mean += noise_est[c]; - mean /= (Nc+1); - N50 = pow(mean, 2.0); - N50dB = 10.0*log10(N50+1E-12); - - /* Now multiply by (3000 Hz)/(50 Hz) to find the total noise power - in 3000 Hz */ - - N3000dB = N50dB + 10.0*log10(3000.0/RS); - - snr_dB = SdB - N3000dB; - - return snr_dB; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_get_demod_stats() - AUTHOR......: David Rowe - DATE CREATED: 1 May 2012 - - Fills stats structure with a bunch of demod information. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_get_demod_stats(struct FDMDV *fdmdv, - struct FDMDV_STATS *fdmdv_stats) -{ - int c; - - fdmdv_stats->Nc = fdmdv->Nc; - fdmdv_stats->snr_est = calc_snr(fdmdv->Nc, fdmdv->sig_est, fdmdv->noise_est); - fdmdv_stats->sync = fdmdv->sync; - fdmdv_stats->foff = fdmdv->foff; - fdmdv_stats->rx_timing = fdmdv->rx_timing; - fdmdv_stats->clock_offset = 0.0; /* TODO - implement clock offset estimation */ - - for(c=0; c<fdmdv->Nc+1; c++) { - fdmdv_stats->rx_symbols[c] = fdmdv->phase_difference[c]; - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_8_to_48() - AUTHOR......: David Rowe - DATE CREATED: 9 May 2012 - - Changes the sample rate of a signal from 8 to 48 kHz. Experience - with PC based modems has shown that PC sound cards have a more - accurate sample clock when set for 48 kHz than 8 kHz. - - n is the number of samples at the 8 kHz rate, there are FDMDV_OS*n samples - at the 48 kHz rate. A memory of FDMDV_OS_TAPS/FDMDV_OS samples is reqd for - in8k[] (see t48_8.c unit test as example). - - This is a classic polyphase upsampler. We take the 8 kHz samples - and insert (FDMDV_OS-1) zeroes between each sample, then - FDMDV_OS_TAPS FIR low pass filter the signal at 4kHz. As most of - the input samples are zeroes, we only need to multiply non-zero - input samples by filter coefficients. The zero insertion and - filtering are combined in the code below and I'm too lazy to explain - it further right now.... - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_8_to_48(float out48k[], float in8k[], int n) -{ - int i,j,k,l; - - /* make sure n is an integer multiple of the oversampling rate, ow - this function breaks */ - - assert((n % FDMDV_OS) == 0); - - for(i=0; i<n; i++) { - for(j=0; j<FDMDV_OS; j++) { - out48k[i*FDMDV_OS+j] = 0.0; - for(k=0,l=0; k<FDMDV_OS_TAPS; k+=FDMDV_OS,l++) - out48k[i*FDMDV_OS+j] += fdmdv_os_filter[k+j]*in8k[i-l]; - out48k[i*FDMDV_OS+j] *= FDMDV_OS; - - } - } - - /* update filter memory */ - - for(i=-(FDMDV_OS_TAPS/FDMDV_OS); i<0; i++) - in8k[i] = in8k[i + n]; - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_48_to_8() - AUTHOR......: David Rowe - DATE CREATED: 9 May 2012 - - Changes the sample rate of a signal from 48 to 8 kHz. - - n is the number of samples at the 8 kHz rate, there are FDMDV_OS*n - samples at the 48 kHz rate. As above however a memory of - FDMDV_OS_TAPS samples is reqd for in48k[] (see t48_8.c unit test as example). - - Low pass filter the 48 kHz signal at 4 kHz using the same filter as - the upsampler, then just output every FDMDV_OS-th filtered sample. - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_48_to_8(float out8k[], float in48k[], int n) -{ - int i,j; - - for(i=0; i<n; i++) { - out8k[i] = 0.0; - for(j=0; j<FDMDV_OS_TAPS; j++) - out8k[i] += fdmdv_os_filter[j]*in48k[i*FDMDV_OS-j]; - } - - /* update filter memory */ - - for(i=-FDMDV_OS_TAPS; i<0; i++) - in48k[i] = in48k[i + n*FDMDV_OS]; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: fdmdv_get_rx_spectrum() - AUTHOR......: David Rowe - DATE CREATED: 9 June 2012 - - Returns the FDMDV_NSPEC point magnitude spectrum of the rx signal in - dB. The spectral samples are scaled so that 0dB is the peak, a good - range for plotting is 0 to -40dB. - - Note only the real part of the complex input signal is used at - present. A complex variable is used for input for compatability - with the other rx signal procesing. - - Successive calls can be used to build up a waterfall or spectrogram - plot, by mapping the received levels to colours. - - The time-frequency resolution of the spectrum can be adjusted by varying - FDMDV_NSPEC. Note that a 2*FDMDV_NSPEC size FFT is reqd to get - FDMDV_NSPEC output points. FDMDV_NSPEC must be a power of 2. - - See octave/tget_spec.m for a demo real time spectral display using - Octave. This demo averages the output over time to get a smoother - display: - - av = 0.9*av + 0.1*mag_dB - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_get_rx_spectrum(struct FDMDV *f, float mag_spec_dB[], - COMP rx_fdm[], int nin) -{ - int i,j; - COMP fft_in[2*FDMDV_NSPEC]; - COMP fft_out[2*FDMDV_NSPEC]; - float full_scale_dB; - - /* update buffer of input samples */ - - for(i=0; i<2*FDMDV_NSPEC-nin; i++) - f->fft_buf[i] = f->fft_buf[i+nin]; - for(j=0; j<nin; j++,i++) - f->fft_buf[i] = rx_fdm[j].real; - assert(i == 2*FDMDV_NSPEC); - - /* window and FFT */ - - for(i=0; i<2*FDMDV_NSPEC; i++) { - fft_in[i].real = f->fft_buf[i] * (0.5 - 0.5*cos((float)i*2.0*PI/(2*FDMDV_NSPEC))); - fft_in[i].imag = 0.0; - } - - kiss_fft(f->fft_cfg, (kiss_fft_cpx *)fft_in, (kiss_fft_cpx *)fft_out); - - /* FFT scales up a signal of level 1 FDMDV_NSPEC */ - - full_scale_dB = 20*log10(FDMDV_NSPEC); - - /* scale and convert to dB */ - - for(i=0; i<FDMDV_NSPEC; i++) { - mag_spec_dB[i] = 10.0*log10(fft_out[i].real*fft_out[i].real + fft_out[i].imag*fft_out[i].imag + 1E-12); - mag_spec_dB[i] -= full_scale_dB; - } -} - -/*---------------------------------------------------------------------------*\ - - Function used during development to test if magnitude of digital - oscillators was drifting. It was! - -\*---------------------------------------------------------------------------*/ - -void CODEC2_WIN32SUPPORT fdmdv_dump_osc_mags(struct FDMDV *f) -{ - int i; - - fprintf(stderr, "phase_tx[]:\n"); - for(i=0; i<=f->Nc; i++) - fprintf(stderr," %1.3f", cabsolute(f->phase_tx[i])); - fprintf(stderr,"\nfreq[]:\n"); - for(i=0; i<=f->Nc; i++) - fprintf(stderr," %1.3f", cabsolute(f->freq[i])); - fprintf(stderr,"\nfoff_rect %1.3f foff_phase_rect: %1.3f", cabsolute(f->foff_rect), cabsolute(f->foff_phase_rect)); - fprintf(stderr,"\nphase_rx[]:\n"); - for(i=0; i<=f->Nc; i++) - fprintf(stderr," %1.3f", cabsolute(f->phase_rx[i])); - fprintf(stderr, "\n\n"); -} diff --git a/gr-vocoder/lib/codec2/fdmdv_internal.h b/gr-vocoder/lib/codec2/fdmdv_internal.h deleted file mode 100644 index 24080e63c8..0000000000 --- a/gr-vocoder/lib/codec2/fdmdv_internal.h +++ /dev/null @@ -1,176 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: fdmdv_internal.h - AUTHOR......: David Rowe - DATE CREATED: April 16 2012 - - Header file for FDMDV internal functions, exposed via this header - file for testing. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __FDMDV_INTERNAL__ -#define __FDMDV_INTERNAL__ - -#include "comp.h" -#include "codec2_fdmdv.h" -#include "kiss_fft.h" - -/*---------------------------------------------------------------------------*\ - - DEFINES - -\*---------------------------------------------------------------------------*/ - -#define PI 3.141592654 -#define FS 8000 /* sample rate in Hz */ -#define T (1.0/FS) /* sample period in seconds */ -#define RS 50 /* symbol rate in Hz */ -#define NC 20 /* max number of data carriers (plus one pilot in the centre) */ -#define NB 2 /* Bits/symbol for QPSK modulation */ -#define RB (NC*RS*NB) /* bit rate */ -#define M (FS/RS) /* oversampling factor */ -#define NSYM 6 /* number of symbols to filter over */ -#define NFILTER (NSYM*M) /* size of tx/rx filters at sample rate M */ - -#define FSEP 75 /* Default separation between carriers (Hz) */ - -#define NT 5 /* number of symbols we estimate timing over */ -#define P 4 /* oversample factor used for initial rx symbol filtering */ -#define NFILTERTIMING (M+NFILTER+M) /* filter memory used for resampling after timing estimation */ - -#define NPILOT_LUT (4*M) /* number of pilot look up table samples */ -#define NPILOTCOEFF 30 /* number of FIR filter coeffs in LP filter */ -#define NPILOTBASEBAND (NPILOTCOEFF+M+M/P) /* number of pilot baseband samples reqd for pilot LPF */ -#define NPILOTLPF (4*M) /* number of samples we DFT pilot over, pilot est window */ -#define MPILOTFFT 256 - -#define NSYNC_MEM 6 - -/* averaging filter coeffs */ - -#define TRACK_COEFF 0.5 -#define SNR_COEFF 0.9 /* SNR est averaging filter coeff */ - -/*---------------------------------------------------------------------------*\ - - STRUCT for States - -\*---------------------------------------------------------------------------*/ - -struct FDMDV { - - int Nc; - float fsep; - - /* test data (test frame) states */ - - int ntest_bits; - int current_test_bit; - int *rx_test_bits_mem; - - /* Modulator */ - - int old_qpsk_mapping; - int tx_pilot_bit; - COMP prev_tx_symbols[NC+1]; - COMP tx_filter_memory[NC+1][NSYM]; - COMP phase_tx[NC+1]; - COMP freq[NC+1]; - - /* Pilot generation at demodulator */ - - COMP pilot_lut[NPILOT_LUT]; - int pilot_lut_index; - int prev_pilot_lut_index; - - /* freq offset estimation states */ - - kiss_fft_cfg fft_pilot_cfg; - COMP pilot_baseband1[NPILOTBASEBAND]; - COMP pilot_baseband2[NPILOTBASEBAND]; - COMP pilot_lpf1[NPILOTLPF]; - COMP pilot_lpf2[NPILOTLPF]; - COMP S1[MPILOTFFT]; - COMP S2[MPILOTFFT]; - - /* freq offset correction states */ - - float foff; - COMP foff_rect; - COMP foff_phase_rect; - - /* Demodulator */ - - COMP phase_rx[NC+1]; - COMP rx_filter_memory[NC+1][NFILTER]; - COMP rx_filter_mem_timing[NC+1][NT*P]; - COMP rx_baseband_mem_timing[NC+1][NFILTERTIMING]; - float rx_timing; - COMP phase_difference[NC+1]; - COMP prev_rx_symbols[NC+1]; - - /* sync state machine */ - - int sync_mem[NSYNC_MEM]; - int fest_state; - int sync; - int timer; - - /* SNR estimation states */ - - float sig_est[NC+1]; - float noise_est[NC+1]; - - /* Buf for FFT/waterfall */ - - float fft_buf[2*FDMDV_NSPEC]; - kiss_fft_cfg fft_cfg; - }; - -/*---------------------------------------------------------------------------*\ - - FUNCTION PROTOTYPES - -\*---------------------------------------------------------------------------*/ - -void bits_to_dqpsk_symbols(COMP tx_symbols[], int Nc, COMP prev_tx_symbols[], int tx_bits[], int *pilot_bit, int old_qpsk_mapping); -void tx_filter(COMP tx_baseband[NC+1][M], int Nc, COMP tx_symbols[], COMP tx_filter_memory[NC+1][NSYM]); -void fdm_upconvert(COMP tx_fdm[], int Nc, COMP tx_baseband[NC+1][M], COMP phase_tx[], COMP freq_tx[]); -void generate_pilot_fdm(COMP *pilot_fdm, int *bit, float *symbol, float *filter_mem, COMP *phase, COMP *freq); -void generate_pilot_lut(COMP pilot_lut[], COMP *pilot_freq); -float rx_est_freq_offset(struct FDMDV *f, COMP rx_fdm[], int nin); -void lpf_peak_pick(float *foff, float *max, COMP pilot_baseband[], COMP pilot_lpf[], kiss_fft_cfg fft_pilot_cfg, COMP S[], int nin); -void freq_shift(COMP rx_fdm_fcorr[], COMP rx_fdm[], float foff, COMP *foff_rect, COMP *foff_phase_rect, int nin); -void fdm_downconvert(COMP rx_baseband[NC+1][M+M/P], int Nc, COMP rx_fdm[], COMP phase_rx[], COMP freq[], int nin); -void rx_filter(COMP rx_filt[NC+1][P+1], int Nc, COMP rx_baseband[NC+1][M+M/P], COMP rx_filter_memory[NC+1][NFILTER], int nin); -float rx_est_timing(COMP rx_symbols[], int Nc, - COMP rx_filt[NC+1][P+1], - COMP rx_baseband[NC+1][M+M/P], - COMP rx_filter_mem_timing[NC+1][NT*P], - float env[], - COMP rx_baseband_mem_timing[NC+1][NFILTERTIMING], - int nin); -float qpsk_to_bits(int rx_bits[], int *sync_bit, int Nc, COMP phase_difference[], COMP prev_rx_symbols[], COMP rx_symbols[], int old_qpsk_mapping); -void snr_update(float sig_est[], float noise_est[], int Nc, COMP phase_difference[]); -int freq_state(int *reliable_sync_bit, int sync_bit, int *state, int *timer, int *sync_mem); -float calc_snr(int Nc, float sig_est[], float noise_est[]); - -#endif diff --git a/gr-vocoder/lib/codec2/fifo.c b/gr-vocoder/lib/codec2/fifo.c deleted file mode 100644 index acac2614f7..0000000000 --- a/gr-vocoder/lib/codec2/fifo.c +++ /dev/null @@ -1,142 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: fifo.c - AUTHOR......: David Rowe - DATE CREATED: Oct 15 2012 - - A FIFO design useful in gluing the FDMDV modem and codec together in - integrated applications. The unittest/tfifo indicates these - routines are thread safe without the need for syncronisation - object, e.g. a different thread can read and write to a fifo at the - same time. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include <assert.h> -#include <stdlib.h> -#include <stdio.h> -#include "codec2_fifo.h" - -struct FIFO { - short *buf; - short *pin; - short *pout; - int nshort; -}; - -struct FIFO *fifo_create(int nshort) { - struct FIFO *fifo; - - fifo = (struct FIFO *)malloc(sizeof(struct FIFO)); - assert(fifo != NULL); - - fifo->buf = (short*)malloc(sizeof(short)*nshort); - assert(fifo->buf != NULL); - fifo->pin = fifo->buf; - fifo->pout = fifo->buf; - fifo->nshort = nshort; - - return fifo; -} - -void fifo_destroy(struct FIFO *fifo) { - assert(fifo != NULL); - free(fifo->buf); - free(fifo); -} - -int fifo_write(struct FIFO *fifo, short data[], int n) { - int i; - int fifo_free; - short *pdata; - short *pin = fifo->pin; - - assert(fifo != NULL); - assert(data != NULL); - - // available storage is one less than nshort as prd == pwr - // is reserved for empty rather than full - - fifo_free = fifo->nshort - fifo_used(fifo) - 1; - - if (n > fifo_free) { - return -1; - } - else { - - /* This could be made more efficient with block copies - using memcpy */ - - pdata = data; - for(i=0; i<n; i++) { - *pin++ = *pdata++; - if (pin == (fifo->buf + fifo->nshort)) - pin = fifo->buf; - } - fifo->pin = pin; - } - - return 0; -} - -int fifo_read(struct FIFO *fifo, short data[], int n) -{ - int i; - short *pdata; - short *pout = fifo->pout; - - assert(fifo != NULL); - assert(data != NULL); - - if (n > fifo_used(fifo)) { - return -1; - } - else { - - /* This could be made more efficient with block copies - using memcpy */ - - pdata = data; - for(i=0; i<n; i++) { - *pdata++ = *pout++; - if (pout == (fifo->buf + fifo->nshort)) - pout = fifo->buf; - } - fifo->pout = pout; - } - - return 0; -} - -int fifo_used(struct FIFO *fifo) -{ - short *pin = fifo->pin; - short *pout = fifo->pout; - unsigned int used; - - assert(fifo != NULL); - if (pin >= pout) - used = pin - pout; - else - used = fifo->nshort + (unsigned int)(pin - pout); - - return used; -} - diff --git a/gr-vocoder/lib/codec2/generate_codebook.c b/gr-vocoder/lib/codec2/generate_codebook.c deleted file mode 100644 index 705f29d382..0000000000 --- a/gr-vocoder/lib/codec2/generate_codebook.c +++ /dev/null @@ -1,179 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: generate_codebook.c - AUTHOR......: Bruce Perens - DATE CREATED: 29 Sep 2010 - - Generate header files containing LSP quantisers, runs at compile time. - -\*---------------------------------------------------------------------------*/ - -/* - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include <stdlib.h> -#include <stdio.h> -#include <ctype.h> -#include <math.h> - -static const char usage[] = -"Usage: %s filename array_name [filename ...]\n" -"\tCreate C code for codebook tables.\n"; - -static const char format[] = -"The table format must be:\n" -"\tTwo integers describing the dimensions of the codebook.\n" -"\tThen, enough numbers to fill the specified dimensions.\n"; - -static const char header[] = -"/* THIS IS A GENERATED FILE. Edit generate_codebook.c and its input */\n\n" -"/*\n" -" * This intermediary file and the files that used to create it are under \n" -" * The LGPL. See the file COPYING.\n" -" */\n\n" -"#include \"defines.h\"\n\n"; - -struct codebook { - unsigned int k; - unsigned int log2m; - unsigned int m; - float * cb; -}; - -static void -dump_array(const struct codebook * b, int index) -{ - int limit = b->k * b->m; - int i; - - printf("static const float codes%d[] = {\n", index); - for ( i = 0; i < limit; i++ ) { - printf(" %g", b->cb[i]); - if ( i < limit - 1 ) - printf(","); - - /* organise VQs by rows, looks prettier */ - if ( ((i+1) % b->k) == 0 ) - printf("\n"); - } - printf("};\n"); -} - -static void -dump_structure(const struct codebook * b, int index) -{ - printf(" {\n"); - printf(" %d,\n", b->k); - printf(" %g,\n", log(b->m) / log(2)); - printf(" %d,\n", b->m); - printf(" codes%d\n", index); - printf(" }"); -} - -float -get_float(FILE * in, const char * name, char * * cursor, char * buffer, - int size) -{ - for ( ; ; ) { - char * s = *cursor; - char c; - - while ( (c = *s) != '\0' && !isdigit(c) && c != '-' && c != '.' ) - s++; - - /* Comments start with "#" and continue to the end of the line. */ - if ( c != '\0' && c != '#' ) { - char * end = 0; - float f = 0; - - f = strtod(s, &end); - - if ( end != s ) - *cursor = end; - return f; - } - - if ( fgets(buffer, size, in) == NULL ) { - fprintf(stderr, "%s: Format error. %s\n", name, format); - exit(1); - } - *cursor = buffer; - } -} - -static struct codebook * -load(FILE * file, const char * name) -{ - char line[1024]; - char * cursor = line; - struct codebook * b = malloc(sizeof(struct codebook)); - int i; - int size; - - *cursor = '\0'; - - b->k = (int)get_float(file, name, &cursor, line, sizeof(line)); - b->m = (int)get_float(file, name ,&cursor, line, sizeof(line)); - size = b->k * b->m; - - b->cb = (float *)malloc(size * sizeof(float)); - - for ( i = 0; i < size; i++ ) - b->cb[i] = get_float(file, name, &cursor, line, sizeof(line)); - - return b; -} - -int -main(int argc, char * * argv) -{ - struct codebook * * cb = malloc(argc * sizeof(struct codebook *)); - int i; - - if ( argc < 2 ) { - fprintf(stderr, usage, argv[0]); - fprintf(stderr, format); - exit(1); - } - - for ( i = 0; i < argc - 2; i++ ) { - FILE * in = fopen(argv[i + 2], "r"); - - if ( in == NULL ) { - perror(argv[i + 2]); - exit(1); - } - - cb[i] = load(in, argv[i + 2]); - - fclose(in); - } - - printf(header); - for ( i = 0; i < argc - 2; i++ ) { - printf(" /* %s */\n", argv[i + 2]); - dump_array(cb[i], i); - } - printf("\nconst struct lsp_codebook %s[] = {\n", argv[1]); - for ( i = 0; i < argc - 2; i++ ) { - printf(" /* %s */\n", argv[i + 2]); - dump_structure(cb[i], i); - printf(",\n"); - } - printf(" { 0, 0, 0, 0 }\n"); - printf("};\n"); - - return 0; -} diff --git a/gr-vocoder/lib/codec2/globals.c b/gr-vocoder/lib/codec2/globals.c deleted file mode 100644 index da2faf7229..0000000000 --- a/gr-vocoder/lib/codec2/globals.c +++ /dev/null @@ -1,49 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: globals.c - AUTHOR......: David Rowe - DATE CREATED: 11/5/94 - - Globals for sinusoidal speech coder. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "sine.h" /* global defines for coder */ - -/* Globals used in encoder and decoder */ - -int frames; /* number of frames processed so far */ -float Sn[M]; /* float input speech samples */ -MODEL model; /* model parameters for the current frame */ -int Nw; /* number of samples in analysis window */ -float sig; /* energy of current frame */ - -/* Globals used in encoder */ - -float w[M]; /* time domain hamming window */ -COMP W[FFT_ENC]; /* DFT of w[] */ -COMP Sw[FFT_ENC]; /* DFT of current frame */ - -/* Globals used in decoder */ - -COMP Sw_[FFT_ENC]; /* DFT of all voiced synthesised signal */ -float Sn_[AW_DEC]; /* synthesised speech */ -float Pn[AW_DEC]; /* time domain Parzen (trapezoidal) window */ - diff --git a/gr-vocoder/lib/codec2/globals.h b/gr-vocoder/lib/codec2/globals.h deleted file mode 100644 index d01e7b4e92..0000000000 --- a/gr-vocoder/lib/codec2/globals.h +++ /dev/null @@ -1,47 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: globals.h - AUTHOR......: David Rowe - DATE CREATED: 1/11/94 - - Globals for sinusoidal speech coder. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -/* Globals used in encoder and decoder */ - -extern int frames; /* number of frames processed so far */ -extern float Sn[]; /* float input speech samples */ -extern MODEL model; /* model parameters for the current frame */ -extern int Nw; /* number of samples in analysis window */ -extern float sig; /* energy of current frame */ - -/* Globals used in encoder */ - -extern float w[]; /* time domain hamming window */ -extern COMP W[]; /* frequency domain hamming window */ -extern COMP Sw[]; /* DFT of current frame */ -extern COMP Sw_[]; /* DFT of all voiced synthesised signal */ - -/* Globals used in decoder */ - -extern float Sn_[]; /* output synthesised speech samples */ -extern float Pn[]; /* time domain Parzen (trapezoidal) window */ - diff --git a/gr-vocoder/lib/codec2/glottal.c b/gr-vocoder/lib/codec2/glottal.c deleted file mode 100644 index 8ac3ff4a93..0000000000 --- a/gr-vocoder/lib/codec2/glottal.c +++ /dev/null @@ -1,257 +0,0 @@ -const float glottal[]={ - 0.000000, - -0.057687, - -0.115338, - -0.172917, - -0.230385, - -0.287707, - -0.344845, - -0.401762, - -0.458419, - -0.514781, - -0.570809, - -0.626467, - -0.681721, - -0.736537, - -0.790884, - -0.844733, - -0.898057, - -0.950834, - -1.003044, - -1.054670, - -1.105700, - -1.156124, - -1.205936, - -1.255132, - -1.303711, - -1.351675, - -1.399026, - -1.445769, - -1.491908, - -1.537448, - -1.582393, - -1.626747, - -1.670514, - -1.713693, - -1.756285, - -1.798288, - -1.839697, - -1.880507, - -1.920712, - -1.960302, - -1.999269, - -2.037603, - -2.075295, - -2.112335, - -2.148716, - -2.184430, - -2.219472, - -2.253839, - -2.287531, - -2.320550, - -2.352900, - -2.384588, - -2.415623, - -2.446019, - -2.475788, - -2.504946, - -2.533512, - -2.561501, - -2.588934, - -2.615827, - -2.642198, - -2.668064, - -2.693439, - -2.718337, - -2.742767, - -2.766738, - -2.790256, - -2.813322, - -2.835936, - -2.858094, - -2.879790, - -2.901016, - -2.921759, - -2.942008, - -2.961747, - -2.980961, - -2.999632, - -3.017745, - -3.035282, - -3.052228, - -3.068567, - -3.084285, - -3.099371, - -3.113813, - -3.127605, - -3.140738, - 3.129975, - 3.118167, - 3.107022, - 3.096537, - 3.086709, - 3.077531, - 3.068996, - 3.061096, - 3.053821, - 3.047159, - 3.041102, - 3.035636, - 3.030753, - 3.026441, - 3.022690, - 3.019491, - 3.016836, - 3.014718, - 3.013132, - 3.012072, - 3.011535, - 3.011521, - 3.012028, - 3.013057, - 3.014612, - 3.016695, - 3.019310, - 3.022463, - 3.026160, - 3.030407, - 3.035212, - 3.040580, - 3.046520, - 3.053038, - 3.060141, - 3.067836, - 3.076128, - 3.085023, - 3.094525, - 3.104639, - 3.115367, - 3.126712, - 3.138674, - -3.131930, - -3.118731, - -3.104915, - -3.090485, - -3.075444, - -3.059795, - -3.043543, - -3.026695, - -3.009254, - -2.991229, - -2.972625, - -2.953449, - -2.933710, - -2.913414, - -2.892567, - -2.871176, - -2.849248, - -2.826787, - -2.803798, - -2.780284, - -2.756247, - -2.731689, - -2.706609, - -2.681005, - -2.654875, - -2.628213, - -2.601015, - -2.573272, - -2.544977, - -2.516121, - -2.486694, - -2.456686, - -2.426084, - -2.394879, - -2.363060, - -2.330616, - -2.297538, - -2.263816, - -2.229444, - -2.194416, - -2.158727, - -2.122375, - -2.085359, - -2.047682, - -2.009347, - -1.970361, - -1.930732, - -1.890470, - -1.849587, - -1.808098, - -1.766017, - -1.723360, - -1.680145, - -1.636388, - -1.592105, - -1.547313, - -1.502025, - -1.456256, - -1.410016, - -1.363314, - -1.316157, - -1.268547, - -1.220486, - -1.171971, - -1.122997, - -1.073555, - -1.023636, - -0.973227, - -0.922312, - -0.870875, - -0.818899, - -0.766366, - -0.713257, - -0.659554, - -0.605242, - -0.550303, - -0.494723, - -0.438492, - -0.381598, - -0.324036, - -0.265800, - -0.206889, - -0.147303, - -0.087046, - -0.026121, - 0.035463, - 0.097698, - 0.160576, - 0.224087, - 0.288221, - 0.352969, - 0.418323, - 0.484276, - 0.550822, - 0.617958, - 0.685681, - 0.753991, - 0.822889, - 0.892378, - 0.962462, - 1.033144, - 1.104430, - 1.176325, - 1.248833, - 1.321956, - 1.395696, - 1.470051, - 1.545019, - 1.620593, - 1.696763, - 1.773516, - 1.850837, - 1.928705, - 2.007097, - 2.085987, - 2.165347, - 2.245145, - 2.325347, - 2.405919, - 2.486824, - 2.568025, - 2.649485, - 2.731167, - 2.813033, - 2.895045, - 2.977167, - 3.059362}; diff --git a/gr-vocoder/lib/codec2/hanning.h b/gr-vocoder/lib/codec2/hanning.h deleted file mode 100644 index 81d88dcb35..0000000000 --- a/gr-vocoder/lib/codec2/hanning.h +++ /dev/null @@ -1,644 +0,0 @@ -/* Generated by hanning_file() Octave function */ - -const float hanning[]={ - 0, - 2.4171e-05, - 9.66816e-05, - 0.000217525, - 0.000386689, - 0.000604158, - 0.00086991, - 0.00118392, - 0.00154616, - 0.00195659, - 0.00241517, - 0.00292186, - 0.00347661, - 0.00407937, - 0.00473008, - 0.00542867, - 0.00617507, - 0.00696922, - 0.00781104, - 0.00870045, - 0.00963736, - 0.0106217, - 0.0116533, - 0.0127322, - 0.0138581, - 0.0150311, - 0.0162509, - 0.0175175, - 0.0188308, - 0.0201906, - 0.0215968, - 0.0230492, - 0.0245478, - 0.0260923, - 0.0276826, - 0.0293186, - 0.0310001, - 0.032727, - 0.034499, - 0.036316, - 0.0381779, - 0.0400844, - 0.0420354, - 0.0440307, - 0.04607, - 0.0481533, - 0.0502802, - 0.0524506, - 0.0546643, - 0.056921, - 0.0592206, - 0.0615627, - 0.0639473, - 0.0663741, - 0.0688427, - 0.0713531, - 0.0739048, - 0.0764978, - 0.0791318, - 0.0818064, - 0.0845214, - 0.0872767, - 0.0900718, - 0.0929066, - 0.0957807, - 0.0986939, - 0.101646, - 0.104636, - 0.107665, - 0.110732, - 0.113836, - 0.116978, - 0.120156, - 0.123372, - 0.126624, - 0.129912, - 0.133235, - 0.136594, - 0.139989, - 0.143418, - 0.146881, - 0.150379, - 0.153911, - 0.157476, - 0.161074, - 0.164705, - 0.168368, - 0.172063, - 0.17579, - 0.179549, - 0.183338, - 0.187158, - 0.191008, - 0.194888, - 0.198798, - 0.202737, - 0.206704, - 0.2107, - 0.214724, - 0.218775, - 0.222854, - 0.226959, - 0.231091, - 0.235249, - 0.239432, - 0.243641, - 0.247874, - 0.252132, - 0.256414, - 0.260719, - 0.265047, - 0.269398, - 0.273772, - 0.278167, - 0.282584, - 0.287021, - 0.29148, - 0.295958, - 0.300456, - 0.304974, - 0.30951, - 0.314065, - 0.318638, - 0.323228, - 0.327835, - 0.332459, - 0.3371, - 0.341756, - 0.346427, - 0.351113, - 0.355814, - 0.360528, - 0.365256, - 0.369997, - 0.374751, - 0.379516, - 0.384293, - 0.389082, - 0.393881, - 0.398691, - 0.40351, - 0.408338, - 0.413176, - 0.418022, - 0.422876, - 0.427737, - 0.432605, - 0.43748, - 0.44236, - 0.447247, - 0.452138, - 0.457034, - 0.461935, - 0.466839, - 0.471746, - 0.476655, - 0.481568, - 0.486481, - 0.491397, - 0.496313, - 0.501229, - 0.506145, - 0.511061, - 0.515976, - 0.520889, - 0.5258, - 0.530708, - 0.535614, - 0.540516, - 0.545414, - 0.550308, - 0.555197, - 0.560081, - 0.564958, - 0.56983, - 0.574695, - 0.579552, - 0.584402, - 0.589244, - 0.594077, - 0.598901, - 0.603715, - 0.60852, - 0.613314, - 0.618097, - 0.622868, - 0.627628, - 0.632375, - 0.63711, - 0.641831, - 0.646538, - 0.651232, - 0.655911, - 0.660574, - 0.665222, - 0.669855, - 0.67447, - 0.679069, - 0.683651, - 0.688215, - 0.69276, - 0.697287, - 0.701795, - 0.706284, - 0.710752, - 0.7152, - 0.719627, - 0.724033, - 0.728418, - 0.73278, - 0.73712, - 0.741437, - 0.74573, - 0.75, - 0.754246, - 0.758467, - 0.762663, - 0.766833, - 0.770978, - 0.775097, - 0.779189, - 0.783254, - 0.787291, - 0.791301, - 0.795283, - 0.799236, - 0.80316, - 0.807055, - 0.810921, - 0.814756, - 0.81856, - 0.822334, - 0.826077, - 0.829788, - 0.833468, - 0.837115, - 0.840729, - 0.844311, - 0.847859, - 0.851374, - 0.854855, - 0.858301, - 0.861713, - 0.86509, - 0.868431, - 0.871737, - 0.875007, - 0.87824, - 0.881437, - 0.884598, - 0.887721, - 0.890806, - 0.893854, - 0.896864, - 0.899835, - 0.902768, - 0.905661, - 0.908516, - 0.911331, - 0.914106, - 0.916841, - 0.919536, - 0.92219, - 0.924804, - 0.927376, - 0.929907, - 0.932397, - 0.934845, - 0.93725, - 0.939614, - 0.941935, - 0.944213, - 0.946448, - 0.94864, - 0.950789, - 0.952894, - 0.954955, - 0.956972, - 0.958946, - 0.960874, - 0.962759, - 0.964598, - 0.966393, - 0.968142, - 0.969846, - 0.971505, - 0.973118, - 0.974686, - 0.976207, - 0.977683, - 0.979112, - 0.980495, - 0.981832, - 0.983122, - 0.984365, - 0.985561, - 0.986711, - 0.987813, - 0.988868, - 0.989876, - 0.990837, - 0.99175, - 0.992616, - 0.993434, - 0.994204, - 0.994927, - 0.995601, - 0.996228, - 0.996807, - 0.997337, - 0.99782, - 0.998255, - 0.998641, - 0.998979, - 0.999269, - 0.999511, - 0.999704, - 0.999849, - 0.999946, - 0.999994, - 0.999994, - 0.999946, - 0.999849, - 0.999704, - 0.999511, - 0.999269, - 0.998979, - 0.998641, - 0.998255, - 0.99782, - 0.997337, - 0.996807, - 0.996228, - 0.995601, - 0.994927, - 0.994204, - 0.993434, - 0.992616, - 0.99175, - 0.990837, - 0.989876, - 0.988868, - 0.987813, - 0.986711, - 0.985561, - 0.984365, - 0.983122, - 0.981832, - 0.980495, - 0.979112, - 0.977683, - 0.976207, - 0.974686, - 0.973118, - 0.971505, - 0.969846, - 0.968142, - 0.966393, - 0.964598, - 0.962759, - 0.960874, - 0.958946, - 0.956972, - 0.954955, - 0.952894, - 0.950789, - 0.94864, - 0.946448, - 0.944213, - 0.941935, - 0.939614, - 0.93725, - 0.934845, - 0.932397, - 0.929907, - 0.927376, - 0.924804, - 0.92219, - 0.919536, - 0.916841, - 0.914106, - 0.911331, - 0.908516, - 0.905661, - 0.902768, - 0.899835, - 0.896864, - 0.893854, - 0.890806, - 0.887721, - 0.884598, - 0.881437, - 0.87824, - 0.875007, - 0.871737, - 0.868431, - 0.86509, - 0.861713, - 0.858301, - 0.854855, - 0.851374, - 0.847859, - 0.844311, - 0.840729, - 0.837115, - 0.833468, - 0.829788, - 0.826077, - 0.822334, - 0.81856, - 0.814756, - 0.810921, - 0.807055, - 0.80316, - 0.799236, - 0.795283, - 0.791301, - 0.787291, - 0.783254, - 0.779189, - 0.775097, - 0.770978, - 0.766833, - 0.762663, - 0.758467, - 0.754246, - 0.75, - 0.74573, - 0.741437, - 0.73712, - 0.73278, - 0.728418, - 0.724033, - 0.719627, - 0.7152, - 0.710752, - 0.706284, - 0.701795, - 0.697287, - 0.69276, - 0.688215, - 0.683651, - 0.679069, - 0.67447, - 0.669855, - 0.665222, - 0.660574, - 0.655911, - 0.651232, - 0.646538, - 0.641831, - 0.63711, - 0.632375, - 0.627628, - 0.622868, - 0.618097, - 0.613314, - 0.60852, - 0.603715, - 0.598901, - 0.594077, - 0.589244, - 0.584402, - 0.579552, - 0.574695, - 0.56983, - 0.564958, - 0.560081, - 0.555197, - 0.550308, - 0.545414, - 0.540516, - 0.535614, - 0.530708, - 0.5258, - 0.520889, - 0.515976, - 0.511061, - 0.506145, - 0.501229, - 0.496313, - 0.491397, - 0.486481, - 0.481568, - 0.476655, - 0.471746, - 0.466839, - 0.461935, - 0.457034, - 0.452138, - 0.447247, - 0.44236, - 0.43748, - 0.432605, - 0.427737, - 0.422876, - 0.418022, - 0.413176, - 0.408338, - 0.40351, - 0.398691, - 0.393881, - 0.389082, - 0.384293, - 0.379516, - 0.374751, - 0.369997, - 0.365256, - 0.360528, - 0.355814, - 0.351113, - 0.346427, - 0.341756, - 0.3371, - 0.332459, - 0.327835, - 0.323228, - 0.318638, - 0.314065, - 0.30951, - 0.304974, - 0.300456, - 0.295958, - 0.29148, - 0.287021, - 0.282584, - 0.278167, - 0.273772, - 0.269398, - 0.265047, - 0.260719, - 0.256414, - 0.252132, - 0.247874, - 0.243641, - 0.239432, - 0.235249, - 0.231091, - 0.226959, - 0.222854, - 0.218775, - 0.214724, - 0.2107, - 0.206704, - 0.202737, - 0.198798, - 0.194888, - 0.191008, - 0.187158, - 0.183338, - 0.179549, - 0.17579, - 0.172063, - 0.168368, - 0.164705, - 0.161074, - 0.157476, - 0.153911, - 0.150379, - 0.146881, - 0.143418, - 0.139989, - 0.136594, - 0.133235, - 0.129912, - 0.126624, - 0.123372, - 0.120156, - 0.116978, - 0.113836, - 0.110732, - 0.107665, - 0.104636, - 0.101646, - 0.0986939, - 0.0957807, - 0.0929066, - 0.0900718, - 0.0872767, - 0.0845214, - 0.0818064, - 0.0791318, - 0.0764978, - 0.0739048, - 0.0713531, - 0.0688427, - 0.0663741, - 0.0639473, - 0.0615627, - 0.0592206, - 0.056921, - 0.0546643, - 0.0524506, - 0.0502802, - 0.0481533, - 0.04607, - 0.0440307, - 0.0420354, - 0.0400844, - 0.0381779, - 0.036316, - 0.034499, - 0.032727, - 0.0310001, - 0.0293186, - 0.0276826, - 0.0260923, - 0.0245478, - 0.0230492, - 0.0215968, - 0.0201906, - 0.0188308, - 0.0175175, - 0.0162509, - 0.0150311, - 0.0138581, - 0.0127322, - 0.0116533, - 0.0106217, - 0.00963736, - 0.00870045, - 0.00781104, - 0.00696922, - 0.00617507, - 0.00542867, - 0.00473008, - 0.00407937, - 0.00347661, - 0.00292186, - 0.00241517, - 0.00195659, - 0.00154616, - 0.00118392, - 0.00086991, - 0.000604158, - 0.000386689, - 0.000217525, - 9.66816e-05, - 2.4171e-05, - 0 -}; diff --git a/gr-vocoder/lib/codec2/interp.c b/gr-vocoder/lib/codec2/interp.c deleted file mode 100644 index be89fc3154..0000000000 --- a/gr-vocoder/lib/codec2/interp.c +++ /dev/null @@ -1,323 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: interp.c - AUTHOR......: David Rowe - DATE CREATED: 9/10/09 - - Interpolation of 20ms frames to 10ms frames. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include <assert.h> -#include <math.h> -#include <string.h> -#include <stdio.h> - -#include "defines.h" -#include "interp.h" -#include "lsp.h" -#include "quantise.h" - -float sample_log_amp(MODEL *model, float w); - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: interp() - AUTHOR......: David Rowe - DATE CREATED: 22/8/10 - - Given two frames decribed by model parameters 20ms apart, determines - the model parameters of the 10ms frame between them. Assumes - voicing is available for middle (interpolated) frame. Outputs are - amplitudes and Wo for the interpolated frame. - - This version can interpolate the amplitudes between two frames of - different Wo and L. - - This version works by log linear interpolation, but listening tests - showed it creates problems in background noise, e.g. hts2a and mmt1. - When this function is used (--dec mode) bg noise appears to be - amplitude modulated, and gets louder. The interp_lsp() function - below seems to do a better job. - -\*---------------------------------------------------------------------------*/ - -void interpolate( - MODEL *interp, /* interpolated model params */ - MODEL *prev, /* previous frames model params */ - MODEL *next /* next frames model params */ -) -{ - int l; - float w,log_amp; - - /* Wo depends on voicing of this and adjacent frames */ - - if (interp->voiced) { - if (prev->voiced && next->voiced) - interp->Wo = (prev->Wo + next->Wo)/2.0; - if (!prev->voiced && next->voiced) - interp->Wo = next->Wo; - if (prev->voiced && !next->voiced) - interp->Wo = prev->Wo; - } - else { - interp->Wo = TWO_PI/P_MAX; - } - interp->L = PI/interp->Wo; - - /* Interpolate amplitudes using linear interpolation in log domain */ - - for(l=1; l<=interp->L; l++) { - w = l*interp->Wo; - log_amp = (sample_log_amp(prev, w) + sample_log_amp(next, w))/2.0; - interp->A[l] = pow(10.0, log_amp); - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: sample_log_amp() - AUTHOR......: David Rowe - DATE CREATED: 22/8/10 - - Samples the amplitude envelope at an arbitrary frequency w. Uses - linear interpolation in the log domain to sample between harmonic - amplitudes. - -\*---------------------------------------------------------------------------*/ - -float sample_log_amp(MODEL *model, float w) -{ - int m; - float f, log_amp; - - assert(w > 0.0); assert (w <= PI); - - m = floorf(w/model->Wo + 0.5); - f = (w - m*model->Wo)/w; - assert(f <= 1.0); - - if (m < 1) { - log_amp = f*log10f(model->A[1] + 1E-6); - } - else if ((m+1) > model->L) { - log_amp = (1.0-f)*log10f(model->A[model->L] + 1E-6); - } - else { - log_amp = (1.0-f)*log10f(model->A[m] + 1E-6) + - f*log10f(model->A[m+1] + 1E-6); - } - - return log_amp; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: interp_lsp() - AUTHOR......: David Rowe - DATE CREATED: 10 Nov 2010 - - Given two frames decribed by model parameters 20ms apart, determines - the model parameters of the 10ms frame between them. Assumes - voicing is available for middle (interpolated) frame. Outputs are - amplitudes and Wo for the interpolated frame. - - This version uses interpolation of LSPs, seems to do a better job - with bg noise. - -\*---------------------------------------------------------------------------*/ - -void interpolate_lsp( - kiss_fft_cfg fft_fwd_cfg, - MODEL *interp, /* interpolated model params */ - MODEL *prev, /* previous frames model params */ - MODEL *next, /* next frames model params */ - float *prev_lsps, /* previous frames LSPs */ - float prev_e, /* previous frames LPC energy */ - float *next_lsps, /* next frames LSPs */ - float next_e, /* next frames LPC energy */ - float *ak_interp, /* interpolated aks for this frame */ - float *lsps_interp/* interpolated lsps for this frame */ -) -{ - int i; - float e; - float snr; - - /* trap corner case where V est is probably wrong */ - - if (interp->voiced && !prev->voiced && !next->voiced) { - interp->voiced = 0; - } - - /* Wo depends on voicing of this and adjacent frames */ - - if (interp->voiced) { - if (prev->voiced && next->voiced) - interp->Wo = (prev->Wo + next->Wo)/2.0; - if (!prev->voiced && next->voiced) - interp->Wo = next->Wo; - if (prev->voiced && !next->voiced) - interp->Wo = prev->Wo; - } - else { - interp->Wo = TWO_PI/P_MAX; - } - interp->L = PI/interp->Wo; - - //printf(" interp: prev_v: %d next_v: %d prev_Wo: %f next_Wo: %f\n", - // prev->voiced, next->voiced, prev->Wo, next->Wo); - //printf(" interp: Wo: %1.5f L: %d\n", interp->Wo, interp->L); - - /* interpolate LSPs */ - - for(i=0; i<LPC_ORD; i++) { - lsps_interp[i] = (prev_lsps[i] + next_lsps[i])/2.0; - } - - /* Interpolate LPC energy in log domain */ - - e = powf(10.0, (log10f(prev_e) + log10f(next_e))/2.0); - //printf(" interp: e: %f\n", e); - - /* convert back to amplitudes */ - - lsp_to_lpc(lsps_interp, ak_interp, LPC_ORD); - aks_to_M2(fft_fwd_cfg, ak_interp, LPC_ORD, interp, e, &snr, 0, 0, 1, 1, LPCPF_BETA, LPCPF_GAMMA); - //printf(" interp: ak[1]: %f A[1] %f\n", ak_interp[1], interp->A[1]); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: interp_Wo() - AUTHOR......: David Rowe - DATE CREATED: 22 May 2012 - - Interpolates centre 10ms sample of Wo and L samples given two - samples 20ms apart. Assumes voicing is available for centre - (interpolated) frame. - -\*---------------------------------------------------------------------------*/ - -void interp_Wo( - MODEL *interp, /* interpolated model params */ - MODEL *prev, /* previous frames model params */ - MODEL *next /* next frames model params */ - ) -{ - interp_Wo2(interp, prev, next, 0.5); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: interp_Wo2() - AUTHOR......: David Rowe - DATE CREATED: 22 May 2012 - - Weighted interpolation of two Wo samples. - -\*---------------------------------------------------------------------------*/ - -void interp_Wo2( - MODEL *interp, /* interpolated model params */ - MODEL *prev, /* previous frames model params */ - MODEL *next, /* next frames model params */ - float weight -) -{ - /* trap corner case where voicing est is probably wrong */ - - if (interp->voiced && !prev->voiced && !next->voiced) { - interp->voiced = 0; - } - - /* Wo depends on voicing of this and adjacent frames */ - - if (interp->voiced) { - if (prev->voiced && next->voiced) - interp->Wo = (1.0 - weight)*prev->Wo + weight*next->Wo; - if (!prev->voiced && next->voiced) - interp->Wo = next->Wo; - if (prev->voiced && !next->voiced) - interp->Wo = prev->Wo; - } - else { - interp->Wo = TWO_PI/P_MAX; - } - interp->L = PI/interp->Wo; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: interp_energy() - AUTHOR......: David Rowe - DATE CREATED: 22 May 2012 - - Interpolates centre 10ms sample of energy given two samples 20ms - apart. - -\*---------------------------------------------------------------------------*/ - -float interp_energy(float prev_e, float next_e) -{ - return powf(10.0, (log10f(prev_e) + log10f(next_e))/2.0); - -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: interp_energy2() - AUTHOR......: David Rowe - DATE CREATED: 22 May 2012 - - Interpolates centre 10ms sample of energy given two samples 20ms - apart. - -\*---------------------------------------------------------------------------*/ - -float interp_energy2(float prev_e, float next_e, float weight) -{ - return powf(10.0, (1.0 - weight)*log10f(prev_e) + weight*log10f(next_e)); - -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: interpolate_lsp_ver2() - AUTHOR......: David Rowe - DATE CREATED: 22 May 2012 - - Weighted interpolation of LSPs. - -\*---------------------------------------------------------------------------*/ - -void interpolate_lsp_ver2(float interp[], float prev[], float next[], float weight) -{ - int i; - - for(i=0; i<LPC_ORD; i++) - interp[i] = (1.0 - weight)*prev[i] + weight*next[i]; -} - diff --git a/gr-vocoder/lib/codec2/interp.h b/gr-vocoder/lib/codec2/interp.h deleted file mode 100644 index 24cb9462a3..0000000000 --- a/gr-vocoder/lib/codec2/interp.h +++ /dev/null @@ -1,45 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: interp.h - AUTHOR......: David Rowe - DATE CREATED: 9/10/09 - - Interpolation of 20ms frames to 10ms frames. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __INTERP__ -#define __INTERP__ - -#include "kiss_fft.h" - -void interpolate(MODEL *interp, MODEL *prev, MODEL *next); -void interpolate_lsp(kiss_fft_cfg fft_dec_cfg, - MODEL *interp, MODEL *prev, MODEL *next, - float *prev_lsps, float prev_e, - float *next_lsps, float next_e, - float *ak_interp, float *lsps_interp); -void interp_Wo(MODEL *interp, MODEL *prev, MODEL *next); -void interp_Wo2(MODEL *interp, MODEL *prev, MODEL *next, float weight); -float interp_energy(float prev, float next); -float interp_energy2(float prev, float next, float weight); -void interpolate_lsp_ver2(float interp[], float prev[], float next[], float weight); - -#endif diff --git a/gr-vocoder/lib/codec2/kiss_fft.c b/gr-vocoder/lib/codec2/kiss_fft.c deleted file mode 100644 index 17b4e72112..0000000000 --- a/gr-vocoder/lib/codec2/kiss_fft.c +++ /dev/null @@ -1,408 +0,0 @@ -/* -Copyright (c) 2003-2010, Mark Borgerding - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the author nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - - -#include "_kiss_fft_guts.h" -/* The guts header contains all the multiplication and addition macros that are defined for - fixed or floating point complex numbers. It also delares the kf_ internal functions. - */ - -static void kf_bfly2( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m - ) -{ - kiss_fft_cpx * Fout2; - kiss_fft_cpx * tw1 = st->twiddles; - kiss_fft_cpx t; - Fout2 = Fout + m; - do{ - C_FIXDIV(*Fout,2); C_FIXDIV(*Fout2,2); - - C_MUL (t, *Fout2 , *tw1); - tw1 += fstride; - C_SUB( *Fout2 , *Fout , t ); - C_ADDTO( *Fout , t ); - ++Fout2; - ++Fout; - }while (--m); -} - -static void kf_bfly4( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - const size_t m - ) -{ - kiss_fft_cpx *tw1,*tw2,*tw3; - kiss_fft_cpx scratch[6]; - size_t k=m; - const size_t m2=2*m; - const size_t m3=3*m; - - - tw3 = tw2 = tw1 = st->twiddles; - - do { - C_FIXDIV(*Fout,4); C_FIXDIV(Fout[m],4); C_FIXDIV(Fout[m2],4); C_FIXDIV(Fout[m3],4); - - C_MUL(scratch[0],Fout[m] , *tw1 ); - C_MUL(scratch[1],Fout[m2] , *tw2 ); - C_MUL(scratch[2],Fout[m3] , *tw3 ); - - C_SUB( scratch[5] , *Fout, scratch[1] ); - C_ADDTO(*Fout, scratch[1]); - C_ADD( scratch[3] , scratch[0] , scratch[2] ); - C_SUB( scratch[4] , scratch[0] , scratch[2] ); - C_SUB( Fout[m2], *Fout, scratch[3] ); - tw1 += fstride; - tw2 += fstride*2; - tw3 += fstride*3; - C_ADDTO( *Fout , scratch[3] ); - - if(st->inverse) { - Fout[m].r = scratch[5].r - scratch[4].i; - Fout[m].i = scratch[5].i + scratch[4].r; - Fout[m3].r = scratch[5].r + scratch[4].i; - Fout[m3].i = scratch[5].i - scratch[4].r; - }else{ - Fout[m].r = scratch[5].r + scratch[4].i; - Fout[m].i = scratch[5].i - scratch[4].r; - Fout[m3].r = scratch[5].r - scratch[4].i; - Fout[m3].i = scratch[5].i + scratch[4].r; - } - ++Fout; - }while(--k); -} - -static void kf_bfly3( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - size_t m - ) -{ - size_t k=m; - const size_t m2 = 2*m; - kiss_fft_cpx *tw1,*tw2; - kiss_fft_cpx scratch[5]; - kiss_fft_cpx epi3; - epi3 = st->twiddles[fstride*m]; - - tw1=tw2=st->twiddles; - - do{ - C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); - - C_MUL(scratch[1],Fout[m] , *tw1); - C_MUL(scratch[2],Fout[m2] , *tw2); - - C_ADD(scratch[3],scratch[1],scratch[2]); - C_SUB(scratch[0],scratch[1],scratch[2]); - tw1 += fstride; - tw2 += fstride*2; - - Fout[m].r = Fout->r - HALF_OF(scratch[3].r); - Fout[m].i = Fout->i - HALF_OF(scratch[3].i); - - C_MULBYSCALAR( scratch[0] , epi3.i ); - - C_ADDTO(*Fout,scratch[3]); - - Fout[m2].r = Fout[m].r + scratch[0].i; - Fout[m2].i = Fout[m].i - scratch[0].r; - - Fout[m].r -= scratch[0].i; - Fout[m].i += scratch[0].r; - - ++Fout; - }while(--k); -} - -static void kf_bfly5( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m - ) -{ - kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; - int u; - kiss_fft_cpx scratch[13]; - kiss_fft_cpx * twiddles = st->twiddles; - kiss_fft_cpx *tw; - kiss_fft_cpx ya,yb; - ya = twiddles[fstride*m]; - yb = twiddles[fstride*2*m]; - - Fout0=Fout; - Fout1=Fout0+m; - Fout2=Fout0+2*m; - Fout3=Fout0+3*m; - Fout4=Fout0+4*m; - - tw=st->twiddles; - for ( u=0; u<m; ++u ) { - C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5); - scratch[0] = *Fout0; - - C_MUL(scratch[1] ,*Fout1, tw[u*fstride]); - C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]); - C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]); - C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]); - - C_ADD( scratch[7],scratch[1],scratch[4]); - C_SUB( scratch[10],scratch[1],scratch[4]); - C_ADD( scratch[8],scratch[2],scratch[3]); - C_SUB( scratch[9],scratch[2],scratch[3]); - - Fout0->r += scratch[7].r + scratch[8].r; - Fout0->i += scratch[7].i + scratch[8].i; - - scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); - scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); - - scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); - scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); - - C_SUB(*Fout1,scratch[5],scratch[6]); - C_ADD(*Fout4,scratch[5],scratch[6]); - - scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); - scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); - scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); - scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); - - C_ADD(*Fout2,scratch[11],scratch[12]); - C_SUB(*Fout3,scratch[11],scratch[12]); - - ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; - } -} - -/* perform the butterfly for one stage of a mixed radix FFT */ -static void kf_bfly_generic( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m, - int p - ) -{ - int u,k,q1,q; - kiss_fft_cpx * twiddles = st->twiddles; - kiss_fft_cpx t; - int Norig = st->nfft; - - kiss_fft_cpx * scratch = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC(sizeof(kiss_fft_cpx)*p); - - for ( u=0; u<m; ++u ) { - k=u; - for ( q1=0 ; q1<p ; ++q1 ) { - scratch[q1] = Fout[ k ]; - C_FIXDIV(scratch[q1],p); - k += m; - } - - k=u; - for ( q1=0 ; q1<p ; ++q1 ) { - int twidx=0; - Fout[ k ] = scratch[0]; - for (q=1;q<p;++q ) { - twidx += fstride * k; - if (twidx>=Norig) twidx-=Norig; - C_MUL(t,scratch[q] , twiddles[twidx] ); - C_ADDTO( Fout[ k ] ,t); - } - k += m; - } - } - KISS_FFT_TMP_FREE(scratch); -} - -static -void kf_work( - kiss_fft_cpx * Fout, - const kiss_fft_cpx * f, - const size_t fstride, - int in_stride, - int * factors, - const kiss_fft_cfg st - ) -{ - kiss_fft_cpx * Fout_beg=Fout; - const int p=*factors++; /* the radix */ - const int m=*factors++; /* stage's fft length/p */ - const kiss_fft_cpx * Fout_end = Fout + p*m; - -#ifdef _OPENMP - // use openmp extensions at the - // top-level (not recursive) - if (fstride==1 && p<=5) - { - int k; - - // execute the p different work units in different threads -# pragma omp parallel for - for (k=0;k<p;++k) - kf_work( Fout +k*m, f+ fstride*in_stride*k,fstride*p,in_stride,factors,st); - // all threads have joined by this point - - switch (p) { - case 2: kf_bfly2(Fout,fstride,st,m); break; - case 3: kf_bfly3(Fout,fstride,st,m); break; - case 4: kf_bfly4(Fout,fstride,st,m); break; - case 5: kf_bfly5(Fout,fstride,st,m); break; - default: kf_bfly_generic(Fout,fstride,st,m,p); break; - } - return; - } -#endif - - if (m==1) { - do{ - *Fout = *f; - f += fstride*in_stride; - }while(++Fout != Fout_end ); - }else{ - do{ - // recursive call: - // DFT of size m*p performed by doing - // p instances of smaller DFTs of size m, - // each one takes a decimated version of the input - kf_work( Fout , f, fstride*p, in_stride, factors,st); - f += fstride*in_stride; - }while( (Fout += m) != Fout_end ); - } - - Fout=Fout_beg; - - // recombine the p smaller DFTs - switch (p) { - case 2: kf_bfly2(Fout,fstride,st,m); break; - case 3: kf_bfly3(Fout,fstride,st,m); break; - case 4: kf_bfly4(Fout,fstride,st,m); break; - case 5: kf_bfly5(Fout,fstride,st,m); break; - default: kf_bfly_generic(Fout,fstride,st,m,p); break; - } -} - -/* facbuf is populated by p1,m1,p2,m2, ... - where - p[i] * m[i] = m[i-1] - m0 = n */ -static -void kf_factor(int n,int * facbuf) -{ - int p=4; - double floor_sqrt; - floor_sqrt = floor( sqrt((double)n) ); - - /*factor out powers of 4, powers of 2, then any remaining primes */ - do { - while (n % p) { - switch (p) { - case 4: p = 2; break; - case 2: p = 3; break; - default: p += 2; break; - } - if (p > floor_sqrt) - p = n; /* no more factors, skip to end */ - } - n /= p; - *facbuf++ = p; - *facbuf++ = n; - } while (n > 1); -} - -/* - * - * User-callable function to allocate all necessary storage space for the fft. - * - * The return value is a contiguous block of memory, allocated with malloc. As such, - * It can be freed with free(), rather than a kiss_fft-specific function. - * */ -kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) -{ - kiss_fft_cfg st=NULL; - size_t memneeded = sizeof(struct kiss_fft_state) - + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ - - if ( lenmem==NULL ) { - st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); - }else{ - if (mem != NULL && *lenmem >= memneeded) - st = (kiss_fft_cfg)mem; - *lenmem = memneeded; - } - if (st) { - int i; - st->nfft=nfft; - st->inverse = inverse_fft; - - for (i=0;i<nfft;++i) { - const double pi=3.141592653589793238462643383279502884197169399375105820974944; - double phase = -2*pi*i / nfft; - if (st->inverse) - phase *= -1; - kf_cexp(st->twiddles+i, phase ); - } - - kf_factor(nfft,st->factors); - } - return st; -} - - -void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) -{ - if (fin == fout) { - //NOTE: this is not really an in-place FFT algorithm. - //It just performs an out-of-place FFT into a temp buffer - kiss_fft_cpx * tmpbuf = (kiss_fft_cpx*)KISS_FFT_TMP_ALLOC( sizeof(kiss_fft_cpx)*st->nfft); - kf_work(tmpbuf,fin,1,in_stride, st->factors,st); - memcpy(fout,tmpbuf,sizeof(kiss_fft_cpx)*st->nfft); - KISS_FFT_TMP_FREE(tmpbuf); - }else{ - kf_work( fout, fin, 1,in_stride, st->factors,st ); - } -} - -void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) -{ - kiss_fft_stride(cfg,fin,fout,1); -} - - -void kiss_fft_cleanup(void) -{ - // nothing needed any more -} - -int kiss_fft_next_fast_size(int n) -{ - while(1) { - int m=n; - while ( (m%2) == 0 ) m/=2; - while ( (m%3) == 0 ) m/=3; - while ( (m%5) == 0 ) m/=5; - if (m<=1) - break; /* n is completely factorable by twos, threes, and fives */ - n++; - } - return n; -} diff --git a/gr-vocoder/lib/codec2/kiss_fft.h b/gr-vocoder/lib/codec2/kiss_fft.h deleted file mode 100644 index c01722cad7..0000000000 --- a/gr-vocoder/lib/codec2/kiss_fft.h +++ /dev/null @@ -1,124 +0,0 @@ -#ifndef KISS_FFT_H -#define KISS_FFT_H - -#include <stdlib.h> -#include <stdio.h> -#include <math.h> -#include <string.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - ATTENTION! - If you would like a : - -- a utility that will handle the caching of fft objects - -- real-only (no imaginary time component ) FFT - -- a multi-dimensional FFT - -- a command-line utility to perform ffts - -- a command-line utility to perform fast-convolution filtering - - Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c - in the tools/ directory. -*/ - -#ifdef USE_SIMD -# include <xmmintrin.h> -# define kiss_fft_scalar __m128 -#define KISS_FFT_MALLOC(nbytes) _mm_malloc(nbytes,16) -#define KISS_FFT_FREE _mm_free -#else -#define KISS_FFT_MALLOC malloc -#define KISS_FFT_FREE free -#endif - - -#ifdef FIXED_POINT -#include <sys/types.h> -# if (FIXED_POINT == 32) -# define kiss_fft_scalar int32_t -# else -# define kiss_fft_scalar int16_t -# endif -#else -# ifndef kiss_fft_scalar -/* default is float */ -# define kiss_fft_scalar float -# endif -#endif - -typedef struct { - kiss_fft_scalar r; - kiss_fft_scalar i; -}kiss_fft_cpx; - -typedef struct kiss_fft_state* kiss_fft_cfg; - -/* - * kiss_fft_alloc - * - * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. - * - * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); - * - * The return value from fft_alloc is a cfg buffer used internally - * by the fft routine or NULL. - * - * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. - * The returned value should be free()d when done to avoid memory leaks. - * - * The state can be placed in a user supplied buffer 'mem': - * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, - * then the function places the cfg in mem and the size used in *lenmem - * and returns mem. - * - * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), - * then the function returns NULL and places the minimum cfg - * buffer size in *lenmem. - * */ - -kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); - -/* - * kiss_fft(cfg,in_out_buf) - * - * Perform an FFT on a complex input buffer. - * for a forward FFT, - * fin should be f[0] , f[1] , ... ,f[nfft-1] - * fout will be F[0] , F[1] , ... ,F[nfft-1] - * Note that each element is complex and can be accessed like - f[k].r and f[k].i - * */ -void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); - -/* - A more generic version of the above function. It reads its input from every Nth sample. - * */ -void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); - -/* If kiss_fft_alloc allocated a buffer, it is one contiguous - buffer and can be simply free()d when no longer needed*/ -#define kiss_fft_free free - -/* - Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up - your compiler output to call this before you exit. -*/ -void kiss_fft_cleanup(void); - - -/* - * Returns the smallest integer k, such that k>=n and k has only "fast" factors (2,3,5) - */ -int kiss_fft_next_fast_size(int n); - -/* for real ffts, we need an even size */ -#define kiss_fftr_next_fast_size_real(n) \ - (kiss_fft_next_fast_size( ((n)+1)>>1)<<1) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/gr-vocoder/lib/codec2/lpc.c b/gr-vocoder/lib/codec2/lpc.c deleted file mode 100644 index 9a730eb4ad..0000000000 --- a/gr-vocoder/lib/codec2/lpc.c +++ /dev/null @@ -1,309 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: lpc.c - AUTHOR......: David Rowe - DATE CREATED: 30 Sep 1990 (!) - - Linear Prediction functions written in C. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009-2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#define LPC_MAX_N 512 /* maximum no. of samples in frame */ -#define PI 3.141592654 /* mathematical constant */ - -#define ALPHA 1.0 -#define BETA 0.94 - -#include <assert.h> -#include <math.h> -#include "defines.h" -#include "lpc.h" - -/*---------------------------------------------------------------------------*\ - - pre_emp() - - Pre-emphasise (high pass filter with zero close to 0 Hz) a frame of - speech samples. Helps reduce dynamic range of LPC spectrum, giving - greater weight and hensea better match to low energy formants. - - Should be balanced by de-emphasis of the output speech. - -\*---------------------------------------------------------------------------*/ - -void pre_emp( - float Sn_pre[], /* output frame of speech samples */ - float Sn[], /* input frame of speech samples */ - float *mem, /* Sn[-1]single sample memory */ - int Nsam /* number of speech samples to use */ -) -{ - int i; - - for(i=0; i<Nsam; i++) { - Sn_pre[i] = Sn[i] - ALPHA * mem[0]; - mem[0] = Sn[i]; - } - -} - - -/*---------------------------------------------------------------------------*\ - - de_emp() - - De-emphasis filter (low pass filter with polse close to 0 Hz). - -\*---------------------------------------------------------------------------*/ - -void de_emp( - float Sn_de[], /* output frame of speech samples */ - float Sn[], /* input frame of speech samples */ - float *mem, /* Sn[-1]single sample memory */ - int Nsam /* number of speech samples to use */ -) -{ - int i; - - for(i=0; i<Nsam; i++) { - Sn_de[i] = Sn[i] + BETA * mem[0]; - mem[0] = Sn_de[i]; - } - -} - - -/*---------------------------------------------------------------------------*\ - - hanning_window() - - Hanning windows a frame of speech samples. - -\*---------------------------------------------------------------------------*/ - -void hanning_window( - float Sn[], /* input frame of speech samples */ - float Wn[], /* output frame of windowed samples */ - int Nsam /* number of samples */ -) -{ - int i; /* loop variable */ - - for(i=0; i<Nsam; i++) - Wn[i] = Sn[i]*(0.5 - 0.5*cosf(2*PI*(float)i/(Nsam-1))); -} - -/*---------------------------------------------------------------------------*\ - - autocorrelate() - - Finds the first P autocorrelation values of an array of windowed speech - samples Sn[]. - -\*---------------------------------------------------------------------------*/ - -void autocorrelate( - float Sn[], /* frame of Nsam windowed speech samples */ - float Rn[], /* array of P+1 autocorrelation coefficients */ - int Nsam, /* number of windowed samples to use */ - int order /* order of LPC analysis */ -) -{ - int i,j; /* loop variables */ - - for(j=0; j<order+1; j++) { - Rn[j] = 0.0; - for(i=0; i<Nsam-j; i++) - Rn[j] += Sn[i]*Sn[i+j]; - } -} - -/*---------------------------------------------------------------------------*\ - - levinson_durbin() - - Given P+1 autocorrelation coefficients, finds P Linear Prediction Coeff. - (LPCs) where P is the order of the LPC all-pole model. The Levinson-Durbin - algorithm is used, and is described in: - - J. Makhoul - "Linear prediction, a tutorial review" - Proceedings of the IEEE - Vol-63, No. 4, April 1975 - -\*---------------------------------------------------------------------------*/ - -void levinson_durbin( - float R[], /* order+1 autocorrelation coeff */ - float lpcs[], /* order+1 LPC's */ - int order /* order of the LPC analysis */ -) -{ - float E[LPC_MAX+1]; - float k[LPC_MAX+1]; - float a[LPC_MAX+1][LPC_MAX+1]; - float sum; - int i,j; /* loop variables */ - - E[0] = R[0]; /* Equation 38a, Makhoul */ - - for(i=1; i<=order; i++) { - sum = 0.0; - for(j=1; j<=i-1; j++) - sum += a[i-1][j]*R[i-j]; - k[i] = -1.0*(R[i] + sum)/E[i-1]; /* Equation 38b, Makhoul */ - if (fabsf(k[i]) > 1.0) - k[i] = 0.0; - - a[i][i] = k[i]; - - for(j=1; j<=i-1; j++) - a[i][j] = a[i-1][j] + k[i]*a[i-1][i-j]; /* Equation 38c, Makhoul */ - - E[i] = (1-k[i]*k[i])*E[i-1]; /* Equation 38d, Makhoul */ - } - - for(i=1; i<=order; i++) - lpcs[i] = a[order][i]; - lpcs[0] = 1.0; -} - -/*---------------------------------------------------------------------------*\ - - inverse_filter() - - Inverse Filter, A(z). Produces an array of residual samples from an array - of input samples and linear prediction coefficients. - - The filter memory is stored in the first order samples of the input array. - -\*---------------------------------------------------------------------------*/ - -void inverse_filter( - float Sn[], /* Nsam input samples */ - float a[], /* LPCs for this frame of samples */ - int Nsam, /* number of samples */ - float res[], /* Nsam residual samples */ - int order /* order of LPC */ -) -{ - int i,j; /* loop variables */ - - for(i=0; i<Nsam; i++) { - res[i] = 0.0; - for(j=0; j<=order; j++) - res[i] += Sn[i-j]*a[j]; - } -} - -/*---------------------------------------------------------------------------*\ - - synthesis_filter() - - C version of the Speech Synthesis Filter, 1/A(z). Given an array of - residual or excitation samples, and the the LP filter coefficients, this - function will produce an array of speech samples. This filter structure is - IIR. - - The synthesis filter has memory as well, this is treated in the same way - as the memory for the inverse filter (see inverse_filter() notes above). - The difference is that the memory for the synthesis filter is stored in - the output array, wheras the memory of the inverse filter is stored in the - input array. - - Note: the calling function must update the filter memory. - -\*---------------------------------------------------------------------------*/ - -void synthesis_filter( - float res[], /* Nsam input residual (excitation) samples */ - float a[], /* LPCs for this frame of speech samples */ - int Nsam, /* number of speech samples */ - int order, /* LPC order */ - float Sn_[] /* Nsam output synthesised speech samples */ -) -{ - int i,j; /* loop variables */ - - /* Filter Nsam samples */ - - for(i=0; i<Nsam; i++) { - Sn_[i] = res[i]*a[0]; - for(j=1; j<=order; j++) - Sn_[i] -= Sn_[i-j]*a[j]; - } -} - -/*---------------------------------------------------------------------------*\ - - find_aks() - - This function takes a frame of samples, and determines the linear - prediction coefficients for that frame of samples. - -\*---------------------------------------------------------------------------*/ - -void find_aks( - float Sn[], /* Nsam samples with order sample memory */ - float a[], /* order+1 LPCs with first coeff 1.0 */ - int Nsam, /* number of input speech samples */ - int order, /* order of the LPC analysis */ - float *E /* residual energy */ -) -{ - float Wn[LPC_MAX_N]; /* windowed frame of Nsam speech samples */ - float R[LPC_MAX+1]; /* order+1 autocorrelation values of Sn[] */ - int i; - - assert(order < LPC_MAX); - assert(Nsam < LPC_MAX_N); - - hanning_window(Sn,Wn,Nsam); - autocorrelate(Wn,R,Nsam,order); - levinson_durbin(R,a,order); - - *E = 0.0; - for(i=0; i<=order; i++) - *E += a[i]*R[i]; - if (*E < 0.0) - *E = 1E-12; -} - -/*---------------------------------------------------------------------------*\ - - weight() - - Weights a vector of LPCs. - -\*---------------------------------------------------------------------------*/ - -void weight( - float ak[], /* vector of order+1 LPCs */ - float gamma, /* weighting factor */ - int order, /* num LPCs (excluding leading 1.0) */ - float akw[] /* weighted vector of order+1 LPCs */ -) -{ - int i; - - for(i=1; i<=order; i++) - akw[i] = ak[i]*powf(gamma,(float)i); -} - diff --git a/gr-vocoder/lib/codec2/lpc.h b/gr-vocoder/lib/codec2/lpc.h deleted file mode 100644 index 482aa1fff5..0000000000 --- a/gr-vocoder/lib/codec2/lpc.h +++ /dev/null @@ -1,43 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: lpc.h - AUTHOR......: David Rowe - DATE CREATED: 24/8/09 - - Linear Prediction functions written in C. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009-2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __LPC__ -#define __LPC__ - -#define LPC_MAX_ORDER 20 - -void pre_emp(float Sn_pre[], float Sn[], float *mem, int Nsam); -void de_emp(float Sn_se[], float Sn[], float *mem, int Nsam); -void hanning_window(float Sn[], float Wn[], int Nsam); -void autocorrelate(float Sn[], float Rn[], int Nsam, int order); -void levinson_durbin(float R[], float lpcs[], int order); -void inverse_filter(float Sn[], float a[], int Nsam, float res[], int order); -void synthesis_filter(float res[], float a[], int Nsam, int order, float Sn_[]); -void find_aks(float Sn[], float a[], int Nsam, int order, float *E); -void weight(float ak[], float gamma, int order, float akw[]); - -#endif diff --git a/gr-vocoder/lib/codec2/lsp.c b/gr-vocoder/lib/codec2/lsp.c deleted file mode 100644 index 3f34444e33..0000000000 --- a/gr-vocoder/lib/codec2/lsp.c +++ /dev/null @@ -1,325 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: lsp.c - AUTHOR......: David Rowe - DATE CREATED: 24/2/93 - - - This file contains functions for LPC to LSP conversion and LSP to - LPC conversion. Note that the LSP coefficients are not in radians - format but in the x domain of the unit circle. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "defines.h" -#include "lsp.h" -#include <math.h> -#include <stdio.h> -#include <stdlib.h> - -/* Only 10 gets used, so far. */ -#define LSP_MAX_ORDER 20 - -/*---------------------------------------------------------------------------*\ - - Introduction to Line Spectrum Pairs (LSPs) - ------------------------------------------ - - LSPs are used to encode the LPC filter coefficients {ak} for - transmission over the channel. LSPs have several properties (like - less sensitivity to quantisation noise) that make them superior to - direct quantisation of {ak}. - - A(z) is a polynomial of order lpcrdr with {ak} as the coefficients. - - A(z) is transformed to P(z) and Q(z) (using a substitution and some - algebra), to obtain something like: - - A(z) = 0.5[P(z)(z+z^-1) + Q(z)(z-z^-1)] (1) - - As you can imagine A(z) has complex zeros all over the z-plane. P(z) - and Q(z) have the very neat property of only having zeros _on_ the - unit circle. So to find them we take a test point z=exp(jw) and - evaluate P (exp(jw)) and Q(exp(jw)) using a grid of points between 0 - and pi. - - The zeros (roots) of P(z) also happen to alternate, which is why we - swap coefficients as we find roots. So the process of finding the - LSP frequencies is basically finding the roots of 5th order - polynomials. - - The root so P(z) and Q(z) occur in symmetrical pairs at +/-w, hence - the name Line Spectrum Pairs (LSPs). - - To convert back to ak we just evaluate (1), "clocking" an impulse - thru it lpcrdr times gives us the impulse response of A(z) which is - {ak}. - -\*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: cheb_poly_eva() - AUTHOR......: David Rowe - DATE CREATED: 24/2/93 - - This function evalutes a series of chebyshev polynomials - - FIXME: performing memory allocation at run time is very inefficient, - replace with stack variables of MAX_P size. - -\*---------------------------------------------------------------------------*/ - - -static float -cheb_poly_eva(float *coef,float x,int m) -/* float coef[] coefficients of the polynomial to be evaluated */ -/* float x the point where polynomial is to be evaluated */ -/* int m order of the polynomial */ -{ - int i; - float *t,*u,*v,sum; - float T[(LSP_MAX_ORDER / 2) + 1]; - - /* Initialise pointers */ - - t = T; /* T[i-2] */ - *t++ = 1.0; - u = t--; /* T[i-1] */ - *u++ = x; - v = u--; /* T[i] */ - - /* Evaluate chebyshev series formulation using iterative approach */ - - for(i=2;i<=m/2;i++) - *v++ = (2*x)*(*u++) - *t++; /* T[i] = 2*x*T[i-1] - T[i-2] */ - - sum=0.0; /* initialise sum to zero */ - t = T; /* reset pointer */ - - /* Evaluate polynomial and return value also free memory space */ - - for(i=0;i<=m/2;i++) - sum+=coef[(m/2)-i]**t++; - - return sum; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: lpc_to_lsp() - AUTHOR......: David Rowe - DATE CREATED: 24/2/93 - - This function converts LPC coefficients to LSP coefficients. - -\*---------------------------------------------------------------------------*/ - -int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta) -/* float *a lpc coefficients */ -/* int lpcrdr order of LPC coefficients (10) */ -/* float *freq LSP frequencies in radians */ -/* int nb number of sub-intervals (4) */ -/* float delta grid spacing interval (0.02) */ -{ - float psuml,psumr,psumm,temp_xr,xl,xr,xm = 0; - float temp_psumr; - int i,j,m,flag,k; - float *px; /* ptrs of respective P'(z) & Q'(z) */ - float *qx; - float *p; - float *q; - float *pt; /* ptr used for cheb_poly_eval() - whether P' or Q' */ - int roots=0; /* number of roots found */ - float Q[LSP_MAX_ORDER + 1]; - float P[LSP_MAX_ORDER + 1]; - - flag = 1; - m = lpcrdr/2; /* order of P'(z) & Q'(z) polynimials */ - - /* Allocate memory space for polynomials */ - - /* determine P'(z)'s and Q'(z)'s coefficients where - P'(z) = P(z)/(1 + z^(-1)) and Q'(z) = Q(z)/(1-z^(-1)) */ - - px = P; /* initilaise ptrs */ - qx = Q; - p = px; - q = qx; - *px++ = 1.0; - *qx++ = 1.0; - for(i=1;i<=m;i++){ - *px++ = a[i]+a[lpcrdr+1-i]-*p++; - *qx++ = a[i]-a[lpcrdr+1-i]+*q++; - } - px = P; - qx = Q; - for(i=0;i<m;i++){ - *px = 2**px; - *qx = 2**qx; - px++; - qx++; - } - px = P; /* re-initialise ptrs */ - qx = Q; - - /* Search for a zero in P'(z) polynomial first and then alternate to Q'(z). - Keep alternating between the two polynomials as each zero is found */ - - xr = 0; /* initialise xr to zero */ - xl = 1.0; /* start at point xl = 1 */ - - - for(j=0;j<lpcrdr;j++){ - if(j%2) /* determines whether P' or Q' is eval. */ - pt = qx; - else - pt = px; - - psuml = cheb_poly_eva(pt,xl,lpcrdr); /* evals poly. at xl */ - flag = 1; - while(flag && (xr >= -1.0)){ - xr = xl - delta ; /* interval spacing */ - psumr = cheb_poly_eva(pt,xr,lpcrdr);/* poly(xl-delta_x) */ - temp_psumr = psumr; - temp_xr = xr; - - /* if no sign change increment xr and re-evaluate - poly(xr). Repeat til sign change. if a sign change has - occurred the interval is bisected and then checked again - for a sign change which determines in which interval the - zero lies in. If there is no sign change between poly(xm) - and poly(xl) set interval between xm and xr else set - interval between xl and xr and repeat till root is located - within the specified limits */ - - if(((psumr*psuml)<0.0) || (psumr == 0.0)){ - roots++; - - psumm=psuml; - for(k=0;k<=nb;k++){ - xm = (xl+xr)/2; /* bisect the interval */ - psumm=cheb_poly_eva(pt,xm,lpcrdr); - if(psumm*psuml>0.){ - psuml=psumm; - xl=xm; - } - else{ - psumr=psumm; - xr=xm; - } - } - - /* once zero is found, reset initial interval to xr */ - freq[j] = (xm); - xl = xm; - flag = 0; /* reset flag for next search */ - } - else{ - psuml=temp_psumr; - xl=temp_xr; - } - } - } - - /* convert from x domain to radians */ - - for(i=0; i<lpcrdr; i++) { - freq[i] = acos(freq[i]); - } - - return(roots); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: lsp_to_lpc() - AUTHOR......: David Rowe - DATE CREATED: 24/2/93 - - This function converts LSP coefficients to LPC coefficients. In the - Speex code we worked out a way to simplify this significantly. - -\*---------------------------------------------------------------------------*/ - -void lsp_to_lpc(float *lsp, float *ak, int lpcrdr) -/* float *freq array of LSP frequencies in radians */ -/* float *ak array of LPC coefficients */ -/* int lpcrdr order of LPC coefficients */ - - -{ - int i,j; - float xout1,xout2,xin1,xin2; - float *pw,*n1,*n2,*n3,*n4 = 0; - int m = lpcrdr/2; - float freq[LSP_MAX_ORDER]; - float Wp[(LSP_MAX_ORDER * 4) + 2]; - - /* convert from radians to the x=cos(w) domain */ - - for(i=0; i<lpcrdr; i++) - freq[i] = cos(lsp[i]); - - pw = Wp; - - /* initialise contents of array */ - - for(i=0;i<=4*m+1;i++){ /* set contents of buffer to 0 */ - *pw++ = 0.0; - } - - /* Set pointers up */ - - pw = Wp; - xin1 = 1.0; - xin2 = 1.0; - - /* reconstruct P(z) and Q(z) by cascading second order polynomials - in form 1 - 2xz(-1) +z(-2), where x is the LSP coefficient */ - - for(j=0;j<=lpcrdr;j++){ - for(i=0;i<m;i++){ - n1 = pw+(i*4); - n2 = n1 + 1; - n3 = n2 + 1; - n4 = n3 + 1; - xout1 = xin1 - 2*(freq[2*i]) * *n1 + *n2; - xout2 = xin2 - 2*(freq[2*i+1]) * *n3 + *n4; - *n2 = *n1; - *n4 = *n3; - *n1 = xin1; - *n3 = xin2; - xin1 = xout1; - xin2 = xout2; - } - xout1 = xin1 + *(n4+1); - xout2 = xin2 - *(n4+2); - ak[j] = (xout1 + xout2)*0.5; - *(n4+1) = xin1; - *(n4+2) = xin2; - - xin1 = 0.0; - xin2 = 0.0; - } -} - diff --git a/gr-vocoder/lib/codec2/lsp.h b/gr-vocoder/lib/codec2/lsp.h deleted file mode 100644 index 5acef01840..0000000000 --- a/gr-vocoder/lib/codec2/lsp.h +++ /dev/null @@ -1,37 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: lsp.c - AUTHOR......: David Rowe - DATE CREATED: 24/2/93 - - - This file contains functions for LPC to LSP conversion and LSP to - LPC conversion. Note that the LSP coefficients are not in radians - format but in the x domain of the unit circle. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __LSP__ -#define __LSP__ - -int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta); -void lsp_to_lpc(float *freq, float *ak, int lpcrdr); - -#endif diff --git a/gr-vocoder/lib/codec2/machdep.h b/gr-vocoder/lib/codec2/machdep.h deleted file mode 100644 index ef2e64943e..0000000000 --- a/gr-vocoder/lib/codec2/machdep.h +++ /dev/null @@ -1,51 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: machdep.h - AUTHOR......: David Rowe - DATE CREATED: May 2 2013 - - Machine dependant functions. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2013 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __MACHDEP__ -#define __MACHDEP__ - -#ifdef TIMER -#define TIMER_VAR(...) unsigned int __VA_ARGS__ -#define TIMER_SAMPLE(timestamp) timestamp = machdep_timer_sample() -#define TIMER_SAMPLE_AND_LOG(timestamp, prev_timestamp, label) \ - timestamp = machdep_timer_sample_and_log(prev_timestamp, label) -#define TIMER_SAMPLE_AND_LOG2(prev_timestamp, label) \ - machdep_timer_sample_and_log(prev_timestamp, label) -#else -#define TIMER_VAR(...) -#define TIMER_SAMPLE(timestamp) -#define TIMER_SAMPLE_AND_LOG(timestamp, prev_timestamp, label) -#define TIMER_SAMPLE_AND_LOG2(prev_timestamp, label) -#endif - -void machdep_timer_init(void); -void machdep_timer_reset(void); -unsigned int machdep_timer_sample(void); -unsigned int machdep_timer_sample_and_log(unsigned int start, char s[]); -void machdep_timer_print_logged_samples(void); - -#endif diff --git a/gr-vocoder/lib/codec2/nlp.c b/gr-vocoder/lib/codec2/nlp.c deleted file mode 100644 index 83375dcd78..0000000000 --- a/gr-vocoder/lib/codec2/nlp.c +++ /dev/null @@ -1,589 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: nlp.c - AUTHOR......: David Rowe - DATE CREATED: 23/3/93 - - Non Linear Pitch (NLP) estimation functions. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "defines.h" -#include "nlp.h" -#include "dump.h" -#include "kiss_fft.h" -#undef TIMER -#include "machdep.h" - -#include <assert.h> -#include <math.h> -#include <stdlib.h> - -/*---------------------------------------------------------------------------*\ - - DEFINES - -\*---------------------------------------------------------------------------*/ - -#define PMAX_M 600 /* maximum NLP analysis window size */ -#define COEFF 0.95 /* notch filter parameter */ -#define PE_FFT_SIZE 512 /* DFT size for pitch estimation */ -#define DEC 5 /* decimation factor */ -#define SAMPLE_RATE 8000 -#define PI 3.141592654 /* mathematical constant */ -#define T 0.1 /* threshold for local minima candidate */ -#define F0_MAX 500 -#define CNLP 0.3 /* post processor constant */ -#define NLP_NTAP 48 /* Decimation LPF order */ - -//#undef DUMP - -/*---------------------------------------------------------------------------*\ - - GLOBALS - -\*---------------------------------------------------------------------------*/ - -/* 48 tap 600Hz low pass FIR filter coefficients */ - -const float nlp_fir[] = { - -1.0818124e-03, - -1.1008344e-03, - -9.2768838e-04, - -4.2289438e-04, - 5.5034190e-04, - 2.0029849e-03, - 3.7058509e-03, - 5.1449415e-03, - 5.5924666e-03, - 4.3036754e-03, - 8.0284511e-04, - -4.8204610e-03, - -1.1705810e-02, - -1.8199275e-02, - -2.2065282e-02, - -2.0920610e-02, - -1.2808831e-02, - 3.2204775e-03, - 2.6683811e-02, - 5.5520624e-02, - 8.6305944e-02, - 1.1480192e-01, - 1.3674206e-01, - 1.4867556e-01, - 1.4867556e-01, - 1.3674206e-01, - 1.1480192e-01, - 8.6305944e-02, - 5.5520624e-02, - 2.6683811e-02, - 3.2204775e-03, - -1.2808831e-02, - -2.0920610e-02, - -2.2065282e-02, - -1.8199275e-02, - -1.1705810e-02, - -4.8204610e-03, - 8.0284511e-04, - 4.3036754e-03, - 5.5924666e-03, - 5.1449415e-03, - 3.7058509e-03, - 2.0029849e-03, - 5.5034190e-04, - -4.2289438e-04, - -9.2768838e-04, - -1.1008344e-03, - -1.0818124e-03 -}; - -typedef struct { - int m; - float w[PMAX_M/DEC]; /* DFT window */ - float sq[PMAX_M]; /* squared speech samples */ - float mem_x,mem_y; /* memory for notch filter */ - float mem_fir[NLP_NTAP]; /* decimation FIR filter memory */ - kiss_fft_cfg fft_cfg; /* kiss FFT config */ -} NLP; - -float test_candidate_mbe(COMP Sw[], COMP W[], float f0); -float post_process_mbe(COMP Fw[], int pmin, int pmax, float gmax, COMP Sw[], COMP W[], float *prev_Wo); -float post_process_sub_multiples(COMP Fw[], - int pmin, int pmax, float gmax, int gmax_bin, - float *prev_Wo); - -/*---------------------------------------------------------------------------*\ - - nlp_create() - - Initialisation function for NLP pitch estimator. - -\*---------------------------------------------------------------------------*/ - -void *nlp_create( -int m /* analysis window size */ -) -{ - NLP *nlp; - int i; - - assert(m <= PMAX_M); - - nlp = (NLP*)malloc(sizeof(NLP)); - if (nlp == NULL) - return NULL; - - nlp->m = m; - for(i=0; i<m/DEC; i++) { - nlp->w[i] = 0.5 - 0.5*cosf(2*PI*i/(m/DEC-1)); - } - - for(i=0; i<PMAX_M; i++) - nlp->sq[i] = 0.0; - nlp->mem_x = 0.0; - nlp->mem_y = 0.0; - for(i=0; i<NLP_NTAP; i++) - nlp->mem_fir[i] = 0.0; - - nlp->fft_cfg = kiss_fft_alloc (PE_FFT_SIZE, 0, NULL, NULL); - assert(nlp->fft_cfg != NULL); - - return (void*)nlp; -} - -/*---------------------------------------------------------------------------*\ - - nlp_destroy() - - Shut down function for NLP pitch estimator. - -\*---------------------------------------------------------------------------*/ - -void nlp_destroy(void *nlp_state) -{ - NLP *nlp; - assert(nlp_state != NULL); - nlp = (NLP*)nlp_state; - - KISS_FFT_FREE(nlp->fft_cfg); - free(nlp_state); -} - -/*---------------------------------------------------------------------------*\ - - nlp() - - Determines the pitch in samples using the Non Linear Pitch (NLP) - algorithm [1]. Returns the fundamental in Hz. Note that the actual - pitch estimate is for the centre of the M sample Sn[] vector, not - the current N sample input vector. This is (I think) a delay of 2.5 - frames with N=80 samples. You should align further analysis using - this pitch estimate to be centred on the middle of Sn[]. - - Two post processors have been tried, the MBE version (as discussed - in [1]), and a post processor that checks sub-multiples. Both - suffer occasional gross pitch errors (i.e. neither are perfect). In - the presence of background noise the sub-multiple algorithm tends - towards low F0 which leads to better sounding background noise than - the MBE post processor. - - A good way to test and develop the NLP pitch estimator is using the - tnlp (codec2/unittest) and the codec2/octave/plnlp.m Octave script. - - A pitch tracker searching a few frames forward and backward in time - would be a useful addition. - - References: - - [1] http://www.itr.unisa.edu.au/~steven/thesis/dgr.pdf Chapter 4 - -\*---------------------------------------------------------------------------*/ - -float nlp( - void *nlp_state, - float Sn[], /* input speech vector */ - int n, /* frames shift (no. new samples in Sn[]) */ - int pmin, /* minimum pitch value */ - int pmax, /* maximum pitch value */ - float *pitch, /* estimated pitch period in samples */ - COMP Sw[], /* Freq domain version of Sn[] */ - COMP W[], /* Freq domain window */ - float *prev_Wo -) -{ - NLP *nlp; - float notch; /* current notch filter output */ - COMP fw[PE_FFT_SIZE]; /* DFT of squared signal (input) */ - COMP Fw[PE_FFT_SIZE]; /* DFT of squared signal (output) */ - float gmax; - int gmax_bin; - int m, i,j; - float best_f0; - TIMER_VAR(start, tnotch, filter, peakpick, window, fft, magsq, shiftmem); - - assert(nlp_state != NULL); - nlp = (NLP*)nlp_state; - m = nlp->m; - - TIMER_SAMPLE(start); - - /* Square, notch filter at DC, and LP filter vector */ - - for(i=m-n; i<m; i++) /* square latest speech samples */ - nlp->sq[i] = Sn[i]*Sn[i]; - - for(i=m-n; i<m; i++) { /* notch filter at DC */ - notch = nlp->sq[i] - nlp->mem_x; - notch += COEFF*nlp->mem_y; - nlp->mem_x = nlp->sq[i]; - nlp->mem_y = notch; - nlp->sq[i] = notch + 1.0; /* With 0 input vectors to codec, - kiss_fft() would take a long - time to execute when running in - real time. Problem was traced - to kiss_fft function call in - this function. Adding this small - constant fixed problem. Not - exactly sure why. */ - } - - TIMER_SAMPLE_AND_LOG(tnotch, start, " square and notch"); - - for(i=m-n; i<m; i++) { /* FIR filter vector */ - - for(j=0; j<NLP_NTAP-1; j++) - nlp->mem_fir[j] = nlp->mem_fir[j+1]; - nlp->mem_fir[NLP_NTAP-1] = nlp->sq[i]; - - nlp->sq[i] = 0.0; - for(j=0; j<NLP_NTAP; j++) - nlp->sq[i] += nlp->mem_fir[j]*nlp_fir[j]; - } - - TIMER_SAMPLE_AND_LOG(filter, tnotch, " filter"); - - /* Decimate and DFT */ - - for(i=0; i<PE_FFT_SIZE; i++) { - fw[i].real = 0.0; - fw[i].imag = 0.0; - } - for(i=0; i<m/DEC; i++) { - fw[i].real = nlp->sq[i*DEC]*nlp->w[i]; - } - TIMER_SAMPLE_AND_LOG(window, filter, " window"); - #ifdef DUMP - dump_dec(Fw); - #endif - - kiss_fft(nlp->fft_cfg, (kiss_fft_cpx *)fw, (kiss_fft_cpx *)Fw); - TIMER_SAMPLE_AND_LOG(fft, window, " fft"); - - for(i=0; i<PE_FFT_SIZE; i++) - Fw[i].real = Fw[i].real*Fw[i].real + Fw[i].imag*Fw[i].imag; - - TIMER_SAMPLE_AND_LOG(magsq, fft, " mag sq"); - #ifdef DUMP - dump_sq(nlp->sq); - dump_Fw(Fw); - #endif - - /* find global peak */ - - gmax = 0.0; - gmax_bin = PE_FFT_SIZE*DEC/pmax; - for(i=PE_FFT_SIZE*DEC/pmax; i<=PE_FFT_SIZE*DEC/pmin; i++) { - if (Fw[i].real > gmax) { - gmax = Fw[i].real; - gmax_bin = i; - } - } - - TIMER_SAMPLE_AND_LOG(peakpick, magsq, " peak pick"); - - //#define POST_PROCESS_MBE - #ifdef POST_PROCESS_MBE - best_f0 = post_process_mbe(Fw, pmin, pmax, gmax, Sw, W, prev_Wo); - #else - best_f0 = post_process_sub_multiples(Fw, pmin, pmax, gmax, gmax_bin, prev_Wo); - #endif - - TIMER_SAMPLE_AND_LOG(shiftmem, peakpick, " post process"); - - /* Shift samples in buffer to make room for new samples */ - - for(i=0; i<m-n; i++) - nlp->sq[i] = nlp->sq[i+n]; - - /* return pitch and F0 estimate */ - - *pitch = (float)SAMPLE_RATE/best_f0; - - TIMER_SAMPLE_AND_LOG2(shiftmem, " shift mem"); - - TIMER_SAMPLE_AND_LOG2(start, " nlp int"); - - return(best_f0); -} - -/*---------------------------------------------------------------------------*\ - - post_process_sub_multiples() - - Given the global maximma of Fw[] we search integer submultiples for - local maxima. If local maxima exist and they are above an - experimentally derived threshold (OK a magic number I pulled out of - the air) we choose the submultiple as the F0 estimate. - - The rational for this is that the lowest frequency peak of Fw[] - should be F0, as Fw[] can be considered the autocorrelation function - of Sw[] (the speech spectrum). However sometimes due to phase - effects the lowest frequency maxima may not be the global maxima. - - This works OK in practice and favours low F0 values in the presence - of background noise which means the sinusoidal codec does an OK job - of synthesising the background noise. High F0 in background noise - tends to sound more periodic introducing annoying artifacts. - -\*---------------------------------------------------------------------------*/ - -float post_process_sub_multiples(COMP Fw[], - int pmin, int pmax, float gmax, int gmax_bin, - float *prev_Wo) -{ - int min_bin, cmax_bin; - int mult; - float thresh, best_f0; - int b, bmin, bmax, lmax_bin; - float lmax; - int prev_f0_bin; - - /* post process estimate by searching submultiples */ - - mult = 2; - min_bin = PE_FFT_SIZE*DEC/pmax; - cmax_bin = gmax_bin; - prev_f0_bin = *prev_Wo*(4000.0/PI)*(PE_FFT_SIZE*DEC)/SAMPLE_RATE; - - while(gmax_bin/mult >= min_bin) { - - b = gmax_bin/mult; /* determine search interval */ - bmin = 0.8*b; - bmax = 1.2*b; - if (bmin < min_bin) - bmin = min_bin; - - /* lower threshold to favour previous frames pitch estimate, - this is a form of pitch tracking */ - - if ((prev_f0_bin > bmin) && (prev_f0_bin < bmax)) - thresh = CNLP*0.5*gmax; - else - thresh = CNLP*gmax; - - lmax = 0; - lmax_bin = bmin; - for (b=bmin; b<=bmax; b++) /* look for maximum in interval */ - if (Fw[b].real > lmax) { - lmax = Fw[b].real; - lmax_bin = b; - } - - if (lmax > thresh) - if ((lmax > Fw[lmax_bin-1].real) && (lmax > Fw[lmax_bin+1].real)) { - cmax_bin = lmax_bin; - } - - mult++; - } - - best_f0 = (float)cmax_bin*SAMPLE_RATE/(PE_FFT_SIZE*DEC); - - return best_f0; -} - -/*---------------------------------------------------------------------------*\ - - post_process_mbe() - - Use the MBE pitch estimation algorithm to evaluate pitch candidates. This - works OK but the accuracy at low F0 is affected by NW, the analysis window - size used for the DFT of the input speech Sw[]. Also favours high F0 in - the presence of background noise which causes periodic artifacts in the - synthesised speech. - -\*---------------------------------------------------------------------------*/ - -float post_process_mbe(COMP Fw[], int pmin, int pmax, float gmax, COMP Sw[], COMP W[], float *prev_Wo) -{ - float candidate_f0; - float f0,best_f0; /* fundamental frequency */ - float e,e_min; /* MBE cost function */ - int i; - #ifdef DUMP - float e_hz[F0_MAX]; - #endif - #if !defined(NDEBUG) || defined(DUMP) - int bin; - #endif - float f0_min, f0_max; - float f0_start, f0_end; - - f0_min = (float)SAMPLE_RATE/pmax; - f0_max = (float)SAMPLE_RATE/pmin; - - /* Now look for local maxima. Each local maxima is a candidate - that we test using the MBE pitch estimation algotithm */ - - #ifdef DUMP - for(i=0; i<F0_MAX; i++) - e_hz[i] = -1; - #endif - e_min = 1E32; - best_f0 = 50; - for(i=PE_FFT_SIZE*DEC/pmax; i<=PE_FFT_SIZE*DEC/pmin; i++) { - if ((Fw[i].real > Fw[i-1].real) && (Fw[i].real > Fw[i+1].real)) { - - /* local maxima found, lets test if it's big enough */ - - if (Fw[i].real > T*gmax) { - - /* OK, sample MBE cost function over +/- 10Hz range in 2.5Hz steps */ - - candidate_f0 = (float)i*SAMPLE_RATE/(PE_FFT_SIZE*DEC); - f0_start = candidate_f0-20; - f0_end = candidate_f0+20; - if (f0_start < f0_min) f0_start = f0_min; - if (f0_end > f0_max) f0_end = f0_max; - - for(f0=f0_start; f0<=f0_end; f0+= 2.5) { - e = test_candidate_mbe(Sw, W, f0); - #if !defined(NDEBUG) || defined(DUMP) - bin = floor(f0); assert((bin > 0) && (bin < F0_MAX)); - #endif - #ifdef DUMP - e_hz[bin] = e; - #endif - if (e < e_min) { - e_min = e; - best_f0 = f0; - } - } - - } - } - } - - /* finally sample MBE cost function around previous pitch estimate - (form of pitch tracking) */ - - candidate_f0 = *prev_Wo * SAMPLE_RATE/TWO_PI; - f0_start = candidate_f0-20; - f0_end = candidate_f0+20; - if (f0_start < f0_min) f0_start = f0_min; - if (f0_end > f0_max) f0_end = f0_max; - - for(f0=f0_start; f0<=f0_end; f0+= 2.5) { - e = test_candidate_mbe(Sw, W, f0); - #if !defined(NDEBUG) || defined(DUMP) - bin = floor(f0); assert((bin > 0) && (bin < F0_MAX)); - #endif - #ifdef DUMP - e_hz[bin] = e; - #endif - if (e < e_min) { - e_min = e; - best_f0 = f0; - } - } - - #ifdef DUMP - dump_e(e_hz); - #endif - - return best_f0; -} - -/*---------------------------------------------------------------------------*\ - - test_candidate_mbe() - - Returns the error of the MBE cost function for the input f0. - - Note: I think a lot of the operations below can be simplified as - W[].imag = 0 and has been normalised such that den always equals 1. - -\*---------------------------------------------------------------------------*/ - -float test_candidate_mbe( - COMP Sw[], - COMP W[], - float f0 -) -{ - COMP Sw_[FFT_ENC]; /* DFT of all voiced synthesised signal */ - int l,al,bl,m; /* loop variables */ - COMP Am; /* amplitude sample for this band */ - int offset; /* centers Hw[] about current harmonic */ - float den; /* denominator of Am expression */ - float error; /* accumulated error between originl and synthesised */ - float Wo; /* current "test" fundamental freq. */ - int L; - - L = floor((SAMPLE_RATE/2.0)/f0); - Wo = f0*(2*PI/SAMPLE_RATE); - - error = 0.0; - - /* Just test across the harmonics in the first 1000 Hz (L/4) */ - - for(l=1; l<L/4; l++) { - Am.real = 0.0; - Am.imag = 0.0; - den = 0.0; - al = ceil((l - 0.5)*Wo*FFT_ENC/TWO_PI); - bl = ceil((l + 0.5)*Wo*FFT_ENC/TWO_PI); - - /* Estimate amplitude of harmonic assuming harmonic is totally voiced */ - - for(m=al; m<bl; m++) { - offset = FFT_ENC/2 + m - l*Wo*FFT_ENC/TWO_PI + 0.5; - Am.real += Sw[m].real*W[offset].real + Sw[m].imag*W[offset].imag; - Am.imag += Sw[m].imag*W[offset].real - Sw[m].real*W[offset].imag; - den += W[offset].real*W[offset].real + W[offset].imag*W[offset].imag; - } - - Am.real = Am.real/den; - Am.imag = Am.imag/den; - - /* Determine error between estimated harmonic and original */ - - for(m=al; m<bl; m++) { - offset = FFT_ENC/2 + m - l*Wo*FFT_ENC/TWO_PI + 0.5; - Sw_[m].real = Am.real*W[offset].real - Am.imag*W[offset].imag; - Sw_[m].imag = Am.real*W[offset].imag + Am.imag*W[offset].real; - error += (Sw[m].real - Sw_[m].real)*(Sw[m].real - Sw_[m].real); - error += (Sw[m].imag - Sw_[m].imag)*(Sw[m].imag - Sw_[m].imag); - } - } - - return error; -} - diff --git a/gr-vocoder/lib/codec2/nlp.h b/gr-vocoder/lib/codec2/nlp.h deleted file mode 100644 index 6e03236c00..0000000000 --- a/gr-vocoder/lib/codec2/nlp.h +++ /dev/null @@ -1,38 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: nlp.c - AUTHOR......: David Rowe - DATE CREATED: 23/3/93 - - Non Linear Pitch (NLP) estimation functions. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __NLP__ -#define __NLP__ - -#include "comp.h" - -void *nlp_create(int m); -void nlp_destroy(void *nlp_state); -float nlp(void *nlp_state, float Sn[], int n, int pmin, int pmax, - float *pitch, COMP Sw[], COMP W[], float *prev_Wo); - -#endif diff --git a/gr-vocoder/lib/codec2/os.h b/gr-vocoder/lib/codec2/os.h deleted file mode 100644 index 0dae9bfd24..0000000000 --- a/gr-vocoder/lib/codec2/os.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Generate using fir1(47,1/6) in Octave */ - -const float fdmdv_os_filter[]= { - -3.55606818e-04, - -8.98615286e-04, - -1.40119781e-03, - -1.71713852e-03, - -1.56471179e-03, - -6.28128960e-04, - 1.24522223e-03, - 3.83138676e-03, - 6.41309478e-03, - 7.85893186e-03, - 6.93514929e-03, - 2.79361991e-03, - -4.51051400e-03, - -1.36671853e-02, - -2.21034939e-02, - -2.64084653e-02, - -2.31425052e-02, - -9.84218694e-03, - 1.40648474e-02, - 4.67316298e-02, - 8.39615986e-02, - 1.19925275e-01, - 1.48381174e-01, - 1.64097819e-01, - 1.64097819e-01, - 1.48381174e-01, - 1.19925275e-01, - 8.39615986e-02, - 4.67316298e-02, - 1.40648474e-02, - -9.84218694e-03, - -2.31425052e-02, - -2.64084653e-02, - -2.21034939e-02, - -1.36671853e-02, - -4.51051400e-03, - 2.79361991e-03, - 6.93514929e-03, - 7.85893186e-03, - 6.41309478e-03, - 3.83138676e-03, - 1.24522223e-03, - -6.28128960e-04, - -1.56471179e-03, - -1.71713852e-03, - -1.40119781e-03, - -8.98615286e-04, - -3.55606818e-04 -}; - diff --git a/gr-vocoder/lib/codec2/pack.c b/gr-vocoder/lib/codec2/pack.c deleted file mode 100644 index 1c07230a70..0000000000 --- a/gr-vocoder/lib/codec2/pack.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - Copyright (C) 2010 Perens LLC <bruce@perens.com> - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "defines.h" -#include "quantise.h" -#include <stdio.h> - -/* Compile-time constants */ -/* Size of unsigned char in bits. Assumes 8 bits-per-char. */ -static const unsigned int WordSize = 8; - -/* Mask to pick the bit component out of bitIndex. */ -static const unsigned int IndexMask = 0x7; - -/* Used to pick the word component out of bitIndex. */ -static const unsigned int ShiftRight = 3; - -/** Pack a bit field into a bit string, encoding the field in Gray code. - * - * The output is an array of unsigned char data. The fields are efficiently - * packed into the bit string. The Gray coding is a naive attempt to reduce - * the effect of single-bit errors, we expect to do a better job as the - * codec develops. - * - * This code would be simpler if it just set one bit at a time in the string, - * but would hit the same cache line more often. I'm not sure the complexity - * gains us anything here. - * - * Although field is currently of int type rather than unsigned for - * compatibility with the rest of the code, indices are always expected to - * be >= 0. - */ -void -pack( - unsigned char * bitArray, /* The output bit string. */ - unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ - int field, /* The bit field to be packed. */ - unsigned int fieldWidth/* Width of the field in BITS, not bytes. */ - ) -{ - pack_natural_or_gray(bitArray, bitIndex, field, fieldWidth, 1); -} - -void -pack_natural_or_gray( - unsigned char * bitArray, /* The output bit string. */ - unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ - int field, /* The bit field to be packed. */ - unsigned int fieldWidth,/* Width of the field in BITS, not bytes. */ - unsigned int gray /* non-zero for gray coding */ - ) -{ - if (gray) { - /* Convert the field to Gray code */ - field = (field >> 1) ^ field; - } - - do { - unsigned int bI = *bitIndex; - unsigned int bitsLeft = WordSize - (bI & IndexMask); - unsigned int sliceWidth = - bitsLeft < fieldWidth ? bitsLeft : fieldWidth; - unsigned int wordIndex = bI >> ShiftRight; - - bitArray[wordIndex] |= - ((unsigned char)((field >> (fieldWidth - sliceWidth)) - << (bitsLeft - sliceWidth))); - - *bitIndex = bI + sliceWidth; - fieldWidth -= sliceWidth; - } while ( fieldWidth != 0 ); -} - -/** Unpack a field from a bit string, converting from Gray code to binary. - * - */ -int -unpack( - const unsigned char * bitArray, /* The input bit string. */ - unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ - unsigned int fieldWidth/* Width of the field in BITS, not bytes. */ - ) -{ - return unpack_natural_or_gray(bitArray, bitIndex, fieldWidth, 1); -} - -/** Unpack a field from a bit string, to binary, optionally using - * natural or Gray code. - * - */ -int -unpack_natural_or_gray( - const unsigned char * bitArray, /* The input bit string. */ - unsigned int * bitIndex, /* Index into the string in BITS, not bytes.*/ - unsigned int fieldWidth,/* Width of the field in BITS, not bytes. */ - unsigned int gray /* non-zero for Gray coding */ - ) -{ - unsigned int field = 0; - unsigned int t; - - do { - unsigned int bI = *bitIndex; - unsigned int bitsLeft = WordSize - (bI & IndexMask); - unsigned int sliceWidth = - bitsLeft < fieldWidth ? bitsLeft : fieldWidth; - - field |= (((bitArray[bI >> ShiftRight] >> (bitsLeft - sliceWidth)) & ((1 << sliceWidth) - 1)) << (fieldWidth - sliceWidth)); - - *bitIndex = bI + sliceWidth; - fieldWidth -= sliceWidth; - } while ( fieldWidth != 0 ); - - if (gray) { - /* Convert from Gray code to binary. Works for maximum 8-bit fields. */ - t = field ^ (field >> 8); - t ^= (t >> 4); - t ^= (t >> 2); - t ^= (t >> 1); - } - else { - t = field; - } - - return t; -} diff --git a/gr-vocoder/lib/codec2/phase.c b/gr-vocoder/lib/codec2/phase.c deleted file mode 100644 index a9c1c06b9a..0000000000 --- a/gr-vocoder/lib/codec2/phase.c +++ /dev/null @@ -1,253 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: phase.c - AUTHOR......: David Rowe - DATE CREATED: 1/2/09 - - Functions for modelling and synthesising phase. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not,see <http://www.gnu.org/licenses/>. -*/ - -#include "defines.h" -#include "phase.h" -#include "kiss_fft.h" -#include "comp.h" -#include "sine.h" - -#include <assert.h> -#include <ctype.h> -#include <math.h> -#include <string.h> -#include <stdlib.h> - -/*---------------------------------------------------------------------------*\ - - aks_to_H() - - Samples the complex LPC synthesis filter spectrum at the harmonic - frequencies. - -\*---------------------------------------------------------------------------*/ - -void aks_to_H( - kiss_fft_cfg fft_fwd_cfg, - MODEL *model, /* model parameters */ - float aks[], /* LPC's */ - float G, /* energy term */ - COMP H[], /* complex LPC spectral samples */ - int order -) -{ - COMP pw[FFT_ENC]; /* power spectrum (input) */ - COMP Pw[FFT_ENC]; /* power spectrum (output) */ - int i,m; /* loop variables */ - int am,bm; /* limits of current band */ - float r; /* no. rads/bin */ - float Em; /* energy in band */ - float Am; /* spectral amplitude sample */ - int b; /* centre bin of harmonic */ - float phi_; /* phase of LPC spectra */ - - r = TWO_PI/(FFT_ENC); - - /* Determine DFT of A(exp(jw)) ------------------------------------------*/ - - for(i=0; i<FFT_ENC; i++) { - pw[i].real = 0.0; - pw[i].imag = 0.0; - } - - for(i=0; i<=order; i++) - pw[i].real = aks[i]; - - kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)pw, (kiss_fft_cpx *)Pw); - - /* Sample magnitude and phase at harmonics */ - - for(m=1; m<=model->L; m++) { - am = (int)((m - 0.5)*model->Wo/r + 0.5); - bm = (int)((m + 0.5)*model->Wo/r + 0.5); - b = (int)(m*model->Wo/r + 0.5); - - Em = 0.0; - for(i=am; i<bm; i++) - Em += G/(Pw[i].real*Pw[i].real + Pw[i].imag*Pw[i].imag); - Am = sqrtf(fabsf(Em/(bm-am))); - - phi_ = -atan2f(Pw[b].imag,Pw[b].real); - H[m].real = Am*cosf(phi_); - H[m].imag = Am*sinf(phi_); - } -} - - -/*---------------------------------------------------------------------------*\ - - phase_synth_zero_order() - - Synthesises phases based on SNR and a rule based approach. No phase - parameters are required apart from the SNR (which can be reduced to a - 1 bit V/UV decision per frame). - - The phase of each harmonic is modelled as the phase of a LPC - synthesis filter excited by an impulse. Unlike the first order - model the position of the impulse is not transmitted, so we create - an excitation pulse train using a rule based approach. - - Consider a pulse train with a pulse starting time n=0, with pulses - repeated at a rate of Wo, the fundamental frequency. A pulse train - in the time domain is equivalent to harmonics in the frequency - domain. We can make an excitation pulse train using a sum of - sinsusoids: - - for(m=1; m<=L; m++) - ex[n] = cos(m*Wo*n) - - Note: the Octave script ../octave/phase.m is an example of this if - you would like to try making a pulse train. - - The phase of each excitation harmonic is: - - arg(E[m]) = mWo - - where E[m] are the complex excitation (freq domain) samples, - arg(x), just returns the phase of a complex sample x. - - As we don't transmit the pulse position for this model, we need to - synthesise it. Now the excitation pulses occur at a rate of Wo. - This means the phase of the first harmonic advances by N samples - over a synthesis frame of N samples. For example if Wo is pi/20 - (200 Hz), then over a 10ms frame (N=80 samples), the phase of the - first harmonic would advance (pi/20)*80 = 4*pi or two complete - cycles. - - We generate the excitation phase of the fundamental (first - harmonic): - - arg[E[1]] = Wo*N; - - We then relate the phase of the m-th excitation harmonic to the - phase of the fundamental as: - - arg(E[m]) = m*arg(E[1]) - - This E[m] then gets passed through the LPC synthesis filter to - determine the final harmonic phase. - - Comparing to speech synthesised using original phases: - - - Through headphones speech synthesised with this model is not as - good. Through a loudspeaker it is very close to original phases. - - - If there are voicing errors, the speech can sound clicky or - staticy. If V speech is mistakenly declared UV, this model tends to - synthesise impulses or clicks, as there is usually very little shift or - dispersion through the LPC filter. - - - When combined with LPC amplitude modelling there is an additional - drop in quality. I am not sure why, theory is interformant energy - is raised making any phase errors more obvious. - - NOTES: - - 1/ This synthesis model is effectively the same as a simple LPC-10 - vocoders, and yet sounds much better. Why? Conventional wisdom - (AMBE, MELP) says mixed voicing is required for high quality - speech. - - 2/ I am pretty sure the Lincoln Lab sinusoidal coding guys (like xMBE - also from MIT) first described this zero phase model, I need to look - up the paper. - - 3/ Note that this approach could cause some discontinuities in - the phase at the edge of synthesis frames, as no attempt is made - to make sure that the phase tracks are continuous (the excitation - phases are continuous, but not the final phases after filtering - by the LPC spectra). Technically this is a bad thing. However - this may actually be a good thing, disturbing the phase tracks a - bit. More research needed, e.g. test a synthesis model that adds - a small delta-W to make phase tracks line up for voiced - harmonics. - -\*---------------------------------------------------------------------------*/ - -void phase_synth_zero_order( - kiss_fft_cfg fft_fwd_cfg, - MODEL *model, - float aks[], - float *ex_phase, /* excitation phase of fundamental */ - int order -) -{ - int m; - float new_phi; - COMP Ex[MAX_AMP+1]; /* excitation samples */ - COMP A_[MAX_AMP+1]; /* synthesised harmonic samples */ - COMP H[MAX_AMP+1]; /* LPC freq domain samples */ - float G; - - G = 1.0; - aks_to_H(fft_fwd_cfg, model, aks, G, H, order); - - /* - Update excitation fundamental phase track, this sets the position - of each pitch pulse during voiced speech. After much experiment - I found that using just this frame's Wo improved quality for UV - sounds compared to interpolating two frames Wo like this: - - ex_phase[0] += (*prev_Wo+model->Wo)*N/2; - */ - - ex_phase[0] += (model->Wo)*N; - ex_phase[0] -= TWO_PI*floorf(ex_phase[0]/TWO_PI + 0.5); - - for(m=1; m<=model->L; m++) { - - /* generate excitation */ - - if (model->voiced) { - - Ex[m].real = cosf(ex_phase[0]*m); - Ex[m].imag = sinf(ex_phase[0]*m); - } - else { - - /* When a few samples were tested I found that LPC filter - phase is not needed in the unvoiced case, but no harm in - keeping it. - */ - float phi = TWO_PI*(float)codec2_rand()/CODEC2_RAND_MAX; - Ex[m].real = cosf(phi); - Ex[m].imag = sinf(phi); - } - - /* filter using LPC filter */ - - A_[m].real = H[m].real*Ex[m].real - H[m].imag*Ex[m].imag; - A_[m].imag = H[m].imag*Ex[m].real + H[m].real*Ex[m].imag; - - /* modify sinusoidal phase */ - - new_phi = atan2f(A_[m].imag, A_[m].real+1E-12); - model->phi[m] = new_phi; - } - -} - diff --git a/gr-vocoder/lib/codec2/phase.h b/gr-vocoder/lib/codec2/phase.h deleted file mode 100644 index 2927e912d4..0000000000 --- a/gr-vocoder/lib/codec2/phase.h +++ /dev/null @@ -1,39 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: phase.h - AUTHOR......: David Rowe - DATE CREATED: 1/2/09 - - Functions for modelling phase. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __PHASE__ -#define __PHASE__ - -#include "kiss_fft.h" - -void phase_synth_zero_order(kiss_fft_cfg fft_dec_cfg, - MODEL *model, - float aks[], - float *ex_phase, - int order); - -#endif diff --git a/gr-vocoder/lib/codec2/phaseexp.c b/gr-vocoder/lib/codec2/phaseexp.c deleted file mode 100644 index 61b240df49..0000000000 --- a/gr-vocoder/lib/codec2/phaseexp.c +++ /dev/null @@ -1,1455 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: phaseexp.c - AUTHOR......: David Rowe - DATE CREATED: June 2012 - - Experimental functions for quantising, modelling and synthesising phase. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not,see <http://www.gnu.org/licenses/>. -*/ - -#include "defines.h" -#include "phase.h" -#include "kiss_fft.h" -#include "comp.h" - -#include <assert.h> -#include <ctype.h> -#include <math.h> -#include <string.h> -#include <stdlib.h> - -/* Bruce Perens' funcs to load codebook files */ - -struct codebook { - unsigned int k; - unsigned int log2m; - unsigned int m; - COMP *cb; - unsigned int offset; -}; - -static const char format[] = -"The table format must be:\n" -"\tTwo integers describing the dimensions of the codebook.\n" -"\tThen, enough numbers to fill the specified dimensions.\n"; - -float get_float(FILE * in, const char * name, char * * cursor, char * buffer, int size) -{ - for ( ; ; ) { - char * s = *cursor; - char c; - - while ( (c = *s) != '\0' && !isdigit(c) && c != '-' && c != '.' ) - s++; - - /* Comments start with "#" and continue to the end of the line. */ - if ( c != '\0' && c != '#' ) { - char * end = 0; - float f = 0; - - f = strtod(s, &end); - - if ( end != s ) - *cursor = end; - return f; - } - - if ( fgets(buffer, size, in) == NULL ) { - fprintf(stderr, "%s: Format error. %s\n", name, format); - exit(1); - } - *cursor = buffer; - } -} - -static struct codebook *load(const char * name) -{ - FILE *file; - char line[2048]; - char *cursor = line; - struct codebook *b = malloc(sizeof(struct codebook)); - int i; - int size; - float angle; - - file = fopen(name, "rt"); - assert(file != NULL); - - *cursor = '\0'; - - b->k = (int)get_float(file, name, &cursor, line, sizeof(line)); - b->m = (int)get_float(file, name ,&cursor, line, sizeof(line)); - size = b->k * b->m; - - b->cb = (COMP *)malloc(size * sizeof(COMP)); - - for ( i = 0; i < size; i++ ) { - angle = get_float(file, name, &cursor, line, sizeof(line)); - b->cb[i].real = cos(angle); - b->cb[i].imag = sin(angle); - } - - fclose(file); - - return b; -} - - -/* states for phase experiments */ - -struct PEXP { - float phi1; - float phi_prev[MAX_AMP]; - float Wo_prev; - int frames; - float snr; - float var; - int var_n; - struct codebook *vq1,*vq2,*vq3,*vq4,*vq5; - float vq_var; - int vq_var_n; - MODEL prev_model; - int state; -}; - - -/*---------------------------------------------------------------------------* \ - - phase_experiment_create() - - Inits states for phase quantisation experiments. - -\*---------------------------------------------------------------------------*/ - -struct PEXP * phase_experiment_create() { - struct PEXP *pexp; - int i; - - pexp = (struct PEXP *)malloc(sizeof(struct PEXP)); - assert (pexp != NULL); - - pexp->phi1 = 0; - for(i=0; i<MAX_AMP; i++) - pexp->phi_prev[i] = 0.0; - pexp->Wo_prev = 0.0; - pexp->frames = 0; - pexp->snr = 0.0; - pexp->var = 0.0; - pexp->var_n = 0; - - /* smoothed 10th order for 1st 1 khz */ - //pexp->vq1 = load("../unittest/ph1_10_1024.txt"); - //pexp->vq1->offset = 0; - - /* load experimental phase VQ */ - - //pexp->vq1 = load("../unittest/testn1_20_1024.txt"); - pexp->vq1 = load("../unittest/test.txt"); - //pexp->vq2 = load("../unittest/testn21_40_1024.txt"); - pexp->vq2 = load("../unittest/test11_20_1024.txt"); - pexp->vq3 = load("../unittest/test21_30_1024.txt"); - pexp->vq4 = load("../unittest/test31_40_1024.txt"); - pexp->vq5 = load("../unittest/test41_60_1024.txt"); - pexp->vq1->offset = 0; - pexp->vq2->offset = 10; - pexp->vq3->offset = 20; - pexp->vq4->offset = 30; - pexp->vq5->offset = 40; - - pexp->vq_var = 0.0; - pexp->vq_var_n = 0; - - pexp->state = 0; - - return pexp; -} - - -/*---------------------------------------------------------------------------* \ - - phase_experiment_destroy() - -\*---------------------------------------------------------------------------*/ - -void phase_experiment_destroy(struct PEXP *pexp) { - assert(pexp != NULL); - if (pexp->snr != 0.0) - printf("snr: %4.2f dB\n", pexp->snr/pexp->frames); - if (pexp->var != 0.0) - printf("var...: %4.3f std dev...: %4.3f (%d non zero phases)\n", - pexp->var/pexp->var_n, sqrt(pexp->var/pexp->var_n), pexp->var_n); - if (pexp->vq_var != 0.0) - printf("vq var: %4.3f vq std dev: %4.3f (%d non zero phases)\n", - pexp->vq_var/pexp->vq_var_n, sqrt(pexp->vq_var/pexp->vq_var_n), pexp->vq_var_n); - free(pexp); -} - - -/*---------------------------------------------------------------------------* \ - - Various test and experimental functions ................ - -\*---------------------------------------------------------------------------*/ - -/* Bubblesort to find highest amplitude harmonics */ - -struct AMPINDEX { - float amp; - int index; -}; - -static void bubbleSort(struct AMPINDEX numbers[], int array_size) -{ - int i, j; - struct AMPINDEX temp; - - for (i = (array_size - 1); i > 0; i--) - { - for (j = 1; j <= i; j++) - { - //printf("i %d j %d %f %f \n", i, j, numbers[j-1].amp, numbers[j].amp); - if (numbers[j-1].amp < numbers[j].amp) - { - temp = numbers[j-1]; - numbers[j-1] = numbers[j]; - numbers[j] = temp; - } - } - } -} - - -static void print_pred_error(struct PEXP *pexp, MODEL *model, int start, int end, float mag_thresh) { - int i; - float mag; - - mag = 0.0; - for(i=start; i<=end; i++) - mag += model->A[i]*model->A[i]; - mag = 10*log10(mag/(end-start)); - - if (mag > mag_thresh) { - for(i=start; i<=end; i++) { - float pred = pexp->phi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; - float err = pred - model->phi[i]; - err = atan2(sin(err),cos(err)); - printf("%f\n",err); - } - //printf("\n"); - } - -} - - -static void predict_phases(struct PEXP *pexp, MODEL *model, int start, int end) { - int i; - - for(i=start; i<=end; i++) { - model->phi[i] = pexp->phi_prev[i] + N*i*model->Wo; - } - -} -static float refine_Wo(struct PEXP *pexp, - MODEL *model, - int start, - int end); - -/* Fancy state based phase prediction. Actually works OK on most utterances, - but could use some tuning. Breaks down a bit on mmt1. */ - -static void predict_phases_state(struct PEXP *pexp, MODEL *model, int start, int end) { - int i, next_state; - float best_Wo, dWo; - - //best_Wo = refine_Wo(pexp, model, start, end); - //best_Wo = (model->Wo + pexp->Wo_prev)/2.0; - best_Wo = model->Wo; - - dWo = fabs(model->Wo - pexp->Wo_prev)/model->Wo; - next_state = pexp->state; - switch(pexp->state) { - case 0: - if (dWo < 0.1) { - /* UV -> V transition, so start with phases in lock. They will - drift a bit over voiced track which is kinda what we want, so - we don't get clicky speech. - */ - next_state = 1; - for(i=start; i<=end; i++) - pexp->phi_prev[i] = i*pexp->phi1; - } - - break; - case 1: - if (dWo > 0.1) - next_state = 0; - break; - } - pexp->state = next_state; - - if (pexp->state == 0) - for(i=start; i<=end; i++) { - model->phi[i] = PI*(1.0 - 2.0*rand()/RAND_MAX); - } - else - for(i=start; i<=end; i++) { - model->phi[i] = pexp->phi_prev[i] + N*i*best_Wo; - } - printf("state %d\n", pexp->state); -} - -static void struct_phases(struct PEXP *pexp, MODEL *model, int start, int end) { - int i; - - for(i=start; i<=end; i++) - model->phi[i] = pexp->phi1*i; - -} - - -static void predict_phases2(struct PEXP *pexp, MODEL *model, int start, int end) { - int i; - float pred, str, diff; - - for(i=start; i<=end; i++) { - pred = pexp->phi_prev[i] + N*i*model->Wo; - str = pexp->phi1*i; - diff = str - pred; - diff = atan2(sin(diff), cos(diff)); - if (diff > 0) - pred += PI/16; - else - pred -= PI/16; - model->phi[i] = pred; - } - -} - -static void rand_phases(MODEL *model, int start, int end) { - int i; - - for(i=start; i<=end; i++) - model->phi[i] = PI*(1.0 - 2.0*(float)rand()/RAND_MAX); - -} - -static void quant_phase(float *phase, float min, float max, int bits) { - int levels = 1 << bits; - int index; - float norm, step; - - norm = (*phase - min)/(max - min); - index = floor(levels*norm); - - //printf("phase %f norm %f index %d ", *phase, norm, index); - if (index < 0 ) index = 0; - if (index > (levels-1)) index = levels-1; - //printf("index %d ", index); - step = (max - min)/levels; - *phase = min + step*index + 0.5*step; - //printf("step %f phase %f\n", step, *phase); -} - -static void quant_phases(MODEL *model, int start, int end, int bits) { - int i; - - for(i=start; i<=end; i++) { - quant_phase(&model->phi[i], -PI, PI, bits); - } -} - -static void fixed_bits_per_frame(struct PEXP *pexp, MODEL *model, int m, int budget) { - int res, finished; - - res = 3; - finished = 0; - - while(!finished) { - if (m > model->L/2) - res = 2; - if (((budget - res) < 0) || (m > model->L)) - finished = 1; - else { - quant_phase(&model->phi[m], -PI, PI, res); - budget -= res; - m++; - } - } - printf("m: %d L: %d budget: %d\n", m, model->L, budget); - predict_phases(pexp, model, m, model->L); - //rand_phases(model, m, model->L); -} - -/* used to plot histogram of quantisation error, for 3 bits, 8 levels, - should be uniform between +/- PI/8 */ - -static void check_phase_quant(MODEL *model, float tol) -{ - int m; - float phi_before[MAX_AMP]; - - for(m=1; m<=model->L; m++) - phi_before[m] = model->phi[m]; - - quant_phases(model, 1, model->L, 3); - - for(m=1; m<=model->L; m++) { - float err = phi_before[m] - model->phi[m]; - printf("%f\n", err); - if (fabs(err) > tol) - exit(0); - } -} - - -static float est_phi1(MODEL *model, int start, int end) -{ - int m; - float delta, s, c, phi1_est; - - if (end > model->L) - end = model->L; - - s = c = 0.0; - for(m=start; m<end; m++) { - delta = model->phi[m+1] - model->phi[m]; - s += sin(delta); - c += cos(delta); - } - - phi1_est = atan2(s,c); - - return phi1_est; -} - -static void print_phi1_pred_error(MODEL *model, int start, int end) -{ - int m; - float phi1_est; - - phi1_est = est_phi1(model, start, end); - - for(m=start; m<end; m++) { - float err = model->phi[m+1] - model->phi[m] - phi1_est; - err = atan2(sin(err),cos(err)); - printf("%f\n", err); - } -} - - -static void first_order_band(MODEL *model, int start, int end, float phi1_est) -{ - int m; - float pred_err, av_pred_err; - float c,s; - - s = c = 0.0; - for(m=start; m<end; m++) { - pred_err = model->phi[m] - phi1_est*m; - s += sin(pred_err); - c += cos(pred_err); - } - - av_pred_err = atan2(s,c); - for(m=start; m<end; m++) { - model->phi[m] = av_pred_err + phi1_est*m; - model->phi[m] = atan2(sin(model->phi[m]), cos(model->phi[m])); - } - -} - - -static void sub_linear(MODEL *model, int start, int end, float phi1_est) -{ - int m; - - for(m=start; m<end; m++) { - model->phi[m] = m*phi1_est; - } -} - - -static void top_amp(struct PEXP *pexp, MODEL *model, int start, int end, int n_harm, int pred) -{ - int removed = 0, not_removed = 0; - int top, i, j; - struct AMPINDEX sorted[MAX_AMP]; - - /* sort into ascending order of amplitude */ - - printf("\n"); - for(i=start,j=0; i<end; i++,j++) { - sorted[j].amp = model->A[i]; - sorted[j].index = i; - printf("%f ", model->A[i]); - } - bubbleSort(sorted, end-start); - - printf("\n"); - for(j=0; j<n_harm; j++) - printf("%d %f\n", j, sorted[j].amp); - - /* keep phase of top n_harm, predict others */ - - for(i=start; i<end; i++) { - top = 0; - for(j=0; j<n_harm; j++) { - if (model->A[i] == sorted[j].amp) { - top = 1; - assert(i == sorted[j].index); - } - } - - #define ALTTOP - #ifdef ALTTOP - model->phi[i] = 0.0; /* make sure */ - if (top) { - model->phi[i] = i*pexp->phi1; - removed++; - } - else { - model->phi[i] = PI*(1.0 - 2.0*(float)rand()/RAND_MAX); // note: try rand for higher harms - removed++; - } - #else - if (!top) { - model->phi[i] = 0.0; /* make sure */ - if (pred) { - //model->phi[i] = pexp->phi_prev[i] + i*N*(model->Wo + pexp->Wo_prev)/2.0; - model->phi[i] = i*model->phi[1]; - } - else - model->phi[i] = PI*(1.0 - 2.0*(float)rand()/RAND_MAX); // note: try rand for higher harms - removed++; - } - else { - /* need to make this work thru budget of bits */ - quant_phase(&model->phi[i], -PI, PI, 3); - not_removed++; - } - #endif - } - printf("dim: %d rem %d not_rem %d\n", end-start, removed, not_removed); - -} - - -static void limit_prediction_error(struct PEXP *pexp, MODEL *model, int start, int end, float limit) -{ - int i; - float pred, pred_error, error; - - for(i=start; i<=end; i++) { - pred = pexp->phi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; - pred_error = pred - model->phi[i]; - pred_error -= TWO_PI*floor((pred_error+PI)/TWO_PI); - quant_phase(&pred_error, -limit, limit, 2); - - error = pred - pred_error - model->phi[i]; - error -= TWO_PI*floor((error+PI)/TWO_PI); - printf("%f\n", pred_error); - model->phi[i] = pred - pred_error; - } -} - - -static void quant_prediction_error(struct PEXP *pexp, MODEL *model, int start, int end, float limit) -{ - int i; - float pred, pred_error; - - for(i=start; i<=end; i++) { - pred = pexp->phi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; - pred_error = pred - model->phi[i]; - pred_error -= TWO_PI*floor((pred_error+PI)/TWO_PI); - - printf("%f\n", pred_error); - model->phi[i] = pred - pred_error; - } -} - - -static void print_sparse_pred_error(struct PEXP *pexp, MODEL *model, int start, int end, float mag_thresh) -{ - int i, index; - float mag, pred, error; - float sparse_pe[MAX_AMP]; - - mag = 0.0; - for(i=start; i<=end; i++) - mag += model->A[i]*model->A[i]; - mag = 10*log10(mag/(end-start)); - - if (mag > mag_thresh) { - for(i=0; i<MAX_AMP; i++) { - sparse_pe[i] = 0.0; - } - - for(i=start; i<=end; i++) { - pred = pexp->phi_prev[i] + N*i*(model->Wo + pexp->Wo_prev)/2.0; - error = pred - model->phi[i]; - error = atan2(sin(error),cos(error)); - - index = MAX_AMP*i*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe[index] = error; - } - - /* dump spare phase vector in polar format */ - - for(i=0; i<MAX_AMP; i++) - printf("%f ", sparse_pe[i]); - printf("\n"); - } -} - - -static void update_snr_calc(struct PEXP *pexp, MODEL *model, float before[]) -{ - int m; - float signal, noise, diff; - - signal = 0.0; noise = 0.0; - for(m=1; m<=model->L; m++) { - signal += model->A[m]*model->A[m]; - diff = cos(model->phi[m]) - cos(before[m]); - noise += pow(model->A[m]*diff, 2.0); - diff = sin(model->phi[m]) - sin(before[m]); - noise += pow(model->A[m]*diff, 2.0); - //printf("%f %f\n", before[m], model->phi[m]); - } - //printf("%f %f snr = %f\n", signal, noise, 10.0*log10(signal/noise)); - pexp->snr += 10.0*log10(signal/noise); -} - - -static void update_variance_calc(struct PEXP *pexp, MODEL *model, float before[]) -{ - int m; - float diff; - - for(m=1; m<model->L; m++) { - diff = model->phi[m] - before[m]; - diff = atan2(sin(diff), cos(diff)); - pexp->var += diff*diff; - } - pexp->var_n += model->L; -} - -void print_vec(COMP cb[], int d, int e) -{ - int i,j; - - for(j=0; j<e; j++) { - for(i=0; i<d; i++) - printf("%f %f ", cb[j*d+i].real, cb[j*d+i].imag); - printf("\n"); - } -} - -static COMP cconj(COMP a) -{ - COMP res; - - res.real = a.real; - res.imag = -a.imag; - - return res; -} - -static COMP cadd(COMP a, COMP b) -{ - COMP res; - - res.real = a.real + b.real; - res.imag = a.imag + b.imag; - - return res; -} - -static COMP cmult(COMP a, COMP b) -{ - COMP res; - - res.real = a.real*b.real - a.imag*b.imag; - res.imag = a.real*b.imag + a.imag*b.real; - - return res; -} - -static int vq_phase(COMP cb[], COMP vec[], float weights[], int d, int e, float *se) -{ - float error; /* current error */ - int besti; /* best index so far */ - float best_error; /* best error so far */ - int i,j; - int ignore; - COMP diffr; - float diffp, metric, best_metric; - - besti = 0; - best_metric = best_error = 1E32; - for(j=0; j<e; j++) { - error = 0.0; - metric = 0.0; - for(i=0; i<d; i++) { - ignore = (vec[i].real == 0.0) && (vec[i].imag == 0.0); - if (!ignore) { - diffr = cmult(cb[j*d+i], cconj(vec[i])); - diffp = atan2(diffr.imag, diffr.real); - error += diffp*diffp; - metric += weights[i]*weights[i]*diffp*diffp; - //metric += weights[i]*diffp*diffp; - //metric = log10(weights[i]*fabs(diffp)); - //printf("diffp %f metric %f\n", diffp, metric); - //if (metric < log10(PI/(8.0*sqrt(3.0)))) - // metric = log10(PI/(8.0*sqrt(3.0))); - } - } - if (metric < best_metric) { - best_metric = metric; - best_error = error; - besti = j; - } - } - - *se += best_error; - - return(besti); -} - - -static float refine_Wo(struct PEXP *pexp, - MODEL *model, - int start, - int end) - -{ - int i; - float Wo_est, best_var, Wo, var, pred, error, best_Wo; - - /* test variance over a range of Wo values */ - - Wo_est = (model->Wo + pexp->Wo_prev)/2.0; - best_var = 1E32; - for(Wo=0.97*Wo_est; Wo<=1.03*Wo_est; Wo+=0.001*Wo_est) { - - /* predict phase and sum differences between harmonics */ - - var = 0.0; - for(i=start; i<=end; i++) { - pred = pexp->phi_prev[i] + N*i*Wo; - error = pred - model->phi[i]; - error = atan2(sin(error),cos(error)); - var += error*error; - } - - if (var < best_var) { - best_var = var; - best_Wo = Wo; - } - } - - return best_Wo; -} - - -static void split_vq(COMP sparse_pe_out[], struct PEXP *pexp, struct codebook *vq, float weights[], COMP sparse_pe_in[]) -{ - int i, j, non_zero, vq_ind; - - //printf("\n offset %d k %d m %d j: ", vq->offset, vq->k, vq->m); - vq_ind = vq_phase(vq->cb, &sparse_pe_in[vq->offset], &weights[vq->offset], vq->k, vq->m, &pexp->vq_var); - - non_zero = 0; - for(i=0, j=vq->offset; i<vq->k; i++,j++) { - //printf("%f ", atan2(sparse_pe[i].imag, sparse_pe[i].real)); - if ((sparse_pe_in[j].real != 0.0) && (sparse_pe_in[j].imag != 0.0)) { - //printf("%d ", j); - sparse_pe_out[j] = vq->cb[vq->k * vq_ind + i]; - non_zero++; - } - } - pexp->vq_var_n += non_zero; -} - - -static void sparse_vq_pred_error(struct PEXP *pexp, - MODEL *model -) -{ - int i, index; - float pred, error, error_q_angle, best_Wo; - COMP sparse_pe_in[MAX_AMP], sparse_pe_out[MAX_AMP]; - float weights[MAX_AMP]; - COMP error_q_rect; - - best_Wo = refine_Wo(pexp, model, 1, model->L); - //best_Wo = (model->Wo + pexp->Wo_prev)/2.0; - - /* transform to sparse pred error vector */ - - for(i=0; i<MAX_AMP; i++) { - sparse_pe_in[i].real = 0.0; - sparse_pe_in[i].imag = 0.0; - sparse_pe_out[i].real = 0.0; - sparse_pe_out[i].imag = 0.0; - } - - //printf("\n"); - for(i=1; i<=model->L; i++) { - pred = pexp->phi_prev[i] + N*i*best_Wo; - error = pred - model->phi[i]; - - index = MAX_AMP*i*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe_in[index].real = cos(error); - sparse_pe_in[index].imag = sin(error); - sparse_pe_out[index] = sparse_pe_in[index]; - weights[index] = model->A[i]; - //printf("%d ", index); - } - - /* vector quantise */ - - split_vq(sparse_pe_out, pexp, pexp->vq1, weights, sparse_pe_in); - split_vq(sparse_pe_out, pexp, pexp->vq2, weights, sparse_pe_in); - split_vq(sparse_pe_out, pexp, pexp->vq3, weights, sparse_pe_in); - split_vq(sparse_pe_out, pexp, pexp->vq4, weights, sparse_pe_in); - split_vq(sparse_pe_out, pexp, pexp->vq5, weights, sparse_pe_in); - - /* transform quantised phases back */ - - for(i=1; i<=model->L; i++) { - pred = pexp->phi_prev[i] + N*i*best_Wo; - - index = MAX_AMP*i*model->Wo/PI; - assert(index < MAX_AMP); - error_q_rect = sparse_pe_out[index]; - error_q_angle = atan2(error_q_rect.imag, error_q_rect.real); - model->phi[i] = pred - error_q_angle; - model->phi[i] = atan2(sin(model->phi[i]), cos(model->phi[i])); - } -} - - -static void predict_phases1(struct PEXP *pexp, MODEL *model, int start, int end) { - int i; - float best_Wo; - - best_Wo = refine_Wo(pexp, model, 1, model->L); - - for(i=start; i<=end; i++) { - model->phi[i] = pexp->phi_prev[i] + N*i*best_Wo; - } -} - - -/* - This functions tests theory that some bands can be combined together - due to less frequency resolution at higher frequencies. This will - reduce the amount of information we need to encode. -*/ - -void smooth_phase(struct PEXP *pexp, MODEL *model, int mode) -{ - int m, i, j, index, step, v, en, nav, st; - COMP sparse_pe_in[MAX_AMP], av; - COMP sparse_pe_out[MAX_AMP]; - COMP smoothed[MAX_AMP]; - float best_Wo, pred, err; - float weights[MAX_AMP]; - float avw, smoothed_weights[MAX_AMP]; - COMP smoothed_in[MAX_AMP], smoothed_out[MAX_AMP]; - - best_Wo = refine_Wo(pexp, model, 1, model->L); - - for(m=0; m<MAX_AMP; m++) { - sparse_pe_in[m].real = sparse_pe_in[m].imag = 0.0; - sparse_pe_out[m].real = sparse_pe_out[m].imag = 0.0; - } - - /* set up sparse array */ - - for(m=1; m<=model->L; m++) { - pred = pexp->phi_prev[m] + N*m*best_Wo; - err = model->phi[m] - pred; - err = atan2(sin(err),cos(err)); - - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - sparse_pe_in[index].real = model->A[m]*cos(err); - sparse_pe_in[index].imag = model->A[m]*sin(err); - sparse_pe_out[index] = sparse_pe_in[index]; - weights[index] = model->A[m]; - } - - /* now combine samples at high frequencies to reduce dimension */ - - step = 2; - st = 0; - for(i=st,v=0; i<MAX_AMP; i+=step,v++) { - - /* average over one band */ - - av.real = 0.0; av.imag = 0.0; avw = 0.0; nav = 0; - en = i+step; - if (en > (MAX_AMP-1)) - en = MAX_AMP-1; - for(j=i; j<en; j++) { - if ((sparse_pe_in[j].real != 0.0) &&(sparse_pe_in[j].imag != 0.0) ) { - av = cadd(av, sparse_pe_in[j]); - avw += weights[j]; - nav++; - } - } - if (nav) { - smoothed[v] = av; - smoothed_weights[v] = avw/nav; - } - else - smoothed[v].real = smoothed[v].imag = 0.0; - } - - if (mode == 2) { - for(i=0; i<MAX_AMP; i++) { - smoothed_in[i] = smoothed[i]; - smoothed_out[i] = smoothed_in[i]; - } - split_vq(smoothed_out, pexp, pexp->vq1, smoothed_weights, smoothed_in); - for(i=0; i<MAX_AMP; i++) - smoothed[i] = smoothed_out[i]; - } - - /* set all samples to smoothed average */ - - for(i=st,v=0; i<MAX_AMP; i+=step,v++) { - en = i+step; - if (en > (MAX_AMP-1)) - en = MAX_AMP-1; - for(j=i; j<en; j++) - sparse_pe_out[j] = smoothed[v]; - if (mode == 1) - printf("%f ", atan2(smoothed[v].imag, smoothed[v].real)); - } - if (mode == 1) - printf("\n"); - - /* convert back to Am */ - - for(m=1; m<=model->L; m++) { - index = MAX_AMP*m*model->Wo/PI; - assert(index < MAX_AMP); - pred = pexp->phi_prev[m] + N*m*best_Wo; - err = atan2(sparse_pe_out[index].imag, sparse_pe_out[index].real); - model->phi[m] = pred + err; - } - -} - -/* - Another version of a functions that tests the theory that some bands - can be combined together due to less frequency resolution at higher - frequencies. This will reduce the amount of information we need to - encode. -*/ - -void smooth_phase2(struct PEXP *pexp, MODEL *model) { - float m; - float step; - int a,b,h,i; - float best_Wo, pred, err, s,c, phi1_; - - best_Wo = refine_Wo(pexp, model, 1, model->L); - - step = (float)model->L/30; - printf("\nL: %d step: %3.2f am,bm: ", model->L, step); - for(m=(float)model->L/4; m<=model->L; m+=step) { - a = floor(m); - b = floor(m+step); - if (b > model->L) b = model->L; - h = b-a; - - printf("%d,%d,(%d) ", a, b, h); - c = s = 0.0; - if (h>1) { - for(i=a; i<b; i++) { - pred = pexp->phi_prev[i] + N*i*best_Wo; - err = model->phi[i] - pred; - c += cos(err); s += sin(err); - } - phi1_ = atan2(s,c); - for(i=a; i<b; i++) { - pred = pexp->phi_prev[i] + N*i*best_Wo; - printf("%d: %4.3f -> ", i, model->phi[i]); - model->phi[i] = pred + phi1_; - model->phi[i] = atan2(sin(model->phi[i]),cos(model->phi[i])); - printf("%4.3f ", model->phi[i]); - } - } - } -} - - -#define MAX_BINS 40 -//static float bins[] = {2600.0, 2800.0, 3000.0, 3200.0, 3400.0, 3600.0, 3800.0, 4000.0}; -static float bins[] = {/* - - 1000.0, 1100.0, 1200.0, 1300.0, 1400.0, - 1500.0, 1600.0, 1700.0, 1800.0, 1900.0,*/ - - 2000.0, 2400.0, 2800.0, - 3000.0, 3400.0, 3600.0, 4000.0}; - -void smooth_phase3(struct PEXP *pexp, MODEL *model) { - int m, i; - int nbins; - int b; - float f, best_Wo, pred, err; - COMP av[MAX_BINS]; - - nbins = sizeof(bins)/sizeof(float); - best_Wo = refine_Wo(pexp, model, 1, model->L); - - /* clear all bins */ - - for(i=0; i<MAX_BINS; i++) { - av[i].real = 0.0; - av[i].imag = 0.0; - } - - /* add phases into each bin */ - - for(m=1; m<=model->L; m++) { - f = m*model->Wo*FS/TWO_PI; - if (f > bins[0]) { - - /* find bin */ - - for(i=0; i<nbins; i++) - if ((f > bins[i]) && (f <= bins[i+1])) - b = i; - assert(b < MAX_BINS); - - /* est predicted phase from average */ - - pred = pexp->phi_prev[m] + N*m*best_Wo; - err = model->phi[m] - pred; - av[b].real += cos(err); av[b].imag += sin(err); - } - - } - - /* use averages to est phases */ - - for(m=1; m<=model->L; m++) { - f = m*model->Wo*FS/TWO_PI; - if (f > bins[0]) { - - /* find bin */ - - for(i=0; i<nbins; i++) - if ((f > bins[i]) && (f <= bins[i+1])) - b = i; - assert(b < MAX_BINS); - - /* add predicted phase error to this bin */ - - printf("L %d m %d f %4.f b %d\n", model->L, m, f, b); - - pred = pexp->phi_prev[m] + N*m*best_Wo; - err = atan2(av[b].imag, av[b].real); - printf(" %d: %4.3f -> ", m, model->phi[m]); - model->phi[m] = pred + err; - model->phi[m] = atan2(sin(model->phi[m]),cos(model->phi[m])); - printf("%4.3f\n", model->phi[m]); - } - } - printf("\n"); -} - - -/* - Try to code the phase of the largest amplitude in each band. Randomise the - phase of the other harmonics. The theory is that only the largest harmonic - will be audible. -*/ - -void cb_phase1(struct PEXP *pexp, MODEL *model) { - int m, i; - int nbins; - int b; - float f, best_Wo; - float max_val[MAX_BINS]; - int max_ind[MAX_BINS]; - - nbins = sizeof(bins)/sizeof(float); - best_Wo = refine_Wo(pexp, model, 1, model->L); - - for(i=0; i<nbins; i++) - max_val[i] = 0.0; - - /* determine max amplitude for each bin */ - - for(m=1; m<=model->L; m++) { - f = m*model->Wo*FS/TWO_PI; - if (f > bins[0]) { - - /* find bin */ - - for(i=0; i<nbins; i++) - if ((f > bins[i]) && (f <= bins[i+1])) - b = i; - assert(b < MAX_BINS); - - if (model->A[m] > max_val[b]) { - max_val[b] = model->A[m]; - max_ind[b] = m; - } - } - - } - - /* randomise phase of other harmonics */ - - for(m=1; m<=model->L; m++) { - f = m*model->Wo*FS/TWO_PI; - if (f > bins[0]) { - - /* find bin */ - - for(i=0; i<nbins; i++) - if ((f > bins[i]) && (f <= bins[i+1])) - b = i; - assert(b < MAX_BINS); - - if (m != max_ind[b]) - model->phi[m] = pexp->phi_prev[m] + N*m*best_Wo; - } - } -} - - -/* - Theory is only the phase of the envelope of signal matters within a - Critical Band. So we estimate the position of an impulse that - approximates the envelope of the signal. -*/ - -void cb_phase2(struct PEXP *pexp, MODEL *model) { - int st, m, i, a, b, step; - float diff,w,c,s,phi1_; - float A[MAX_AMP]; - - for(m=1; m<=model->L; m++) { - A[m] = model->A[m]; - model->A[m] = 0; - } - - st = 2*model->L/4; - step = 3; - model->phi[1] = pexp->phi_prev[1] + (pexp->Wo_prev+model->Wo)*N/2.0; - - printf("L=%d ", model->L); - for(m=st; m<st+step*2; m+=step) { - a = m; b=a+step; - if (b > model->L) - b = model->L; - - c = s = 0; - for(i=a; i<b-1; i++) { - printf("diff %d,%d ", i, i+1); - diff = model->phi[i+1] - model->phi[i]; - //w = (model->A[i+1] + model->A[i])/2; - w = 1.0; - c += w*cos(diff); s += w*sin(diff); - } - phi1_ = atan2(s,c); - printf("replacing: "); - for(i=a; i<b; i++) { - //model->phi[i] = i*phi1_; - //model->phi[i] = i*model->phi[1]; - //model->phi[i] = m*(pexp->Wo_prev+model->Wo)*N/2.0; - model->A[m] = A[m]; - printf("%d ", i); - } - printf(" . "); - } - printf("\n"); -} - - -static void smooth_phase4(MODEL *model) { - int m; - float phi_m, phi_m_1; - - if (model->L > 25) { - printf("\nL %d\n", model->L); - for(m=model->L/2; m<=model->L; m+=2) { - if ((m+1) <= model->L) { - phi_m = (model->phi[m] - model->phi[m+1])/2.0; - phi_m_1 = (model->phi[m+1] - model->phi[m])/2.0; - model->phi[m] = phi_m; - model->phi[m+1] = phi_m_1; - printf("%d %4.3f %4.3f ", m, phi_m, phi_m_1); - } - } - } - -} - -/* try repeating last frame, just advance phases to account for time shift */ - -static void repeat_phases(struct PEXP *pexp, MODEL *model) { - int m; - - *model = pexp->prev_model; - for(m=1; m<=model->L; m++) - model->phi[m] += N*m*model->Wo; - -} - -/*---------------------------------------------------------------------------*\ - - phase_experiment() - - Phase quantisation experiments. - -\*---------------------------------------------------------------------------*/ - -void phase_experiment(struct PEXP *pexp, MODEL *model, char *arg) { - int m; - float before[MAX_AMP]; - - assert(pexp != NULL); - memcpy(before, &model->phi[0], sizeof(float)*MAX_AMP); - - if (strcmp(arg,"q3") == 0) { - quant_phases(model, 1, model->L, 3); - update_snr_calc(pexp, model, before); - update_variance_calc(pexp, model, before); - } - - if (strcmp(arg,"dec2") == 0) { - if ((pexp->frames % 2) != 0) { - predict_phases(pexp, model, 1, model->L); - update_snr_calc(pexp, model, before); - update_variance_calc(pexp, model, before); - } - } - - if (strcmp(arg,"repeat") == 0) { - if ((pexp->frames % 2) != 0) { - repeat_phases(pexp, model); - update_snr_calc(pexp, model, before); - update_variance_calc(pexp, model, before); - } - } - - if (strcmp(arg,"vq") == 0) { - sparse_vq_pred_error(pexp, model); - update_snr_calc(pexp, model, before); - update_variance_calc(pexp, model, before); - } - - if (strcmp(arg,"pred") == 0) - predict_phases_state(pexp, model, 1, model->L); - - if (strcmp(arg,"pred1k") == 0) - predict_phases(pexp, model, 1, model->L/4); - - if (strcmp(arg,"smooth") == 0) { - smooth_phase(pexp, model,0); - update_snr_calc(pexp, model, before); - } - if (strcmp(arg,"smoothtrain") == 0) - smooth_phase(pexp, model,1); - if (strcmp(arg,"smoothvq") == 0) { - smooth_phase(pexp, model,2); - update_snr_calc(pexp, model, before); - } - - if (strcmp(arg,"smooth2") == 0) - smooth_phase2(pexp, model); - if (strcmp(arg,"smooth3") == 0) - smooth_phase3(pexp, model); - if (strcmp(arg,"smooth4") == 0) - smooth_phase4(model); - if (strcmp(arg,"vqsmooth3") == 0) { - sparse_vq_pred_error(pexp, model); - smooth_phase3(pexp, model); - } - - if (strcmp(arg,"cb1") == 0) { - cb_phase1(pexp, model); - update_snr_calc(pexp, model, before); - } - - if (strcmp(arg,"top") == 0) { - //top_amp(pexp, model, 1, model->L/4, 4, 1); - //top_amp(pexp, model, model->L/4, model->L/3, 4, 1); - //top_amp(pexp, model, model->L/3+1, model->L/2, 4, 1); - //top_amp(pexp, model, model->L/2, model->L, 6, 1); - //rand_phases(model, model->L/2, 3*model->L/4); - //struct_phases(pexp, model, model->L/2, 3*model->L/4); - //update_snr_calc(pexp, model, before); - } - - if (strcmp(arg,"pred23") == 0) { - predict_phases2(pexp, model, model->L/2, model->L); - update_snr_calc(pexp, model, before); - } - - if (strcmp(arg,"struct23") == 0) { - struct_phases(pexp, model, model->L/2, 3*model->L/4 ); - update_snr_calc(pexp, model, before); - } - - if (strcmp(arg,"addnoise") == 0) { - int m; - float max; - - max = 0; - for(m=1; m<=model->L; m++) - if (model->A[m] > max) - max = model->A[m]; - max = 20.0*log10(max); - for(m=1; m<=model->L; m++) - if (20.0*log10(model->A[m]) < (max-20)) { - model->phi[m] += (PI/4)*(1.0 -2.0*rand()/RAND_MAX); - //printf("m %d\n", m); - } - } - - /* normalise phases */ - - for(m=1; m<=model->L; m++) - model->phi[m] = atan2(sin(model->phi[m]), cos(model->phi[m])); - - /* update states */ - - //best_Wo = refine_Wo(pexp, model, model->L/2, model->L); - pexp->phi1 += N*model->Wo; - - for(m=1; m<=model->L; m++) - pexp->phi_prev[m] = model->phi[m]; - pexp->Wo_prev = model->Wo; - pexp->frames++; - pexp->prev_model = *model; -} - -#ifdef OLD_STUFF - //quant_phases(model, 1, model->L, 3); - //update_variance_calc(pexp, model, before); - //print_sparse_pred_error(pexp, model, 1, model->L, 40.0); - - //sparse_vq_pred_error(pexp, model); - - //quant_phases(model, model->L/4+1, model->L, 3); - - //predict_phases1(pexp, model, 1, model->L/4); - //quant_phases(model, model->L/4+1, model->L, 3); - - //quant_phases(model, 1, model->L/8, 3); - - //update_snr_calc(pexp, model, before); - //update_variance_calc(pexp, model, before); - - //fixed_bits_per_frame(pexp, model, 40); - //struct_phases(pexp, model, 1, model->L/4); - //rand_phases(model, 10, model->L); - //for(m=1; m<=model->L; m++) - // model->A[m] = 0.0; - //model->A[model->L/2] = 1000; - //repeat_phases(model, 20); - //predict_phases(pexp, model, 1, model->L/4); - //quant_phases(model, 1, 10, 3); - //quant_phases(model, 10, 20, 2); - //repeat_phases(model, 20); - //rand_phases(model, 3*model->L/4, model->L); - // print_phi1_pred_error(model, 1, model->L); - //predict_phases(pexp, model, 1, model->L/4); - //first_order_band(model, model->L/4, model->L/2); - //first_order_band(model, model->L/2, 3*model->L/4); - //if (fabs(model->Wo - pexp->Wo_prev)< 0.1*model->Wo) - - //print_pred_error(pexp, model, 1, model->L, 40.0); - //print_sparse_pred_error(pexp, model, 1, model->L, 40.0); - - //phi1_est = est_phi1(model, 1, model->L/4); - //print_phi1_pred_error(model, 1, model->L/4); - - //first_order_band(model, 1, model->L/4, phi1_est); - //sub_linear(model, 1, model->L/4, phi1_est); - - //top_amp(pexp, model, 1, model->L/4, 4); - //top_amp(pexp, model, model->L/4, model->L/2, 4); - - //first_order_band(model, 1, model->L/4, phi1_est); - //first_order_band(model, model->L/4, model->L/2, phi1_est); - - //if (fabs(model->Wo - pexp->Wo_prev) > 0.2*model->Wo) - // rand_phases(model, model->L/2, model->L); - - //top_amp(pexp, model, 1, model->L/4, 4); - //top_amp(pexp, model, model->L/4, model->L/2, 8); - //top_amp(pexp, model, model->L/4+1, model->L/2, 10, 1); - //top_amp(pexp, model, 1, model->L/4, 10, 1); - //top_amp(pexp, model, model->L/4+1, 3*model->L/4, 10, 1); - //top_amp(pexp, model, 1, 3*model->L/4, 20, 1); - - #ifdef REAS_CAND1 - predict_phases(pexp, model, 1, model->L/4); - top_amp(pexp, model, model->L/4+1, 3*model->L/4, 10, 1); - rand_phases(model, 3*model->L/4+1, model->L); - #endif - - #ifdef REAS_CAND2 - if ((pexp->frames % 2) == 0) { - //printf("quant\n"); - predict_phases(pexp, model, 1, model->L/4); - //top_amp(pexp, model, model->L/4+1, 3*model->L/4, 20, 1); - top_amp(pexp, model, model->L/4+1, 7*model->L/8, 20, 1); - rand_phases(model, 7*model->L/8+1, model->L); - } - else { - //printf("predict\n"); - predict_phases(pexp, model, 1, model->L); - } - #endif - - //#define REAS_CAND3 - #ifdef REAS_CAND3 - if ((pexp->frames % 3) != 0) { - printf("pred\n"); - predict_phases(pexp, model, 1, model->L); - } - else { - predict_phases(pexp, model, 1, model->L/4); - fixed_bits_per_frame(pexp, model, model->L/4+1, 60); - } - #endif - //predict_phases(pexp, model, model->L/4, model->L); - - - //print_pred_error(pexp, model, 1, model->L); - //limit_prediction_error(pexp, model, model->L/2, model->L, PI/2); -#endif diff --git a/gr-vocoder/lib/codec2/phaseexp.h b/gr-vocoder/lib/codec2/phaseexp.h deleted file mode 100644 index 865e8aede1..0000000000 --- a/gr-vocoder/lib/codec2/phaseexp.h +++ /dev/null @@ -1,39 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: phaseexp.h - AUTHOR......: David Rowe - DATE CREATED: June 2012 - - Experimental functions for quantising, modelling and synthesising phase. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2012 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __PHASEEXP__ -#define __PHASEEXP__ - -#include "kiss_fft.h" - -struct PEXP; - -struct PEXP * phase_experiment_create(); -void phase_experiment_destroy(struct PEXP *pexp); -void phase_experiment(struct PEXP *pexp, MODEL *model, char *arg); - -#endif diff --git a/gr-vocoder/lib/codec2/pilot_coeff.h b/gr-vocoder/lib/codec2/pilot_coeff.h deleted file mode 100644 index 66e7501d8f..0000000000 --- a/gr-vocoder/lib/codec2/pilot_coeff.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Generated by pilot_coeff_file() Octave function */ - -const float pilot_coeff[]={ - 0.00204705, - 0.00276339, - 0.00432595, - 0.00697042, - 0.0108452, - 0.0159865, - 0.0223035, - 0.029577, - 0.0374709, - 0.045557, - 0.0533491, - 0.0603458, - 0.0660751, - 0.070138, - 0.0722452, - 0.0722452, - 0.070138, - 0.0660751, - 0.0603458, - 0.0533491, - 0.045557, - 0.0374709, - 0.029577, - 0.0223035, - 0.0159865, - 0.0108452, - 0.00697042, - 0.00432595, - 0.00276339, - 0.00204705 -}; diff --git a/gr-vocoder/lib/codec2/postfilter.c b/gr-vocoder/lib/codec2/postfilter.c deleted file mode 100644 index 7c1a6061a0..0000000000 --- a/gr-vocoder/lib/codec2/postfilter.c +++ /dev/null @@ -1,142 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: postfilter.c - AUTHOR......: David Rowe - DATE CREATED: 13/09/09 - - Postfilter to improve sound quality for speech with high levels of - background noise. Unlike mixed-excitation models requires no bits - to be transmitted to handle background noise. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include <assert.h> -#include <stdlib.h> -#include <stdio.h> -#include <math.h> - -#include "defines.h" -#include "comp.h" -#include "dump.h" -#include "sine.h" -#include "postfilter.h" - -/*---------------------------------------------------------------------------*\ - - DEFINES - -\*---------------------------------------------------------------------------*/ - -#define BG_THRESH 40.0 /* only consider low levels signals for bg_est */ -#define BG_BETA 0.1 /* averaging filter constant */ -#define BG_MARGIN 6.0 /* harmonics this far above BG noise are - randomised. Helped make bg noise less - spikey (impulsive) for mmt1, but speech was - perhaps a little rougher. - */ - -/*---------------------------------------------------------------------------*\ - - postfilter() - - The post filter is designed to help with speech corrupted by - background noise. The zero phase model tends to make speech with - background noise sound "clicky". With high levels of background - noise the low level inter-formant parts of the spectrum will contain - noise rather than speech harmonics, so modelling them as voiced - (i.e. a continuous, non-random phase track) is inaccurate. - - Some codecs (like MBE) have a mixed voicing model that breaks the - spectrum into voiced and unvoiced regions. Several bits/frame - (5-12) are required to transmit the frequency selective voicing - information. Mixed excitation also requires accurate voicing - estimation (parameter estimators always break occasionally under - exceptional conditions). - - In our case we use a post filter approach which requires no - additional bits to be transmitted. The decoder measures the average - level of the background noise during unvoiced frames. If a harmonic - is less than this level it is made unvoiced by randomising it's - phases. - - This idea is rather experimental. Some potential problems that may - happen: - - 1/ If someone says "aaaaaaaahhhhhhhhh" will background estimator track - up to speech level? This would be a bad thing. - - 2/ If background noise suddenly dissapears from the source speech does - estimate drop quickly? What is noise suddenly re-appears? - - 3/ Background noise with a non-flat sepctrum. Current algorithm just - comsiders scpetrum as a whole, but this could be broken up into - bands, each with their own estimator. - - 4/ Males and females with the same level of background noise. Check - performance the same. Changing Wo affects width of each band, may - affect bg energy estimates. - - 5/ Not sure what happens during long periods of voiced speech - e.g. "sshhhhhhh" - -\*---------------------------------------------------------------------------*/ - -void postfilter( - MODEL *model, - float *bg_est -) -{ - int m, uv; - float e, thresh; - - /* determine average energy across spectrum */ - - e = 1E-12; - for(m=1; m<=model->L; m++) - e += model->A[m]*model->A[m]; - - assert(e > 0.0); - e = 10.0*log10f(e/model->L); - - /* If beneath threhold, update bg estimate. The idea - of the threshold is to prevent updating during high level - speech. */ - - if ((e < BG_THRESH) && !model->voiced) - *bg_est = *bg_est*(1.0 - BG_BETA) + e*BG_BETA; - - /* now mess with phases during voiced frames to make any harmonics - less then our background estimate unvoiced. - */ - - uv = 0; - thresh = powf(10.0, (*bg_est + BG_MARGIN)/20.0); - if (model->voiced) - for(m=1; m<=model->L; m++) - if (model->A[m] < thresh) { - model->phi[m] = TWO_PI*(float)codec2_rand()/CODEC2_RAND_MAX; - uv++; - } - -#ifdef DUMP - dump_bg(e, *bg_est, 100.0*uv/model->L); -#endif - -} diff --git a/gr-vocoder/lib/codec2/postfilter.h b/gr-vocoder/lib/codec2/postfilter.h deleted file mode 100644 index 156714e54f..0000000000 --- a/gr-vocoder/lib/codec2/postfilter.h +++ /dev/null @@ -1,33 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: postfilter.h - AUTHOR......: David Rowe - DATE CREATED: 13/09/09 - - Postfilter header file. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __POSTFILTER__ -#define __POSTFILTER__ - -void postfilter(MODEL *model, float *bg_est); - -#endif diff --git a/gr-vocoder/lib/codec2/quantise.c b/gr-vocoder/lib/codec2/quantise.c deleted file mode 100644 index f7326c4fcd..0000000000 --- a/gr-vocoder/lib/codec2/quantise.c +++ /dev/null @@ -1,1970 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: quantise.c - AUTHOR......: David Rowe - DATE CREATED: 31/5/92 - - Quantisation functions for the sinusoidal coder. - -\*---------------------------------------------------------------------------*/ - -/* - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. - -*/ - -#include <assert.h> -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> - -#include "defines.h" -#include "dump.h" -#include "quantise.h" -#include "lpc.h" -#include "lsp.h" -#include "kiss_fft.h" -#undef TIMER -#include "machdep.h" - -#define LSP_DELTA1 0.01 /* grid spacing for LSP root searches */ - -/*---------------------------------------------------------------------------*\ - - FUNCTION HEADERS - -\*---------------------------------------------------------------------------*/ - -float speech_to_uq_lsps(float lsp[], float ak[], float Sn[], float w[], - int order); - -/*---------------------------------------------------------------------------*\ - - FUNCTIONS - -\*---------------------------------------------------------------------------*/ - -int lsp_bits(int i) { - return lsp_cb[i].log2m; -} - -int lspd_bits(int i) { - return lsp_cbd[i].log2m; -} - -#ifdef __EXPERIMENTAL__ -int lspdt_bits(int i) { - return lsp_cbdt[i].log2m; -} -#endif - -int lsp_pred_vq_bits(int i) { - return lsp_cbjvm[i].log2m; -} - -/*---------------------------------------------------------------------------*\ - - quantise_init - - Loads the entire LSP quantiser comprised of several vector quantisers - (codebooks). - -\*---------------------------------------------------------------------------*/ - -void quantise_init() -{ -} - -/*---------------------------------------------------------------------------*\ - - quantise - - Quantises vec by choosing the nearest vector in codebook cb, and - returns the vector index. The squared error of the quantised vector - is added to se. - -\*---------------------------------------------------------------------------*/ - -long quantise(const float * cb, float vec[], float w[], int k, int m, float *se) -/* float cb[][K]; current VQ codebook */ -/* float vec[]; vector to quantise */ -/* float w[]; weighting vector */ -/* int k; dimension of vectors */ -/* int m; size of codebook */ -/* float *se; accumulated squared error */ -{ - float e; /* current error */ - long besti; /* best index so far */ - float beste; /* best error so far */ - long j; - int i; - float diff; - - besti = 0; - beste = 1E32; - for(j=0; j<m; j++) { - e = 0.0; - for(i=0; i<k; i++) { - diff = cb[j*k+i]-vec[i]; - e += powf(diff*w[i],2.0); - } - if (e < beste) { - beste = e; - besti = j; - } - } - - *se += beste; - - return(besti); -} - -/*---------------------------------------------------------------------------*\ - - encode_lspds_scalar() - - Scalar/VQ LSP difference quantiser. - -\*---------------------------------------------------------------------------*/ - -void encode_lspds_scalar( - int indexes[], - float lsp[], - int order -) -{ - int i,k,m; - float lsp_hz[LPC_MAX]; - float lsp__hz[LPC_MAX]; - float dlsp[LPC_MAX]; - float dlsp_[LPC_MAX]; - float wt[LPC_MAX]; - const float *cb; - float se = 0.0f; - - assert(order == LPC_ORD); - - for(i=0; i<order; i++) { - wt[i] = 1.0; - } - - /* convert from radians to Hz so we can use human readable - frequencies */ - - for(i=0; i<order; i++) - lsp_hz[i] = (4000.0/PI)*lsp[i]; - - //printf("\n"); - - wt[0] = 1.0; - for(i=0; i<order; i++) { - - /* find difference from previous qunatised lsp */ - - if (i) - dlsp[i] = lsp_hz[i] - lsp__hz[i-1]; - else - dlsp[0] = lsp_hz[0]; - - k = lsp_cbd[i].k; - m = lsp_cbd[i].m; - cb = lsp_cbd[i].cb; - indexes[i] = quantise(cb, &dlsp[i], wt, k, m, &se); - dlsp_[i] = cb[indexes[i]*k]; - - - if (i) - lsp__hz[i] = lsp__hz[i-1] + dlsp_[i]; - else - lsp__hz[0] = dlsp_[0]; - - //printf("%d lsp %3.2f dlsp %3.2f dlsp_ %3.2f lsp_ %3.2f\n", i, lsp_hz[i], dlsp[i], dlsp_[i], lsp__hz[i]); - } - -} - -void decode_lspds_scalar( - float lsp_[], - int indexes[], - int order -) -{ - int i,k; - float lsp__hz[LPC_MAX]; - float dlsp_[LPC_MAX]; - const float *cb; - - assert(order == LPC_ORD); - - for(i=0; i<order; i++) { - - k = lsp_cbd[i].k; - cb = lsp_cbd[i].cb; - dlsp_[i] = cb[indexes[i]*k]; - - if (i) - lsp__hz[i] = lsp__hz[i-1] + dlsp_[i]; - else - lsp__hz[0] = dlsp_[0]; - - lsp_[i] = (PI/4000.0)*lsp__hz[i]; - - //printf("%d dlsp_ %3.2f lsp_ %3.2f\n", i, dlsp_[i], lsp__hz[i]); - } - -} - -#ifdef __EXPERIMENTAL__ -/*---------------------------------------------------------------------------*\ - - lspvq_quantise - - Vector LSP quantiser. - -\*---------------------------------------------------------------------------*/ - -void lspvq_quantise( - float lsp[], - float lsp_[], - int order -) -{ - int i,k,m,ncb, nlsp; - float wt[LPC_ORD], lsp_hz[LPC_ORD]; - const float *cb; - float se = 0.0f; - int index; - - for(i=0; i<LPC_ORD; i++) { - wt[i] = 1.0; - lsp_hz[i] = 4000.0*lsp[i]/PI; - } - - /* scalar quantise LSPs 1,2,3,4 */ - - /* simple uniform scalar quantisers */ - - for(i=0; i<4; i++) { - k = lsp_cb[i].k; - m = lsp_cb[i].m; - cb = lsp_cb[i].cb; - index = quantise(cb, &lsp_hz[i], wt, k, m, &se); - lsp_[i] = cb[index*k]*PI/4000.0; - } - - //#define WGHT -#ifdef WGHT - for(i=4; i<9; i++) { - wt[i] = 1.0/(lsp[i]-lsp[i-1]) + 1.0/(lsp[i+1]-lsp[i]); - //printf("wt[%d] = %f\n", i, wt[i]); - } - wt[9] = 1.0/(lsp[i]-lsp[i-1]); -#endif - - /* VQ LSPs 5,6,7,8,9,10 */ - - ncb = 4; - nlsp = 4; - k = lsp_cbjnd[ncb].k; - m = lsp_cbjnd[ncb].m; - cb = lsp_cbjnd[ncb].cb; - index = quantise(cb, &lsp_hz[nlsp], &wt[nlsp], k, m, &se); - for(i=4; i<LPC_ORD; i++) { - lsp_[i] = cb[index*k+i-4]*(PI/4000.0); - //printf("%4.f (%4.f) ", lsp_hz[i], cb[index*k+i-4]); - } -} - -/*---------------------------------------------------------------------------*\ - - lspjnd_quantise - - Experimental JND LSP quantiser. - -\*---------------------------------------------------------------------------*/ - -void lspjnd_quantise(float lsps[], float lsps_[], int order) -{ - int i,k,m; - float wt[LPC_ORD], lsps_hz[LPC_ORD]; - const float *cb; - float se = 0.0f; - int index; - - for(i=0; i<LPC_ORD; i++) { - wt[i] = 1.0; - } - - /* convert to Hz */ - - for(i=0; i<LPC_ORD; i++) { - lsps_hz[i] = lsps[i]*(4000.0/PI); - lsps_[i] = lsps[i]; - } - - /* simple uniform scalar quantisers */ - - for(i=0; i<4; i++) { - k = lsp_cbjnd[i].k; - m = lsp_cbjnd[i].m; - cb = lsp_cbjnd[i].cb; - index = quantise(cb, &lsps_hz[i], wt, k, m, &se); - lsps_[i] = cb[index*k]*(PI/4000.0); - } - - /* VQ LSPs 5,6,7,8,9,10 */ - - k = lsp_cbjnd[4].k; - m = lsp_cbjnd[4].m; - cb = lsp_cbjnd[4].cb; - index = quantise(cb, &lsps_hz[4], &wt[4], k, m, &se); - //printf("k = %d m = %d c[0] %f cb[k] %f\n", k,m,cb[0],cb[k]); - //printf("index = %4d: ", index); - for(i=4; i<LPC_ORD; i++) { - lsps_[i] = cb[index*k+i-4]*(PI/4000.0); - //printf("%4.f (%4.f) ", lsps_hz[i], cb[index*k+i-4]); - } - //printf("\n"); -} - -void compute_weights(const float *x, float *w, int ndim); - -/*---------------------------------------------------------------------------*\ - - lspdt_quantise - - LSP difference in time quantiser. Split VQ, encoding LSPs 1-4 with - one VQ, and LSPs 5-10 with a second. Update of previous lsp memory - is done outside of this function to handle dT between 10 or 20ms - frames. - - mode action - ------------------ - - LSPDT_ALL VQ LSPs 1-4 and 5-10 - LSPDT_LOW Just VQ LSPs 1-4, for LSPs 5-10 just copy previous - LSPDT_HIGH Just VQ LSPs 5-10, for LSPs 1-4 just copy previous - -\*---------------------------------------------------------------------------*/ - -void lspdt_quantise(float lsps[], float lsps_[], float lsps__prev[], int mode) -{ - int i; - float wt[LPC_ORD]; - float lsps_dt[LPC_ORD]; -#ifdef TRY_LSPDT_VQ - int k,m; - int index; - const float *cb; - float se = 0.0f; -#endif // TRY_LSPDT_VQ - - //compute_weights(lsps, wt, LPC_ORD); - for(i=0; i<LPC_ORD; i++) { - wt[i] = 1.0; - } - - //compute_weights(lsps, wt, LPC_ORD ); - - for(i=0; i<LPC_ORD; i++) { - lsps_dt[i] = lsps[i] - lsps__prev[i]; - lsps_[i] = lsps__prev[i]; - } - - //#define TRY_LSPDT_VQ -#ifdef TRY_LSPDT_VQ - /* this actually improves speech a bit, but 40ms updates works surprsingly well.... */ - k = lsp_cbdt[0].k; - m = lsp_cbdt[0].m; - cb = lsp_cbdt[0].cb; - index = quantise(cb, lsps_dt, wt, k, m, &se); - for(i=0; i<LPC_ORD; i++) { - lsps_[i] += cb[index*k + i]; - } -#endif - -} -#endif - -#define MIN(a,b) ((a)<(b)?(a):(b)) -#define MAX_ENTRIES 16384 - -void compute_weights(const float *x, float *w, int ndim) -{ - int i; - w[0] = MIN(x[0], x[1]-x[0]); - for (i=1;i<ndim-1;i++) - w[i] = MIN(x[i]-x[i-1], x[i+1]-x[i]); - w[ndim-1] = MIN(x[ndim-1]-x[ndim-2], PI-x[ndim-1]); - - for (i=0;i<ndim;i++) - w[i] = 1./(.01+w[i]); - //w[0]*=3; - //w[1]*=2; -} - -/* LSP weight calculation ported from m-file function kindly submitted - by Anssi, OH3GDD */ - -void compute_weights_anssi_mode2(const float *x, float *w, int ndim) -{ - int i; - float d[LPC_ORD]; - - assert(ndim == LPC_ORD); - - for(i=0; i<LPC_ORD; i++) - d[i] = 1.0; - - d[0] = x[1]; - for (i=1; i<LPC_ORD-1; i++) - d[i] = x[i+1] - x[i-1]; - d[LPC_ORD-1] = PI - x[8]; - for (i=0; i<LPC_ORD; i++) { - if (x[i]<((400.0/4000.0)*PI)) - w[i]=5.0/(0.01+d[i]); - else if (x[i]<((700.0/4000.0)*PI)) - w[i]=4.0/(0.01+d[i]); - else if (x[i]<((1200.0/4000.0)*PI)) - w[i]=3.0/(0.01+d[i]); - else if (x[i]<((2000.0/4000.0)*PI)) - w[i]=2.0/(0.01+d[i]); - else - w[i]=1.0/(0.01+d[i]); - - w[i]=pow(w[i]+0.3, 0.66); - } -} - -int find_nearest(const float *codebook, int nb_entries, float *x, int ndim) -{ - int i, j; - float min_dist = 1e15; - int nearest = 0; - - for (i=0;i<nb_entries;i++) - { - float dist=0; - for (j=0;j<ndim;j++) - dist += (x[j]-codebook[i*ndim+j])*(x[j]-codebook[i*ndim+j]); - if (dist<min_dist) - { - min_dist = dist; - nearest = i; - } - } - return nearest; -} - -int find_nearest_weighted(const float *codebook, int nb_entries, float *x, const float *w, int ndim) -{ - int i, j; - float min_dist = 1e15; - int nearest = 0; - - for (i=0;i<nb_entries;i++) - { - float dist=0; - for (j=0;j<ndim;j++) - dist += w[j]*(x[j]-codebook[i*ndim+j])*(x[j]-codebook[i*ndim+j]); - if (dist<min_dist) - { - min_dist = dist; - nearest = i; - } - } - return nearest; -} - -void lspjvm_quantise(float *x, float *xq, int ndim) -{ - int i, n1, n2, n3; - float err[LPC_ORD], err2[LPC_ORD], err3[LPC_ORD]; - float w[LPC_ORD], w2[LPC_ORD], w3[LPC_ORD]; - const float *codebook1 = lsp_cbjvm[0].cb; - const float *codebook2 = lsp_cbjvm[1].cb; - const float *codebook3 = lsp_cbjvm[2].cb; - - w[0] = MIN(x[0], x[1]-x[0]); - for (i=1;i<ndim-1;i++) - w[i] = MIN(x[i]-x[i-1], x[i+1]-x[i]); - w[ndim-1] = MIN(x[ndim-1]-x[ndim-2], PI-x[ndim-1]); - - compute_weights(x, w, ndim); - - n1 = find_nearest(codebook1, lsp_cbjvm[0].m, x, ndim); - - for (i=0;i<ndim;i++) - { - xq[i] = codebook1[ndim*n1+i]; - err[i] = x[i] - xq[i]; - } - for (i=0;i<ndim/2;i++) - { - err2[i] = err[2*i]; - err3[i] = err[2*i+1]; - w2[i] = w[2*i]; - w3[i] = w[2*i+1]; - } - n2 = find_nearest_weighted(codebook2, lsp_cbjvm[1].m, err2, w2, ndim/2); - n3 = find_nearest_weighted(codebook3, lsp_cbjvm[2].m, err3, w3, ndim/2); - - for (i=0;i<ndim/2;i++) - { - xq[2*i] += codebook2[ndim*n2/2+i]; - xq[2*i+1] += codebook3[ndim*n3/2+i]; - } -} - -#ifdef __EXPERIMENTAL__ - -#define MBEST_STAGES 4 - -struct MBEST_LIST { - int index[MBEST_STAGES]; /* index of each stage that lead us to this error */ - float error; -}; - -struct MBEST { - int entries; /* number of entries in mbest list */ - struct MBEST_LIST *list; -}; - - -static struct MBEST *mbest_create(int entries) { - int i,j; - struct MBEST *mbest; - - assert(entries > 0); - mbest = (struct MBEST *)malloc(sizeof(struct MBEST)); - assert(mbest != NULL); - - mbest->entries = entries; - mbest->list = (struct MBEST_LIST *)malloc(entries*sizeof(struct MBEST_LIST)); - assert(mbest->list != NULL); - - for(i=0; i<mbest->entries; i++) { - for(j=0; j<MBEST_STAGES; j++) - mbest->list[i].index[j] = 0; - mbest->list[i].error = 1E32; - } - - return mbest; -} - - -static void mbest_destroy(struct MBEST *mbest) { - assert(mbest != NULL); - free(mbest->list); - free(mbest); -} - - -/*---------------------------------------------------------------------------*\ - - mbest_insert - - Insert the results of a vector to codebook entry comparison. The - list is ordered in order or error, so those entries with the - smallest error will be first on the list. - -\*---------------------------------------------------------------------------*/ - -static void mbest_insert(struct MBEST *mbest, int index[], float error) { - int i, j, found; - struct MBEST_LIST *list = mbest->list; - int entries = mbest->entries; - - found = 0; - for(i=0; i<entries && !found; i++) - if (error < list[i].error) { - found = 1; - for(j=entries-1; j>i; j--) - list[j] = list[j-1]; - for(j=0; j<MBEST_STAGES; j++) - list[i].index[j] = index[j]; - list[i].error = error; - } -} - - -static void mbest_print(char title[], struct MBEST *mbest) { - int i,j; - - printf("%s\n", title); - for(i=0; i<mbest->entries; i++) { - for(j=0; j<MBEST_STAGES; j++) - printf(" %4d ", mbest->list[i].index[j]); - printf(" %f\n", mbest->list[i].error); - } -} - - -/*---------------------------------------------------------------------------*\ - - mbest_search - - Searches vec[] to a codebbook of vectors, and maintains a list of the mbest - closest matches. - -\*---------------------------------------------------------------------------*/ - -static void mbest_search( - const float *cb, /* VQ codebook to search */ - float vec[], /* target vector */ - float w[], /* weighting vector */ - int k, /* dimension of vector */ - int m, /* number on entries in codebook */ - struct MBEST *mbest, /* list of closest matches */ - int index[] /* indexes that lead us here */ -) -{ - float e; - int i,j; - float diff; - - for(j=0; j<m; j++) { - e = 0.0; - for(i=0; i<k; i++) { - diff = cb[j*k+i]-vec[i]; - e += pow(diff*w[i],2.0); - } - index[0] = j; - mbest_insert(mbest, index, e); - } -} - - -/* 3 stage VQ LSP quantiser. Design and guidance kindly submitted by Anssi, OH3GDD */ - -void lspanssi_quantise(float *x, float *xq, int ndim, int mbest_entries) -{ - int i, j, n1, n2, n3, n4; - float w[LPC_ORD]; - const float *codebook1 = lsp_cbvqanssi[0].cb; - const float *codebook2 = lsp_cbvqanssi[1].cb; - const float *codebook3 = lsp_cbvqanssi[2].cb; - const float *codebook4 = lsp_cbvqanssi[3].cb; - struct MBEST *mbest_stage1, *mbest_stage2, *mbest_stage3, *mbest_stage4; - float target[LPC_ORD]; - int index[MBEST_STAGES]; - - mbest_stage1 = mbest_create(mbest_entries); - mbest_stage2 = mbest_create(mbest_entries); - mbest_stage3 = mbest_create(mbest_entries); - mbest_stage4 = mbest_create(mbest_entries); - for(i=0; i<MBEST_STAGES; i++) - index[i] = 0; - - compute_weights_anssi_mode2(x, w, ndim); - - #ifdef DUMP - dump_weights(w, ndim); - #endif - - /* Stage 1 */ - - mbest_search(codebook1, x, w, ndim, lsp_cbvqanssi[0].m, mbest_stage1, index); - mbest_print("Stage 1:", mbest_stage1); - - /* Stage 2 */ - - for (j=0; j<mbest_entries; j++) { - index[1] = n1 = mbest_stage1->list[j].index[0]; - for(i=0; i<ndim; i++) - target[i] = x[i] - codebook1[ndim*n1+i]; - mbest_search(codebook2, target, w, ndim, lsp_cbvqanssi[1].m, mbest_stage2, index); - } - mbest_print("Stage 2:", mbest_stage2); - - /* Stage 3 */ - - for (j=0; j<mbest_entries; j++) { - index[2] = n1 = mbest_stage2->list[j].index[1]; - index[1] = n2 = mbest_stage2->list[j].index[0]; - for(i=0; i<ndim; i++) - target[i] = x[i] - codebook1[ndim*n1+i] - codebook2[ndim*n2+i]; - mbest_search(codebook3, target, w, ndim, lsp_cbvqanssi[2].m, mbest_stage3, index); - } - mbest_print("Stage 3:", mbest_stage3); - - /* Stage 4 */ - - for (j=0; j<mbest_entries; j++) { - index[3] = n1 = mbest_stage3->list[j].index[2]; - index[2] = n2 = mbest_stage3->list[j].index[1]; - index[1] = n3 = mbest_stage3->list[j].index[0]; - for(i=0; i<ndim; i++) - target[i] = x[i] - codebook1[ndim*n1+i] - codebook2[ndim*n2+i] - codebook3[ndim*n3+i]; - mbest_search(codebook4, target, w, ndim, lsp_cbvqanssi[3].m, mbest_stage4, index); - } - mbest_print("Stage 4:", mbest_stage4); - - n1 = mbest_stage4->list[0].index[3]; - n2 = mbest_stage4->list[0].index[2]; - n3 = mbest_stage4->list[0].index[1]; - n4 = mbest_stage4->list[0].index[0]; - for (i=0;i<ndim;i++) - xq[i] = codebook1[ndim*n1+i] + codebook2[ndim*n2+i] + codebook3[ndim*n3+i] + codebook4[ndim*n4+i]; - - mbest_destroy(mbest_stage1); - mbest_destroy(mbest_stage2); - mbest_destroy(mbest_stage3); - mbest_destroy(mbest_stage4); -} -#endif - -int check_lsp_order(float lsp[], int lpc_order) -{ - int i; - float tmp; - int swaps = 0; - - for(i=1; i<lpc_order; i++) - if (lsp[i] < lsp[i-1]) { - //fprintf(stderr, "swap %d\n",i); - swaps++; - tmp = lsp[i-1]; - lsp[i-1] = lsp[i]-0.1; - lsp[i] = tmp+0.1; - i = 1; /* start check again, as swap may have caused out of order */ - } - - return swaps; -} - -void force_min_lsp_dist(float lsp[], int lpc_order) -{ - int i; - - for(i=1; i<lpc_order; i++) - if ((lsp[i]-lsp[i-1]) < 0.01) { - lsp[i] += 0.01; - } -} - - -/*---------------------------------------------------------------------------*\ - - lpc_post_filter() - - Applies a post filter to the LPC synthesis filter power spectrum - Pw, which supresses the inter-formant energy. - - The algorithm is from p267 (Section 8.6) of "Digital Speech", - edited by A.M. Kondoz, 1994 published by Wiley and Sons. Chapter 8 - of this text is on the MBE vocoder, and this is a freq domain - adaptation of post filtering commonly used in CELP. - - I used the Octave simulation lpcpf.m to get an understaing of the - algorithm. - - Requires two more FFTs which is significantly more MIPs. However - it should be possible to implement this more efficiently in the - time domain. Just not sure how to handle relative time delays - between the synthesis stage and updating these coeffs. A smaller - FFT size might also be accetable to save CPU. - - TODO: - [ ] sync var names between Octave and C version - [ ] doc gain normalisation - [ ] I think the first FFT is not rqd as we do the same - thing in aks_to_M2(). - -\*---------------------------------------------------------------------------*/ - -void lpc_post_filter(kiss_fft_cfg fft_fwd_cfg, MODEL *model, COMP Pw[], float ak[], - int order, int dump, float beta, float gamma, int bass_boost) -{ - int i; - COMP x[FFT_ENC]; /* input to FFTs */ - COMP Aw[FFT_ENC]; /* LPC analysis filter spectrum */ - COMP Ww[FFT_ENC]; /* weighting spectrum */ - float Rw[FFT_ENC]; /* R = WA */ - float e_before, e_after, gain; - float Pfw[FFT_ENC]; /* Post filter mag spectrum */ - float max_Rw, min_Rw; - float coeff; - TIMER_VAR(tstart, tfft1, taw, tfft2, tww, tr); - - TIMER_SAMPLE(tstart); - - /* Determine LPC inverse filter spectrum 1/A(exp(jw)) -----------*/ - - /* we actually want the synthesis filter A(exp(jw)) but the - inverse (analysis) filter is easier to find as it's FIR, we - just use the inverse of 1/A to get the synthesis filter - A(exp(jw)) */ - - for(i=0; i<FFT_ENC; i++) { - x[i].real = 0.0; - x[i].imag = 0.0; - } - - for(i=0; i<=order; i++) - x[i].real = ak[i]; - kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)x, (kiss_fft_cpx *)Aw); - - TIMER_SAMPLE_AND_LOG(tfft1, tstart, " fft1"); - - for(i=0; i<FFT_ENC/2; i++) { - Aw[i].real = 1.0/(Aw[i].real*Aw[i].real + Aw[i].imag*Aw[i].imag); - } - - TIMER_SAMPLE_AND_LOG(taw, tfft1, " Aw"); - - /* Determine weighting filter spectrum W(exp(jw)) ---------------*/ - - for(i=0; i<FFT_ENC; i++) { - x[i].real = 0.0; - x[i].imag = 0.0; - } - - x[0].real = ak[0]; - coeff = gamma; - for(i=1; i<=order; i++) { - x[i].real = ak[i] * coeff; - coeff *= gamma; - } - kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)x, (kiss_fft_cpx *)Ww); - - TIMER_SAMPLE_AND_LOG(tfft2, taw, " fft2"); - - for(i=0; i<FFT_ENC/2; i++) { - Ww[i].real = Ww[i].real*Ww[i].real + Ww[i].imag*Ww[i].imag; - } - - TIMER_SAMPLE_AND_LOG(tww, tfft2, " Ww"); - - /* Determined combined filter R = WA ---------------------------*/ - - max_Rw = 0.0; min_Rw = 1E32; - for(i=0; i<FFT_ENC/2; i++) { - Rw[i] = sqrtf(Ww[i].real * Aw[i].real); - if (Rw[i] > max_Rw) - max_Rw = Rw[i]; - if (Rw[i] < min_Rw) - min_Rw = Rw[i]; - - } - - TIMER_SAMPLE_AND_LOG(tr, tww, " R"); - - #ifdef DUMP - if (dump) - dump_Rw(Rw); - #endif - - /* create post filter mag spectrum and apply ------------------*/ - - /* measure energy before post filtering */ - - e_before = 1E-4; - for(i=0; i<FFT_ENC/2; i++) - e_before += Pw[i].real; - - /* apply post filter and measure energy */ - - #ifdef DUMP - if (dump) - dump_Pwb(Pw); - #endif - - e_after = 1E-4; - for(i=0; i<FFT_ENC/2; i++) { - Pfw[i] = powf(Rw[i], beta); - Pw[i].real *= Pfw[i] * Pfw[i]; - e_after += Pw[i].real; - } - gain = e_before/e_after; - - /* apply gain factor to normalise energy */ - - for(i=0; i<FFT_ENC/2; i++) { - Pw[i].real *= gain; - } - - if (bass_boost) { - /* add 3dB to first 1 kHz to account for LP effect of PF */ - - for(i=0; i<FFT_ENC/8; i++) { - Pw[i].real *= 1.4*1.4; - } - } - - TIMER_SAMPLE_AND_LOG2(tr, " filt"); -} - - -/*---------------------------------------------------------------------------*\ - - aks_to_M2() - - Transforms the linear prediction coefficients to spectral amplitude - samples. This function determines A(m) from the average energy per - band using an FFT. - -\*---------------------------------------------------------------------------*/ - -void aks_to_M2( - kiss_fft_cfg fft_fwd_cfg, - float ak[], /* LPC's */ - int order, - MODEL *model, /* sinusoidal model parameters for this frame */ - float E, /* energy term */ - float *snr, /* signal to noise ratio for this frame in dB */ - int dump, /* true to dump sample to dump file */ - int sim_pf, /* true to simulate a post filter */ - int pf, /* true to LPC post filter */ - int bass_boost, /* enable LPC filter 0-1khz 3dB boost */ - float beta, - float gamma /* LPC post filter parameters */ -) -{ - COMP pw[FFT_ENC]; /* input to FFT for power spectrum */ - COMP Pw[FFT_ENC]; /* output power spectrum */ - int i,m; /* loop variables */ - int am,bm; /* limits of current band */ - float r; /* no. rads/bin */ - float Em; /* energy in band */ - float Am; /* spectral amplitude sample */ - float signal, noise; - TIMER_VAR(tstart, tfft, tpw, tpf); - - TIMER_SAMPLE(tstart); - - r = TWO_PI/(FFT_ENC); - - /* Determine DFT of A(exp(jw)) --------------------------------------------*/ - - for(i=0; i<FFT_ENC; i++) { - pw[i].real = 0.0; - pw[i].imag = 0.0; - } - - for(i=0; i<=order; i++) - pw[i].real = ak[i]; - kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)pw, (kiss_fft_cpx *)Pw); - - TIMER_SAMPLE_AND_LOG(tfft, tstart, " fft"); - - /* Determine power spectrum P(w) = E/(A(exp(jw))^2 ------------------------*/ - - for(i=0; i<FFT_ENC/2; i++) - Pw[i].real = E/(Pw[i].real*Pw[i].real + Pw[i].imag*Pw[i].imag); - - TIMER_SAMPLE_AND_LOG(tpw, tfft, " Pw"); - - if (pf) - lpc_post_filter(fft_fwd_cfg, model, Pw, ak, order, dump, beta, gamma, bass_boost); - - TIMER_SAMPLE_AND_LOG(tpf, tpw, " LPC post filter"); - - #ifdef DUMP - if (dump) - dump_Pw(Pw); - #endif - - /* Determine magnitudes from P(w) ----------------------------------------*/ - - /* when used just by decoder {A} might be all zeroes so init signal - and noise to prevent log(0) errors */ - - signal = 1E-30; noise = 1E-32; - - for(m=1; m<=model->L; m++) { - am = (int)((m - 0.5)*model->Wo/r + 0.5); - bm = (int)((m + 0.5)*model->Wo/r + 0.5); - Em = 0.0; - - for(i=am; i<bm; i++) - Em += Pw[i].real; - Am = sqrtf(Em); - - signal += model->A[m]*model->A[m]; - noise += (model->A[m] - Am)*(model->A[m] - Am); - - /* This code significantly improves perf of LPC model, in - particular when combined with phase0. The LPC spectrum tends - to track just under the peaks of the spectral envelope, and - just above nulls. This algorithm does the reverse to - compensate - raising the amplitudes of spectral peaks, while - attenuating the null. This enhances the formants, and - supresses the energy between formants. */ - - if (sim_pf) { - if (Am > model->A[m]) - Am *= 0.7; - if (Am < model->A[m]) - Am *= 1.4; - } - - model->A[m] = Am; - } - *snr = 10.0*log10f(signal/noise); - - TIMER_SAMPLE_AND_LOG2(tpf, " rec"); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_Wo() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Encodes Wo using a WO_LEVELS quantiser. - -\*---------------------------------------------------------------------------*/ - -int encode_Wo(float Wo) -{ - int index; - float Wo_min = TWO_PI/P_MAX; - float Wo_max = TWO_PI/P_MIN; - float norm; - - norm = (Wo - Wo_min)/(Wo_max - Wo_min); - index = floorf(WO_LEVELS * norm + 0.5); - if (index < 0 ) index = 0; - if (index > (WO_LEVELS-1)) index = WO_LEVELS-1; - - return index; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_Wo() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Decodes Wo using a WO_LEVELS quantiser. - -\*---------------------------------------------------------------------------*/ - -float decode_Wo(int index) -{ - float Wo_min = TWO_PI/P_MAX; - float Wo_max = TWO_PI/P_MIN; - float step; - float Wo; - - step = (Wo_max - Wo_min)/WO_LEVELS; - Wo = Wo_min + step*(index); - - return Wo; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_Wo_dt() - AUTHOR......: David Rowe - DATE CREATED: 6 Nov 2011 - - Encodes Wo difference from last frame. - -\*---------------------------------------------------------------------------*/ - -int encode_Wo_dt(float Wo, float prev_Wo) -{ - int index, mask, max_index, min_index; - float Wo_min = TWO_PI/P_MAX; - float Wo_max = TWO_PI/P_MIN; - float norm; - - norm = (Wo - prev_Wo)/(Wo_max - Wo_min); - index = floor(WO_LEVELS * norm + 0.5); - //printf("ENC index: %d ", index); - - /* hard limit */ - - max_index = (1 << (WO_DT_BITS-1)) - 1; - min_index = - (max_index+1); - if (index > max_index) index = max_index; - if (index < min_index) index = min_index; - //printf("max_index: %d min_index: %d hard index: %d ", - // max_index, min_index, index); - - /* mask so that only LSB WO_DT_BITS remain, bit WO_DT_BITS is the sign bit */ - - mask = ((1 << WO_DT_BITS) - 1); - index &= mask; - //printf("mask: 0x%x index: 0x%x\n", mask, index); - - return index; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_Wo_dt() - AUTHOR......: David Rowe - DATE CREATED: 6 Nov 2011 - - Decodes Wo using WO_DT_BITS difference from last frame. - -\*---------------------------------------------------------------------------*/ - -float decode_Wo_dt(int index, float prev_Wo) -{ - float Wo_min = TWO_PI/P_MAX; - float Wo_max = TWO_PI/P_MIN; - float step; - float Wo; - int mask; - - /* sign extend index */ - - //printf("DEC index: %d "); - if (index & (1 << (WO_DT_BITS-1))) { - mask = ~((1 << WO_DT_BITS) - 1); - index |= mask; - } - //printf("DEC mask: 0x%x index: %d \n", mask, index); - - step = (Wo_max - Wo_min)/WO_LEVELS; - Wo = prev_Wo + step*(index); - - /* bit errors can make us go out of range leading to all sorts of - probs like seg faults */ - - if (Wo > Wo_max) Wo = Wo_max; - if (Wo < Wo_min) Wo = Wo_min; - - return Wo; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: speech_to_uq_lsps() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Analyse a windowed frame of time domain speech to determine LPCs - which are the converted to LSPs for quantisation and transmission - over the channel. - -\*---------------------------------------------------------------------------*/ - -float speech_to_uq_lsps(float lsp[], - float ak[], - float Sn[], - float w[], - int order -) -{ - int i, roots; - float Wn[M]; - float R[LPC_MAX+1]; - float e, E; - - e = 0.0; - for(i=0; i<M; i++) { - Wn[i] = Sn[i]*w[i]; - e += Wn[i]*Wn[i]; - } - - /* trap 0 energy case as LPC analysis will fail */ - - if (e == 0.0) { - for(i=0; i<order; i++) - lsp[i] = (PI/order)*(float)i; - return 0.0; - } - - autocorrelate(Wn, R, M, order); - levinson_durbin(R, ak, order); - - E = 0.0; - for(i=0; i<=order; i++) - E += ak[i]*R[i]; - - /* 15 Hz BW expansion as I can't hear the difference and it may help - help occasional fails in the LSP root finding. Important to do this - after energy calculation to avoid -ve energy values. - */ - - for(i=0; i<=order; i++) - ak[i] *= powf(0.994,(float)i); - - roots = lpc_to_lsp(ak, order, lsp, 5, LSP_DELTA1); - if (roots != order) { - /* if root finding fails use some benign LSP values instead */ - for(i=0; i<order; i++) - lsp[i] = (PI/order)*(float)i; - } - - return E; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_lsps_scalar() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Thirty-six bit sclar LSP quantiser. From a vector of unquantised - (floating point) LSPs finds the quantised LSP indexes. - -\*---------------------------------------------------------------------------*/ - -void encode_lsps_scalar(int indexes[], float lsp[], int order) -{ - int i,k,m; - float wt[1]; - float lsp_hz[LPC_MAX]; - const float * cb; - float se = 0.0f; - - /* convert from radians to Hz so we can use human readable - frequencies */ - - for(i=0; i<order; i++) - lsp_hz[i] = (4000.0/PI)*lsp[i]; - - /* scalar quantisers */ - - wt[0] = 1.0; - for(i=0; i<order; i++) { - k = lsp_cb[i].k; - m = lsp_cb[i].m; - cb = lsp_cb[i].cb; - indexes[i] = quantise(cb, &lsp_hz[i], wt, k, m, &se); - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_lsps_scalar() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - From a vector of quantised LSP indexes, returns the quantised - (floating point) LSPs. - -\*---------------------------------------------------------------------------*/ - -void decode_lsps_scalar(float lsp[], int indexes[], int order) -{ - int i,k; - float lsp_hz[LPC_MAX]; - const float * cb; - - for(i=0; i<order; i++) { - k = lsp_cb[i].k; - cb = lsp_cb[i].cb; - lsp_hz[i] = cb[indexes[i]*k]; - } - - /* convert back to radians */ - - for(i=0; i<order; i++) - lsp[i] = (PI/4000.0)*lsp_hz[i]; -} - - -#ifdef __EXPERIMENTAL__ - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_lsps_diff_freq_vq() - AUTHOR......: David Rowe - DATE CREATED: 15 November 2011 - - Twenty-five bit LSP quantiser. LSPs 1-4 are quantised with scalar - LSP differences (in frequency, i.e difference from the previous - LSP). LSPs 5-10 are quantised with a VQ trained generated using - vqtrainjnd.c - -\*---------------------------------------------------------------------------*/ - -void encode_lsps_diff_freq_vq(int indexes[], float lsp[], int order) -{ - int i,k,m; - float lsp_hz[LPC_MAX]; - float lsp__hz[LPC_MAX]; - float dlsp[LPC_MAX]; - float dlsp_[LPC_MAX]; - float wt[LPC_MAX]; - const float * cb; - float se = 0.0f; - - for(i=0; i<LPC_ORD; i++) { - wt[i] = 1.0; - } - - /* convert from radians to Hz so we can use human readable - frequencies */ - - for(i=0; i<order; i++) - lsp_hz[i] = (4000.0/PI)*lsp[i]; - - /* scalar quantisers for LSP differences 1..4 */ - - wt[0] = 1.0; - for(i=0; i<4; i++) { - if (i) - dlsp[i] = lsp_hz[i] - lsp__hz[i-1]; - else - dlsp[0] = lsp_hz[0]; - - k = lsp_cbd[i].k; - m = lsp_cbd[i].m; - cb = lsp_cbd[i].cb; - indexes[i] = quantise(cb, &dlsp[i], wt, k, m, &se); - dlsp_[i] = cb[indexes[i]*k]; - - if (i) - lsp__hz[i] = lsp__hz[i-1] + dlsp_[i]; - else - lsp__hz[0] = dlsp_[0]; - } - - /* VQ LSPs 5,6,7,8,9,10 */ - - k = lsp_cbjnd[4].k; - m = lsp_cbjnd[4].m; - cb = lsp_cbjnd[4].cb; - indexes[4] = quantise(cb, &lsp_hz[4], &wt[4], k, m, &se); -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_lsps_diff_freq_vq() - AUTHOR......: David Rowe - DATE CREATED: 15 Nov 2011 - - From a vector of quantised LSP indexes, returns the quantised - (floating point) LSPs. - -\*---------------------------------------------------------------------------*/ - -void decode_lsps_diff_freq_vq(float lsp_[], int indexes[], int order) -{ - int i,k,m; - float dlsp_[LPC_MAX]; - float lsp__hz[LPC_MAX]; - const float * cb; - - /* scalar LSP differences */ - - for(i=0; i<4; i++) { - cb = lsp_cbd[i].cb; - dlsp_[i] = cb[indexes[i]]; - if (i) - lsp__hz[i] = lsp__hz[i-1] + dlsp_[i]; - else - lsp__hz[0] = dlsp_[0]; - } - - /* VQ */ - - k = lsp_cbjnd[4].k; - m = lsp_cbjnd[4].m; - cb = lsp_cbjnd[4].cb; - for(i=4; i<order; i++) - lsp__hz[i] = cb[indexes[4]*k+i-4]; - - /* convert back to radians */ - - for(i=0; i<order; i++) - lsp_[i] = (PI/4000.0)*lsp__hz[i]; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_lsps_diff_time() - AUTHOR......: David Rowe - DATE CREATED: 12 Sep 2012 - - Encode difference from preious frames's LSPs using - 3,3,2,2,2,2,1,1,1,1 scalar quantisers (18 bits total). - -\*---------------------------------------------------------------------------*/ - -void encode_lsps_diff_time(int indexes[], - float lsps[], - float lsps__prev[], - int order) -{ - int i,k,m; - float lsps_dt[LPC_ORD]; - float wt[LPC_MAX]; - const float * cb; - float se = 0.0f; - - /* Determine difference in time and convert from radians to Hz so - we can use human readable frequencies */ - - for(i=0; i<LPC_ORD; i++) { - lsps_dt[i] = (4000/PI)*(lsps[i] - lsps__prev[i]); - } - - /* scalar quantisers */ - - wt[0] = 1.0; - for(i=0; i<order; i++) { - k = lsp_cbdt[i].k; - m = lsp_cbdt[i].m; - cb = lsp_cbdt[i].cb; - indexes[i] = quantise(cb, &lsps_dt[i], wt, k, m, &se); - } - -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_lsps_diff_time() - AUTHOR......: David Rowe - DATE CREATED: 15 Nov 2011 - - From a quantised LSP indexes, returns the quantised - (floating point) LSPs. - -\*---------------------------------------------------------------------------*/ - -void decode_lsps_diff_time( - float lsps_[], - int indexes[], - float lsps__prev[], - int order) -{ - int i,k,m; - const float * cb; - - for(i=0; i<order; i++) - lsps_[i] = lsps__prev[i]; - - for(i=0; i<order; i++) { - k = lsp_cbdt[i].k; - cb = lsp_cbdt[i].cb; - lsps_[i] += (PI/4000.0)*cb[indexes[i]*k]; - } - -} -#endif - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_lsps_vq() - AUTHOR......: David Rowe - DATE CREATED: 15 Feb 2012 - - Multi-stage VQ LSP quantiser developed by Jean-Marc Valin. - -\*---------------------------------------------------------------------------*/ - -void encode_lsps_vq(int *indexes, float *x, float *xq, int ndim) -{ - int i, n1, n2, n3; - float err[LPC_ORD], err2[LPC_ORD], err3[LPC_ORD]; - float w[LPC_ORD], w2[LPC_ORD], w3[LPC_ORD]; - const float *codebook1 = lsp_cbjvm[0].cb; - const float *codebook2 = lsp_cbjvm[1].cb; - const float *codebook3 = lsp_cbjvm[2].cb; - - assert(ndim <= LPC_ORD); - - w[0] = MIN(x[0], x[1]-x[0]); - for (i=1;i<ndim-1;i++) - w[i] = MIN(x[i]-x[i-1], x[i+1]-x[i]); - w[ndim-1] = MIN(x[ndim-1]-x[ndim-2], PI-x[ndim-1]); - - compute_weights(x, w, ndim); - - n1 = find_nearest(codebook1, lsp_cbjvm[0].m, x, ndim); - - for (i=0;i<ndim;i++) - { - xq[i] = codebook1[ndim*n1+i]; - err[i] = x[i] - xq[i]; - } - for (i=0;i<ndim/2;i++) - { - err2[i] = err[2*i]; - err3[i] = err[2*i+1]; - w2[i] = w[2*i]; - w3[i] = w[2*i+1]; - } - n2 = find_nearest_weighted(codebook2, lsp_cbjvm[1].m, err2, w2, ndim/2); - n3 = find_nearest_weighted(codebook3, lsp_cbjvm[2].m, err3, w3, ndim/2); - - indexes[0] = n1; - indexes[1] = n2; - indexes[2] = n3; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_lsps_vq() - AUTHOR......: David Rowe - DATE CREATED: 15 Feb 2012 - -\*---------------------------------------------------------------------------*/ - -void decode_lsps_vq(int *indexes, float *xq, int ndim) -{ - int i, n1, n2, n3; - const float *codebook1 = lsp_cbjvm[0].cb; - const float *codebook2 = lsp_cbjvm[1].cb; - const float *codebook3 = lsp_cbjvm[2].cb; - - n1 = indexes[0]; - n2 = indexes[1]; - n3 = indexes[2]; - - for (i=0;i<ndim;i++) - { - xq[i] = codebook1[ndim*n1+i]; - } - for (i=0;i<ndim/2;i++) - { - xq[2*i] += codebook2[ndim*n2/2+i]; - xq[2*i+1] += codebook3[ndim*n3/2+i]; - } -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: bw_expand_lsps() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Applies Bandwidth Expansion (BW) to a vector of LSPs. Prevents any - two LSPs getting too close together after quantisation. We know - from experiment that LSP quantisation errors < 12.5Hz (25Hz step - size) are inaudible so we use that as the minimum LSP separation. - -\*---------------------------------------------------------------------------*/ - -void bw_expand_lsps(float lsp[], int order, float min_sep_low, float min_sep_high) -{ - int i; - - for(i=1; i<4; i++) { - - if ((lsp[i] - lsp[i-1]) < min_sep_low*(PI/4000.0)) - lsp[i] = lsp[i-1] + min_sep_low*(PI/4000.0); - - } - - /* As quantiser gaps increased, larger BW expansion was required - to prevent twinkly noises. This may need more experiment for - different quanstisers. - */ - - for(i=4; i<order; i++) { - if (lsp[i] - lsp[i-1] < min_sep_high*(PI/4000.0)) - lsp[i] = lsp[i-1] + min_sep_high*(PI/4000.0); - } -} - -void bw_expand_lsps2(float lsp[], - int order -) -{ - int i; - - for(i=1; i<4; i++) { - - if ((lsp[i] - lsp[i-1]) < 100.0*(PI/4000.0)) - lsp[i] = lsp[i-1] + 100.0*(PI/4000.0); - - } - - /* As quantiser gaps increased, larger BW expansion was required - to prevent twinkly noises. This may need more experiment for - different quanstisers. - */ - - for(i=4; i<order; i++) { - if (lsp[i] - lsp[i-1] < 200.0*(PI/4000.0)) - lsp[i] = lsp[i-1] + 200.0*(PI/4000.0); - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: locate_lsps_jnd_steps() - AUTHOR......: David Rowe - DATE CREATED: 27/10/2011 - - Applies a form of Bandwidth Expansion (BW) to a vector of LSPs. - Listening tests have determined that "quantising" the position of - each LSP to the non-linear steps below introduces a "just noticable - difference" in the synthesised speech. - - This operation can be used before quantisation to limit the input - data to the quantiser to a number of discrete steps. - - This operation can also be used during quantisation as a form of - hysteresis in the calculation of quantiser error. For example if - the quantiser target of lsp1 is 500 Hz, candidate vectors with lsp1 - of 515 and 495 Hz sound effectively the same. - -\*---------------------------------------------------------------------------*/ - -void locate_lsps_jnd_steps(float lsps[], int order) -{ - int i; - float lsp_hz, step; - - assert(order == 10); - - /* quantise to 25Hz steps */ - - step = 25; - for(i=0; i<2; i++) { - lsp_hz = lsps[i]*4000.0/PI; - lsp_hz = floorf(lsp_hz/step + 0.5)*step; - lsps[i] = lsp_hz*PI/4000.0; - if (i) { - if (lsps[i] == lsps[i-1]) - lsps[i] += step*PI/4000.0; - - } - } - - /* quantise to 50Hz steps */ - - step = 50; - for(i=2; i<4; i++) { - lsp_hz = lsps[i]*4000.0/PI; - lsp_hz = floorf(lsp_hz/step + 0.5)*step; - lsps[i] = lsp_hz*PI/4000.0; - if (i) { - if (lsps[i] == lsps[i-1]) - lsps[i] += step*PI/4000.0; - - } - } - - /* quantise to 100Hz steps */ - - step = 100; - for(i=4; i<10; i++) { - lsp_hz = lsps[i]*4000.0/PI; - lsp_hz = floorf(lsp_hz/step + 0.5)*step; - lsps[i] = lsp_hz*PI/4000.0; - if (i) { - if (lsps[i] == lsps[i-1]) - lsps[i] += step*PI/4000.0; - - } - } -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: apply_lpc_correction() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Apply first harmonic LPC correction at decoder. This helps improve - low pitch males after LPC modelling, like hts1a and morig. - -\*---------------------------------------------------------------------------*/ - -void apply_lpc_correction(MODEL *model) -{ - if (model->Wo < (PI*150.0/4000)) { - model->A[1] *= 0.032; - } -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_energy() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Encodes LPC energy using an E_LEVELS quantiser. - -\*---------------------------------------------------------------------------*/ - -int encode_energy(float e) -{ - int index; - float e_min = E_MIN_DB; - float e_max = E_MAX_DB; - float norm; - - e = 10.0*log10f(e); - norm = (e - e_min)/(e_max - e_min); - index = floorf(E_LEVELS * norm + 0.5); - if (index < 0 ) index = 0; - if (index > (E_LEVELS-1)) index = E_LEVELS-1; - - return index; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_energy() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Decodes energy using a E_LEVELS quantiser. - -\*---------------------------------------------------------------------------*/ - -float decode_energy(int index) -{ - float e_min = E_MIN_DB; - float e_max = E_MAX_DB; - float step; - float e; - - step = (e_max - e_min)/E_LEVELS; - e = e_min + step*(index); - e = powf(10.0,e/10.0); - - return e; -} - -#ifdef NOT_USED -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_amplitudes() - AUTHOR......: David Rowe - DATE CREATED: 22/8/2010 - - Given the amplitude quantiser indexes recovers the harmonic - amplitudes. - -\*---------------------------------------------------------------------------*/ - -float decode_amplitudes(kiss_fft_cfg fft_fwd_cfg, - MODEL *model, - float ak[], - int lsp_indexes[], - int energy_index, - float lsps[], - float *e -) -{ - float snr; - - decode_lsps_scalar(lsps, lsp_indexes, LPC_ORD); - bw_expand_lsps(lsps, LPC_ORD); - lsp_to_lpc(lsps, ak, LPC_ORD); - *e = decode_energy(energy_index); - aks_to_M2(ak, LPC_ORD, model, *e, &snr, 1, 0, 0, 1); - apply_lpc_correction(model); - - return snr; -} -#endif - -static float ge_coeff[2] = {0.8, 0.9}; - -void compute_weights2(const float *x, const float *xp, float *w, int ndim) -{ - w[0] = 30; - w[1] = 1; - if (x[1]<0) - { - w[0] *= .6; - w[1] *= .3; - } - if (x[1]<-10) - { - w[0] *= .3; - w[1] *= .3; - } - /* Higher weight if pitch is stable */ - if (fabsf(x[0]-xp[0])<.2) - { - w[0] *= 2; - w[1] *= 1.5; - } else if (fabsf(x[0]-xp[0])>.5) /* Lower if not stable */ - { - w[0] *= .5; - } - - /* Lower weight for low energy */ - if (x[1] < xp[1]-10) - { - w[1] *= .5; - } - if (x[1] < xp[1]-20) - { - w[1] *= .5; - } - - //w[0] = 30; - //w[1] = 1; - - /* Square the weights because it's applied on the squared error */ - w[0] *= w[0]; - w[1] *= w[1]; - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: quantise_WoE() - AUTHOR......: Jean-Marc Valin & David Rowe - DATE CREATED: 29 Feb 2012 - - Experimental joint Wo and LPC energy vector quantiser developed by - Jean-Marc Valin. Exploits correlations between the difference in - the log pitch and log energy from frame to frame. For example - both the pitch and energy tend to only change by small amounts - during voiced speech, however it is important that these changes be - coded carefully. During unvoiced speech they both change a lot but - the ear is less sensitve to errors so coarser quantisation is OK. - - The ear is sensitive to log energy and loq pitch so we quantise in - these domains. That way the error measure used to quantise the - values is close to way the ear senses errors. - - See http://jmspeex.livejournal.com/10446.html - -\*---------------------------------------------------------------------------*/ - -void quantise_WoE(MODEL *model, float *e, float xq[]) -{ - int i, n1; - float x[2]; - float err[2]; - float w[2]; - const float *codebook1 = ge_cb[0].cb; - int nb_entries = ge_cb[0].m; - int ndim = ge_cb[0].k; - float Wo_min = TWO_PI/P_MAX; - float Wo_max = TWO_PI/P_MIN; - - x[0] = log10f((model->Wo/PI)*4000.0/50.0)/log10f(2); - x[1] = 10.0*log10f(1e-4 + *e); - - compute_weights2(x, xq, w, ndim); - for (i=0;i<ndim;i++) - err[i] = x[i]-ge_coeff[i]*xq[i]; - n1 = find_nearest_weighted(codebook1, nb_entries, err, w, ndim); - - for (i=0;i<ndim;i++) - { - xq[i] = ge_coeff[i]*xq[i] + codebook1[ndim*n1+i]; - err[i] -= codebook1[ndim*n1+i]; - } - - /* - x = log2(4000*Wo/(PI*50)); - 2^x = 4000*Wo/(PI*50) - Wo = (2^x)*(PI*50)/4000; - */ - - model->Wo = powf(2.0, xq[0])*(PI*50.0)/4000.0; - - /* bit errors can make us go out of range leading to all sorts of - probs like seg faults */ - - if (model->Wo > Wo_max) model->Wo = Wo_max; - if (model->Wo < Wo_min) model->Wo = Wo_min; - - model->L = PI/model->Wo; /* if we quantise Wo re-compute L */ - - *e = powf(10.0, xq[1]/10.0); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: encode_WoE() - AUTHOR......: Jean-Marc Valin & David Rowe - DATE CREATED: 11 May 2012 - - Joint Wo and LPC energy vector quantiser developed my Jean-Marc - Valin. Returns index, and updated states xq[]. - -\*---------------------------------------------------------------------------*/ - -int encode_WoE(MODEL *model, float e, float xq[]) -{ - int i, n1; - float x[2]; - float err[2]; - float w[2]; - const float *codebook1 = ge_cb[0].cb; - int nb_entries = ge_cb[0].m; - int ndim = ge_cb[0].k; - - assert((1<<WO_E_BITS) == nb_entries); - - if (e < 0.0) e = 0; /* occasional small negative energies due LPC round off I guess */ - - x[0] = log10f((model->Wo/PI)*4000.0/50.0)/log10f(2); - x[1] = 10.0*log10f(1e-4 + e); - - compute_weights2(x, xq, w, ndim); - for (i=0;i<ndim;i++) - err[i] = x[i]-ge_coeff[i]*xq[i]; - n1 = find_nearest_weighted(codebook1, nb_entries, err, w, ndim); - - for (i=0;i<ndim;i++) - { - xq[i] = ge_coeff[i]*xq[i] + codebook1[ndim*n1+i]; - err[i] -= codebook1[ndim*n1+i]; - } - - //printf("enc: %f %f (%f)(%f) \n", xq[0], xq[1], e, 10.0*log10(1e-4 + e)); - return n1; -} - - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: decode_WoE() - AUTHOR......: Jean-Marc Valin & David Rowe - DATE CREATED: 11 May 2012 - - Joint Wo and LPC energy vector quantiser developed my Jean-Marc - Valin. Given index and states xq[], returns Wo & E, and updates - states xq[]. - -\*---------------------------------------------------------------------------*/ - -void decode_WoE(MODEL *model, float *e, float xq[], int n1) -{ - int i; - const float *codebook1 = ge_cb[0].cb; - int ndim = ge_cb[0].k; - float Wo_min = TWO_PI/P_MAX; - float Wo_max = TWO_PI/P_MIN; - - for (i=0;i<ndim;i++) - { - xq[i] = ge_coeff[i]*xq[i] + codebook1[ndim*n1+i]; - } - - //printf("dec: %f %f\n", xq[0], xq[1]); - model->Wo = powf(2.0, xq[0])*(PI*50.0)/4000.0; - - /* bit errors can make us go out of range leading to all sorts of - probs like seg faults */ - - if (model->Wo > Wo_max) model->Wo = Wo_max; - if (model->Wo < Wo_min) model->Wo = Wo_min; - - model->L = PI/model->Wo; /* if we quantise Wo re-compute L */ - - *e = powf(10.0, xq[1]/10.0); -} - diff --git a/gr-vocoder/lib/codec2/quantise.h b/gr-vocoder/lib/codec2/quantise.h deleted file mode 100644 index cb9dd07fdb..0000000000 --- a/gr-vocoder/lib/codec2/quantise.h +++ /dev/null @@ -1,126 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: quantise.h - AUTHOR......: David Rowe - DATE CREATED: 31/5/92 - - Quantisation functions for the sinusoidal coder. - -\*---------------------------------------------------------------------------*/ - -/* - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __QUANTISE__ -#define __QUANTISE__ - -#include "kiss_fft.h" - -#define WO_BITS 7 -#define WO_LEVELS (1<<WO_BITS) -#define WO_DT_BITS 3 - -#define E_BITS 5 -#define E_LEVELS (1<<E_BITS) -#define E_MIN_DB -10.0 -#define E_MAX_DB 40.0 - -#define LSP_SCALAR_INDEXES 10 -#define LSPD_SCALAR_INDEXES 10 -#define LSP_PRED_VQ_INDEXES 3 -#define LSP_DIFF_FREQ_INDEXES 5 -#define LSP_DIFF_TIME_BITS 7 - -#define LSPDT_ALL 0 -#define LSPDT_LOW 1 -#define LSPDT_HIGH 2 - -#define WO_E_BITS 8 - -#define LPCPF_GAMMA 0.5 -#define LPCPF_BETA 0.2 - -void quantise_init(); -float lpc_model_amplitudes(float Sn[], float w[], MODEL *model, int order, - int lsp,float ak[]); -void aks_to_M2(kiss_fft_cfg fft_fwd_cfg, float ak[], int order, MODEL *model, - float E, float *snr, int dump, int sim_pf, - int pf, int bass_boost, float beta, float gamma); - -int encode_Wo(float Wo); -float decode_Wo(int index); -int encode_Wo_dt(float Wo, float prev_Wo); -float decode_Wo_dt(int index, float prev_Wo); -void encode_lsps_scalar(int indexes[], float lsp[], int order); -void decode_lsps_scalar(float lsp[], int indexes[], int order); -void encode_lspds_scalar(int indexes[], float lsp[], int order); -void decode_lspds_scalar(float lsp[], int indexes[], int order); -void encode_lsps_diff_freq_vq(int indexes[], float lsp[], int order); -void decode_lsps_diff_freq_vq(float lsp_[], int indexes[], int order); -void encode_lsps_diff_time(int indexes[], - float lsp[], - float lsp__prev[], - int order); -void decode_lsps_diff_time(float lsp_[], - int indexes[], - float lsp__prev[], - int order); - -void encode_lsps_vq(int *indexes, float *x, float *xq, int ndim); -void decode_lsps_vq(int *indexes, float *xq, int ndim); - -long quantise(const float * cb, float vec[], float w[], int k, int m, float *se); -void lspvq_quantise(float lsp[], float lsp_[], int order); -void lspjnd_quantise(float lsp[], float lsp_[], int order); -void lspdt_quantise(float lsps[], float lsps_[], float lsps__prev[], int mode); -void lspjvm_quantise(float lsps[], float lsps_[], int order); -void lspanssi_quantise(float lsps[], float lsps_[], int order, int mbest_entries); - -void quantise_WoE(MODEL *model, float *e, float xq[]); -int encode_WoE(MODEL *model, float e, float xq[]); -void decode_WoE(MODEL *model, float *e, float xq[], int n1); - -int encode_energy(float e); -float decode_energy(int index); - -void pack(unsigned char * bits, unsigned int *nbit, int index, unsigned int index_bits); -void pack_natural_or_gray(unsigned char * bits, unsigned int *nbit, int index, unsigned int index_bits, unsigned int gray); -int unpack(const unsigned char * bits, unsigned int *nbit, unsigned int index_bits); -int unpack_natural_or_gray(const unsigned char * bits, unsigned int *nbit, unsigned int index_bits, unsigned int gray); - -int lsp_bits(int i); -int lspd_bits(int i); -int lspdt_bits(int i); -int lsp_pred_vq_bits(int i); - -void apply_lpc_correction(MODEL *model); -float speech_to_uq_lsps(float lsp[], - float ak[], - float Sn[], - float w[], - int order - ); -int check_lsp_order(float lsp[], int lpc_order); -void bw_expand_lsps(float lsp[], int order, float min_sep_low, float min_sep_high); -void bw_expand_lsps2(float lsp[], int order); -void locate_lsps_jnd_steps(float lsp[], int order); -float decode_amplitudes(MODEL *model, - float ak[], - int lsp_indexes[], - int energy_index, - float lsps[], - float *e); - -#endif diff --git a/gr-vocoder/lib/codec2/rn.h b/gr-vocoder/lib/codec2/rn.h deleted file mode 100644 index 934f458406..0000000000 --- a/gr-vocoder/lib/codec2/rn.h +++ /dev/null @@ -1,964 +0,0 @@ -/* Generated by rn_file() Octave function */ - -const float gt_alpha5_root[]={ - 2.86997e-05, - 2.2286e-05, - 1.82863e-05, - 1.42303e-05, - 1.04905e-05, - 6.70859e-06, - 3.05918e-06, - -6.22187e-07, - -4.22748e-06, - -7.85603e-06, - -1.14317e-05, - -1.50227e-05, - -1.85712e-05, - -2.21275e-05, - -2.56455e-05, - -2.91642e-05, - -3.26453e-05, - -3.61199e-05, - -3.95556e-05, - -4.29778e-05, - -4.63581e-05, - -4.97179e-05, - -5.3032e-05, - -5.63184e-05, - -5.95548e-05, - -6.27565e-05, - -6.59032e-05, - -6.90085e-05, - -7.20538e-05, - -7.50509e-05, - -7.7983e-05, - -8.08605e-05, - -8.36678e-05, - -8.64141e-05, - -8.9085e-05, - -9.16888e-05, - -9.42119e-05, - -9.66619e-05, - -9.9026e-05, - -0.000101311, - -0.000103505, - -0.000105614, - -0.000107627, - -0.00010955, - -0.000111372, - -0.000113099, - -0.00011472, - -0.000116241, - -0.000117652, - -0.000118959, - -0.000120152, - -0.000121235, - -0.000122201, - -0.000123053, - -0.000123784, - -0.000124397, - -0.000124884, - -0.00012525, - -0.000125487, - -0.000125598, - -0.000125578, - -0.000125428, - -0.000125145, - -0.000124729, - -0.000124185, - -0.000123518, - -0.000122709, - -0.000121766, - -0.000120685, - -0.000119471, - -0.000118119, - -0.000116633, - -0.000115009, - -0.000113251, - -0.000111356, - -0.000109326, - -0.00010716, - -0.00010486, - -0.000102424, - -9.98553e-05, - -9.71528e-05, - -9.43199e-05, - -9.13551e-05, - -8.82623e-05, - -8.50404e-05, - -8.16936e-05, - -7.82211e-05, - -7.46271e-05, - -7.09109e-05, - -6.70773e-05, - -6.31256e-05, - -5.90607e-05, - -5.48823e-05, - -5.05954e-05, - -4.62001e-05, - -4.17016e-05, - -3.71002e-05, - -3.24015e-05, - -2.7606e-05, - -2.27195e-05, - -1.77428e-05, - -1.2682e-05, - -7.53795e-06, - -2.31702e-06, - 2.97965e-06, - 8.34567e-06, - 1.37796e-05, - 1.9275e-05, - 2.483e-05, - 3.04382e-05, - 3.60975e-05, - 4.18011e-05, - 4.75467e-05, - 5.33273e-05, - 5.91403e-05, - 6.49787e-05, - 7.08393e-05, - 7.67152e-05, - 8.26029e-05, - 8.84957e-05, - 9.43895e-05, - 0.000100278, - 0.000106157, - 0.00011202, - 0.000117864, - 0.000123681, - 0.000129468, - 0.000135218, - 0.000140929, - 0.000146583, - 0.000152183, - 0.000157725, - 0.000163202, - 0.000168608, - 0.000173938, - 0.000179183, - 0.00018434, - 0.0001894, - 0.00019436, - 0.000199211, - 0.000203949, - 0.000208568, - 0.000213063, - 0.000217426, - 0.000221654, - 0.00022574, - 0.000229678, - 0.000233463, - 0.000237089, - 0.000240551, - 0.000243843, - 0.000246959, - 0.000249895, - 0.000252644, - 0.000255202, - 0.000257562, - 0.000259721, - 0.000261672, - 0.000263411, - 0.000264933, - 0.000266234, - 0.000267308, - 0.000268152, - 0.00026876, - 0.000269128, - 0.000269253, - 0.000269129, - 0.000268754, - 0.000268123, - 0.000267232, - 0.000266079, - 0.000264658, - 0.000262968, - 0.000261006, - 0.000258767, - 0.000256251, - 0.000253453, - 0.000250373, - 0.000247007, - 0.000243354, - 0.000239412, - 0.00023518, - 0.000230655, - 0.000225837, - 0.000220723, - 0.000215314, - 0.000209608, - 0.000203605, - 0.000197304, - 0.000190706, - 0.000183812, - 0.000176621, - 0.000169145, - 0.000161363, - 0.000153275, - 0.000144895, - 0.000136224, - 0.000127266, - 0.00011802, - 0.000108491, - 9.8679e-05, - 8.85877e-05, - 7.82196e-05, - 6.7577e-05, - 5.66636e-05, - 4.54822e-05, - 3.40369e-05, - 2.23311e-05, - 1.03695e-05, - -1.844e-06, - -1.43041e-05, - -2.70061e-05, - -3.99444e-05, - -5.31139e-05, - -6.65082e-05, - -8.01218e-05, - -9.39481e-05, - -0.000107981, - -0.000122213, - -0.000136638, - -0.000151248, - -0.000166036, - -0.000180995, - -0.000196115, - -0.00021139, - -0.000226811, - -0.000242369, - -0.000258056, - -0.000273861, - -0.000289776, - -0.000305792, - -0.000321898, - -0.000338084, - -0.000354342, - -0.00037066, - -0.000387027, - -0.000403434, - -0.00041987, - -0.000436324, - -0.000452784, - -0.00046924, - -0.00048568, - -0.000502091, - -0.000518464, - -0.000534785, - -0.000551043, - -0.000567225, - -0.000583319, - -0.000599314, - -0.000615196, - -0.000630955, - -0.000646575, - -0.000662049, - -0.000677361, - -0.000692506, - -0.000707464, - -0.00072229, - -0.000736922, - -0.000751266, - -0.000765372, - -0.000779217, - -0.000792798, - -0.000806094, - -0.000819098, - -0.000831793, - -0.000844168, - -0.000856207, - -0.000867898, - -0.000879227, - -0.00089018, - -0.000900744, - -0.000910906, - -0.000920652, - -0.00092997, - -0.000938844, - -0.000947263, - -0.000955214, - -0.000962682, - -0.000969654, - -0.000976119, - -0.000982062, - -0.00098747, - -0.000992332, - -0.000996634, - -0.00100036, - -0.00100351, - -0.00100606, - -0.001008, - -0.00100932, - -0.00101, - -0.00101005, - -0.00100943, - -0.00100816, - -0.0010062, - -0.00100356, - -0.00100021, - -0.000996162, - -0.000991392, - -0.000985892, - -0.000979654, - -0.000972668, - -0.000964925, - -0.000956415, - -0.000947131, - -0.000937065, - -0.000926208, - -0.000914552, - -0.00090209, - -0.000888816, - -0.000874721, - -0.0008598, - -0.000844046, - -0.000827453, - -0.000810015, - -0.000791726, - -0.000772581, - -0.000752576, - -0.000731704, - -0.000709965, - -0.00068735, - -0.000663865, - -0.000639509, - -0.000614269, - -0.000588146, - -0.000561139, - -0.000533246, - -0.000504468, - -0.000474802, - -0.000444251, - -0.000412813, - -0.00038049, - -0.000347281, - -0.000313189, - -0.000278215, - -0.000242361, - -0.000205629, - -0.000168024, - -0.000129546, - -9.02024e-05, - -4.99954e-05, - -8.93026e-06, - 3.2988e-05, - 7.57537e-05, - 0.000119361, - 0.000163804, - 0.000209075, - 0.000255167, - 0.000302074, - 0.000349786, - 0.000398297, - 0.000447596, - 0.000497676, - 0.000548526, - 0.000600136, - 0.000652497, - 0.000705598, - 0.000759427, - 0.000813972, - 0.000869223, - 0.000925166, - 0.000981789, - 0.00103908, - 0.00109702, - 0.00115561, - 0.00121482, - 0.00127464, - 0.00133505, - 0.00139605, - 0.00145762, - 0.00151973, - 0.00158238, - 0.00164555, - 0.00170922, - 0.00177337, - 0.00183799, - 0.00190305, - 0.00196854, - 0.00203445, - 0.00210075, - 0.00216742, - 0.00223445, - 0.00230181, - 0.00236949, - 0.00243747, - 0.00250572, - 0.00257423, - 0.00264296, - 0.00271192, - 0.00278107, - 0.00285039, - 0.00291986, - 0.00298947, - 0.00305918, - 0.00312898, - 0.00319884, - 0.00326874, - 0.00333866, - 0.00340857, - 0.00347846, - 0.00354831, - 0.00361808, - 0.00368775, - 0.00375731, - 0.00382673, - 0.00389599, - 0.00396506, - 0.00403393, - 0.00410256, - 0.00417094, - 0.00423904, - 0.00430684, - 0.00437431, - 0.00444144, - 0.0045082, - 0.00457457, - 0.00464052, - 0.00470603, - 0.00477108, - 0.00483565, - 0.00489972, - 0.00496325, - 0.00502623, - 0.00508865, - 0.00515046, - 0.00521166, - 0.00527223, - 0.00533213, - 0.00539135, - 0.00544987, - 0.00550766, - 0.00556472, - 0.005621, - 0.00567651, - 0.00573121, - 0.00578508, - 0.00583811, - 0.00589028, - 0.00594157, - 0.00599196, - 0.00604143, - 0.00608996, - 0.00613754, - 0.00618415, - 0.00622977, - 0.00627439, - 0.00631798, - 0.00636054, - 0.00640204, - 0.0064425, - 0.00648186, - 0.00652009, - 0.00655722, - 0.00659322, - 0.00662808, - 0.00666179, - 0.00669433, - 0.00672571, - 0.00675589, - 0.00678488, - 0.00681266, - 0.00683921, - 0.00686454, - 0.00688863, - 0.00691147, - 0.00693305, - 0.00695336, - 0.0069724, - 0.00699016, - 0.00700663, - 0.00702181, - 0.00703569, - 0.00704826, - 0.00705952, - 0.00706947, - 0.00707809, - 0.0070854, - 0.00709138, - 0.00709604, - 0.00709937, - 0.00710136, - 0.00710203, - 0.00710136, - 0.00709937, - 0.00709604, - 0.00709138, - 0.0070854, - 0.00707809, - 0.00706947, - 0.00705952, - 0.00704826, - 0.00703569, - 0.00702181, - 0.00700663, - 0.00699016, - 0.0069724, - 0.00695336, - 0.00693305, - 0.00691147, - 0.00688863, - 0.00686454, - 0.00683921, - 0.00681266, - 0.00678488, - 0.00675589, - 0.00672571, - 0.00669433, - 0.00666179, - 0.00662808, - 0.00659322, - 0.00655722, - 0.00652009, - 0.00648186, - 0.0064425, - 0.00640204, - 0.00636054, - 0.00631798, - 0.00627439, - 0.00622977, - 0.00618415, - 0.00613754, - 0.00608996, - 0.00604143, - 0.00599196, - 0.00594157, - 0.00589028, - 0.00583811, - 0.00578508, - 0.00573121, - 0.00567651, - 0.005621, - 0.00556472, - 0.00550766, - 0.00544987, - 0.00539135, - 0.00533213, - 0.00527223, - 0.00521166, - 0.00515046, - 0.00508865, - 0.00502623, - 0.00496325, - 0.00489972, - 0.00483565, - 0.00477108, - 0.00470603, - 0.00464052, - 0.00457457, - 0.0045082, - 0.00444144, - 0.00437431, - 0.00430684, - 0.00423904, - 0.00417094, - 0.00410256, - 0.00403393, - 0.00396506, - 0.00389599, - 0.00382673, - 0.00375731, - 0.00368775, - 0.00361808, - 0.00354831, - 0.00347846, - 0.00340857, - 0.00333866, - 0.00326874, - 0.00319884, - 0.00312898, - 0.00305918, - 0.00298947, - 0.00291986, - 0.00285039, - 0.00278107, - 0.00271192, - 0.00264296, - 0.00257423, - 0.00250572, - 0.00243747, - 0.00236949, - 0.00230181, - 0.00223445, - 0.00216742, - 0.00210075, - 0.00203445, - 0.00196854, - 0.00190305, - 0.00183799, - 0.00177337, - 0.00170922, - 0.00164555, - 0.00158238, - 0.00151973, - 0.00145762, - 0.00139605, - 0.00133505, - 0.00127464, - 0.00121482, - 0.00115561, - 0.00109702, - 0.00103908, - 0.000981789, - 0.000925166, - 0.000869223, - 0.000813972, - 0.000759427, - 0.000705598, - 0.000652497, - 0.000600136, - 0.000548526, - 0.000497676, - 0.000447596, - 0.000398297, - 0.000349786, - 0.000302074, - 0.000255167, - 0.000209075, - 0.000163804, - 0.000119361, - 7.57537e-05, - 3.2988e-05, - -8.93026e-06, - -4.99954e-05, - -9.02024e-05, - -0.000129546, - -0.000168024, - -0.000205629, - -0.000242361, - -0.000278215, - -0.000313189, - -0.000347281, - -0.00038049, - -0.000412813, - -0.000444251, - -0.000474802, - -0.000504468, - -0.000533246, - -0.000561139, - -0.000588146, - -0.000614269, - -0.000639509, - -0.000663865, - -0.00068735, - -0.000709965, - -0.000731704, - -0.000752576, - -0.000772581, - -0.000791726, - -0.000810015, - -0.000827453, - -0.000844046, - -0.0008598, - -0.000874721, - -0.000888816, - -0.00090209, - -0.000914552, - -0.000926208, - -0.000937065, - -0.000947131, - -0.000956415, - -0.000964925, - -0.000972668, - -0.000979654, - -0.000985892, - -0.000991392, - -0.000996162, - -0.00100021, - -0.00100356, - -0.0010062, - -0.00100816, - -0.00100943, - -0.00101005, - -0.00101, - -0.00100932, - -0.001008, - -0.00100606, - -0.00100351, - -0.00100036, - -0.000996634, - -0.000992332, - -0.00098747, - -0.000982062, - -0.000976119, - -0.000969654, - -0.000962682, - -0.000955214, - -0.000947263, - -0.000938844, - -0.00092997, - -0.000920652, - -0.000910906, - -0.000900744, - -0.00089018, - -0.000879227, - -0.000867898, - -0.000856207, - -0.000844168, - -0.000831793, - -0.000819098, - -0.000806094, - -0.000792798, - -0.000779217, - -0.000765372, - -0.000751266, - -0.000736922, - -0.00072229, - -0.000707464, - -0.000692506, - -0.000677361, - -0.000662049, - -0.000646575, - -0.000630955, - -0.000615196, - -0.000599314, - -0.000583319, - -0.000567225, - -0.000551043, - -0.000534785, - -0.000518464, - -0.000502091, - -0.00048568, - -0.00046924, - -0.000452784, - -0.000436324, - -0.00041987, - -0.000403434, - -0.000387027, - -0.00037066, - -0.000354342, - -0.000338084, - -0.000321898, - -0.000305792, - -0.000289776, - -0.000273861, - -0.000258056, - -0.000242369, - -0.000226811, - -0.00021139, - -0.000196115, - -0.000180995, - -0.000166036, - -0.000151248, - -0.000136638, - -0.000122213, - -0.000107981, - -9.39481e-05, - -8.01218e-05, - -6.65082e-05, - -5.31139e-05, - -3.99444e-05, - -2.70061e-05, - -1.43041e-05, - -1.844e-06, - 1.03695e-05, - 2.23311e-05, - 3.40369e-05, - 4.54822e-05, - 5.66636e-05, - 6.7577e-05, - 7.82196e-05, - 8.85877e-05, - 9.8679e-05, - 0.000108491, - 0.00011802, - 0.000127266, - 0.000136224, - 0.000144895, - 0.000153275, - 0.000161363, - 0.000169145, - 0.000176621, - 0.000183812, - 0.000190706, - 0.000197304, - 0.000203605, - 0.000209608, - 0.000215314, - 0.000220723, - 0.000225837, - 0.000230655, - 0.00023518, - 0.000239412, - 0.000243354, - 0.000247007, - 0.000250373, - 0.000253453, - 0.000256251, - 0.000258767, - 0.000261006, - 0.000262968, - 0.000264658, - 0.000266079, - 0.000267232, - 0.000268123, - 0.000268754, - 0.000269129, - 0.000269253, - 0.000269128, - 0.00026876, - 0.000268152, - 0.000267308, - 0.000266234, - 0.000264933, - 0.000263411, - 0.000261672, - 0.000259721, - 0.000257562, - 0.000255202, - 0.000252644, - 0.000249895, - 0.000246959, - 0.000243843, - 0.000240551, - 0.000237089, - 0.000233463, - 0.000229678, - 0.00022574, - 0.000221654, - 0.000217426, - 0.000213063, - 0.000208568, - 0.000203949, - 0.000199211, - 0.00019436, - 0.0001894, - 0.00018434, - 0.000179183, - 0.000173938, - 0.000168608, - 0.000163202, - 0.000157725, - 0.000152183, - 0.000146583, - 0.000140929, - 0.000135218, - 0.000129468, - 0.000123681, - 0.000117864, - 0.00011202, - 0.000106157, - 0.000100278, - 9.43895e-05, - 8.84957e-05, - 8.26029e-05, - 7.67152e-05, - 7.08393e-05, - 6.49787e-05, - 5.91403e-05, - 5.33273e-05, - 4.75467e-05, - 4.18011e-05, - 3.60975e-05, - 3.04382e-05, - 2.483e-05, - 1.9275e-05, - 1.37796e-05, - 8.34567e-06, - 2.97965e-06, - -2.31702e-06, - -7.53795e-06, - -1.2682e-05, - -1.77428e-05, - -2.27195e-05, - -2.7606e-05, - -3.24015e-05, - -3.71002e-05, - -4.17016e-05, - -4.62001e-05, - -5.05954e-05, - -5.48823e-05, - -5.90607e-05, - -6.31256e-05, - -6.70773e-05, - -7.09109e-05, - -7.46271e-05, - -7.82211e-05, - -8.16936e-05, - -8.50404e-05, - -8.82623e-05, - -9.13551e-05, - -9.43199e-05, - -9.71528e-05, - -9.98553e-05, - -0.000102424, - -0.00010486, - -0.00010716, - -0.000109326, - -0.000111356, - -0.000113251, - -0.000115009, - -0.000116633, - -0.000118119, - -0.000119471, - -0.000120685, - -0.000121766, - -0.000122709, - -0.000123518, - -0.000124185, - -0.000124729, - -0.000125145, - -0.000125428, - -0.000125578, - -0.000125598, - -0.000125487, - -0.00012525, - -0.000124884, - -0.000124397, - -0.000123784, - -0.000123053, - -0.000122201, - -0.000121235, - -0.000120152, - -0.000118959, - -0.000117652, - -0.000116241, - -0.00011472, - -0.000113099, - -0.000111372, - -0.00010955, - -0.000107627, - -0.000105614, - -0.000103505, - -0.000101311, - -9.9026e-05, - -9.66619e-05, - -9.42119e-05, - -9.16888e-05, - -8.9085e-05, - -8.64141e-05, - -8.36678e-05, - -8.08605e-05, - -7.7983e-05, - -7.50509e-05, - -7.20538e-05, - -6.90085e-05, - -6.59032e-05, - -6.27565e-05, - -5.95548e-05, - -5.63184e-05, - -5.3032e-05, - -4.97179e-05, - -4.63581e-05, - -4.29778e-05, - -3.95556e-05, - -3.61199e-05, - -3.26453e-05, - -2.91642e-05, - -2.56455e-05, - -2.21275e-05, - -1.85712e-05, - -1.50227e-05, - -1.14317e-05, - -7.85603e-06, - -4.22748e-06, - -6.22187e-07, - 3.05918e-06, - 6.70859e-06, - 1.04905e-05, - 1.42303e-05, - 1.82863e-05, - 2.2286e-05 -}; diff --git a/gr-vocoder/lib/codec2/sine.c b/gr-vocoder/lib/codec2/sine.c deleted file mode 100644 index be4df00a6d..0000000000 --- a/gr-vocoder/lib/codec2/sine.c +++ /dev/null @@ -1,648 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: sine.c - AUTHOR......: David Rowe - DATE CREATED: 19/8/2010 - - Sinusoidal analysis and synthesis functions. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 1990-2010 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -/*---------------------------------------------------------------------------*\ - - INCLUDES - -\*---------------------------------------------------------------------------*/ - -#include <stdlib.h> -#include <stdio.h> -#include <math.h> - -#include "defines.h" -#include "sine.h" -#include "kiss_fft.h" - -#define HPF_BETA 0.125 - -/*---------------------------------------------------------------------------*\ - - HEADERS - -\*---------------------------------------------------------------------------*/ - -void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, - float pstep); - -/*---------------------------------------------------------------------------*\ - - FUNCTIONS - -\*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: make_analysis_window - AUTHOR......: David Rowe - DATE CREATED: 11/5/94 - - Init function that generates the time domain analysis window and it's DFT. - -\*---------------------------------------------------------------------------*/ - -void make_analysis_window(kiss_fft_cfg fft_fwd_cfg, float w[], COMP W[]) -{ - float m; - COMP wshift[FFT_ENC]; - COMP temp; - int i,j; - - /* - Generate Hamming window centered on M-sample pitch analysis window - - 0 M/2 M-1 - |-------------|-------------| - |-------|-------| - NW samples - - All our analysis/synthsis is centred on the M/2 sample. - */ - - m = 0.0; - for(i=0; i<M/2-NW/2; i++) - w[i] = 0.0; - for(i=M/2-NW/2,j=0; i<M/2+NW/2; i++,j++) { - w[i] = 0.5 - 0.5*cosf(TWO_PI*j/(NW-1)); - m += w[i]*w[i]; - } - for(i=M/2+NW/2; i<M; i++) - w[i] = 0.0; - - /* Normalise - makes freq domain amplitude estimation straight - forward */ - - m = 1.0/sqrtf(m*FFT_ENC); - for(i=0; i<M; i++) { - w[i] *= m; - } - - /* - Generate DFT of analysis window, used for later processing. Note - we modulo FFT_ENC shift the time domain window w[], this makes the - imaginary part of the DFT W[] equal to zero as the shifted w[] is - even about the n=0 time axis if NW is odd. Having the imag part - of the DFT W[] makes computation easier. - - 0 FFT_ENC-1 - |-------------------------| - - ----\ /---- - \ / - \ / <- shifted version of window w[n] - \ / - \ / - ------- - - |---------| |---------| - NW/2 NW/2 - */ - - for(i=0; i<FFT_ENC; i++) { - wshift[i].real = 0.0; - wshift[i].imag = 0.0; - } - for(i=0; i<NW/2; i++) - wshift[i].real = w[i+M/2]; - for(i=FFT_ENC-NW/2,j=M/2-NW/2; i<FFT_ENC; i++,j++) - wshift[i].real = w[j]; - - kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)wshift, (kiss_fft_cpx *)W); - - /* - Re-arrange W[] to be symmetrical about FFT_ENC/2. Makes later - analysis convenient. - - Before: - - - 0 FFT_ENC-1 - |----------|---------| - __ _ - \ / - \_______________/ - - After: - - 0 FFT_ENC-1 - |----------|---------| - ___ - / \ - ________/ \_______ - - */ - - - for(i=0; i<FFT_ENC/2; i++) { - temp.real = W[i].real; - temp.imag = W[i].imag; - W[i].real = W[i+FFT_ENC/2].real; - W[i].imag = W[i+FFT_ENC/2].imag; - W[i+FFT_ENC/2].real = temp.real; - W[i+FFT_ENC/2].imag = temp.imag; - } - -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: hpf - AUTHOR......: David Rowe - DATE CREATED: 16 Nov 2010 - - High pass filter with a -3dB point of about 160Hz. - - y(n) = -HPF_BETA*y(n-1) + x(n) - x(n-1) - -\*---------------------------------------------------------------------------*/ - -float hpf(float x, float states[]) -{ - states[0] += -HPF_BETA*states[0] + x - states[1]; - states[1] = x; - - return states[0]; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: dft_speech - AUTHOR......: David Rowe - DATE CREATED: 27/5/94 - - Finds the DFT of the current speech input speech frame. - -\*---------------------------------------------------------------------------*/ - -void dft_speech(kiss_fft_cfg fft_fwd_cfg, COMP Sw[], float Sn[], float w[]) -{ - int i; - COMP sw[FFT_ENC]; - - for(i=0; i<FFT_ENC; i++) { - sw[i].real = 0.0; - sw[i].imag = 0.0; - } - - /* Centre analysis window on time axis, we need to arrange input - to FFT this way to make FFT phases correct */ - - /* move 2nd half to start of FFT input vector */ - - for(i=0; i<NW/2; i++) - sw[i].real = Sn[i+M/2]*w[i+M/2]; - - /* move 1st half to end of FFT input vector */ - - for(i=0; i<NW/2; i++) - sw[FFT_ENC-NW/2+i].real = Sn[i+M/2-NW/2]*w[i+M/2-NW/2]; - - kiss_fft(fft_fwd_cfg, (kiss_fft_cpx *)sw, (kiss_fft_cpx *)Sw); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: two_stage_pitch_refinement - AUTHOR......: David Rowe - DATE CREATED: 27/5/94 - - Refines the current pitch estimate using the harmonic sum pitch - estimation technique. - -\*---------------------------------------------------------------------------*/ - -void two_stage_pitch_refinement(MODEL *model, COMP Sw[]) -{ - float pmin,pmax,pstep; /* pitch refinment minimum, maximum and step */ - - /* Coarse refinement */ - - pmax = TWO_PI/model->Wo + 5; - pmin = TWO_PI/model->Wo - 5; - pstep = 1.0; - hs_pitch_refinement(model,Sw,pmin,pmax,pstep); - - /* Fine refinement */ - - pmax = TWO_PI/model->Wo + 1; - pmin = TWO_PI/model->Wo - 1; - pstep = 0.25; - hs_pitch_refinement(model,Sw,pmin,pmax,pstep); - - /* Limit range */ - - if (model->Wo < TWO_PI/P_MAX) - model->Wo = TWO_PI/P_MAX; - if (model->Wo > TWO_PI/P_MIN) - model->Wo = TWO_PI/P_MIN; - - model->L = floor(PI/model->Wo); -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: hs_pitch_refinement - AUTHOR......: David Rowe - DATE CREATED: 27/5/94 - - Harmonic sum pitch refinement function. - - pmin pitch search range minimum - pmax pitch search range maximum - step pitch search step size - model current pitch estimate in model.Wo - - model refined pitch estimate in model.Wo - -\*---------------------------------------------------------------------------*/ - -void hs_pitch_refinement(MODEL *model, COMP Sw[], float pmin, float pmax, float pstep) -{ - int m; /* loop variable */ - int b; /* bin for current harmonic centre */ - float E; /* energy for current pitch*/ - float Wo; /* current "test" fundamental freq. */ - float Wom; /* Wo that maximises E */ - float Em; /* mamimum energy */ - float r, one_on_r; /* number of rads/bin */ - float p; /* current pitch */ - - /* Initialisation */ - - model->L = PI/model->Wo; /* use initial pitch est. for L */ - Wom = model->Wo; - Em = 0.0; - r = TWO_PI/FFT_ENC; - one_on_r = 1.0/r; - - /* Determine harmonic sum for a range of Wo values */ - - for(p=pmin; p<=pmax; p+=pstep) { - E = 0.0; - Wo = TWO_PI/p; - - /* Sum harmonic magnitudes */ - for(m=1; m<=model->L; m++) { - b = (int)(m*Wo*one_on_r + 0.5); - E += Sw[b].real*Sw[b].real + Sw[b].imag*Sw[b].imag; - } - /* Compare to see if this is a maximum */ - - if (E > Em) { - Em = E; - Wom = Wo; - } - } - - model->Wo = Wom; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: estimate_amplitudes - AUTHOR......: David Rowe - DATE CREATED: 27/5/94 - - Estimates the complex amplitudes of the harmonics. - -\*---------------------------------------------------------------------------*/ - -void estimate_amplitudes(MODEL *model, COMP Sw[], COMP W[], int est_phase) -{ - int i,m; /* loop variables */ - int am,bm; /* bounds of current harmonic */ - int b; /* DFT bin of centre of current harmonic */ - float den; /* denominator of amplitude expression */ - float r, one_on_r; /* number of rads/bin */ - int offset; - COMP Am; - - r = TWO_PI/FFT_ENC; - one_on_r = 1.0/r; - - for(m=1; m<=model->L; m++) { - den = 0.0; - am = (int)((m - 0.5)*model->Wo*one_on_r + 0.5); - bm = (int)((m + 0.5)*model->Wo*one_on_r + 0.5); - b = (int)(m*model->Wo/r + 0.5); - - /* Estimate ampltude of harmonic */ - - den = 0.0; - Am.real = Am.imag = 0.0; - offset = FFT_ENC/2 - (int)(m*model->Wo*one_on_r + 0.5); - for(i=am; i<bm; i++) { - den += Sw[i].real*Sw[i].real + Sw[i].imag*Sw[i].imag; - Am.real += Sw[i].real*W[i + offset].real; - Am.imag += Sw[i].imag*W[i + offset].real; - } - - model->A[m] = sqrtf(den); - - if (est_phase) { - - /* Estimate phase of harmonic, this is expensive in CPU for - embedded devicesso we make it an option */ - - model->phi[m] = atan2(Sw[b].imag,Sw[b].real); - } - } -} - -/*---------------------------------------------------------------------------*\ - - est_voicing_mbe() - - Returns the error of the MBE cost function for a fiven F0. - - Note: I think a lot of the operations below can be simplified as - W[].imag = 0 and has been normalised such that den always equals 1. - -\*---------------------------------------------------------------------------*/ - -float est_voicing_mbe( - MODEL *model, - COMP Sw[], - COMP W[], - COMP Sw_[], /* DFT of all voiced synthesised signal */ - /* useful for debugging/dump file */ - COMP Ew[], /* DFT of error */ - float prev_Wo) -{ - int i,l,al,bl,m; /* loop variables */ - COMP Am; /* amplitude sample for this band */ - int offset; /* centers Hw[] about current harmonic */ - float den; /* denominator of Am expression */ - float error; /* accumulated error between original and synthesised */ - float Wo; - float sig, snr; - float elow, ehigh, eratio; - float sixty; - - sig = 1E-4; - for(l=1; l<=model->L/4; l++) { - sig += model->A[l]*model->A[l]; - } - for(i=0; i<FFT_ENC; i++) { - Sw_[i].real = 0.0; - Sw_[i].imag = 0.0; - Ew[i].real = 0.0; - Ew[i].imag = 0.0; - } - - Wo = model->Wo; - error = 1E-4; - - /* Just test across the harmonics in the first 1000 Hz (L/4) */ - - for(l=1; l<=model->L/4; l++) { - Am.real = 0.0; - Am.imag = 0.0; - den = 0.0; - al = ceil((l - 0.5)*Wo*FFT_ENC/TWO_PI); - bl = ceil((l + 0.5)*Wo*FFT_ENC/TWO_PI); - - /* Estimate amplitude of harmonic assuming harmonic is totally voiced */ - - offset = FFT_ENC/2 - l*Wo*FFT_ENC/TWO_PI + 0.5; - for(m=al; m<bl; m++) { - Am.real += Sw[m].real*W[offset+m].real; - Am.imag += Sw[m].imag*W[offset+m].real; - den += W[offset+m].real*W[offset+m].real; - } - - Am.real = Am.real/den; - Am.imag = Am.imag/den; - - /* Determine error between estimated harmonic and original */ - - offset = FFT_ENC/2 - l*Wo*FFT_ENC/TWO_PI + 0.5; - for(m=al; m<bl; m++) { - Sw_[m].real = Am.real*W[offset+m].real; - Sw_[m].imag = Am.imag*W[offset+m].real; - Ew[m].real = Sw[m].real - Sw_[m].real; - Ew[m].imag = Sw[m].imag - Sw_[m].imag; - error += Ew[m].real*Ew[m].real; - error += Ew[m].imag*Ew[m].imag; - } - } - - snr = 10.0*log10f(sig/error); - if (snr > V_THRESH) - model->voiced = 1; - else - model->voiced = 0; - - /* post processing, helps clean up some voicing errors ------------------*/ - - /* - Determine the ratio of low freqency to high frequency energy, - voiced speech tends to be dominated by low frequency energy, - unvoiced by high frequency. This measure can be used to - determine if we have made any gross errors. - */ - - elow = ehigh = 1E-4; - for(l=1; l<=model->L/2; l++) { - elow += model->A[l]*model->A[l]; - } - for(l=model->L/2; l<=model->L; l++) { - ehigh += model->A[l]*model->A[l]; - } - eratio = 10.0*log10f(elow/ehigh); - - /* Look for Type 1 errors, strongly V speech that has been - accidentally declared UV */ - - if (model->voiced == 0) - if (eratio > 10.0) - model->voiced = 1; - - /* Look for Type 2 errors, strongly UV speech that has been - accidentally declared V */ - - if (model->voiced == 1) { - if (eratio < -10.0) - model->voiced = 0; - - /* A common source of Type 2 errors is the pitch estimator - gives a low (50Hz) estimate for UV speech, which gives a - good match with noise due to the close harmoonic spacing. - These errors are much more common than people with 50Hz3 - pitch, so we have just a small eratio threshold. */ - - sixty = 60.0*TWO_PI/FS; - if ((eratio < -4.0) && (model->Wo <= sixty)) - model->voiced = 0; - } - //printf(" v: %d snr: %f eratio: %3.2f %f\n",model->voiced,snr,eratio,dF0); - - return snr; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: make_synthesis_window - AUTHOR......: David Rowe - DATE CREATED: 11/5/94 - - Init function that generates the trapezoidal (Parzen) sythesis window. - -\*---------------------------------------------------------------------------*/ - -void make_synthesis_window(float Pn[]) -{ - int i; - float win; - - /* Generate Parzen window in time domain */ - - win = 0.0; - for(i=0; i<N/2-TW; i++) - Pn[i] = 0.0; - win = 0.0; - for(i=N/2-TW; i<N/2+TW; win+=1.0/(2*TW), i++ ) - Pn[i] = win; - for(i=N/2+TW; i<3*N/2-TW; i++) - Pn[i] = 1.0; - win = 1.0; - for(i=3*N/2-TW; i<3*N/2+TW; win-=1.0/(2*TW), i++) - Pn[i] = win; - for(i=3*N/2+TW; i<2*N; i++) - Pn[i] = 0.0; -} - -/*---------------------------------------------------------------------------*\ - - FUNCTION....: synthesise - AUTHOR......: David Rowe - DATE CREATED: 20/2/95 - - Synthesise a speech signal in the frequency domain from the - sinusodal model parameters. Uses overlap-add with a trapezoidal - window to smoothly interpolate betwen frames. - -\*---------------------------------------------------------------------------*/ - -void synthesise( - kiss_fft_cfg fft_inv_cfg, - float Sn_[], /* time domain synthesised signal */ - MODEL *model, /* ptr to model parameters for this frame */ - float Pn[], /* time domain Parzen window */ - int shift /* flag used to handle transition frames */ -) -{ - int i,l,j,b; /* loop variables */ - COMP Sw_[FFT_DEC]; /* DFT of synthesised signal */ - COMP sw_[FFT_DEC]; /* synthesised signal */ - - if (shift) { - /* Update memories */ - for(i=0; i<N-1; i++) { - Sn_[i] = Sn_[i+N]; - } - Sn_[N-1] = 0.0; - } - - for(i=0; i<FFT_DEC; i++) { - Sw_[i].real = 0.0; - Sw_[i].imag = 0.0; - } - - /* - Nov 2010 - found that synthesis using time domain cos() functions - gives better results for synthesis frames greater than 10ms. Inverse - FFT synthesis using a 512 pt FFT works well for 10ms window. I think - (but am not sure) that the problem is related to the quantisation of - the harmonic frequencies to the FFT bin size, e.g. there is a - 8000/512 Hz step between FFT bins. For some reason this makes - the speech from longer frame > 10ms sound poor. The effect can also - be seen when synthesising test signals like single sine waves, some - sort of amplitude modulation at the frame rate. - - Another possibility is using a larger FFT size (1024 or 2048). - */ - -#define FFT_SYNTHESIS -#ifdef FFT_SYNTHESIS - /* Now set up frequency domain synthesised speech */ - for(l=1; l<=model->L; l++) { - //for(l=model->L/2; l<=model->L; l++) { - //for(l=1; l<=model->L/4; l++) { - b = (int)(l*model->Wo*FFT_DEC/TWO_PI + 0.5); - if (b > ((FFT_DEC/2)-1)) { - b = (FFT_DEC/2)-1; - } - Sw_[b].real = model->A[l]*cosf(model->phi[l]); - Sw_[b].imag = model->A[l]*sinf(model->phi[l]); - Sw_[FFT_DEC-b].real = Sw_[b].real; - Sw_[FFT_DEC-b].imag = -Sw_[b].imag; - } - - /* Perform inverse DFT */ - - kiss_fft(fft_inv_cfg, (kiss_fft_cpx *)Sw_, (kiss_fft_cpx *)sw_); -#else - /* - Direct time domain synthesis using the cos() function. Works - well at 10ms and 20ms frames rates. Note synthesis window is - still used to handle overlap-add between adjacent frames. This - could be simplified as we don't need to synthesise where Pn[] - is zero. - */ - for(l=1; l<=model->L; l++) { - for(i=0,j=-N+1; i<N-1; i++,j++) { - Sw_[FFT_DEC-N+1+i].real += 2.0*model->A[l]*cos(j*model->Wo*l + model->phi[l]); - } - for(i=N-1,j=0; i<2*N; i++,j++) - Sw_[j].real += 2.0*model->A[l]*cos(j*model->Wo*l + model->phi[l]); - } -#endif - - /* Overlap add to previous samples */ - - for(i=0; i<N-1; i++) { - Sn_[i] += sw_[FFT_DEC-N+1+i].real*Pn[i]; - } - - if (shift) - for(i=N-1,j=0; i<2*N; i++,j++) - Sn_[i] = sw_[j].real*Pn[i]; - else - for(i=N-1,j=0; i<2*N; i++,j++) - Sn_[i] += sw_[j].real*Pn[i]; -} - - -static unsigned long next = 1; - -int codec2_rand(void) { - next = next * 1103515245 + 12345; - return((unsigned)(next/65536) % 32768); -} - diff --git a/gr-vocoder/lib/codec2/sine.h b/gr-vocoder/lib/codec2/sine.h deleted file mode 100644 index 3a3ce46d62..0000000000 --- a/gr-vocoder/lib/codec2/sine.h +++ /dev/null @@ -1,48 +0,0 @@ -/*---------------------------------------------------------------------------*\ - - FILE........: sine.h - AUTHOR......: David Rowe - DATE CREATED: 1/11/94 - - Header file for sinusoidal analysis and synthesis functions. - -\*---------------------------------------------------------------------------*/ - -/* - Copyright (C) 2009 David Rowe - - All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 2.1, as - published by the Free Software Foundation. This program is - distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifndef __SINE__ -#define __SINE__ - -#include "defines.h" -#include "comp.h" -#include "kiss_fft.h" - -void make_analysis_window(kiss_fft_cfg fft_fwd_cfg, float w[], COMP W[]); -float hpf(float x, float states[]); -void dft_speech(kiss_fft_cfg fft_fwd_cfg, COMP Sw[], float Sn[], float w[]); -void two_stage_pitch_refinement(MODEL *model, COMP Sw[]); -void estimate_amplitudes(MODEL *model, COMP Sw[], COMP W[], int est_phase); -float est_voicing_mbe(MODEL *model, COMP Sw[], COMP W[], COMP Sw_[],COMP Ew[], - float prev_Wo); -void make_synthesis_window(float Pn[]); -void synthesise(kiss_fft_cfg fft_inv_cfg, float Sn_[], MODEL *model, float Pn[], int shift); - -#define CODEC2_RAND_MAX 32767 -int codec2_rand(void); - -#endif diff --git a/gr-vocoder/lib/codec2/test_bits.h b/gr-vocoder/lib/codec2/test_bits.h deleted file mode 100644 index d1c01a03b2..0000000000 --- a/gr-vocoder/lib/codec2/test_bits.h +++ /dev/null @@ -1,164 +0,0 @@ -/* Generated by test_bits_file() Octave function */ - -const int test_bits[]={ - 0, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - 0, - 0, - 1, - 0, - 1, - 0, - 0, - 1, - 0, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 0, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 0, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 0, - 0, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 1, - 0, - 0, - 0, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 1, - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 0, - 1, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 0, - 0, - 0, - 1, - 0, - 1, - 1, - 1, - 0, - 1 -}; diff --git a/gr-vocoder/lib/gsm/CMakeLists.txt b/gr-vocoder/lib/gsm/CMakeLists.txt deleted file mode 100644 index dfbade86ae..0000000000 --- a/gr-vocoder/lib/gsm/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2011 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# 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. - -######################################################################## -# Append all sources in this dir -######################################################################## -include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}) - -set(gsm_sources - ${CMAKE_CURRENT_SOURCE_DIR}/add.c - ${CMAKE_CURRENT_SOURCE_DIR}/code.c - ${CMAKE_CURRENT_SOURCE_DIR}/debug.c - ${CMAKE_CURRENT_SOURCE_DIR}/decode.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_create.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_decode.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_destroy.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_encode.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_explode.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_implode.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_option.c - ${CMAKE_CURRENT_SOURCE_DIR}/gsm_print.c - ${CMAKE_CURRENT_SOURCE_DIR}/long_term.c - ${CMAKE_CURRENT_SOURCE_DIR}/lpc.c - ${CMAKE_CURRENT_SOURCE_DIR}/preprocess.c - ${CMAKE_CURRENT_SOURCE_DIR}/rpe.c - ${CMAKE_CURRENT_SOURCE_DIR}/short_term.c - ${CMAKE_CURRENT_SOURCE_DIR}/table.c -) - -set_source_files_properties(${gsm_sources} - PROPERTIES COMPILE_DEFINITION "NeedFunctionPrototypes=1" -) -list(APPEND gr_vocoder_sources ${gsm_sources}) diff --git a/gr-vocoder/lib/gsm/COPYRIGHT b/gr-vocoder/lib/gsm/COPYRIGHT deleted file mode 100644 index eba0e523bb..0000000000 --- a/gr-vocoder/lib/gsm/COPYRIGHT +++ /dev/null @@ -1,16 +0,0 @@ -Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universitaet Berlin - -Any use of this software is permitted provided that this notice is not -removed and that neither the authors nor the Technische Universitaet Berlin -are deemed to have made any representations as to the suitability of this -software for any purpose nor are held responsible for any defects of -this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - -As a matter of courtesy, the authors request to be informed about uses -this software has found, about bugs in this software, and about any -improvements that may be of general interest. - -Berlin, 28.11.1994 -Jutta Degener -Carsten Bormann diff --git a/gr-vocoder/lib/gsm/README b/gr-vocoder/lib/gsm/README deleted file mode 100644 index 1927d878ae..0000000000 --- a/gr-vocoder/lib/gsm/README +++ /dev/null @@ -1,4 +0,0 @@ -This code was extracted from gsm-1.0-pl10.tar.gz -See COPYRIGHT for the copyright. - -See http://kbs.cs.tu-berlin.de/~jutta/toast.html for docs. diff --git a/gr-vocoder/lib/gsm/README.gsm b/gr-vocoder/lib/gsm/README.gsm deleted file mode 100644 index 10470e04ea..0000000000 --- a/gr-vocoder/lib/gsm/README.gsm +++ /dev/null @@ -1,37 +0,0 @@ - -GSM 06.10 13 kbit/s RPE/LTP speech compression available --------------------------------------------------------- - -The Communications and Operating Systems Research Group (KBS) at the -Technische Universitaet Berlin is currently working on a set of -UNIX-based tools for computer-mediated telecooperation that will be -made freely available. - -As part of this effort we are publishing an implementation of the -European GSM 06.10 provisional standard for full-rate speech -transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse -excitation/long term prediction) coding at 13 kbit/s. - -GSM 06.10 compresses frames of 160 13-bit samples (8 kHz sampling -rate, i.e. a frame rate of 50 Hz) into 260 bits; for compatibility -with typical UNIX applications, our implementation turns frames of 160 -16-bit linear samples into 33-byte frames (1650 Bytes/s). -The quality of the algorithm is good enough for reliable speaker -recognition; even music often survives transcoding in recognizable -form (given the bandwidth limitations of 8 kHz sampling rate). - -The interfaces offered are a front end modelled after compress(1), and -a library API. Compression and decompression run faster than realtime -on most SPARCstations. The implementation has been verified against the -ETSI standard test patterns. - -Jutta Degener (jutta@cs.tu-berlin.de) -Carsten Bormann (cabo@cs.tu-berlin.de) - -Communications and Operating Systems Research Group, TU Berlin -Fax: +49.30.31425156, Phone: +49.30.31424315 - --- -Copyright 1992 by Jutta Degener and Carsten Bormann, Technische -Universitaet Berlin. See the accompanying file "COPYRIGHT" for -details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. diff --git a/gr-vocoder/lib/gsm/add.c b/gr-vocoder/lib/gsm/add.c deleted file mode 100644 index 4118107b16..0000000000 --- a/gr-vocoder/lib/gsm/add.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -/* - * See private.h for the more commonly used macro versions. - */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -#define saturate(x) \ - ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) - -word gsm_add P2((a,b), word a, word b) -{ - longword sum = (longword)a + (longword)b; - return saturate(sum); -} - -word gsm_sub P2((a,b), word a, word b) -{ - longword diff = (longword)a - (longword)b; - return saturate(diff); -} - -word gsm_mult P2((a,b), word a, word b) -{ - if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD; - else return SASR( (longword)a * (longword)b, 15 ); -} - -word gsm_mult_r P2((a,b), word a, word b) -{ - if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD; - else { - longword prod = (longword)a * (longword)b + 16384; - prod >>= 15; - return prod & 0xFFFF; - } -} - -word gsm_abs P1((a), word a) -{ - return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a; -} - -longword gsm_L_mult P2((a,b),word a, word b) -{ - assert( a != MIN_WORD || b != MIN_WORD ); - return ((longword)a * (longword)b) << 1; -} - -longword gsm_L_add P2((a,b), longword a, longword b) -{ - if (a < 0) { - if (b >= 0) return a + b; - else { - ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1); - return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2; - } - } - else if (b <= 0) return a + b; - else { - ulongword A = (ulongword)a + (ulongword)b; - return A > MAX_LONGWORD ? MAX_LONGWORD : A; - } -} - -longword gsm_L_sub P2((a,b), longword a, longword b) -{ - if (a >= 0) { - if (b >= 0) return a - b; - else { - /* a>=0, b<0 */ - - ulongword A = (ulongword)a + -(b + 1); - return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1); - } - } - else if (b <= 0) return a - b; - else { - /* a<0, b>0 */ - - ulongword A = (ulongword)-(a + 1) + b; - return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1; - } -} - -static unsigned char const bitoff[ 256 ] = { - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -word gsm_norm P1((a), longword a ) -/* - * the number of left shifts needed to normalize the 32 bit - * variable L_var1 for positive values on the interval - * - * with minimum of - * minimum of 1073741824 (01000000000000000000000000000000) and - * maximum of 2147483647 (01111111111111111111111111111111) - * - * - * and for negative values on the interval with - * minimum of -2147483648 (-10000000000000000000000000000000) and - * maximum of -1073741824 ( -1000000000000000000000000000000). - * - * in order to normalize the result, the following - * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); - * - * (That's 'ffs', only from the left, not the right..) - */ -{ - assert(a != 0); - - if (a < 0) { - if (a <= -1073741824) return 0; - a = ~a; - } - - return a & 0xffff0000 - ? ( a & 0xff000000 - ? -1 + bitoff[ 0xFF & (a >> 24) ] - : 7 + bitoff[ 0xFF & (a >> 16) ] ) - : ( a & 0xff00 - ? 15 + bitoff[ 0xFF & (a >> 8) ] - : 23 + bitoff[ 0xFF & a ] ); -} - -longword gsm_L_asl P2((a,n), longword a, int n) -{ - if (n >= 32) return 0; - if (n <= -32) return -(a < 0); - if (n < 0) return gsm_L_asr(a, -n); - return a << n; -} - -word gsm_asl P2((a,n), word a, int n) -{ - if (n >= 16) return 0; - if (n <= -16) return -(a < 0); - if (n < 0) return gsm_asr(a, -n); - return a << n; -} - -longword gsm_L_asr P2((a,n), longword a, int n) -{ - if (n >= 32) return -(a < 0); - if (n <= -32) return 0; - if (n < 0) return a << -n; - -# ifdef SASR - return a >> n; -# else - if (a >= 0) return a >> n; - else return -(longword)( -(ulongword)a >> n ); -# endif -} - -word gsm_asr P2((a,n), word a, int n) -{ - if (n >= 16) return -(a < 0); - if (n <= -16) return 0; - if (n < 0) return a << -n; - -# ifdef SASR - return a >> n; -# else - if (a >= 0) return a >> n; - else return -(word)( -(uword)a >> n ); -# endif -} - -/* - * (From p. 46, end of section 4.2.5) - * - * NOTE: The following lines gives [sic] one correct implementation - * of the div(num, denum) arithmetic operation. Compute div - * which is the integer division of num by denum: with denum - * >= num > 0 - */ - -word gsm_div P2((num,denum), word num, word denum) -{ - longword L_num = num; - longword L_denum = denum; - word div = 0; - int k = 15; - - /* The parameter num sometimes becomes zero. - * Although this is explicitly guarded against in 4.2.5, - * we assume that the result should then be zero as well. - */ - - /* assert(num != 0); */ - - assert(num >= 0 && denum >= num); - if (num == 0) - return 0; - - while (k--) { - div <<= 1; - L_num <<= 1; - - if (L_num >= L_denum) { - L_num -= L_denum; - div++; - } - } - - return div; -} diff --git a/gr-vocoder/lib/gsm/code.c b/gr-vocoder/lib/gsm/code.c deleted file mode 100644 index 68ea05226a..0000000000 --- a/gr-vocoder/lib/gsm/code.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "config.h" - - -#ifdef HAS_STDLIB_H -#include <stdlib.h> -#else -# include "proto.h" - extern char * memcpy P((char *, char *, int)); -#endif - -#include "private.h" -#include "gsm.h" -#include "proto.h" -#include <string.h> - -/* - * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER - */ - -void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc), - - struct gsm_state * S, - - word * s, /* [0..159] samples IN */ - -/* - * The RPE-LTD coder works on a frame by frame basis. The length of - * the frame is equal to 160 samples. Some computations are done - * once per frame to produce at the output of the coder the - * LARc[1..8] parameters which are the coded LAR coefficients and - * also to realize the inverse filtering operation for the entire - * frame (160 samples of signal d[0..159]). These parts produce at - * the output of the coder: - */ - - word * LARc, /* [0..7] LAR coefficients OUT */ - -/* - * Procedure 4.2.11 to 4.2.18 are to be executed four times per - * frame. That means once for each sub-segment RPE-LTP analysis of - * 40 samples. These parts produce at the output of the coder: - */ - - word * Nc, /* [0..3] LTP lag OUT */ - word * bc, /* [0..3] coded LTP gain OUT */ - word * Mc, /* [0..3] RPE grid selection OUT */ - word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ - word * xMc /* [13*4] normalized RPE samples OUT */ -) -{ - int k; - word * dp = S->dp0 + 120; /* [ -120...-1 ] */ - word * dpp = dp; /* [ 0...39 ] */ - - static word e[50]; - - word so[160]; - - Gsm_Preprocess (S, s, so); - Gsm_LPC_Analysis (S, so, LARc); - Gsm_Short_Term_Analysis_Filter (S, LARc, so); - - for (k = 0; k <= 3; k++, xMc += 13) { - - Gsm_Long_Term_Predictor ( S, - so+k*40, /* d [0..39] IN */ - dp, /* dp [-120..-1] IN */ - e + 5, /* e [0..39] OUT */ - dpp, /* dpp [0..39] OUT */ - Nc++, - bc++); - - Gsm_RPE_Encoding ( S, - e + 5, /* e ][0..39][ IN/OUT */ - xmaxc++, Mc++, xMc ); - /* - * Gsm_Update_of_reconstructed_short_time_residual_signal - * ( dpp, e + 5, dp ); - */ - - { register int i; - register longword ltmp; - for (i = 0; i <= 39; i++) - dp[ i ] = GSM_ADD( e[5 + i], dpp[i] ); - } - dp += 40; - dpp += 40; - - } - (void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160), - 120 * sizeof(*S->dp0) ); -} diff --git a/gr-vocoder/lib/gsm/config.h b/gr-vocoder/lib/gsm/config.h deleted file mode 100644 index 2a962ac7df..0000000000 --- a/gr-vocoder/lib/gsm/config.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef CONFIG_H -#define CONFIG_H - -#undef SIGHANDLER_T /* signal handlers are void */ -#undef HAS_SYSV_SIGNAL /* sigs not blocked/reset? */ - -#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */ -#undef HAS_LIMITS_H /* /usr/include/limits.h */ -#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */ -#undef HAS_ERRNO_DECL /* errno.h declares errno */ - -#define HAS_FSTAT 1 /* fstat syscall */ -#define HAS_FCHMOD 1 /* fchmod syscall */ -#define HAS_CHMOD 1 /* chmod syscall */ -#define HAS_FCHOWN 1 /* fchown syscall */ -#define HAS_CHOWN 1 /* chown syscall */ -#undef HAS__FSETMODE /* _fsetmode -- set file mode */ - -#define HAS_STRING_H 1 /* /usr/include/string.h */ -#undef HAS_STRINGS_H /* /usr/include/strings.h */ - -#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */ -#define HAS_UTIME 1 /* POSIX utime(path, times) */ -#undef HAS_UTIMES /* use utimes() syscall instead */ -#define HAS_UTIME_H 1 /* UTIME header file */ -#undef HAS_UTIMBUF /* struct utimbuf */ -#undef HAS_UTIMEUSEC /* microseconds in utimbuf? */ - -#endif /* CONFIG_H */ diff --git a/gr-vocoder/lib/gsm/debug.c b/gr-vocoder/lib/gsm/debug.c deleted file mode 100644 index 58d1dbcac7..0000000000 --- a/gr-vocoder/lib/gsm/debug.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#ifndef NDEBUG - -/* If NDEBUG _is_ defined and no debugging should be performed, - * calls to functions in this module are #defined to nothing - * in private.h. - */ - -#include <stdio.h> -#include "proto.h" - -void gsm_debug_words P4( (name, from, to, ptr), - char * name, - int from, - int to, - word * ptr) -{ - int nprinted = 0; - - fprintf( stderr, "%s [%d .. %d]: ", name, from, to ); - while (from <= to) { - fprintf(stderr, "%d ", ptr[ from ] ); - from++; - if (nprinted++ >= 7) { - nprinted = 0; - if (from < to) putc('\n', stderr); - } - } - putc('\n', stderr); -} - -void gsm_debug_longwords P4( (name, from, to, ptr), - char * name, - int from, - int to, - longword * ptr) -{ - int nprinted = 0; - - fprintf( stderr, "%s [%d .. %d]: ", name, from, to ); - while (from <= to) { - - fprintf(stderr, "%ld ", ptr[ from ] ); - from++; - if (nprinted++ >= 7) { - nprinted = 0; - if (from < to) putc('\n', stderr); - } - } - putc('\n', stderr); -} - -void gsm_debug_longword P2( (name, value), - char * name, - longword value ) -{ - fprintf(stderr, "%s: %ld\n", name, (long)value ); -} - -void gsm_debug_word P2( (name, value), - char * name, - word value ) -{ - fprintf(stderr, "%s: %ld\n", name, (long)value); -} - -#endif diff --git a/gr-vocoder/lib/gsm/decode.c b/gr-vocoder/lib/gsm/decode.c deleted file mode 100644 index 34e5586633..0000000000 --- a/gr-vocoder/lib/gsm/decode.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -/* - * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER - */ - -static void Postprocessing P2((S,s), - struct gsm_state * S, - register word * s) -{ - register int k; - register word msr = S->msr; - register longword ltmp; /* for GSM_ADD */ - register word tmp; - - for (k = 160; k--; s++) { - tmp = GSM_MULT_R( msr, 28180 ); - msr = GSM_ADD(*s, tmp); /* Deemphasis */ - *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */ - } - S->msr = msr; -} - -void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s), - struct gsm_state * S, - - word * LARcr, /* [0..7] IN */ - - word * Ncr, /* [0..3] IN */ - word * bcr, /* [0..3] IN */ - word * Mcr, /* [0..3] IN */ - word * xmaxcr, /* [0..3] IN */ - word * xMcr, /* [0..13*4] IN */ - - word * s) /* [0..159] OUT */ -{ - int j, k; - word erp[40], wt[160]; - word * drp = S->dp0 + 120; - - for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) { - - Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp ); - Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp ); - - for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ]; - } - - Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s ); - Postprocessing(S, s); -} diff --git a/gr-vocoder/lib/gsm/gsm.h b/gr-vocoder/lib/gsm/gsm.h deleted file mode 100644 index a6d5e47059..0000000000 --- a/gr-vocoder/lib/gsm/gsm.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef GSM_H -#define GSM_H - -#ifdef __cplusplus -# define NeedFunctionPrototypes 1 -#endif - -#if __STDC__ -# define NeedFunctionPrototypes 1 -#endif - -#ifdef _NO_PROTO -# undef NeedFunctionPrototypes -#endif - -#ifdef NeedFunctionPrototypes -# include <stdio.h> /* for FILE * */ -#endif - -#undef GSM_P -#if NeedFunctionPrototypes -# define GSM_P( protos ) protos -#else -# define GSM_P( protos ) ( /* protos */ ) -#endif - -/* - * Interface - */ - -typedef struct gsm_state * gsm; -typedef short gsm_signal; /* signed 16 bit */ -typedef unsigned char gsm_byte; -typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */ - -#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ - -#define GSM_PATCHLEVEL 10 -#define GSM_MINOR 0 -#define GSM_MAJOR 1 - -#define GSM_OPT_VERBOSE 1 -#define GSM_OPT_FAST 2 -#define GSM_OPT_LTP_CUT 3 -#define GSM_OPT_WAV49 4 -#define GSM_OPT_FRAME_INDEX 5 -#define GSM_OPT_FRAME_CHAIN 6 - -#define GSM_SAMPLES_PER_FRAME 160 - -extern gsm gsm_create GSM_P((void)); -extern void gsm_destroy GSM_P((gsm)); - -extern int gsm_print GSM_P((FILE *, gsm, gsm_byte *)); -extern int gsm_option GSM_P((gsm, int, int *)); - -extern void gsm_encode GSM_P((gsm, gsm_signal *, gsm_byte *)); -extern int gsm_decode GSM_P((gsm, gsm_byte *, gsm_signal *)); - -extern int gsm_explode GSM_P((gsm, gsm_byte *, gsm_signal *)); -extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte *)); - -#undef GSM_P - -#endif /* GSM_H */ diff --git a/gr-vocoder/lib/gsm/gsm_create.c b/gr-vocoder/lib/gsm/gsm_create.c deleted file mode 100644 index a59aa2f2a3..0000000000 --- a/gr-vocoder/lib/gsm/gsm_create.c +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -static char const ident[] = "$Header$"; - -#include "config.h" - -#ifdef HAS_STRING_H -#include <string.h> -#else -# include "proto.h" - extern char * memset P((char *, int, int)); -#endif - -#ifdef HAS_STDLIB_H -# include <stdlib.h> -#else -# ifdef HAS_MALLOC_H -# include <malloc.h> -# else - extern char * malloc(); -# endif -#endif - -#include <stdio.h> - -#include "gsm.h" -#include "private.h" -#include "proto.h" - -gsm gsm_create P0() -{ - gsm r; - - r = (gsm)malloc(sizeof(struct gsm_state)); - if (!r) return r; - - memset((char *)r, 0, sizeof(*r)); - r->nrp = 40; - - return r; -} diff --git a/gr-vocoder/lib/gsm/gsm_decode.c b/gr-vocoder/lib/gsm/gsm_decode.c deleted file mode 100644 index 7ebf35dd07..0000000000 --- a/gr-vocoder/lib/gsm/gsm_decode.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - -#ifdef WAV49 - if (s->wav_fmt) { - - uword sr = 0; - - s->frame_index = !s->frame_index; - if (s->frame_index) { - - sr = *c++; - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - sr = *c++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *c++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - s->frame_chain = sr & 0xf; - } - else { - sr = s->frame_chain; - sr |= (uword)*c++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *c++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *c++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = *c++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - } - } - else -#endif - { - /* GSM_MAGIC = (*c >> 4) & 0xF; */ - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; - - LARc[0] = (*c++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*c >> 6) & 0x3; - LARc[1] = *c++ & 0x3F; - LARc[2] = (*c >> 3) & 0x1F; - LARc[3] = (*c++ & 0x7) << 2; - LARc[3] |= (*c >> 6) & 0x3; - LARc[4] = (*c >> 2) & 0xF; - LARc[5] = (*c++ & 0x3) << 2; - LARc[5] |= (*c >> 6) & 0x3; - LARc[6] = (*c >> 3) & 0x7; - LARc[7] = *c++ & 0x7; - Nc[0] = (*c >> 1) & 0x7F; - bc[0] = (*c++ & 0x1) << 1; - bc[0] |= (*c >> 7) & 0x1; - Mc[0] = (*c >> 5) & 0x3; - xmaxc[0] = (*c++ & 0x1F) << 1; - xmaxc[0] |= (*c >> 7) & 0x1; - xmc[0] = (*c >> 4) & 0x7; - xmc[1] = (*c >> 1) & 0x7; - xmc[2] = (*c++ & 0x1) << 2; - xmc[2] |= (*c >> 6) & 0x3; - xmc[3] = (*c >> 3) & 0x7; - xmc[4] = *c++ & 0x7; - xmc[5] = (*c >> 5) & 0x7; - xmc[6] = (*c >> 2) & 0x7; - xmc[7] = (*c++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*c >> 7) & 0x1; - xmc[8] = (*c >> 4) & 0x7; - xmc[9] = (*c >> 1) & 0x7; - xmc[10] = (*c++ & 0x1) << 2; - xmc[10] |= (*c >> 6) & 0x3; - xmc[11] = (*c >> 3) & 0x7; - xmc[12] = *c++ & 0x7; - Nc[1] = (*c >> 1) & 0x7F; - bc[1] = (*c++ & 0x1) << 1; - bc[1] |= (*c >> 7) & 0x1; - Mc[1] = (*c >> 5) & 0x3; - xmaxc[1] = (*c++ & 0x1F) << 1; - xmaxc[1] |= (*c >> 7) & 0x1; - xmc[13] = (*c >> 4) & 0x7; - xmc[14] = (*c >> 1) & 0x7; - xmc[15] = (*c++ & 0x1) << 2; - xmc[15] |= (*c >> 6) & 0x3; - xmc[16] = (*c >> 3) & 0x7; - xmc[17] = *c++ & 0x7; - xmc[18] = (*c >> 5) & 0x7; - xmc[19] = (*c >> 2) & 0x7; - xmc[20] = (*c++ & 0x3) << 1; - xmc[20] |= (*c >> 7) & 0x1; - xmc[21] = (*c >> 4) & 0x7; - xmc[22] = (*c >> 1) & 0x7; - xmc[23] = (*c++ & 0x1) << 2; - xmc[23] |= (*c >> 6) & 0x3; - xmc[24] = (*c >> 3) & 0x7; - xmc[25] = *c++ & 0x7; - Nc[2] = (*c >> 1) & 0x7F; - bc[2] = (*c++ & 0x1) << 1; /* 20 */ - bc[2] |= (*c >> 7) & 0x1; - Mc[2] = (*c >> 5) & 0x3; - xmaxc[2] = (*c++ & 0x1F) << 1; - xmaxc[2] |= (*c >> 7) & 0x1; - xmc[26] = (*c >> 4) & 0x7; - xmc[27] = (*c >> 1) & 0x7; - xmc[28] = (*c++ & 0x1) << 2; - xmc[28] |= (*c >> 6) & 0x3; - xmc[29] = (*c >> 3) & 0x7; - xmc[30] = *c++ & 0x7; - xmc[31] = (*c >> 5) & 0x7; - xmc[32] = (*c >> 2) & 0x7; - xmc[33] = (*c++ & 0x3) << 1; - xmc[33] |= (*c >> 7) & 0x1; - xmc[34] = (*c >> 4) & 0x7; - xmc[35] = (*c >> 1) & 0x7; - xmc[36] = (*c++ & 0x1) << 2; - xmc[36] |= (*c >> 6) & 0x3; - xmc[37] = (*c >> 3) & 0x7; - xmc[38] = *c++ & 0x7; - Nc[3] = (*c >> 1) & 0x7F; - bc[3] = (*c++ & 0x1) << 1; - bc[3] |= (*c >> 7) & 0x1; - Mc[3] = (*c >> 5) & 0x3; - xmaxc[3] = (*c++ & 0x1F) << 1; - xmaxc[3] |= (*c >> 7) & 0x1; - xmc[39] = (*c >> 4) & 0x7; - xmc[40] = (*c >> 1) & 0x7; - xmc[41] = (*c++ & 0x1) << 2; - xmc[41] |= (*c >> 6) & 0x3; - xmc[42] = (*c >> 3) & 0x7; - xmc[43] = *c++ & 0x7; /* 30 */ - xmc[44] = (*c >> 5) & 0x7; - xmc[45] = (*c >> 2) & 0x7; - xmc[46] = (*c++ & 0x3) << 1; - xmc[46] |= (*c >> 7) & 0x1; - xmc[47] = (*c >> 4) & 0x7; - xmc[48] = (*c >> 1) & 0x7; - xmc[49] = (*c++ & 0x1) << 2; - xmc[49] |= (*c >> 6) & 0x3; - xmc[50] = (*c >> 3) & 0x7; - xmc[51] = *c & 0x7; /* 33 */ - } - - Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target); - - return 0; -} diff --git a/gr-vocoder/lib/gsm/gsm_destroy.c b/gr-vocoder/lib/gsm/gsm_destroy.c deleted file mode 100644 index 4807c0acdd..0000000000 --- a/gr-vocoder/lib/gsm/gsm_destroy.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "gsm.h" -#include "config.h" -#include "proto.h" - -#ifdef HAS_STDLIB_H -# include <stdlib.h> -#else -# ifdef HAS_MALLOC_H -# include <malloc.h> -# else - extern void free(); -# endif -#endif - -void gsm_destroy P1((S), gsm S) -{ - if (S) free((char *)S); -} diff --git a/gr-vocoder/lib/gsm/gsm_encode.c b/gr-vocoder/lib/gsm/gsm_encode.c deleted file mode 100644 index 62338300ee..0000000000 --- a/gr-vocoder/lib/gsm/gsm_encode.c +++ /dev/null @@ -1,451 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - - Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc); - - - /* variable size - - GSM_MAGIC 4 - - LARc[0] 6 - LARc[1] 6 - LARc[2] 5 - LARc[3] 5 - LARc[4] 4 - LARc[5] 4 - LARc[6] 3 - LARc[7] 3 - - Nc[0] 7 - bc[0] 2 - Mc[0] 2 - xmaxc[0] 6 - xmc[0] 3 - xmc[1] 3 - xmc[2] 3 - xmc[3] 3 - xmc[4] 3 - xmc[5] 3 - xmc[6] 3 - xmc[7] 3 - xmc[8] 3 - xmc[9] 3 - xmc[10] 3 - xmc[11] 3 - xmc[12] 3 - - Nc[1] 7 - bc[1] 2 - Mc[1] 2 - xmaxc[1] 6 - xmc[13] 3 - xmc[14] 3 - xmc[15] 3 - xmc[16] 3 - xmc[17] 3 - xmc[18] 3 - xmc[19] 3 - xmc[20] 3 - xmc[21] 3 - xmc[22] 3 - xmc[23] 3 - xmc[24] 3 - xmc[25] 3 - - Nc[2] 7 - bc[2] 2 - Mc[2] 2 - xmaxc[2] 6 - xmc[26] 3 - xmc[27] 3 - xmc[28] 3 - xmc[29] 3 - xmc[30] 3 - xmc[31] 3 - xmc[32] 3 - xmc[33] 3 - xmc[34] 3 - xmc[35] 3 - xmc[36] 3 - xmc[37] 3 - xmc[38] 3 - - Nc[3] 7 - bc[3] 2 - Mc[3] 2 - xmaxc[3] 6 - xmc[39] 3 - xmc[40] 3 - xmc[41] 3 - xmc[42] 3 - xmc[43] 3 - xmc[44] 3 - xmc[45] 3 - xmc[46] 3 - xmc[47] 3 - xmc[48] 3 - xmc[49] 3 - xmc[50] 3 - xmc[51] 3 - */ - -#ifdef WAV49 - - if (s->wav_fmt) { - s->frame_index = !s->frame_index; - if (s->frame_index) { - - uword sr; - - sr = 0; - sr = sr >> 6 | LARc[0] << 10; - sr = sr >> 6 | LARc[1] << 10; - *c++ = sr >> 4; - sr = sr >> 5 | LARc[2] << 11; - *c++ = sr >> 7; - sr = sr >> 5 | LARc[3] << 11; - sr = sr >> 4 | LARc[4] << 12; - *c++ = sr >> 6; - sr = sr >> 4 | LARc[5] << 12; - sr = sr >> 3 | LARc[6] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | LARc[7] << 13; - sr = sr >> 7 | Nc[0] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[0] << 14; - sr = sr >> 2 | Mc[0] << 14; - sr = sr >> 6 | xmaxc[0] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[0] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[1] << 13; - sr = sr >> 3 | xmc[2] << 13; - sr = sr >> 3 | xmc[3] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[4] << 13; - sr = sr >> 3 | xmc[5] << 13; - sr = sr >> 3 | xmc[6] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[7] << 13; - sr = sr >> 3 | xmc[8] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[9] << 13; - sr = sr >> 3 | xmc[10] << 13; - sr = sr >> 3 | xmc[11] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[12] << 13; - sr = sr >> 7 | Nc[1] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[1] << 14; - sr = sr >> 2 | Mc[1] << 14; - sr = sr >> 6 | xmaxc[1] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[13] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[14] << 13; - sr = sr >> 3 | xmc[15] << 13; - sr = sr >> 3 | xmc[16] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[17] << 13; - sr = sr >> 3 | xmc[18] << 13; - sr = sr >> 3 | xmc[19] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[20] << 13; - sr = sr >> 3 | xmc[21] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[22] << 13; - sr = sr >> 3 | xmc[23] << 13; - sr = sr >> 3 | xmc[24] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[25] << 13; - sr = sr >> 7 | Nc[2] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[2] << 14; - sr = sr >> 2 | Mc[2] << 14; - sr = sr >> 6 | xmaxc[2] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[26] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[27] << 13; - sr = sr >> 3 | xmc[28] << 13; - sr = sr >> 3 | xmc[29] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[30] << 13; - sr = sr >> 3 | xmc[31] << 13; - sr = sr >> 3 | xmc[32] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[33] << 13; - sr = sr >> 3 | xmc[34] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[35] << 13; - sr = sr >> 3 | xmc[36] << 13; - sr = sr >> 3 | xmc[37] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[38] << 13; - sr = sr >> 7 | Nc[3] << 9; - *c++ = sr >> 5; - sr = sr >> 2 | bc[3] << 14; - sr = sr >> 2 | Mc[3] << 14; - sr = sr >> 6 | xmaxc[3] << 10; - *c++ = sr >> 3; - sr = sr >> 3 | xmc[39] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[40] << 13; - sr = sr >> 3 | xmc[41] << 13; - sr = sr >> 3 | xmc[42] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[43] << 13; - sr = sr >> 3 | xmc[44] << 13; - sr = sr >> 3 | xmc[45] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[46] << 13; - sr = sr >> 3 | xmc[47] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[48] << 13; - sr = sr >> 3 | xmc[49] << 13; - sr = sr >> 3 | xmc[50] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[51] << 13; - sr = sr >> 4; - *c = sr >> 8; - s->frame_chain = *c; - } - else { - uword sr; - - sr = 0; - sr = sr >> 4 | s->frame_chain << 12; - sr = sr >> 6 | LARc[0] << 10; - *c++ = sr >> 6; - sr = sr >> 6 | LARc[1] << 10; - *c++ = sr >> 8; - sr = sr >> 5 | LARc[2] << 11; - sr = sr >> 5 | LARc[3] << 11; - *c++ = sr >> 6; - sr = sr >> 4 | LARc[4] << 12; - sr = sr >> 4 | LARc[5] << 12; - *c++ = sr >> 6; - sr = sr >> 3 | LARc[6] << 13; - sr = sr >> 3 | LARc[7] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[0] << 9; - sr = sr >> 2 | bc[0] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[0] << 14; - sr = sr >> 6 | xmaxc[0] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[0] << 13; - sr = sr >> 3 | xmc[1] << 13; - sr = sr >> 3 | xmc[2] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[3] << 13; - sr = sr >> 3 | xmc[4] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[5] << 13; - sr = sr >> 3 | xmc[6] << 13; - sr = sr >> 3 | xmc[7] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[8] << 13; - sr = sr >> 3 | xmc[9] << 13; - sr = sr >> 3 | xmc[10] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[11] << 13; - sr = sr >> 3 | xmc[12] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[1] << 9; - sr = sr >> 2 | bc[1] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[1] << 14; - sr = sr >> 6 | xmaxc[1] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[13] << 13; - sr = sr >> 3 | xmc[14] << 13; - sr = sr >> 3 | xmc[15] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[16] << 13; - sr = sr >> 3 | xmc[17] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[18] << 13; - sr = sr >> 3 | xmc[19] << 13; - sr = sr >> 3 | xmc[20] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[21] << 13; - sr = sr >> 3 | xmc[22] << 13; - sr = sr >> 3 | xmc[23] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[24] << 13; - sr = sr >> 3 | xmc[25] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[2] << 9; - sr = sr >> 2 | bc[2] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[2] << 14; - sr = sr >> 6 | xmaxc[2] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[26] << 13; - sr = sr >> 3 | xmc[27] << 13; - sr = sr >> 3 | xmc[28] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[29] << 13; - sr = sr >> 3 | xmc[30] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[31] << 13; - sr = sr >> 3 | xmc[32] << 13; - sr = sr >> 3 | xmc[33] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[34] << 13; - sr = sr >> 3 | xmc[35] << 13; - sr = sr >> 3 | xmc[36] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[37] << 13; - sr = sr >> 3 | xmc[38] << 13; - *c++ = sr >> 8; - sr = sr >> 7 | Nc[3] << 9; - sr = sr >> 2 | bc[3] << 14; - *c++ = sr >> 7; - sr = sr >> 2 | Mc[3] << 14; - sr = sr >> 6 | xmaxc[3] << 10; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[39] << 13; - sr = sr >> 3 | xmc[40] << 13; - sr = sr >> 3 | xmc[41] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[42] << 13; - sr = sr >> 3 | xmc[43] << 13; - *c++ = sr >> 8; - sr = sr >> 3 | xmc[44] << 13; - sr = sr >> 3 | xmc[45] << 13; - sr = sr >> 3 | xmc[46] << 13; - *c++ = sr >> 7; - sr = sr >> 3 | xmc[47] << 13; - sr = sr >> 3 | xmc[48] << 13; - sr = sr >> 3 | xmc[49] << 13; - *c++ = sr >> 6; - sr = sr >> 3 | xmc[50] << 13; - sr = sr >> 3 | xmc[51] << 13; - *c++ = sr >> 8; - } - } - - else - -#endif /* WAV49 */ - { - - *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ - | ((LARc[0] >> 2) & 0xF); - *c++ = ((LARc[0] & 0x3) << 6) - | (LARc[1] & 0x3F); - *c++ = ((LARc[2] & 0x1F) << 3) - | ((LARc[3] >> 2) & 0x7); - *c++ = ((LARc[3] & 0x3) << 6) - | ((LARc[4] & 0xF) << 2) - | ((LARc[5] >> 2) & 0x3); - *c++ = ((LARc[5] & 0x3) << 6) - | ((LARc[6] & 0x7) << 3) - | (LARc[7] & 0x7); - *c++ = ((Nc[0] & 0x7F) << 1) - | ((bc[0] >> 1) & 0x1); - *c++ = ((bc[0] & 0x1) << 7) - | ((Mc[0] & 0x3) << 5) - | ((xmaxc[0] >> 1) & 0x1F); - *c++ = ((xmaxc[0] & 0x1) << 7) - | ((xmc[0] & 0x7) << 4) - | ((xmc[1] & 0x7) << 1) - | ((xmc[2] >> 2) & 0x1); - *c++ = ((xmc[2] & 0x3) << 6) - | ((xmc[3] & 0x7) << 3) - | (xmc[4] & 0x7); - *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ - | ((xmc[6] & 0x7) << 2) - | ((xmc[7] >> 1) & 0x3); - *c++ = ((xmc[7] & 0x1) << 7) - | ((xmc[8] & 0x7) << 4) - | ((xmc[9] & 0x7) << 1) - | ((xmc[10] >> 2) & 0x1); - *c++ = ((xmc[10] & 0x3) << 6) - | ((xmc[11] & 0x7) << 3) - | (xmc[12] & 0x7); - *c++ = ((Nc[1] & 0x7F) << 1) - | ((bc[1] >> 1) & 0x1); - *c++ = ((bc[1] & 0x1) << 7) - | ((Mc[1] & 0x3) << 5) - | ((xmaxc[1] >> 1) & 0x1F); - *c++ = ((xmaxc[1] & 0x1) << 7) - | ((xmc[13] & 0x7) << 4) - | ((xmc[14] & 0x7) << 1) - | ((xmc[15] >> 2) & 0x1); - *c++ = ((xmc[15] & 0x3) << 6) - | ((xmc[16] & 0x7) << 3) - | (xmc[17] & 0x7); - *c++ = ((xmc[18] & 0x7) << 5) - | ((xmc[19] & 0x7) << 2) - | ((xmc[20] >> 1) & 0x3); - *c++ = ((xmc[20] & 0x1) << 7) - | ((xmc[21] & 0x7) << 4) - | ((xmc[22] & 0x7) << 1) - | ((xmc[23] >> 2) & 0x1); - *c++ = ((xmc[23] & 0x3) << 6) - | ((xmc[24] & 0x7) << 3) - | (xmc[25] & 0x7); - *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ - | ((bc[2] >> 1) & 0x1); - *c++ = ((bc[2] & 0x1) << 7) - | ((Mc[2] & 0x3) << 5) - | ((xmaxc[2] >> 1) & 0x1F); - *c++ = ((xmaxc[2] & 0x1) << 7) - | ((xmc[26] & 0x7) << 4) - | ((xmc[27] & 0x7) << 1) - | ((xmc[28] >> 2) & 0x1); - *c++ = ((xmc[28] & 0x3) << 6) - | ((xmc[29] & 0x7) << 3) - | (xmc[30] & 0x7); - *c++ = ((xmc[31] & 0x7) << 5) - | ((xmc[32] & 0x7) << 2) - | ((xmc[33] >> 1) & 0x3); - *c++ = ((xmc[33] & 0x1) << 7) - | ((xmc[34] & 0x7) << 4) - | ((xmc[35] & 0x7) << 1) - | ((xmc[36] >> 2) & 0x1); - *c++ = ((xmc[36] & 0x3) << 6) - | ((xmc[37] & 0x7) << 3) - | (xmc[38] & 0x7); - *c++ = ((Nc[3] & 0x7F) << 1) - | ((bc[3] >> 1) & 0x1); - *c++ = ((bc[3] & 0x1) << 7) - | ((Mc[3] & 0x3) << 5) - | ((xmaxc[3] >> 1) & 0x1F); - *c++ = ((xmaxc[3] & 0x1) << 7) - | ((xmc[39] & 0x7) << 4) - | ((xmc[40] & 0x7) << 1) - | ((xmc[41] >> 2) & 0x1); - *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ - | ((xmc[42] & 0x7) << 3) - | (xmc[43] & 0x7); - *c++ = ((xmc[44] & 0x7) << 5) - | ((xmc[45] & 0x7) << 2) - | ((xmc[46] >> 1) & 0x3); - *c++ = ((xmc[46] & 0x1) << 7) - | ((xmc[47] & 0x7) << 4) - | ((xmc[48] & 0x7) << 1) - | ((xmc[49] >> 2) & 0x1); - *c++ = ((xmc[49] & 0x3) << 6) - | ((xmc[50] & 0x7) << 3) - | (xmc[51] & 0x7); - - } -} diff --git a/gr-vocoder/lib/gsm/gsm_explode.c b/gr-vocoder/lib/gsm/gsm_explode.c deleted file mode 100644 index 744ded5af1..0000000000 --- a/gr-vocoder/lib/gsm/gsm_explode.c +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" -#include "gsm.h" -#include "proto.h" - -int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) -{ -# define LARc target -# define Nc *((gsm_signal (*) [17])(target + 8)) -# define bc *((gsm_signal (*) [17])(target + 9)) -# define Mc *((gsm_signal (*) [17])(target + 10)) -# define xmaxc *((gsm_signal (*) [17])(target + 11)) - - -#ifdef WAV49 - if (s->wav_fmt) { - - uword sr = 0; - - if (s->frame_index == 1) { - - sr = *c++; - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 12) - xmc[0] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 29 - 13) - - xmc[13] = sr & 0x7; sr >>= 3; - sr = *c++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; - -#undef xmc -#define xmc (target + 46 - 26) - - xmc[26] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *c++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - s->frame_chain = sr & 0xf; - } - else { - sr = s->frame_chain; - sr |= (uword)*c++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *c++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *c++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 12) - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 29 - 13) - - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (target + 46 - 26) - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; - -#undef xmc -#define xmc (target + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = *c++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - } - } - else -#endif - { - /* GSM_MAGIC = (*c >> 4) & 0xF; */ - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; - - LARc[0] = (*c++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*c >> 6) & 0x3; - LARc[1] = *c++ & 0x3F; - LARc[2] = (*c >> 3) & 0x1F; - LARc[3] = (*c++ & 0x7) << 2; - LARc[3] |= (*c >> 6) & 0x3; - LARc[4] = (*c >> 2) & 0xF; - LARc[5] = (*c++ & 0x3) << 2; - LARc[5] |= (*c >> 6) & 0x3; - LARc[6] = (*c >> 3) & 0x7; - LARc[7] = *c++ & 0x7; - - Nc[0] = (*c >> 1) & 0x7F; - - bc[0] = (*c++ & 0x1) << 1; - bc[0] |= (*c >> 7) & 0x1; - - Mc[0] = (*c >> 5) & 0x3; - - xmaxc[0] = (*c++ & 0x1F) << 1; - xmaxc[0] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 12) - - xmc[0] = (*c >> 4) & 0x7; - xmc[1] = (*c >> 1) & 0x7; - xmc[2] = (*c++ & 0x1) << 2; - xmc[2] |= (*c >> 6) & 0x3; - xmc[3] = (*c >> 3) & 0x7; - xmc[4] = *c++ & 0x7; - xmc[5] = (*c >> 5) & 0x7; - xmc[6] = (*c >> 2) & 0x7; - xmc[7] = (*c++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*c >> 7) & 0x1; - xmc[8] = (*c >> 4) & 0x7; - xmc[9] = (*c >> 1) & 0x7; - xmc[10] = (*c++ & 0x1) << 2; - xmc[10] |= (*c >> 6) & 0x3; - xmc[11] = (*c >> 3) & 0x7; - xmc[12] = *c++ & 0x7; - - Nc[1] = (*c >> 1) & 0x7F; - - bc[1] = (*c++ & 0x1) << 1; - bc[1] |= (*c >> 7) & 0x1; - - Mc[1] = (*c >> 5) & 0x3; - - xmaxc[1] = (*c++ & 0x1F) << 1; - xmaxc[1] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 29 - 13) - - xmc[13] = (*c >> 4) & 0x7; - xmc[14] = (*c >> 1) & 0x7; - xmc[15] = (*c++ & 0x1) << 2; - xmc[15] |= (*c >> 6) & 0x3; - xmc[16] = (*c >> 3) & 0x7; - xmc[17] = *c++ & 0x7; - xmc[18] = (*c >> 5) & 0x7; - xmc[19] = (*c >> 2) & 0x7; - xmc[20] = (*c++ & 0x3) << 1; - xmc[20] |= (*c >> 7) & 0x1; - xmc[21] = (*c >> 4) & 0x7; - xmc[22] = (*c >> 1) & 0x7; - xmc[23] = (*c++ & 0x1) << 2; - xmc[23] |= (*c >> 6) & 0x3; - xmc[24] = (*c >> 3) & 0x7; - xmc[25] = *c++ & 0x7; - - Nc[2] = (*c >> 1) & 0x7F; - - bc[2] = (*c++ & 0x1) << 1; /* 20 */ - bc[2] |= (*c >> 7) & 0x1; - - Mc[2] = (*c >> 5) & 0x3; - - xmaxc[2] = (*c++ & 0x1F) << 1; - xmaxc[2] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 46 - 26) - - xmc[26] = (*c >> 4) & 0x7; - xmc[27] = (*c >> 1) & 0x7; - xmc[28] = (*c++ & 0x1) << 2; - xmc[28] |= (*c >> 6) & 0x3; - xmc[29] = (*c >> 3) & 0x7; - xmc[30] = *c++ & 0x7; - xmc[31] = (*c >> 5) & 0x7; - xmc[32] = (*c >> 2) & 0x7; - xmc[33] = (*c++ & 0x3) << 1; - xmc[33] |= (*c >> 7) & 0x1; - xmc[34] = (*c >> 4) & 0x7; - xmc[35] = (*c >> 1) & 0x7; - xmc[36] = (*c++ & 0x1) << 2; - xmc[36] |= (*c >> 6) & 0x3; - xmc[37] = (*c >> 3) & 0x7; - xmc[38] = *c++ & 0x7; - - Nc[3] = (*c >> 1) & 0x7F; - - bc[3] = (*c++ & 0x1) << 1; - bc[3] |= (*c >> 7) & 0x1; - - Mc[3] = (*c >> 5) & 0x3; - - xmaxc[3] = (*c++ & 0x1F) << 1; - xmaxc[3] |= (*c >> 7) & 0x1; - -#undef xmc -#define xmc (target + 63 - 39) - - xmc[39] = (*c >> 4) & 0x7; - xmc[40] = (*c >> 1) & 0x7; - xmc[41] = (*c++ & 0x1) << 2; - xmc[41] |= (*c >> 6) & 0x3; - xmc[42] = (*c >> 3) & 0x7; - xmc[43] = *c++ & 0x7; /* 30 */ - xmc[44] = (*c >> 5) & 0x7; - xmc[45] = (*c >> 2) & 0x7; - xmc[46] = (*c++ & 0x3) << 1; - xmc[46] |= (*c >> 7) & 0x1; - xmc[47] = (*c >> 4) & 0x7; - xmc[48] = (*c >> 1) & 0x7; - xmc[49] = (*c++ & 0x1) << 2; - xmc[49] |= (*c >> 6) & 0x3; - xmc[50] = (*c >> 3) & 0x7; - xmc[51] = *c & 0x7; /* 33 */ - } - - return 0; -} diff --git a/gr-vocoder/lib/gsm/gsm_implode.c b/gr-vocoder/lib/gsm/gsm_implode.c deleted file mode 100644 index 08ebf58532..0000000000 --- a/gr-vocoder/lib/gsm/gsm_implode.c +++ /dev/null @@ -1,515 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c) -{ - /* variable size index - - GSM_MAGIC 4 - - - LARc[0] 6 0 - LARc[1] 6 1 - LARc[2] 5 2 - LARc[3] 5 3 - LARc[4] 4 4 - LARc[5] 4 5 - LARc[6] 3 6 - LARc[7] 3 7 - - Nc[0] 7 8 - bc[0] 2 9 - Mc[0] 2 10 - xmaxc[0] 6 11 - xmc[0] 3 12 - xmc[1] 3 13 - xmc[2] 3 14 - xmc[3] 3 15 - xmc[4] 3 16 - xmc[5] 3 17 - xmc[6] 3 18 - xmc[7] 3 19 - xmc[8] 3 20 - xmc[9] 3 21 - xmc[10] 3 22 - xmc[11] 3 23 - xmc[12] 3 24 - - Nc[1] 7 25 - bc[1] 2 26 - Mc[1] 2 27 - xmaxc[1] 6 28 - xmc[13] 3 29 - xmc[14] 3 30 - xmc[15] 3 31 - xmc[16] 3 32 - xmc[17] 3 33 - xmc[18] 3 34 - xmc[19] 3 35 - xmc[20] 3 36 - xmc[21] 3 37 - xmc[22] 3 38 - xmc[23] 3 39 - xmc[24] 3 40 - xmc[25] 3 41 - - Nc[2] 7 42 - bc[2] 2 43 - Mc[2] 2 44 - xmaxc[2] 6 45 - xmc[26] 3 46 - xmc[27] 3 47 - xmc[28] 3 48 - xmc[29] 3 49 - xmc[30] 3 50 - xmc[31] 3 51 - xmc[32] 3 52 - xmc[33] 3 53 - xmc[34] 3 54 - xmc[35] 3 55 - xmc[36] 3 56 - xmc[37] 3 57 - xmc[38] 3 58 - - Nc[3] 7 59 - bc[3] 2 60 - Mc[3] 2 61 - xmaxc[3] 6 62 - xmc[39] 3 63 - xmc[40] 3 64 - xmc[41] 3 65 - xmc[42] 3 66 - xmc[43] 3 67 - xmc[44] 3 68 - xmc[45] 3 69 - xmc[46] 3 70 - xmc[47] 3 71 - xmc[48] 3 72 - xmc[49] 3 73 - xmc[50] 3 74 - xmc[51] 3 75 - */ - - /* There are 76 parameters per frame. The first eight are - * unique. The remaining 68 are four identical subframes of - * 17 parameters each. gsm_implode converts from a representation - * of these parameters as values in one array of signed words - * to the "packed" version of a GSM frame. - */ - -# define LARc source -# define Nc *((gsm_signal (*) [17])(source + 8)) -# define bc *((gsm_signal (*) [17])(source + 9)) -# define Mc *((gsm_signal (*) [17])(source + 10)) -# define xmaxc *((gsm_signal (*) [17])(source + 11)) - -#ifdef WAV49 - if (s->wav_fmt) { - - uword sr = 0; - if (s->frame_index == 0) { - - sr = *c++; - LARc[0] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 2; - LARc[1] = sr & 0x3f; sr >>= 6; - sr |= (uword)*c++ << 4; - LARc[2] = sr & 0x1f; sr >>= 5; - LARc[3] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 2; - LARc[4] = sr & 0xf; sr >>= 4; - LARc[5] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; /* 5 */ - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[0] = sr & 0x7f; sr >>= 7; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 12) - xmc[0] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[1] = sr & 0x7; sr >>= 3; - xmc[2] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - xmc[5] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 10 */ - xmc[6] = sr & 0x7; sr >>= 3; - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[9] = sr & 0x7; sr >>= 3; - xmc[10] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[1] = sr & 0x7f; sr >>= 7; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 29 - 13) - xmc[13] = sr & 0x7; sr >>= 3; - sr = *c++; /* 15 */ - xmc[14] = sr & 0x7; sr >>= 3; - xmc[15] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - xmc[18] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[19] = sr & 0x7; sr >>= 3; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[22] = sr & 0x7; sr >>= 3; - xmc[23] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; /* 20 */ - Nc[2] = sr & 0x7f; sr >>= 7; - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[2] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 46 - 26) - xmc[26] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[27] = sr & 0x7; sr >>= 3; - xmc[28] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - xmc[31] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[32] = sr & 0x7; sr >>= 3; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - sr = *c++; /* 25 */ - xmc[35] = sr & 0x7; sr >>= 3; - xmc[36] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 4; - Nc[3] = sr & 0x7f; sr >>= 7; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 1; - xmaxc[3] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[40] = sr & 0x7; sr >>= 3; - xmc[41] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 30 */ - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - xmc[44] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[45] = sr & 0x7; sr >>= 3; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[48] = sr & 0x7; sr >>= 3; - xmc[49] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - - s->frame_chain = sr & 0xf; - } - else { - sr = s->frame_chain; - sr |= (uword)*c++ << 4; /* 1 */ - LARc[0] = sr & 0x3f; sr >>= 6; - LARc[1] = sr & 0x3f; sr >>= 6; - sr = *c++; - LARc[2] = sr & 0x1f; sr >>= 5; - sr |= (uword)*c++ << 3; - LARc[3] = sr & 0x1f; sr >>= 5; - LARc[4] = sr & 0xf; sr >>= 4; - sr |= (uword)*c++ << 2; - LARc[5] = sr & 0xf; sr >>= 4; - LARc[6] = sr & 0x7; sr >>= 3; - LARc[7] = sr & 0x7; sr >>= 3; - sr = *c++; /* 5 */ - Nc[0] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[0] = sr & 0x3; sr >>= 2; - Mc[0] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[0] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 12) - xmc[0] = sr & 0x7; sr >>= 3; - xmc[1] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[2] = sr & 0x7; sr >>= 3; - xmc[3] = sr & 0x7; sr >>= 3; - xmc[4] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[5] = sr & 0x7; sr >>= 3; - xmc[6] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; /* 10 */ - xmc[7] = sr & 0x7; sr >>= 3; - xmc[8] = sr & 0x7; sr >>= 3; - xmc[9] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[10] = sr & 0x7; sr >>= 3; - xmc[11] = sr & 0x7; sr >>= 3; - xmc[12] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[1] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[1] = sr & 0x3; sr >>= 2; - Mc[1] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[1] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 29 - 13) - xmc[13] = sr & 0x7; sr >>= 3; - xmc[14] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 15 */ - xmc[15] = sr & 0x7; sr >>= 3; - xmc[16] = sr & 0x7; sr >>= 3; - xmc[17] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[18] = sr & 0x7; sr >>= 3; - xmc[19] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[20] = sr & 0x7; sr >>= 3; - xmc[21] = sr & 0x7; sr >>= 3; - xmc[22] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[23] = sr & 0x7; sr >>= 3; - xmc[24] = sr & 0x7; sr >>= 3; - xmc[25] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[2] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; /* 20 */ - bc[2] = sr & 0x3; sr >>= 2; - Mc[2] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[2] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 46 - 26) - xmc[26] = sr & 0x7; sr >>= 3; - xmc[27] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[28] = sr & 0x7; sr >>= 3; - xmc[29] = sr & 0x7; sr >>= 3; - xmc[30] = sr & 0x7; sr >>= 3; - sr = *c++; - xmc[31] = sr & 0x7; sr >>= 3; - xmc[32] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[33] = sr & 0x7; sr >>= 3; - xmc[34] = sr & 0x7; sr >>= 3; - xmc[35] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; /* 25 */ - xmc[36] = sr & 0x7; sr >>= 3; - xmc[37] = sr & 0x7; sr >>= 3; - xmc[38] = sr & 0x7; sr >>= 3; - sr = *c++; - Nc[3] = sr & 0x7f; sr >>= 7; - sr |= (uword)*c++ << 1; - bc[3] = sr & 0x3; sr >>= 2; - Mc[3] = sr & 0x3; sr >>= 2; - sr |= (uword)*c++ << 5; - xmaxc[3] = sr & 0x3f; sr >>= 6; -#undef xmc -#define xmc (source + 63 - 39) - - xmc[39] = sr & 0x7; sr >>= 3; - xmc[40] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[41] = sr & 0x7; sr >>= 3; - xmc[42] = sr & 0x7; sr >>= 3; - xmc[43] = sr & 0x7; sr >>= 3; - sr = *c++; /* 30 */ - xmc[44] = sr & 0x7; sr >>= 3; - xmc[45] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 2; - xmc[46] = sr & 0x7; sr >>= 3; - xmc[47] = sr & 0x7; sr >>= 3; - xmc[48] = sr & 0x7; sr >>= 3; - sr |= (uword)*c++ << 1; - xmc[49] = sr & 0x7; sr >>= 3; - xmc[50] = sr & 0x7; sr >>= 3; - xmc[51] = sr & 0x7; sr >>= 3; - } - } - else -#endif - { - - *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ - | ((LARc[0] >> 2) & 0xF); - *c++ = ((LARc[0] & 0x3) << 6) - | (LARc[1] & 0x3F); - *c++ = ((LARc[2] & 0x1F) << 3) - | ((LARc[3] >> 2) & 0x7); - *c++ = ((LARc[3] & 0x3) << 6) - | ((LARc[4] & 0xF) << 2) - | ((LARc[5] >> 2) & 0x3); - *c++ = ((LARc[5] & 0x3) << 6) - | ((LARc[6] & 0x7) << 3) - | (LARc[7] & 0x7); - - - *c++ = ((Nc[0] & 0x7F) << 1) - - - | ((bc[0] >> 1) & 0x1); - *c++ = ((bc[0] & 0x1) << 7) - - - | ((Mc[0] & 0x3) << 5) - - | ((xmaxc[0] >> 1) & 0x1F); - *c++ = ((xmaxc[0] & 0x1) << 7) - -#undef xmc -#define xmc (source + 12) - - | ((xmc[0] & 0x7) << 4) - | ((xmc[1] & 0x7) << 1) - | ((xmc[2] >> 2) & 0x1); - *c++ = ((xmc[2] & 0x3) << 6) - | ((xmc[3] & 0x7) << 3) - | (xmc[4] & 0x7); - *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ - | ((xmc[6] & 0x7) << 2) - | ((xmc[7] >> 1) & 0x3); - *c++ = ((xmc[7] & 0x1) << 7) - | ((xmc[8] & 0x7) << 4) - | ((xmc[9] & 0x7) << 1) - | ((xmc[10] >> 2) & 0x1); - *c++ = ((xmc[10] & 0x3) << 6) - | ((xmc[11] & 0x7) << 3) - | (xmc[12] & 0x7); - - - *c++ = ((Nc[1] & 0x7F) << 1) - - - | ((bc[1] >> 1) & 0x1); - *c++ = ((bc[1] & 0x1) << 7) - - - | ((Mc[1] & 0x3) << 5) - - - | ((xmaxc[1] >> 1) & 0x1F); - *c++ = ((xmaxc[1] & 0x1) << 7) - -#undef xmc -#define xmc (source + 29 - 13) - - | ((xmc[13] & 0x7) << 4) - | ((xmc[14] & 0x7) << 1) - | ((xmc[15] >> 2) & 0x1); - *c++ = ((xmc[15] & 0x3) << 6) - | ((xmc[16] & 0x7) << 3) - | (xmc[17] & 0x7); - *c++ = ((xmc[18] & 0x7) << 5) - | ((xmc[19] & 0x7) << 2) - | ((xmc[20] >> 1) & 0x3); - *c++ = ((xmc[20] & 0x1) << 7) - | ((xmc[21] & 0x7) << 4) - | ((xmc[22] & 0x7) << 1) - | ((xmc[23] >> 2) & 0x1); - *c++ = ((xmc[23] & 0x3) << 6) - | ((xmc[24] & 0x7) << 3) - | (xmc[25] & 0x7); - - - *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ - - - | ((bc[2] >> 1) & 0x1); - *c++ = ((bc[2] & 0x1) << 7) - - - | ((Mc[2] & 0x3) << 5) - - - | ((xmaxc[2] >> 1) & 0x1F); - *c++ = ((xmaxc[2] & 0x1) << 7) - -#undef xmc -#define xmc (source + 46 - 26) - - | ((xmc[26] & 0x7) << 4) - | ((xmc[27] & 0x7) << 1) - | ((xmc[28] >> 2) & 0x1); - *c++ = ((xmc[28] & 0x3) << 6) - | ((xmc[29] & 0x7) << 3) - | (xmc[30] & 0x7); - *c++ = ((xmc[31] & 0x7) << 5) - | ((xmc[32] & 0x7) << 2) - | ((xmc[33] >> 1) & 0x3); - *c++ = ((xmc[33] & 0x1) << 7) - | ((xmc[34] & 0x7) << 4) - | ((xmc[35] & 0x7) << 1) - | ((xmc[36] >> 2) & 0x1); - *c++ = ((xmc[36] & 0x3) << 6) - | ((xmc[37] & 0x7) << 3) - | (xmc[38] & 0x7); - - - *c++ = ((Nc[3] & 0x7F) << 1) - - - | ((bc[3] >> 1) & 0x1); - *c++ = ((bc[3] & 0x1) << 7) - - - | ((Mc[3] & 0x3) << 5) - - - | ((xmaxc[3] >> 1) & 0x1F); - *c++ = ((xmaxc[3] & 0x1) << 7) - -#undef xmc -#define xmc (source + 63 - 39) - - | ((xmc[39] & 0x7) << 4) - | ((xmc[40] & 0x7) << 1) - | ((xmc[41] >> 2) & 0x1); - *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ - | ((xmc[42] & 0x7) << 3) - | (xmc[43] & 0x7); - *c++ = ((xmc[44] & 0x7) << 5) - | ((xmc[45] & 0x7) << 2) - | ((xmc[46] >> 1) & 0x3); - *c++ = ((xmc[46] & 0x1) << 7) - | ((xmc[47] & 0x7) << 4) - | ((xmc[48] & 0x7) << 1) - | ((xmc[49] >> 2) & 0x1); - *c++ = ((xmc[49] & 0x3) << 6) - | ((xmc[50] & 0x7) << 3) - | (xmc[51] & 0x7); - } -} diff --git a/gr-vocoder/lib/gsm/gsm_option.c b/gr-vocoder/lib/gsm/gsm_option.c deleted file mode 100644 index 303170a9c2..0000000000 --- a/gr-vocoder/lib/gsm/gsm_option.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -int gsm_option P3((r, opt, val), gsm r, int opt, int * val) -{ - int result = -1; - - switch (opt) { - case GSM_OPT_LTP_CUT: -#ifdef LTP_CUT - result = r->ltp_cut; - if (val) r->ltp_cut = *val; -#endif - break; - - case GSM_OPT_VERBOSE: -#ifndef NDEBUG - result = r->verbose; - if (val) r->verbose = *val; -#endif - break; - - case GSM_OPT_FAST: - -#if defined(FAST) && defined(USE_FLOAT_MUL) - result = r->fast; - if (val) r->fast = !!*val; -#endif - break; - - case GSM_OPT_FRAME_CHAIN: - -#ifdef WAV49 - result = r->frame_chain; - if (val) r->frame_chain = *val; -#endif - break; - - case GSM_OPT_FRAME_INDEX: - -#ifdef WAV49 - result = r->frame_index; - if (val) r->frame_index = *val; -#endif - break; - - case GSM_OPT_WAV49: - -#ifdef WAV49 - result = r->wav_fmt; - if (val) r->wav_fmt = !!*val; -#endif - break; - - default: - break; - } - return result; -} diff --git a/gr-vocoder/lib/gsm/gsm_print.c b/gr-vocoder/lib/gsm/gsm_print.c deleted file mode 100644 index af745bc48a..0000000000 --- a/gr-vocoder/lib/gsm/gsm_print.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -int gsm_print P3((f, s, c), FILE * f, gsm s, gsm_byte * c) -{ - word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; - - /* GSM_MAGIC = (*c >> 4) & 0xF; */ - - if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; - - LARc[0] = (*c++ & 0xF) << 2; /* 1 */ - LARc[0] |= (*c >> 6) & 0x3; - LARc[1] = *c++ & 0x3F; - LARc[2] = (*c >> 3) & 0x1F; - LARc[3] = (*c++ & 0x7) << 2; - LARc[3] |= (*c >> 6) & 0x3; - LARc[4] = (*c >> 2) & 0xF; - LARc[5] = (*c++ & 0x3) << 2; - LARc[5] |= (*c >> 6) & 0x3; - LARc[6] = (*c >> 3) & 0x7; - LARc[7] = *c++ & 0x7; - - - Nc[0] = (*c >> 1) & 0x7F; - bc[0] = (*c++ & 0x1) << 1; - bc[0] |= (*c >> 7) & 0x1; - Mc[0] = (*c >> 5) & 0x3; - xmaxc[0] = (*c++ & 0x1F) << 1; - xmaxc[0] |= (*c >> 7) & 0x1; - xmc[0] = (*c >> 4) & 0x7; - xmc[1] = (*c >> 1) & 0x7; - xmc[2] = (*c++ & 0x1) << 2; - xmc[2] |= (*c >> 6) & 0x3; - xmc[3] = (*c >> 3) & 0x7; - xmc[4] = *c++ & 0x7; - xmc[5] = (*c >> 5) & 0x7; - xmc[6] = (*c >> 2) & 0x7; - xmc[7] = (*c++ & 0x3) << 1; /* 10 */ - xmc[7] |= (*c >> 7) & 0x1; - xmc[8] = (*c >> 4) & 0x7; - xmc[9] = (*c >> 1) & 0x7; - xmc[10] = (*c++ & 0x1) << 2; - xmc[10] |= (*c >> 6) & 0x3; - xmc[11] = (*c >> 3) & 0x7; - xmc[12] = *c++ & 0x7; - - Nc[1] = (*c >> 1) & 0x7F; - bc[1] = (*c++ & 0x1) << 1; - bc[1] |= (*c >> 7) & 0x1; - Mc[1] = (*c >> 5) & 0x3; - xmaxc[1] = (*c++ & 0x1F) << 1; - xmaxc[1] |= (*c >> 7) & 0x1; - xmc[13] = (*c >> 4) & 0x7; - xmc[14] = (*c >> 1) & 0x7; - xmc[15] = (*c++ & 0x1) << 2; - xmc[15] |= (*c >> 6) & 0x3; - xmc[16] = (*c >> 3) & 0x7; - xmc[17] = *c++ & 0x7; - xmc[18] = (*c >> 5) & 0x7; - xmc[19] = (*c >> 2) & 0x7; - xmc[20] = (*c++ & 0x3) << 1; - xmc[20] |= (*c >> 7) & 0x1; - xmc[21] = (*c >> 4) & 0x7; - xmc[22] = (*c >> 1) & 0x7; - xmc[23] = (*c++ & 0x1) << 2; - xmc[23] |= (*c >> 6) & 0x3; - xmc[24] = (*c >> 3) & 0x7; - xmc[25] = *c++ & 0x7; - - - Nc[2] = (*c >> 1) & 0x7F; - bc[2] = (*c++ & 0x1) << 1; /* 20 */ - bc[2] |= (*c >> 7) & 0x1; - Mc[2] = (*c >> 5) & 0x3; - xmaxc[2] = (*c++ & 0x1F) << 1; - xmaxc[2] |= (*c >> 7) & 0x1; - xmc[26] = (*c >> 4) & 0x7; - xmc[27] = (*c >> 1) & 0x7; - xmc[28] = (*c++ & 0x1) << 2; - xmc[28] |= (*c >> 6) & 0x3; - xmc[29] = (*c >> 3) & 0x7; - xmc[30] = *c++ & 0x7; - xmc[31] = (*c >> 5) & 0x7; - xmc[32] = (*c >> 2) & 0x7; - xmc[33] = (*c++ & 0x3) << 1; - xmc[33] |= (*c >> 7) & 0x1; - xmc[34] = (*c >> 4) & 0x7; - xmc[35] = (*c >> 1) & 0x7; - xmc[36] = (*c++ & 0x1) << 2; - xmc[36] |= (*c >> 6) & 0x3; - xmc[37] = (*c >> 3) & 0x7; - xmc[38] = *c++ & 0x7; - - Nc[3] = (*c >> 1) & 0x7F; - bc[3] = (*c++ & 0x1) << 1; - bc[3] |= (*c >> 7) & 0x1; - Mc[3] = (*c >> 5) & 0x3; - xmaxc[3] = (*c++ & 0x1F) << 1; - xmaxc[3] |= (*c >> 7) & 0x1; - - xmc[39] = (*c >> 4) & 0x7; - xmc[40] = (*c >> 1) & 0x7; - xmc[41] = (*c++ & 0x1) << 2; - xmc[41] |= (*c >> 6) & 0x3; - xmc[42] = (*c >> 3) & 0x7; - xmc[43] = *c++ & 0x7; /* 30 */ - xmc[44] = (*c >> 5) & 0x7; - xmc[45] = (*c >> 2) & 0x7; - xmc[46] = (*c++ & 0x3) << 1; - xmc[46] |= (*c >> 7) & 0x1; - xmc[47] = (*c >> 4) & 0x7; - xmc[48] = (*c >> 1) & 0x7; - xmc[49] = (*c++ & 0x1) << 2; - xmc[49] |= (*c >> 6) & 0x3; - xmc[50] = (*c >> 3) & 0x7; - xmc[51] = *c & 0x7; /* 33 */ - - fprintf(f, - "LARc:\t%2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d\n", - LARc[0],LARc[1],LARc[2],LARc[3],LARc[4],LARc[5],LARc[6],LARc[7]); - - fprintf(f, "#1: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[0], bc[0], Mc[0], xmaxc[0]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[0],xmc[1],xmc[2],xmc[3],xmc[4],xmc[5],xmc[6], - xmc[7],xmc[8],xmc[9],xmc[10],xmc[11],xmc[12] ); - - fprintf(f, "#2: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[1], bc[1], Mc[1], xmaxc[1]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[13+0],xmc[13+1],xmc[13+2],xmc[13+3],xmc[13+4],xmc[13+5], - xmc[13+6], xmc[13+7],xmc[13+8],xmc[13+9],xmc[13+10],xmc[13+11], - xmc[13+12] ); - - fprintf(f, "#3: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[2], bc[2], Mc[2], xmaxc[2]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[26+0],xmc[26+1],xmc[26+2],xmc[26+3],xmc[26+4],xmc[26+5], - xmc[26+6], xmc[26+7],xmc[26+8],xmc[26+9],xmc[26+10],xmc[26+11], - xmc[26+12] ); - - fprintf(f, "#4: Nc %4.4d bc %d Mc %d xmaxc %d\n", - Nc[3], bc[3], Mc[3], xmaxc[3]); - fprintf(f, -"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", - xmc[39+0],xmc[39+1],xmc[39+2],xmc[39+3],xmc[39+4],xmc[39+5], - xmc[39+6], xmc[39+7],xmc[39+8],xmc[39+9],xmc[39+10],xmc[39+11], - xmc[39+12] ); - - return 0; -} diff --git a/gr-vocoder/lib/gsm/long_term.c b/gr-vocoder/lib/gsm/long_term.c deleted file mode 100644 index 7dd9631e02..0000000000 --- a/gr-vocoder/lib/gsm/long_term.c +++ /dev/null @@ -1,949 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* - * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION - */ - - -/* - * This module computes the LTP gain (bc) and the LTP lag (Nc) - * for the long term analysis filter. This is done by calculating a - * maximum of the cross-correlation function between the current - * sub-segment short term residual signal d[0..39] (output of - * the short term analysis filter; for simplification the index - * of this array begins at 0 and ends at 39 for each sub-segment of the - * RPE-LTP analysis) and the previous reconstructed short term - * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be - * performed to avoid overflow. - */ - - /* The next procedure exists in six versions. First two integer - * version (if USE_FLOAT_MUL is not defined); then four floating - * point versions, twice with proper scaling (USE_FLOAT_MUL defined), - * once without (USE_FLOAT_MUL and FAST defined, and fast run-time - * option used). Every pair has first a Cut version (see the -C - * option to toast or the LTP_CUT option to gsm_option()), then the - * uncut one. (For a detailed explanation of why this is altogether - * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered - * Harmful''.) - */ - -#ifndef USE_FLOAT_MUL - -#ifdef LTP_CUT - -static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), - - struct gsm_state * st, - - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word wt[40]; - - longword L_result; - longword L_max, L_power; - word R, S, dmax, scal, best_k; - word ltp_cut; - - register word temp, wt_k; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) { - dmax = temp; - best_k = k; - } - } - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - if (temp > 6) scal = 0; - else scal = 6 - temp; - assert(scal >= 0); - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - wt_k = SASR(d[best_k], scal); - - for (lambda = 40; lambda <= 120; lambda++) { - L_result = (longword)wt_k * dp[best_k - lambda]; - if (L_result > L_max) { - Nc = lambda; - L_max = L_result; - } - } - *Nc_out = Nc; - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word wt[40]; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - - /* Initialization of a working array wt - */ - - for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal ); - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda++) { - -# undef STEP -# define STEP(k) (longword)wt[k] * dp[k - lambda] - - register longword L_result; - - L_result = STEP(0) ; L_result += STEP(1) ; - L_result += STEP(2) ; L_result += STEP(3) ; - L_result += STEP(4) ; L_result += STEP(5) ; - L_result += STEP(6) ; L_result += STEP(7) ; - L_result += STEP(8) ; L_result += STEP(9) ; - L_result += STEP(10) ; L_result += STEP(11) ; - L_result += STEP(12) ; L_result += STEP(13) ; - L_result += STEP(14) ; L_result += STEP(15) ; - L_result += STEP(16) ; L_result += STEP(17) ; - L_result += STEP(18) ; L_result += STEP(19) ; - L_result += STEP(20) ; L_result += STEP(21) ; - L_result += STEP(22) ; L_result += STEP(23) ; - L_result += STEP(24) ; L_result += STEP(25) ; - L_result += STEP(26) ; L_result += STEP(27) ; - L_result += STEP(28) ; L_result += STEP(29) ; - L_result += STEP(30) ; L_result += STEP(31) ; - L_result += STEP(32) ; L_result += STEP(33) ; - L_result += STEP(34) ; L_result += STEP(35) ; - L_result += STEP(36) ; L_result += STEP(37) ; - L_result += STEP(38) ; L_result += STEP(39) ; - - if (L_result > L_max) { - - Nc = lambda; - L_max = L_result; - } - } - - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#else /* USE_FLOAT_MUL */ - -#ifdef LTP_CUT - -static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), - struct gsm_state * st, /* IN */ - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - word ltp_cut; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; - - - /* Initialization of a working array wt - */ - - for (k = 0; k < 40; k++) { - register word w = SASR( d[k], scal ); - if (w < 0 ? w > -ltp_cut : w < ltp_cut) { - wt_float[k] = 0.0; - } - else { - wt_float[k] = w; - } - } - for (k = -120; k < 0; k++) dp_float[k] = dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - if ((W = wt_float[K]) != 0.0) { \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E; } else (a = lp[K]) - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - - } - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - longword L_max, L_power; - word R, S, dmax, scal; - register word temp; - - /* Search of the optimum scaling of d[0..39]. - */ - dmax = 0; - - for (k = 0; k <= 39; k++) { - temp = d[k]; - temp = GSM_ABS( temp ); - if (temp > dmax) dmax = temp; - } - - temp = 0; - if (dmax == 0) scal = 0; - else { - assert(dmax > 0); - temp = gsm_norm( (longword)dmax << 16 ); - } - - if (temp > 6) scal = 0; - else scal = 6 - temp; - - assert(scal >= 0); - - /* Initialization of a working array wt - */ - - for (k = 0; k < 40; k++) wt_float[k] = SASR( d[k], scal ); - for (k = -120; k < 0; k++) dp_float[k] = dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - W = wt_float[K]; \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - } - *Nc_out = Nc; - - L_max <<= 1; - - /* Rescaling of L_max - */ - assert(scal <= 100 && scal >= -100); - L_max = L_max >> (6 - scal); /* sub(6, scal) */ - - assert( Nc <= 120 && Nc >= 40); - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - L_power = 0; - for (k = 0; k <= 39; k++) { - - register longword L_temp; - - L_temp = SASR( dp[k - Nc], 3 ); - L_power += L_temp * L_temp; - } - L_power <<= 1; /* from L_MULT */ - - /* Normalization of L_max and L_power - */ - - if (L_max <= 0) { - *bc_out = 0; - return; - } - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - temp = gsm_norm( L_power ); - - R = SASR( L_max << temp, 16 ); - S = SASR( L_power << temp, 16 ); - - /* Coding of the LTP gain - */ - - /* Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; - *bc_out = bc; -} - -#ifdef FAST -#ifdef LTP_CUT - -static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st, - d,dp,bc_out,Nc_out), - struct gsm_state * st, /* IN */ - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - register float wt_float; - word Nc, bc; - word wt_max, best_k, ltp_cut; - - float dp_float_base[120], * dp_float = dp_float_base + 120; - - register float L_result, L_max, L_power; - - wt_max = 0; - - for (k = 0; k < 40; ++k) { - if ( d[k] > wt_max) wt_max = d[best_k = k]; - else if (-d[k] > wt_max) wt_max = -d[best_k = k]; - } - - assert(wt_max >= 0); - wt_float = (float)wt_max; - - for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda++) { - L_result = wt_float * dp_float[best_k - lambda]; - if (L_result > L_max) { - Nc = lambda; - L_max = L_result; - } - } - - *Nc_out = Nc; - if (L_max <= 0.) { - *bc_out = 0; - return; - } - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - dp_float -= Nc; - L_power = 0; - for (k = 0; k < 40; ++k) { - register float f = dp_float[k]; - L_power += f * f; - } - - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - /* Coding of the LTP gain - * Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - lambda = L_max / L_power * 32768.; - for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; - *bc_out = bc; -} - -#endif /* LTP_CUT */ - -static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), - register word * d, /* [0..39] IN */ - register word * dp, /* [-120..-1] IN */ - word * bc_out, /* OUT */ - word * Nc_out /* OUT */ -) -{ - register int k, lambda; - word Nc, bc; - - float wt_float[40]; - float dp_float_base[120], * dp_float = dp_float_base + 120; - - register float L_max, L_power; - - for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k]; - for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; - - /* Search for the maximum cross-correlation and coding of the LTP lag - */ - L_max = 0; - Nc = 40; /* index for the maximum cross-correlation */ - - for (lambda = 40; lambda <= 120; lambda += 9) { - - /* Calculate L_result for l = lambda .. lambda + 9. - */ - register float *lp = dp_float - lambda; - - register float W; - register float a = lp[-8], b = lp[-7], c = lp[-6], - d = lp[-5], e = lp[-4], f = lp[-3], - g = lp[-2], h = lp[-1]; - register float E; - register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, - S5 = 0, S6 = 0, S7 = 0, S8 = 0; - -# undef STEP -# define STEP(K, a, b, c, d, e, f, g, h) \ - W = wt_float[K]; \ - E = W * a; S8 += E; \ - E = W * b; S7 += E; \ - E = W * c; S6 += E; \ - E = W * d; S5 += E; \ - E = W * e; S4 += E; \ - E = W * f; S3 += E; \ - E = W * g; S2 += E; \ - E = W * h; S1 += E; \ - a = lp[K]; \ - E = W * a; S0 += E - -# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) -# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) -# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) -# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) -# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) -# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) -# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) -# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) - - STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); - STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); - - STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); - STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); - - STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); - STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); - - STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); - STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); - - STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); - STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); - - if (S0 > L_max) { L_max = S0; Nc = lambda; } - if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } - if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } - if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } - if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } - if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } - if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } - if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } - if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } - } - *Nc_out = Nc; - - if (L_max <= 0.) { - *bc_out = 0; - return; - } - - /* Compute the power of the reconstructed short term residual - * signal dp[..] - */ - dp_float -= Nc; - L_power = 0; - for (k = 0; k < 40; ++k) { - register float f = dp_float[k]; - L_power += f * f; - } - - if (L_max >= L_power) { - *bc_out = 3; - return; - } - - /* Coding of the LTP gain - * Table 4.3a must be used to obtain the level DLB[i] for the - * quantization of the LTP gain b to get the coded version bc. - */ - lambda = L_max / L_power * 32768.; - for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; - *bc_out = bc; -} - -#endif /* FAST */ -#endif /* USE_FLOAT_MUL */ - - -/* 4.2.12 */ - -static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e), - word bc, /* IN */ - word Nc, /* IN */ - register word * dp, /* previous d [-120..-1] IN */ - register word * d, /* d [0..39] IN */ - register word * dpp, /* estimate [0..39] OUT */ - register word * e /* long term res. signal [0..39] OUT */ -) -/* - * In this part, we have to decode the bc parameter to compute - * the samples of the estimate dpp[0..39]. The decoding of bc needs the - * use of table 4.3b. The long term residual signal e[0..39] - * is then calculated to be fed to the RPE encoding section. - */ -{ - register int k; - register longword ltmp; - -# undef STEP -# define STEP(BP) \ - for (k = 0; k <= 39; k++) { \ - dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \ - e[k] = GSM_SUB( d[k], dpp[k] ); \ - } - - switch (bc) { - case 0: STEP( 3277 ); break; - case 1: STEP( 11469 ); break; - case 2: STEP( 21299 ); break; - case 3: STEP( 32767 ); break; - } -} - -void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), /* 4x for 160 samples */ - - struct gsm_state * S, - - word * d, /* [0..39] residual signal IN */ - word * dp, /* [-120..-1] d' IN */ - - word * e, /* [0..39] OUT */ - word * dpp, /* [0..39] OUT */ - word * Nc, /* correlation lag OUT */ - word * bc /* gain factor OUT */ -) -{ - assert( d ); assert( dp ); assert( e ); - assert( dpp); assert( Nc ); assert( bc ); - -#if defined(FAST) && defined(USE_FLOAT_MUL) - if (S->fast) -#if defined (LTP_CUT) - if (S->ltp_cut) - Cut_Fast_Calculation_of_the_LTP_parameters(S, - d, dp, bc, Nc); - else -#endif /* LTP_CUT */ - Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc ); - else -#endif /* FAST & USE_FLOAT_MUL */ -#ifdef LTP_CUT - if (S->ltp_cut) - Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc); - else -#endif - Calculation_of_the_LTP_parameters(d, dp, bc, Nc); - - Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e ); -} - -/* 4.3.2 */ -void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp), - struct gsm_state * S, - - word Ncr, - word bcr, - register word * erp, /* [0..39] IN */ - register word * drp /* [-120..-1] IN, [-120..40] OUT */ -) -/* - * This procedure uses the bcr and Ncr parameter to realize the - * long term synthesis filtering. The decoding of bcr needs - * table 4.3b. - */ -{ - register longword ltmp; /* for ADD */ - register int k; - word brp, drpp, Nr; - - /* Check the limits of Nr. - */ - Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; - S->nrp = Nr; - assert(Nr >= 40 && Nr <= 120); - - /* Decoding of the LTP gain bcr - */ - brp = gsm_QLB[ bcr ]; - - /* Computation of the reconstructed short term residual - * signal drp[0..39] - */ - assert(brp != MIN_WORD); - - for (k = 0; k <= 39; k++) { - drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); - drp[k] = GSM_ADD( erp[k], drpp ); - } - - /* - * Update of the reconstructed short term residual signal - * drp[ -1..-120 ] - */ - - for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; -} diff --git a/gr-vocoder/lib/gsm/lpc.c b/gr-vocoder/lib/gsm/lpc.c deleted file mode 100644 index bc1695c414..0000000000 --- a/gr-vocoder/lib/gsm/lpc.c +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -#undef P - -/* - * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION - */ - -/* 4.2.4 */ - - -static void Autocorrelation P2((s, L_ACF), - word * s, /* [0..159] IN/OUT */ - longword * L_ACF) /* [0..8] OUT */ -/* - * The goal is to compute the array L_ACF[k]. The signal s[i] must - * be scaled in order to avoid an overflow situation. - */ -{ - register int k, i; - - word temp, smax, scalauto; - -#ifdef USE_FLOAT_MUL - float float_s[160]; -#endif - - /* Dynamic scaling of the array s[0..159] - */ - - /* Search for the maximum. - */ - smax = 0; - for (k = 0; k <= 159; k++) { - temp = GSM_ABS( s[k] ); - if (temp > smax) smax = temp; - } - - /* Computation of the scaling factor. - */ - if (smax == 0) scalauto = 0; - else { - assert(smax > 0); - scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */ - } - - /* Scaling of the array s[0...159] - */ - - if (scalauto > 0) { - -# ifdef USE_FLOAT_MUL -# define SCALE(n) \ - case n: for (k = 0; k <= 159; k++) \ - float_s[k] = (float) \ - (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\ - break; -# else -# define SCALE(n) \ - case n: for (k = 0; k <= 159; k++) \ - s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\ - break; -# endif /* USE_FLOAT_MUL */ - - switch (scalauto) { - SCALE(1) - SCALE(2) - SCALE(3) - SCALE(4) - } -# undef SCALE - } -# ifdef USE_FLOAT_MUL - else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k]; -# endif - - /* Compute the L_ACF[..]. - */ - { -# ifdef USE_FLOAT_MUL - register float * sp = float_s; - register float sl = *sp; - -# define STEP(k) L_ACF[k] += (longword)(sl * sp[ -(k) ]); -# else - word * sp = s; - word sl = *sp; - -# define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]); -# endif - -# define NEXTI sl = *++sp - - - for (k = 9; k--; L_ACF[k] = 0) ; - - STEP (0); - NEXTI; - STEP(0); STEP(1); - NEXTI; - STEP(0); STEP(1); STEP(2); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); - NEXTI; - STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7); - - for (i = 8; i <= 159; i++) { - - NEXTI; - - STEP(0); - STEP(1); STEP(2); STEP(3); STEP(4); - STEP(5); STEP(6); STEP(7); STEP(8); - } - - for (k = 9; k--; L_ACF[k] <<= 1) ; - - } - /* Rescaling of the array s[0..159] - */ - if (scalauto > 0) { - assert(scalauto <= 4); - for (k = 160; k--; *s++ <<= scalauto) ; - } -} - -#if defined(USE_FLOAT_MUL) && defined(FAST) - -static void Fast_Autocorrelation P2((s, L_ACF), - word * s, /* [0..159] IN/OUT */ - longword * L_ACF) /* [0..8] OUT */ -{ - register int k, i; - float f_L_ACF[9]; - float scale; - - float s_f[160]; - register float *sf = s_f; - - for (i = 0; i < 160; ++i) sf[i] = s[i]; - for (k = 0; k <= 8; k++) { - register float L_temp2 = 0; - register float *sfl = sf - k; - for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i]; - f_L_ACF[k] = L_temp2; - } - scale = MAX_LONGWORD / f_L_ACF[0]; - - for (k = 0; k <= 8; k++) { - L_ACF[k] = f_L_ACF[k] * scale; - } -} -#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */ - -/* 4.2.5 */ - -static void Reflection_coefficients P2( (L_ACF, r), - longword * L_ACF, /* 0...8 IN */ - register word * r /* 0...7 OUT */ -) -{ - register int i, m, n; - register word temp; - register longword ltmp; - word ACF[9]; /* 0..8 */ - word P[ 9]; /* 0..8 */ - word K[ 9]; /* 2..8 */ - - /* Schur recursion with 16 bits arithmetic. - */ - - if (L_ACF[0] == 0) { - for (i = 8; i--; *r++ = 0) ; - return; - } - - assert( L_ACF[0] != 0 ); - temp = gsm_norm( L_ACF[0] ); - - assert(temp >= 0 && temp < 32); - - /* ? overflow ? */ - for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 ); - - /* Initialize array P[..] and K[..] for the recursion. - */ - - for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ]; - for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ]; - - /* Compute reflection coefficients - */ - for (n = 1; n <= 8; n++, r++) { - - temp = P[1]; - temp = GSM_ABS(temp); - if (P[0] < temp) { - for (i = n; i <= 8; i++) *r++ = 0; - return; - } - - *r = gsm_div( temp, P[0] ); - - assert(*r >= 0); - if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */ - assert (*r != MIN_WORD); - if (n == 8) return; - - /* Schur recursion - */ - temp = GSM_MULT_R( P[1], *r ); - P[0] = GSM_ADD( P[0], temp ); - - for (m = 1; m <= 8 - n; m++) { - temp = GSM_MULT_R( K[ m ], *r ); - P[m] = GSM_ADD( P[ m+1 ], temp ); - - temp = GSM_MULT_R( P[ m+1 ], *r ); - K[m] = GSM_ADD( K[ m ], temp ); - } - } -} - -/* 4.2.6 */ - -static void Transformation_to_Log_Area_Ratios P1((r), - register word * r /* 0..7 IN/OUT */ -) -/* - * The following scaling for r[..] and LAR[..] has been used: - * - * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1. - * LAR[..] = integer( real_LAR[..] * 16384 ); - * with -1.625 <= real_LAR <= 1.625 - */ -{ - register word temp; - register int i; - - - /* Computation of the LAR[0..7] from the r[0..7] - */ - for (i = 1; i <= 8; i++, r++) { - - temp = *r; - temp = GSM_ABS(temp); - assert(temp >= 0); - - if (temp < 22118) { - temp >>= 1; - } else if (temp < 31130) { - assert( temp >= 11059 ); - temp -= 11059; - } else { - assert( temp >= 26112 ); - temp -= 26112; - temp <<= 2; - } - - *r = *r < 0 ? -temp : temp; - assert( *r != MIN_WORD ); - } -} - -/* 4.2.7 */ - -static void Quantization_and_coding P1((LAR), - register word * LAR /* [0..7] IN/OUT */ -) -{ - register word temp; - longword ltmp; - - - /* This procedure needs four tables; the following equations - * give the optimum scaling for the constants: - * - * A[0..7] = integer( real_A[0..7] * 1024 ) - * B[0..7] = integer( real_B[0..7] * 512 ) - * MAC[0..7] = maximum of the LARc[0..7] - * MIC[0..7] = minimum of the LARc[0..7] - */ - -# undef STEP -# define STEP( A, B, MAC, MIC ) \ - temp = GSM_MULT( A, *LAR ); \ - temp = GSM_ADD( temp, B ); \ - temp = GSM_ADD( temp, 256 ); \ - temp = SASR( temp, 9 ); \ - *LAR = temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \ - LAR++; - - STEP( 20480, 0, 31, -32 ); - STEP( 20480, 0, 31, -32 ); - STEP( 20480, 2048, 15, -16 ); - STEP( 20480, -2560, 15, -16 ); - - STEP( 13964, 94, 7, -8 ); - STEP( 15360, -1792, 7, -8 ); - STEP( 8534, -341, 3, -4 ); - STEP( 9036, -1144, 3, -4 ); - -# undef STEP -} - -void Gsm_LPC_Analysis P3((S, s,LARc), - struct gsm_state *S, - word * s, /* 0..159 signals IN/OUT */ - word * LARc) /* 0..7 LARc's OUT */ -{ - longword L_ACF[9]; - -#if defined(USE_FLOAT_MUL) && defined(FAST) - if (S->fast) Fast_Autocorrelation (s, L_ACF ); - else -#endif - Autocorrelation (s, L_ACF ); - Reflection_coefficients (L_ACF, LARc ); - Transformation_to_Log_Area_Ratios (LARc); - Quantization_and_coding (LARc); -} diff --git a/gr-vocoder/lib/gsm/preprocess.c b/gr-vocoder/lib/gsm/preprocess.c deleted file mode 100644 index abc47c72b3..0000000000 --- a/gr-vocoder/lib/gsm/preprocess.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION - * - * After A-law to linear conversion (or directly from the - * Ato D converter) the following scaling is assumed for - * input to the RPE-LTP algorithm: - * - * in: 0.1.....................12 - * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* - * - * Where S is the sign bit, v a valid bit, and * a "don't care" bit. - * The original signal is called sop[..] - * - * out: 0.1................... 12 - * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 - */ - - -void Gsm_Preprocess P3((S, s, so), - struct gsm_state * S, - word * s, - word * so ) /* [0..159] IN/OUT */ -{ - - word z1 = S->z1; - longword L_z2 = S->L_z2; - word mp = S->mp; - - word s1; - longword L_s2; - - longword L_temp; - - word msp, lsp; - word SO; - - longword ltmp; /* for ADD */ - ulongword utmp; /* for L_ADD */ - - register int k = 160; - - while (k--) { - - /* 4.2.1 Downscaling of the input signal - */ - SO = SASR( *s, 3 ) << 2; - s++; - - assert (SO >= -0x4000); /* downscaled by */ - assert (SO <= 0x3FFC); /* previous routine. */ - - - /* 4.2.2 Offset compensation - * - * This part implements a high-pass filter and requires extended - * arithmetic precision for the recursive part of this filter. - * The input of this procedure is the array so[0...159] and the - * output the array sof[ 0...159 ]. - */ - /* Compute the non-recursive part - */ - - s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */ - z1 = SO; - - assert(s1 != MIN_WORD); - - /* Compute the recursive part - */ - L_s2 = s1; - L_s2 <<= 15; - - /* Execution of a 31 bv 16 bits multiplication - */ - - msp = SASR( L_z2, 15 ); - lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */ - - L_s2 += GSM_MULT_R( lsp, 32735 ); - L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ - L_z2 = GSM_L_ADD( (ulongword)L_temp, (ulongword)L_s2 ); - - /* Compute sof[k] with rounding - */ - L_temp = GSM_L_ADD( (ulongword)L_z2, 16384 ); - - /* 4.2.3 Preemphasis - */ - - msp = GSM_MULT_R( mp, -28180 ); - mp = SASR( L_temp, 15 ); - *so++ = GSM_ADD( mp, msp ); - } - - S->z1 = z1; - S->L_z2 = L_z2; - S->mp = mp; -} diff --git a/gr-vocoder/lib/gsm/private.h b/gr-vocoder/lib/gsm/private.h deleted file mode 100644 index ca42cd537f..0000000000 --- a/gr-vocoder/lib/gsm/private.h +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef PRIVATE_H -#define PRIVATE_H - -typedef short word; /* 16 bit signed int */ -typedef long longword; /* 32 bit signed int */ - -typedef unsigned short uword; /* unsigned word */ -typedef unsigned long ulongword; /* unsigned longword */ - -struct gsm_state { - - word dp0[ 280 ]; - - word z1; /* preprocessing.c, Offset_com. */ - longword L_z2; /* Offset_com. */ - int mp; /* Preemphasis */ - - word u[8]; /* short_term_aly_filter.c */ - word LARpp[2][8]; /* */ - word j; /* */ - - word ltp_cut; /* long_term.c, LTP crosscorr. */ - word nrp; /* 40 */ /* long_term.c, synthesis */ - word v[9]; /* short_term.c, synthesis */ - word msr; /* decoder.c, Postprocessing */ - - char verbose; /* only used if !NDEBUG */ - char fast; /* only used if FAST */ - - char wav_fmt; /* only used if WAV49 defined */ - unsigned char frame_index; /* odd/even chaining */ - unsigned char frame_chain; /* half-byte to carry forward */ -}; - - -#define MIN_WORD (-32767 - 1) -#define MAX_WORD 32767 - -#define MIN_LONGWORD (-2147483647 - 1) -#define MAX_LONGWORD 2147483647 - -#ifdef SASR /* flag: >> is a signed arithmetic shift right */ -#undef SASR -#define SASR(x, by) ((x) >> (by)) -#else -#define SASR(x, by) ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by)))) -#endif /* SASR */ - -#include "proto.h" - -/* - * Prototypes from add.c - */ -extern word gsm_mult P((word a, word b)); -extern longword gsm_L_mult P((word a, word b)); -extern word gsm_mult_r P((word a, word b)); - -extern word gsm_div P((word num, word denum)); - -extern word gsm_add P(( word a, word b )); -extern longword gsm_L_add P(( longword a, longword b )); - -extern word gsm_sub P((word a, word b)); -extern longword gsm_L_sub P((longword a, longword b)); - -extern word gsm_abs P((word a)); - -extern word gsm_norm P(( longword a )); - -extern longword gsm_L_asl P((longword a, int n)); -extern word gsm_asl P((word a, int n)); - -extern longword gsm_L_asr P((longword a, int n)); -extern word gsm_asr P((word a, int n)); - -/* - * Inlined functions from add.h - */ - -/* - * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *) \ - * (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15)) - */ -#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ - (SASR( ((longword)(a) * (longword)(b) + 16384), 15 )) - -# define GSM_MULT(a,b) /* word a, word b, !(a == b == MIN_WORD) */ \ - (SASR( ((longword)(a) * (longword)(b)), 15 )) - -# define GSM_L_MULT(a, b) /* word a, word b */ \ - (((longword)(a) * (longword)(b)) << 1) - -# define GSM_L_ADD(a, b) \ - ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \ - : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \ - >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \ - : ((b) <= 0 ? (a) + (b) \ - : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \ - ? MAX_LONGWORD : utmp)) - -/* - * # define GSM_ADD(a, b) \ - * ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \ - * ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) - */ -/* Nonportable, but faster: */ - -#define GSM_ADD(a, b) \ - ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \ - MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp) - -# define GSM_SUB(a, b) \ - ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \ - ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) - -# define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) - -/* Use these if necessary: - -# define GSM_MULT_R(a, b) gsm_mult_r(a, b) -# define GSM_MULT(a, b) gsm_mult(a, b) -# define GSM_L_MULT(a, b) gsm_L_mult(a, b) - -# define GSM_L_ADD(a, b) gsm_L_add(a, b) -# define GSM_ADD(a, b) gsm_add(a, b) -# define GSM_SUB(a, b) gsm_sub(a, b) - -# define GSM_ABS(a) gsm_abs(a) - -*/ - -/* - * More prototypes from implementations.. - */ -extern void Gsm_Coder P(( - struct gsm_state * S, - word * s, /* [0..159] samples IN */ - word * LARc, /* [0..7] LAR coefficients OUT */ - word * Nc, /* [0..3] LTP lag OUT */ - word * bc, /* [0..3] coded LTP gain OUT */ - word * Mc, /* [0..3] RPE grid selection OUT */ - word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ - word * xMc /* [13*4] normalized RPE samples OUT */)); - -extern void Gsm_Long_Term_Predictor P(( /* 4x for 160 samples */ - struct gsm_state * S, - word * d, /* [0..39] residual signal IN */ - word * dp, /* [-120..-1] d' IN */ - word * e, /* [0..40] OUT */ - word * dpp, /* [0..40] OUT */ - word * Nc, /* correlation lag OUT */ - word * bc /* gain factor OUT */)); - -extern void Gsm_LPC_Analysis P(( - struct gsm_state * S, - word * s, /* 0..159 signals IN/OUT */ - word * LARc)); /* 0..7 LARc's OUT */ - -extern void Gsm_Preprocess P(( - struct gsm_state * S, - word * s, word * so)); - -extern void Gsm_Encoding P(( - struct gsm_state * S, - word * e, - word * ep, - word * xmaxc, - word * Mc, - word * xMc)); - -extern void Gsm_Short_Term_Analysis_Filter P(( - struct gsm_state * S, - word * LARc, /* coded log area ratio [0..7] IN */ - word * d /* st res. signal [0..159] IN/OUT */)); - -extern void Gsm_Decoder P(( - struct gsm_state * S, - word * LARcr, /* [0..7] IN */ - word * Ncr, /* [0..3] IN */ - word * bcr, /* [0..3] IN */ - word * Mcr, /* [0..3] IN */ - word * xmaxcr, /* [0..3] IN */ - word * xMcr, /* [0..13*4] IN */ - word * s)); /* [0..159] OUT */ - -extern void Gsm_Decoding P(( - struct gsm_state * S, - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12] IN */ - word * erp)); /* [0..39] OUT */ - -extern void Gsm_Long_Term_Synthesis_Filtering P(( - struct gsm_state* S, - word Ncr, - word bcr, - word * erp, /* [0..39] IN */ - word * drp)); /* [-120..-1] IN, [0..40] OUT */ - -void Gsm_RPE_Decoding P(( - struct gsm_state *S, - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12], 3 bits IN */ - word * erp)); /* [0..39] OUT */ - -void Gsm_RPE_Encoding P(( - struct gsm_state * S, - word * e, /* -5..-1][0..39][40..44 IN/OUT */ - word * xmaxc, /* OUT */ - word * Mc, /* OUT */ - word * xMc)); /* [0..12] OUT */ - -extern void Gsm_Short_Term_Synthesis_Filter P(( - struct gsm_state * S, - word * LARcr, /* log area ratios [0..7] IN */ - word * drp, /* received d [0...39] IN */ - word * s)); /* signal s [0..159] OUT */ - -extern void Gsm_Update_of_reconstructed_short_time_residual_signal P(( - word * dpp, /* [0...39] IN */ - word * ep, /* [0...39] IN */ - word * dp)); /* [-120...-1] IN/OUT */ - -/* - * Tables from table.c - */ -#ifndef GSM_TABLE_C - -extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8]; -extern word gsm_INVA[8]; -extern word gsm_DLB[4], gsm_QLB[4]; -extern word gsm_H[11]; -extern word gsm_NRFAC[8]; -extern word gsm_FAC[8]; - -#endif /* GSM_TABLE_C */ - -/* - * Debugging - */ -#ifdef NDEBUG - -# define gsm_debug_words(a, b, c, d) /* nil */ -# define gsm_debug_longwords(a, b, c, d) /* nil */ -# define gsm_debug_word(a, b) /* nil */ -# define gsm_debug_longword(a, b) /* nil */ - -#else /* !NDEBUG => DEBUG */ - - extern void gsm_debug_words P((char * name, int, int, word *)); - extern void gsm_debug_longwords P((char * name, int, int, longword *)); - extern void gsm_debug_longword P((char * name, longword)); - extern void gsm_debug_word P((char * name, word)); - -#endif /* !NDEBUG */ - -#include "unproto.h" - -#endif /* PRIVATE_H */ diff --git a/gr-vocoder/lib/gsm/proto.h b/gr-vocoder/lib/gsm/proto.h deleted file mode 100644 index ea60abfe7a..0000000000 --- a/gr-vocoder/lib/gsm/proto.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifndef PROTO_H -#define PROTO_H - -#if __cplusplus -# define NeedFunctionPrototypes 1 -#endif - -#if __STDC__ -# define NeedFunctionPrototypes 1 -#endif - -#ifdef _NO_PROTO -# undef NeedFunctionPrototypes -#endif - -#undef P /* gnu stdio.h actually defines this... */ -#undef P0 -#undef P1 -#undef P2 -#undef P3 -#undef P4 -#undef P5 -#undef P6 -#undef P7 -#undef P8 - -#if NeedFunctionPrototypes - -# define P( protos ) protos - -# define P0() (void) -# define P1(x, a) (a) -# define P2(x, a, b) (a, b) -# define P3(x, a, b, c) (a, b, c) -# define P4(x, a, b, c, d) (a, b, c, d) -# define P5(x, a, b, c, d, e) (a, b, c, d, e) -# define P6(x, a, b, c, d, e, f) (a, b, c, d, e, f) -# define P7(x, a, b, c, d, e, f, g) (a, b, c, d, e, f, g) -# define P8(x, a, b, c, d, e, f, g, h) (a, b, c, d, e, f, g, h) - -#else /* !NeedFunctionPrototypes */ - -# define P( protos ) ( /* protos */ ) - -# define P0() () -# define P1(x, a) x a; -# define P2(x, a, b) x a; b; -# define P3(x, a, b, c) x a; b; c; -# define P4(x, a, b, c, d) x a; b; c; d; -# define P5(x, a, b, c, d, e) x a; b; c; d; e; -# define P6(x, a, b, c, d, e, f) x a; b; c; d; e; f; -# define P7(x, a, b, c, d, e, f, g) x a; b; c; d; e; f; g; -# define P8(x, a, b, c, d, e, f, g, h) x a; b; c; d; e; f; g; h; - -#endif /* !NeedFunctionPrototypes */ - -#endif /* PROTO_H */ diff --git a/gr-vocoder/lib/gsm/rpe.c b/gr-vocoder/lib/gsm/rpe.c deleted file mode 100644 index bdc78910e2..0000000000 --- a/gr-vocoder/lib/gsm/rpe.c +++ /dev/null @@ -1,488 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION - */ - -/* 4.2.13 */ - -static void Weighting_filter P2((e, x), - register word * e, /* signal [-5..0.39.44] IN */ - word * x /* signal [0..39] OUT */ -) -/* - * The coefficients of the weighting filter are stored in a table - * (see table 4.4). The following scaling is used: - * - * H[0..10] = integer( real_H[ 0..10] * 8192 ); - */ -{ - /* word wt[ 50 ]; */ - - register longword L_result; - register int k /* , i */ ; - - /* Initialization of a temporary working array wt[0...49] - */ - - /* for (k = 0; k <= 4; k++) wt[k] = 0; - * for (k = 5; k <= 44; k++) wt[k] = *e++; - * for (k = 45; k <= 49; k++) wt[k] = 0; - * - * (e[-5..-1] and e[40..44] are allocated by the caller, - * are initially zero and are not written anywhere.) - */ - e -= 5; - - /* Compute the signal x[0..39] - */ - for (k = 0; k <= 39; k++) { - - L_result = 8192 >> 1; - - /* for (i = 0; i <= 10; i++) { - * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] ); - * L_result = GSM_L_ADD( L_result, L_temp ); - * } - */ - -#undef STEP -#define STEP( i, H ) (e[ k + i ] * (longword)H) - - /* Every one of these multiplications is done twice -- - * but I don't see an elegant way to optimize this. - * Do you? - */ - -#ifdef STUPID_COMPILER - L_result += STEP( 0, -134 ) ; - L_result += STEP( 1, -374 ) ; - /* + STEP( 2, 0 ) */ - L_result += STEP( 3, 2054 ) ; - L_result += STEP( 4, 5741 ) ; - L_result += STEP( 5, 8192 ) ; - L_result += STEP( 6, 5741 ) ; - L_result += STEP( 7, 2054 ) ; - /* + STEP( 8, 0 ) */ - L_result += STEP( 9, -374 ) ; - L_result += STEP( 10, -134 ) ; -#else - L_result += - STEP( 0, -134 ) - + STEP( 1, -374 ) - /* + STEP( 2, 0 ) */ - + STEP( 3, 2054 ) - + STEP( 4, 5741 ) - + STEP( 5, 8192 ) - + STEP( 6, 5741 ) - + STEP( 7, 2054 ) - /* + STEP( 8, 0 ) */ - + STEP( 9, -374 ) - + STEP(10, -134 ) - ; -#endif - - /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) - * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) - * - * x[k] = SASR( L_result, 16 ); - */ - - /* 2 adds vs. >>16 => 14, minus one shift to compensate for - * those we lost when replacing L_MULT by '*'. - */ - - L_result = SASR( L_result, 13 ); - x[k] = ( L_result < MIN_WORD ? MIN_WORD - : (L_result > MAX_WORD ? MAX_WORD : L_result )); - } -} - -/* 4.2.14 */ - -static void RPE_grid_selection P3((x,xM,Mc_out), - word * x, /* [0..39] IN */ - word * xM, /* [0..12] OUT */ - word * Mc_out /* OUT */ -) -/* - * The signal x[0..39] is used to select the RPE grid which is - * represented by Mc. - */ -{ - /* register word temp1; */ - register int /* m, */ i; - register longword L_result, L_temp; - longword EM; /* xxx should be L_EM? */ - word Mc; - - longword L_common_0_3; - - EM = 0; - Mc = 0; - - /* for (m = 0; m <= 3; m++) { - * L_result = 0; - * - * - * for (i = 0; i <= 12; i++) { - * - * temp1 = SASR( x[m + 3*i], 2 ); - * - * assert(temp1 != MIN_WORD); - * - * L_temp = GSM_L_MULT( temp1, temp1 ); - * L_result = GSM_L_ADD( L_temp, L_result ); - * } - * - * if (L_result > EM) { - * Mc = m; - * EM = L_result; - * } - * } - */ - -#undef STEP -#define STEP( m, i ) L_temp = SASR( x[m + 3 * i], 2 ); \ - L_result += L_temp * L_temp; - - /* common part of 0 and 3 */ - - L_result = 0; - STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 ); - STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 ); - STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12); - L_common_0_3 = L_result; - - /* i = 0 */ - - STEP( 0, 0 ); - L_result <<= 1; /* implicit in L_MULT */ - EM = L_result; - - /* i = 1 */ - - L_result = 0; - STEP( 1, 0 ); - STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 ); - STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 ); - STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12); - L_result <<= 1; - if (L_result > EM) { - Mc = 1; - EM = L_result; - } - - /* i = 2 */ - - L_result = 0; - STEP( 2, 0 ); - STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 ); - STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 ); - STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12); - L_result <<= 1; - if (L_result > EM) { - Mc = 2; - EM = L_result; - } - - /* i = 3 */ - - L_result = L_common_0_3; - STEP( 3, 12 ); - L_result <<= 1; - if (L_result > EM) { - Mc = 3; - EM = L_result; - } - - /**/ - - /* Down-sampling by a factor 3 to get the selected xM[0..12] - * RPE sequence. - */ - for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i]; - *Mc_out = Mc; -} - -/* 4.12.15 */ - -static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out), - word xmaxc, /* IN */ - word * exp_out, /* OUT */ - word * mant_out ) /* OUT */ -{ - word exp, mant; - - /* Compute exponent and mantissa of the decoded version of xmaxc - */ - - exp = 0; - if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1; - mant = xmaxc - (exp << 3); - - if (mant == 0) { - exp = -4; - mant = 7; - } - else { - while (mant <= 7) { - mant = mant << 1 | 1; - exp--; - } - mant -= 8; - } - - assert( exp >= -4 && exp <= 6 ); - assert( mant >= 0 && mant <= 7 ); - - *exp_out = exp; - *mant_out = mant; -} - -static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out), - word * xM, /* [0..12] IN */ - - word * xMc, /* [0..12] OUT */ - word * mant_out, /* OUT */ - word * exp_out, /* OUT */ - word * xmaxc_out /* OUT */ -) -{ - int i, itest; - - word xmax, xmaxc, temp, temp1, temp2; - word exp, mant; - - - /* Find the maximum absolute value xmax of xM[0..12]. - */ - - xmax = 0; - for (i = 0; i <= 12; i++) { - temp = xM[i]; - temp = GSM_ABS(temp); - if (temp > xmax) xmax = temp; - } - - /* Qantizing and coding of xmax to get xmaxc. - */ - - exp = 0; - temp = SASR( xmax, 9 ); - itest = 0; - - for (i = 0; i <= 5; i++) { - - itest |= (temp <= 0); - temp = SASR( temp, 1 ); - - assert(exp <= 5); - if (itest == 0) exp++; /* exp = add (exp, 1) */ - } - - assert(exp <= 6 && exp >= 0); - temp = exp + 5; - - assert(temp <= 11 && temp >= 0); - xmaxc = gsm_add( SASR(xmax, temp), exp << 3 ); - - /* Quantizing and coding of the xM[0..12] RPE sequence - * to get the xMc[0..12] - */ - - APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant ); - - /* This computation uses the fact that the decoded version of xmaxc - * can be calculated by using the exponent and the mantissa part of - * xmaxc (logarithmic table). - * So, this method avoids any division and uses only a scaling - * of the RPE samples by a function of the exponent. A direct - * multiplication by the inverse of the mantissa (NRFAC[0..7] - * found in table 4.5) gives the 3 bit coded version xMc[0..12] - * of the RPE samples. - */ - - - /* Direct computation of xMc[0..12] using table 4.5 - */ - - assert( exp <= 4096 && exp >= -4096); - assert( mant >= 0 && mant <= 7 ); - - temp1 = 6 - exp; /* normalization by the exponent */ - temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */ - - for (i = 0; i <= 12; i++) { - - assert(temp1 >= 0 && temp1 < 16); - - temp = xM[i] << temp1; - temp = GSM_MULT( temp, temp2 ); - temp = SASR(temp, 12); - xMc[i] = temp + 4; /* see note below */ - } - - /* NOTE: This equation is used to make all the xMc[i] positive. - */ - - *mant_out = mant; - *exp_out = exp; - *xmaxc_out = xmaxc; -} - -/* 4.2.16 */ - -static void APCM_inverse_quantization P4((xMc,mant,exp,xMp), - register word * xMc, /* [0..12] IN */ - word mant, - word exp, - register word * xMp) /* [0..12] OUT */ -/* - * This part is for decoding the RPE sequence of coded xMc[0..12] - * samples to obtain the xMp[0..12] array. Table 4.6 is used to get - * the mantissa of xmaxc (FAC[0..7]). - */ -{ - int i; - word temp, temp1, temp2, temp3; - longword ltmp; - - assert( mant >= 0 && mant <= 7 ); - - temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */ - temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */ - temp3 = gsm_asl( 1, gsm_sub( temp2, 1 )); - - for (i = 13; i--;) { - - assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */ - - /* temp = gsm_sub( *xMc++ << 1, 7 ); */ - temp = (*xMc++ << 1) - 7; /* restore sign */ - assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */ - - temp <<= 12; /* 16 bit signed */ - temp = GSM_MULT_R( temp1, temp ); - temp = GSM_ADD( temp, temp3 ); - *xMp++ = gsm_asr( temp, temp2 ); - } -} - -/* 4.2.17 */ - -static void RPE_grid_positioning P3((Mc,xMp,ep), - word Mc, /* grid position IN */ - register word * xMp, /* [0..12] IN */ - register word * ep /* [0..39] OUT */ -) -/* - * This procedure computes the reconstructed long term residual signal - * ep[0..39] for the LTP analysis filter. The inputs are the Mc - * which is the grid position selection and the xMp[0..12] decoded - * RPE samples which are upsampled by a factor of 3 by inserting zero - * values. - */ -{ - int i = 13; - - assert(0 <= Mc && Mc <= 3); - - switch (Mc) { - case 3: *ep++ = 0; - case 2: do { - *ep++ = 0; - case 1: *ep++ = 0; - case 0: *ep++ = *xMp++; - } while (--i); - } - while (++Mc < 4) *ep++ = 0; - - /* - - int i, k; - for (k = 0; k <= 39; k++) ep[k] = 0; - for (i = 0; i <= 12; i++) { - ep[ Mc + (3*i) ] = xMp[i]; - } - */ -} - -/* 4.2.18 */ - -/* This procedure adds the reconstructed long term residual signal - * ep[0..39] to the estimated signal dpp[0..39] from the long term - * analysis filter to compute the reconstructed short term residual - * signal dp[-40..-1]; also the reconstructed short term residual - * array dp[-120..-41] is updated. - */ - -#if 0 /* Has been inlined in code.c */ -void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp), - word * dpp, /* [0...39] IN */ - word * ep, /* [0...39] IN */ - word * dp) /* [-120...-1] IN/OUT */ -{ - int k; - - for (k = 0; k <= 79; k++) - dp[ -120 + k ] = dp[ -80 + k ]; - - for (k = 0; k <= 39; k++) - dp[ -40 + k ] = gsm_add( ep[k], dpp[k] ); -} -#endif /* Has been inlined in code.c */ - -void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc), - - struct gsm_state * S, - - word * e, /* -5..-1][0..39][40..44 IN/OUT */ - word * xmaxc, /* OUT */ - word * Mc, /* OUT */ - word * xMc) /* [0..12] OUT */ -{ - word x[40]; - word xM[13], xMp[13]; - word mant, exp; - - Weighting_filter(e, x); - RPE_grid_selection(x, xM, Mc); - - APCM_quantization( xM, xMc, &mant, &exp, xmaxc); - APCM_inverse_quantization( xMc, mant, exp, xMp); - - RPE_grid_positioning( *Mc, xMp, e ); - -} - -void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp), - struct gsm_state * S, - - word xmaxcr, - word Mcr, - word * xMcr, /* [0..12], 3 bits IN */ - word * erp /* [0..39] OUT */ -) -{ - word exp, mant; - word xMp[ 13 ]; - - APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant ); - APCM_inverse_quantization( xMcr, mant, exp, xMp ); - RPE_grid_positioning( Mcr, xMp, erp ); - -} diff --git a/gr-vocoder/lib/gsm/short_term.c b/gr-vocoder/lib/gsm/short_term.c deleted file mode 100644 index 68aabe5bbb..0000000000 --- a/gr-vocoder/lib/gsm/short_term.c +++ /dev/null @@ -1,429 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -#include <stdio.h> -#include <assert.h> - -#include "private.h" - -#include "gsm.h" -#include "proto.h" - -/* - * SHORT TERM ANALYSIS FILTERING SECTION - */ - -/* 4.2.8 */ - -static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp), - word * LARc, /* coded log area ratio [0..7] IN */ - word * LARpp) /* out: decoded .. */ -{ - register word temp1 /* , temp2 */; - register long ltmp; /* for GSM_ADD */ - - /* This procedure requires for efficient implementation - * two tables. - * - * INVA[1..8] = integer( (32768 * 8) / real_A[1..8]) - * MIC[1..8] = minimum value of the LARc[1..8] - */ - - /* Compute the LARpp[1..8] - */ - - /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) { - * - * temp1 = GSM_ADD( *LARc, *MIC ) << 10; - * temp2 = *B << 1; - * temp1 = GSM_SUB( temp1, temp2 ); - * - * assert(*INVA != MIN_WORD); - * - * temp1 = GSM_MULT_R( *INVA, temp1 ); - * *LARpp = GSM_ADD( temp1, temp1 ); - * } - */ - -#undef STEP -#define STEP( B, MIC, INVA ) \ - temp1 = GSM_ADD( *LARc++, MIC ) << 10; \ - temp1 = GSM_SUB( temp1, B << 1 ); \ - temp1 = GSM_MULT_R( INVA, temp1 ); \ - *LARpp++ = GSM_ADD( temp1, temp1 ); - - STEP( 0, -32, 13107 ); - STEP( 0, -32, 13107 ); - STEP( 2048, -16, 13107 ); - STEP( -2560, -16, 13107 ); - - STEP( 94, -8, 19223 ); - STEP( -1792, -8, 17476 ); - STEP( -341, -4, 31454 ); - STEP( -1144, -4, 29708 ); - - /* NOTE: the addition of *MIC is used to restore - * the sign of *LARc. - */ -} - -/* 4.2.9 */ -/* Computation of the quantized reflection coefficients - */ - -/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] - */ - -/* - * Within each frame of 160 analyzed speech samples the short term - * analysis and synthesis filters operate with four different sets of - * coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) - * and the actual set of decoded LARs (LARpp(j)) - * - * (Initial value: LARpp(j-1)[1..8] = 0.) - */ - -static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp), - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1)); - } -} - -static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp), - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - register longword ltmp; - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 )); - } -} - -static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp), - register word * LARpp_j_1, - register word * LARpp_j, - register word * LARp) -{ - register int i; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { - *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); - *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 )); - } -} - - -static void Coefficients_40_159 P2((LARpp_j, LARp), - register word * LARpp_j, - register word * LARp) -{ - register int i; - - for (i = 1; i <= 8; i++, LARp++, LARpp_j++) - *LARp = *LARpp_j; -} - -/* 4.2.9.2 */ - -static void LARp_to_rp P1((LARp), - register word * LARp) /* [0..7] IN/OUT */ -/* - * The input of this procedure is the interpolated LARp[0..7] array. - * The reflection coefficients, rp[i], are used in the analysis - * filter and in the synthesis filter. - */ -{ - register int i; - register word temp; - register longword ltmp; - - for (i = 1; i <= 8; i++, LARp++) { - - /* temp = GSM_ABS( *LARp ); - * - * if (temp < 11059) temp <<= 1; - * else if (temp < 20070) temp += 11059; - * else temp = GSM_ADD( temp >> 2, 26112 ); - * - * *LARp = *LARp < 0 ? -temp : temp; - */ - - if (*LARp < 0) { - temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); - *LARp = - ((temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( temp >> 2, 26112 ))); - } else { - temp = *LARp; - *LARp = (temp < 11059) ? temp << 1 - : ((temp < 20070) ? temp + 11059 - : GSM_ADD( temp >> 2, 26112 )); - } - } -} - - -/* 4.2.10 */ -static void Short_term_analysis_filtering P4((S,rp,k_n,s), - struct gsm_state * S, - register word * rp, /* [0..7] IN */ - register int k_n, /* k_end - k_start */ - register word * s /* [0..n-1] IN/OUT */ -) -/* - * This procedure computes the short term residual signal d[..] to be fed - * to the RPE-LTP loop from the s[..] signal and from the local rp[..] - * array (quantized reflection coefficients). As the call of this - * procedure can be done in many ways (see the interpolation of the LAR - * coefficient), it is assumed that the computation begins with index - * k_start (for arrays d[..] and s[..]) and stops with index k_end - * (k_start and k_end are defined in 4.2.9.1). This procedure also - * needs to keep the array u[0..7] in memory for each call. - */ -{ - register word * u = S->u; - register int i; - register word di, zzz, ui, sav, rpi; - register longword ltmp; - - for (; k_n--; s++) { - - di = sav = *s; - - for (i = 0; i < 8; i++) { /* YYY */ - - ui = u[i]; - rpi = rp[i]; - u[i] = sav; - - zzz = GSM_MULT_R(rpi, di); - sav = GSM_ADD( ui, zzz); - - zzz = GSM_MULT_R(rpi, ui); - di = GSM_ADD( di, zzz ); - } - - *s = di; - } -} - -#if defined(USE_FLOAT_MUL) && defined(FAST) - -static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s), - struct gsm_state * S, - register word * rp, /* [0..7] IN */ - register int k_n, /* k_end - k_start */ - register word * s /* [0..n-1] IN/OUT */ -) -{ - register word * u = S->u; - register int i; - - float uf[8], - rpf[8]; - - register float scalef = 3.0517578125e-5; - register float sav, di, temp; - - for (i = 0; i < 8; ++i) { - uf[i] = u[i]; - rpf[i] = rp[i] * scalef; - } - for (; k_n--; s++) { - sav = di = *s; - for (i = 0; i < 8; ++i) { - register float rpfi = rpf[i]; - register float ufi = uf[i]; - - uf[i] = sav; - temp = rpfi * di + ufi; - di += rpfi * ufi; - sav = temp; - } - *s = di; - } - for (i = 0; i < 8; ++i) u[i] = uf[i]; -} -#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */ - -static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr), - struct gsm_state * S, - register word * rrp, /* [0..7] IN */ - register int k, /* k_end - k_start */ - register word * wt, /* [0..k-1] IN */ - register word * sr /* [0..k-1] OUT */ -) -{ - register word * v = S->v; - register int i; - register word sri, tmp1, tmp2; - register longword ltmp; /* for GSM_ADD & GSM_SUB */ - - while (k--) { - sri = *wt++; - for (i = 8; i--;) { - - /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) ); - */ - tmp1 = rrp[i]; - tmp2 = v[i]; - tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2 - + 16384) >> 15)) ; - - sri = GSM_SUB( sri, tmp2 ); - - /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) ); - */ - tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD - ? MAX_WORD - : 0x0FFFF & (( (longword)tmp1 * (longword)sri - + 16384) >> 15)) ; - - v[i+1] = GSM_ADD( v[i], tmp1); - } - *sr++ = v[0] = sri; - } -} - - -#if defined(FAST) && defined(USE_FLOAT_MUL) - -static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr), - struct gsm_state * S, - register word * rrp, /* [0..7] IN */ - register int k, /* k_end - k_start */ - register word * wt, /* [0..k-1] IN */ - register word * sr /* [0..k-1] OUT */ -) -{ - register word * v = S->v; - register int i; - - float va[9], rrpa[8]; - register float scalef = 3.0517578125e-5, temp; - - for (i = 0; i < 8; ++i) { - va[i] = v[i]; - rrpa[i] = (float)rrp[i] * scalef; - } - while (k--) { - register float sri = *wt++; - for (i = 8; i--;) { - sri -= rrpa[i] * va[i]; - if (sri < -32768.) sri = -32768.; - else if (sri > 32767.) sri = 32767.; - - temp = va[i] + rrpa[i] * sri; - if (temp < -32768.) temp = -32768.; - else if (temp > 32767.) temp = 32767.; - va[i+1] = temp; - } - *sr++ = va[0] = sri; - } - for (i = 0; i < 9; ++i) v[i] = va[i]; -} - -#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */ - -void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s), - - struct gsm_state * S, - - word * LARc, /* coded log area ratio [0..7] IN */ - word * s /* signal [0..159] IN/OUT */ -) -{ - word * LARpp_j = S->LARpp[ S->j ]; - word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ]; - - word LARp[8]; - -#undef FILTER -#if defined(FAST) && defined(USE_FLOAT_MUL) -# define FILTER (* (S->fast \ - ? Fast_Short_term_analysis_filtering \ - : Short_term_analysis_filtering )) - -#else -# define FILTER Short_term_analysis_filtering -#endif - - Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j ); - - Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, s); - - Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 14, s + 13); - - Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, s + 27); - - Coefficients_40_159( LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 120, s + 40); -} - -void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s), - struct gsm_state * S, - - word * LARcr, /* received log area ratios [0..7] IN */ - word * wt, /* received d [0..159] IN */ - - word * s /* signal s [0..159] OUT */ -) -{ - word * LARpp_j = S->LARpp[ S->j ]; - word * LARpp_j_1 = S->LARpp[ S->j ^=1 ]; - - word LARp[8]; - -#undef FILTER -#if defined(FAST) && defined(USE_FLOAT_MUL) - -# define FILTER (* (S->fast \ - ? Fast_Short_term_synthesis_filtering \ - : Short_term_synthesis_filtering )) -#else -# define FILTER Short_term_synthesis_filtering -#endif - - Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j ); - - Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt, s ); - - Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 14, wt + 13, s + 13 ); - - Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); - LARp_to_rp( LARp ); - FILTER( S, LARp, 13, wt + 27, s + 27 ); - - Coefficients_40_159( LARpp_j, LARp ); - LARp_to_rp( LARp ); - FILTER(S, LARp, 120, wt + 40, s + 40); -} diff --git a/gr-vocoder/lib/gsm/table.c b/gr-vocoder/lib/gsm/table.c deleted file mode 100644 index d8366931e8..0000000000 --- a/gr-vocoder/lib/gsm/table.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/* $Header$ */ - -/* Most of these tables are inlined at their point of use. - */ - -/* 4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP - * CODER AND DECODER - * - * (Most of them inlined, so watch out.) - */ - -#define GSM_TABLE_C -#include "private.h" -#include "gsm.h" - -/* Table 4.1 Quantization of the Log.-Area Ratios - */ -/* i 1 2 3 4 5 6 7 8 */ -word gsm_A[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036}; -word gsm_B[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144}; -word gsm_MIC[8] = { -32, -32, -16, -16, -8, -8, -4, -4 }; -word gsm_MAC[8] = { 31, 31, 15, 15, 7, 7, 3, 3 }; - - -/* Table 4.2 Tabulation of 1/A[1..8] - */ -word gsm_INVA[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 }; - - -/* Table 4.3a Decision level of the LTP gain quantizer - */ -/* bc 0 1 2 3 */ -word gsm_DLB[4] = { 6554, 16384, 26214, 32767 }; - - -/* Table 4.3b Quantization levels of the LTP gain quantizer - */ -/* bc 0 1 2 3 */ -word gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; - - -/* Table 4.4 Coefficients of the weighting filter - */ -/* i 0 1 2 3 4 5 6 7 8 9 10 */ -word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 }; - - -/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax - */ -/* i 0 1 2 3 4 5 6 7 */ -word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; - - -/* Table 4.6 Normalized direct mantissa used to compute xM/xmax - */ -/* i 0 1 2 3 4 5 6 7 */ -word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; diff --git a/gr-vocoder/lib/gsm/unproto.h b/gr-vocoder/lib/gsm/unproto.h deleted file mode 100644 index ccd565109b..0000000000 --- a/gr-vocoder/lib/gsm/unproto.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische - * Universitaet Berlin. See the accompanying file "COPYRIGHT" for - * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. - */ - -/*$Header$*/ - -#ifdef PROTO_H /* sic */ -#undef PROTO_H - -#undef P -#undef P0 -#undef P1 -#undef P2 -#undef P3 -#undef P4 -#undef P5 -#undef P6 -#undef P7 -#undef P8 - -#endif /* PROTO_H */ diff --git a/gr-vocoder/lib/gsm_fr_decode_ps_impl.cc b/gr-vocoder/lib/gsm_fr_decode_ps_impl.cc index 97fbc1b9b0..4bf85ac9e7 100644 --- a/gr-vocoder/lib/gsm_fr_decode_ps_impl.cc +++ b/gr-vocoder/lib/gsm_fr_decode_ps_impl.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2005,2010,2013 Free Software Foundation, Inc. + * Copyright 2005,2010,2013,2016 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -24,6 +24,7 @@ #include "config.h" #endif +#define GSM_SAMPLES_PER_FRAME 160 #include "gsm_fr_decode_ps_impl.h" #include <gnuradio/io_signature.h> #include <stdexcept> diff --git a/gr-vocoder/lib/gsm_fr_encode_sp_impl.cc b/gr-vocoder/lib/gsm_fr_encode_sp_impl.cc index 0c3afe8f59..9cbd4da679 100644 --- a/gr-vocoder/lib/gsm_fr_encode_sp_impl.cc +++ b/gr-vocoder/lib/gsm_fr_encode_sp_impl.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2005,2010,2013 Free Software Foundation, Inc. + * Copyright 2005,2010,2013,2016 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -24,6 +24,7 @@ #include "config.h" #endif +#define GSM_SAMPLES_PER_FRAME 160 #include "gsm_fr_encode_sp_impl.h" #include <gnuradio/io_signature.h> #include <stdexcept> diff --git a/gr-vocoder/python/vocoder/CMakeLists.txt b/gr-vocoder/python/vocoder/CMakeLists.txt index ca8323daab..d4fe3d9e8c 100644 --- a/gr-vocoder/python/vocoder/CMakeLists.txt +++ b/gr-vocoder/python/vocoder/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011 Free Software Foundation, Inc. +# Copyright 2011,2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -27,7 +27,6 @@ GR_PYTHON_INSTALL( __init__.py cvsd.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/vocoder - COMPONENT "vocoder_python" ) ######################################################################## @@ -42,9 +41,26 @@ if(ENABLE_TESTING) ) include(GrTest) - file(GLOB py_qa_test_files "qa_*.py") + list(APPEND py_qa_test_files + qa_alaw_vocoder.py + qa_cvsd_vocoder.py + qa_g721_vocoder.py + qa_g723_24_vocoder.py + qa_g723_40_vocoder.py + qa_ulaw_vocoder.py + ) + if(LIBCODEC2_FOUND) + list(APPEND py_qa_test_files + qa_codec2_vocoder.py + ) + endif() + if(LIBGSM_FOUND) + list(APPEND py_qa_test_files + qa_gsm_full_rate.py + ) + endif() foreach(py_qa_test_file ${py_qa_test_files}) get_filename_component(py_qa_test_name ${py_qa_test_file} NAME_WE) - GR_ADD_TEST(${py_qa_test_name} ${QA_PYTHON_EXECUTABLE} ${PYTHON_DASH_B} ${py_qa_test_file}) + GR_ADD_TEST(${py_qa_test_name} ${QA_PYTHON_EXECUTABLE} ${PYTHON_DASH_B} ${CMAKE_CURRENT_SOURCE_DIR}/${py_qa_test_file}) endforeach(py_qa_test_file) endif(ENABLE_TESTING) diff --git a/gr-vocoder/swig/CMakeLists.txt b/gr-vocoder/swig/CMakeLists.txt index 26623969a7..8597fb115c 100644 --- a/gr-vocoder/swig/CMakeLists.txt +++ b/gr-vocoder/swig/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2011 Free Software Foundation, Inc. +# Copyright 2011,2016 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -33,6 +33,14 @@ if(ENABLE_GR_CTRLPORT) list(APPEND GR_SWIG_FLAGS "-DGR_CTRLPORT") endif(ENABLE_GR_CTRLPORT) +if(LIBCODEC2_FOUND) + list(APPEND GR_SWIG_FLAGS "-DLIBCODEC2_FOUND") +endif(LIBCODEC2_FOUND) + +if(LIBGSM_FOUND) + list(APPEND GR_SWIG_FLAGS "-DLIBGSM_FOUND") +endif(LIBGSM_FOUND) + set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/vocoder_swig_doc.i) set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../include/gnuradio/vocoder) set(GR_SWIG_DOCS_TARGET_DEPS runtime_swig_swig_doc) @@ -44,7 +52,6 @@ GR_SWIG_MAKE(vocoder_swig vocoder_swig.i) GR_SWIG_INSTALL( TARGETS vocoder_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/vocoder - COMPONENT "vocoder_python" ) install( @@ -52,5 +59,4 @@ install( vocoder_swig.i ${CMAKE_CURRENT_BINARY_DIR}/vocoder_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "vocoder_swig" ) diff --git a/gr-vocoder/swig/vocoder_swig.i b/gr-vocoder/swig/vocoder_swig.i index dac35c9cd4..43d0d1f79b 100644 --- a/gr-vocoder/swig/vocoder_swig.i +++ b/gr-vocoder/swig/vocoder_swig.i @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2011,2013 Free Software Foundation, Inc. + * Copyright 2011,2013,2016 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -30,9 +30,6 @@ %{ #include "gnuradio/vocoder/alaw_decode_bs.h" #include "gnuradio/vocoder/alaw_encode_sb.h" -#include "gnuradio/vocoder/codec2.h" -#include "gnuradio/vocoder/codec2_decode_ps.h" -#include "gnuradio/vocoder/codec2_encode_sp.h" #include "gnuradio/vocoder/cvsd_decode_bs.h" #include "gnuradio/vocoder/cvsd_encode_sb.h" #include "gnuradio/vocoder/g721_decode_bs.h" @@ -41,17 +38,12 @@ #include "gnuradio/vocoder/g723_24_encode_sb.h" #include "gnuradio/vocoder/g723_40_decode_bs.h" #include "gnuradio/vocoder/g723_40_encode_sb.h" -#include "gnuradio/vocoder/gsm_fr_decode_ps.h" -#include "gnuradio/vocoder/gsm_fr_encode_sp.h" #include "gnuradio/vocoder/ulaw_decode_bs.h" #include "gnuradio/vocoder/ulaw_encode_sb.h" %} %include "gnuradio/vocoder/alaw_decode_bs.h" %include "gnuradio/vocoder/alaw_encode_sb.h" -%include "gnuradio/vocoder/codec2.h" -%include "gnuradio/vocoder/codec2_decode_ps.h" -%include "gnuradio/vocoder/codec2_encode_sp.h" %include "gnuradio/vocoder/cvsd_decode_bs.h" %include "gnuradio/vocoder/cvsd_encode_sb.h" %include "gnuradio/vocoder/g721_decode_bs.h" @@ -60,15 +52,11 @@ %include "gnuradio/vocoder/g723_24_encode_sb.h" %include "gnuradio/vocoder/g723_40_decode_bs.h" %include "gnuradio/vocoder/g723_40_encode_sb.h" -%include "gnuradio/vocoder/gsm_fr_decode_ps.h" -%include "gnuradio/vocoder/gsm_fr_encode_sp.h" %include "gnuradio/vocoder/ulaw_decode_bs.h" %include "gnuradio/vocoder/ulaw_encode_sb.h" GR_SWIG_BLOCK_MAGIC2(vocoder, alaw_decode_bs); GR_SWIG_BLOCK_MAGIC2(vocoder, alaw_encode_sb); -GR_SWIG_BLOCK_MAGIC2(vocoder, codec2_decode_ps); -GR_SWIG_BLOCK_MAGIC2(vocoder, codec2_encode_sp); GR_SWIG_BLOCK_MAGIC2(vocoder, cvsd_decode_bs); GR_SWIG_BLOCK_MAGIC2(vocoder, cvsd_encode_sb); GR_SWIG_BLOCK_MAGIC2(vocoder, g721_decode_bs); @@ -77,7 +65,35 @@ GR_SWIG_BLOCK_MAGIC2(vocoder, g723_24_decode_bs); GR_SWIG_BLOCK_MAGIC2(vocoder, g723_24_encode_sb); GR_SWIG_BLOCK_MAGIC2(vocoder, g723_40_decode_bs); GR_SWIG_BLOCK_MAGIC2(vocoder, g723_40_encode_sb); -GR_SWIG_BLOCK_MAGIC2(vocoder, gsm_fr_decode_ps); -GR_SWIG_BLOCK_MAGIC2(vocoder, gsm_fr_encode_sp); GR_SWIG_BLOCK_MAGIC2(vocoder, ulaw_decode_bs); GR_SWIG_BLOCK_MAGIC2(vocoder, ulaw_encode_sb); + +#ifdef LIBCODEC2_FOUND +%{ +#include <codec2/codec2.h> +#include "gnuradio/vocoder/codec2.h" +#include "gnuradio/vocoder/codec2_decode_ps.h" +#include "gnuradio/vocoder/codec2_encode_sp.h" +%} + +%include <codec2/codec2.h> +%include "gnuradio/vocoder/codec2.h" +%include "gnuradio/vocoder/codec2_decode_ps.h" +%include "gnuradio/vocoder/codec2_encode_sp.h" + +GR_SWIG_BLOCK_MAGIC2(vocoder, codec2_decode_ps); +GR_SWIG_BLOCK_MAGIC2(vocoder, codec2_encode_sp); +#endif + +#ifdef LIBGSM_FOUND +%{ +#include "gnuradio/vocoder/gsm_fr_decode_ps.h" +#include "gnuradio/vocoder/gsm_fr_encode_sp.h" +%} + +%include "gnuradio/vocoder/gsm_fr_decode_ps.h" +%include "gnuradio/vocoder/gsm_fr_encode_sp.h" + +GR_SWIG_BLOCK_MAGIC2(vocoder, gsm_fr_decode_ps); +GR_SWIG_BLOCK_MAGIC2(vocoder, gsm_fr_encode_sp); +#endif diff --git a/gr-wavelet/CMakeLists.txt b/gr-wavelet/CMakeLists.txt index bdc19a1ebc..aab17ae7f3 100644 --- a/gr-wavelet/CMakeLists.txt +++ b/gr-wavelet/CMakeLists.txt @@ -48,40 +48,6 @@ GR_SET_GLOBAL(GR_WAVELET_INCLUDE_DIRS if(ENABLE_GR_WAVELET) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_WAVELET_DESCRIPTION "GNU Radio Wavelet Blocks") - -CPACK_COMPONENT("wavelet_runtime" - GROUP "WAVELET" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("wavelet_devel" - GROUP "WAVELET" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("wavelet_python" - GROUP "WAVELET" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;wavelet_runtime" -) - -CPACK_COMPONENT("wavelet_swig" - GROUP "WAVELET" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;wavelet_python;wavelet_devel" -) - -######################################################################## # Add subdirectories ######################################################################## add_subdirectory(include/gnuradio/wavelet) @@ -105,7 +71,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-wavelet.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "wavelet_devel" ) endif(ENABLE_GR_WAVELET) diff --git a/gr-wavelet/include/gnuradio/wavelet/CMakeLists.txt b/gr-wavelet/include/gnuradio/wavelet/CMakeLists.txt index 43c1603d15..c1fcd9c3ea 100644 --- a/gr-wavelet/include/gnuradio/wavelet/CMakeLists.txt +++ b/gr-wavelet/include/gnuradio/wavelet/CMakeLists.txt @@ -26,6 +26,5 @@ install(FILES wavelet_ff.h wvps_ff.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/wavelet - COMPONENT "wavelet_devel" ) diff --git a/gr-wavelet/lib/CMakeLists.txt b/gr-wavelet/lib/CMakeLists.txt index be2a7a8471..3ae8e591af 100644 --- a/gr-wavelet/lib/CMakeLists.txt +++ b/gr-wavelet/lib/CMakeLists.txt @@ -85,7 +85,7 @@ if(CMAKE_COMPILER_IS_GNUCC AND NOT APPLE) SET_TARGET_PROPERTIES(gnuradio-wavelet PROPERTIES LINK_FLAGS "-Wl,--no-as-needed") endif() -GR_LIBRARY_FOO(gnuradio-wavelet RUNTIME_COMPONENT "wavelet_runtime" DEVEL_COMPONENT "wavelet_devel") +GR_LIBRARY_FOO(gnuradio-wavelet) add_dependencies(gnuradio-wavelet wavelet_generated_includes wavelet_generated_swigs gnuradio-runtime) @@ -113,6 +113,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-wavelet_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "wavelet_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-wavelet/python/wavelet/CMakeLists.txt b/gr-wavelet/python/wavelet/CMakeLists.txt index bb88c50b65..9e1961d4e0 100644 --- a/gr-wavelet/python/wavelet/CMakeLists.txt +++ b/gr-wavelet/python/wavelet/CMakeLists.txt @@ -24,7 +24,6 @@ GR_PYTHON_INSTALL( FILES __init__.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/wavelet - COMPONENT "wavelet_python" ) ######################################################################## diff --git a/gr-wavelet/swig/CMakeLists.txt b/gr-wavelet/swig/CMakeLists.txt index 1f31497844..d9bc02edab 100644 --- a/gr-wavelet/swig/CMakeLists.txt +++ b/gr-wavelet/swig/CMakeLists.txt @@ -46,7 +46,6 @@ GR_SWIG_MAKE(wavelet_swig wavelet_swig.i) GR_SWIG_INSTALL( TARGETS wavelet_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/wavelet - COMPONENT "wavelet_python" ) install( @@ -54,5 +53,4 @@ install( wavelet_swig.i ${CMAKE_CURRENT_BINARY_DIR}/wavelet_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "wavelet_swig" ) diff --git a/gr-wxgui/CMakeLists.txt b/gr-wxgui/CMakeLists.txt index 3d8b59c691..d77e36ad4a 100644 --- a/gr-wxgui/CMakeLists.txt +++ b/gr-wxgui/CMakeLists.txt @@ -59,37 +59,6 @@ GR_SET_GLOBAL(GR_WXGUI_INCLUDE_DIRS ) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_COMPONENT("wxgui_runtime" - DISPLAY_NAME "WxGUI" - DESCRIPTION "Wx GUI plotter widgets and grc wrappers" - DEPENDS "runtime_python" -) - -CPACK_COMPONENT("wxgui_devel" - GROUP "WxGUI" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("wxgui_python" - GROUP "WxGUI" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;wxgui_runtime" -) - -CPACK_COMPONENT("wxgui_swig" - GROUP "WxGUI" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;wxgui_python;wxgui_devel" -) - -######################################################################## # Create Pkg Config File ######################################################################## configure_file( @@ -100,7 +69,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gr-wxgui.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "wxgui" ) ######################################################################## @@ -109,7 +77,6 @@ install( install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/gr-wxgui.conf DESTINATION ${GR_PREFSDIR} - COMPONENT "wxgui" ) ######################################################################## diff --git a/gr-wxgui/grc/CMakeLists.txt b/gr-wxgui/grc/CMakeLists.txt index 9ee6e2370e..52c9bbda43 100644 --- a/gr-wxgui/grc/CMakeLists.txt +++ b/gr-wxgui/grc/CMakeLists.txt @@ -19,7 +19,7 @@ ######################################################################## file(GLOB xml_files "*.xml") -install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR} COMPONENT "wxgui_python") +install(FILES ${xml_files} DESTINATION ${GRC_BLOCKS_DIR}) ######################################################################## #The wxgui module contains a top_block + wxgui frame. @@ -32,5 +32,4 @@ GR_PYTHON_INSTALL( panel.py top_block_gui.py DESTINATION ${GR_PYTHON_DIR}/grc_gnuradio/wxgui - COMPONENT "wxgui_python" ) diff --git a/gr-wxgui/include/gnuradio/wxgui/CMakeLists.txt b/gr-wxgui/include/gnuradio/wxgui/CMakeLists.txt index fad84792e1..468d9b7992 100644 --- a/gr-wxgui/include/gnuradio/wxgui/CMakeLists.txt +++ b/gr-wxgui/include/gnuradio/wxgui/CMakeLists.txt @@ -28,5 +28,4 @@ install(FILES oscope_sink_x.h trigger_mode.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/wxgui - COMPONENT "wxgui_devel" ) diff --git a/gr-wxgui/lib/CMakeLists.txt b/gr-wxgui/lib/CMakeLists.txt index d4c244177f..2f1f6135f3 100644 --- a/gr-wxgui/lib/CMakeLists.txt +++ b/gr-wxgui/lib/CMakeLists.txt @@ -71,9 +71,7 @@ list(APPEND wxgui_libs add_library(gnuradio-wxgui SHARED ${gr_wxgui_sources}) target_link_libraries(gnuradio-wxgui ${wxgui_libs}) -GR_LIBRARY_FOO(gnuradio-wxgui - RUNTIME_COMPONENT "wxgui_runtime" - DEVEL_COMPONENT "wxgui_devel") +GR_LIBRARY_FOO(gnuradio-wxgui) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -95,6 +93,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-wxgui_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "wxgui_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-wxgui/python/wxgui/CMakeLists.txt b/gr-wxgui/python/wxgui/CMakeLists.txt index 3a5cc11527..a06cba70b7 100644 --- a/gr-wxgui/python/wxgui/CMakeLists.txt +++ b/gr-wxgui/python/wxgui/CMakeLists.txt @@ -55,7 +55,6 @@ GR_PYTHON_INSTALL( slider.py stdgui2.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/wxgui - COMPONENT "wxgui_python" ) ######################################################################## @@ -67,7 +66,6 @@ GR_PYTHON_INSTALL( forms/forms.py forms/converters.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/wxgui/forms - COMPONENT "wxgui_python" ) ######################################################################## @@ -84,5 +82,4 @@ GR_PYTHON_INSTALL( plotter/plotter_base.py plotter/waterfall_plotter.py DESTINATION ${GR_PYTHON_DIR}/gnuradio/wxgui/plotter - COMPONENT "wxgui_python" ) diff --git a/gr-wxgui/swig/CMakeLists.txt b/gr-wxgui/swig/CMakeLists.txt index 034036e267..4eb11633a7 100644 --- a/gr-wxgui/swig/CMakeLists.txt +++ b/gr-wxgui/swig/CMakeLists.txt @@ -45,7 +45,6 @@ GR_SWIG_MAKE(wxgui_swig wxgui_swig.i) GR_SWIG_INSTALL( TARGETS wxgui_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/wxgui - COMPONENT "wxgui_python" ) install( @@ -53,5 +52,4 @@ install( wxgui_swig.i ${CMAKE_CURRENT_BINARY_DIR}/wxgui_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "wxgui_swig" ) diff --git a/gr-zeromq/CMakeLists.txt b/gr-zeromq/CMakeLists.txt index ffb9a0fc67..1ebd0ff4f5 100644 --- a/gr-zeromq/CMakeLists.txt +++ b/gr-zeromq/CMakeLists.txt @@ -47,41 +47,6 @@ SET(GR_PKG_ZEROMQ_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/zeromq) ######################################################################## if(ENABLE_GR_ZEROMQ) - -######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_SET(CPACK_COMPONENT_GROUP_ZEROMQ_DESCRIPTION "GNU Radio ZeromMQ Interface Blocks") - -CPACK_COMPONENT("zeromq_runtime" - GROUP "ZeroMQ Blocks" - DISPLAY_NAME "Runtime" - DESCRIPTION "Runtime" - DEPENDS "runtime_runtime" -) - -CPACK_COMPONENT("zeromq_devel" - GROUP "ZeroMQ Blocks" - DISPLAY_NAME "Development" - DESCRIPTION "C++ headers, package config, import libraries" - DEPENDS "runtime_devel" -) - -CPACK_COMPONENT("zeromq_python" - GROUP "ZeroMQ Blocks" - DISPLAY_NAME "Python" - DESCRIPTION "Python modules for runtime; GRC xml files" - DEPENDS "runtime_python;zeromq_runtime" -) - -CPACK_COMPONENT("zeromq_swig" - GROUP "ZeroMQ Blocks" - DISPLAY_NAME "SWIG" - DESCRIPTION "SWIG development .i files" - DEPENDS "runtime_swig;zeromq_python;zeromq_devel" -) - ######################################################################## # Add subdirectories ######################################################################## @@ -105,7 +70,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/gnuradio-zeromq.pc DESTINATION ${GR_LIBRARY_DIR}/pkgconfig - COMPONENT "zeromq_devel" ) endif(ENABLE_GR_ZEROMQ) diff --git a/gr-zeromq/examples/CMakeLists.txt b/gr-zeromq/examples/CMakeLists.txt index ce673cf1f5..dd31185d99 100644 --- a/gr-zeromq/examples/CMakeLists.txt +++ b/gr-zeromq/examples/CMakeLists.txt @@ -27,5 +27,4 @@ INSTALL(FILES zmq_msg.grc zmq_stream.grc DESTINATION ${GR_PKG_ZEROMQ_EXAMPLES_DIR} - COMPONENT "zeromq_python" ) diff --git a/gr-zeromq/include/gnuradio/zeromq/CMakeLists.txt b/gr-zeromq/include/gnuradio/zeromq/CMakeLists.txt index d365532003..5e99ab140b 100644 --- a/gr-zeromq/include/gnuradio/zeromq/CMakeLists.txt +++ b/gr-zeromq/include/gnuradio/zeromq/CMakeLists.txt @@ -36,5 +36,4 @@ install(FILES req_msg_source.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/zeromq - COMPONENT "zeromq_devel" ) diff --git a/gr-zeromq/lib/CMakeLists.txt b/gr-zeromq/lib/CMakeLists.txt index d7b03fa4ed..880a6522a9 100644 --- a/gr-zeromq/lib/CMakeLists.txt +++ b/gr-zeromq/lib/CMakeLists.txt @@ -75,7 +75,7 @@ list(APPEND zeromq_libs add_library(gnuradio-zeromq SHARED ${zeromq_sources}) target_link_libraries(gnuradio-zeromq ${zeromq_libs}) -GR_LIBRARY_FOO(gnuradio-zeromq RUNTIME_COMPONENT "zeromq_runtime" DEVEL_COMPONENT "zeromq_devel") +GR_LIBRARY_FOO(gnuradio-zeromq) if(ENABLE_STATIC_LIBS) if(ENABLE_GR_CTRLPORT) @@ -97,6 +97,6 @@ if(ENABLE_STATIC_LIBS) endif(NOT WIN32) install(TARGETS gnuradio-zeromq_static - ARCHIVE DESTINATION lib${LIB_SUFFIX} COMPONENT "zeromq_devel" # .lib file + ARCHIVE DESTINATION lib${LIB_SUFFIX} # .lib file ) endif(ENABLE_STATIC_LIBS) diff --git a/gr-zeromq/swig/CMakeLists.txt b/gr-zeromq/swig/CMakeLists.txt index 5c2aff2ed0..0c557a3ffa 100644 --- a/gr-zeromq/swig/CMakeLists.txt +++ b/gr-zeromq/swig/CMakeLists.txt @@ -44,7 +44,6 @@ GR_SWIG_MAKE(zeromq_swig zeromq_swig.i) GR_SWIG_INSTALL( TARGETS zeromq_swig DESTINATION ${GR_PYTHON_DIR}/gnuradio/zeromq - COMPONENT "zeromq_python" ) install( @@ -52,5 +51,4 @@ install( zeromq_swig.i ${CMAKE_CURRENT_BINARY_DIR}/zeromq_swig_doc.i DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig - COMPONENT "zeromq_swig" ) diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt index 4c782a7f7d..eed5202657 100644 --- a/grc/CMakeLists.txt +++ b/grc/CMakeLists.txt @@ -54,16 +54,6 @@ GR_REGISTER_COMPONENT("gnuradio-companion" ENABLE_GRC if(ENABLE_GRC) ######################################################################## -# Setup CPack components -######################################################################## -include(GrPackage) -CPACK_COMPONENT("grc" - DISPLAY_NAME "GNU Radio Companion" - DESCRIPTION "Graphical flow graph designer" - DEPENDS "runtime_python" -) - -######################################################################## # Create and install the grc conf file ######################################################################## file(TO_NATIVE_PATH ${CMAKE_INSTALL_PREFIX}/${GRC_BLOCKS_DIR} blocksdir) @@ -93,7 +83,6 @@ configure_file( install( FILES ${CMAKE_CURRENT_BINARY_DIR}/grc.conf DESTINATION ${GR_PREFSDIR} - COMPONENT "grc" ) file(GLOB py_files "*.py") @@ -101,7 +90,6 @@ file(GLOB py_files "*.py") GR_PYTHON_INSTALL( FILES ${py_files} DESTINATION ${GR_PYTHON_DIR}/gnuradio/grc - COMPONENT "grc" ) ######################################################################## @@ -118,18 +106,6 @@ string(REPLACE "\\" "\\\\" GRC_BLOCKS_PATH ${GRC_BLOCKS_PATH}) file(TO_NATIVE_PATH ${GR_PYTHON_DIR} GR_PYTHON_POSTFIX) string(REPLACE "\\" "\\\\" GR_PYTHON_POSTFIX ${GR_PYTHON_POSTFIX}) -CPACK_SET(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS} - #!include \\\"winmessages.nsh\\\" - WriteRegStr HKLM ${HLKM_ENV} \\\"GRC_BLOCKS_PATH\\\" \\\"$INSTDIR\\\\${GRC_BLOCKS_PATH}\\\" - SendMessage \\\${HWND_BROADCAST} \\\${WM_WININICHANGE} 0 \\\"STR:Environment\\\" /TIMEOUT=5000 -") - -CPACK_SET(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "${CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS} - #!include \\\"winmessages.nsh\\\" - DeleteRegValue HKLM ${HLKM_ENV} \\\"GRC_BLOCKS_PATH\\\" - SendMessage \\\${HWND_BROADCAST} \\\${WM_WININICHANGE} 0 \\\"STR:Environment\\\" /TIMEOUT=5000 -") - endif(WIN32) ######################################################################## diff --git a/grc/blocks/CMakeLists.txt b/grc/blocks/CMakeLists.txt index 0c2a1f7901..eaa57970a6 100644 --- a/grc/blocks/CMakeLists.txt +++ b/grc/blocks/CMakeLists.txt @@ -39,5 +39,4 @@ add_custom_target(grc_generated_xml ALL DEPENDS ${generated_xml_files}) install( FILES ${xml_files} ${generated_xml_files} DESTINATION ${GRC_BLOCKS_DIR} - COMPONENT "grc" ) diff --git a/grc/checks.py b/grc/checks.py deleted file mode 100755 index 4b5ce9d316..0000000000 --- a/grc/checks.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright 2009-2016 Free Software Foundation, Inc. -# This file is part of GNU Radio -# -# GNU Radio Companion is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# GNU Radio Companion is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You 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 - -from __future__ import absolute_import -import os -import warnings - - -GR_IMPORT_ERROR_MESSAGE = """\ -Cannot import gnuradio. - -Is the model path environment variable set correctly? - All OS: PYTHONPATH - -Is the library path environment variable set correctly? - Linux: LD_LIBRARY_PATH - Windows: PATH - MacOSX: DYLD_LIBRARY_PATH -""" - - -def die(error, message): - msg = "{0}\n\n({1})".format(message, error) - try: - from gi.repository import Gtk - d = Gtk.MessageDialog( - message_type=Gtk.MessageType.ERROR, - buttons=Gtk.ButtonsType.CLOSE, - text=msg, - ) - d.set_title(type(error).__name__) - d.run() - exit(1) - except ImportError: - exit(type(error).__name__ + '\n\n' + msg) - - -def check_gtk(): - try: - warnings.filterwarnings("error") - import gi - gi.require_version('Gtk', '3.0') - gi.require_version('PangoCairo', '1.0') - - from gi.repository import Gtk - Gtk.init_check() - warnings.filterwarnings("always") - except Exception as err: - die(err, "Failed to initialize GTK. If you are running over ssh, " - "did you enable X forwarding and start ssh with -X?") - - -def check_gnuradio_import(): - try: - from gnuradio import gr - except ImportError as err: - die(err, GR_IMPORT_ERROR_MESSAGE) - - -def check_blocks_path(): - if 'GR_DONT_LOAD_PREFS' in os.environ and not os.environ.get('GRC_BLOCKS_PATH', ''): - die(EnvironmentError("No block definitions available"), - "Can't find block definitions. Use config.conf or GRC_BLOCKS_PATH.") - - -def do_all(): - check_gnuradio_import() - check_gtk() - check_blocks_path() diff --git a/grc/core/CMakeLists.txt b/grc/core/CMakeLists.txt index 51b0dacba6..f340127873 100644 --- a/grc/core/CMakeLists.txt +++ b/grc/core/CMakeLists.txt @@ -22,7 +22,6 @@ file(GLOB py_files "*.py") GR_PYTHON_INSTALL( FILES ${py_files} DESTINATION ${GR_PYTHON_DIR}/gnuradio/grc/core - COMPONENT "grc" ) file(GLOB dtd_files "*.dtd") @@ -30,7 +29,6 @@ file(GLOB dtd_files "*.dtd") install( FILES ${dtd_files} default_flow_graph.grc DESTINATION ${GR_PYTHON_DIR}/gnuradio/grc/core - COMPONENT "grc" ) add_subdirectory(generator) diff --git a/grc/core/Config.py b/grc/core/Config.py index 400d5d365f..b65a421b7a 100644 --- a/grc/core/Config.py +++ b/grc/core/Config.py @@ -21,6 +21,8 @@ from __future__ import absolute_import import os from os.path import expanduser, normpath, expandvars, exists +from . import Constants + class Config(object): @@ -29,7 +31,7 @@ class Config(object): license = __doc__.strip() website = 'http://gnuradio.org' - hier_block_lib_dir = os.environ.get('GRC_HIER_PATH', expanduser('~/.grc_gnuradio')) + hier_block_lib_dir = os.environ.get('GRC_HIER_PATH', Constants.DEFAULT_HIER_BLOCK_LIB_DIR) def __init__(self, prefs_file, version, version_parts=None): self.prefs = prefs_file @@ -54,3 +56,12 @@ class Config(object): for path in collected_paths if exists(path)] return valid_paths + + @property + def default_flow_graph(self): + user_default = ( + os.environ.get('GRC_DEFAULT_FLOW_GRAPH') or + self.prefs.get_string('grc', 'default_flow_graph', '') or + os.path.join(self.hier_block_lib_dir, 'default_flow_graph.grc') + ) + return user_default if exists(user_default) else Constants.DEFAULT_FLOW_GRAPH diff --git a/grc/core/Constants.py b/grc/core/Constants.py index 13e29cb533..394150529b 100644 --- a/grc/core/Constants.py +++ b/grc/core/Constants.py @@ -31,6 +31,7 @@ FLOW_GRAPH_DTD = os.path.join(DATA_DIR, 'flow_graph.dtd') BLOCK_TREE_DTD = os.path.join(DATA_DIR, 'block_tree.dtd') BLOCK_DTD = os.path.join(DATA_DIR, 'block.dtd') DEFAULT_FLOW_GRAPH = os.path.join(DATA_DIR, 'default_flow_graph.grc') +DEFAULT_HIER_BLOCK_LIB_DIR = os.path.expanduser('~/.grc_gnuradio') DOMAIN_DTD = os.path.join(DATA_DIR, 'domain.dtd') # File format versions: diff --git a/grc/core/Param.py b/grc/core/Param.py index 5ac1745f95..6d947c3615 100644 --- a/grc/core/Param.py +++ b/grc/core/Param.py @@ -443,10 +443,8 @@ class Param(Element): if t in ('string', 'file_open', 'file_save', '_multiline', '_multiline_python_external'): if not self._init: self.evaluate() - if self._stringify_flag: - return '"%s"' % v.replace('"', '\"') - else: - return v + return repr(v) if self._stringify_flag else v + # Vector types elif t in ('complex_vector', 'real_vector', 'float_vector', 'int_vector'): if not self._init: diff --git a/grc/core/Platform.py b/grc/core/Platform.py index 9956391055..7ef944b3aa 100644 --- a/grc/core/Platform.py +++ b/grc/core/Platform.py @@ -56,9 +56,6 @@ class Platform(Element): callback_finished=lambda: self.block_docstrings_loaded_callback() ) - self._block_dtd = Constants.BLOCK_DTD - self._default_flow_graph = Constants.DEFAULT_FLOW_GRAPH - self.blocks = {} self._blocks_n = {} self._block_categories = {} @@ -187,7 +184,7 @@ class Platform(Element): def load_block_xml(self, xml_file): """Load block description from xml file""" # Validate and import - ParseXML.validate_dtd(xml_file, self._block_dtd) + ParseXML.validate_dtd(xml_file, Constants.BLOCK_DTD) n = ParseXML.from_file(xml_file).get('block', {}) n['block_wrapper_path'] = xml_file # inject block wrapper path key = n.pop('key') @@ -291,8 +288,8 @@ class Platform(Element): nested data @throws exception if the validation fails """ - flow_graph_file = flow_graph_file or self._default_flow_graph - open(flow_graph_file, 'r') # Test open + flow_graph_file = flow_graph_file or self.config.default_flow_graph + open(flow_graph_file, 'r').close() # Test open ParseXML.validate_dtd(flow_graph_file, Constants.FLOW_GRAPH_DTD) return ParseXML.from_file(flow_graph_file) diff --git a/grc/core/generator/CMakeLists.txt b/grc/core/generator/CMakeLists.txt index 4bdd59a7a2..492ad7c4ad 100644 --- a/grc/core/generator/CMakeLists.txt +++ b/grc/core/generator/CMakeLists.txt @@ -22,11 +22,9 @@ file(GLOB py_files "*.py") GR_PYTHON_INSTALL( FILES ${py_files} DESTINATION ${GR_PYTHON_DIR}/gnuradio/grc/core/generator - COMPONENT "grc" ) install(FILES flow_graph.tmpl DESTINATION ${GR_PYTHON_DIR}/gnuradio/grc/core/generator - COMPONENT "grc" ) diff --git a/grc/core/generator/Generator.py b/grc/core/generator/Generator.py index a9ce933aeb..f042b4963c 100644 --- a/grc/core/generator/Generator.py +++ b/grc/core/generator/Generator.py @@ -79,13 +79,14 @@ class TopBlockGenerator(object): self._flow_graph = FlowGraphProxy(flow_graph) self._generate_options = self._flow_graph.get_option('generate_options') self._mode = TOP_BLOCK_FILE_MODE - dirname = self._dirname = os.path.dirname(file_path) + dirname = os.path.dirname(file_path) # Handle the case where the directory is read-only # In this case, use the system's temp directory if not os.access(dirname, os.W_OK): dirname = tempfile.gettempdir() filename = self._flow_graph.get_option('id') + '.py' self.file_path = os.path.join(dirname, filename) + self._dirname = dirname def write(self): """generate output and write it to files""" diff --git a/grc/core/utils/CMakeLists.txt b/grc/core/utils/CMakeLists.txt index 2528fbc43c..3ba65258a5 100644 --- a/grc/core/utils/CMakeLists.txt +++ b/grc/core/utils/CMakeLists.txt @@ -22,5 +22,4 @@ file(GLOB py_files "*.py") GR_PYTHON_INSTALL( FILES ${py_files} DESTINATION ${GR_PYTHON_DIR}/gnuradio/grc/core/utils - COMPONENT "grc" ) diff --git a/grc/grc.conf.in b/grc/grc.conf.in index 71c4f63bca..1dbb13bfaa 100644 --- a/grc/grc.conf.in +++ b/grc/grc.conf.in @@ -5,6 +5,7 @@ [grc] global_blocks_path = @blocksdir@ local_blocks_path = +default_flow_graph = xterm_executable = @GRC_XTERM_EXE@ canvas_font_size = 8 canvas_default_size = 1280, 1024 diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py index 9e57565772..ca16a7e7fd 100644 --- a/grc/gui/ActionHandler.py +++ b/grc/gui/ActionHandler.py @@ -63,7 +63,7 @@ class ActionHandler: Messages.register_messenger(self.main_window.add_console_line) Messages.send_init(platform) #initialize - self.init_file_paths = file_paths + self.init_file_paths = [os.path.abspath(file_path) for file_path in file_paths] self.init = False Actions.APPLICATION_INITIALIZE() @@ -112,14 +112,11 @@ class ActionHandler: # Initialize/Quit ################################################## if action == Actions.APPLICATION_INITIALIZE: - if not self.init_file_paths: - self.init_file_paths = list(filter(os.path.exists, Preferences.get_open_files())) - if not self.init_file_paths: self.init_file_paths = [''] - for file_path in self.init_file_paths: - if file_path: main.new_page(file_path) #load pages from file paths - if Preferences.file_open() in self.init_file_paths: - main.new_page(Preferences.file_open(), show=True) - if not self.main_window.current_page: + file_path_to_show = Preferences.file_open() + for file_path in (self.init_file_paths or Preferences.get_open_files()): + if os.path.exists(file_path): + main.new_page(file_path, show=file_path_to_show == file_path) + if not main.current_page: main.new_page() # ensure that at least a blank page exists main.btwin.search_entry.hide() diff --git a/grc/gui/BlockTreeWindow.py b/grc/gui/BlockTreeWindow.py index 90d4b561b7..8504200459 100644 --- a/grc/gui/BlockTreeWindow.py +++ b/grc/gui/BlockTreeWindow.py @@ -179,9 +179,9 @@ class BlockTreeWindow(Gtk.VBox): """Update the documentation column of every block""" def update_doc(model, _, iter_): - if model.iter_has_child(iter_): - return # category node, no doc string key = model.get_value(iter_, KEY_INDEX) + if not key: + return # category node, no doc string block = self.platform.blocks[key] model.set_value(iter_, DOC_INDEX, _format_doc(block.documentation)) diff --git a/grc/gui/CMakeLists.txt b/grc/gui/CMakeLists.txt index aa9592b351..12be4a8151 100644 --- a/grc/gui/CMakeLists.txt +++ b/grc/gui/CMakeLists.txt @@ -22,5 +22,4 @@ file(GLOB py_files "*.py") GR_PYTHON_INSTALL( FILES ${py_files} DESTINATION ${GR_PYTHON_DIR}/gnuradio/grc/gui - COMPONENT "grc" ) diff --git a/grc/gui/Preferences.py b/grc/gui/Preferences.py index 8756a7ab23..d917537971 100644 --- a/grc/gui/Preferences.py +++ b/grc/gui/Preferences.py @@ -77,7 +77,7 @@ def entry(key, value=None, default=None): }.get(_type, _config_parser.get) try: result = getter('main', key) - except configparser.Error: + except (AttributeError, configparser.Error): result = _type() if default is None else default return result @@ -109,7 +109,7 @@ def get_file_list(key): try: files = [value for name, value in _config_parser.items(key) if name.startswith('%s_' % key)] - except configparser.Error: + except (AttributeError, configparser.Error): files = [] return files diff --git a/grc/scripts/CMakeLists.txt b/grc/scripts/CMakeLists.txt index 6cc78c3cf3..9751952118 100644 --- a/grc/scripts/CMakeLists.txt +++ b/grc/scripts/CMakeLists.txt @@ -21,7 +21,6 @@ GR_PYTHON_INSTALL( PROGRAMS gnuradio-companion DESTINATION ${GR_RUNTIME_DIR} - COMPONENT "grc" ) add_subdirectory(freedesktop) diff --git a/grc/scripts/freedesktop/CMakeLists.txt b/grc/scripts/freedesktop/CMakeLists.txt index 47e836f697..f936b366fc 100644 --- a/grc/scripts/freedesktop/CMakeLists.txt +++ b/grc/scripts/freedesktop/CMakeLists.txt @@ -31,7 +31,6 @@ install(FILES gnuradio-grc.xml gnuradio-grc.desktop DESTINATION ${grc_freedesktop_path} - COMPONENT "grc" ) find_program(HAVE_XDG_UTILS xdg-desktop-menu) @@ -44,6 +43,6 @@ if(UNIX AND HAVE_XDG_UTILS) @ONLY) install( PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/grc_setup_freedesktop - DESTINATION ${GR_PKG_LIBEXEC_DIR} COMPONENT "grc" + DESTINATION ${GR_PKG_LIBEXEC_DIR} ) endif(UNIX AND HAVE_XDG_UTILS) diff --git a/grc/scripts/gnuradio-companion b/grc/scripts/gnuradio-companion index 6130582f35..8f267c8198 100755 --- a/grc/scripts/gnuradio-companion +++ b/grc/scripts/gnuradio-companion @@ -20,22 +20,82 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA import os import sys +import warnings -script_path = os.path.dirname(os.path.abspath(__file__)) -source_tree_subpath = "/grc/scripts" -if not script_path.endswith(source_tree_subpath): - # run the installed version - from gnuradio.grc import checks - checks.do_all() - from gnuradio.grc.main import main - exit(main()) +GR_IMPORT_ERROR_MESSAGE = """\ +Cannot import gnuradio. + +Is the model path environment variable set correctly? + All OS: PYTHONPATH + +Is the library path environment variable set correctly? + Linux: LD_LIBRARY_PATH + Windows: PATH + MacOSX: DYLD_LIBRARY_PATH +""" + + +def die(error, message): + msg = "{0}\n\n({1})".format(message, error) + try: + from gi.repository import Gtk + d = Gtk.MessageDialog( + message_type=Gtk.MessageType.ERROR, + buttons=Gtk.ButtonsType.CLOSE, + text=msg, + ) + d.set_title(type(error).__name__) + d.run() + exit(1) + except ImportError: + exit(type(error).__name__ + '\n\n' + msg) + + +def check_gtk(): + try: + warnings.filterwarnings("error") + import gi + gi.require_version('Gtk', '3.0') + gi.require_version('PangoCairo', '1.0') -else: - print("Running from source tree") - sys.path.insert(1, script_path[:-len(source_tree_subpath)]) - from grc import checks - checks.do_all() - from grc.main import main + from gi.repository import Gtk + Gtk.init_check() + warnings.filterwarnings("always") + except Exception as err: + die(err, "Failed to initialize GTK. If you are running over ssh, " + "did you enable X forwarding and start ssh with -X?") + + +def check_gnuradio_import(): + try: + from gnuradio import gr + except ImportError as err: + die(err, GR_IMPORT_ERROR_MESSAGE) + + +def check_blocks_path(): + if 'GR_DONT_LOAD_PREFS' in os.environ and not os.environ.get('GRC_BLOCKS_PATH', ''): + die(EnvironmentError("No block definitions available"), + "Can't find block definitions. Use config.conf or GRC_BLOCKS_PATH.") + + +def run_main(): + script_path = os.path.dirname(os.path.abspath(__file__)) + source_tree_subpath = "/grc/scripts" + + if not script_path.endswith(source_tree_subpath): + # run the installed version + from gnuradio.grc.main import main + else: + print("Running from source tree") + sys.path.insert(1, script_path[:-len(source_tree_subpath)]) + from grc.main import main exit(main()) + +if __name__ == '__main__': + check_gnuradio_import() + check_gtk() + check_blocks_path() + run_main() |