diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..735f01f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.tlog \ No newline at end of file diff --git a/AUTHORS b/AUTHORS index 33dae0b..5907c79 100644 --- a/AUTHORS +++ b/AUTHORS @@ -3,4 +3,5 @@ Michal Uricar Vojtech Franc Python wrappper -Kostiantyn Antoniuk \ No newline at end of file +Kostiantyn Antoniuk +Michal Uricar \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d4da9e..d2dff8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,27 +4,28 @@ project(clandmark) # The version number set(clandmark_VERSION_MAJOR 1) -set(clandmark_VERSION_MINOR 5) +set(clandmark_VERSION_MINOR 6) set(clandmark_VERSION ${clandmark_VERSION_MAJOR}.${clandmark_VERSION_MINOR}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules") -#option(BUILD_SHARED_LIBS "Check whether to build libraries dynamically or statically. On for dynamic, Off for static build." ON) mark_as_advanced(CMAKE_INSTALL_PREFIX) -set(BUILD_SHARED_LIBS "TRUE" CACHE BOOL "Global flag to cause add_library to create shared libraries if on.") -set(CMAKE_SKIP_BUILD_RPATH "FALSE" CACHE BOOL "Do not include RPATHs in the build tree.") + +# set(BUILD_SHARED_LIBS "TRUE" CACHE BOOL "Global flag to cause add_library to create shared libraries if on.") +# set(CMAKE_SKIP_BUILD_RPATH "FALSE" CACHE BOOL "Do not include RPATHs in the build tree.") if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RELEASE CACHE STRING - "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." - FORCE + set(CMAKE_BUILD_TYPE Release CACHE STRING + "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." + FORCE ) endif(NOT CMAKE_BUILD_TYPE) +option(BUILD_SHARED_LIBS "Check whether to build libraries dynamically or statically. On for dynamic, Off for static build." OFF) option(DOUBLE_PRECISION "Set the default precision used in CLandmark." ON) option(BUILD_MATLAB_BINDINGS "Check whether to build MATLAB interface." OFF) option(BUILD_PYTHON_BINDINGS "Check whether to build Python interface." OFF) -option(BUILD_CPP_EXAMPLES "Check whether to build CPP examples." ON) +option(BUILD_CPP_EXAMPLES "Check whether to build CPP examples." OFF) option(USE_OPENMP "Enable/Disable OpenMP." OFF) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -pedantic") @@ -34,15 +35,12 @@ set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -pedantic") # for configured header files: include_directories(${PROJECT_BINARY_DIR}) -# build clandmark +# build clandmark & flandmark add_subdirectory (libclandmark) -## build flandmark -#add_subdirectory (libflandmark) - # build examples if(BUILD_CPP_EXAMPLES) - add_subdirectory(examples) + add_subdirectory(examples) # copy important files needed to run examples (opencv haarcascade for facial detector, flandmark_model file, example images and videos) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/flandmark_model.xml ${CMAKE_CURRENT_BINARY_DIR}/examples/flandmark_model.xml COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/data/face.jpg ${CMAKE_CURRENT_BINARY_DIR}/examples/face.jpg COPYONLY) @@ -60,30 +58,36 @@ if(BUILD_PYTHON_BINDINGS) endif(BUILD_PYTHON_BINDINGS) include(CMakePackageConfigHelpers) + write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkConfigVersion.cmake" VERSION ${clandmark_VERSION} COMPATIBILITY AnyNewerVersion ) + export(EXPORT CLandmarkTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkTargets.cmake" NAMESPACE CLandmark:: ) + configure_file(cmake/Templates/CLandmarkConfig.cmake "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkConfig.cmake" COPYONLY ) + install(EXPORT CLandmarkTargets FILE CLandmarkTargets.cmake NAMESPACE CLandmark:: DESTINATION lib/cmake/clandmark ) + install( FILES cmake/Templates/CLandmarkConfig.cmake "${CMAKE_CURRENT_BINARY_DIR}/clandmark/CLandmarkConfigVersion.cmake" DESTINATION lib/cmake/clandmark - COMPONENT Devel + COMPONENT + Devel ) - +#install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/Findclandmark.cmake" DESTINATION ./ COMPONENT Devel) diff --git a/README.md b/README.md index f68b927..139f557 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # clandmark +[![Join the chat at https://gitter.im/uricamic/clandmark](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/uricamic/clandmark?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) + ## Open Source Landmarking Library Detailed description will be added soon @@ -20,13 +22,25 @@ Otherwise, the internal version will be used and its files will be installed alo In case you use clandmark in an academic work, please cite the following paper: -@InProceedings{ - author = {U{\v{r}}i{\v{c}}{\'{a}}{\v{r}}, Michal and Franc, Vojt{\v{e}}ch and Thomas, Diego and Sugimoto, Akihiro and Hlav{\'{a}}{\v{c}}, V{\'{a}}clav}, - title = {{Real-time Multi-view Facial Landmark Detector Learned by the Structured Output SVM}}, - year = {2015}, - booktitle = {BWILD '15: Biometrics in the Wild 2015 (IEEE FG 2015 Workshop)}, - venue = {Ljubljana, Slovenia} - www = {http://luks.fe.uni-lj.si/bwild15}, +```tex +@article{Uricar-IMAVIS-2016, + author = {U{\v{r}}i{\v{c}}{\'{a}}{\v{r}}, Michal and + Franc, Vojt{\v{e}}ch and Thomas, Diego and Sugimoto, Akihiro and Hlav{\'{a}}{\v{c}}, V{\'{a}}clav }, + title = {Multi-view facial landmark detector learned by the Structured Output {SVM}}, + journal = {Image and Vision Computing}, + volume = {47}, + pages = {45--59}, + year = {2016}, + month = {March}, + note = {300-W, the First Automatic Facial Landmark Detection in-the-Wild Challenge}, + issn = {0262-8856}, + doi = {http://dx.doi.org/10.1016/j.imavis.2016.02.004}, + url = {http://www.sciencedirect.com/science/article/pii/S0262885616300105}, + publisher = {Elsevier}, + address = {Amsterdam, Netherlands}, + keywords = {Deformable Part Models, Structured output SVM, Facial landmarks detection }, } +``` + Visit http://cmp.felk.cvut.cz/~uricamic/clandmark for further information. diff --git a/build_clandmark_libs.bat b/build_clandmark_libs.bat new file mode 100644 index 0000000..718abc6 --- /dev/null +++ b/build_clandmark_libs.bat @@ -0,0 +1,28 @@ +:: Builds and installs CLandmark libraries (both static and dynamic version) + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: build static version of the libraries +cmake -G %CMAKE_GENERATOR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target clandmark --config %CMAKE_CONFIGURATION% +cmake --build . --target flandmark --config %CMAKE_CONFIGURATION% + +:: build dynamic version of the libraries +cmake -G %CMAKE_GENERATOR% -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target clandmark --config %CMAKE_CONFIGURATION% +cmake --build . --target flandmark --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_examples.bat b/build_examples.bat new file mode 100644 index 0000000..e7c387e --- /dev/null +++ b/build_examples.bat @@ -0,0 +1,28 @@ +:: Builds and installs C++ examples + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: check if the library was compiled +IF NOT EXIST %INSTALL_PATH%\bin\clandmark.dll ( + call %OLDDIR%\build_clandmark_libs.bat +) + +:: build examples +cmake -G %CMAKE_GENERATOR% -DOPENCV_DIR=%OpenCV_DIR% -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=ON -DBUILD_MATLAB_BINDINGS=OFF -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target static_input --config %CMAKE_CONFIGURATION% +cmake --build . --target video_input --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_matlab_interface.bat b/build_matlab_interface.bat new file mode 100644 index 0000000..c1d53c6 --- /dev/null +++ b/build_matlab_interface.bat @@ -0,0 +1,28 @@ +:: Builds and installs MATLAB interface + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: check if the library was compiled +IF NOT EXIST %INSTALL_PATH%\lib\clandmark.lib ( + call %OLDDIR%\build_clandmark_libs.bat +) + +:: build MATLAB interface +cmake -G%CMAKE_GENERATOR% -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% -DBUILD_CPP_EXAMPLES=OFF -DBUILD_MATLAB_BINDINGS=ON -DBUILD_PYTHON_BINDINGS=OFF ..\ +cmake --build . --target flandmark_interface --config %CMAKE_CONFIGURATION% +cmake --build . --target featuresPool_interface --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_python_interface.bat b/build_python_interface.bat new file mode 100644 index 0000000..e058188 --- /dev/null +++ b/build_python_interface.bat @@ -0,0 +1,39 @@ +:: Builds and installs Python interface + +call build_setup_variables.bat + +set OLDDIR=%CD% + +if NOT EXIST %BUILD_DIR% ( + mkdir %BUILD_DIR% +) + +cd %BUILD_DIR% + +:: check if the library was compiled +IF NOT EXIST %INSTALL_PATH%\bin\clandmark.dll ( + call %OLDDIR%\build_clandmark_libs.bat +) + +::python interface build +cmake -G %CMAKE_GENERATOR% \ + -DPYTHON_LIBRARY=%PYTHON_LIBRARY% \ + -DPYTHON_EXECUTABLE=%PYTHON_EXECUTABLE% \ + -DPYTHON_INCLUDE_DIR=%PYTHON_INCLUDE_DIR% \ + -DCYTHON_EXECUTABLE=%CYTHON_EXECUTABLE% \ + -DBUILD_SHARED_LIBS=ON \ + -DCMAKE_INSTALL_PREFIX=%INSTALL_PATH% \ + -DBUILD_CPP_EXAMPLES=OFF \ + -DBUILD_MATLAB_BINDINGS=OFF \ + -DBUILD_PYTHON_BINDINGS=ON ..\ + +cmake --build . --target ReplicatePythonSourceTree %CMAKE_CONFIGURATION% +cmake --build . --target py_featurePool --config %CMAKE_CONFIGURATION% +cmake --build . --target py_flndmark --config %CMAKE_CONFIGURATION% + +:: install +cmake --build . --target INSTALL --config %CMAKE_CONFIGURATION% + +cd %OLDDIR% + +pause diff --git a/build_setup_variables.bat b/build_setup_variables.bat new file mode 100644 index 0000000..5852d97 --- /dev/null +++ b/build_setup_variables.bat @@ -0,0 +1,21 @@ +:: Change these variables to fit your settings + +set BUILD_DIR=D:\GitHub\clandmark\build_win10 +:: set CMAKE_GENERATOR="Visual Studio 14 2015 Win64" +set CMAKE_GENERATOR="Visual Studio 15 2017 Win64" +set CMAKE_CONFIGURATION=Release + +set INSTALL_PATH=D:\GitHub\clandmark\build_win10\install + +:: set OpenCV_DIR=D:\opencv\opencv-2.4.13\build\ + +:: set PYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\python.exe +:: set PYTHON_INCLUDE_DIR=D:\ProgramFiles\Anaconda2\include +:: set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\python27.dll +:: set PYTHON_LIBRARY=D:\ProgramFiles\Anaconda2\libs\python27.lib +:: set CYTHON_EXECUTABLE=D:\ProgramFiles\Anaconda2\Scripts\cython.exe +set CYTHON_EXECUTABLE="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/Scripts/cython.exe" +set PYTHON_EXECUTABLE="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/python.exe" +set PYTHON_INCLUDE_DIR="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/include" +::set PYTHON_LIBRARY="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/python3.dll" +set PYTHON_LIBRARY="C:/Program Files (x86)/Microsoft Visual Studio/Shared/Anaconda3_64/pkgs/python-3.6.5-h0c2934d_0/libs/python36.lib" diff --git a/cmake/Modules/Findclandmark.cmake b/cmake/Modules/Findclandmark.cmake new file mode 100644 index 0000000..e7fa990 --- /dev/null +++ b/cmake/Modules/Findclandmark.cmake @@ -0,0 +1,74 @@ +# - Try to find the clandmark landmark detector library +# +# ============================================================================= +# Once done this will define: +# +# CLANDMARK_FOUND TRUE if found; FALSE otherwise +# CLANDMARK_INCLUDE_DIRS where to find flandmark_detector.h +# CLANDMARK_LIBRARIES the libraries to link against +# +# ============================================================================= +# Variables used by this module: +# +# CLANDMARK_PREFER_STATIC If TRUE and available, link against the static +# flandmark library. Otherwise select the shared +# version +# +# ============================================================================= +# To use this from another project: +# +# create a directory named cmake/Modules under the project root, copy this file +# (FindCLANDMARK.cmake) there, and in the top-level CMakeLists.txt include: +# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} +# "${CMAKE_SOURCE_DIR}/cmake/Modules/") +# +# ============================================================================= + +find_path(CLANDMARK_INCLUDE_DIR CLandmark.h HINTS ${CLANDMARK_INSTALL_DIR} ${CLANDMARK_INSTALL_DIR}/include ) +find_path(FLANDMARK_INCLUDE_DIR Flandmark.h HINTS ${CLANDMARK_INSTALL_DIR} ${CLANDMARK_INSTALL_DIR}/include ) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") +find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) +find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) + +# +if (UNIX) + set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +endif(UNIX) +set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") +find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) +find_library(FLANDMARK_LIBRARY_STATIC NAMES flandmark) + + +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) +set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_SHARED}) +set(CLANDMARK_LIBRARIES ${CLANDMARK_LIBRARY}) +set(CLANDMARK_INCLUDE_DIRS ${CLANDMARK_INCLUDE_DIR}) + +set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC} ${FLANDMARK_LIBRARY_SHARED}) +set(FLANDMARK_LIBRARIES ${FLANDMARK_LIBRARY}) +set(FLANDMARK_INCLUDE_DIRS ${FLANDMARK_INCLUDE_DIR}) + +# Temporary DEBUG message +message(STATUS "CLANDMARK: ${CLANDMARK_INCLUDE_DIR}, ${CLANDMARK_LIBRARIES}") +message(STATUS "FLANDMARK: ${FLANDMARK_INCLUDE_DIR}, ${FLANDMARK_LIBRARIES}") + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set CLANDMARK_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args( + CLANDMARK + DEFAULT_MSG + CLANDMARK_LIBRARY CLANDMARK_INCLUDE_DIR +) + +find_package_handle_standard_args( + FLANDMARK + DEFAULT_MSG + FLANDMARK_LIBRARY FLANDMARK_INCLUDE_DIR +) + +mark_as_advanced(CLANDMARK_INCLUDE_DIR CLANDMARK_LIBRARY) +mark_as_advanced(FLANDMARK_INCLUDE_DIR FLANDMARK_LIBRARY) diff --git a/cmake/Modules/UseCython.cmake b/cmake/Modules/UseCython.cmake index f432c89..19a3d04 100644 --- a/cmake/Modules/UseCython.cmake +++ b/cmake/Modules/UseCython.cmake @@ -242,13 +242,42 @@ function( cython_add_module _name ) compile_pyx( ${_name} generated_file ${pyx_module_sources} ) include_directories( ${PYTHON_INCLUDE_DIRS} ) python_add_module( ${_name} ${generated_file} ${other_module_sources} ) - if( APPLE ) + if(APPLE) set_target_properties( ${_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup" ) - else() - target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) - endif() + else(APPLE) + if (UNIX) + message( STATUS "Linking target ${_name} against libpython" ) + target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) + endif(UNIX) + if (MSVC) + message( STATUS "Not linking target ${_name} against libpython" ) + set_target_properties( ${_name} PROPERTIES LINK_FLAGS "/LTCG" ) + endif(MSVC) + endif(APPLE) endfunction() +# function( cython_add_module2 _name _dynamic_lookup ) + # set( pyx_module_sources "" ) + # set( other_module_sources "" ) + # foreach( _file ${ARGN} ) + # if( ${_file} MATCHES ".*\\.py[x]?$" ) + # list( APPEND pyx_module_sources ${_file} ) + # else() + # list( APPEND other_module_sources ${_file} ) + # endif() + # endforeach() + # compile_pyx( ${_name} generated_file ${pyx_module_sources} ) + # include_directories( ${PYTHON_INCLUDE_DIRS} ) + # python_add_module( ${_name} ${generated_file} ${other_module_sources} ) + ## Added here ## + # if( ${_dynamic_lookup} ) + # message( STATUS "Not linking target ${_name} against libpython" ) + # set_target_properties( ${_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") + # else() + # target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) + # endif() +# endfunction() + include( CMakeParseArguments ) # cython_add_standalone_executable( _name [MAIN_MODULE src3.py] src1 src2 ... srcN ) # Creates a standalone executable the given sources. @@ -267,6 +296,20 @@ function( cython_add_standalone_executable _name ) set( PYTHON_MODULE_${_file_we}_static_BUILD_SHARED OFF ) compile_pyx( "${_file_we}_static" generated_file "${_file}" ) list( APPEND pyx_module_sources "${generated_file}" ) + # TRY THIS + # if(APPLE) + # set_target_properties( ${_name} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup" ) + # else(APPLE) + # if (UNIX) + # message( STATUS "Linking target ${_name} against libpython" ) + # target_link_libraries( ${_name} ${PYTHON_LIBRARIES} ) + # endif(UNIX) + # if (MSVC) + # message( STATUS "Not linking target ${_name} against libpython" ) + # set_target_properties( ${_name} PROPERTIES LINK_FLAGS "/LTCG" ) + # endif(MSVC) + # endif(APPLE) + ########## endif() else() list( APPEND other_module_sources ${_file} ) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 597bcce..439f537 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,17 +1,47 @@ +# cmake_minimum_required(VERSION 3.0) + +# set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/") include_directories("${PROJECT_SOURCE_DIR}/libclandmark") -find_package( OpenCV REQUIRED ) +# message(STATUS "CMAKE_MODULE_PATH=${CMAKE_MODULE_PATH}") + +# find_package(clandmark REQUIRED) + +message(STATUS "CLANDMARK_INCLUDE_DIRS=${CLANDMARK_INCLUDE_DIRS}") +message(STATUS "CLANDMARK_LIBRARIES=${CLANDMARK_LIBRARIES}") + +# find_package(RapidXML) +# if(NOT RAPIDXML_FOUND) + # message(STATUS "RapidXML not found - using internal version.") + # set(RapidXML_INCLUDE_DIR "$" CACHE PATH "Include directory for RapidXML" FORCE) +# endif(NOT RAPIDXML_FOUND) + +# find_package(CImg) +# if(NOT CIMG_FOUND) + # message(STATUS "CImg not found - using internal version.") + # set(CImg_INCLUDE_DIR "$" CACHE PATH "Include directory for CImg" FORCE) +# endif(NOT CIMG_FOUND) + +include_directories( + # ${CImg_INCLUDE_DIR} + # ${RapidXML_INCLUDE_DIR} + ${CLANDMARK_INCLUDE_DIRS} + ${FLANDMARK_INCLUDE_DIRS} +) + +find_package( OpenCV REQUIRED core imgproc objdetect highgui ) include_directories(${OpenCV_INCLUDE_DIR}) -include_directories(${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13) -include_directories(${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6) ## Several examples using flandmark set(EXAMPLES static_input video_input) foreach(var ${EXAMPLES}) add_executable(${var} ${var}.cpp) - target_link_libraries(${var} flandmark ${OpenCV_LIBS}) + # target_link_libraries(${var} ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES} ${OpenCV_LIBS}) + target_link_libraries(${var} flandmark clandmark ${OpenCV_LIBS}) endforeach() -install(TARGETS ${EXAMPLES} EXPORT CLandmarkTargets DESTINATION share/clandmark/examples COMPONENT Examples) - +#install(TARGETS ${EXAMPLES} EXPORT CLandmarkTargets DESTINATION share/clandmark/examples COMPONENT Examples) +install(TARGETS ${EXAMPLES} DESTINATION share/clandmark/examples COMPONENT Examples) diff --git a/examples/cmake/Modules/FindCImg.cmake b/examples/cmake/Modules/FindCImg.cmake new file mode 100644 index 0000000..90108ad --- /dev/null +++ b/examples/cmake/Modules/FindCImg.cmake @@ -0,0 +1,19 @@ +# - Try to find Cimg +# Once done this will define +# CIMG_FOUND - System has CImg +# CImg_INCLUDE_DIR - The CImg include directories + +find_path(CImg_INCLUDE_DIR CImg.h) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set CIMG_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(CImg DEFAULT_MSG CImg_INCLUDE_DIR) + +mark_as_advanced(CImg_INCLUDE_DIR) + +if(CIMG_FOUND) + # provide import target: + add_library(CImg::CImg INTERFACE IMPORTED) + set_target_properties(CImg::CImg PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CImg_INCLUDE_DIR}) +endif() diff --git a/examples/cmake/Modules/FindRapidXML.cmake b/examples/cmake/Modules/FindRapidXML.cmake new file mode 100644 index 0000000..c3bb095 --- /dev/null +++ b/examples/cmake/Modules/FindRapidXML.cmake @@ -0,0 +1,19 @@ +# - Try to find RapidXML +# Once done this will define +# RAPIDXML_FOUND - System has RapidXML +# RapidXML_INCLUDE_DIR - The RapidXML include directories + +find_path(RapidXML_INCLUDE_DIR rapidxml.hpp PATH_SUFFIXES rapidxml) + +include(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set RAPIDXML_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(RapidXML DEFAULT_MSG RapidXML_INCLUDE_DIR) + +mark_as_advanced(RapidXML_INCLUDE_DIR) + +if(RAPIDXML_FOUND) + # provide import target: + add_library(RapidXML::RapidXML INTERFACE IMPORTED) + set_target_properties(RapidXML::RapidXML PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${RapidXML_INCLUDE_DIR}) +endif() diff --git a/cmake/Modules/FindCLANDMARK.cmake b/examples/cmake/Modules/Findclandmark.cmake similarity index 60% rename from cmake/Modules/FindCLANDMARK.cmake rename to examples/cmake/Modules/Findclandmark.cmake index 7c66470..434b2ac 100644 --- a/cmake/Modules/FindCLANDMARK.cmake +++ b/examples/cmake/Modules/Findclandmark.cmake @@ -25,38 +25,50 @@ # ============================================================================= find_path(CLANDMARK_INCLUDE_DIR CLandmark.h) +find_path(FLANDMARK_INCLUDE_DIR Flandmark.h) -set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll") -find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) +set(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".dll" ".dylib") +find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) +find_library(FLANDMARK_LIBRARY_SHARED NAMES flandmark) -set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +# +if (UNIX) + set(CMAKE_FIND_LIBRARY_PREFIXES "lib") +endif(UNIX) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib") -find_library(CLANDMARK_LIBRARY_SHARED NAMES clandmark) +find_library(CLANDMARK_LIBRARY_STATIC NAMES clandmark) +find_library(FLANDMARK_LIBRARY_STATIC NAMES flandmark) -if(CLANDMARK_LIBRARY_STATIC and CLANDMARK_LIBRARY_SHARED) - if(CLANDMARK_PREFER_STATIC) - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) - else() - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) - endif() -elseif(CLANDMARK_LIBRARY_STATIC) - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) -elseif(CLANDMARK_LIBRARY_SHARED) - set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) -else() - set(CLANDMARK_LIBRARY "CLANDMARK_LIBRARY-NOTFOUND") -endif() +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC}) +set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_SHARED}) +# set(CLANDMARK_LIBRARY ${CLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_SHARED}) set(CLANDMARK_LIBRARIES ${CLANDMARK_LIBRARY}) set(CLANDMARK_INCLUDE_DIRS ${CLANDMARK_INCLUDE_DIR}) +set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_SHARED}) +# set(FLANDMARK_LIBRARY ${FLANDMARK_LIBRARY_STATIC} ${FLANDMARK_LIBRARY_SHARED}) +set(FLANDMARK_LIBRARIES ${FLANDMARK_LIBRARY}) +set(FLANDMARK_INCLUDE_DIRS ${FLANDMARK_INCLUDE_DIR}) + +# Temporary DEBUG message +message(STATUS "CLANDMARK: ${CLANDMARK_INCLUDE_DIR}, ${CLANDMARK_LIBRARIES}") +message(STATUS "FLANDMARK: ${FLANDMARK_INCLUDE_DIR}, ${FLANDMARK_LIBRARIES}") + include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set CLANDMARK_FOUND to TRUE # if all listed variables are TRUE find_package_handle_standard_args( - CLANDMARK - DEFAULT_MSG - CLANDMARK_LIBRARY CLANDMARK_INCLUDE_DIR + CLANDMARK + DEFAULT_MSG + CLANDMARK_LIBRARY CLANDMARK_INCLUDE_DIR +) + +find_package_handle_standard_args( + FLANDMARK + DEFAULT_MSG + FLANDMARK_LIBRARY FLANDMARK_INCLUDE_DIR ) mark_as_advanced(CLANDMARK_INCLUDE_DIR CLANDMARK_LIBRARY) +mark_as_advanced(FLANDMARK_INCLUDE_DIR FLANDMARK_LIBRARY) diff --git a/examples/helpers.h b/examples/helpers.h new file mode 100644 index 0000000..1c548f9 --- /dev/null +++ b/examples/helpers.h @@ -0,0 +1,108 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Written (W) 2014, 2015 Michal Uricar + * Copyright (C) 2014, 2015 Michal Uricar + */ + +#ifndef __HELPERS_H__ +#define __HELPERS_H__ + +namespace clandmark { + +// DOUBLE_PRECISION +#if DOUBLE_PRECISION==1 + typedef double DOUBLE; +#else + typedef float DOUBLE; +#endif + +/** + * @brief printQG + * @param Q + * @param G + * @param M + * @param N + */ +void printQG(DOUBLE *Q, DOUBLE *G, int M, int N) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2); // << setw(5) << endl; + std::cout << "Q: " << std::endl; + std::cout << "[ "; + for (int i=0; i < M; ++i) + { + std::cout << Q[i] << " "; + } + std::cout << "]" << std::endl; + std::cout << "G: " << std::endl; + std::cout << "[ "; + for (int i=0; i < N; ++i) + { + std::cout << G[i] << " "; + } + std::cout << "]" << std::endl; +} + +/** + * @brief printLandmarks + * @param landmarks + * @param M + */ +void printLandmarks(DOUBLE *landmarks, int M) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(2) << std::setw(5) << std::endl << "Landmarks:" << std::endl; + std::cout << "[ "; + for (int i=0; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl << "[ "; + for (int i=1; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl; +} + +/** + * @brief printLandmarks + * @param landmarks + * @param M + */ +void printLandmarks(int *landmarks, int M) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(4) << std::setw(5) << std::endl << "Landmarks:" << std::endl; + std::cout << "[ "; + for (int i=0; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl << "[ "; + for (int i=1; i < 2*M; i+=2) + { + std::cout << landmarks[i] << " "; + } + std::cout << "]" << std::endl; +} + +/** + * @brief printTimingStats + * @param timings + */ +void printTimingStats(Timings &timings) +{ + std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(4) << std::setw(5) << std::endl + << "FLANDMARK Time statistics:" << std::endl + << "--------------------------" << std::endl + << "NF extraction: \t\t" << timings.normalizedFrame << " ms" << std::endl + << "Features comptation: \t\t" << timings.features << " ms" << std::endl + << "Maxsum solver: \t\t" << timings.maxsum << " ms" << std::endl + << "Overall time: \t\t\t" << timings.overall << " ms" << std::endl << std::endl; +} + +} + +#endif // __HELPERS_H__ diff --git a/examples/static_input.cpp b/examples/static_input.cpp index 6a9c3cc..d33e71c 100644 --- a/examples/static_input.cpp +++ b/examples/static_input.cpp @@ -23,16 +23,13 @@ #define SHOW_WINDOWS -using namespace std; -using namespace cv; -using namespace clandmark; /** Global variables */ //String face_cascade_name = "lbpcascade_frontalface.xml"; -String face_cascade_name = "haarcascade_frontalface_alt.xml"; -CascadeClassifier face_cascade; -string window_name = "flandmark - static input demo"; -RNG rng(12345); +cv::String face_cascade_name = "haarcascade_frontalface_alt.xml"; +cv::CascadeClassifier face_cascade; +std::string window_name = "flandmark - static input demo"; +cv::RNG rng(12345); cimg_library::CImg * cvImgToCImg(cv::Mat &cvImg) { @@ -57,19 +54,19 @@ cv::Mat & CImgtoCvImg(cv::Mat &result, cimg_library::CImg *img) } /** @function detectAndDisplay */ -void detectAndDisplay( Mat &frame, Flandmark *flandmark, CFeaturePool *featurePool) +void detectAndDisplay( cv::Mat &frame, clandmark::Flandmark *flandmark, clandmark::CFeaturePool *featurePool) { - std::vector faces; - Mat frame_gray; + std::vector faces; + cv::Mat frame_gray; int bbox[8]; - fl_double_t *landmarks; + clandmark::fl_double_t *landmarks; - cvtColor( frame, frame_gray, CV_BGR2GRAY ); + cv::cvtColor( frame, frame_gray, CV_BGR2GRAY ); // cvtColor( frame, frame_gray, COLOR_BGR2GRAY ); // <- OpenCV 3.0 //equalizeHist( frame_gray, frame_gray ); //-- Detect faces - face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); + face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30, 30) ); // face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) ); for( uint32_t i = 0; i < faces.size(); i++ ) @@ -97,21 +94,21 @@ void detectAndDisplay( Mat &frame, Flandmark *flandmark, CFeaturePool *featurePo // Draw bounding box and detected landmarks // rectangle(frame, Point(bbox[0], bbox[1]), Point(bbox[2], bbox[3]), Scalar(255, 0, 0)); - circle(frame, Point(int(landmarks[0]), int(landmarks[1])), 2, Scalar(255, 0, 0), -1); + cv::circle(frame, cv::Point(int(landmarks[0]), int(landmarks[1])), 2, cv::Scalar(255, 0, 0), -1); for (int i=2; i < 2*flandmark->getLandmarksCount(); i+=2) { - circle(frame, Point(int(landmarks[i]), int(landmarks[i+1])), 2, Scalar(0, 0, 255), -1); + cv::circle(frame, cv::Point(int(landmarks[i]), int(landmarks[i+1])), 2, cv::Scalar(0, 0, 255), -1); } // Textual output - printTimingStats(flandmark->timings); - printLandmarks(landmarks, flandmark->getLandmarksCount()); - printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); + clandmark::printTimingStats(flandmark->timings); + clandmark::printLandmarks(landmarks, flandmark->getLandmarksCount()); + clandmark::printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); } //-- Show what you got #ifdef SHOW_WINDOWS - imshow( window_name, frame ); + cv::imshow( window_name, frame ); #endif } @@ -120,27 +117,27 @@ int main( int argc, const char** argv ) { if (argc < 4) { - cerr << "Usage: static_input []" << endl; + std::cerr << "Usage: static_input []" << std::endl; return -1; } double tim; - Mat image; + cv::Mat image; //Flandmark *flandmark = new Flandmark(); - tim = (double)getTickCount(); + tim = (double)cv::getTickCount(); - Flandmark *flandmark = Flandmark::getInstanceOf(argv[2]); + clandmark::Flandmark *flandmark = clandmark::Flandmark::getInstanceOf(argv[2]); if (!flandmark) { - cerr << "Usage: static_input []" << endl; + std::cerr << "Usage: static_input []" << std::endl; return -1; } - CFeaturePool *featurePool = new CFeaturePool(flandmark->getBaseWindowSize()[0], flandmark->getBaseWindowSize()[1]); + clandmark::CFeaturePool *featurePool = new clandmark::CFeaturePool(flandmark->getBaseWindowSize()[0], flandmark->getBaseWindowSize()[1]); featurePool->addFeaturesToPool( - new CSparseLBPFeatures( + new clandmark::CSparseLBPFeatures( featurePool->getWidth(), featurePool->getHeight(), featurePool->getPyramidLevels(), @@ -150,9 +147,9 @@ int main( int argc, const char** argv ) flandmark->setNFfeaturesPool(featurePool); - tim = ((double)getTickCount() - tim)/getTickFrequency() * 1000; + tim = ((double)cv::getTickCount() - tim)/cv::getTickFrequency() * 1000; - cout << "Flandmark model loaded in " << tim << " ms" << endl; + std::cout << "Flandmark model loaded in " << tim << " ms" << std::endl; //-- 1. Load the cascades if( !face_cascade.load( argv[1]+face_cascade_name ) ) @@ -162,27 +159,27 @@ int main( int argc, const char** argv ) }; #ifdef SHOW_WINDOWS - namedWindow(window_name, CV_WINDOW_KEEPRATIO); + cv::namedWindow(window_name, CV_WINDOW_KEEPRATIO); // //namedWindow(window_name, WINDOW_KEEPRATIO); #endif // Read input image - image = imread(argv[3]); + image = cv::imread(argv[3]); if (!image.empty()) { detectAndDisplay( image, flandmark, featurePool ); } else { - cout << "Wrong input." << endl; + std::cout << "Wrong input." << std::endl; } if (argc > 4) { - imwrite(argv[4], image); + cv::imwrite(argv[4], image); } #ifdef SHOW_WINDOWS - waitKey(); + cv::waitKey(); #endif delete featurePool; diff --git a/examples/video_input.cpp b/examples/video_input.cpp index b21c6d5..7c764ee 100644 --- a/examples/video_input.cpp +++ b/examples/video_input.cpp @@ -21,15 +21,13 @@ #include "Flandmark.h" #include "helpers.h" -using namespace std; -using namespace cv; -using namespace clandmark; + /** Global variables */ -String face_cascade_name = "haarcascade_frontalface_alt.xml"; -CascadeClassifier face_cascade; -string window_name = "flandmark - video input"; -RNG rng(12345); +cv::String face_cascade_name = "haarcascade_frontalface_alt.xml"; +cv::CascadeClassifier face_cascade; +std::string window_name = "flandmark - video input"; +cv::RNG rng(12345); cimg_library::CImg * cvImgToCImg(cv::Mat &cvImg) @@ -45,7 +43,7 @@ cimg_library::CImg * cvImgToCImg(cv::Mat &cvImg) cv::Mat & CImgtoCvImg(cv::Mat &result, cimg_library::CImg *img) { - result = cv::Mat(img->height(), img->width(), CV_8U); + result = cv::Mat(img->height(), img->width(), CV_8U); for (int x=0; x < result.cols; ++x) for (int y=0; y < result.rows; ++y) @@ -55,20 +53,20 @@ cv::Mat & CImgtoCvImg(cv::Mat &result, cimg_library::CImg *img) } /** @function detectAndDisplay */ -void detectAndDisplay( Mat &frame, Flandmark *flandmark) +void detectAndDisplay( cv::Mat &frame, clandmark::Flandmark *flandmark) { - std::vector faces; - Mat frame_gray; + std::vector faces; + cv::Mat frame_gray; // int bbox[4]; int bbox[8]; - fl_double_t *landmarks; + clandmark::fl_double_t *landmarks; - cvtColor( frame, frame_gray, CV_BGR2GRAY ); + cv::cvtColor( frame, frame_gray, CV_BGR2GRAY ); // cvtColor( frame, frame_gray, COLOR_BGR2GRAY ); - equalizeHist( frame_gray, frame_gray ); + cv::equalizeHist( frame_gray, frame_gray ); //-- Detect faces - face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); + face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, cv::Size(30, 30) ); // face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) ); // CImage *frm_gray = new CImage(); @@ -96,17 +94,17 @@ void detectAndDisplay( Mat &frame, Flandmark *flandmark) landmarks = flandmark->getLandmarks(); // Draw bounding box and detected landmarks -// rectangle(frame, Point(bbox[0], bbox[1]), Point(bbox[2], bbox[3]), Scalar(255, 0, 0)); - circle(frame, Point(int(landmarks[0]), int(landmarks[1])), 2, Scalar(255, 0, 0), -1); +// cv::Rectangle(frame, Point(bbox[0], bbox[1]), Point(bbox[2], bbox[3]), Scalar(255, 0, 0)); + cv::circle(frame, cv::Point(int(landmarks[0]), int(landmarks[1])), 2, cv::Scalar(255, 0, 0), -1); for (int i=2; i < 2*flandmark->getLandmarksCount(); i+=2) { - circle(frame, Point(int(landmarks[i]), int(landmarks[i+1])), 2, Scalar(0, 0, 255), -1); + cv::circle(frame, cv::Point(int(landmarks[i]), int(landmarks[i+1])), 2, cv::Scalar(0, 0, 255), -1); } // Textual output - printTimingStats(flandmark->timings); - printLandmarks(landmarks, flandmark->getLandmarksCount()); - printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); + clandmark::printTimingStats(flandmark->timings); + clandmark::printLandmarks(landmarks, flandmark->getLandmarksCount()); + clandmark::printLandmarks(flandmark->getLandmarksNF(), flandmark->getLandmarksCount()); } // delete frm_gray; @@ -114,39 +112,42 @@ void detectAndDisplay( Mat &frame, Flandmark *flandmark) /** @function main */ int main( int argc, const char** argv ) + { + std::cout << "DEBUG" << std::endl; + if (argc < 5) { - cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << endl; + std::cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << std::endl; return -1; } //CvCapture* capture = 0x0; //CvVideoWriter* writer = 0x0; - VideoCapture capture; - VideoWriter writer; + cv::VideoCapture capture; + cv::VideoWriter writer; - Mat frame; + cv::Mat frame; double tic; int camID = -1; - string str_type = argv[3]; + std::string str_type = argv[3]; int type = -1; bool saveoutput = false; - string out_fname; + std::string out_fname; - Flandmark *flandmark = Flandmark::getInstanceOf(argv[2]); + clandmark::Flandmark *flandmark = clandmark::Flandmark::getInstanceOf(argv[2]); if (!flandmark) { - cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << endl; + std::cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << std::endl; return -1; } //-- 1. Load the cascades if( !face_cascade.load( argv[1]+face_cascade_name ) ) { - cerr << "Couldn't load the haar cascade. Exiting..." << endl; + std::cerr << "Couldn't load the haar cascade. Exiting..." << std::endl; return -1; }; @@ -171,14 +172,14 @@ int main( int argc, const char** argv ) capture.open(argv[4]); break; default: - cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << endl; + std::cerr << "Usage: video_input { cam | vid } [ filename | cam_id ] [ output_filename ]" << std::endl; return -1; break; } if (!capture.isOpened()) { - cerr << "Could not open the video input. Exiting..." << endl; + std::cerr << "Could not open the video input. Exiting..." << std::endl; return -1; } @@ -186,7 +187,7 @@ int main( int argc, const char** argv ) if (frame.empty()) { - cerr << "Unable to read frame. Exiting..." << endl; + std::cerr << "Unable to read frame. Exiting..." << std::endl; return -1; } @@ -203,14 +204,14 @@ int main( int argc, const char** argv ) //CV_FOURCC('M', 'J', 'P', 'G'), capture.get(CV_CAP_PROP_FPS), // capture.get(CAP_PROP_FPS), - Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)) + cv::Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT)) // Size(capture.get(CAP_PROP_FRAME_WIDTH), capture.get(CAP_PROP_FRAME_HEIGHT)) ); } } // window - namedWindow(window_name, CV_WINDOW_KEEPRATIO); + cv::namedWindow(window_name, CV_WINDOW_KEEPRATIO); // namedWindow(window_name, WINDOW_KEEPRATIO); //-- 2. Read the video stream @@ -218,7 +219,7 @@ int main( int argc, const char** argv ) { while( true ) { - tic = (double)getTickCount(); + tic = (double)cv::getTickCount(); capture >> frame; @@ -227,17 +228,17 @@ int main( int argc, const char** argv ) { detectAndDisplay( frame, flandmark ); - tic = ((double)getTickCount() - tic)/getTickFrequency() * 1000; + tic = ((double)cv::getTickCount() - tic)/cv::getTickFrequency() * 1000; - stringstream fps; - fps << "fps: " << setprecision(4) << setw(4) << 1000.0 / tic << " "; - putText(frame, fps.str(), Point(10, 25), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 0)); + std::stringstream fps; + fps << "fps: " << std::setprecision(4) << std::setw(4) << 1000.0 / tic << " "; + cv::putText(frame, fps.str(), cv::Point(10, 25), CV_FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 0)); // putText(frame, fps.str(), Point(10, 25), FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 0)); imshow( window_name, frame ); } else { - cerr << "No frame --- break." << endl; + std::cerr << "No frame --- break." << std::endl; break; } @@ -246,7 +247,7 @@ int main( int argc, const char** argv ) writer << frame; } - int c = waitKey(10); + int c = cv::waitKey(10); if( (char)c == 'c' ) { break; diff --git a/learning/bmrm/bmrmconstr2.m b/learning/bmrm/bmrmconstr2.m new file mode 100644 index 0000000..57b5542 --- /dev/null +++ b/learning/bmrm/bmrmconstr2.m @@ -0,0 +1,356 @@ +function [W, S, C]= bmrmconstr2(Data,risk,lambda, Aineq, bineq, C, Opt) +% BMRMCONSTR Bundle Method for regularized Risk Minimization. +% +% Synopsis: +% [W,Stat,Cpm] = bmrmconstr( Data, risk, lambda, Aineq, bineq, ) +% [W,Stat,Cpm] = bmrmconstr( Data, risk, lambda, Aineq, bineq, Cpm ) +% [W,Stat,Cpm] = bmrmconstr( Data, risk, lambda, Aineq, bineq, Cpm, Options ) +% +% Description: +% This function minimizes a quadraticaly regularized convex risk, i.e.: +% +% Fp(W) = 0.5*lambda*W'*W + risk( Data, W ) +% +% subject to +% +% Aineq*W >= bineq +% +% where risk(data,W) is an arbitrary convex function of W. BMRMCONSTR requires +% a function to evaluate R and its subgradient at W. This function is +% expected as the second argument "risk". The calling syntax is +% +% [ Fval, subgrad ] = risk( Data) +% [ Fval, subgrad ] = risk( Data, W ) +% +% which returns function value and subgradient evaluated at W. +% Calling risk( Data) without the argument W assumes that W equals to +% zero vector which is used by BMRMCONSTR to get dimension of parameter +% vector. +% +% This algorithm is a slight modification of Teo et al.: A Scalable Modular +% Convex Solver for Regularized Risk Minimization, KDD, 2007 +% +% Inputs: +% Data [anything] Data. +% risk [function] Risk function (function pointer). +% lambda [1x1] Regularization parameter. +% Aineq [nConstr x nDim] linear constraitns +% bineq [nConstr x 1] +% Cpm [struct] Initial cutting plane model (default []). +% +% Opt [struct] +% .tolRel [1x1] Relative tolerance (default 1e-3). The solver halts +% if Fp-Fd <= tolRel*Fp holds where Fd is the lower bound +% of Fp(W_optimal). +% .tolAbs [1x1] Absolute tolerance (default 0). The solver halts +% if Fp-Fd <= tolAbs. +% .maxIter [1x1] Maximal number of iterations (default inf). The solver +% halts if nIter >= maxIter . +% .bufSize [1x1] Allocate memory for bufSize cutting planes (default 500). +% .useCplex [1x1] If 1 use CPLEXQP solver otherwise LIBQP_CPLX is used +% (default 0). +% .verb [1x1] if 1 print progress status (default 1). +% +% Outputs: +% W [nDim x 1] Solution vector. +% Stat [struct] +% .Fp [1x1] Primal objective value. +% .Fd [1x1] Reduced (dual) objective value. +% .nIter [1x1] Number of iterations. +% +% + +% 2015-07-12, MU (time measurements that works with threads) +% 2015-06-25, Michal Uricar (bufSize fix + store intermediate solution after each iteration) +% 2015-06-20, VF +% 2010-04-12, Vojtech Franc + + %% +% startTime = cputime; + startTime = clock; + + % default options + if nargin < 7, Opt = []; end + if ~isfield(Opt,'tolRel'), Opt.tolRel = 1e-3; end + if ~isfield(Opt,'tolAbs'), Opt.tolAbs = 0; end + if ~isfield(Opt,'maxIter'), Opt.maxIter = inf; end + if ~isfield(Opt,'verb'), Opt.verb = 1; end + if ~isfield(Opt,'bufSize'), Opt.bufSize = 500; end + if ~isfield(Opt,'useCplex'), Opt.useCplex = 0; end + + if ~isfield(Opt,'saveProgress'),Opt.saveProgress = true; end + if ~isfield(Opt,'outName'), Opt.outName = 'W_CONSTRBMRM.mat'; end + if ~isfield(Opt,'saveAfter'), Opt.saveAfter = 10; end + + %% "S"state variables + S = []; + S.Fp = nan; + S.Fd = nan; + S.risk = nan; + S.nIter = 0; + S.nP = 0; % number of primal variables + S.nD = 0; % number of dual variables + S.exitflag = -1; + S.timing.qpsolver = 0; + S.timing.risk = 0; + S.timing.hessian = 0; + S.timing.wtime = 0; +% S.timing.runtime = cputime-startTime; + S.timing.runtime = etime(clock, startTime); + + %% use no constraints by default + if nargin < 5 + Aineq = []; + bineq = []; + end + + %% start from given cutting plane model or if not given allocate memory for (NOTE: Here should be possibility to enlarge the capacity of cutting plane model if BufSize allows) + % a new one and compute the first CP at W=0 + if nargin >= 6 & ~isempty( C ) + + S.nP = size( C.A, 1); + S.nD = C.nCp + C.nConstr; + + else + + %% + S.nIter = 1; + + %% compute risk and its subgradient at zero +% t0 = cputime; + t0 = clock; + [S.risk,subgrad] = risk( Data ); +% S.timing.risk = cputime-t0; + S.timing.risk = etime(clock, t0); + S.Fp = S.risk; + S.nP = length(subgrad); + + %% check if subgradient at W=0 is a zero vector in which case the + % solution is trivial, i.e. W = 0; + if all( subgrad ==0 ), + S.exitflag = 1; + W = zeros( S.nP, 1 ); + return; + end + + %% get number of constraints + if isempty( Aineq ) + C.nConstr = 0; + else + C.nConstr = size( Aineq,1); + if size( Aineq, 2 ) ~= S.nP | length( bineq ) ~= C.nConstr + error('Arguments Aineq and bineq have wrong dimensions.'); + end + + % adjust bufSize appropriately + Opt.bufSize = Opt.bufSize + C.nConstr; + end + + %% allocate memory for cutting planes and for hessian + if issparse(subgrad), + C.A = sparse(S.nP, Opt.bufSize); + else + C.A = zeros(S.nP, Opt.bufSize); + end + C.b = zeros( Opt.bufSize, 1); + C.H = zeros( Opt.bufSize, Opt.bufSize); + + if C.nConstr > 0 +% C.A(:,1:C.nConstr) = Aineq'; + C.A(:,1:C.nConstr) = -Aineq'; + C.b(1:C.nConstr) = bineq; + end + C.A(:,C.nConstr+1) = subgrad; + C.b(C.nConstr+1) = S.risk % - W'*subgrad; + C.nCp = 1; + + S.nD = C.nCp + C.nConstr; +% t0 = cputime; + t0 = clock; +% C.H(1:S.nD,1:S.nD) = C.A(:,1:S.nD)'*C.A(:,1:S.nD); % slow as hell +% C.H(1:S.nD,1:S.nD) = multATB(C.A, C.A, S.nD, S.nD, S.np, 1.0, 0); %C.A(:,1:S.nD)'*C.A(:,1:S.nD); + C.H(1:S.nD, 1:S.nD) = mxMultATB(C.A, C.A, S.nD, S.nD, S.nP, 1.0, 0); +% S.timing.hessian = cputime - t0; + S.timing.hessian = etime(clock, t0); + end + + %% + if Opt.verb + fprintf('Cutting plane buffer : %d (%fMB)\n', Opt.bufSize, Opt.bufSize*S.nP*8/1024^2); + fprintf('Hessian buffer : %f MB\n' , Opt.bufSize^2 * 8/1024^2); + fprintf('Number of constraints: %d\n' , C.nConstr ); + fprintf('Number of weights : %d\n' , S.nP ); + + fprintf('%4d: tim=%.3f, Fp=%f, Fd=%f, R=%f\n', ... + S.nIter, S.timing.runtime(end), S.Fp(end), S.Fd(end), S.risk(end) ); + end + + + %% main loop + alpha = []; + while S.exitflag == -1 + + %% + S.nIter = S.nIter + 1; + + %% solve reduced problem +% t0 = cputime; + t0 = clock; + + % if b is zero vector then the optimum is also zero vector => QP + % doesn't need to be called + if all( C.b(1:S.nD) == 0 ) + alpha = zeros( S.nD,1); + Fd = 0; + else + + if Opt.useCplex + Aeq = [zeros(1,C.nConstr) ones(1,C.nCp)]; + beq = 1/sqrt(lambda); + lb = zeros( S.nD, 1 ); + f = -C.b(1:S.nD)*sqrt(lambda); +% f = C.b(1:S.nD)*(-sqrt(lambda)); + [alpha, fval] = cplexqp( C.H(1:S.nD,1:S.nD), f, [], [], Aeq, beq, lb ); + Fd = -fval; + else + + f = -C.b(1:S.nD)*sqrt(lambda); +% f = C.b(1:S.nD)*(-sqrt(lambda)); + b = [1e12*ones(1,C.nConstr) 1/sqrt(lambda)]; + I = [1:C.nConstr (C.nConstr+1)*ones(1,C.nCp)]; + E = [ones(1,C.nConstr) 0]; + + if isempty(alpha) + [alpha,Stat] = libqp_splx( C.H(1:S.nD,1:S.nD), f, b, I, E ); + else + [alpha,Stat] = libqp_splx( C.H(1:S.nD,1:S.nD), f, b, I, E, [alpha ; 0]); + end + Fd = -Stat.QP; + end + end +% S.timing.qpsolver(S.nIter) = cputime-t0; + S.timing.qpsolver(S.nIter) = etime(clock, t0); + S.nnzD = sum(alpha > 0); + + %% update primal solution +% t0 = cputime; + t0 = clock; +% W = -C.A(:,1:S.nD)*(alpha/sqrt(lambda)); +% W = C.A(:,1:S.nD)*(-alpha/sqrt(lambda)); % slow as hell +% W = multAx(-1/sqrt(lambda), C.A, S.nP, S.nD, alpha, 0); + W = mxMultAx(-1/sqrt(lambda), C.A, S.nP, S.nD, alpha, 0); +% S.timing.wtime(S.nIter) = cputime - t0; + S.timing.wtime(S.nIter) = etime(clock, t0); + + + %% compute value and subgradient of risk at W +% t0 = cputime; + t0 = clock; + [R, subgrad] = risk( Data, W); +% S.timing.risk( S.nIter) = cputime-t0; + S.timing.risk( S.nIter) = etime(clock, t0); + + %% evaluate primal objective + Fp = R + 0.5*lambda*norm(W)^2; + + %% keep number of cutting planes <= bufSize - 1 + bufSize = size( C.A, 2 ); + if C.nCp + C.nConstr == bufSize + + zeroAlpha = 1e-8; + idx1 = find( alpha' > zeroAlpha | [1:bufSize] <= C.nConstr ); + nActCp = length( idx1 ); + + if nActCp == bufSize + %% create one free slot by aggregating two last added CPs + idx1 = [1:C.nConstr+1 C.nConstr+3:bufSize]; + + a1 = alpha(C.nConstr+1); + a2 = alpha(C.nConstr+2); + C.A(:,C.nConstr+1) = (a1*C.A(:,C.nConstr+1) + a2*C.A(:, C.nConstr+2))/(a1+a2); + C.b(C.nConstr+1) = (a1*C.b(C.nConstr+1) + a2*C.b(C.nConstr+2))/(a1+a2); + + C.H(:,C.nConstr+1) = C.A(:,C.nConstr+1)'*C.A; + C.H(C.nConstr+1,:) = C.H(:,C.nConstr+1)'; + + alpha(C.nConstr+1) = a1+a2; + + nActCp = nActCp - 1; + end + + idx2 = [1:nActCp]; + C.A(:, idx2) = C.A(:, idx1); + C.b(idx2) = C.b(idx1); + C.H(idx2,idx2) = C.H(idx1,idx1); + + C.nCp = nActCp - C.nConstr; + S.nD = C.nCp + C.nConstr; + + alpha(idx2) = alpha(idx1); + alpha = alpha(1:S.nD); + + end + + %% update CP buffer and Hessian + C.nCp = C.nCp + 1; + S.nD = S.nD + 1; + + C.A(:,S.nD) = subgrad; + C.b(S.nD) = R - C.A(:,S.nD)'*W; % fast +% C.b(S.nD) = R + (C.A(:,S.nD)'*(-W)); + +% t0 = cputime; + t0 = clock; + if issparse(subgrad) + C.H(1:S.nD,S.nD) = full( C.A(:,1:S.nD)'*C.A(:,S.nD)); + else +% C.H(1:S.nD,S.nD) = C.A(:,1:S.nD)'*C.A(:,S.nD); % slow as hell + C.H(1:S.nD, S.nD) = mxMultATx(1, C.A, S.nP, S.nD, C.A(:, S.nD), 0); + end + C.H(S.nD,1:S.nD-1) = C.H(1:S.nD-1,S.nD)'; +% S.timing.hessian(S.nIter) = cputime-t0; + S.timing.hessian(S.nIter) = etime(clock, t0); + + %% eval stopping conditions + if Fp-Fd <= Opt.tolRel*abs(Fp) | Fp-Fd <= Opt.tolAbs + S.exitflag = 1; + elseif S.nIter >= Opt.maxIter + S.exitflag = 0; + end + + %% + S.Fp(S.nIter) = Fp; + S.Fd(S.nIter) = Fd; + S.risk(S.nIter) = R; +% S.timing.runtime(S.nIter) = cputime-startTime; + S.timing.runtime(S.nIter) = etime(clock, startTime); + + %% + if (mod(S.nIter, Opt.verb) == 0 || exitflag ~= -1) & Opt.verb ~= 0 + fprintf(['%4d: tim=%.3f, Fp=%f, Fd=%f, (Fp-Fd)=%f, (Fp-Fd)/Fp=%f, ' ... + 'R=%f, nCp=%3d, nDualVar=%3d, nzDual=%3d, timrisk=%f, timw=%f, timqp=%f, timhes=%f\n'], ... + S.nIter, S.timing.runtime(end), ... + Fp, Fd, Fp-Fd,(Fp-Fd)/Fp, R, C.nCp, S.nD, S.nnzD, ... + S.timing.risk(end), S.timing.wtime(end), ... + S.timing.qpsolver(end), S.timing.hessian(end)); + end + + + %% save intermediate solution + if (Opt.saveProgress && mod(S.nIter, Opt.saveAfter) == 0) + save(['__progress__' Opt.outName], 'W', 'S', 'C', '-v7.3'); % -v7.3 switch for large sized MAT-files + end; + + end + + %% + if Opt.verb + fprintf('Accumulated times\n'); + fprintf('risk time : %f\n', sum( S.timing.risk )); + fprintf('qptime : %f\n', sum( S.timing.qpsolver )); + fprintf('hessian time : %f\n', sum( S.timing.hessian )); + fprintf('w time : %f\n', sum( S.timing.wtime )); + fprintf('total runtime : %f \n', S.timing.runtime(end) ); + end + +return; diff --git a/learning/bmrm/compile_mex.m b/learning/bmrm/compile_mex.m new file mode 100644 index 0000000..ba289ea --- /dev/null +++ b/learning/bmrm/compile_mex.m @@ -0,0 +1,28 @@ +%% bmrm_compile_mex.m +% Compiles helper functions for a significant speed-ups in BMRMCONSTR2. +% +% +% 2016-01-07, Michal Uricar + +% clc; +clearvars; close all; + +% Setup paths accpording to system platform +if (isunix) + mex -v -largeArrayDims mxMultATB.cpp -lmwblas -output mxMultATB + mex -v -largeArrayDims mxMultATx.cpp -lmwblas -output mxMultATx + mex -v -largeArrayDims mxMultAx.cpp -lmwblas -output mxMultAx +end; + +if (ispc) + blaslib = fullfile(matlabroot, 'extern', 'lib', computer('arch'), 'microsoft', 'libmwblas.lib'); + mex('-v', '-largeArrayDims', 'mxMultATB.cpp', blaslib); + mex('-v', '-largeArrayDims', 'mxMultATx.cpp', blaslib); + mex('-v', '-largeArrayDims', 'mxMultAx.cpp', blaslib); +end; + +if (ismac) + % TODO +end; + +fprintf('Compilation finished.\n'); diff --git a/learning/bmrm/mxMultATB.cpp b/learning/bmrm/mxMultATB.cpp new file mode 100644 index 0000000..bb041ec --- /dev/null +++ b/learning/bmrm/mxMultATB.cpp @@ -0,0 +1,69 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Written (W) 2016 Michal Uricar + * Copyright (C) 2016 Michal Uricar + */ + +#if !defined(_WIN32) +#define dgemm dgemm_ +#endif + +#include "mex.h" +#include "blas.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + if (nlhs != 1 || nrhs != 7) + { + mexErrMsgTxt("mxMultATB: wrong I/O.\n" + "Usage: \n" + "c = mxMultATB(A, B, m, n, k, alpha, beta);\n" + "c := alpha * A' * B + beta * C \n" + "A [k x m (double)] \n" + "B [k x n (double)] \n"); + } + + char *chn = "N"; + char *cht = "T"; + + double* A = (double*)mxGetData(prhs[0]); + double* B = (double*)mxGetData(prhs[1]); + double m = mxGetScalar(prhs[2]); + long int M = (int)m; + double n = mxGetScalar(prhs[3]); + long int N = (int)n; + double k = mxGetScalar(prhs[4]); + long int K = (int)k; + double alpha = mxGetScalar(prhs[5]); + double beta = mxGetScalar(prhs[6]); + + long int lda = K; + long int ldb = K; + long int ldc = M; + + plhs[0] = mxCreateNumericMatrix(M, N, mxDOUBLE_CLASS, mxREAL); + double* C = (double*)mxGetData(plhs[0]); + + dgemm(cht, chn, &M, &N, &K, &alpha, A, &lda, B, &ldb, &beta, C, &ldc); +} + +//extern void dgemm( +// char *transa, +// char *transb, +// ptrdiff_t *m, +// ptrdiff_t *n, +// ptrdiff_t *k, +// double *alpha, +// double *a, +// ptrdiff_t *lda, +// double *b, +// ptrdiff_t *ldb, +// double *beta, +// double *c, +// ptrdiff_t *ldc +//); + diff --git a/learning/bmrm/mxMultATx.cpp b/learning/bmrm/mxMultATx.cpp new file mode 100644 index 0000000..43caaa9 --- /dev/null +++ b/learning/bmrm/mxMultATx.cpp @@ -0,0 +1,67 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Written (W) 2016 Michal Uricar + * Copyright (C) 2016 Michal Uricar + */ + +#if !defined(_WIN32) +#define dgemm dgemm_ +#endif + +#include "mex.h" +#include "blas.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + if (nlhs != 1 || nrhs != 6) + { + mexErrMsgTxt("mxMultATx: wrong I/O.\n" + "Usage: \n" + "y = mxMultATx(alpha, A, m, n, x, beta);\n" + "y := alpha A' * x + beta * y \n" + "A [m x n (double)] \n" + "x [m x 1 (double)] \n"); + } + + char *chn = "N"; + char *cht = "T"; + + double alpha = mxGetScalar(prhs[0]); + double* A = (double*)mxGetData(prhs[1]); + double m = mxGetScalar(prhs[2]); + long int M = (int)m; + double n = mxGetScalar(prhs[3]); + long int N = (int)n; + double* x = (double*)mxGetData(prhs[4]); + double beta = mxGetScalar(prhs[5]); + + long int lda = M; + long int incx = 1; + long int incy = 1; + + plhs[0] = mxCreateNumericMatrix(N, 1, mxDOUBLE_CLASS, mxREAL); + double* y = (double*)mxGetData(plhs[0]); + + dgemv(cht, &M, &N, &alpha, A, &lda, x, &incx, &beta, y, &incy); +} + +///* Source: dgemv.f */ +//#define dgemv FORTRAN_WRAPPER(dgemv) +//extern void dgemv( +// char *trans, +// ptrdiff_t *m, +// ptrdiff_t *n, +// double *alpha, +// double *a, +// ptrdiff_t *lda, +// double *x, +// ptrdiff_t *incx, +// double *beta, +// double *y, +// ptrdiff_t *incy +//); + diff --git a/learning/bmrm/mxMultAx.cpp b/learning/bmrm/mxMultAx.cpp new file mode 100644 index 0000000..35aec29 --- /dev/null +++ b/learning/bmrm/mxMultAx.cpp @@ -0,0 +1,68 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Written (W) 2016 Michal Uricar + * Copyright (C) 2016 Michal Uricar + */ + +#if !defined(_WIN32) +#define dgemm dgemm_ +#endif + +#include "mex.h" +#include "blas.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + if (nlhs != 1 || nrhs != 6) + { + mexErrMsgTxt("mxMultAx: wrong I/O.\n" + "Usage: \n" + "y = mxMultAx(alpha, A, m, n, x, beta); \n" + "y := alpha * A * x + beta * y \n" + "A [m x n (double)] \n" + "x [m x 1 (double)] \n"); + } + + char *chn = "N"; + char *cht = "T"; + + double* A = (double*)mxGetData(prhs[1]); + double alpha = mxGetScalar(prhs[0]); + double m = mxGetScalar(prhs[2]); + long int M = (int)m; + double n = mxGetScalar(prhs[3]); + long int N = (int)n; + double* x = (double*)mxGetData(prhs[4]); + double beta = mxGetScalar(prhs[5]); + + long int lda = M; + long int incx = 1; + long int incy = 1; + + plhs[0] = mxCreateNumericMatrix(M, 1, mxDOUBLE_CLASS, mxREAL); + double* y = (double*)mxGetData(plhs[0]); + +// cblas_dgemv(CblasColMajor, CblasNoTrans, M, N, alpha, A, lda, x, incx, beta, y, incy); + dgemv(chn, &M, &N, &alpha, A, &lda, x, &incx, &beta, y, &incy); +} + +///* Source: dgemv.f */ +//#define dgemv FORTRAN_WRAPPER(dgemv) +//extern void dgemv( +// char *trans, +// ptrdiff_t *m, +// ptrdiff_t *n, +// double *alpha, +// double *a, +// ptrdiff_t *lda, +// double *x, +// ptrdiff_t *incx, +// double *beta, +// double *y, +// ptrdiff_t *incy +//); + diff --git a/learning/mv_parallel/MAT/A.mat b/learning/mv_parallel/MAT/A.mat new file mode 100644 index 0000000..318cf44 Binary files /dev/null and b/learning/mv_parallel/MAT/A.mat differ diff --git a/learning/mv_parallel/MAT/transform_F2learning.m b/learning/mv_parallel/MAT/transform_F2learning.m new file mode 100644 index 0000000..2b8df86 --- /dev/null +++ b/learning/mv_parallel/MAT/transform_F2learning.m @@ -0,0 +1,100 @@ +%% trnasform_F2learning.m +% +% +% 2016-01-15, Michal Uricar + +clc; +close all; +clearvars; + +%% Timestamp + +fprintf(1,'Started on %s\n\n', datestr(now)); + +%% User Settings + +CLANDMARK_PATH = '/path2/clandmark/'; +image_path = '/path2/Faces/'; + +%% Add paths + +addpath('../functions/'); +addpath([CLANDMARK_PATH 'matlab_interface/']); +addpath([CLANDMARK_PATH 'matlab_interface/mex/']); +addpath([CLANDMARK_PATH 'matlab_interface/functions/']); + +%% A + +A.views = {'-profile', '-half-profile', 'frontal', 'half-profile', 'profile'}; +A.visible_subset = { + [1 2 3 7 8 9 12 13 14 17 18 19 21] % -profile + [1 2 3 4 5 6 7 8 9 10 11 12 13 14 17 18 19 20 21] % -half-profile + [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21] % frontal + [1 2 3 4 5 6 7 8 9 10 11 14 15 16 17 18 19 20 21] % half-profile + [ 4 5 6 9 10 11 14 15 16 18 19 20 21] % profile +}; + +PHIS = numel(A.views); + +save('../MAT/A.mat', 'A', 'PHIS'); + +%% Init flandmark pool + +flandmark_pool = cell(PHIS, 1); + +FLANDMARK_INIT_FILE = { + '../model/JOINT_MV_SPLIT_1_-PROFILE_init.xml' + '../model/JOINT_MV_SPLIT_1_-HALF-PROFILE_init.xml' + '../model/JOINT_MV_SPLIT_1_FRONTAL_init.xml' + '../model/JOINT_MV_SPLIT_1_HALF-PROFILE_init.xml' + '../model/JOINT_MV_SPLIT_1_PROFILE_init.xml' +}; + +for phi = 1 : PHIS + flandmark_pool{phi} = flandmark_class(FLANDMARK_INIT_FILE{phi}, true); +end; + +% Feature Pool +bw = flandmark_pool{1}.getBWsize(); +featuresPool = featuresPool_class(bw(1), bw(2)); +featuresPool.addLBPSparseFeatures(); +for phi = 1 : PHIS + flandmark_pool{phi}.setFeaturesPool(featuresPool.getHandle); +end; + +%% models + +models = cell(PHIS, 1); +for phi = 1 : PHIS + models{phi}.ss = flandmark_pool{phi}.getNodesSearchSpaces(); + models{phi}.components = flandmark_pool{phi}.getNodesWindowSizes(); + models{phi}.bw = flandmark_pool{phi}.getBWsize(); + models{phi}.M = flandmark_pool{phi}.getLandmarksCount(); + models{phi}.Woffsets = flandmark_pool{phi}.getWoffsets(); + models{phi}.nodeWdims = flandmark_pool{phi}.getNodesDimensions(); + models{phi}.edgeWdims = flandmark_pool{phi}.getEdgesDimensions(); + models{phi}.view = A.views{phi}; + models{phi}.L = repmat({ones(models{phi}.bw')}, 1, models{phi}.M); +end; + +%% Prepare training data (i.e. obtain normalized frames, ground truth annotations in them and normalization constants) + +viewID = find(strcmp('frontal', A.views)); + +SPLIT = 'SPLIT_1'; + +% load(['TRN_' SPLIT '.mat']); +load(['../data/F_TRN.mat']); + +[Images, GTs, Yaws, kappas] = jointmv_prepareImagesGT(flandmark_pool{viewID}, models, A, F, image_path); +save(['data_TRN_' SPLIT '.mat'], 'Images', 'GTs', 'Yaws', 'kappas'); + +% load(['VAL_' SPLIT '.mat']); +load(['../data/F_VAL.mat']); + +[VALImages, VALGTs, VALYaws, VALkappas] = jointmv_prepareImagesGT(flandmark_pool{viewID}, models, A, F, image_path); +save(['data_VAL_' SPLIT '.mat'], 'VALImages', 'VALGTs', 'VALYaws', 'VALkappas'); + +%% Timestamp + +fprintf(1,'Finished on %s\n\n', datestr(now)); diff --git a/learning/mv_parallel/functions/compute_err_mv_b_flandmark.m b/learning/mv_parallel/functions/compute_err_mv_b_flandmark.m new file mode 100644 index 0000000..4644177 --- /dev/null +++ b/learning/mv_parallel/functions/compute_err_mv_b_flandmark.m @@ -0,0 +1,77 @@ +function [ Output ] = compute_err_mv_b_flandmark( W, data, flandmark_pool, featuresPool ) +%COMPUTE_ERR_MV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here + + N = data.nImages; + PHIS = data.PHIS; + + for phi = 1 : PHIS + from = data.options{phi}.from; + to = data.options{phi}.to; + flandmark_pool{phi}.setW(W(from:to)); + end; + + biasFrom = data.options{end}.to+1; + if biasFrom > numel(W) + biasW = zeros(PHIS, 1); + else + biasW = W(biasFrom:end); + end; + +% E = inf(N, 1); + E = 0; + correctYaw = false(data.nImages, 1); + ErrOnCorrYaw = inf(data.nImages, 1); + y = cell(PHIS, 1); + S = nan(PHIS, 1); + + lastPrint = 0; + for i = 1 : N + + GT = data.GTs{i}; + + featuresPool.setFeaturesRaw(1, data.NFfeatures{i}); +% P = flandmark.detect_base_optimizedFromPool(); + for phi = 1 : PHIS + [y{phi}, S(phi)] = flandmark_pool{phi}.detect_base_optimizedFromPool(); + if strcmp(data.options{phi}.view, data.Yaws{i}) + GT = data.GTs{i}; + GTphi = phi; + end; + end; + S = S + biasW; + [~, maxPhi] = max(S); + P = y{maxPhi}; + +% E(i) = 100 * sum(1/M * data.kappas(i) * sqrt(sum((P-GT).^2))); + if (GTphi == maxPhi) + ErrOnCorrYaw(i) = 100 * sum(1/numel(P(1, :)) * data.kappas(i) * sqrt(sum((P-GT).^2))); + E = E + ErrOnCorrYaw(i); + correctYaw(i) = true; + else + ErrOnCorrYaw(i) = inf; + E = E + 100; + correctYaw(i) = false; + end; + + % Print progress + if (i >= lastPrint*N/10 || i== N) + fprintf('%.0f%% ',100*i/N); + lastPrint = lastPrint + 1; + end + + end; + fprintf('\n'); + + Output{1}.name = [data.type 'E']; + Output{1}.value = E/N; + + Output{2}.name = [data.type 'YawMissPerc']; + Output{2}.value = sum(~correctYaw)/N*100; + + Output{3}.name = [data.type 'ErrOnCorrYaw']; + Output{3}.value = mean(ErrOnCorrYaw(correctYaw)); + + +end + diff --git a/learning/mv_parallel/functions/compute_err_mv_flandmark.m b/learning/mv_parallel/functions/compute_err_mv_flandmark.m new file mode 100644 index 0000000..74c866b --- /dev/null +++ b/learning/mv_parallel/functions/compute_err_mv_flandmark.m @@ -0,0 +1,69 @@ +function [ Output ] = compute_err_mv_flandmark( W, data, flandmark_pool, featuresPool ) +%COMPUTE_ERR_MV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here + + N = data.nImages; + PHIS = data.PHIS; + + for phi = 1 : PHIS + from = data.options{phi}.from; + to = data.options{phi}.to; + flandmark_pool{phi}.setW(W(from:to)); + end; + +% E = inf(N, 1); + E = 0; + correctYaw = false(data.nImages, 1); + ErrOnCorrYaw = inf(data.nImages, 1); + y = cell(PHIS, 1); + S = nan(PHIS, 1); + + lastPrint = 0; + for i = 1 : N + + GT = data.GTs{i}; + + featuresPool.setFeaturesRaw(1, data.NFfeatures{i}); +% P = flandmark.detect_base_optimizedFromPool(); + for phi = 1 : PHIS + [y{phi}, S(phi)] = flandmark_pool{phi}.detect_base_optimizedFromPool(); + if strcmp(data.options{phi}.view, data.Yaws{i}) + GT = data.GTs{i}; + GTphi = phi; + end; + end; + [~, maxPhi] = max(S); + P = y{maxPhi}; + +% E(i) = 100 * sum(1/M * data.kappas(i) * sqrt(sum((P-GT).^2))); + if (GTphi == maxPhi) + ErrOnCorrYaw(i) = 100 * sum(1/numel(P(1, :)) * data.kappas(i) * sqrt(sum((P-GT).^2))); + E = E + ErrOnCorrYaw(i); + correctYaw(i) = true; + else + ErrOnCorrYaw(i) = inf; + E = E + 100; + correctYaw(i) = false; + end; + + % Print progress + if (i >= lastPrint*N/10 || i== N) + fprintf('%.0f%% ',100*i/N); + lastPrint = lastPrint + 1; + end + + end; + fprintf('\n'); + + Output{1}.name = [data.type 'E']; + Output{1}.value = E/N; + + Output{2}.name = [data.type 'YawMissPerc']; + Output{2}.value = sum(~correctYaw)/N*100; + + Output{3}.name = [data.type 'ErrOnCorrYaw']; + Output{3}.value = mean(ErrOnCorrYaw(correctYaw)); + + +end + diff --git a/learning/mv_parallel/functions/compute_table_loss_mv.m b/learning/mv_parallel/functions/compute_table_loss_mv.m new file mode 100644 index 0000000..5309128 --- /dev/null +++ b/learning/mv_parallel/functions/compute_table_loss_mv.m @@ -0,0 +1,29 @@ +function [ L ] = compute_table_loss_mv( model, GT, kappa, bound ) +%COMPUTE_TABLE_LOSS Summary of this function goes here +% Detailed explanation goes here + + L = cell(1, model.M); + + for comp = 1 : model.M + % size of component's bbox + siz = [model.ss(4, comp)-model.ss(2, comp)+1; model.ss(3, comp)-model.ss(1, comp)+1]; + % offset (top left corner of component's bbox) + offset = model.ss(1:2, comp); + + cor_sqr = zeros(2, siz(2)*siz(1)); + + for i = 1 : siz(2) + % x coordinates of (S_i - S_i*)^2 + cor_sqr(1, (i-1)*siz(1)+1:(i*siz(1))) = (i-1+offset(1) - GT(1, comp)).^2; + % y coordinates of (S_i - S_i*)^2 + cor_sqr(2, (i-1)*siz(1)+1:(i*siz(1))) = (offset(2) - GT(2, comp):offset(2)+siz(1)-1 - GT(2, comp)).^2; + end; + % L(S, S*) = 1/M \sum_{i=0}^{M-1} || S_i - S_i* || + ell = bound*kappa/model.M * sqrt( cor_sqr(1,:) + cor_sqr(2,:) ); + + L{comp} = bound*ones(model.bw(2), model.bw(1)); + L{comp}(model.ss(2, comp)+1:model.ss(4, comp)+1, model.ss(1, comp)+1:model.ss(3, comp)+1) = reshape(ell, siz'); + end; + +end + diff --git a/learning/mv_parallel/functions/getKappa.m b/learning/mv_parallel/functions/getKappa.m new file mode 100644 index 0000000..18d602e --- /dev/null +++ b/learning/mv_parallel/functions/getKappa.m @@ -0,0 +1,20 @@ +function [ kappa ] = getKappa( GT ) +%GETKAPPA_FRONTAL Summary of this function goes here +% Detailed explanation goes here + + GT = double(GT); + + leftEye = ( GT(:, 7) + GT(:, 8 ) ) / 2; + rightEye = ( GT(:, 10) + GT(:, 11) ) / 2; + mouth = ( GT(:, 18) + GT(:, 19) ) / 2; +% % nose = GT(:, 14); +% +% % facebox size +% S = 0.5*(leftEye+rightEye); +% kappa = 1/(2.7*( norm(leftEye-rightEye) + norm(S-mouth)*1.12 )*0.5); + + S = 0.5*(leftEye+rightEye); + kappa = 1/norm(S-mouth); + +end + diff --git a/learning/mv_parallel/functions/jointmv_prepareImagesGT.m b/learning/mv_parallel/functions/jointmv_prepareImagesGT.m new file mode 100644 index 0000000..357f666 --- /dev/null +++ b/learning/mv_parallel/functions/jointmv_prepareImagesGT.m @@ -0,0 +1,93 @@ +function [ Images, GTs, Yaws, kappas ] = jointmv_prepareImagesGT( flandmark, models, A, F, image_path, mirroring ) +%PREPARETRAININGDATA Summary of this function goes here +% Detailed explanation goes here + + if nargin < 6 + mirroring = false; + A.viewsMirrored = flip(A.views, 1); + end; + + N = numel(F); + Images = cell(N, 1); + GTs = cell(N, 1); + Yaws = cell(N, 1); + kappas = nan(N, 1); + idx = 0; + + for i = 1 : N + + fname = F{i}.imgPath; + I = imread([image_path fname]); + try + Ibw = rgb2gray(I); + catch ex + Ibw = I; + end; + + gt = F{i}.landmarks; + gtphi = find(strcmp(F{i}.view, A.views)); + if mirroring + gtphiMirrored = find(strcmp(A.viewsMirrored(gtphi), A.views)); + end; + gtyaw = F{i}.view; + bbox = int32(F{i}.bbox); + + % all detectors in the pool have the same parameters to get the + % normalized frame => use frontal detector here, which transforms + % all landmarks + [NF, GT] = flandmark.getNormalizedFrame(Ibw, bbox, gt); + + % filter out examples with GT out of flandmark search spaces + GTNF = GT-1; + flag = isGTcompatibleWithModel(GTNF(:, A.visible_subset{gtphi}), models{gtphi}); + + fprintf('%d/%d processing %s... ', i, N, fname); + +% %%% DEBUG - VISUALIZATION +% figure(1); clf(1); +% subplot(121); +% imshow(I, []); hold on; +% plot(gt(1, A.visible_subset{gtphi}), gt(2, A.visible_subset{gtphi}), 'gx'); +% subplot(122); +% imshow(Image, []); hold on; +% plot(GT(1, A.visible_subset{gtphi}), GT(2, A.visible_subset{gtphi}), 'gx'); +% %%%%%%%%%%%%%%%%%%%%%%%%% + + if flag + idx = idx + 1; + GTs{idx} = GT(:, A.visible_subset{gtphi}); + kappas(idx) = 1/norm(double(GT(:, 9))-double(GT(:, 21))); % normalize to vertical face size + Images{idx} = NF; + Yaws{idx} = gtyaw; + fprintf(' done. \n'); + else + fprintf(' not passed. \n'); + end; + + % mirroring + if mirroring + NF_mirrored = fliplr(NF); + GT_mirrored = GT; + GT_mirrored(1, :) = size(NF, 1) - GT_mirrored(1, :) + 1; + + GTNF_mirrored = GT_mirrored-1; + flag = isGTcompatibleWithModel(GTNF_mirrored(:, A.visible_subset{gtphiMirrored}), models{gtphiMirrored}); + if flag + idx = idx + 1; + GTs{idx} = GT_mirrored(:, A.visible_subset{gtphiMirrored}); + kappas(idx) = 1/norm(double(GT_mirrored(:, 9))-double(GT_mirrored(:, 21))); % normalize to vertical face size + Images{idx} = NF; + Yaws{idx} = gtyaw; + fprintf(' mirrored done. \n'); + end; + end; + + end; + + Images(idx+1:end) = []; + GTs(idx+1:end) = []; + Yaws(idx+1:end) = []; + kappas(idx+1:end) = []; + +end + diff --git a/learning/mv_parallel/functions/loss_mv_b_flandmark.m b/learning/mv_parallel/functions/loss_mv_b_flandmark.m new file mode 100644 index 0000000..83b202c --- /dev/null +++ b/learning/mv_parallel/functions/loss_mv_b_flandmark.m @@ -0,0 +1,65 @@ +function [ score, psi, loss ] = loss_mv_b_flandmark( options, NFfeatures, Yaws, GTs, tmp, psi_gt, models, featuresPool, flandmark_pool, W ) +%LOSS_MV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here + + PHIS = numel(flandmark_pool); + + y_hats = cell(PHIS, 1); + scores = nan(PHIS, 1); + losses = nan(PHIS, 1); + + GTphi = 0; + + biasFrom = options{end}.to+1; + biasW = W(biasFrom:end); + + % speedup version - set features to featuresPool + featuresPool.setFeaturesRaw(1, NFfeatures); + + for phi = 1 : PHIS + + if strcmp(options{phi}.view, Yaws) +% GT = data.GTs{i}; + GT = GTs; + GTphi = phi; + if isa(tmp, 'double') + L = compute_table_loss_mv(models{phi}, GTs, tmp, 1); + else + L = tmp; + end; + else + GT = zeros(2, options{phi}.M); + L = models{phi}.L; + end; + + flandmark_pool{phi}.setTableLoss(L); + + [y_hats{phi}, scores(phi), ~, lossA] = flandmark_pool{phi}.detect_base_optimizedFromPool(GT); + + losses(phi) = sum(lossA); + + if phi~=GTphi + losses(phi) = losses(phi)/options{phi}.M; + end; + + end; + + f = scores + losses + biasW; + + [maximum, maxidx] = max(f); + + from = options{GTphi}.from; + to = options{GTphi}.to; + score = maximum - W(from:to)'*flandmark_pool{GTphi}.getPsi(GTs) - biasW(GTphi); + + loss = losses(maxidx); + + from = options{maxidx}.from; + to = options{maxidx}.to; + psi_i = zeros(numel(W), 1); + psi_i(from:to) = flandmark_pool{maxidx}.getPsi(y_hats{maxidx}); + psi_i(biasFrom-1+maxidx) = 1; + psi = psi_i - psi_gt; + +end + diff --git a/learning/mv_parallel/functions/loss_par_mv_b_flandmark.m b/learning/mv_parallel/functions/loss_par_mv_b_flandmark.m new file mode 100644 index 0000000..94e510e --- /dev/null +++ b/learning/mv_parallel/functions/loss_par_mv_b_flandmark.m @@ -0,0 +1,65 @@ +function [ score, psi, loss ] = loss_par_mv_b_flandmark( options, NFfeatures, Yaws, GTs, tmp, psi_gt, models, featuresPool, flandmark_pool, W ) +%LOSS_MV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here + + PHIS = numel(flandmark_pool); + + y_hats = cell(PHIS, 1); + scores = nan(PHIS, 1); + losses = nan(PHIS, 1); + + GTphi = 0; + + biasFrom = options{end}.to+1; + biasW = W(biasFrom:end); + + % speedup version - set features to featuresPool + featuresPool.setFeaturesRaw(1, NFfeatures); + + for phi = 1 : PHIS + + if strcmp(options{phi}.view, Yaws) +% GT = data.GTs{i}; + GT = GTs; + GTphi = phi; + if isa(tmp, 'double') + L = compute_table_loss_mv(models{phi}, GTs, tmp, 1); + else + L = tmp; + end; + else + GT = zeros(2, options{phi}.M); + L = models{phi}.L; + end; + + flandmark_pool{phi}.setTableLoss(L); + + [y_hats{phi}, scores(phi), ~, lossA] = flandmark_pool{phi}.detect_base_optimizedFromPool(GT); + + losses(phi) = sum(lossA); + + if phi~=GTphi + losses(phi) = losses(phi)/options{phi}.M; + end; + + end; + + f = scores + losses + biasW; + + [maximum, maxidx] = max(f); + + from = options{GTphi}.from; + to = options{GTphi}.to; + score = maximum - W(from:to)'*flandmark_pool{GTphi}.getPsi(GTs) - biasW(GTphi); + + loss = losses(maxidx); + + from = options{maxidx}.from; + to = options{maxidx}.to; + psi_i = zeros(numel(W), 1); + psi_i(from:to) = flandmark_pool{maxidx}.getPsi(y_hats{maxidx}); + psi_i(biasFrom-1+maxidx) = 1; + psi = psi_i - psi_gt; + +end + diff --git a/learning/mv_parallel/functions/loss_par_mv_flandmark.m b/learning/mv_parallel/functions/loss_par_mv_flandmark.m new file mode 100644 index 0000000..7104b2a --- /dev/null +++ b/learning/mv_parallel/functions/loss_par_mv_flandmark.m @@ -0,0 +1,61 @@ +function [ score, psi, loss ] = loss_par_mv_flandmark( options, NFfeatures, Yaws, GTs, tmp, psi_gt, models, featuresPool, flandmark_pool, W ) +%LOSS_MV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here + + PHIS = numel(flandmark_pool); + + y_hats = cell(PHIS, 1); + scores = nan(PHIS, 1); + losses = nan(PHIS, 1); + + GTphi = 0; + + % speedup version - set features to featuresPool + featuresPool.setFeaturesRaw(1, NFfeatures); + + for phi = 1 : PHIS + + if strcmp(options{phi}.view, Yaws) +% GT = data.GTs{i}; + GT = GTs; + GTphi = phi; + if isa(tmp, 'double') + L = compute_table_loss_mv(models{phi}, GTs, tmp, 1); + else + L = tmp; + end; + else + GT = zeros(2, options{phi}.M); + L = models{phi}.L; + end; + + flandmark_pool{phi}.setTableLoss(L); + + [y_hats{phi}, scores(phi), ~, lossA] = flandmark_pool{phi}.detect_base_optimizedFromPool(GT); + + losses(phi) = sum(lossA); + + if phi~=GTphi + losses(phi) = losses(phi)/options{phi}.M; + end; + + end; + + f = scores + losses; + + [maximum, maxidx] = max(f); + + from = options{GTphi}.from; + to = options{GTphi}.to; + score = maximum - W(from:to)'*flandmark_pool{GTphi}.getPsi(GTs); + + loss = losses(maxidx); + + from = options{maxidx}.from; + to = options{maxidx}.to; + psi_i = zeros(numel(W), 1); + psi_i(from:to) = flandmark_pool{maxidx}.getPsi(y_hats{maxidx}); + psi = psi_i - psi_gt; + +end + diff --git a/learning/mv_parallel/functions/risk_mv_b.m b/learning/mv_parallel/functions/risk_mv_b.m new file mode 100644 index 0000000..5dbac13 --- /dev/null +++ b/learning/mv_parallel/functions/risk_mv_b.m @@ -0,0 +1,79 @@ +function [ R, subgrad, data ] = risk_mv_b( data, W ) +%RISK_MV Summary of this function goes here +% Detailed explanation goes here +% +% 2015-07-14, Michal Uricar + + createW = false; + if nargin < 2 + createW = true; + end; + + + subgrad = sparse(data.ndim, 1); + R = 0; + + if createW + fprintf('W not provided, creating zeros matrix \n'); + W = zeros(data.ndim, 1); + end; + + % update W + for phi = 1 : data.PHIS + from = data.options{phi}.from; + to = data.options{phi}.to; + data.flandmark_pool{phi}.setW(W(from:to)); + end; + + % Check concavity of wg (distance transform) + showInfo = false; +% fprintf('\n'); + for phi = 1 : data.PHIS + w_g = data.flandmark_pool{phi}.getWedges(); + dt_enabled = zeros(numel(w_g), 1); + for a = 1 : numel(w_g) + if (w_g{a}(3) < 0 && -w_g{a}(3)*w_g{a}(4) < 0) + dt_enabled(a) = true; + else + showInfo = true; + end; + end; + if showInfo + fprintf('\n{%d} DT enabled ', phi); + fprintf('%d ', dt_enabled); + fprintf('\n'); + end; + end; + +% LP_NFfeatures = getLocalPart(data.NFfeatures); +% LP_Yaws = getLocalPart(data.Yaws); +% LP_GTs = getLocalPart(data.GTs); +% LP_kappas = getLocalPart(data.kappas); +% LP_psi_gt = getLocalPart(data.psi_gt); +% if data.precomputeLossTables +% LP_Lgt = getLocalPart(data.Lgt); +% end; + + N = numel(data.NFfeatures); + + for i = 1 : numel(data.NFfeatures) + if data.precomputeLossTables + [r, psi] = loss_mv_b_flandmark(data.options, data.NFfeatures{i}, data.Yaws{i}, data.GTs{i}, data.Lgt{i}, data.psi_gt{i}, data.model, data.featuresPool, data.flandmark_pool, W); + else + [r, psi] = loss_mv_b_flandmark(data.options, data.NFfeatures{i}, data.Yaws{i}, data.GTs{i}, data.kappas(i), data.psi_gt{i}, data.model, data.featuresPool, data.flandmark_pool, W); + end; + subgrad = subgrad + psi; + R = R + r; + end; + + +% N = sum([N{:}]); +% R = sum([R{:}])/N; +% % subgrad = sparse(sum([subgrad{:}], 2)/N); +% subgrad = sum([subgrad{:}], 2)/N; + + R = R/N; + subgrad = subgrad/N; + +end + diff --git a/learning/mv_parallel/functions/risk_par_mv.m b/learning/mv_parallel/functions/risk_par_mv.m new file mode 100644 index 0000000..3dc3347 --- /dev/null +++ b/learning/mv_parallel/functions/risk_par_mv.m @@ -0,0 +1,79 @@ +function [ R, subgrad, data ] = risk_par_mv( data, W ) +%RISK_MV Summary of this function goes here +% Detailed explanation goes here +% +% 2015-07-14, Michal Uricar + + createW = false; + if nargin < 2 + createW = true; + end; + + spmd + + subgrad = sparse(data.ndim, 1); + R = 0; + + if createW + fprintf('W not provided, creating zeros matrix \n'); + W = zeros(data.ndim, 1); + end; + + % update W + for phi = 1 : data.PHIS + from = data.options{phi}.from; + to = data.options{phi}.to; + data.flandmark_pool{phi}.setW(W(from:to)); + end; + + % Check concavity of wg (distance transform) + showInfo = false; +% fprintf('\n'); + for phi = 1 : data.PHIS + w_g = data.flandmark_pool{phi}.getWedges(); + dt_enabled = zeros(numel(w_g), 1); + for a = 1 : numel(w_g) + if (w_g{a}(3) < 0 && -w_g{a}(3)*w_g{a}(4) < 0) + dt_enabled(a) = true; + else + showInfo = true; + end; + end; + if showInfo + fprintf('\n{%d} DT enabled ', phi); + fprintf('%d ', dt_enabled); + fprintf('\n'); + end; + end; + + LP_NFfeatures = getLocalPart(data.NFfeatures); + LP_Yaws = getLocalPart(data.Yaws); + LP_GTs = getLocalPart(data.GTs); + LP_kappas = getLocalPart(data.kappas); + LP_psi_gt = getLocalPart(data.psi_gt); + if data.precomputeLossTables + LP_Lgt = getLocalPart(data.Lgt); + end; + + N = numel(LP_NFfeatures); + + for i = 1 : numel(LP_NFfeatures) + if data.precomputeLossTables + [r, psi] = loss_par_mv_flandmark(data.options, LP_NFfeatures{i}, LP_Yaws{i}, LP_GTs{i}, LP_Lgt{i}, LP_psi_gt{i}, data.model, data.featuresPool, data.flandmark_pool, W); + else + [r, psi] = loss_par_mv_flandmark(data.options, LP_NFfeatures{i}, LP_Yaws{i}, LP_GTs{i}, LP_kappas(i), LP_psi_gt{i}, data.model, data.featuresPool, data.flandmark_pool, W); +% [r, psi] = loss_par_mv_flandmark(LP_NFfeatures{i}, LP_GTs{i}, LP_kappas(i), LP_psi_gt{i}, data.model, data.featuresPool, data.flandmark, W); + end; + subgrad = subgrad + psi; + R = R + r; + end; + + end; + + N = sum([N{:}]); + R = sum([R{:}])/N; +% subgrad = sparse(sum([subgrad{:}], 2)/N); + subgrad = sum([subgrad{:}], 2)/N; + +end + diff --git a/learning/mv_parallel/functions/risk_par_mv_b.m b/learning/mv_parallel/functions/risk_par_mv_b.m new file mode 100644 index 0000000..0881be9 --- /dev/null +++ b/learning/mv_parallel/functions/risk_par_mv_b.m @@ -0,0 +1,78 @@ +function [ R, subgrad, data ] = risk_par_mv_b( data, W ) +%RISK_MV Summary of this function goes here +% Detailed explanation goes here +% +% 2015-07-14, Michal Uricar + + createW = false; + if nargin < 2 + createW = true; + end; + + spmd + + subgrad = sparse(data.ndim, 1); + R = 0; + + if createW + fprintf('W not provided, creating zeros matrix \n'); + W = zeros(data.ndim, 1); + end; + + % update W + for phi = 1 : data.PHIS + from = data.options{phi}.from; + to = data.options{phi}.to; + data.flandmark_pool{phi}.setW(W(from:to)); + end; + + % Check concavity of wg (distance transform) + showInfo = false; +% fprintf('\n'); + for phi = 1 : data.PHIS + w_g = data.flandmark_pool{phi}.getWedges(); + dt_enabled = zeros(numel(w_g), 1); + for a = 1 : numel(w_g) + if (w_g{a}(3) < 0 && -w_g{a}(3)*w_g{a}(4) < 0) + dt_enabled(a) = true; + else + showInfo = true; + end; + end; + if showInfo + fprintf('\n{%d} DT enabled ', phi); + fprintf('%d ', dt_enabled); + fprintf('\n'); + end; + end; + + LP_NFfeatures = getLocalPart(data.NFfeatures); + LP_Yaws = getLocalPart(data.Yaws); + LP_GTs = getLocalPart(data.GTs); + LP_kappas = getLocalPart(data.kappas); + LP_psi_gt = getLocalPart(data.psi_gt); + if data.precomputeLossTables + LP_Lgt = getLocalPart(data.Lgt); + end; + + N = numel(LP_NFfeatures); + + for i = 1 : numel(LP_NFfeatures) + if data.precomputeLossTables + [r, psi] = loss_par_mv_b_flandmark(data.options, LP_NFfeatures{i}, LP_Yaws{i}, LP_GTs{i}, LP_Lgt{i}, LP_psi_gt{i}, data.model, data.featuresPool, data.flandmark_pool, W); + else + [r, psi] = loss_par_mv_b_flandmark(data.options, LP_NFfeatures{i}, LP_Yaws{i}, LP_GTs{i}, LP_kappas(i), LP_psi_gt{i}, data.model, data.featuresPool, data.flandmark_pool, W); + end; + subgrad = subgrad + psi; + R = R + r; + end; + + end; + + N = sum([N{:}]); + R = sum([R{:}])/N; +% subgrad = sparse(sum([subgrad{:}], 2)/N); + subgrad = sum([subgrad{:}], 2)/N; + +end + diff --git a/learning/mv_parallel/model/JOINT_MV_SPLIT_1_-HALF-PROFILE_init.xml b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_-HALF-PROFILE_init.xml new file mode 100644 index 0000000..2ef1447 --- /dev/null +++ b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_-HALF-PROFILE_init.xml @@ -0,0 +1,486 @@ + + + JOINT_MV_SPLIT_1_-HALF-PROFILE + Thu Jan 14 15:57:26 2016 + 19 + 18 + 1 + 60 + 60 + 1.5 + 1.5 + 0.4 + + +
+ 0 + brow-ll + 21 + 4 + 52 + 33 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 1 + brow-lc + 17 + 5 + 48 + 33 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 2 + brow-lr + 13 + 7 + 40 + 32 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 3 + brow-rl + 10 + 8 + 31 + 35 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 4 + brow-rc + 7 + 8 + 30 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 5 + brow-rr + 5 + 8 + 30 + 37 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 6 + canthi-ll + 21 + 9 + 49 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 7 + canthi-lr + 17 + 11 + 40 + 35 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 8 + nose-root + 11 + 12 + 34 + 35 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 9 + canthi-rl + 10 + 12 + 33 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 10 + canthi-rr + 7 + 13 + 40 + 38 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 11 + ear-l + 32 + 10 + 55 + 48 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 12 + nose-l + 16 + 19 + 39 + 43 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 13 + nose-tip + 7 + 18 + 34 + 44 + TABLE_LOSS + 15 + 15 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 14 + mouth-corner-l + 19 + 23 + 42 + 48 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 15 + mouth-upper + 12 + 22 + 35 + 45 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 16 + mouth-lower + 14 + 24 + 37 + 51 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 17 + mouth-corner-r + 13 + 22 + 34 + 47 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 18 + chin + 15 + 26 + 43 + 55 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+
+ + + 13 + 8 + 1 + 4 + + + 13 + 12 + 1 + 4 + + + 13 + 15 + 1 + 4 + + + 15 + 14 + 1 + 4 + + + 15 + 16 + 1 + 4 + + + 15 + 17 + 1 + 4 + + + 16 + 18 + 1 + 4 + + + 18 + 11 + 1 + 4 + + + 8 + 2 + 1 + 4 + + + 8 + 3 + 1 + 4 + + + 8 + 7 + 1 + 4 + + + 8 + 9 + 1 + 4 + + + 2 + 1 + 1 + 4 + + + 7 + 6 + 1 + 4 + + + 3 + 4 + 1 + 4 + + + 9 + 10 + 1 + 4 + + + 1 + 0 + 1 + 4 + + + 4 + 5 + 1 + 4 + + +
diff --git a/learning/mv_parallel/model/JOINT_MV_SPLIT_1_-PROFILE_init.xml b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_-PROFILE_init.xml new file mode 100644 index 0000000..89375d7 --- /dev/null +++ b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_-PROFILE_init.xml @@ -0,0 +1,336 @@ + + + JOINT_MV_SPLIT_1_-PROFILE + Thu Jan 14 15:45:40 2016 + 13 + 12 + 1 + 60 + 60 + 1.5 + 1.5 + 0.4 + + +
+ 0 + brow-ll + 15 + 5 + 44 + 38 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 1 + brow-lc + 13 + 5 + 44 + 39 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 2 + brow-lr + 12 + 8 + 46 + 40 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 3 + canthi-ll + 15 + 14 + 41 + 39 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 4 + canthi-lr + 14 + 14 + 44 + 41 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 5 + nose-root + 12 + 11 + 46 + 41 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 6 + ear-l + 16 + 19 + 55 + 51 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 7 + nose-l + 13 + 25 + 46 + 44 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 8 + nose-tip + 7 + 22 + 51 + 48 + TABLE_LOSS + 15 + 15 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 9 + mouth-corner-l + 14 + 30 + 43 + 47 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 10 + mouth-upper + 10 + 27 + 47 + 47 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 11 + mouth-lower + 11 + 32 + 46 + 50 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 12 + chin + 11 + 36 + 46 + 55 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+
+ + + 8 + 5 + 1 + 4 + + + 8 + 7 + 1 + 4 + + + 8 + 10 + 1 + 4 + + + 5 + 4 + 1 + 4 + + + 5 + 2 + 1 + 4 + + + 10 + 11 + 1 + 4 + + + 10 + 9 + 1 + 4 + + + 11 + 12 + 1 + 4 + + + 12 + 6 + 1 + 4 + + + 4 + 3 + 1 + 4 + + + 1 + 0 + 1 + 4 + + + 2 + 1 + 1 + 4 + + +
diff --git a/learning/mv_parallel/model/JOINT_MV_SPLIT_1_FRONTAL_init.xml b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_FRONTAL_init.xml new file mode 100644 index 0000000..34c9be2 --- /dev/null +++ b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_FRONTAL_init.xml @@ -0,0 +1,536 @@ + + + JOINT_MV_SPLIT_1_FRONTAL + Thu Jan 14 16:08:26 2016 + 21 + 20 + 1 + 60 + 60 + 1.5 + 1.5 + 0.4 + + +
+ 0 + brow-ll + 29 + 4 + 54 + 44 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 1 + brow-lc + 24 + 4 + 51 + 41 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 2 + brow-lr + 22 + 7 + 47 + 39 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 3 + brow-rl + 13 + 7 + 39 + 33 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 4 + brow-rc + 8 + 6 + 39 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 5 + brow-rr + 4 + 9 + 39 + 39 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 6 + canthi-ll + 29 + 10 + 55 + 43 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 7 + canthi-lr + 24 + 12 + 47 + 39 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 8 + nose-root + 18 + 11 + 41 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 9 + canthi-rl + 15 + 13 + 39 + 35 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 10 + canthi-rr + 9 + 13 + 36 + 40 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 11 + ear-l + 26 + 18 + 55 + 49 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 12 + nose-l + 24 + 21 + 46 + 41 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 13 + nose-tip + 17 + 17 + 43 + 42 + TABLE_LOSS + 15 + 15 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 14 + nose-r + 16 + 20 + 41 + 42 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 15 + ear-r + 4 + 17 + 35 + 51 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 16 + mouth-corner-l + 25 + 25 + 47 + 48 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 17 + mouth-upper + 19 + 23 + 44 + 47 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 18 + mouth-lower + 18 + 25 + 45 + 52 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 19 + mouth-corner-r + 15 + 23 + 42 + 48 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 20 + chin + 17 + 28 + 48 + 55 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+
+ + + 13 + 8 + 1 + 4 + + + 13 + 12 + 1 + 4 + + + 13 + 14 + 1 + 4 + + + 13 + 17 + 1 + 4 + + + 17 + 16 + 1 + 4 + + + 17 + 18 + 1 + 4 + + + 17 + 19 + 1 + 4 + + + 18 + 20 + 1 + 4 + + + 20 + 11 + 1 + 4 + + + 20 + 15 + 1 + 4 + + + 8 + 2 + 1 + 4 + + + 8 + 3 + 1 + 4 + + + 8 + 7 + 1 + 4 + + + 8 + 9 + 1 + 4 + + + 2 + 1 + 1 + 4 + + + 7 + 6 + 1 + 4 + + + 3 + 4 + 1 + 4 + + + 9 + 10 + 1 + 4 + + + 1 + 0 + 1 + 4 + + + 4 + 5 + 1 + 4 + + +
diff --git a/learning/mv_parallel/model/JOINT_MV_SPLIT_1_HALF-PROFILE_init.xml b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_HALF-PROFILE_init.xml new file mode 100644 index 0000000..1374d15 --- /dev/null +++ b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_HALF-PROFILE_init.xml @@ -0,0 +1,486 @@ + + + JOINT_MV_SPLIT_1_HALF-PROFILE + Thu Jan 14 16:19:23 2016 + 19 + 18 + 1 + 60 + 60 + 1.5 + 1.5 + 0.4 + + +
+ 0 + brow-ll + 32 + 5 + 55 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 1 + brow-lc + 32 + 4 + 52 + 35 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 2 + brow-lr + 30 + 5 + 48 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 3 + brow-rl + 23 + 4 + 43 + 37 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 4 + brow-rc + 17 + 4 + 38 + 42 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 5 + brow-rr + 12 + 6 + 35 + 45 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 6 + canthi-ll + 34 + 9 + 53 + 37 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 7 + canthi-lr + 30 + 11 + 47 + 37 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 8 + nose-root + 28 + 7 + 45 + 36 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 9 + canthi-rl + 23 + 9 + 42 + 37 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 10 + canthi-rr + 15 + 10 + 36 + 45 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 11 + nose-tip + 28 + 11 + 49 + 41 + TABLE_LOSS + 15 + 15 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 12 + nose-r + 23 + 22 + 41 + 41 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 13 + ear-r + 4 + 19 + 38 + 50 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 14 + mouth-corner-l + 31 + 28 + 50 + 47 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 15 + mouth-upper + 28 + 25 + 46 + 46 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 16 + mouth-lower + 28 + 29 + 50 + 53 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 17 + mouth-corner-r + 20 + 29 + 46 + 47 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 18 + chin + 26 + 32 + 55 + 55 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+
+ + + 11 + 8 + 1 + 4 + + + 11 + 12 + 1 + 4 + + + 11 + 15 + 1 + 4 + + + 15 + 14 + 1 + 4 + + + 15 + 16 + 1 + 4 + + + 15 + 17 + 1 + 4 + + + 16 + 18 + 1 + 4 + + + 18 + 13 + 1 + 4 + + + 8 + 2 + 1 + 4 + + + 8 + 3 + 1 + 4 + + + 8 + 7 + 1 + 4 + + + 8 + 9 + 1 + 4 + + + 2 + 1 + 1 + 4 + + + 7 + 6 + 1 + 4 + + + 3 + 4 + 1 + 4 + + + 9 + 10 + 1 + 4 + + + 1 + 0 + 1 + 4 + + + 4 + 5 + 1 + 4 + + +
diff --git a/learning/mv_parallel/model/JOINT_MV_SPLIT_1_PROFILE_init.xml b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_PROFILE_init.xml new file mode 100644 index 0000000..5f4de84 --- /dev/null +++ b/learning/mv_parallel/model/JOINT_MV_SPLIT_1_PROFILE_init.xml @@ -0,0 +1,336 @@ + + + JOINT_MV_SPLIT_1_PROFILE + Thu Jan 14 16:29:19 2016 + 13 + 12 + 1 + 60 + 60 + 1.5 + 1.5 + 0.4 + + +
+ 0 + brow-rl + 17 + 6 + 50 + 41 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 1 + brow-rc + 15 + 5 + 46 + 37 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 2 + brow-rr + 11 + 6 + 43 + 32 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 3 + nose-root + 23 + 11 + 49 + 43 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 4 + canthi-rl + 21 + 13 + 44 + 41 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 5 + canthi-rr + 15 + 12 + 40 + 35 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 6 + nose-tip + 20 + 21 + 52 + 51 + TABLE_LOSS + 15 + 15 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 7 + nose-r + 20 + 23 + 45 + 46 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 8 + ear-r + 4 + 15 + 28 + 46 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 9 + mouth-upper + 22 + 26 + 50 + 48 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 10 + mouth-lower + 16 + 31 + 48 + 51 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 11 + mouth-corner-r + 19 + 29 + 44 + 47 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+ +
+ 12 + chin + 12 + 38 + 50 + 55 + TABLE_LOSS + 9 + 9 +
+ + + SPARSE_LBP + 4 + + +
+
+ + + 6 + 3 + 1 + 4 + + + 6 + 7 + 1 + 4 + + + 6 + 9 + 1 + 4 + + + 3 + 0 + 1 + 4 + + + 3 + 4 + 1 + 4 + + + 9 + 10 + 1 + 4 + + + 9 + 11 + 1 + 4 + + + 10 + 12 + 1 + 4 + + + 12 + 8 + 1 + 4 + + + 4 + 5 + 1 + 4 + + + 0 + 1 + 1 + 4 + + + 1 + 2 + 1 + 4 + + +
diff --git a/learning/mv_parallel/preprocess/createModelForJointMV.m b/learning/mv_parallel/preprocess/createModelForJointMV.m new file mode 100644 index 0000000..0266d98 --- /dev/null +++ b/learning/mv_parallel/preprocess/createModelForJointMV.m @@ -0,0 +1,245 @@ +%% createModelForJointMV.m +% +% +% 2016-01-14, Michal Uricar + +clc; +close all; +clearvars; + +%% Timestamp + +fprintf(1 ,'Started on %s \n\n', datestr(now)); + +%% User settings + +% path to clandmark root directory +CLANDMARK_PATH = '/path2clandmark/'; + +% path to directory with images +FACES = '/path2faces/Faces/'; + +landmark_names = {'brow-ll', 'brow-lc', 'brow-lr', 'brow-rl', 'brow-rc', 'brow-rr', 'canthi-ll', ... + 'canthi-lr', 'nose-root', 'canthi-rl', 'canthi-rr', 'ear-l', 'nose-l', 'nose-tip', 'nose-r', ... + 'ear-r', 'mouth-corner-l', 'mouth-upper', 'mouth-lower', 'mouth-corner-r', 'chin'}; + +views = {'-profile', '-half-profile', 'frontal', 'half-profile', 'profile'}; +visible_subset = { + [1 2 3 7 8 9 12 13 14 17 18 19 21] % -profile + [1 2 3 4 5 6 7 8 9 10 11 12 13 14 17 18 19 20 21] % -half-profile + [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21] % frontal + [1 2 3 4 5 6 7 8 9 10 11 14 15 16 17 18 19 20 21] % half-profile + [ 4 5 6 9 10 11 14 15 16 18 19 20 21] % profile +}; +root_comp = {9, 14, 14, 12, 7}; % nose-root (id-14) in all views + +edges = { +[8 8 8 5 5 10 10 11 12 4 1 2; + 5 7 10 4 2 11 9 12 6 3 0 1] +[13 13 13 15 15 15 16 18 8 8 8 8 2 7 3 9 1 4; + 8 12 15 14 16 17 18 11 2 3 7 9 1 6 4 10 0 5] +[13 13 13 13 17 17 17 18 20 20 8 8 8 8 2 7 3 9 1 4; + 8 12 14 17 16 18 19 20 11 15 2 3 7 9 1 6 4 10 0 5] +[11 11 11 15 15 15 16 18 8 8 8 8 2 7 3 9 1 4; + 8 12 15 14 16 17 18 13 2 3 7 9 1 6 4 10 0 5] +[6 6 6 3 3 9 9 10 12 4 0 1; + 3 7 9 0 4 10 11 12 8 5 1 2] +}; + +% mirroring +mirroring = true; + +% model specific parameters +bw = [60; 60]; % normalized frame size (base window) [width, height] +bw_margin = [1.5; 1.5]; % extend normalized frame by multiple [w, h] +template_size = [9; 9]; % size of the patch for computing features (appearance model) +root_template_size = [15; 15]; % size of the patch of root_landmark +% root_comp = 31; % root component is se to be the tip of the nose + +visualization = false; + +% NOTE: if you would like to change the graph configuration, please change +% the edges variable in the following section + +%% Add paths + +addpath('../functions/'); +addpath([CLANDMARK_PATH 'matlab_interface/']); +addpath([CLANDMARK_PATH 'matlab_interface/mex/']); +addpath([CLANDMARK_PATH 'matlab_interface/functions/']); + +%% Load annotation file + +load('../data/F_TRN.mat'); + +%% Preprocess + +badidx = []; +missing_detection = []; +baddetection = []; +examples_cnts = cell(size(views)); +for viewID = 1 : numel(views) + examples_cnts{viewID} = 0; +end; + +for viewID = 1 : numel(views) + + + %% + M = numel(visible_subset{viewID}); + SS = ones(4, M); % search spaces [min_x, min_y, max_x, max_y] + components = repmat(template_size, 1, M); + components(:, root_comp{viewID}) = root_template_size; + + create_xml_init(['tmp_' views{viewID} '.xml'], M, edges{viewID}, landmark_names(visible_subset{viewID}), SS, components, bw, bw_margin, ['TMP_' views{viewID}]); + + flandmark = flandmark_class(['tmp_' views{viewID} '.xml']); + + ss = [inf(2, M); -inf(2, M)]; + + %% + + N = numel(F); + + for i = 1 : N + + I = imread([FACES F{i}.imgPath]); + try + Ibw = rgb2gray(I); + catch ex + Ibw = I; + end; + + if ~strcmp(views{viewID}, F{i}.view) + continue; + end; + + gt = F{i}.landmarks(:, visible_subset{viewID}); + + try + bbox = int32(F{i}.bbox); + catch ex + badidx(end+1) = i; + missing_detection(end+1) = i; + fprintf('%d Missing face box...\n', i); + continue; + end; + + % Filter out bad detections (too big or too small bbox, given the ground truth) + overlap = getOverlapAABB(gt, reshape(bbox, 2, 4)); + if overlap < 0.1 + baddetection(end+1) = i; + badidx(end+1) = i; + fprintf('%d Detected bounding box seems to be odd compared to bbox of the ground truth annotation...\n', i); + continue; + end; + + [NF, GTNF] = flandmark.getNormalizedFrame(Ibw, bbox, gt); + + if mirroring + NF_mirrored = fliplr(NF); + GTNF_mirrored = GTNF; + GTNF_mirrored(1, :) = size(NF, 1) - GTNF_mirrored(1, :) + 1; + GTNF_mirrored = double(GTNF_mirrored-1); + end; + + GTNF = double(GTNF-1); + +% flag = true; +% for j = 1 : M +% if ( ((GTNF(1, j)-floor(components(1, j)/2)) < 0) || ((GTNF(2, j)-floor(components(2, j)/2)) < 0) || ... +% ((GTNF(1, j)+floor(components(1, j)/2)) >= bw(1)) || ((GTNF(2, j)+floor(components(2, j)/2)) >= bw(2)) ) +% flag = false; +% end; +% end; + flag = true; + GTNF(1, :) - + + if flag + for j = 1 : M + bb = [GTNF(1, j)-floor(components(1, j)/2), GTNF(2, j)-floor(components(2, j)/2), ... + GTNF(1, j)+floor(components(1, j)/2), GTNF(2, j)+floor(components(2, j)/2) ]; + ss(1, j) = min(ss(1, j), bb(1)); + ss(2, j) = min(ss(2, j), bb(2)); + ss(3, j) = max(ss(3, j), bb(3)); + ss(4, j) = max(ss(4, j), bb(4)); + end; + else + badidx(end+1) = i; + fprintf('%d NOT PASSED...\n', i); + end; + + examples_cnts{viewID} = examples_cnts{viewID} + 1; + + fprintf('%d/%d\n', i, N); + + %%% visualization + if visualization + figure(2); clf(2); + subplot(1, 2, 1); + imshow(I, []); hold on; + plotbox_full(bbox, 'color', 'r'); + plotbox(gtbbox, 'color', 'g'); + plotbox(aabb, 'color', 'r'); + plot(gt(1, :), gt(2, :), 'gx', 'MarkerSize', 3, 'LineWidth', 2); + text(gt(1, :), gt(2, :), gtnames, 'color', 'g', 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right'); + for a = 1 : numel(edges{viewID}(1, :)) + line([gt(1, edges{viewID}(1, a)+1) gt(1, edges{viewID}(2, a)+1)], [gt(2, edges{viewID}(1, a)+1) gt(2, edges{viewID}(2, a)+1)], 'color', 'b'); + end; + subplot(1, 2, 2); + imshow(NF, []); hold on; + plot(GTNF(1, :), GTNF(2, :), 'gx', 'MarkerSize', 3, 'LineWidth', 2); + text(GTNF(1, :), GTNF(2, :), gtnames, 'color', 'g', 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right'); + for a = 1 : numel(edges{viewID}(1, :)) + line([GTNF(1, edges{viewID}(1, a)+1) GTNF(1, edges{viewID}(2, a)+1)], [GTNF(2, edges{viewID}(1, a)+1) GTNF(2, edges{viewID}(2, a)+1)], 'color', 'b'); + end; + %%%%%%%%% + end; + end; + + %% Statistics + +% % bad examples independent on the settings +% fprintf('bad examples independent on the settings:\n'); +% (numel(baddetection)+numel(missing_detection)) +% (numel(baddetection)+numel(missing_detection))/numel(F) * 100 +% +% % bad examples due to settings (bw, bw_margin, component size) +% fprintf('bad examples due to settings (bw, bw_margin, component size):\n'); +% (numel(badidx) - (numel(baddetection)+numel(missing_detection))) +% (numel(badidx) - (numel(baddetection)+numel(missing_detection)))/numel(F) * 100 +% +% % overall cut +% fprintf('overall pruned:\n'); +% numel(badidx) +% numel(badidx)/numel(F) * 100 + + % overall examples + fprintf('overall examples for training: %d \n', examples_cnts{viewID}); + + %% Final adjust of search spaces + + for j = 1 : M + SS(1, j) = ss(1, j) + floor(components(1, j)/2); + SS(2, j) = ss(2, j) + floor(components(2, j)/2); + SS(3, j) = ss(3, j) - floor(components(1, j)/2); + SS(4, j) = ss(4, j) - floor(components(2, j)/2); + end; + + % Show size of search regions + (SS(3, :) - SS(1, :) + 1) .* (SS(4, :) - SS(2, :) + 1) + + %% Create XML init file + + sigma = 0.4; + create_xml_init(['../model/withMirroring/JOINT_MV_SPLIT_1_' upper(views{viewID}) '_init.xml'], M, edges{viewID}, landmark_names(visible_subset{viewID}), SS, components, bw, bw_margin, ['JOINT_MV_SPLIT_1_' upper(views{viewID})], sigma); + +end; + +%% Save DB with bad indices + +save(['../data/F_TRN_WithBadIndices.mat'], 'F', 'badidx', 'baddetection', 'missing_detection'); + +%% Timestamp + +fprintf(1 ,'Finished on %s \n\n', datestr(now)); diff --git a/learning/mv_parallel/range_parallel_learn_mv_constrbmrm_AFLW.m b/learning/mv_parallel/range_parallel_learn_mv_constrbmrm_AFLW.m new file mode 100644 index 0000000..5bce794 --- /dev/null +++ b/learning/mv_parallel/range_parallel_learn_mv_constrbmrm_AFLW.m @@ -0,0 +1,317 @@ +%% parallel_learn_mv_constrbmrm_full_AFLW.m +% +% +% 2016-01-15, Michal Uricar + +clc; +close all; +clearvars; + +%% Timestamp + +fprintf(1,'Started on %s\n\n', datestr(now)); + +%% User Settings + +CLANDMARK_PATH = '/path/to/clandmark/root/directory/'; + +% Opt.useCplex = 1; % whether to use CPLEX for QP (otherwise libQP will be used) +Opt.useCplex = 0; % whether to use CPLEX for QP (otherwise libQP will be used) +Opt.tolRel = 1e-2; % Stopping criterion 1e-2 is usually sufficient +Opt.bufSize = 1000; % The more the better, but keep in mind the memory consumption! (this takes around XX GB) +Opt.saveProgress = true; % Save progress +Opt.saveAfter = 300; % Save progress after this number of iterations only + +lambdaRange = 10.^[2:-1:-2]; % lambda range for model selection + +precomputeLossTables = false; % true if enough memory (on datagrid) +% precomputeLossTables = true; + +NUM_THREADS = 30; % number of cores to use +% NUM_THREADS = 6; + +%% Add paths + +addpath('./functions/'); + +addpath([CLANDMARK_PATH 'matlab_interface/']); +addpath([CLANDMARK_PATH 'matlab_interface/mex/']); +addpath([CLANDMARK_PATH 'matlab_interface/functions/']); +addpath([CLANDMARK_PATH 'learning/bmrm/']); +addpath([CLANDMARK_PATH 'learning/libqp/matlab/']); + +addpath('/media/CPLEX/'); +addpath('/local/xfrancv/CPLEX_Studio125/cplex/matlab/'); +addpath('/datagrid/personal/uricamic/2015-07-12_300W_Learning/CPLEX/'); + +%% Load data + +load('./MAT/data_TRN_SPLIT_1.mat'); + +% helpers (such as visible subsets, PHIS, views) +load('./MAT/A.mat'); + +%% Init flandmarkPool + +flandmark_pool = cell(PHIS, 1); + +FLANDMARK_INIT_FILE = { + './model/JOINT_MV_SPLIT_1_-PROFILE_init.xml' + './model/JOINT_MV_SPLIT_1_-HALF-PROFILE_init.xml' + './model/JOINT_MV_SPLIT_1_FRONTAL_init.xml' + './model/JOINT_MV_SPLIT_1_HALF-PROFILE_init.xml' + './model/JOINT_MV_SPLIT_1_PROFILE_init.xml' +}; + +for phi = 1 : numel(FLANDMARK_INIT_FILE) + flandmark_pool{phi} = flandmark_class(FLANDMARK_INIT_FILE{phi}, true); +end; + +% Feature Pool +bw = flandmark_pool{1}.getBWsize(); +featuresPool = featuresPool_class(bw(1), bw(2)); +featuresPool.addLBPSparseFeatures(); +for phi = 1 : PHIS + flandmark_pool{phi}.setFeaturesPool(featuresPool.getHandle); +end; + +%% built options and model + +options = cell(PHIS, 1); + +from = 0; +for phi = 1 : PHIS + options{phi}.S = flandmark_pool{phi}.getNodesSearchSpaces()+1; + options{phi}.bw = flandmark_pool{phi}.getBWsize(); + options{phi}.view = A.views{phi}; + options{phi}.M = flandmark_pool{phi}.getLandmarksCount(); + options{phi}.from = from+1; + options{phi}.dim = flandmark_pool{phi}.getWdim(); + options{phi}.to = from + options{phi}.dim; + from = options{phi}.to; + [options{phi}.Woffsets] = flandmark_pool{phi}.getWoffsets(); + options{phi}.nodeWdims = flandmark_pool{phi}.getNodesDimensions(); + options{phi}.edgeWdims = flandmark_pool{phi}.getEdgesDimensions(); +end; + +ndim = options{end}.to; + +model = cell(PHIS, 1); +for phi = 1 : PHIS + model{phi}.ss = flandmark_pool{phi}.getNodesSearchSpaces(); + model{phi}.components = flandmark_pool{phi}.getNodesWindowSizes(); + model{phi}.bw = flandmark_pool{phi}.getBWsize(); + model{phi}.M = flandmark_pool{phi}.getLandmarksCount(); + model{phi}.Woffsets = flandmark_pool{phi}.getWoffsets(); + model{phi}.nodeWdims = flandmark_pool{phi}.getNodesDimensions(); + model{phi}.edgeWdims = flandmark_pool{phi}.getEdgesDimensions(); + model{phi}.view = A.views{phi}; + model{phi}.L = repmat({ones(model{phi}.bw')}, 1, model{phi}.M); +end; + +% clean temporary created flandmark_pool and featuresPool +clear flandmark_pool; +clear featuresPool; + +%% parpool + +cluster = parcluster('local'); +cluster.NumWorkers = NUM_THREADS; +parpool(cluster, cluster.NumWorkers); + +%% prepare data (parallel) + +N = numel(Images); + +spmd + data.N = N; + data.PHIS = PHIS; + data.GTs = codistributed(GTs'); + data.Images = codistributed(Images'); + data.Yaws = codistributed(Yaws'); + data.kappas = codistributed(kappas'); + data.ndim = ndim; + data.precomputeLossTables = precomputeLossTables; + data.model = model; + data.options = options; + data.type = 'Trn'; + + % featuresPool + data.featuresPool = featuresPool_class(bw(1), bw(2)); + data.featuresPool.addLBPSparseFeatures(); + + % flandmark + data.flandmark_pool = cell(PHIS, 1); + for phi = 1 : numel(FLANDMARK_INIT_FILE) + data.flandmark_pool{phi} = flandmark_class(FLANDMARK_INIT_FILE{phi}, true); + data.flandmark_pool{phi}.setFeaturesPool(data.featuresPool.getHandle); + end; + + data.dist = codistributor('1d', 1); + data.NFfeatures = codistributed.cell(N, 1, data.dist); + data.g_indices = globalIndices(data.NFfeatures, 1); + data.Lgt = codistributed.cell(N, 1, data.dist); + data.psi_gt = codistributed.cell(N, 1, data.dist); +end; + +%% pre-compute features and loss functions +spmd + + LP_Images = getLocalPart(data.Images); + LP_GTs = getLocalPart(data.GTs); + LP_kappas = getLocalPart(data.kappas); + LP_Yaws = getLocalPart(data.Yaws); + + LP_NFfeatures = getLocalPart(data.NFfeatures); + dist = getCodistributor(data.NFfeatures); + + if precomputeLossTables + LP_Lgt = getLocalPart(data.Lgt); + end; + + LP_psi_gt = getLocalPart(data.psi_gt); + + for i = 1 : numel(LP_Images) + % Precompute features + data.featuresPool.computeFromNF(LP_Images{i}'); + LP_NFfeatures{i} = data.featuresPool.getFeaturesRaw(1); + for phi = 1 : PHIS + if strcmp(LP_Yaws(i), data.options{phi}.view) + if ~isGTcompatibleWithModel(LP_GTs{i}-1, data.model{phi}) + error('GT is not compatible with the model!!!\n'); + end; + data.featuresPool.setFeaturesRaw(1, LP_NFfeatures{i}); + % pre-compute psi vector + from = data.options{phi}.from; + to = data.options{phi}.to; + psi_gt = data.flandmark_pool{phi}.getPsi_base_optimized(LP_GTs{i}); + LP_psi_gt{i} = sparse(data.ndim, 1); + LP_psi_gt{i}(from:to) = psi_gt; + % pre-compute loss tables + if precomputeLossTables + LP_Lgt{i} = compute_table_loss_mv(model{phi}, LP_GTs{i}, LP_kappas(i), 1); + end; + end; + end; + end; + + data.NFfeatures = codistributed.build(LP_NFfeatures, dist, 'noCommunication'); + if precomputeLossTables + data.Lgt = codistributed.build(LP_Lgt, dist, 'noCommunication'); + end; + data.psi_gt = codistributed.build(LP_psi_gt, dist, 'noCommunication'); + +end; + +%% VAL data + +load('./MAT/data_VAL_SPLIT_1.mat'); + +valdata.flandmark_pool = cell(PHIS, 1); +for phi = 1 : numel(FLANDMARK_INIT_FILE) + valdata.flandmark_pool{phi} = flandmark_class(FLANDMARK_INIT_FILE{phi}); +end; + +% Feature Pool +valdata.featuresPool = featuresPool_class(model{1}.bw(1), model{1}.bw(2)); +valdata.featuresPool.addLBPSparseFeatures(); +for phi = 1 : PHIS + valdata.flandmark_pool{phi}.setFeaturesPool(valdata.featuresPool.getHandle); +end; +valdata.GTs = VALGTs; +valdata.Images = VALImages; +valdata.Yaws = VALYaws; +valdata.kappas = VALkappas; +valdata.PHIS = PHIS; +valdata.options = options; +valdata.nImages = numel(VALImages); +valdata.ndim = valdata.options{end}.to; +valdata.model = model; +valdata.type = 'Val'; + +lastPrint = 0; +fprintf('Precomputing VAL features...\n'); +valdata.NFfeatures = cell(valdata.nImages, 1); +for i = 1 : valdata.nImages + valdata.featuresPool.computeFromNF(valdata.Images{i}'); + valdata.NFfeatures{i} = valdata.featuresPool.getFeaturesRaw(1); + + % Print progress + if (i >= lastPrint*valdata.nImages/10 || i==valdata.nImages) + fprintf('%.0f%% ',100*i/valdata.nImages); + lastPrint = lastPrint + 1; + end +end; +fprintf('\n'); + +%% BMRMCONSTR model selection + +% Prepare bounds and indices +edgeOffsets = {}; +for a = 1 : numel(options) + edgeOffsets{end+1} = options{a}.Woffsets{2}; +end; + +w3s = []; +w4s = []; +for a = 1 : numel(edgeOffsets) + w3s = [w3s; options{a}.from+edgeOffsets{a}+2-1]; + w4s = [w4s; options{a}.from+edgeOffsets{a}+3-1]; +end; + +edgeIndices = [w3s w4s]'; +edgeIndices = edgeIndices(:); + +nConstr = numel(edgeIndices); +c = 1e-7; +A = zeros(nConstr, ndim); +for a = 1 : nConstr + A(a, edgeIndices(a)) = -1; +end; +b = ones(nConstr, 1)*c; + +fprintf('Call BMRMCONSTR...\n'); + +Ws = cell(numel(lambdaRange), 1); +Cpm = []; + +for i = 1 : numel(lambdaRange) + lambda = lambdaRange(i); + + fprintf('\n\nLambda = %f \n\n', lambda); + + Opt.outName = ['W_BMRMCONSTR_lambda_' num2str(lambda) '.mat']; + + if ~exist(Opt.outName, 'file') + + %TODO: check for the working file + if exist(['__progress__' Opt.outName], 'file') + fprintf('Working file %s found, starting from that point...\n', ['__progress__' Opt.outName]); + load(['__progress__' Opt.outName]); + [Ws{i}, Stat, Cpm] = bmrmconstr2(data, @risk_par_mv, lambda, A, b, C, Opt); + else + [Ws{i}, Stat, Cpm] = bmrmconstr2(data, @risk_par_mv, lambda, A, b, Cpm, Opt); + end; + W = Ws{i}; + save(Opt.outName, 'W', 'Stat', 'lambda', 'Opt', 'Cpm', '-v7.3'); + else + fprintf('%s already exists. Loading and continue with next lambda...\n', Opt.outName); + load(Opt.outName); + Ws{i} = W; + end; + + % VAL Error + fprintf('Compute VAL error...\n'); + ValOut = compute_err_mv_flandmark(W, valdata, valdata.flandmark_pool, valdata.featuresPool); + fprintf('%s: %.2f; %s: %.2f; %s: %.2f \n', ValOut{1}.name, ValOut{1}.value, ValOut{2}.name, ValOut{2}.value, ValOut{3}.name, ValOut{3}.value); + +end; + +%% Save + +fprintf('Saving learned vector W...\n'); +save('W_BMRMCONSTR_lambdaRange.mat', 'Ws', 'Stat', 'lambdaRange', 'Opt', '-v7.3'); + +%% Timestamp + +fprintf(1,'Finished on %s\n\n', datestr(now)); diff --git a/learning/sv_parallel/MAT/transform_F2learning.m b/learning/sv_parallel/MAT/transform_F2learning.m new file mode 100644 index 0000000..d06a000 --- /dev/null +++ b/learning/sv_parallel/MAT/transform_F2learning.m @@ -0,0 +1,47 @@ +%% trnasform_F2learning.m +% +% +% 2015-09-07, Michal Uricar +% 2016-01-06, Michal Uricar + +clc; +close all; +clearvars; + +%% Timestamp + +fprintf(1,'Started on %s\n\n', datestr(now)); + +%% User Settings + +CLANDMARK_PATH = '/path/to/clandmark/root/directory/'; +image_path = '/path/to/300W/images/'; + +%% Add paths + +addpath('../functions/'); +addpath([CLANDMARK_PATH 'matlab_interface/']); +addpath([CLANDMARK_PATH 'matlab_interface/mex/']); +addpath([CLANDMARK_PATH 'matlab_interface/functions/']); + +%% Init CLandmark + +flandmark = flandmark_class('../model/SV_init.xml', 1); + +%% Prepare training data (i.e. obtain normalized frames, ground truth annotations in them and normalization constants) + +SPLIT = 'SPLIT_1'; + +load(['TRN_' SPLIT '.mat']); + +[Images, GTs, kappas] = prepareImagesGT(flandmark, F, image_path); +save(['data_TRN_' SPLIT '.mat'], 'Images', 'GTs', 'kappas'); + +load(['VAL_' SPLIT '.mat']); + +[VALImages, VALGTs, VALkappas] = prepareImagesGT(flandmark, F, image_path); +save(['data_VAL_' SPLIT '.mat'], 'VALImages', 'VALGTs', 'VALkappas'); + +%% Timestamp + +fprintf(1,'Finished on %s\n\n', datestr(now)); diff --git a/learning/sv_parallel/README.md b/learning/sv_parallel/README.md new file mode 100644 index 0000000..ef265e3 --- /dev/null +++ b/learning/sv_parallel/README.md @@ -0,0 +1,31 @@ +# Using MATLAB learning scripts # + +Before running learning script `sv_parallel_learn_bmrmconstr.m`, please make sure that you + +1. Compile the *CLandmark* library and *MATLAB interface*. +2. Compile helper mex-functions, by running `compile_mex.m` in `/clandmark/learning/bmrm/` folder. +3. Provide correct path to *CLandmark root folder* and *300W database images* in all scripts mentioned here. +4. Create the model XML file, by running `createModelFor300W.m` in `/clandmark/learning/sv_parallel/preprocess/` folder. +5. Split database into training and validation part, by running `create_TRN_and_VAL.m` in `/clandmark/learning/sv_parallel/data/` folder. +6. Prepare data for learning, by running `transform_F2learning.m` in `/clandmark/learning/sv_parallel/MAT/` folder. + +Learning is meant to be run on a computer with multiple cores. Learning of C-DPM and F-DPM took around 5 days on a +computer with 12 cores and memory footprint was around 20 GB. + +Feel free to modify the scripts to detect different sets of landmarks or to use different databases. + +## Creating the model XML file ## + +Once the lamdba range specified in learning script is fully learned, use the lambda minimizing the validation risk for +model creation. The XML model file is produced by the following code snippet + +```MATLAB +% create instance of flandmark +flandmark = flandmark_class('./model/SV_init.xml', true); + +% assuming W contains the learned weights for optimal lambda +flandmark.setW(W); + +% creates model.xml file with learned weights +flandmark.write('model.xml'); +``` diff --git a/learning/sv_parallel/data/300W_landmarks.mat b/learning/sv_parallel/data/300W_landmarks.mat new file mode 100644 index 0000000..5003f26 Binary files /dev/null and b/learning/sv_parallel/data/300W_landmarks.mat differ diff --git a/learning/sv_parallel/data/create_TRN_and_VAL.m b/learning/sv_parallel/data/create_TRN_and_VAL.m new file mode 100644 index 0000000..99f4382 --- /dev/null +++ b/learning/sv_parallel/data/create_TRN_and_VAL.m @@ -0,0 +1,40 @@ +%% create_TRN_and_VAL.m +% +% +% 2015-09-07, Michal Uricar + +clc; +close all; +clearvars; + +%% Timestamp + +fprintf(1,'Started on %s\n\n', datestr(now)); + +%% Select split + +SPLIT = 1; + +%% Prune & Save TRN + +load('./300W_WithBadIndices.mat'); + +trn_indices = setdiff(trnIdx{SPLIT}, badidx); + +F = F(trn_indices); + +save(['../MAT/TRN_SPLIT_' num2str(SPLIT) '.mat'], 'F', 'trn_indices'); + +%% Prune & Save VAL + +load('./300W_WithBadIndices.mat'); + +val_indices = setdiff(valIdx{SPLIT}, badidx); + +F = F(val_indices); + +save(['../MAT/VAL_SPLIT_' num2str(SPLIT) '.mat'], 'F', 'val_indices'); + +%% Timestamp + +fprintf(1,'Finished on %s\n\n', datestr(now)); diff --git a/learning/sv_parallel/functions/computeKappa.m b/learning/sv_parallel/functions/computeKappa.m new file mode 100644 index 0000000..b44d52d --- /dev/null +++ b/learning/sv_parallel/functions/computeKappa.m @@ -0,0 +1,12 @@ +function [ kappa ] = computeKappa( GT ) +%COMPUTEKAPPA Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + + GT = double(GT); + interocular_distance = norm(GT(:, 37)-GT(:, 46)); + kappa = 1/interocular_distance; + +end + diff --git a/learning/sv_parallel/functions/compute_err_sv_flandmark.m b/learning/sv_parallel/functions/compute_err_sv_flandmark.m new file mode 100644 index 0000000..73310be --- /dev/null +++ b/learning/sv_parallel/functions/compute_err_sv_flandmark.m @@ -0,0 +1,37 @@ +function [ Output ] = compute_err_sv_flandmark( W, data, flandmark, featuresPool ) +%COMPUTE_ERR_SV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + + N = data.nImages; + M = flandmark.getLandmarksCount(); + + flandmark.setW(W); + + TrnE = inf(N, 1); + + lastPrint = 0; + for i = 1 : N + + GT = data.GTs{i}; + + featuresPool.setFeaturesRaw(1, data.NFfeatures{i}); + P = flandmark.detect_base_optimizedFromPool(); + + TrnE(i) = 100 * sum(1/M * data.kappas(i) * sqrt(sum((P-GT).^2))); + + % Print progress + if (i >= lastPrint*N/10 || i== N) + fprintf('%.0f%% ',100*i/N); + lastPrint = lastPrint + 1; + end + + end; + fprintf('\n'); + + Output{1}.name = [data.type 'E']; + Output{1}.value = sum(TrnE)/N; + +end + diff --git a/learning/sv_parallel/functions/compute_loss_sv.m b/learning/sv_parallel/functions/compute_loss_sv.m new file mode 100644 index 0000000..de6f31c --- /dev/null +++ b/learning/sv_parallel/functions/compute_loss_sv.m @@ -0,0 +1,31 @@ +function [ L ] = compute_loss_sv( model, GT, kappa, bound ) +%COMPUTE_LOSS_SV Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + + L = cell(1, model.M); + + for comp = 1 : model.M + % size of component's bbox + siz = [model.ss(4, comp)-model.ss(2, comp)+1; model.ss(3, comp)-model.ss(1, comp)+1]; + % offset (top left corner of component's bbox) + offset = model.ss(1:2, comp); + + cor_sqr = zeros(2, siz(2)*siz(1)); + + for i = 1 : siz(2) + % x coordinates of (S_i - S_i*)^2 + cor_sqr(1, (i-1)*siz(1)+1:(i*siz(1))) = (i-1+offset(1) - GT(1, comp)).^2; + % y coordinates of (S_i - S_i*)^2 + cor_sqr(2, (i-1)*siz(1)+1:(i*siz(1))) = (offset(2) - GT(2, comp):offset(2)+siz(1)-1 - GT(2, comp)).^2; + end; + % L(S, S*) = 1/M \sum_{i=0}^{M-1} || S_i - S_i* || + ell = bound*kappa/model.M * sqrt( cor_sqr(1,:) + cor_sqr(2,:) ); + + L{comp} = bound*ones(model.bw(2), model.bw(1)); + L{comp}(model.ss(2, comp)+1:model.ss(4, comp)+1, model.ss(1, comp)+1:model.ss(3, comp)+1) = reshape(ell, siz'); + end; + +end + diff --git a/learning/sv_parallel/functions/loss_par_sv_flandmark.m b/learning/sv_parallel/functions/loss_par_sv_flandmark.m new file mode 100644 index 0000000..e787829 --- /dev/null +++ b/learning/sv_parallel/functions/loss_par_sv_flandmark.m @@ -0,0 +1,29 @@ +function [ score, psi, loss ] = loss_par_sv_flandmark( NFfeatures, GT, tmp, psi_gt, model, featuresPool, flandmark, W ) +%LOSS_PAR_SV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + +% % Update W +% data.flandmark.setW(W); + + % update features + featuresPool.setFeaturesRaw(1, NFfeatures); + + % compute loss (tmp is either kappa or loss_table) + if isa(tmp, 'double') + flandmark.setTableLoss(compute_loss_sv(model, GT, tmp, 1)); + else + flandmark.setTableLoss(tmp); + end; + + % loss augmented classification + [y_hat, scores, ~, lossA] = flandmark.detect_base_optimizedFromPool(GT); + + loss = sum(lossA); + score = loss + scores - W'*psi_gt; + + psi = flandmark.getPsi(y_hat) - psi_gt; + +end + diff --git a/learning/sv_parallel/functions/loss_sv_flandmark.m b/learning/sv_parallel/functions/loss_sv_flandmark.m new file mode 100644 index 0000000..a729379 --- /dev/null +++ b/learning/sv_parallel/functions/loss_sv_flandmark.m @@ -0,0 +1,31 @@ +function [ score, psi, loss, data ] = loss_sv_flandmark( i, data, W ) +%LOSS_SV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + + % Update W +% data.flandmark.setW(W); + + % update features + data.featuresPool.setFeaturesRaw(1, data.NFfeatures{i}); + + % compute loss + GT = data.GTs{i}; + if isfield(data, 'Lgt') + data.flandmark.setTableLoss(data.Lgt{i}); + else + data.flandmark.setTableLoss(compute_loss_sv(data.model, data.GTs{i}, data.kappas(i), 1)); + end; + + % loss augmented classification + [y_hat, scores, ~, lossA] = data.flandmark.detect_base_optimizedFromPool(GT); + +% loss = sum(lossA)/data.options.M; + loss = sum(lossA); + score = loss + scores - W'*data.psi_gt(:, i); + + psi = data.flandmark.getPsi(y_hat) - data.psi_gt(:, i); + +end + diff --git a/learning/sv_parallel/functions/prepareImagesGT.m b/learning/sv_parallel/functions/prepareImagesGT.m new file mode 100644 index 0000000..1082508 --- /dev/null +++ b/learning/sv_parallel/functions/prepareImagesGT.m @@ -0,0 +1,56 @@ +function [ Images, GTs, kappas ] = prepareImagesGT( flandmark, Annotation, image_path ) +%PREPARETRAININGDATA Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + + N = numel(Annotation); + Images = cell(N, 1); + GTs = cell(N, 1); + kappas = nan(N, 1); + idx = 0; + + model.ss = flandmark.getNodesSearchSpaces(); + model.components = flandmark.getNodesWindowSizes(); + model.bw = flandmark.getBWsize(); + + for i = 1 : N + + fname = Annotation{i}.imgPath; + I = imread([image_path fname]); + + try + Ibw = rgb2gray(I); + catch ex + Ibw = I; + end; + + gt = Annotation{i}.L68; + bbox = int32(Annotation{i}.fullbox); + + [Image, GT] = flandmark.getNormalizedFrame(Ibw, bbox, gt); + + % filter out examples with GT out of flandmark search spaces + GTNF = GT-1; + flag = isGTcompatibleWithModel(GTNF, model); + + fprintf('%d/%d processing %s... ', i, N, fname); + + if flag + idx = idx + 1; + GTs{idx} = GT; + kappas(idx) = computeKappa(GT); + Images{idx} = Image; + fprintf(' done. \n'); + else + fprintf(' not passed. \n'); + end; + + end; + + Images(idx+1:end) = []; + GTs(idx+1:end) = []; + kappas(idx+1:end) = []; + +end + diff --git a/learning/sv_parallel/functions/risk_par_sv_flandmark.m b/learning/sv_parallel/functions/risk_par_sv_flandmark.m new file mode 100644 index 0000000..16e4b91 --- /dev/null +++ b/learning/sv_parallel/functions/risk_par_sv_flandmark.m @@ -0,0 +1,72 @@ +function [ R, subgrad, data ] = risk_par_sv_flandmark( data, W ) +%RISK_PAR_SV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + + createW = false; + if nargin < 2 + createW = true; + end; + + spmd + subgrad = sparse(data.ndim, 1); + R = 0; + + if createW + fprintf('W not provided, creating zeros matrix \n'); + W = zeros(data.ndim, 1); + end; + + data.flandmark.setW(W); + + % Check concavity of wg (distance transform) + showInfo = false; + Woffsets = data.flandmark.getWoffsets(); + dt_enabled = zeros(numel(Woffsets{2}), 1); + for a = 1 : numel(Woffsets{2}) + w_g = W(Woffsets{2}(a):Woffsets{2}(a)+3); + if (w_g(3) < 0 && -w_g(3)*w_g(4) < 0) + dt_enabled(a) = true; + else + showInfo = true; + end; + end; + if showInfo + fprintf('Worker %d: DT enabled ', labindex); + fprintf('%d ', dt_enabled); + fprintf('\n'); + end; + + LP_NFfeatures = getLocalPart(data.NFfeatures); + + LP_GTs = getLocalPart(data.GTs); + LP_kappas = getLocalPart(data.kappas); + LP_psi_gt = getLocalPart(data.psi_gt); + + if data.precomputeLossTables + LP_Lgt = getLocalPart(data.Lgt); + end; + + N = numel(LP_NFfeatures); + + + for i = 1 : numel(LP_NFfeatures) + if data.precomputeLossTables + [r, psi] = loss_par_sv_flandmark(LP_NFfeatures{i}, LP_GTs{i}, LP_Lgt{i}, LP_psi_gt{i}, data.model, data.featuresPool, data.flandmark, W); + else + [r, psi] = loss_par_sv_flandmark(LP_NFfeatures{i}, LP_GTs{i}, LP_kappas(i), LP_psi_gt{i}, data.model, data.featuresPool, data.flandmark, W); + end; + subgrad = subgrad + psi; + R = R + r; + end; + + end; + + N = sum([N{:}]); + R = sum([R{:}])/N; +% subgrad = sparse(sum([subgrad{:}], 2)/N); + subgrad = sum([subgrad{:}], 2)/N; + +end + diff --git a/learning/sv_parallel/functions/risk_sv_flandmark.m b/learning/sv_parallel/functions/risk_sv_flandmark.m new file mode 100644 index 0000000..533fa3c --- /dev/null +++ b/learning/sv_parallel/functions/risk_sv_flandmark.m @@ -0,0 +1,49 @@ +function [ R, subgrad, data ] = risk_sv_flandmark( data, W ) +%RISK_SV_FLANDMARK Summary of this function goes here +% Detailed explanation goes here +% +% 2015-09-07, Michal Uricar + + if nargin < 2 + W = zeros(data.ndim, 1); + end; + + data.flandmark.setW(W); + + N = numel(data.Images); + + r = zeros(N, 1); + subgrad = zeros(numel(W), 1); + + lastPrint = 0; + + for i = 1 : N + [r(i), psi] = loss_sv_flandmark(i, data, W); + subgrad = subgrad + psi; + + % Print progress + if (i >= lastPrint*N/10 || i==N) + fprintf('%.0f%% ',100*i/N); + lastPrint = lastPrint + 1; + end + end; + + R = sum(r) / N; + subgrad = sparse(subgrad / data.nImages); + + % Check concavity of wg (distance transform) + Woffsets = data.flandmark.getWoffsets(); + dt_enabled = zeros(numel(Woffsets{2}), 1); + for a = 1 : numel(Woffsets{2}) + w_g = W(Woffsets{2}(a):Woffsets{2}(a)+3); + if (w_g(3) < 0 && -w_g(3)*w_g(4) < 0) + dt_enabled(a) = true; + end; + end; + clear Woffsets; + fprintf(' DT enabled '); + fprintf('%d ', dt_enabled); + fprintf('\n'); + +end + diff --git a/learning/sv_parallel/preprocess/createModelFor300W.m b/learning/sv_parallel/preprocess/createModelFor300W.m new file mode 100644 index 0000000..2bdb480 --- /dev/null +++ b/learning/sv_parallel/preprocess/createModelFor300W.m @@ -0,0 +1,222 @@ +%% createModelFor300W +% +% +% 2014-12-15, Michal Uricar +% 2016-01-06, Michal Uricar + +clc; +close all; +clearvars; + +%% Timestamp + +fprintf(1 ,'Started on %s \n\n', datestr(now)); + +%% User settings + +% path to clandmark root directory +CLANDMARK_PATH = '/path/to/clandmark/root/directory/'; + +% path to directory with images +FACES = '/path/to/300W/images/'; + +% model specific parameters +bw = [80; 80]; % normalized frame size (base window) [width, height] +bw_margin = [1.5; 1.5]; % extend normalized frame by multiple [w, h] +template_size = [13; 13]; % size of the patch for computing features (appearance model) +root_template_size = [21; 21]; % size of the patch of root_landmark +root_comp = 31; % root component is se to be the tip of the nose + +visualization = false; + +% NOTE: if you would like to change the graph configuration, please change +% the edges variable in the following section + +%% Add paths + +addpath('../functions/'); +addpath([CLANDMARK_PATH 'matlab_interface/']); +addpath([CLANDMARK_PATH 'matlab_interface/mex/']); +addpath([CLANDMARK_PATH 'matlab_interface/functions/']); + +%% Load splits for 300W + +load('../data/300W_landmarks.mat'); % MAT-file with annotation structure F + +%% 68-landmarks variant + +M = 68; % 300W annotation contains 68 landmarks + +% Edges have to form a tree and the format is [parent; child], 1-based +edges = [ + [2:9; 1:8] [16:-1:9; 17:-1:10] [58; 9], ... % outer countour + [19:22; 18:21] [28; 22] [26:-1:23; 27:-1:24] [28; 23] , ... % left and right brow + nose root connection + [38:40; 37:39] [28; 40] [38 39; 42 41] [45:-1:43; 46:-1:44] [28; 43] [44 45; 48 47], ... % left and right eye + nose root connection + [29:31; 28:30] [31; 34] [33 34 35 34; 32 33 36 35] , ... % nose + [34; 52] , ... + [50 51 52; 49 50 51] [50 51; 61 62] [52 53 54; 53 54 55] [53 54; 64 65] , ... + [52; 63] [63; 67] [67; 58] , ... + [59 58; 60 59] [59; 68] [57 58; 56 57] [57; 66] , ... +]; + +landmark_names = {}; +for a = 1 : M, landmark_names{a} = ['S' num2str(a-1)]; end; + +%% Visualization + +if visualization + i = 2; + I = imread([FACES F{i}.imgPath]); + [H, W, D] = size(I); + P = F{i}.L68; + + figure(1); clf(1); + imshow(I, []); hold on; + for a = 1 : numel(edges(1, :)) + line([P(1, edges(1, a)) P(1, edges(2, a))], [P(2, edges(1, a)) P(2, edges(2, a))], 'Marker', '>', 'MarkerSize', 10, 'color', 'b', 'LineWidth', 2); + end; + plot(P(1, :), P(2, :), 'gx', 'MarkerSize', 6, 'LineWidth', 3); + plot(P(1, root_comp), P(2, root_comp), 'mx', 'MarkerSize', 5, 'LineWidth', 3); +end; + +%% Preprocess + +SS = ones(4, M); % search spaces [min_x, min_y, max_x, max_y] +components = repmat(template_size, 1, M); +components(:, root_comp) = root_template_size; + +create_xml_init('tmp.xml', M, edges-1, landmark_names, SS, components, bw, bw_margin, 'TMP'); + +flandmark = flandmark_class('tmp.xml'); + +ss = [inf(2, M); -inf(2, M)]; + +badidx = []; +missing_detection = []; +baddetection = []; + +%% + +N = numel(F); + +for i = 1 : N + + I = imread([FACES F{i}.imgPath]); + try + Ibw = rgb2gray(I); + catch ex + Ibw = I; + end; + gt = F{i}.L68; + + try + bbox = int32(F{i}.fullbox); + catch ex + badidx(end+1) = i; + missing_detection(end+1) = i; + fprintf('%d Missing face box...\n', i); + continue; + end; + + % Filter out bad detections (too big or too small bbox, given the ground truth) + overlap = getOverlapAABB(gt, reshape(bbox, 2, 4)); + if overlap < 0.1 + baddetection(end+1) = i; + badidx(end+1) = i; + fprintf('%d Detected bounding box seems to be odd compared to bbox of the ground truth annotation...\n', i); + continue; + end; + + [NF, GTNF] = flandmark.getNormalizedFrame(Ibw, bbox, gt); + + GTNF = double(GTNF-1); + + flag = true; + for j = 1 : M + if ( ((GTNF(1, j)-floor(components(1, j)/2)) < 0) || ((GTNF(2, j)-floor(components(2, j)/2)) < 0) || ... + ((GTNF(1, j)+floor(components(1, j)/2)) >= bw(1)) || ((GTNF(2, j)+floor(components(2, j)/2)) >= bw(2)) ) + flag = false; + end; + end; + + if flag + for j = 1 : M + bb = [GTNF(1, j)-floor(components(1, j)/2), GTNF(2, j)-floor(components(2, j)/2), ... + GTNF(1, j)+floor(components(1, j)/2), GTNF(2, j)+floor(components(2, j)/2) ]; + ss(1, j) = min(ss(1, j), bb(1)); + ss(2, j) = min(ss(2, j), bb(2)); + ss(3, j) = max(ss(3, j), bb(3)); + ss(4, j) = max(ss(4, j), bb(4)); + end; + else + badidx(end+1) = i; + fprintf('%d NOT PASSED...\n', i); + end; + + fprintf('%d/%d\n', i, N); + + %%% visualization + if visualization + figure(2); clf(2); + subplot(1, 2, 1); + imshow(I, []); hold on; + plotbox_full(bbox, 'color', 'r'); + plotbox(gtbbox, 'color', 'g'); + plotbox(aabb, 'color', 'r'); + plot(gt(1, :), gt(2, :), 'gx', 'MarkerSize', 3, 'LineWidth', 2); + text(gt(1, :), gt(2, :), gtnames, 'color', 'g', 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right'); + for a = 1 : numel(edges(1, :)) + line([gt(1, edges(1, a)+1) gt(1, edges(2, a)+1)], [gt(2, edges(1, a)+1) gt(2, edges(2, a)+1)], 'color', 'b'); + end; + subplot(1, 2, 2); + imshow(NF, []); hold on; + plot(GTNF(1, :), GTNF(2, :), 'gx', 'MarkerSize', 3, 'LineWidth', 2); + text(GTNF(1, :), GTNF(2, :), gtnames, 'color', 'g', 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right'); + for a = 1 : numel(edges(1, :)) + line([GTNF(1, edges(1, a)+1) GTNF(1, edges(2, a)+1)], [GTNF(2, edges(1, a)+1) GTNF(2, edges(2, a)+1)], 'color', 'b'); + end; + %%%%%%%%% + end; +end; + +%% Statistics + +% % bad examples independent on the settings +fprintf('bad examples independent on the settings:\n'); +(numel(baddetection)+numel(missing_detection)) +(numel(baddetection)+numel(missing_detection))/numel(F) * 100 + +% bad examples due to settings (bw, bw_margin, component size) +fprintf('bad examples due to settings (bw, bw_margin, component size):\n'); +(numel(badidx) - (numel(baddetection)+numel(missing_detection))) +(numel(badidx) - (numel(baddetection)+numel(missing_detection)))/numel(F) * 100 + +% overall cut +fprintf('overall pruned:\n'); +numel(badidx) +numel(badidx)/numel(F) * 100 + +%% Save DB with bad indices + +save('../data/300W_WithBadIndices.mat', 'F', 'tstIdx', 'trnIdx', 'valIdx', 'badidx', 'baddetection', 'missing_detection'); + +%% Final adjust of search spaces + +for j = 1 : M + SS(1, j) = ss(1, j) + floor(components(1, j)/2); + SS(2, j) = ss(2, j) + floor(components(2, j)/2); + SS(3, j) = ss(3, j) - floor(components(1, j)/2); + SS(4, j) = ss(4, j) - floor(components(2, j)/2); +end; + +% Show size of search regions +(SS(3, :) - SS(1, :) + 1) .* (SS(4, :) - SS(2, :) + 1) + +%% Create XML init file + +sigma = 1.0; +create_xml_init('../model/SV_init.xml', M, edges-1, landmark_names, SS, components, bw, bw_margin, 'SINGLE_VIEW', sigma); + +%% Timestamp + +fprintf(1 ,'Finished on %s \n\n', datestr(now)); diff --git a/learning/sv_parallel/sv_parallel_learn_bmrmconstr.m b/learning/sv_parallel/sv_parallel_learn_bmrmconstr.m new file mode 100644 index 0000000..c4f2805 --- /dev/null +++ b/learning/sv_parallel/sv_parallel_learn_bmrmconstr.m @@ -0,0 +1,239 @@ +%% sv_parallel_learn_bmrmconstr.m +% +% +% 2015-09-07, Michal Uricar +% 2016-01-06, Michal Uricar + +clc; +close all; +clearvars; + +%% Timestamp + +fprintf(1,'Started on %s\n\n', datestr(now)); + +%% User Settings + +CLANDMARK_PATH = '/path/to/clandmark/root/directory/'; + +% Opt.useCplex = 1; % whether to use CPLEX for QP (otherwise libQP will be used) +Opt.useCplex = 0; % whether to use CPLEX for QP (otherwise libQP will be used) +Opt.tolRel = 1e-2; % Stopping criterion 1e-2 is usually sufficient +Opt.bufSize = 1000; % The more the better, but keep in mind the memory consumption! (this takes around 20GB) +Opt.saveProgress = true; % Save progress +Opt.saveAfter = 250; % Save progress after this number of iterations only + +% precomputeLossTables = false; % true if enough memory (on datagrid) +precomputeLossTables = true; + +%% Add paths + +addpath('./functions/'); +addpath([CLANDMARK_PATH 'matlab_interface/']); +addpath([CLANDMARK_PATH 'matlab_interface/mex/']); +addpath([CLANDMARK_PATH 'matlab_interface/functions/']); +addpath([CLANDMARK_PATH 'learning/bmrm/']); +addpath([CLANDMARK_PATH 'learning/libqp/matlab/']); +% addpath('/CPLEX/'); + +%% Load data + +load('./MAT/data_TRN_SPLIT_1.mat'); + +%% Init flandmark & featuresPool + +fn = './model/SV_init.xml'; + +flandmark = flandmark_class(fn, true); + +% Feature Pool +bw = flandmark.getBWsize(); +featuresPool = featuresPool_class(bw(1), bw(2)); +featuresPool.addLBPSparseFeatures(); +flandmark.setFeaturesPool(featuresPool.getHandle); + +%% Pre-compute + +model.ss = flandmark.getNodesSearchSpaces(); +model.components = flandmark.getNodesWindowSizes(); +model.bw = flandmark.getBWsize(); +model.M = flandmark.getLandmarksCount(); +model.Woffsets = flandmark.getWoffsets(); +model.nodeWdims = flandmark.getNodesDimensions(); +model.edgeWdims = flandmark.getEdgesDimensions(); +model.ndim = flandmark.getWdim(); + +clear flandmark; +clear featuresPool; + +%% parpool + +cluster = parcluster('local'); +cluster.NumWorkers = 32; +parpool(cluster, cluster.NumWorkers); + +%% TEST + +N = numel(Images); + +%% + +spmd + data.N = N; + data.GTs = codistributed(GTs'); + data.Images = codistributed(Images'); + data.kappas = codistributed(kappas'); + + data.ndim = model.ndim; + data.model = model; + data.type = 'Trn'; + data.precomputeLossTables = precomputeLossTables; + + data.flandmark = flandmark_class(fn, true); + data.featuresPool = featuresPool_class(model.bw(1), model.bw(2)); + data.featuresPool.addLBPSparseFeatures(); + data.flandmark.setFeaturesPool(data.featuresPool.getHandle); + + data.dist = codistributor('1d', 1); + data.NFfeatures = codistributed.cell(N, 1, data.dist); + data.g_indices = globalIndices(data.NFfeatures, 1); + + if precomputeLossTables + data.Lgt = codistributed.cell(N, 1, data.dist); + end; + + data.psi_gt = codistributed.cell(N, 1, data.dist); + +end; + +%% + +spmd + LP_Images = getLocalPart(data.Images); + LP_GTs = getLocalPart(data.GTs); + LP_kappas = getLocalPart(data.kappas); + + LP_NFfeatures = getLocalPart(data.NFfeatures); + dist = getCodistributor(data.NFfeatures); + + if precomputeLossTables + LP_Lgt = getLocalPart(data.Lgt); + end; + + LP_psi_gt = getLocalPart(data.psi_gt); + + for i = 1 : numel(LP_Images) + % Precompute features + data.featuresPool.computeFromNF(LP_Images{i}'); + LP_NFfeatures{i} = data.featuresPool.getFeaturesRaw(1); + if ~isGTcompatibleWithModel(LP_GTs{i}-1, data.model) + error('GT is not compatible with the model!!!\n'); + end; + + % Precompute psi vectors + LP_psi_gt{i} = sparse(data.flandmark.getPsi_base_optimized(LP_GTs{i})); + + % Precompute loss tables + if precomputeLossTables + LP_Lgt{i} = compute_loss_sv(data.model, LP_GTs{i}, LP_kappas(i), 1); + end; + + end; + + data.NFfeatures = codistributed.build(LP_NFfeatures, dist, 'noCommunication'); + if precomputeLossTables + data.Lgt = codistributed.build(LP_Lgt, dist, 'noCommunication'); + end; + data.psi_gt = codistributed.build(LP_psi_gt, dist, 'noCommunication'); +end; + +%% VAL data + +load('./MAT/data_VAL_SPLIT_1.mat'); + +valdata.flandmark = flandmark_class(fn); + +% Feature Pool +valdata.featuresPool = featuresPool_class(model.bw(1), model.bw(2)); +valdata.featuresPool.addLBPSparseFeatures(); +valdata.flandmark.setFeaturesPool(valdata.featuresPool.getHandle); +valdata.GTs = VALGTs; +valdata.Images = VALImages; +valdata.kappas = VALkappas; +valdata.nImages = numel(VALImages); +valdata.ndim = valdata.flandmark.getWdim(); +valdata.model = model; +valdata.type = 'Val'; + +lastPrint = 0; +fprintf('Precomputing VAL features...\n'); +valdata.NFfeatures = cell(valdata.nImages, 1); +for i = 1 : valdata.nImages + valdata.featuresPool.computeFromNF(valdata.Images{i}'); + valdata.NFfeatures{i} = valdata.featuresPool.getFeaturesRaw(1); + + % Print progress + if (i >= lastPrint*valdata.nImages/10 || i==valdata.nImages) + fprintf('%.0f%% ',100*i/valdata.nImages); + lastPrint = lastPrint + 1; + end +end; +fprintf('\n'); + +%% BMRMCONSTR model selection + +lambdaRange = 10.^[3:-1:1]; + +% Prepare bounds and indices +edgeOffsets = model.Woffsets{2}; + +w3s = edgeOffsets+2; +w4s = edgeOffsets+3; + +edgeIndices = [w3s w4s]'; +edgeIndices = edgeIndices(:); + +nConstr = numel(edgeIndices); +c = 1e-7; +A = zeros(nConstr, model.ndim); +for a = 1 : nConstr + A(a, edgeIndices(a)) = -1; +end; +b = ones(nConstr, 1)*c; + +fprintf('Call BMRMCONSTR...\n'); + +Ws = cell(numel(lambdaRange), 1); +Cpm = []; + +for i = 1 : numel(lambdaRange) + lambda = lambdaRange(i); + + fprintf('\n\nLambda = %f \n\n', lambda); + + Opt.outName = ['sv_W_PAR_BMRMCONSTR_lambda_' num2str(lambda) '.mat']; + + if ~exist(Opt.outName, 'file') + [Ws{i}, Stat, Cpm] = bmrmconstr2(data, @risk_par_sv_flandmark, lambda, A, b, Cpm, Opt); + W = Ws{i}; + save(Opt.outName, 'W', 'Stat', 'lambda', 'Opt', 'Cpm', '-v7.3'); + else + fprintf('%s already exists. Loading and continue with next lambda...\n', fn); + load(Opt.outName); + end; + + % VAL Error + fprintf('Compute VAL error...\n'); + ValOut = compute_err_sv_flandmark(W, valdata, valdata.flandmark, valdata.featuresPool); + fprintf('%s: %.2f \n', ValOut{1}.name, ValOut{1}.value); + +end; + +%% Save + +fprintf('Saving learned vector W...\n'); +save('sv_W_PAR_BMRMCONSTR_lambdaRange.mat', 'Ws', 'Stat', 'lambdaRange', 'Opt'); + +%% Timestamp + +fprintf(1,'Finished on %s\n\n', datestr(now)); diff --git a/libclandmark/CAppearanceModel.h b/libclandmark/CAppearanceModel.h index ea35a26..a14d509 100644 --- a/libclandmark/CAppearanceModel.h +++ b/libclandmark/CAppearanceModel.h @@ -180,7 +180,7 @@ class CAppearanceModel { * @brief setName * @param name */ - inline void setName(std::string name) { this->name = name; } + inline void setName(std::string name_) { this->name = name_; } /** * @brief getName @@ -198,7 +198,7 @@ class CAppearanceModel { * @brief setType * @param type */ - inline void setType(std::string type) { this->type = type; } + inline void setType(std::string type_) { this->type = type_; } /** * @brief hasLoss @@ -246,7 +246,8 @@ class CAppearanceModel { protected: const int kNodeID; /**< */ - const int kLength; /**< number of feature vectors for node (component)*/ + //const int kLength; /**< number of feature vectors for node (component)*/ + const size_t kLength; /**< number of feature vectors for node (component)*/ int size[2]; /**< */ int searchSpace[4]; /**< */ @@ -351,12 +352,13 @@ class Vertex { << "}"; } - int best; /**< */ - std::vector< CAppearanceModel* > appearances; /**< */ + //int best; /**< */ + size_t best; /**< */ int ss[4]; /**< */ int winSize[2]; /**< */ int nodeID; /**< */ std::string name; /**< */ + std::vector< CAppearanceModel* > appearances; /**< */ }; } diff --git a/libclandmark/CDeformationCost.h b/libclandmark/CDeformationCost.h index c0784e3..2b0dc62 100644 --- a/libclandmark/CDeformationCost.h +++ b/libclandmark/CDeformationCost.h @@ -151,7 +151,8 @@ class CDeformationCost { // Loss function CLoss *loss; - int kDimension; + //int kDimension; + size_t kDimension; // internal representation of features goes to specialized classes (e.g. CDisplacementDeformationCost, etc.) // convention on order for edge (parent, child) diff --git a/libclandmark/CDisplacementDeformationCost.cpp b/libclandmark/CDisplacementDeformationCost.cpp index 8c3aa77..85d9929 100644 --- a/libclandmark/CDisplacementDeformationCost.cpp +++ b/libclandmark/CDisplacementDeformationCost.cpp @@ -116,7 +116,7 @@ void CDisplacementDeformationCost::write(XmlStorage &fs, fl_double_t * const w, << "ParentID" << parent->getNodeID() << "ChildID" << child->getNodeID() << "Type" << DISPLACEMENT_VECTOR - << "Dims" << kDimension; + << "Dims" << (int)kDimension; if (loss) fs << "LossType" << loss->getName(); diff --git a/libclandmark/CFeaturePool.h b/libclandmark/CFeaturePool.h index 2b22aa6..c6cb5e3 100644 --- a/libclandmark/CFeaturePool.h +++ b/libclandmark/CFeaturePool.h @@ -107,8 +107,10 @@ class CFeaturePool { private: - const int kWidth; /**< width of NF mipmap */ - const int kHeight; /**< height of NF mipmap */ + //const int kWidth; /**< width of NF mipmap */ + //const int kHeight; /**< height of NF mipmap */ + const size_t kWidth; /**< width of NF mipmap */ + const size_t kHeight; /**< height of NF mipmap */ std::vector featurePool; /**< */ unsigned char *NF_mipmap; /**< Normalized Frame mipmap */ diff --git a/libclandmark/CLandmark.cpp b/libclandmark/CLandmark.cpp index a6f6b32..92f99f3 100644 --- a/libclandmark/CLandmark.cpp +++ b/libclandmark/CLandmark.cpp @@ -71,6 +71,8 @@ CLandmark::CLandmark() L = 0x0; psiNodesDimension = 0; + + sigma = -1; } void CLandmark::init( @@ -88,6 +90,8 @@ void CLandmark::init( baseWindow[1] = base_window_height; baseWindowMargin[0] = base_window_margin_x; baseWindowMargin[1] = base_window_margin_y; + + sigma = -1; groundTruthPositions = new fl_double_t[2*kLandmarksCount]; groundTruthPositionsNF = new int[2*kLandmarksCount]; @@ -261,7 +265,9 @@ void CLandmark::getQG_optimized() switch (type) { case SPARSE_LBP: - vertices[i].appearances[j]->update_optimized(NFfeaturesPool->getFeaturesFromPool(0), w[i][j], q[i][j], &groundTruthPositionsNF[INDEX(0, i, 2)]); + vertices[i].appearances[j]->update_optimized( + NFfeaturesPool->getFeaturesFromPool(0), + w[i][j], q[i][j], &groundTruthPositionsNF[INDEX(0, i, 2)]); break; case EXTENDED_SPARSE_LBP: // TODO: Implementation needed @@ -334,10 +340,10 @@ fl_double_t *CLandmark::getLossValues(int *position) int estimate[2] = {position[INDEX(0, i, 2)]-ss[0], position[INDEX(1, i, 2)]-ss[1]}; - int position = INDEX(estimate[1], estimate[0], size[1]); + int pos = INDEX(estimate[1], estimate[0], size[1]); if (vertices[i].appearances[vertices[i].best]->hasLoss()) { - L[i] = vertices[i].appearances[vertices[i].best]->getLoss()->getLossAt(position); + L[i] = vertices[i].appearances[vertices[i].best]->getLoss()->getLossAt(pos); } else { L[i] = 0.0; } @@ -498,8 +504,9 @@ void CLandmark::detect_optimizedFromPool(int *boundingBox, fl_double_t *const gr // Get G response for (int i=0; i < kEdgesCount; ++i) { - G[i] = edges[i]->getGvalue(&landmarksPositionsNF[INDEX(0, edges[i]->getParent()->getNodeID(), 2)], - &landmarksPositionsNF[INDEX(0, edges[i]->getChild()->getNodeID(), 2)], w[kLandmarksCount+i][0]); + G[i] = edges[i]->getGvalue(&landmarksPositionsNF[INDEX(0, edges[i]->getParent()->getNodeID(), 2)], + &landmarksPositionsNF[INDEX(0, edges[i]->getChild()->getNodeID(), 2)], w[kLandmarksCount+i][0]); + } timings.maxsum = timerPart.toc(); @@ -1028,6 +1035,11 @@ void CLandmark::getNormalizedFrame(cimg_library::CImg *inputImage (*normalizedFrame)(x, y) = inputImage->linear_atXY(u, v); } } + + if (sigma > 0) + { + normalizedFrame->blur(sigma); + } } void CLandmark::computeWdimension(void) @@ -1057,19 +1069,25 @@ void CLandmark::write(const char *filename, bool writeW) time_t rawtime; time(&rawtime); + std::string version = asctime(localtime(&rawtime)); + const size_t strEnd = version.find_last_not_of(" \t"); + version = version.substr(0, strEnd); + fs << "name" << this->name - << "version" << asctime(localtime(&rawtime)) - << "num_nodes" << kLandmarksCount - << "num_edges" << kEdgesCount + << "version" << version + << "num_nodes" << (int)kLandmarksCount + << "num_edges" << (int)kEdgesCount << "graph_type" << TREE << "bw_width" << baseWindow[0] << "bw_height" << baseWindow[1] << "bw_margin_x" << baseWindowMargin[0] - << "bw_margin_y" << baseWindowMargin[1]; + << "bw_margin_y" << baseWindowMargin[1] + << "sigma" << sigma; fs << "Nodes" << "["; - for (int i=0; i < kLandmarksCount; ++i) + //for (int i=0; i < kLandmarksCount; ++i) + for (size_t i = 0; i < kLandmarksCount; ++i) { fs << "Node"; fs << "{"; @@ -1088,7 +1106,8 @@ void CLandmark::write(const char *filename, bool writeW) fs << "]"; fs << "Edges" << "["; - for (int i=0; i < kEdgesCount; ++i) + //for (int i=0; i < kEdgesCount; ++i) + for (size_t i = 0; i < kEdgesCount; ++i) { edges.at(i)->write(fs, w[kLandmarksCount+i][0], writeW); } @@ -1166,3 +1185,33 @@ int *CLandmark::getWindowSizes(void) return winSizes; } + +std::vector CLandmark::getLandmarkNames(void) +{ + std::vector res; + for (unsigned int i=0; i < vertices.size(); ++i) + { + res.push_back(vertices[i].name); + } + + return res; +} + +std::vector< std::vector< fl_double_t* > > CLandmark::getQs(void) +{ + std::vector< std::vector< fl_double_t* > > res; + + for (unsigned int i=0; i < q.size(); ++i) + { + res.push_back(std::vector< fl_double_t* >()); + for (unsigned int j=0; j < q[i].size(); ++j) + { + int length = vertices[i].appearances[j]->getLength(); + fl_double_t *tmp = new fl_double_t[length]; + memcpy(tmp, q[i][j], sizeof(fl_double_t)*length); + res[i].push_back(tmp); + } + } + + return res; +} \ No newline at end of file diff --git a/libclandmark/CLandmark.h b/libclandmark/CLandmark.h index d60c3f5..3b75d1d 100644 --- a/libclandmark/CLandmark.h +++ b/libclandmark/CLandmark.h @@ -254,13 +254,15 @@ class CLandmark { * @brief getLandmarksCount * @return */ - inline int getLandmarksCount(void) { return vertices.size(); } + //inline int getLandmarksCount(void) { return vertices.size(); } + inline size_t getLandmarksCount(void) { return vertices.size(); } /** * @brief getEdgesCount * @return */ - inline int getEdgesCount(void) { return kEdgesCount; } + //inline int getEdgesCount(void) { return kEdgesCount; } + inline size_t getEdgesCount(void) { return kEdgesCount; } /** * @brief computeWdimension @@ -376,6 +378,18 @@ class CLandmark { */ inline bool nodeHasLoss(int nodeID) { return vertices[nodeID].appearances[0]->hasLoss(); } + /** + * @brief setSmoothingSigma + * @param sigma + */ + inline void setSmoothingSigma(fl_double_t sigma_) { this->sigma = sigma_; } + + /** + * @brief getSmoothingSigma + * @return + */ + inline fl_double_t getSmoothingSigma(void) { return this->sigma; } + /// NEW FEATURE (NOT IMPLEMENTED YET) void changeSearchSpace(); /// ----------- @@ -397,6 +411,18 @@ class CLandmark { */ inline std::vector getIntermediateResults(void) { return solver->getIntermediateResults(); } + /** + * @brief getLandmarkNames Returns individual landmarks names + * @return + */ + std::vector getLandmarkNames(void); + + /** + * @brief getQs Returns feature response of individual landmarks (for visualization in MATLAB interface) + * @return + */ + std::vector< std::vector< fl_double_t* > > getQs(void); + protected: // update values of functions q and g @@ -484,13 +510,18 @@ class CLandmark { std::string name; /**< */ // internal parameters - int kLandmarksCount; /**< */ - int kEdgesCount; /**< */ + //int kLandmarksCount; /**< */ + //int kEdgesCount; /**< */ + size_t kLandmarksCount; /**< */ + size_t kEdgesCount; /**< */ // convention for size [width x height] int baseWindow[2]; /**< */ fl_double_t baseWindowMargin[2]; /**< */ + // sigma for optional Gaussian filter smoothing of normalized frame + fl_double_t sigma; /**< */ + // normalized image frame related variables cimg_library::CImg *normalizedFrame; /**< */ fl_double_t BB[8]; /**< */ diff --git a/libclandmark/CLoss.h b/libclandmark/CLoss.h index 543aa50..01a1698 100644 --- a/libclandmark/CLoss.h +++ b/libclandmark/CLoss.h @@ -121,14 +121,16 @@ class CLoss { /** * @brief CLoss */ - CLoss(const CLoss&) : kLength(-1) + //CLoss(const CLoss&) : kLength(-1) + CLoss(const CLoss&) : kLength(0) {} protected: - const int kLength; /**< */ + //const int kLength; /**< */ + const size_t kLength; /**< */ fl_double_t normalizationFactor; /**< */ - int *admissiblePositions; /**< */ + int *admissiblePositions; /**< */ }; diff --git a/libclandmark/CMakeLists.txt b/libclandmark/CMakeLists.txt index b66a601..28c44ad 100644 --- a/libclandmark/CMakeLists.txt +++ b/libclandmark/CMakeLists.txt @@ -20,12 +20,18 @@ if(NOT RAPIDXML_FOUND) message(STATUS "RapidXML not found - using internal version.") set(RapidXML_INCLUDE_DIR "$" CACHE PATH "Include directory for RapidXML" FORCE) file(GLOB RapidXML_HEADERS ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/*.hpp) - install(FILES ${RapidXML_HEADERS} DESTINATION include COMPONENT Devel) install( - FILES - ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/manual.html - ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/license.txt - DESTINATION share/doc/clandmark COMPONENT Devel + FILES + ${RapidXML_HEADERS} + DESTINATION include + COMPONENT Devel + ) + install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/manual.html + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/license.txt + DESTINATION share/doc/clandmark + COMPONENT Devel ) endif() @@ -34,16 +40,25 @@ find_package(CImg) if(NOT CIMG_FOUND) message(STATUS "CImg not found - using internal version.") set(CImg_INCLUDE_DIR "$" CACHE PATH "Include directory for CImg" FORCE) - install(FILES ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/CImg.h - DESTINATION include COMPONENT Devel) + install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/CImg.h + DESTINATION include + COMPONENT Devel + ) file(GLOB CImg_DOCS ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/*.txt) - install(FILES ${CImg_DOCS} DESTINATION share/doc/clandmark COMPONENT Devel) + install( + FILES ${CImg_DOCS} + DESTINATION share/doc/clandmark + COMPONENT Devel + ) endif() configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/CLandmarkConfig.h.in ${PROJECT_BINARY_DIR}/CLandmarkConfig.h ) + set(clandmark_headers msvc-compat.h base64.h @@ -113,12 +128,12 @@ endif(USE_OPENMP) # CLANDMARK add_library(clandmark ${clandmark_srcs}) if(NOT ${BUILD_SHARED_LIBS}) - if(NOT MSVC) - set_target_properties(clandmark PROPERTIES PREFIX "lib") - endif() + if(NOT MSVC) + set_target_properties(clandmark PROPERTIES PREFIX "lib") + endif() + set_target_properties(clandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC endif() target_include_directories(clandmark PUBLIC ${CImg_INCLUDE_DIR} ${RapidXML_INCLUDE_DIR}) -set_target_properties(clandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC set_target_properties(clandmark PROPERTIES SOVERSION "${clandmark_VERSION_MAJOR}" VERSION "${clandmark_VERSION}" @@ -127,30 +142,63 @@ set_target_properties(clandmark PROPERTIES # FLANDMARK add_library(flandmark ${flandmark_srcs}) if(NOT ${BUILD_SHARED_LIBS}) - if(NOT MSVC) - set_target_properties(flandmark PROPERTIES PREFIX "lib") - endif() + if(NOT MSVC) + set_target_properties(flandmark PROPERTIES PREFIX "lib") + endif() + set_target_properties(flandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC endif() target_link_libraries(flandmark clandmark) -set_target_properties(flandmark PROPERTIES POSITION_INDEPENDENT_CODE TRUE) # -fPIC -set_target_properties(flandmark PROPERTIES +set_target_properties( + flandmark PROPERTIES SOVERSION "${clandmark_VERSION_MAJOR}" VERSION "${clandmark_VERSION}" ) # Models learned distributed with CLandmark set(flandmark_models - ${CMAKE_SOURCE_DIR}/data/flandmark_model.xml - ${CMAKE_SOURCE_DIR}/data/haarcascade_frontalface_alt.xml + ${CMAKE_SOURCE_DIR}/data/flandmark_model.xml + ${CMAKE_SOURCE_DIR}/data/haarcascade_frontalface_alt.xml ) -install(TARGETS clandmark flandmark +install( + TARGETS clandmark flandmark EXPORT CLandmarkTargets - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - INCLUDES DESTINATION include + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin + INCLUDES DESTINATION include +) + +# RapidXML +file(GLOB RapidXML_HEADERS ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/*.hpp) +install( + FILES + ${RapidXML_HEADERS} + DESTINATION include + COMPONENT Devel +) +install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/manual.html + ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13/license.txt + DESTINATION share/doc/clandmark + COMPONENT Devel ) + +# CImg +install( + FILES + ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/CImg.h + DESTINATION include + COMPONENT Devel +) +file(GLOB CImg_DOCS ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/*.txt) +install( + FILES ${CImg_DOCS} + DESTINATION share/doc/clandmark + COMPONENT Devel +) + install(FILES ${clandmark_headers} DESTINATION include COMPONENT Devel) install(FILES ${flandmark_headers} DESTINATION include COMPONENT Devel) install(FILES ${flandmark_models} DESTINATION share/clandmark/models) diff --git a/libclandmark/CMaxSumSolver.h b/libclandmark/CMaxSumSolver.h index 279bcb6..94c4d57 100644 --- a/libclandmark/CMaxSumSolver.h +++ b/libclandmark/CMaxSumSolver.h @@ -61,8 +61,10 @@ class CMaxSumSolver { std::vector< CDeformationCost* > *edges; /**< */ // DT - int bw[2]; /**< */ - int tmpFsize; /**< */ + //int bw[2]; /**< */ + //int tmpFsize; /**< */ + size_t bw[2]; /**< */ + size_t tmpFsize; /**< */ fl_double_t * tmpA, * tmpB; /**< */ fl_double_t * rectangle; /**< */ fl_double_t * tmpDT; /**< */ diff --git a/libclandmark/CSparseLBPAppearanceModel.h b/libclandmark/CSparseLBPAppearanceModel.h index 88c01ea..3affa4c 100644 --- a/libclandmark/CSparseLBPAppearanceModel.h +++ b/libclandmark/CSparseLBPAppearanceModel.h @@ -122,7 +122,8 @@ class CSparseLBPAppearanceModel : public CAppearanceModel { const int kHeightOfPyramid; /**< */ int *LBPFeatures; /**< */ - int kSparseFeatureDimension; /**< */ + //int kSparseFeatureDimension; /**< */ + size_t kSparseFeatureDimension; /**< */ int *window; /**< */ }; diff --git a/libclandmark/CTreeMaxSumSolver.cpp b/libclandmark/CTreeMaxSumSolver.cpp index f09e162..f5fa1e5 100644 --- a/libclandmark/CTreeMaxSumSolver.cpp +++ b/libclandmark/CTreeMaxSumSolver.cpp @@ -93,7 +93,8 @@ CTreeMaxSumSolver::CTreeMaxSumSolver(std::vector< Vertex > * const vertices, std // prepare intermediate arrays for indices for (int i=0; i < kLandmarks; ++i) { - int best = 0, length = 0; + //int best = 0, length = 0; + size_t best = 0, length = 0; if (graph[i].ancestors.size() > 0) { best = vertices->at(graph[i].ancestors.at(0)).best; @@ -311,7 +312,8 @@ void CTreeMaxSumSolver::solve(const std::vector > &w, fl_double_t *W = w[kLandmarks+edgeID][0]; // Check for 0 weight (then DT is not working) - if (fabs(W[0]) <= FLT_EPSILON || fabs(W[1]) <= FLT_EPSILON || fabs(W[2]) <= FLT_EPSILON || fabs(W[3]) <= FLT_EPSILON) + //if (fabs(W[0]) <= FLT_EPSILON || fabs(W[1]) <= FLT_EPSILON || fabs(W[2]) <= FLT_EPSILON || fabs(W[3]) <= FLT_EPSILON) + if (W[0] == 0 || W[1] == 0 || W[2] == 0 || W[3] == 0) { // if any of the weight W is 0, DT cannot be used canUseDT = false; diff --git a/libclandmark/CXMLInOut.cpp b/libclandmark/CXMLInOut.cpp index 12bafb4..50b247c 100644 --- a/libclandmark/CXMLInOut.cpp +++ b/libclandmark/CXMLInOut.cpp @@ -88,6 +88,11 @@ XmlNode::operator int() XmlNode::operator fl_double_t() { fl_double_t value = 0x0; + + if (node == 0x0) + { + return 0x0; + } std::stringstream ss(node->value()); if ((ss >> value).fail()) @@ -159,7 +164,9 @@ XmlNode XmlStorage::operator [](const char *name) void XmlStorage::writeRaw(const void *bindata, int length) { char *base64Ascii; - int base64AsciiLen; + //int base64AsciiLen; + //base64Ascii = base64(bindata, length, &base64AsciiLen); + size_t base64AsciiLen; base64Ascii = base64(bindata, length, &base64AsciiLen); if (state == VALUE_EXPECTED) diff --git a/libclandmark/Flandmark.cpp b/libclandmark/Flandmark.cpp index 48684ed..9ceea81 100644 --- a/libclandmark/Flandmark.cpp +++ b/libclandmark/Flandmark.cpp @@ -172,6 +172,7 @@ Flandmark::Flandmark(const char *filename, bool train) throw (int) int graph_type; int bw_height, bw_width; fl_double_t bw_margin_x, bw_margin_y; + fl_double_t sigma; // Nodes int nodeID; @@ -218,6 +219,10 @@ Flandmark::Flandmark(const char *filename, bool train) throw (int) CLandmark::init(landmarksCount, edgesCount, bw_width, bw_height, bw_margin_x, bw_margin_y); + sigma = (fl_double_t)fs["sigma"]; + if (sigma != 0x0) + this->setSmoothingSigma(sigma); + // create nodes std::vector nodes = fs["Nodes"].getSet("Node"); for (unsigned int index = 0; index < nodes.size(); ++index) @@ -499,6 +504,11 @@ const int * Flandmark::getBaseWindowSize() return baseWindow; } +const fl_double_t * Flandmark::getBaseWindowMargin() +{ + return baseWindowMargin; +} + fl_double_t Flandmark::getScore() { fl_double_t score = 0.0; diff --git a/libclandmark/Flandmark.h b/libclandmark/Flandmark.h index dad098b..8ff40e6 100644 --- a/libclandmark/Flandmark.h +++ b/libclandmark/Flandmark.h @@ -129,6 +129,12 @@ class Flandmark : public CLandmark { * @return */ const int * getBaseWindowSize(); + + /** + * @brief getBaseWindowMargin + * @return + */ + const fl_double_t* getBaseWindowMargin(); /** * @brief getScore diff --git a/libclandmark/base64.h b/libclandmark/base64.h index 9b5bf98..625e6c9 100644 --- a/libclandmark/base64.h +++ b/libclandmark/base64.h @@ -69,7 +69,8 @@ const static unsigned char unb64[]={ // Converts binary data of length=len to base64 characters. // Length of the resultant string is stored in flen // (you must pass pointer flen). -char* base64( const void* binaryData, int len, int *flen ) +//char* base64( const void* binaryData, int len, int *flen ) +char* base64(const void* binaryData, int len, size_t *flen) { unsigned char* bin = (unsigned char*) binaryData ; char* res; @@ -123,7 +124,7 @@ unsigned char* unbase64( const char* ascii, int len, int *flen ) { unsigned char *safeAsciiPtr = (unsigned char*)ascii; unsigned char *bin; - int cb=0; + int cb = 0; int charNo; int pad = 0; diff --git a/libclandmark/clandmarkConfig.cmake.in b/libclandmark/clandmarkConfig.cmake.in deleted file mode 100644 index 7590162..0000000 --- a/libclandmark/clandmarkConfig.cmake.in +++ /dev/null @@ -1,5 +0,0 @@ -set(CLANDMARK_INCLUDE_DIRS "@CLANDMARK_INCLUDE_DIRS@") - -set(CLANDMARK_LIBRARIES "@CLANDMARK_LIBRARIES@") - -set(CLANDMARK_FOUND "TRUE") diff --git a/libclandmark/flandmarkConfig.cmake.in b/libclandmark/flandmarkConfig.cmake.in deleted file mode 100644 index 2a1f9df..0000000 --- a/libclandmark/flandmarkConfig.cmake.in +++ /dev/null @@ -1,5 +0,0 @@ -set(FLANDMARK_INCLUDE_DIRS "@FLANDMARK_INCLUDE_DIRS@") - -set(FLANDMARK_LIBRARIES "@FLANDMARK_LIBRARIES@") - -set(FLANDMARK_FOUND "TRUE") diff --git a/matlab_interface/CMakeLists.txt b/matlab_interface/CMakeLists.txt index 54e0695..c8e7f0a 100644 --- a/matlab_interface/CMakeLists.txt +++ b/matlab_interface/CMakeLists.txt @@ -2,11 +2,7 @@ set(MEX_NAME_flandmark_interface flandmark_interface) set(MEX_NAME_featuresPool_interface featuresPool_interface) # create mex subdirectory -if(DOUBLE_PRECISION) - file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab_interface/mex) -else(DOUBLE_PRECISION) - file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab_interface/mex_single_precision) -endif(DOUBLE_PRECISION) +file(MAKE_DIRECTORY ${PROJECT_SOURCE_DIR}/matlab_interface/mex) if(WIN32) find_program(MEX_CMD mex.bat) @@ -16,15 +12,6 @@ else(WIN32) find_program(MEXEXT_CMD mexext) endif(WIN32) -# propagate precision definition -# if(DOUBLE_PRECISION) -# add_definitions( -DDOUBLE_PRECISION=1 ) -# set(MEX_DEFINES "-DDOUBLE_PRECISION=1") -# else(DOUBLE_PRECISION) -# add_definitions( -DDOUBLE_PRECISION=0 ) -# set(MEX_DEFINES "-DDOUBLE_PRECISION=0") -# endif(DOUBLE_PRECISION) - if(MEX_CMD AND MEXEXT_CMD) get_filename_component(MEX_REAL_CMD ${MEX_CMD} ABSOLUTE) @@ -35,87 +22,76 @@ if(MEX_CMD AND MEXEXT_CMD) if(MEX_PATH STREQUAL MEXEXT_PATH) - execute_process(COMMAND ${MEXEXT_REAL_CMD} OUTPUT_VARIABLE MEX_EXTENSION OUTPUT_STRIP_TRAILING_WHITESPACE) - - set(MEX_FILE_flandmark_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_flandmark_interface}.${MEX_EXTENSION}) - set(MEX_FILE_featuresPool_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_featuresPool_interface}.${MEX_EXTENSION}) - - add_custom_command( - OUTPUT ${MEX_FILE_flandmark_interface} - COMMAND ${MEX_REAL_CMD} - ARGS -v -largeArrayDims #${MEX_DEFINES} - ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp -# -I${PROJECT_BINARY_DIR}/CLandmarkConfig.h - -I${PROJECT_BINARY_DIR} # DOUBLE_PRECISION - -I${PROJECT_SOURCE_DIR}/libclandmark - -I${RapidXML_INCLUDE_DIR} -# -I${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13 - -I${CImg_INCLUDE_DIR} - -I${CImg_INCLUDE_DIR}/plugins -# -I${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6 -# -I${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6/plugins - ${PROJECT_BINARY_DIR}/libclandmark/libflandmark.a - ${PROJECT_BINARY_DIR}/libclandmark/libclandmark.a - -output ${MEX_NAME_flandmark_interface} - DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp - COMMENT "Building MEX extension ${MEX_FILE_flandmark_interface}" - ) - - add_custom_command( - OUTPUT ${MEX_FILE_featuresPool_interface} - COMMAND ${MEX_REAL_CMD} - ARGS -v -largeArrayDims #${MEX_DEFINES} - ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp - ${PROJECT_BINARY_DIR}/libclandmark/libflandmark.a - ${PROJECT_BINARY_DIR}/libclandmark/libclandmark.a - -I${PROJECT_SOURCE_DIR}/libclandmark - -output ${MEX_NAME_featuresPool_interface} - DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp - COMMENT "Building MEX extension ${MEX_FILE_featuresPool_interface}" - ) - - - add_custom_target(${MEX_NAME_flandmark_interface} ALL DEPENDS ${MEX_FILE_flandmark_interface}) - add_custom_target(${MEX_NAME_featuresPool_interface} ALL DEPENDS ${MEX_FILE_featuresPool_interface}) - -if(DOUBLE_PRECISION) - add_custom_command( - TARGET ${MEX_NAME_flandmark_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_flandmark_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex - COMMENT "Copying ${MEX_FILE_flandmark_interface}" - ) - - add_custom_command( - TARGET ${MEX_NAME_featuresPool_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_featuresPool_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex - COMMENT "Copying ${MEX_FILE_featuresPool_interface}" - ) -else(DOUBLE_PRECISION) - add_custom_command( - TARGET ${MEX_NAME_flandmark_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_flandmark_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex_single_precision - COMMENT "Copying ${MEX_FILE_flandmark_interface}" - ) - - add_custom_command( - TARGET ${MEX_NAME_featuresPool_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_featuresPool_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex_single_precision - COMMENT "Copying ${MEX_FILE_featuresPool_interface}" - ) -endif(DOUBLE_PRECISION) - -install(FILES ${MEX_FILE_flandmark_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) -install(FILES ${MEX_FILE_featuresPool_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) - - else() + execute_process(COMMAND ${MEXEXT_REAL_CMD} OUTPUT_VARIABLE MEX_EXTENSION OUTPUT_STRIP_TRAILING_WHITESPACE) + + set(MEX_FILE_flandmark_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_flandmark_interface}.${MEX_EXTENSION}) + set(MEX_FILE_featuresPool_interface ${CMAKE_CURRENT_BINARY_DIR}/${MEX_NAME_featuresPool_interface}.${MEX_EXTENSION}) + + if (UNIX) + set(add_libclandmark "${PROJECT_BINARY_DIR}/libclandmark/libclandmark.a") + set(add_libflandmark "${PROJECT_BINARY_DIR}/libclandmark/libflandmark.a") + endif (UNIX) + + if (WIN32) + set(add_libclandmark "${PROJECT_BINARY_DIR}/libclandmark/Release/clandmark.lib") + set(add_libflandmark "${PROJECT_BINARY_DIR}/libclandmark/Release/flandmark.lib") + endif (WIN32) + + add_custom_command( + OUTPUT ${MEX_FILE_flandmark_interface} + COMMAND ${MEX_REAL_CMD} + ARGS -v -largeArrayDims #${MEX_DEFINES} + ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp + -I${PROJECT_BINARY_DIR} # DOUBLE_PRECISION + -I${PROJECT_SOURCE_DIR}/libclandmark + -I${RapidXML_INCLUDE_DIR} + -I${CImg_INCLUDE_DIR} + -I${CImg_INCLUDE_DIR}/plugins + ${add_libflandmark} + ${add_libclandmark} + -output ${MEX_NAME_flandmark_interface} + DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/flandmark_interface_mex.cpp + COMMENT "Building MEX extension ${MEX_FILE_flandmark_interface}" + ) + + add_custom_command( + OUTPUT ${MEX_FILE_featuresPool_interface} + COMMAND ${MEX_REAL_CMD} + ARGS -v -largeArrayDims #${MEX_DEFINES} + ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp + ${add_libflandmark} + ${add_libclandmark} + -I${PROJECT_SOURCE_DIR}/libclandmark + -output ${MEX_NAME_featuresPool_interface} + DEPENDS flandmark ${CMAKE_CURRENT_SOURCE_DIR}/featuresPool_interface_mex.cpp + COMMENT "Building MEX extension ${MEX_FILE_featuresPool_interface}" + ) + + add_custom_target(${MEX_NAME_flandmark_interface} ALL DEPENDS ${MEX_FILE_flandmark_interface}) + add_custom_target(${MEX_NAME_featuresPool_interface} ALL DEPENDS ${MEX_FILE_featuresPool_interface}) + + add_custom_command( + TARGET ${MEX_NAME_flandmark_interface} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_flandmark_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex + COMMENT "Copying ${MEX_FILE_flandmark_interface}" + ) + + add_custom_command( + TARGET ${MEX_NAME_featuresPool_interface} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${MEX_FILE_featuresPool_interface} ${PROJECT_SOURCE_DIR}/matlab_interface/mex + COMMENT "Copying ${MEX_FILE_featuresPool_interface}" + ) + + install(FILES ${MEX_FILE_flandmark_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) + install(FILES ${MEX_FILE_featuresPool_interface} DESTINATION share/clandmark/mex COMPONENT Matlab) + + else(MEX_PATH STREQUAL MEXEXT_PATH) message(WARNING "The 'mex' and 'mexext' programs have been found in different locations. It's likely that one of them is not part of the MATLAB installation. Make sure that the 'bin' directory from the MATLAB installation is in PATH") set(BUILD_MATLAB_BINDINGS OFF) - endif() + endif(MEX_PATH STREQUAL MEXEXT_PATH) -endif() +endif(MEX_CMD AND MEXEXT_CMD) diff --git a/matlab_interface/flandmark_class.m b/matlab_interface/flandmark_class.m index 2d25821..feb9e0d 100644 --- a/matlab_interface/flandmark_class.m +++ b/matlab_interface/flandmark_class.m @@ -105,6 +105,11 @@ function delete(this) function varargout = getBWsize(this, varargin) [varargout{1:nargout}] = flandmark_interface('getBWsize', this.objectHandle, varargin{:}); end; + + %% get_bw_margin - class method call + function varargout = getBWmargin(this, varargin) + [varargout{1:nargout}] = flandmark_interface('get_bw_margin', this.objectHandle, varargin{:}); + end; %% Get Landmarks Count - class method call function varargout = getLandmarksCount(this, varargin) @@ -141,6 +146,16 @@ function delete(this) [varargout{1:nargout}] = flandmark_interface('getIntermediateResults', this.objectHandle, varargin{:}); end; + %% getLandmarkNames - class method call + function varargout = getLandmarkNames(this, varargin) + [varargout{1:nargout}] = flandmark_interface('getLandmarkNames', this.objectHandle, varargin{:}); + end; + + %% getQs - class method call + function varargout = getQs(this, varargin) + [varargout{1:nargout}] = flandmark_interface('getQs', this.objectHandle, varargin{:}); + end; + %%% Two stage learning related methods ------------------------------------------------------------------------------ %% Get PsiNodes Base - class method call @@ -195,6 +210,21 @@ function delete(this) [varargout{1:nargout}] = flandmark_interface('getTimingsStats', this.objectHandle, varargin{:}); end; + %% Get edges - class method call + function varargout = getEdges(this, varargin) + [varargout{1:nargout}] = flandmark_interface('getEdges', this.objectHandle, varargin{:}); + end; + + %% Get name - class method call + function varargout = getName(this, varargin) + [varargout{1:nargout}] = flandmark_interface('getName', this.objectHandle, varargin{:}); + end; + + %% Get version - class method call + function varargout = getVersion(this, varargin) + [varargout{1:nargout}] = flandmark_interface('getVersion', this.objectHandle, varargin{:}); + end; + %%% SPEED UP -------------------------------------------------------------------------------------------------------- %% Set NF featuresPool - class method call diff --git a/matlab_interface/flandmark_interface_mex.cpp b/matlab_interface/flandmark_interface_mex.cpp index 22d5cf3..6e88a2f 100644 --- a/matlab_interface/flandmark_interface_mex.cpp +++ b/matlab_interface/flandmark_interface_mex.cpp @@ -818,12 +818,23 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) //if (nlhs < 0 || nrhs < 4 || nrhs > 5) if (nlhs < 0 || nrhs < 2 || nrhs > 5) { - //mexErrMsgTxt("getNF: unexpected arguments."); - mexErrMsgTxt("getNF: chujlo."); + mexErrMsgTxt("getNF: unexpected arguments.\n" + "Usgae:\n" + "\t [NF, GT] = getNormalizedFrame(Ibw, bbox, gt, sigma)\n" + "Input:\n" + "\t Ibw \t...\t [(n x m) uint8] grayscale input image \n" + "\t bbox \t...\t [(4 x 1) or (8 x 1) int32] bounding box \n" + "\t gt \t...\t [(2 x L) doubgle] annotated landmarks in image - (x; y) coordinates \n" + "Output: \n" + "\t NF \t...\t [bw(1) x bw(2) uint8] normalized image frame \n" + "\t GT \t...\t [(2 x L) int32] annotated landmarks in NF - (x; y) coordinates \n" + ); + } cimg_library::CImg *nf = 0x0; + // Do not calculate, just return NF from flandmark class if (nrhs == 2) { nf = flandmark_instance->getNF(); @@ -1484,6 +1495,31 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) return; } + + // get bw_margin + //--------------------------------------------------------------------------------------------- + if (!strcmp("get_bw_margin", cmd)) + { + // Check parameters + if (nlhs < 0 || nrhs != 2) + { + mexErrMsgTxt("get_bw_margin: unexpected arguments.\n" + "Usage: \n" + "\t ss = get_bw_margin(); \n" + "Output: \n" + "\t bw \t [2 x 1 (double)] vector\n"); + } + + // Get nodes search spaces + plhs[0] = mxCreateNumericMatrix(2, 1, mxDOUBLE_CLASS, mxREAL); + double *output = (double*)mxGetData(plhs[0]); + + const fl_double_t *bw_margin = flandmark_instance->getBaseWindowMargin(); + output[0] = bw_margin[0]; + output[1] = bw_margin[1]; + + return; + } // Get Landmarks Count dim //--------------------------------------------------------------------------------------------- @@ -2212,8 +2248,150 @@ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) return; } + // Get edges + if (!strcmp("getEdges", cmd)) + { + // Check the parameters + if (nlhs < 0 || nrhs != 2) + { + mexErrMsgTxt("getEdges: unexpected arguments.\n" + "Usage: \n" + "\t edges = getEdges();\n" + ); + } + + int *p_data; + int *edges = flandmark_instance->getEdges(); + for (int i=0; i < 2*flandmark_instance->getEdgesCount(); ++i) + edges[i] += 1; // MATLAB 1-based format indexing; + + plhs[0] = mxCreateNumericMatrix(2, flandmark_instance->getEdgesCount(), mxINT32_CLASS, mxREAL); + p_data = (int*)mxGetData(plhs[0]); + memcpy(p_data, edges, (2*flandmark_instance->getEdgesCount())*sizeof(int)); + delete [] edges; + + return; + } + + // Get name + if (!strcmp("getName", cmd)) + { + // Check the parameters + if (nlhs < 0 || nrhs != 2) + { + mexErrMsgTxt("getName: unexpected arguments.\n" + "Usage: \n" + "\t name = getName();\n" + ); + } + + plhs[0] = mxCreateString(flandmark_instance->getName().c_str()); + + return; + } + + // Get version + if (!strcmp("getVersion", cmd)) + { + // Check the parameters + if (nlhs < 0 || nrhs != 2) + { + mexErrMsgTxt("getVersion: unexpected arguments.\n" + "Usage: \n" + "\t version = getVersion();\n" + ); + } + + plhs[0] = mxCreateString(flandmark_instance->getVersion().c_str()); + + return; + } + /// DEBUG & HELPER functions ======================================================================== + if (!strcmp("getLandmarkNames", cmd)) + { + if (nlhs < 0 || nrhs != 2) + { + mexErrMsgTxt("getLandmarkNames: unexpected arguments.\n" + "Usage: \n" + "\t names = getLandmarkNames();\n" + ); + } + + std::vector landmarkNames = flandmark_instance->getLandmarkNames(); + + mxArray *arr; + plhs[0] = mxCreateCellMatrix(landmarkNames.size(), 1); + + for (unsigned int i=0; i < landmarkNames.size(); ++i) + { + arr = mxCreateString(landmarkNames[i].c_str()); + mxSetCell(plhs[0], i, arr); + } + + return; + } + + if (!strcmp("getQs", cmd)) + { + //TODO!!! + if (nlhs < 0 || nrhs != 2) + { + mexErrMsgTxt("getQs: unexpected arguments.\n" + "Usage: \n" + "\t Qs = getQs();\n" + ); + } + + std::vector< std::vector< fl_double_t* > > Qs = flandmark_instance->getQs(); + + mxArray *arr; + fl_double_t *p_data; + int ss[4]; + int siz[2]; + int length; + + plhs[0] = mxCreateCellMatrix(Qs.size(), 1); + + for (unsigned int i=0; i < Qs.size(); ++i) + { + if (Qs[i].size() == 1) + { + const int *tmp = flandmark_instance->getSearchSpace(i); + memcpy(&ss[0], tmp, 4*sizeof(int)); + siz[0] = ss[2]-ss[0]+1; + siz[1] = ss[3]-ss[1]+1; + length = siz[0]*siz[1]; + +#if DOUBLE_PRECISION==1 + arr = mxCreateNumericMatrix(siz[1], siz[0], mxDOUBLE_CLASS, mxREAL); +#else + arr = mxCreateNumericMatrix(siz[1], siz[0], mxSINGLE_CLASS, mxREAL); +#endif + p_data = (fl_double_t*)mxGetData(arr); + memcpy(p_data, Qs[i][0], (length)*sizeof(fl_double_t)); + mxSetCell(plhs[0], i, arr); + } else { + // TODO - do not forget to implement this (multiple appearances case) + } + } + + // clean Qs + if (!Qs.empty()) + { + for (unsigned int i=0; i < Qs.size(); ++i) + { + for (unsigned int j=0; j < Qs[i].size(); ++j) + delete [] Qs[i][j]; + Qs[i].clear(); + } + Qs.clear(); + } + + return; + } + if (!strcmp("getIntermediateResults", cmd)) { //TODO!! diff --git a/matlab_interface/functions/ChangeModelsSS.m b/matlab_interface/functions/ChangeModelsSS.m new file mode 100644 index 0000000..014e4c2 --- /dev/null +++ b/matlab_interface/functions/ChangeModelsSS.m @@ -0,0 +1,19 @@ +function ChangeModelsSS( fname, newSS, newfname ) +%CHANGEMODELSSS Summary of this function goes here +% Detailed explanation goes here + + fl = flandmark_class(fname, true); + W = fl.getW(); + clear fl; + + T = flandmark_xmlread(fname); + + create_xml_init('tmp.xml', T.numNodes, T.edges-1, T.compnames, newSS, T.components, T.bw, T.bw_margin, T.name); + + fl = flandmark_class('tmp.xml', true); + fl.setW(W); + fl.write(newfname); + clear fl; + +end + diff --git a/matlab_interface/functions/c2f_dpm.m b/matlab_interface/functions/c2f_dpm.m new file mode 100644 index 0000000..38d1d22 --- /dev/null +++ b/matlab_interface/functions/c2f_dpm.m @@ -0,0 +1,25 @@ +function [ P, refined_bbox, Stats ] = c2f_dpm( Ibw, bbox1, cdpm_flandmark, fdpm_flandmark ) +%C2F_DPM Summary of this function goes here +% Detailed explanation goes here + + % Detect landmarks - Coarse + [Pcoarse, Stats1, score1, QG1] = flandmark_opt_sv_detector(Ibw, int32(bbox1), cdpm_flandmark); + + % construct ideal bbox from GT + bbox2 = getUpdatedBBOX(Pcoarse); + + % Detect landmarks - Fine + [P, Stats2, score2, QG2] = flandmark_opt_sv_detector(Ibw, int32(bbox2(:)), fdpm_flandmark); + + Stats = []; + Stats.CDPM = Stats1; + Stats.FDPM = Stats2; + Stats.score_CDPM = score1; + Stats.score_FDPM = score2; + Stats.QG_CDPM = QG1; + Stats.QG_FDPM = QG2; + + refined_bbox = getUpdatedBBOX(P); + +end + diff --git a/matlab_interface/functions/create_xml_init.m b/matlab_interface/functions/create_xml_init.m new file mode 100644 index 0000000..2ea4498 --- /dev/null +++ b/matlab_interface/functions/create_xml_init.m @@ -0,0 +1,76 @@ +function create_xml_init( fname, M, edges, landmark_names, SS, components, bw, bw_margin, name, sigma ) +%CREATE_XML_INIT Summary of this function goes here +% Detailed explanation goes here + + if nargin < 10 + sigma = -1; + end; + + fid = fopen(fname, 'w'); + + %% Header of XML-file + + fprintf(fid, '\n'); + fprintf(fid, '\n'); + fprintf(fid, ['\t' name '\n']); + fprintf(fid, ['\t' datestr(now, 'ddd mmm dd HH:MM:SS YYYY') '\n']); + fprintf(fid, ['\t' num2str(M) '\n']); + fprintf(fid, ['\t' num2str(M-1) '\n']); + fprintf(fid, '\t1\n'); + fprintf(fid, ['\t' num2str(bw(1)) '\n']); + fprintf(fid, ['\t' num2str(bw(2)) '\n']); + fprintf(fid, ['\t' num2str(bw_margin(1)) '\n']); + fprintf(fid, ['\t' num2str(bw_margin(2)) '\n']); + fprintf(fid, ['\t' num2str(sigma) '\n']); + + %% XML - nodes + + fprintf(fid, '\t\n'); + + for j = 1 : M + + fprintf(fid, '\t\t\n'); + fprintf(fid, '\t\t\t
\n'); + fprintf(fid, ['\t\t\t\t' num2str(j-1) '\n']); + fprintf(fid, ['\t\t\t\t' landmark_names{j} '\n']); + fprintf(fid, ['\t\t\t\t' num2str(SS(1, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(SS(2, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(SS(3, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(SS(4, j)) '\n']); + fprintf(fid, '\t\t\t\tTABLE_LOSS\n'); + fprintf(fid, ['\t\t\t\t' num2str(components(1, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(components(2, j)) '\n']); + fprintf(fid, '\t\t\t
\n'); + fprintf(fid, '\t\t\t\n'); + fprintf(fid, '\t\t\t\t\n'); + fprintf(fid, '\t\t\t\t\tSPARSE_LBP\n'); + fprintf(fid, '\t\t\t\t\t4\n'); + fprintf(fid, '\t\t\t\t\n'); + fprintf(fid, '\t\t\t\n'); + fprintf(fid, '\t\t
\n'); + + end; + + fprintf(fid, '\t
\n'); + + %% XML - edges + + fprintf(fid, '\t\n'); + + for j = 1 : size(edges, 2); + + fprintf(fid, '\t\t\n'); + fprintf(fid, ['\t\t\t' num2str(edges(1, j)) '\n']); + fprintf(fid, ['\t\t\t' num2str(edges(2, j)) '\n']); + fprintf(fid, '\t\t\t1\n'); + fprintf(fid, '\t\t\t4\n'); + fprintf(fid, '\t\t\n'); + + end; + + fprintf(fid, '\t\n'); + fprintf(fid, '
\n'); + fclose(fid); + +end + diff --git a/matlab_interface/functions/create_xml_init2.m b/matlab_interface/functions/create_xml_init2.m new file mode 100644 index 0000000..1c20d0a --- /dev/null +++ b/matlab_interface/functions/create_xml_init2.m @@ -0,0 +1,76 @@ +function create_xml_init2( fname, model, sigma ) +%CREATE_XML_INIT Summary of this function goes here +% Detailed explanation goes here + + if nargin < 3 + sigma = -1; + end; + + fid = fopen(fname, 'w'); + + %% Header of XML-file + + fprintf(fid, '\n'); + fprintf(fid, '\n'); + fprintf(fid, ['\t' model.name '\n']); + fprintf(fid, ['\t' datestr(now, 'ddd mmm dd HH:MM:SS YYYY') '\n']); + fprintf(fid, ['\t' num2str(model.M) '\n']); + fprintf(fid, ['\t' num2str(model.M-1) '\n']); + fprintf(fid, '\t1\n'); + fprintf(fid, ['\t' num2str(model.bw(1)) '\n']); + fprintf(fid, ['\t' num2str(model.bw(2)) '\n']); + fprintf(fid, ['\t' num2str(model.bw_margin(1)) '\n']); + fprintf(fid, ['\t' num2str(model.bw_margin(2)) '\n']); + fprintf(fid, ['\t' num2str(sigma) '\n']); + + %% XML - nodes + + fprintf(fid, '\t\n'); + + for j = 1 : model.M + + fprintf(fid, '\t\t\n'); + fprintf(fid, '\t\t\t
\n'); + fprintf(fid, ['\t\t\t\t' num2str(j-1) '\n']); + fprintf(fid, ['\t\t\t\t' model.landmark_names{j} '\n']); + fprintf(fid, ['\t\t\t\t' num2str(model.ss(1, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(model.ss(2, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(model.ss(3, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(model.ss(4, j)) '\n']); + fprintf(fid, '\t\t\t\tTABLE_LOSS\n'); + fprintf(fid, ['\t\t\t\t' num2str(model.components(1, j)) '\n']); + fprintf(fid, ['\t\t\t\t' num2str(model.components(2, j)) '\n']); + fprintf(fid, '\t\t\t
\n'); + fprintf(fid, '\t\t\t\n'); + fprintf(fid, '\t\t\t\t\n'); + fprintf(fid, '\t\t\t\t\tSPARSE_LBP\n'); + fprintf(fid, '\t\t\t\t\t4\n'); + fprintf(fid, '\t\t\t\t\n'); + fprintf(fid, '\t\t\t\n'); + fprintf(fid, '\t\t
\n'); + + end; + + fprintf(fid, '\t
\n'); + + %% XML - edges + + fprintf(fid, '\t\n'); + + for j = 1 : size(model.edges, 2); + + fprintf(fid, '\t\t\n'); + fprintf(fid, ['\t\t\t' num2str(model.edges(1, j)) '\n']); + fprintf(fid, ['\t\t\t' num2str(model.edges(2, j)) '\n']); + fprintf(fid, '\t\t\t1\n'); + fprintf(fid, '\t\t\t4\n'); + fprintf(fid, '\t\t\n'); + + end; + + fprintf(fid, '\t\n'); + fprintf(fid, '
\n'); + fclose(fid); + +end + diff --git a/matlab_interface/functions/flandmark_opt_sv_detector.m b/matlab_interface/functions/flandmark_opt_sv_detector.m new file mode 100644 index 0000000..7b3039a --- /dev/null +++ b/matlab_interface/functions/flandmark_opt_sv_detector.m @@ -0,0 +1,14 @@ +function [ P, stats, score, QG ] = flandmark_opt_sv_detector( Ibw, bbox, flandmark ) +%FLANDMARK_SV_DETECTOR Summary of this function goes here +% Detailed explanation goes here +% +% 2015-07-14, Michal Uricar + + % check inputs + %TODO + + [P, score, QG] = flandmark.detect_optimized(Ibw, bbox); + stats = flandmark.getTimingsStats(); + +end + diff --git a/matlab_interface/functions/getOverlapAABB.m b/matlab_interface/functions/getOverlapAABB.m new file mode 100644 index 0000000..2037193 --- /dev/null +++ b/matlab_interface/functions/getOverlapAABB.m @@ -0,0 +1,19 @@ +function [ relative_overlap, gtbbox ] = getOverlapAABB( gt, p ) +%GETOVERLAPAABB Summary of this function goes here +% Detailed explanation goes here + + gtbbox = double([min(gt(1, :)) min(gt(2, :)) max(gt(1, :)) max(gt(2, :))]); + gtrect = double([gtbbox(1) gtbbox(2) gtbbox(3)-gtbbox(1)+1 gtbbox(4)-gtbbox(2)+1]); + + aabb = double([min(p(1, :)) min(p(2, :)) max(p(1, :)) max(p(2, :))]); + aabbrect = double([aabb(1) aabb(2) aabb(3)-aabb(1)+1 aabb(4)-aabb(2)+1]); + + unionP = [reshape(gtbbox, 2, 2), reshape(aabb, 2, 2)]; + unionCoords = double([min(unionP(1, :)) min(unionP(2, :)) max(unionP(1, :)) max(unionP(2, :))]); + + intersectArea = rectint(gtrect, aabbrect); + unionArea=(unionCoords(3)-unionCoords(1)+1)*(unionCoords(4)-unionCoords(2)+1); + relative_overlap = intersectArea/unionArea; + +end + diff --git a/matlab_interface/functions/getUpdatedBBOX.m b/matlab_interface/functions/getUpdatedBBOX.m new file mode 100644 index 0000000..71d2c07 --- /dev/null +++ b/matlab_interface/functions/getUpdatedBBOX.m @@ -0,0 +1,42 @@ +function [ bbox, full_bb1 ] = getUpdatedBBOX( P ) +%GETUPDATEDBBOX Summary of this function goes here +% Detailed explanation goes here + + left_eye = [43, 44, 45, 46, 47, 48]; + right_eye = [37, 38, 39, 40, 41, 42]; + eyes = [right_eye, [28], left_eye]; + mouth = [49:68]; + centerline = [28, 29, 30, 31, 34, 52, 63, 67, 58, 9]; + + f2 = lsbestline(P(1, eyes)', P(2, eyes)'); + + LeftEye = [mean(P(1, left_eye)); mean(P(2, left_eye))]; + RightEye = [mean(P(1, right_eye)); mean(P(2, right_eye))]; + Mouth = [mean(P(1, mouth)); mean(P(2, mouth))]; + + d = norm(LeftEye-RightEye); + NP = 0.5*(LeftEye+RightEye); +% CP = 0.6*NP+0.4*Mouth; +% CP = [mean(P(1, :)); mean(P(2, :)) ]; + CP = [mean(P(1, 18:end)); mean(P(2, 18:end)) ]; + + enlarge_coeff = 2.7; + bb_origin = [-d/2, d/2, d/2, -d/2; -d/2, -d/2, d/2, d/2]; + % full_bb1 = [CP(1)-d/2, CP(1)+d/2, CP(1)+d/2, CP(1)-d/2; CP(2)-d/2, CP(2)-d/2, CP(2)+d/2, CP(2)+d/2]; + full_bb1 = bb_origin + repmat(CP, 1, 4); + bb_origin = bb_origin*enlarge_coeff; + + X1 = [0; 0]; + X2 = [1; 0]; + vX = X2 - X1; + A1 = [X1(1); f2(1)+f2(2)*X1(1)]; + A2 = [X2(1); f2(1)+f2(2)*X2(1)]; + vA = A2 - A1; + ph = atan2(vA(2), vA(1)); +% phi = ph*180/pi; + RotMat = [cos(ph) -sin(ph) 0; sin(ph) cos(ph) 0; 0 0 1]; + full_bb2 = RotMat*[bb_origin; ones(1, 4)]; + bbox = full_bb2(1:2, :)+repmat(CP, 1, 4); + +end + diff --git a/matlab_interface/functions/isGTcompatibleWithModel.m b/matlab_interface/functions/isGTcompatibleWithModel.m new file mode 100644 index 0000000..193f50b --- /dev/null +++ b/matlab_interface/functions/isGTcompatibleWithModel.m @@ -0,0 +1,20 @@ +function [ out ] = isGTcompatibleWithModel( GT, model ) +%VALIDATEGTWITHMODEL Summary of this function goes here +% Detailed explanation goes here + + if size(GT, 2) ~= size(model.ss, 2) || size(GT, 2) ~= size(model.components, 2) + error('GT and model are not compatible!\n'); + end; + + out = true; + for j = 1 : size(GT, 2) + + if ( (GT(1, j) < model.ss(1, j)) || (GT(2, j) < model.ss(2, j)) || ... + (GT(1, j) > model.ss(3, j)) || (GT(2, j) > model.ss(4, j)) ) + out = false; + return; + end; + + end; + +end diff --git a/matlab_interface/functions/lsbestline.m b/matlab_interface/functions/lsbestline.m new file mode 100644 index 0000000..8eb5d2b --- /dev/null +++ b/matlab_interface/functions/lsbestline.m @@ -0,0 +1,12 @@ +function [ f ] = lsbestline( x, y ) +%LSBESTLINE Summary of this function goes here +% Detailed explanation goes here + + f = nan(2, 1); + + mx = mean(x); + my = mean(y); + f(2) = ((x-mx)'*(y-my))/sum((x-mx).^2); + f(1) = my - f(2)*mx; + +end \ No newline at end of file diff --git a/matlab_interface/functions/plotLandmarks.m b/matlab_interface/functions/plotLandmarks.m new file mode 100644 index 0000000..11a9220 --- /dev/null +++ b/matlab_interface/functions/plotLandmarks.m @@ -0,0 +1,22 @@ +function plotLandmarks( P, bbox, edges ) +%PLOTLANDMARKS Summary of this function goes here +% Detailed explanation goes here +% +% 2015-07-14, Michal Uricar + + if numel(bbox) > 4 + plotbox_full(bbox, 'color', 'y'); + else + plotbox(bbox, 'color', 'y'); + end; + + if nargin > 2 + for a = 1 : numel(edges(1, :)) + line([P(1, edges(1, a)) P(1, edges(2, a))], [P(2, edges(1, a)) P(2, edges(2, a))], 'color', 'b'); + end; + end; + + plot(P(1, :), P(2, :), 'r*'); + +end + diff --git a/matlab_interface/functions/plotbox.m b/matlab_interface/functions/plotbox.m new file mode 100644 index 0000000..b9251d9 --- /dev/null +++ b/matlab_interface/functions/plotbox.m @@ -0,0 +1,55 @@ +function h=plotbox(box,varargin) +% PLOTBOX Plots box(es) to the current figure. +% +% Synopsis: +% h=plotbox(box) +% h=plotbox(box,plot_arguments) +% +% Input: +% box [4 x numOfBoxes] box coordinates when each column has the format +% [top_left_col top_left_row bottom_right_col bottom_right_row] +% +% plot_arguments [...] agruments passed to plot fuction. +% +% Output: +% h [4 x numOfBoxes] hnadles to lines forming the boxes. +% +% + +if nargin < 2 + line_style = {'b'}; +else + line_style= varargin; +end + +current_ishold = ishold; +hold on; + +if min(size(box)) == 1 + + h = [0 0 0 0]'; + h(1)=plot([box(1) box(1)],[box(2) box(4)],line_style{:}); + h(2)=plot([box(3) box(3)],[box(2) box(4)],line_style{:}); + h(3)=plot([box(1) box(3)],[box(2) box(2)],line_style{:}); + h(4)=plot([box(1) box(3)],[box(4) box(4)],line_style{:}); +else + if size(box,1) ~= 4 + box = box'; + end + + h=[]; + for i=1:size(box,2) + h = [h plotbox(box(:,i),line_style{:})]; + end +end + +if ~current_ishold + hold off; +end + +%EOF + + + + + \ No newline at end of file diff --git a/matlab_interface/functions/speedup_jointmv_b_detector.m b/matlab_interface/functions/speedup_jointmv_b_detector.m new file mode 100644 index 0000000..b1cd1ff --- /dev/null +++ b/matlab_interface/functions/speedup_jointmv_b_detector.m @@ -0,0 +1,30 @@ +function [ P, view, S, QG, Stats ] = speedup_jointmv_b_detector( img, flandmark_pool, biasTerms, featuresPool, views, bbox ) +%JOINTMV_DETECTOR_SPEEDUP Summary of this function goes here +% Detailed explanation goes here + + if numel(flandmark_pool) ~= numel(views) + error('Number of flandmark instances in the pool and discretized views must match.'); + end; + + PHIS = numel(flandmark_pool); + + D = cell(PHIS, 1); + S = nan(PHIS, 1); + QGs = cell(PHIS, 1); + Stats = cell(PHIS, 1); + + % update features + featuresPool.computeFromNF(flandmark_pool{1}.getNormalizedFrame(img, bbox)'); + for phi = 1 : PHIS + [D{phi}, S(phi), QGs{phi}] = flandmark_pool{phi}.detectOptimizedFromPool(bbox); + Stats{phi} = flandmark_pool{phi}.getTimingsStats(); + end; + S = S + biasTerms; + [~, maxPhi] = max(S); + + P = D{maxPhi}; + view = views{maxPhi}; + QG = QGs{maxPhi}; + +end + diff --git a/matlab_interface/functions/speedup_jointmv_detector.m b/matlab_interface/functions/speedup_jointmv_detector.m new file mode 100644 index 0000000..c3d5384 --- /dev/null +++ b/matlab_interface/functions/speedup_jointmv_detector.m @@ -0,0 +1,26 @@ +function [ P, view, S ] = speedup_jointmv_detector( img, flandmark_pool, featuresPool, views, bbox ) +%JOINTMV_DETECTOR_SPEEDUP Summary of this function goes here +% Detailed explanation goes here + + if numel(flandmark_pool) ~= numel(views) + error('Number of flandmark instances in the pool and discretized views must match.'); + end; + + PHIS = numel(flandmark_pool); + + D = cell(PHIS, 1); + S = nan(PHIS, 1); + + % update features + featuresPool.computeFromNF(flandmark_pool{1}.getNormalizedFrame(img, bbox)'); + for phi = 1 : PHIS + [D{phi}, S(phi)] = flandmark_pool{phi}.detectOptimizedFromPool(bbox); + end; + + [~, maxPhi] = max(S); + + P = D{maxPhi}; + view = views{maxPhi}; + +end + diff --git a/matlab_interface/functions/speedup_mv_detector.m b/matlab_interface/functions/speedup_mv_detector.m new file mode 100644 index 0000000..423bc2f --- /dev/null +++ b/matlab_interface/functions/speedup_mv_detector.m @@ -0,0 +1,44 @@ +function [ P, view ] = speedup_mv_detector( img, flandmark_pool, featuresPool, detection ) +%CLANDMARK_MULTIVIEW_DETECTOR Summary of this function goes here +% Detailed explanation goes here + + bbox = [detection.Position.BoundingBox.TopLeftCol; + detection.Position.BoundingBox.TopLeftRow; + detection.Position.BoundingBox.TopRightCol; + detection.Position.BoundingBox.TopRightRow; + detection.Position.BoundingBox.BotRightCol; + detection.Position.BoundingBox.BotRightRow; + detection.Position.BoundingBox.BotLeftCol; + detection.Position.BoundingBox.BotLeftRow]; + + bbox = int32(bbox'); + + angles = detection.Angles; + yaw = angles(end); + + if (yaw > -110 && yaw <= -60) + flandmark = flandmark_pool{1}; + view = '-profile'; + elseif (yaw > -60 && yaw <= -15) + flandmark = flandmark_pool{2}; + view = '-half-profile'; + elseif (yaw > -15 && yaw <= 15) + flandmark = flandmark_pool{3}; + view = 'frontal'; + elseif (yaw >= 15 && yaw < 60) + flandmark = flandmark_pool{4}; + view = 'half-profile'; + elseif (yaw >= 60 && yaw < 110) + flandmark = flandmark_pool{5}; + view = 'profile'; + else + view = 'NaN'; + P = []; + return; + end; + + featuresPool.computeFromNF(flandmark.getNormalizedFrame(img, bbox)'); + P = flandmark.detectOptimizedFromPool(bbox); + +end + diff --git a/matlab_interface/mex/featuresPool_interface.mexa64 b/matlab_interface/mex/featuresPool_interface.mexa64 index 275d89a..38d202e 100644 Binary files a/matlab_interface/mex/featuresPool_interface.mexa64 and b/matlab_interface/mex/featuresPool_interface.mexa64 differ diff --git a/matlab_interface/mex/flandmark_interface.mexa64 b/matlab_interface/mex/flandmark_interface.mexa64 index 8d944aa..1a07495 100644 Binary files a/matlab_interface/mex/flandmark_interface.mexa64 and b/matlab_interface/mex/flandmark_interface.mexa64 differ diff --git a/matlab_interface/simple_example.m b/matlab_interface/simple_example.m new file mode 100644 index 0000000..1683b19 --- /dev/null +++ b/matlab_interface/simple_example.m @@ -0,0 +1,89 @@ +%% simple_example.m +% Test flandmark detector +% +% 04-15-16 Michal Uricar + +clc; +clearvars; close all; + +%% Add path + +addpath('../learning/flandmark/code/functions/'); + +% DOUBLE PRECISION +% rmpath('./mex_single_precision/'); +addpath('./mex/'); + +% SINGLE PRECISION +% rmpath('./mex/'); +% addpath('./mex_single_precision/'); + +addpath('./functions/'); + +DIR = '../data/Images/'; +IMGS = dir([DIR '*.jpg']); + +N = 10; + +%% Init flandmark + +% CDPM +cdpm_model = './models/CDPM.xml'; +cdpm_flandmark = flandmark_class(cdpm_model); +bw = cdpm_flandmark.getBWsize(); +cdpm_featuresPool = featuresPool_class(bw(1), bw(2)); +cdpm_featuresPool.addLBPSparseFeatures(0); +cdpm_flandmark.setFeaturesPool(cdpm_featuresPool.getHandle()); + +% FDPM +fdpm_model = './models/FDPM.xml'; +fdpm_flandmark = flandmark_class(fdpm_model); +bw = fdpm_flandmark.getBWsize(); +fdpm_featuresPool = featuresPool_class(bw(1), bw(2)); +fdpm_featuresPool.addLBPSparseFeatures(0); +fdpm_flandmark.setFeaturesPool(fdpm_featuresPool.getHandle()); + +edges = fdpm_flandmark.getEdges(); +landmark_names = fdpm_flandmark.getLandmarkNames(); + +%% Run detector + +for example = 1 : N + + % pick random image + idx = randi(numel(IMGS)); +% idx = example; + filename = IMGS(idx).name; + fname = filename(1:end-4); + % load image and detected face bbox + I = imread([DIR filename]); + Ibw = rgb2gray(I); + bbox = dlmread([DIR fname '.det']); + + % image output + figure(1); clf(1); + imshow(I, [], 'Border', 'tight'); hold on; + % plotbox(bbox); + + for i = 1 : size(bbox, 1) + [ P, refined_bbox, Stats ] = c2f_dpm(Ibw, int32(bbox(i, :)), cdpm_flandmark, fdpm_flandmark); + fprintf('MEX detect: Elapsed time %f ms \t %s \n', Stats.CDPM.overall+Stats.FDPM.overall, fname); + + % show landmarks + plot(P(1, :), P(2, :), 'rs', 'LineWidth', 1, 'MarkerSize', 5, 'MarkerFaceColor', 'r'); +% text(P(1, :), P(2, :), landmark_names, 'color', 'r', 'FontSize', 12, 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right'); + for a = 1 : numel(edges(1, :)) + line([P(1, edges(1, a)) P(1, edges(2, a))], [P(2, edges(1, a)) P(2, edges(2, a))], 'color', 'b'); + end; + end; + + pause(0.3); + +end; + +%% Destroy flandmark + +clear cdpm_flandmark; +clear fdpm_flandmark; +clear cdpm_featuresPool; +clear fdpm_featuresPool; diff --git a/python_interface/CMakeLists.txt b/python_interface/CMakeLists.txt index e2aaf44..f6c0a18 100644 --- a/python_interface/CMakeLists.txt +++ b/python_interface/CMakeLists.txt @@ -1,33 +1,61 @@ -set(PY_NAME_interface python_interface) - -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wlong-long") +# python_interface/CMakeLists.txt -# Include the CMake script UseCython.cmake. This defines add_cython_module(). -# Instruction for use can be found at the top of cmake/UseCython.cmake. -include( UseCython ) +find_package(clandmark REQUIRED) +find_package(python) -# create mex subdirectory +include_directories( + ${CLANDMARK_INCLUDE_DIRS} + ${FLANDMARK_INCLUDE_DIRS} +) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13) +# include_directories(${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6) + +# execute_process(COMMAND python -c "import numpy as np; print np.get_include()" OUTPUT_VARIABLE NUMPY_INCLUDE) +execute_process( + # COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print('\"{}\"'.format(numpy.get_include()));" + COMMAND ${PYTHON_EXECUTABLE} -c "import numpy; print('{}'.format(numpy.get_include()));" + ERROR_VARIABLE NUMPY_FIND_ERROR + RESULT_VARIABLE NUMPY_FIND_RESULT + OUTPUT_VARIABLE NUMPY_FIND_OUTPUT + OUTPUT_STRIP_TRAILING_WHITESPACE +) +message(STATUS "NUMPY_FIND_ERROR = ${NUMPY_FIND_ERROR}") +message(STATUS "NUMPY_FIND_RESULT = ${NUMPY_FIND_RESULT}") +message(STATUS "NUMPY_FIND_OUTPUT = ${NUMPY_FIND_OUTPUT}") +include_directories(${NUMPY_FIND_OUTPUT}) + +set(PY_NAME_interface python_interface) + +if(UNIX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wlong-long -Wl,-rpath,'$ORIGIN/'") +endif(UNIX) -include_directories( ${PROJECT_SOURCE_DIR}/libclandmark ) -include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/rapidxml-1.13 ) -include_directories( ${PROJECT_SOURCE_DIR}/3rd_party/CImg-1.5.6 ) +# if (WIN32) + # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /link,/rpath,$ORIGIN/") +# endif(WIN32) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wlong-long") #-Weffc++") + +#message("CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}") + +# Include the CMake script UseCython.cmake. This defines add_cython_module(). +# Instruction for use can be found at the top of cmake/UseCython.cmake. +include( UseCython ) # With CMake, a clean separation can be made between the source tree and the # build tree. When all source is compiled, as with pure C/C++, the source is # no-longer needed in the build tree. However, with pure *.py source, the # source is processed directly. To handle this, we reproduce the availability # of the source files in the build tree. - -add_custom_target( ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P +add_custom_target( + ReplicatePythonSourceTree ALL ${CMAKE_COMMAND} -P ${CMAKE_MODULE_PATH}/ReplicatePythonSourceTree.cmake ${CMAKE_CURRENT_BINARY_DIR} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + -#form example # Process the CMakeLists.txt in the 'src' and 'bin' directory. -add_subdirectory( src ) -add_subdirectory( bin ) +add_subdirectory(src) +add_subdirectory(bin) diff --git a/python_interface/bin/CMakeLists.txt b/python_interface/bin/CMakeLists.txt index 9ee9de5..36cef1d 100644 --- a/python_interface/bin/CMakeLists.txt +++ b/python_interface/bin/CMakeLists.txt @@ -1,14 +1,29 @@ +# python_interface/bin/CMakeLists.txt + # If the pyx file is a C++ file, we should specify that here. -set_source_files_properties( ${PROJECT_SOURCE_DIR}/python_interface/src/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE ) +set_source_files_properties(${PROJECT_SOURCE_DIR}/python_interface/src/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE) -set(CLANDMARK_LIBRARIES - -L${PROJECT_BINARY_DIR}/libclandmark - -lflandmark - -lclandmark) +#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,'$ORIGIN/' " ) -cython_add_standalone_executable( flandmark-demo MAIN_MODULE flandmark_demo.py - ${PROJECT_SOURCE_DIR}/python_interface/src/py_flandmark.pyx - flandmark_demo.py - ) +cython_add_standalone_executable( + flandmark-demo MAIN_MODULE flandmark_demo.py + ${PROJECT_SOURCE_DIR}/python_interface/src/py_flandmark.pyx + flandmark_demo.py +) -target_link_libraries(flandmark-demo ${CLANDMARK_LIBRARIES}) \ No newline at end of file +# target_link_libraries(flandmark-demo ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) +target_link_libraries(flandmark-demo ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) +## TRY THIS +if(APPLE) + set_target_properties(flandmark-demo PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +else(APPLE) + if (UNIX) + message(STATUS "Linking target flandmark-demo against libpython") + target_link_libraries(flandmark-demo ${PYTHON_LIBRARIES}) + endif(UNIX) + if (MSVC) + message(STATUS "Not linking target flandmark-demo against libpython") + set_target_properties(flandmark-demo PROPERTIES LINK_FLAGS "/LTCG") + endif(MSVC) +endif(APPLE) +######### diff --git a/python_interface/bin/flandmark_demo.py b/python_interface/bin/flandmark_demo.py index 822697e..0fcd03a 100644 --- a/python_interface/bin/flandmark_demo.py +++ b/python_interface/bin/flandmark_demo.py @@ -8,26 +8,26 @@ def rgb2gray(rgb): - """ - converts rgb array to grey scale variant - accordingly to fomula taken from wiki - (this function is missing in python) - """ - return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) + """ + converts rgb array to grey scale variant + accordingly to fomula taken from wiki + (this function is missing in python) + """ + return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) def read_bbox_from_txt(file_name): - """ - returns 2x2 matrix coordinates of - left upper and right lower corners - of rectangle that contains face stored - in columns of matrix - """ - f = open(file_name) - str = f.read().replace(',', ' ') - f.close() - ret = np.array(map(int,str.split()) ,dtype=np.int32) - ret = ret.reshape((2,2), order='F') - return ret + """ + returns 2x2 matrix coordinates of + left upper and right lower corners + of rectangle that contains face stored + in columns of matrix + """ + f = open(file_name) + str = f.read().replace(',', ' ') + f.close() + ret = np.array(list(map(int,str.split())) ,dtype=np.int32) + ret = ret.reshape((2,2), order='F') + return ret DIR = '../../../data/Images/' @@ -37,55 +37,56 @@ def read_bbox_from_txt(file_name): for jpg_name in JPGS: - file_name = jpg_name[:-4] - img = Image.open(DIR + jpg_name) - arr = rgb2gray(np.asarray(img)) - bbox = read_bbox_from_txt(DIR + jpg_name[:-4] + '.det') + file_name = jpg_name[:-4] + img = Image.open(DIR + jpg_name) + arr = rgb2gray(np.asarray(img)) + bbox = read_bbox_from_txt(DIR + jpg_name[:-4] + '.det') - d_landmarks = flmrk.detect(arr, bbox) - n = d_landmarks.shape[1] + d_landmarks = flmrk.detect(arr, bbox) + n = d_landmarks.shape[1] - print "test detect method" + print("test detect method") - im = Image.fromarray(arr) - img_dr = ImageDraw.Draw(im) - img_dr.rectangle([tuple(bbox[:,0]), tuple(bbox[:,1])], outline="#FF00FF") - r = 2. - for i in xrange(n): - x = d_landmarks[0,i] - y = d_landmarks[1,i] - img_dr.ellipse((x-r, y-r, x+r, y+r), fill=0.) + im = Image.fromarray(arr) + img_dr = ImageDraw.Draw(im) + img_dr.rectangle([tuple(bbox[:,0]), tuple(bbox[:,1])], outline="#FF00FF") + r = 2. + for i in range(n): + x = d_landmarks[0,i] + y = d_landmarks[1,i] + img_dr.ellipse((x-r, y-r, x+r, y+r), fill=0.) - plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) - plt.show() + plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) + plt.show() - print "test detect method" + print("test get_normalized_frame method") - frame = flmrk.get_normalized_frame(arr, bbox)[0] - frame = frame.astype(np.double) - im = Image.fromarray(frame) - plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) - plt.show() + frame = flmrk.get_normalized_frame(arr, bbox)[0] + frame = frame.astype(np.double) + im = Image.fromarray(frame) + plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) + plt.show() - print "test detect_base method" + print("test detect_base method") - landmarks = flmrk.detect_base(frame) - - im = Image.fromarray(frame) - img_dr = ImageDraw.Draw(im) - - r = 2. - for i in xrange(n): - x = landmarks[0,i] - y = landmarks[1,i] - img_dr.ellipse((x-r, y-r, x+r, y+r), fill=0.) + landmarks = flmrk.detect_base(frame) - plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) - plt.show() + im = Image.fromarray(frame) + img_dr = ImageDraw.Draw(im) - print "test psi method" - psi = flmrk.get_psi(frame, landmarks.astype(np.int32), bbox) + r = 2. + for i in range(n): + x = landmarks[0, i] + y = landmarks[1, i] + img_dr.ellipse((x-r, y-r, x+r, y+r), fill=0.) + + plt.imshow(np.asarray(im), cmap = plt.get_cmap('gray')) + plt.show() + + print("test psi method") + # psi = flmrk.get_psi(frame, landmarks.astype(np.int32), bbox) + psi = flmrk.get_psi(landmarks, frame, bbox) #flmrk.get_psi(d_landmarks, arr, bbox) - break \ No newline at end of file + break \ No newline at end of file diff --git a/python_interface/examples/webcam_input.py b/python_interface/examples/webcam_input.py new file mode 100644 index 0000000..28f7c62 --- /dev/null +++ b/python_interface/examples/webcam_input.py @@ -0,0 +1,75 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Feb 05 16:26:55 2017 + +@author: uricar.michal +""" + +import sys +# sys.path.append("D:/GitHub/clandmark/install/share/clandmark/python/") +sys.path.append("D:/GitHub/clandmark/build_win10/install/share/clandmark/python") + +from py_flandmark import PyFlandmark +from py_featurePool import PyFeaturePool + +#flandmark = PyFlandmark("D:/GitHub/clandmark/matlab_interface/models/FDPM.xml", False) +flandmark = PyFlandmark("D:/GitHub/clandmark/matlab_interface/models/CDPM.xml", False) + +bw = flandmark.getBaseWindowSize() +featurePool = PyFeaturePool(bw[0], bw[1], None) +featurePool.addFeatuaddSparseLBPfeatures() + +flandmark.setFeaturePool(featurePool) + +import time +import numpy as np +import cv2 + +def rgb2gray(rgb): + """ + converts rgb array to grey scale variant + accordingly to fomula taken from wiki + (this function is missing in python) + """ + return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) + +cascPath = "D:/GitHub/clandmark/data/haarcascade_frontalface_alt.xml" +faceCascade = cv2.CascadeClassifier(cascPath) + +video_capture = cv2.VideoCapture(2) + +while True: + # Capture frame-by-frame + ret, frame = video_capture.read() + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + arr = rgb2gray(frame) + + faces = faceCascade.detectMultiScale( + gray, + scaleFactor=1.1, + minNeighbors=5, + minSize=(30, 30), + flags=cv2.cv.CV_HAAR_SCALE_IMAGE + ) + + # Draw a rectangle around the faces + for (x, y, w, h) in faces: + bbox = np.array([x, y, x+w, y+h], dtype=np.int32) + bbox = bbox.reshape((2,2), order='F') + start_time = time.time() + P = flandmark.detect_optimized(arr, bbox) + print('Elapsed time: {} ms'.format((time.time() - start_time) * 1000)) + for i in range(len(P[0,:])-1): + cv2.circle(frame, (int(round(P[0,i])), int(round(P[1,i]))), 1, (0, 0, 255), 2) + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + # Display the resulting frame + cv2.imshow('CLandmark - webcam input', frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + +# When everything is done, release the capture +video_capture.release() +cv2.destroyAllWindows() \ No newline at end of file diff --git a/python_interface/examples/webcam_input_jointmv.py b/python_interface/examples/webcam_input_jointmv.py new file mode 100644 index 0000000..c2a7a66 --- /dev/null +++ b/python_interface/examples/webcam_input_jointmv.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +""" +@author: uricar.michal +""" + +import os +import sys +import time +import numpy as np +import cv2 + +sys.path.append('D:/GitHub/clandmark/build_win10/install/share/clandmark/python/') + +from py_flandmark import PyFlandmark +from py_featurePool import PyFeaturePool + + +# webcam ID +CAM_ID = 3 + +# Models +MODEL_PATH = 'D:/GitHub/clandmark/build_win10/install/share/clandmark/models/jointmv/' +VIEWPORTS = ['-PROFILE', '-HALF-PROFILE', 'FRONTAL', 'HALF-PROFILE', 'PROFILE'] +MODELS = [os.path.join(MODEL_PATH, 'JOINT_MV_SPLIT_1_'+x+'.xml') for x in VIEWPORTS] + +PHIS = len(MODELS) + +CV_CASCADE_PATH = "D:/GitHub/clandmark/data/haarcascade_frontalface_alt.xml" + + +def rgb2gray(rgb): + """ + converts rgb array to grey scale variant + accordingly to fomula taken from wiki + (this function is missing in python) + """ + return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) + + +def jointmv_detector(I, bbox, flandmarkPool): + PHIS = len(flandmarkPool) + scores = np.zeros((PHIS, 1), dtype=np.float) + Ps = [] + + for i in range(PHIS): + P = flandmarkPool[i].detect_optimized(arr, bbox) + Ps.append(P) + score = flandmarkPool[i].get_score() + scores[i] = score + + viewID = scores.argmax() + + return Ps[viewID], viewID + + +if __name__ == '__main__': + + # flandmarkPool = flandmark_init() + flandmarkPool = [] + for i in range(PHIS): + flandmarkPool.append(PyFlandmark(MODELS[i], False)) + + # Initialize featurePool + bw = flandmarkPool[0].getBaseWindowSize() + featurePool = PyFeaturePool(bw[0], bw[1], None) + featurePool.addFeatuaddSparseLBPfeatures() + + for i in range(PHIS): + flandmarkPool[i].setFeaturePool(featurePool) + + faceCascade = cv2.CascadeClassifier(CV_CASCADE_PATH) + + video_capture = cv2.VideoCapture(CAM_ID) + + while True: + # Capture frame-by-frame + ret, frame = video_capture.read() + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + arr = rgb2gray(frame) + + faces = faceCascade.detectMultiScale( + gray, + scaleFactor=1.1, + minNeighbors=5, + minSize=(30, 30), + flags=cv2.CASCADE_SCALE_IMAGE + ) + + # Draw a rectangle around the faces + for (x, y, w, h) in faces: + + bbox = np.array([x, y, x+w, y+h], dtype=np.int32) + bbox = bbox.reshape((2,2), order='F') + start_time = time.time() + + P, viewID = jointmv_detector(arr, bbox, flandmarkPool) + # P = flandmark.detect_optimized(arr, bbox) + + print('Elapsed time: {} ms'.format((time.time() - start_time) * 1000)) + print('VIEWPORT: {}'.format(VIEWPORTS[viewID])) + + for i in range(len(P[0,:])-1): + cv2.circle(frame, (int(round(P[0,i])), int(round(P[1,i]))), 1, (0, 0, 255), 2) + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + # Display the resulting frame + cv2.imshow('CLandmark - webcam input', frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + # When everything is done, release the capture + video_capture.release() + cv2.destroyAllWindows() diff --git a/python_interface/examples/webcam_input_single.py b/python_interface/examples/webcam_input_single.py new file mode 100644 index 0000000..9248f19 --- /dev/null +++ b/python_interface/examples/webcam_input_single.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +""" +Created on Sun Feb 05 16:26:55 2017 + +@author: uricar.michal +""" + +import os +import sys +import time +import numpy as np +import cv2 + +sys.path.append('D:/GitHub/clandmark/build_win10/install/share/clandmark/python/') + +from py_flandmark import PyFlandmark +from py_featurePool import PyFeaturePool + + +# webcam ID +CAM_ID = 3 + +# Models +MODEL_PATH = 'D:/GitHub/clandmark/build_win10/install/share/clandmark/models/coarse2fine/' + +MODEL = os.path.join(MODEL_PATH, 'CDPM.xml') + +CV_CASCADE_PATH = "D:/GitHub/clandmark/data/haarcascade_frontalface_alt.xml" + + +def rgb2gray(rgb): + """ + converts rgb array to grey scale variant + accordingly to fomula taken from wiki + (this function is missing in python) + """ + return np.dot(rgb[...,:3], [0.299, 0.587, 0.144]) + + +def flandmark_init(model=MODEL): + flandmark = PyFlandmark(model, False) + + # Initialize featurePool + bw = flandmark.getBaseWindowSize() + featurePool = PyFeaturePool(bw[0], bw[1], None) + featurePool.addFeatuaddSparseLBPfeatures() + + flandmark.setFeaturePool(featurePool) + + return flandmark + + +if __name__ == '__main__': + + # flandmark = flandmark_init() + flandmark = PyFlandmark(MODEL, False) + # Initialize featurePool + bw = flandmark.getBaseWindowSize() + featurePool = PyFeaturePool(bw[0], bw[1], None) + featurePool.addFeatuaddSparseLBPfeatures() + flandmark.setFeaturePool(featurePool) + + faceCascade = cv2.CascadeClassifier(CV_CASCADE_PATH) + + video_capture = cv2.VideoCapture(CAM_ID) + + while True: + # Capture frame-by-frame + ret, frame = video_capture.read() + + gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + arr = rgb2gray(frame) + + faces = faceCascade.detectMultiScale( + gray, + scaleFactor=1.1, + minNeighbors=5, + minSize=(30, 30), + flags=cv2.CASCADE_SCALE_IMAGE + ) + + # Draw a rectangle around the faces + for (x, y, w, h) in faces: + + bbox = np.array([x, y, x+w, y+h], dtype=np.int32) + bbox = bbox.reshape((2,2), order='F') + start_time = time.time() + + P = flandmark.detect_optimized(arr, bbox) + + print('Elapsed time: {} ms'.format((time.time() - start_time) * 1000)) + + for i in range(len(P[0,:])-1): + cv2.circle(frame, (int(round(P[0,i])), int(round(P[1,i]))), 1, (0, 0, 255), 2) + cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) + + # Display the resulting frame + cv2.imshow('CLandmark - webcam input', frame) + + if cv2.waitKey(1) & 0xFF == ord('q'): + break + + # When everything is done, release the capture + video_capture.release() + cv2.destroyAllWindows() diff --git a/python_interface/include/__init__.py b/python_interface/include/__init__.py new file mode 100644 index 0000000..1835522 --- /dev/null +++ b/python_interface/include/__init__.py @@ -0,0 +1 @@ +__author__ = 'michal' diff --git a/python_interface/include/c_featurePool.pxd b/python_interface/include/c_featurePool.pxd new file mode 100644 index 0000000..879a3bb --- /dev/null +++ b/python_interface/include/c_featurePool.pxd @@ -0,0 +1,29 @@ +cdef extern from "CFeatures.h" namespace "clandmark": + cdef cppclass CFeatures: + CFeatures(int, int, int, int*) + inline void setNFmipmap( unsigned char *) + void * const getFeatures() + +cdef extern from "CSparseLBPFeatures.h" namespace "clandmark": + cdef cppclass CSparseLBPFeatures: + CSparseLBPFeatures(int, int, int, int*) except + + void compute() + void *getFeatures() + void setFeatures(CFeatures * const) + void setFeaturesRaw(void *) + +cdef extern from "CFeaturePool.h" namespace "clandmark": + cdef cppclass CFeaturePool: + CFeaturePool(int, int, unsigned char *) except + + CFeaturePool(int, int) except + + void addFeaturesToPool(CFeatures *) + void updateFeaturesRaw(int, void*) + CFeatures *getFeaturesFromPool(unsigned int) + void *getFeatures() + void setNFmipmap(unsigned char * const) + void updateNFmipmap(int, int, unsigned char *const) + inline int getWidth() + inline int getHeight() + void computeFeatures() + inline int getPyramidLevels() + inline int *getCumulativeWidths() diff --git a/python_interface/include/c_flandmark.pxd b/python_interface/include/c_flandmark.pxd index 64c976d..8283bd4 100644 --- a/python_interface/include/c_flandmark.pxd +++ b/python_interface/include/c_flandmark.pxd @@ -1,25 +1,46 @@ from c_cimg cimport CImg +from c_featurePool cimport CFeaturePool +from py_featurePool import PyFeaturePool + +# cdef extern from "CTypes.h": +# cdef int _DOUBLE_PRECISION +# DOUBLE_PRECISION = _DOUBLE_PRECISION +# if DOUBLE_PRECISION==1: + +# TODO: check and update this +from wx.lib import flashwin_old + +# TODO: propagate definition from CMake and set here either double or float +ctypedef double fl_double_t + cdef extern from "Flandmark.h" namespace "clandmark": - cdef cppclass Flandmark: + cdef cppclass Flandmark: Flandmark(const char*, int) except + - void detect(CImg[unsigned char]*, int *, double * const) + void detect(CImg[unsigned char]*, int *, fl_double_t * const) void detect_base(CImg[unsigned char]*, int * const) int getLandmarksCount() - double* getLandmarks() + fl_double_t* getLandmarks() int* getLandmarksNF() - CImg[unsigned char]* getNF(CImg[unsigned char]*, int *, double * const) + CImg[unsigned char]* getNF(CImg[unsigned char]*, int *, fl_double_t * const) CImg[unsigned char]* getNF() int* getGroundTruthNF() - double getNormalizationFactor() - void setNormalizationFactor(double) + fl_double_t getNormalizationFactor() + void setNormalizationFactor(fl_double_t) int getWdimension() void computeWdimension() - void setW(double * const) + void setW(fl_double_t * const) void write(const char *, int) - double* getFeatures_base(CImg[unsigned char]*, int * const) - double *getFeatures(CImg[unsigned char]*, int * const, int * const) - double *getFeatures(int * const) - void setLossTable(double *loss_data, const int landmark_id) + fl_double_t* getFeatures_base(CImg[unsigned char]*, int * const) + fl_double_t* getFeatures(CImg[unsigned char]*, int * const, int * const) + fl_double_t* getFeatures(int * const) + fl_double_t getScore() + void setLossTable(fl_double_t* loss_data, const int landmark_id) const int * getSearchSpace(const int landmark_id) - const int * getBaseWindowSize() \ No newline at end of file + const int * getBaseWindowSize() + void setNFfeaturesPool(CFeaturePool * const) + void detect_optimized(CImg[unsigned char]*, int *, fl_double_t * const) + void detect_optimizedFromPool(int *, fl_double_t * const) + void detect_base_optimized(int * const) + void detect_base_optimized(CImg[unsigned char]*, int * const) + diff --git a/python_interface/include/py_featurePool.pxd b/python_interface/include/py_featurePool.pxd new file mode 100644 index 0000000..3c489d1 --- /dev/null +++ b/python_interface/include/py_featurePool.pxd @@ -0,0 +1,4 @@ +from c_featurePool cimport CFeaturePool + +cdef class PyFeaturePool: + cdef CFeaturePool* thisptr # hold a C++ instance which we're wrapping \ No newline at end of file diff --git a/python_interface/ipython_notebooks/FlandmarkPythonInterfaceExample.ipynb b/python_interface/ipython_notebooks/FlandmarkPythonInterfaceExample.ipynb new file mode 100644 index 0000000..140f7d2 --- /dev/null +++ b/python_interface/ipython_notebooks/FlandmarkPythonInterfaceExample.ipynb @@ -0,0 +1,263 @@ +{ + "metadata": { + "name": "" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from py_flandmark import PyFlandmark\n", + "from py_featurePool import PyFeaturePool\n", + "\n", + "# flandmark = PyFlandmark(\"../../../data/flandmark_model.xml\", False)\n", + "# flandmark = PyFlandmark(\"../../../data/FRONTAL_21L.xml\", False)\n", + "flandmark = PyFlandmark(\"../../../data/300W/FDPM.xml\", False)\n", + "\n", + "bw = flandmark.getBaseWindowSize()\n", + "featurePool = PyFeaturePool(bw[0], bw[1], None)\n", + "featurePool.addFeatuaddSparseLBPfeatures()\n", + "\n", + "flandmark.setFeaturePool(featurePool)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 11 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import time\n", + "import numpy as np\n", + "import os\n", + "from fnmatch import fnmatch\n", + "from PIL import Image\n", + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "def rgb2gray(rgb):\n", + "\t\"\"\"\n", + "\tconverts rgb array to grey scale variant\n", + "\taccordingly to fomula taken from wiki\n", + "\t(this function is missing in python)\n", + "\t\"\"\"\t\n", + "\treturn np.dot(rgb[...,:3], [0.299, 0.587, 0.144])\n", + "\n", + "def read_bbox_from_txt(file_name):\n", + "\t\"\"\"\n", + "\t\treturns 2x2 matrix coordinates of \n", + "\t\tleft upper and right lower corners\n", + "\t\tof rectangle that contains face stored\n", + "\t\tin columns of matrix\n", + "\t\"\"\"\n", + "\tf = open(file_name)\n", + "\tstr = f.read().replace(',', ' ')\t\t\n", + "\tf.close()\n", + "\tret = np.array(map(int,str.split()) ,dtype=np.int32)\t\n", + "\tret = ret.reshape((2,2), order='F')\t\n", + "\treturn ret" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 12 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "DIR = '../../../data/Images/'\n", + "JPGS = [f for f in os.listdir(DIR) if fnmatch(f, '*.jpg')]\n", + "\n", + "jpg_name = JPGS[1]\n", + "file_name = jpg_name[:-4]\n", + "img = Image.open(DIR + jpg_name)\t \t\t\n", + "arr = rgb2gray(np.asarray(img))" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 13 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "bbox2 = read_bbox_from_txt(DIR + jpg_name[:-4] + '.det')\n", + "start_time = time.time()\n", + "P = flandmark.detect_optimized(arr, bbox2)\n", + "print \"Elapsed time: %s ms\" % ((time.time() - start_time) * 1000)\n", + "\n", + "plt.imshow(img)\n", + "plt.plot(P[0,:], P[1,:], 'rx')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Elapsed time: 81.3059806824 ms\n" + ] + }, + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 14, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nynPPPec/8IEPnPX6W97yFv/CCy94773/pV/6Jf/4449f7KEMyD+6FYcSAAAERklEQVT+4z/63/iN\n3/Dee//QQw/5X/7lX17V3y+l0+n4Q4cODbz2gQ98wD/44IPee+/vuece/0//9E+rMpY///M/99de\ne61/29veds5xnD592l977bU+yzK/sLDgr7322hVB6os1pvvvv9//1V/91cAxqz2mr3/96/53f/d3\nvffez83N+V27dvkPfvCDr+tcrTSmr371qxdkri66JfHoo49y8uRJ3vGOd/C+972Pw4cPs7i4SJqm\n7NmzB4D3vOc9fOc737nYQxmQ//iP/+C9730vADfeeCM/+MEPVvX3S/nRj35Eu93mPe95D+985zt5\n6KGHeOyxx7jtttsA+MVf/MVVm5srrriCb3zjG71dcKVxfP/73+8R5yYmJnrEudUa06OPPso3v/lN\nbr/9dn7rt36LpaWlATLfaozp7rvv7lm/Jcnw9Z6rlcZ0oebqgiqJr33ta1x77bUDj+3bt/PZz36W\n7373u3z2s5/lox/9KK1Wi4mJid7nXg/y1eLi4sAYyoKmqy2jo6P8wR/8Af/6r//K3/3d3/Grv/qr\nA++PjY2t2tx86EMfIor61BlfcXPKa7S4uLiqxLnhMd1444385V/+JQ8++CB79+7l85//PK1Wa1XH\nNDo6ytjYWI9k+MUvfnHg3nk95mp4TF/60pe44YYbLshcXVAl8fGPf5yf/OQnA4/rrruOD37wgwDc\ncsstnDp1ivHx8QHy1eLiIuvXr7+QQ3lZmZiYGBiDc+6CsNNeqRw4cKCnGPbv38/GjRuZmprqvd9q\ntVZ9bkqpzkd5jYbnbbWJc3fddReHDh3qPX/88cdflzEdP36cd7zjHfz6r/86H/nIR34m5qo6pg9/\n+MMXbK4u+qr4whe+wJe//GVATOvdu3czMTFBkiS88MILeO/5t3/7t56ptlpyyy238K1vfQsQEPXn\nfu7nVvX3S/n617/OZz7zGQBOnTpFq9Xi3e9+Nw8++CAA3/72t1d9bko5dOjQWeO44YYb+Pd//3fS\nNGVhYYGnn36aa665ZtXG9N73vpfvf//7AHznO9/huuuuW/UxTU1N8e53v5u/+Iu/4GMf+xjw+s/V\nSmO6YHN1UVCUijSbTf/+97/f33HHHf4XfuEX/LPPPuu9F7Dwpptu8tdff73/3Oc+d7GHcZY45/w9\n99zjb775Zn/zzTf3xrXakue5/+hHP+rf/va3+7e//e3+e9/7nj98+LC//fbb/dve9jb/8Y9/3Dvn\nVm08R48e7YGE5xrH/fff76+//nr/8z//8/4b3/jGqo7phz/8ob/lllv8HXfc4T/ykY/4Vqu16mP6\n1Kc+5bdt2+bvuOOO3uNHP/rR6zpXK43poYceuiBztUamWpM1WZPzyhqZak3WZE3OK2tKYk3WZE3O\nK2tKYk3WZE3OK2tKYk3WZE3OK2tKYk3WZE3OK2tKYk3WZE3OK2tKYk3WZE3OK2tKYk3WZE3OK/8H\ncdcUAesy/aYAAAAASUVORK5CYII=\n", + "text": [ + "" + ] + } + ], + "prompt_number": 14 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "features = featurePool.getFeaturesRaw(0)\n", + "plt.imshow(features)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 15, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAADGCAYAAADL/dvjAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvHd4lNX29/2ZXjIzmUkvpJFCCwFC771IU1AEEbEA9i62\nc46KougRRAQrckSwIIgUQekdQqgppEB678kkM5lMn3n+uAei55zf8/5+z+vje53rzfe65krmnvve\n9957rf3da6+19hZ5vV4vXehCF7rQhf84iP+/rkAXutCFLnTh/wxdBN6FLnShC/+h6CLwLnShC134\nD0UXgXehC13own8ougi8C13oQhf+Q9FF4F3oQhe68B+KP4zAPR4Pjz76KCNGjGD8+PEUFxf/UUV3\noQtd6EIX/g3+MALfs2cPDoeDtLQ03nvvPV544YU/qugudKELXejCv8EfRuDnzp1j2rRpAAwdOpTL\nly//UUV3oQtd6EIX/g2kf1RBJpMJnU5367tEIsHj8SAWC3OESBQLlP9Rr+tCF7rQhf+fIAavt+zf\n/vKHEbhOp8NsNt/6/lvyFlBOL4WEMseDWL3NwAhgGKu++Jy+E8sIOdJKXmIyn50ZwcU3DRCQDBED\noL0Vaq6BwwREAVeQqIOJfbYnfH4NzGd59kQl0+8/SFGZGakHHF4QKSC5D2wZ9BfWVC/HeMMAekDm\nhoZqqK1ANbknY54/zduLn8Zeq0Qk8hIa0EpDix6PV8SqrFU89OrH7HppIZO+/gXp90dB5WHELA8/\nPfoU7/5ixz/1OarfjWG69Vd+DJyHtbeSHx+fwxO/bqTH1Gyuf9mfb56cg0hs4vHRk/FKB6IzOZE4\nlTgMatxKOSIktDVraW/1A6qBYkABhAJOEEuR+Q2mz4CzrNqzkqWDVlNbmoXXG+e7TwYEABpAAjiA\nPOFZ9L7+1wIuX9n+gN9NSQGtIBbD8OmQ9hZ4nwTcvt/TATlQxxeLNjL5pSqq+4YAsOezPhSf1/H2\n1l8xYiA3vQePDn8NOA+SCOg1rVP8JWf5IOBe9jqHcyXqDTrcPfE6REh1TiQqN652KXghZGEt4c8K\nE73Uasd91kPGygl4nCKwtULmMSAcsCKor8j3gkhA7fs/B7ADfYHPgaf/SVtbgQtAIBAP7PRdH8H1\nYctI9K9iWFk6l9y9QK6AABmU5kN1C0tWHOKBN34l9GgTWT8O4GHHeozn9PTxFrOhcjb19krixTAg\nVKhZcz14PGADVBJYemQb15P7IN4vpW7DNUzXpDyz4iwquZT3XnoWqAcagWTf31wgydeWPcA2YKuv\nfad8clX/ph8AvEA0ty+7zH0vf86pPUPIODeQ+ct/5r3FTwLgcjmoL88HQkAeztfp7/HCr38n9OEW\nlMH23/VWxXsJNO0OBI9PJxolUO4GCoAsQAdEI+hgGnADAPmI59iaPYNSSznx3gb0cgdhD4VRfamd\nyKJ2DrzyJJ/WGol+/T7MgTrMR/TIXypmcf6zjHG6yUkIYNNXH3Bpbl9oPAyp0yEzG/qkwCAF7y15\nhWEDzvPajXdJFV0k9704IruXsWD5HkJL20k3DWfTuMVgE2E6ZsD1oomVtuGMnxnG6MXfUTr4NAAf\n8neSsfGX+w5xrXEU9kv5BL8sgiNapEeycQS10BY8jCWLT9HX7xzHz4zk6cVbsewNZN7wHfR4KAtP\no5j6h/XU7tkBnAQeBVksuBwQ1ZMvPnyU45uG80taCAErDNhyW2jYVEYq2fire3BCdh+0/YygKWW+\nz02c4r/CH0bgI0eOZN++fcybN4/09HRSUlL+5Z4a+504GQOogEBWffE5Y+dfI25PLV+UP8GWs4up\nL9BCeI2gnwBaDUT3gaJWBAKy4rZB8cZ2aBkIxKOIXkXRvhR6rc2iaXc75maI7glfmB/ki13dMapL\nQDVQKNMpYZj7On+xPYXytBLdjTaiq6oxBAEikElB62zB44E3575EcHk93XNK8W80cqPdhrMdFHlA\nnVA9/ehmblMfYFn9V2QN7IVLK8Frbsa54UeKT92Bq13Ca/Nf5uOTryKRqmmo7M4T33xKXJ8q1j+3\njMxTycKLqQBMCOTkABo6ReTxw2mWkpvekyfHrqKmJAyBoOW+Z10IRC7xPVOGQMxa33ezr2w9AnGb\n6SRwsXCfpx0ys8Dr8ZWHr2wfUYaO4fzZE0SMqULft1Om6nI7QedNGIcbfFc8vvL/Cc581lR9QDMl\nOJRKYlcWoR5sRuz1IvZ6qP8xEo9dTOj86luPtBUEUbYmCU+dDZpzIDEVgSTw6dBNJPnacZNUmoEY\nBAI0I0xYlt/cbwAGIpBP3q2rD/A8JVdreFZxF7n6YNBooD4HypoZ4/yGh4aeRnvRhH26iehAN+ml\nYRhr8ogR6XnEu5gBiyq58g+hB7wqKffv2sjbY55CbbKw+qd3qYuL4PLmUWjUbejvaKStoB+mahdi\n13HEcjFQgzCBx/jq+M/9aEMgSzVwztcuJb8n7yhf33g4vTeZ/MuvYWrRkJhairNDQnVxOIKeWIEi\nZHI1P519mqCUDqSP7OGV7TvZte1xKvrE/UZ2ELGglqCZ9TQeDKP2uyhGzEjjxYFvEbOmiI4KMSUW\nBS6kFOFkFfcA4GhWEGuvIMxbBYDFAcEldYhaYfOzT3Fm2TyaH/6JhgdGAdCz7hCPFi5njKqUIjv0\nq6nhm78tI88bwdKrn5KkzuTy/P64PDp+iruLyIRi4j6vQrtrNz8vn4bZDybtSWd0aRbbIheyccLD\ngAOx0oM40E1AMCSMj2em+kfksbZbzYsFDh14gaI3CrE5BuC3PoyWAxdxXUwBIqDJBa3NeEy19F+a\nR8+QMhLzyti1eADWfWqu3z4AP3st0y8tYgs+o6XvBLiuBu8+qBez6tU3aan3o73tMs6vw/C0i4Ay\n+tLOgFn5lI92UvL2eKg74KtR7G9k+icQ+Jw5czhy5AgjR44EYPPmzf9yTxt+CNaBBOggddt1Uq4V\norA4aZ2modYZiv2SGvR+4Pb4aigFpQFhcJ4B1ODRQ1McgkKHEEAb4l7gHwoBQ4RJ78ADt/Prvn40\n7JCDtB6Cy5gky2Jp81oiJU0MCipABNgboFwEIfLOeop8n6h8wRKMKBIUsAfC8HLaEYxbvEgMTjJC\n+vFF88PM7/kN5XmRrFk8H29FJR0tedBnCIWZQ3jhtjcxNpQDMmJ71HNw6yRKcm4WZEAgbS8CESt9\n100IIhJcU06HlJJrkcDFf+rZJARLrZvvXutv+hlf3zkRqEXD78kPBAteCxaLr09FvLH1fb5edTfl\n1/sDGdCajfpBJbLbQvAgQYwbcCCxu5Ca3dy4ksAHjz2GQKQa8Dih7DzEDIMRIigbycP/+IyvV+kR\nPVOMYZYasd59q7/DllWAR4Qk3InXR0ieDgn2WhWozNBhFtokckLyQH5HWkUesDoRyLsSwRp3A1VA\nG8Jsa0dYfeiAXggTmIjOSQ6mUszbsm1csVRhD1aABu59+gR3tO7EufUavcKMSKxQfgo+mX47Gwff\nx6ANB3hRdpxI/wJ0HTAoBNp1Wu78/isqUyI5LxEzMxCq+8ZSlhhLkKoOaZiT2m+70ZoZwROBn/Dk\n2d1st84BXGDQMGRGC1NT32Tl8w+CUkngsCBeef5pXrx9JARHwGQJ7GkHSyAkJEJdHbS3A1Hcu/ww\no2adZf/miThsUuY8doD0wwMpz4tGghtoRzAWkoEhiEQSQvubcUlk/GXDCSZ/kMsPUj8cyJHjEPR/\ncQVipYe2MwZa9gaBGTTaDhKTK+kzsAJ7KkjTIvj0vccZPH/Vrf7cUjmDKlcDw4eDXwpk/SqoV3xP\naDvVk5yrqdizDuGxt3L70O0sGbuRq37BPLlwHZ5vO3hq6ScEvpbPtm//gvndeG5IwnB7deARETy5\nih7fFvNawCou2IdgfLmZ5UO+494+p/BrsGIsqqZKUUn0bcJq0YsIUzNkn7cyfNVxxs3ewXxuA+A1\n1tK0wospRwtiMbY1hTxasQlVWz1py++hf0U5YTtOIv3GSOO5JuRGuNHmovWnqyh0O4lblUiou4Zn\ni66x5T6BwFM/yaPX3WvpVldAf6ecjEItbq+Xg/KnyW3pAx1GAA6TTPppEXU5p8H4Pw9J/mEELhKJ\n+Oyzz/4f7uqLYGFKeHTtL/S4Wo2mwMqa2OXs23c7riK5UCOxCjoaoDYH/AIgNBHi5FDqhzDgvMAV\noDcrt71HQJARKW5ENi9+Wlh719N8k38fBVXBEFANLU3QXEyYOI1x3tMYNOAUQXmbME/Y/6mWq7at\npEOt4qnH3ye4suHWdT8EWigvgcZyUI0bDIA9RoZE7MS7U8zadYsouGIFxGBr8YWJFdz11C+se2oO\nrXYlXkQUZ8dianYiEE47goWo/00tvAiW8G+tK5FQLuZ/uq5BWMKWIbRGTKc74WbNbx46KaGT2G/C\nAzQBA3jotWJ6DFlB6rhsQuLqaW/VsuXtYPIu+KOM60DRTYoIN6d2DWf3Z4NwVNpZ+Po9VIvUFGbG\n+doiA68X2pug4iLYBvK3z7Yy6o6r7Ch4Hc9oLWK9gzvW/EB53+5cnToUaYTT1+rOdql7thPzUhHl\nH8dCeH+wSSF6AEj0nc1XAZJzCETdhjAR+vn600o/HDwqWkLJ+IF8PXYBjR9EgsmCYHn73Ec+fMhd\nZGnHYw+0gCKAR6v+ypBvdjJYWUGT0Ya6CWQOiDZAniaCG64pzIpu4DbNR1jUUHoadJFBPPv2Rxzf\nNIV98bMp9Vp57uM1XPpsJPqnG1H1tFC7IZrGneEMKN5IsulTZI016Gd3YEgNpPvmau5Nf596PwWh\nGx7E9n437jI+RvLwFiAZtFPAJAJPXyADJCkQG0/3xbkYW2RETaojZUw2/mEteN0iUk25iBxKmlNj\nmOBM44k1X/LJ8kEIq5QEvDThQAF4uevUJbY/vojctXUon9AgTxF0SBYjjBBbjYoZsQdIej6fdoOa\n6LJakEHNiBg+nP46R36azlX6AJkADOxIIws7tcWwyTiViS+UkVJcxicnB3KksSdWlR9YJtFncgUD\n+p4k83s7W9rnoS3vxvxV21hpegNt43Yy1oXgLFVgrMwGcRHgh0PvQV1hI29/HT0X5lG5x0xI71oC\nZB1wDDBbELW0YU5PwJKhw2+AGY0e4hNkrHsphtzzSbfknkMAXPADVLy2diUD0i/wc+lwTtOdhvM9\nCb0rlKkzz1H4UwJv7l2EmAZGJDQxOjoX5+l2RJ/BMw2vU3hrkRdLW7IfC2SXyPxsLNs/TKGkoAIv\nUmr8ezDauplWcy7XCKUWHbW1QG0z/yf4wwj8v4dINrz6KQEnLAyqKyDC0wxSyMhyUVIrEaxtV62w\njHc7wVwPXrGwatapCRwdzdLFn9N3Vx7mY1Z+2PQiI+deQCYXBn/pwijiv68gbbeYa9cDcVtjIFDP\nnVO+Zm73XRiO1WLLAbkccINGDhVtoPT1gksq5Zk1q7kwaxAumRREL/HY0x8SXtK5rHcDB2fN4aDr\nTsx7k5E3NTAm7DCTPvySC83B5JgGAAe4meAjlbl4f+szpM69jFxlw2ZR8cvmiZTmOhG634NgaSsZ\nf2cGMkUlh7+PR7CinUAwnX4xLZ3rg5uIRyAtHdDhq6Ge34tW9l/IQ4FA/CakMj/++o9PuXRsNpXF\nMpJSi0gZlY8bCXu/HAJI0dKMHxbsKKgpDqPkWizQQdWF8QiEIEKYHHxWOIDZAmYYNDYTlcaGNzoK\nt9qLh1a6ZxTSrtP+jrR/C2ejnLaTAeCQgl+Q0DRtaKeHB6AuC2zX+K27YfCS88z2ZNG9Opc4aw19\n8io42MPA1f51zHd9iELVjtPZhNUDVz0yNjMBgIv0BD8ZKKN5seE1+hn/QZ/2eoI0UNEOrXlg8IIh\nALQS6N6YxaDWbdTJIDYKmqzhrHzvTTIG98OxXEHH0jS2TvyUqz/PpT3fQHtJGdJu4ZivhfPw8C9J\nkXxE0oUS/EUwNuckL4tacFgbGFJxkcLGEcgXiYmUNJDw4mFanolGtHAi8Qu8LHhqCUX2Vn6hH2bX\neCKfacfRFkbwUCM9lTfQVXTQr+46IWnNKBvt+JntyMMgqbiMmW2X+OT+J6FWjvr8Gf7y2T6S/l6K\nSASB11o5tXAMyrkKlKGdk7wXES17Q2g9GkS+phcNaSaS3afQhrSTY0/m5dq/c7ZiBKYyPS3Tp8Cv\nAoHnI6wtVzesplfDEWT7mnmvYQzbm5dSoe4POrhtVjuPJK+motXA2j5/oWyXjFHZ+fS+7xxZH09G\nuepuOp4vAN1VsLQDsGTDfuK/rubNY0+TW9gfhbuatgodzgADVRNDMWja0bcFoFD0oGZtLM5aOebz\nehStTtaeXUd+diL51Pp0FkjoBxIDxIs5ddFEQW48Z20DqKYCLrs54zIwfmYUHl0QGSwAKgjtfpBx\nd5Th+kVOxbl4NkuexfNMGZz0ALE89/C7lK2YxM/ZjzGPr5mXcJUP6iZgVGio6DYEW7UbKo3/xbj8\n7+NPJfC16i/pc+0M4Y12HNvA0R02NQ3mYqkbdC2giQO7CsxGIXiJAuxGaCwgyl/Go9a3ibh8koXd\narDeJSby7GoqzpUwNt6DUgoeqZjascEY3zXjrm4XiF/hT99wIwsjT9MRC04L0AZyCRiUAoHfhEcs\n5sTsMTS+F4HXLqKKOO62fUs4nQR+fdE0Lry4gJpTCbT/6o9K10GwtQ5ViYNDcxfC0WCIHgQVGeB2\nIS7NZPb83dTLQhl9+wW+WnEXJ3aG0tpoRgii3STXQOL7tqJUGzn8fazvuo8EcQItCK6V6whE6XPa\nE4Bg9XoQCFwKoaGCS8Fk+t9IQ+Z7v1Jou0dDxpneHPlhDE67DLdLzGN/38LJ3SMpzpIDKpRIkOPA\njsJXhggiRRAGXLm5OhDROSkFAfDa2tfQG3yW7tkzNJyIoDUqEUu2hglVh2joHkHmpIGI+P3R9M4m\nOa1nAkAOUr2T6KdL/qUVlS/44XQ5uenj7r/Ew7Khp7jjejqS6ma8baCUQNLZbJ4o/oBxrtPoDOB2\nQ4cLglvVtwickCmgULFizArqWgJQpIRh/bmJslw3HjsYPCD2+rxnQLCzlGjjGZoUkCgGaYiOQ1Mm\nEd1czrK6dVTku7nUX0tHsxo0YrQDxbScNbBs+CZuc6wjMqyIkASgBKSZpfRzlKKRg3dEEtUTBvPK\nK6+jbamnm8XDjV/NaE+Gok/JZc7iH1n9zhI8340Hl46OLCkd1zUsSf8IvfcUDfeKiLe7CTpl5FTc\nWDbrJqNPu4y8nxN9ej24ygkM7sGauW8xvSaPkLMtQoP6gVMhQzM1GI9PGjdl0pHnh7VQTb6+F2RZ\nCU88QtX8EC7JunHskJzIe+vRj2+mYkf4Ldl4gN3vvozko3IG1WWQWNLEx91nUyafAh16erf9yMjs\nD3BF27kgHUZZaQi4dBRlBPLZq0vxnlLgEptBrIfgIAiORP1EG0XqMby105/9pTE0ugfBaSnzl5wk\neXQdxng9h6tuY/fxebRl9saSI7jIHM0KtNZSoh0X6b0hkIey9rF80wihouZ2CIsHuYzTlulQZwRb\nGaAFewRNF5poCXGhlssQDBQZbr9AbKFyEIFJ48/PsXPxP78dYUUNc5oOsHzWJwQamsirGk5xZjzN\nLkDkwjErAldW4H8egT+gOculA3bq3YIRtd+1gH+0JVDUESz4vcWASg9SiWBtddjAWQxGI6FBDh6a\n9j3VZ0HUC1RDPAx54Rzb3NAcCcmJoFDByrgnuN4YDlIInNrAqMpDRB49QnExxPshJHa0gdvlc6v6\nYFUr+WT5IyjFNpRRHXidIuas+QF5fR1SDaik8OvtUzj2/L2YU6KQn3WAFHpczCXSW8nPbzxIdfhI\n+FkFQUlQ0YRSFckjz35Km8QfFzLEuDm+oxutjW2AH4RGQ7sdLBZGzcpiyOQ8ss/1RHB3qBDI2Q1I\nCQyDmQ9+y5Z3w0AkhpAUUImhqhZcCjpT+l2g14HI+r8hcBU3XVk6QyOLX92O2y3mi7/di8ddDMRz\nfMdYZHIXmaf7UF9RBFg48NNtBPbU0mtMQWdRDoT5A3x1UABxQAkSqYflbx/iSb8deLZL+Xvp4zQc\ntmKqa+OB6F3EtF0npTifqzeKyZw0CP6JwJUxHYTdV0XzsRDCn6gg8K66f2lJ7YeDcdYqb1nlAyc0\nMaqjgODaZipqwF0OaimEXysl/FopbilYO4Tbm7ydUyQAhr5EPlJNYvq3bKt/lqHTwtE1FKK2d5AQ\nBMpaKCryEXhVJaJy7a1er3BFs7rkRczvBlAn9uB4Vc4lHse1IQw0YjB6cJS24LE7iC45hDujCO1g\n0AZBU7bgwMpnOCUDppAwq46w0zn0/ukYPdRgEYMiwE1Ivxo8iPks4E1Om+Zi1XYDswTj3lqw1aG/\no5JAo43gY3YMfh5OxY/lHf1faat383TUKgrPx/Bx7lzCOMUrM74n9tBZQmoAGZQuimLr9gRuXI5F\nMcZD275ANIPaUCVYOkUrFuQd3d9F/yF2FJecKIxeZN1VJIzLY/pbO8m5GMkmn/tux4NvcbIpmqed\ny4mJbeSgeA5lrf7gsoEYJkrSkWQ0sdYyh+KoQfQoq2U4P3OtegCHq2cCRTi2uUAaiNg/kgn1f2N6\nLxPVK9U4Ks0Mc59CzgnkNDOh/iKKzW0oAmWUlIs5nh4FNv9b3sI4RyHPm99kquEXRjZex7/uHEIm\nHFCfSeRLKhoOJBL+YDV3xv9A+KmrlBXCoVGPU9zWGyQRJIwtJ6VXOY3nzPThEh2+dmqcdYy78S69\n83N4n9EAvGd+C4nHw6LizzlYFYO5FhQLBjG35BdGXsjhYI0fRwj+L8bnfx9/KoFX26CHL/nh+wXz\n+fTkcqrq8xHm6t8E1jRa+va7wcAeR8hqCaHxvJ6ZdVuod0CAL7YpAvx0oG2FimroEQ8KEZzcHktN\ncyhEqRjfdoCH61bjuJZLlQ3i+3e+wu0Cjx3CNFAu0/HhU4+wY+lcAELur2HW+p2MaNmCyN2KVA1i\nN1yYOZLSlHhEeNAOaqVn/xwG15wlt18/zqeMw/hlkMAMGiWayTHcP+IgLwTuxr1DimmuPyK5B8Hy\n9WV2aINBJ4JaC6njjpA8Ip+sc+FAE/hpICBWcGk3iPEPquH2h/ez5d27AAkERQoETjVUq8HpQLCm\njdBcDuowiIoSSLztN8sMQCDZYAzBJdz3yg7uef4nnC4pNpuM7/6uw2GLY+5jv+If1Ep4XD3Htmup\nLJBz+vBQ+k1tweGVcflYP6EejU5orBDeS7DvE8dNS9xuC8UoC0AhdbB/cw9GzrhGUEQZT1/fT7fS\nYo5pZnCl27B/qy/ySDu9bsug3/eX0NWa2c+deN0i6jd2E1QGcDplwiD1EXggzVgGqDBW+ONf34Yn\nEAp79KS4PoSo6+WcuXsCIZ5GZjbtR5YOkUEIPlMAMTxY9zEnEsYw4dQv2D6+gR43kd2BnuDIBFsR\nmHpqkd9mZdjlG6TIwSTS807pdL5qWwJfg1Wl4vM7Z+JBjMsbxtP9Pub7A6k0bjaxaMk39LxegLYa\nOtRwePho0qTDMF1Ukm9PoD4pivvivqfvC8coiQ7jyryJ9PhqH+cff4T2DXo6xDq+0ozAs7EMgt2C\nsSMRQ5wE2706VJpwwn8oRZdv4aIhnCNFsdynTqfXRC+rGv7Kd+23kdztOI+Y3uByBYIHDqiZFUxD\ndRANN8IIH9hI68FA5CG2fyVwF8T1MTOiby3B7xsZaijihf4HCX8nn+mf/cRQ1GziRQB+cqayUPEN\nI2LaODFpCR/tGk/JFSdEtTNh1hE0tUoOH1tAg9SfidIMhnqvMpyfuEYsaRRhp4YifSR5Dy+g4xc3\no6vX8li2k/N5ILMLCQVyIFwN4kNQuR8kgeD03ABJJX4TwjGMbsZaqiZgVzmpfjtpnRtL9YfVeH9j\nvM1bfpmMlMHc893nJJ/Poo/xF+Ld9XhGwaBZTnJPDSIkpwhxSD4PBn2NW+Yl9vpJCr8TMu2UWhv9\nJuaTbPXAGqHMDRmpDFuTTvoWL62NeUgAtzMBZ2sB1adLMZLwb3X+f4o/lcBdIRDZEw4m38Z3Ma9Q\nW5wMJik4naDs3AQU3n6FebK1LBp0hm0d93LANol5/zjG9U9Ap4a4REAEGh2o2kD0O8OtHLSDQBrM\n4D1p9LfmUiQH6c1EjJt1ARwS0MYY2HP3A+xf+iCOr4UZVYybWW/uoLGl9Za79eDESRR1j0eEFxFe\ntEPamNh/Pxp/E1v7P4zzSxUte4NBBoEKE09M28HS0M+I2lIHiVBcIyZiuhep86a/1w5ON/rbZYxu\nz2RAdLFv2doK1IIyASJiQAKBfeuZNvkYfjoHtz+Sxd6N8YJhbgMiIqGhAZweIAIwQVMFxEZCeAyY\njKD0ExosQZC4XQHNNgyhRuY/vwsPIkRSL/ev2MHO9YuZeu9BHnpjB0nXS5A2u6mseYVKe39QhCIK\nl+KwyrF1KHyFWRCyP8SABP9AJ9PuO4ndKmfPFzNYtyKRiS3nOLVrMJH3VvNMymEStHUEm1qwDtDz\nc81QjqT3IzTGhab/71cMXkSEOmt4sGE9B4x347ZLafo2lNp10XhFImGOMJaBuzMlTIYLrwTcXgkG\nPRANR+/ozY9+M+m2r5LtMfcTIavFPjCYkQNO8ssvIzpf6IYBxqu8N+dNHtv5JMrNpVRHgX93aAiP\n5ZJsMFkBOuJuKyRpuoX4/h1ovfFsbH2AjYcmIU12EjC9iYZdwdR8HiaUWVfEo/PXccjxPk0XkxnG\nesZ0u46zBi5F9GBzxFKO1E/CIXbSs182DyV/To+2ag7MnULVFS2n9LczdFwCR5zPYvlC74thl0Hr\nDRDbIbA7GOKYHfozQ5TXsQ6TY8rRkGdP5mxZLFGtxwjrW8Seg2F8zUDCDPXMH15AqzSYUfGNeL1Q\nVg7h5XUses7DL09cgrZg9NOakEd39qtmoAmRx4s1W4PGbkERZaNybjitLQq0h3KpO2HkKx7ERlFn\nf36bybKKyxRlT2ON8XYqHL6UV7OJWd7vKLTEccI0mrtG/cLS20/iF9GMf1swszPKGJn5EVbgij6C\nv694EKt9slrZAAAgAElEQVR/FbLXvVAHhhghYapt7iiKz/XG36ZG7IViP0hIzaSlxp+onAwi4pqw\nPRmDp0CKRw87uIfK2EEcMzdwP51BzDkBpzjx2Swih+WjklpIC+7H4fZ2RnsKUKfXYsjI41JhKG15\nSuIUDQRKVFwKn0CFNQG0vZBLxIQGqLlicXS23XOG9DWQztDOa9+ZKSbCN07/GPypBK54PJgfcwys\nibydwm9jcHdIIbTfrT0jmr4mepkzGXrmY/oc+BF5DgwPPAK48QPCZKAPAzrA0yRmx7y5OD7+mQSD\nA6kMYU/CHQGIbyThafbHMsIf/PwIyLRgbIXqctC4QekCowJaxgVybOh9fNPrVTTbLNS8Ew2mMu69\n6xxKpx0DAucfGzeOtRP/SlFJPIoSO379TKgSOyjv2x1vq4i2jwOx/aIBBQQ4Grm76nPmXXwDUS54\neojZMWcuF+/TMqv/ddyeCoT8XRGj2o+SKi5jfPCPhOZV0vGVDtelVlAoQBkMNtBqaxgz4GvufflH\nAJa9fZ29G5NuWaAABFrBKWP4xHpK8gzUV9jB4RAI3s8AcgOqbh1oBpqwGZWYj6mhuQVwI7Z6CTzV\nitsr5uu6+TjtMp58YyMxxS1EbalFWe3ALzUKzeKeOBtlECBnyNSrFF2LJfvMRAThuQEJhuAKJs4v\nIKFvIx3tGoRKujn23WjKckO5f9wpUo8V48xqo8kGhxfPJqdMRNvJMtRBkWh+s0K6CRFgDg9k2+sP\n4bWIcBQo8UpEIIH5Y7bjl58O16o4NnQElddigCoiz9QTdNXn1/XNwIWDenKlZRg1j8VQo4zg5YSX\nmDuqLxv3jQH2ATDb+C2mJAnDdl6itcFMb8BUCUfHDeZM+J3saRlKc6SMF5u2cPf2H8jR9mZd6IN8\nVjQbPGrE7gpU0V4Qh0Nkf2ht5I5FuzGN0eI8qSE5Nx/3QTP1gVDuGcvuxHvIvDQIx/5aevTN4ImZ\nvzLKv5AfC+ZzdlxvYkU/MGz3GXbPWy9YduEIJmdRPrhF0FgEIhEkxBJTeI6QhiJkgAgPB8NvozSu\nP08ZP0Uf7GHTmZGQ2Uhsjwaem7qW3DGJhKU34laI2Th0LnP/8TOBD4uQHj8FSyYTvMCLOU2PXeFB\nEWVDFuhAHW/BVS1Hghtbopw0+UB2fTyFHScGIGT1DAcO0plzP5CjO6r48spEGmpbEPyXSmh14CqB\npMQK7hafYWjTFZw3mqjqq6W0MRRTRX8sGAE1JksQjsMqol8soe9RaIoNIj8glesSBScSxxDaGoD0\nGmQPG0DLiBCe6P8xg0oz6f7DHlyyWLZWvIWm2UK3JUak30fi3uRmmqiQy97EWzpWkBuB86iRLW89\nQeBiK/PkO7HXFHGwNZiz+XdzvXoY4CK+bxqFiY1cKxiFxuDAv6cCTUYMQ298zuDn96JXqYEh/wNG\n/H+PP5XAvzbcyed7tZi+skCMQ3BA/iYBYWD4eR5zvktU2ynqgdI2SNJeZaTsKpWAXQm9e4Ldo2BX\n41yeGP8hW0ccpZ/cgUIMJIJ+cTxBh730PHEKw30WLBjQfmqh4RScNMWgjTAwpDQTYwR4lkWzKuUl\n2m4Lpk0SDAoPNGawYdhjcNZCUT5kjxnJF1PeIm//UFyXLeASEbhAROgTcHXaUBqrw7H9VQMGCHI1\nMN+4iUfqX+fyDegmA3GwlOfH/Z1+2izKek6C2R6Gb71AqEnK05b9xG0oItctLAdDZEb8evRGszAa\nuSEMQ/V1hp74nsH17+MaGUFIEIhMbkQpfQiY0EjLyRC8ThFExzBo4DH+ctc6Pvz0buor/ACbMPs4\nQRXbQcDoRvzHNWOzqjCfTkTX3c7QKRlI7S4M50xoz1tYe/wRhs/ejE7dgS7HgsTiEbwydghY2IBl\njw53gwQPYnqoi5kXK6K+m5hs0VBaL4JG30ZEXBvvLJmLkMboBcRcPdqPV/7xEeNevIDKbONSOZxL\nGMSPxnvQaSpJUl/G3O6ic5NOJ8yB/mRMEQaF1M9J7MpCmg6H4XWJWH3XiyicVq78LYCcccuobh8H\n0uzfPX/D3YOrrlQcNQosmTrBe+S20fSzhY0/L0XYtSlgReNTdDxvY7L+KNntEBgCWeYothjmcPn8\nvViPNNPHcoQYbR7+CjMVU2LZ1Ptu+OIyeLw4yhIpX9FNSL3o8EJRIW9e+JbjaaMJM6cxrnELAeOS\nOJCp4+vyJWR/PQXczUAbk5IymB95gh1Zt7GlahJ3tx5m+sx0snPmsfsyEOYBUx2o5QjDVglYoaEQ\nYiVsME+k94WrTNXn4ZZLsJjMDGo/zZzGQxzImMXFlEehMooOv3SK88A9RUzTcAPaGxa+fG498aOO\nMsRdjTcgGlNGOPYmFfWbuqFJNeGXaqJlbwhtxwPACzVDQzj94xBuXExgx5oZCNqrQQi0RyPknwBJ\nw3jn1RDQNEBQNLRZQaUCeyynY2YwaOw5xgXmY9sl4ZfNCYhxUEw8+7gHIRgYAEY50ndiCZ9ZxbTF\nkH5PDM+uXkqDtQ+svMHrQ3cR6cqjLfIuvFHJRHTcYOT4G4hDvJw+n4jxi2DaCoIZMOoyyze8Q3Wb\nH5Uz+uHav5c0n6vn7IZHUQcMI2lDNtaxanpEF6KTN/DJoLmoy9QMLr6Cs8POnN5n8E5WYtKOJLLG\nTNruIIJd9QQ3HOa4eDphylohj+BPxJ9K4Ee/GYbNUgLqfiD3+x15J9lzuX/LRka1ncIiBX8p+Csh\nUgsOm+AKrnQJhqM3RMvCkO/Rbm4jagSYRTosXjF5Df44OlzEPFTMMulKEivyENXYiVCCfCCUJCRQ\nEJhInzOZGJUG8pQDcaUpQAJShYOBnuM0k4N4oxv/npDrGcnHd39A4a4BuErl4CkHYxHNX4Xg9RoI\nuFOBrV4FwRCib2Ce6isevv5XpEAC4BLJ2KEajf2sig/qHuSjtDeZOd3KuF93M9hWjVYBVV7wd0N7\nj3iq/WJxDJlG0AsRBCfkMXj3OR7dvpLsBmhbWEqfFAgKCEK0cCbxy8/gWS7B2yGmx9UcnpnxDqOO\npfNlQU+EfHtBtIooG4ZJjbhrJVS+3R39vc2Ep1QzvPEA9839CIdeS/YLSdgmtzJJfYa3n/kJdamD\nhoGB+F9uR+ZyCSntN9Q4q+VIot1I8DAr7AhPT/6aw3Mn8HLQBAr+1oPKNCvrX4gEriGVKxg4XnAj\nrH3+dfzKOpB43CCGYDmcfPVRLDNCeXr7Rs41h7LHPBZbqQplnPV3OlOT2I3NHzyB1ybCdMmA1yXq\njHWWQP68BJ5hBIVrE0EpByVYolXYQhQoG+z87JjNp6WPo7xipeGrCFCBWmejd2ge6qxCTrd1jjht\nEkhKobwVIvQguiuOb04s5sx6HRGTr5EcpeMecSbT/c9RWaXjeqOBoCA7Hr2cGrcVInpDTQ4YwhHL\nvYycnIVHJuHwD6NZeF8aQTdsvB2xlJzrMsAL5hxAQXSCkV61dVSlRXJGH8aQsvU8NnwfKw5N5fuE\nJ2FfM/TQQkUWQirpzXhRGGCmmyebOHkdYf9oIexkDefnDCOzTk3Nd82sI5UavKA+DyEKzMY2rtYo\niPZXkf9MAkOWZmP6KQjd6IEc2XiG9im9afi8N1gUIIWOPA1sjeh0v7ng8uEELn93L8JyoAZhg5QU\nhcpC8rBWrpzwVS+lBYwN0G0wqP0gJxPCIqBZx76NU9m3cRSCtS6k8wVFNBEQUgyZOsGFGKSFukpw\nNQmunmwQ3+0CqhgZrKK11c1PF0ZT2XsCpm1SWG+j9AMVg2ZKaL6kIGtvFNZmLX7+DYhz67H28ec8\ns9m3YQ4f7l90S+71hBK1vpjnjj7BRudb7AmYSanJRMf+Bsa07EfRbiWop5GUqlYuburPzKh36DtK\nykX1jzR+ZWOjbjWYIqDlEPwmY+3PwJ9K4Iu2HmblsFgciv6g6Iz/h0TXsbxlJfMduzB5QeuF8N+k\nB4jEoJKB0gqZGRAzwosixsr0qT/x6zQHY/ZGoQyX8ciTC7A3RaNLknDhkBjv97UE9QL7SDneUVpm\n11/Bb8cxGuVQHN6Hv8a9iWe1DL8BJgyeZj7ZeRtnAGUoXA1N5U3/NZStHAAKuTBmuiUKkc+6Ilq+\nVdFyoI/gk5TCsOR0Xpn2BjkZEO4BhVPO1aEjePON72i9NxSvRczKx57F1goZLsFrbHCAyyPkoZ99\nbD7bwp5Cvc5K4ju5hD5cTeSNSoLFMFgCx62QlQndR3iRBjtozTQQu/oGvbJyePHOFbQuqyNvXiKt\nwTFgSQCpAbwQMLMBkdxD3c4Y8ILkpJsZi77hocnPkVmhYtC1PnSIZLwum8TFpAeQvuehrRU0epDc\n1I76JhrW6cGmRje+DQ1mYeyqwSGV40qUYHiglY46LWTVIVeEkzo+kw9/XY/mege9XixG4vEIE7YG\nYv3BIHdRiJxzx2Xki/vSbh2G+VzVvxD4TXjNImo+jKEjV3NLa682p9J4RYm9XQ4uEzibwWOn8o5w\nlI12onbXAmA6acB0yQBikGhc9J5Wwkd3r0f0toMRh9+CmgoAApeC8l2wGiG+L6wYvYzcG0tIdF5k\n0dydzMg9jvGrMk7oQ7igHMnqC2OJURaSbPyIGs1i0PhBt6FIpS5G9E/ju8ffwFTuz3t/WUOP9aUU\nSINQ7LwBlgmgNYDNjn+kiQmLrjEwupj8HYlUbE+ir6KGC2fGUjBjCiz7FZQ9wG8caCPA/Nvt9QH0\n7Gvizs8vM//IXq5/6uJA8wB+3HA7R2tmARLymA3UQIcKyq4i7dOM7vEhiGgDsRdTlAZEsGrn29yZ\ndDtcugT6VJD7MiT+eXOgF4SdrecRAvJCmodMbSd5YjXrXv2W0SPuFO7dmSGk1NqVwoJBKUEVacUp\nduKyS4RYjEPGzRz+hBQ/Use2UJApAa0NBvWHPXl4S9MwZcSw7VIUo91iwJ8neqwl61oTojbYPWsF\npnN6IaDuS4vdWdGHT2uHQTgEOfMJrd3Dp83TWL94Bf2vZnKV7reaZL3USg9tA5eSoikujUWVJGNY\nj3eZ/GAR+68NZe93U1kw7TyHXM0UdiQya+Ip9h5IQjm5jPbAJAgaAGfKgKHArn+rv/+38KcS+PPH\nVoDnGLjF+JJMidZWsOC5rYzxXKZ9RzAtV4PwNEvo8O8gWNOIrsWMTA1BSogoB68DbuS4GDn4BGtT\nH2G/y0W/t28g7q6kz8hECiO0iHCiQuAYgMbUAK7M6Id/eTvjms+hO6lB0j0amcpB1KkcJLgIaGom\nZKewwdgWqeL25K+oeiMN1DGgEnJbQxxVaFwVtIZ5aQtUCK573yrC6pQjlvszbWIj2KCyIYT3t28i\nNKWRUEkjCpmbs83CRpBABNJOCICmdrDEhKLrJqfv6Cvcdelb5nz4A6JvwOsGhRIM/qCrB4UDyq57\n8V/USOWd8SR9n83Clzehqm3GDry8YBXnf50JYmXnESk3feViwOPE3WqHaqVQB5sXZ4ELfVIHG06n\nYXtNhV9lBxfPehk+SDgKpNQagOnAWVAPgfBkPEiQtLqR1ztpMaqoqAjAWB1E9epYkFpQ6JMYnGri\nk09/QFTkpc+zRYik3t+ttkq1cYhkoMCGFJC2t+M/rBL9tJb/Unekeifd/lpCwQMpQuqiB+64vgfe\nuw7GY8AlIBs6agCwG+RYYtQ4RE5oMYNci8TPReDEBpIez8OVoeCLh+8H8QD4KsMnRGgNBocZivzj\nubB+JBa1H+8++w331u5A1QS1veCrktH82j6R7rYsTLJYzsYthQY/6ACZ1MmQ+Av8OH0syjvBP7QJ\nlFDmF8DCvCfJ8V8A4UGCVVJRTq95uWTXD2KdJYTXXl7H7g1n+SF7IvfteQr2NAJR4HWCSAp9+8L5\n80T0bKG+NQyFfxrrNq3C7e9P2sxUvjwzjyu/JiKc+ulCOE/DDJjR6JToA9xUlI7moxVqVu1+G68f\nZLzXG+/zTeDxCuGCKeOhUC+k8f+XcCJkHXUioLubBzfV0HPxb3P13VBxARIngEuDYmAikQ+X0nzK\nhPFCINT4QXUHOLsBdtIP6kg/OAMoQmkJISynkTJG4jYdpGDhRGryn0Jp3orIM4CFZ5N9I7wD/l7u\nU/RA3Mjx+ALqiKQghvLQsayLOQJHM2DNfi7Sjft4jZvn4BRNvcZKvuPz9NXUrelDWGwVLe/PQVuw\nlZExNlRF3yNZl0GhZDH+M6IxKVM4EPgQPHsdZc9uhCbk09ycT7eWMq7/a6br/1X8uTsx7/8HJDwP\nCh2yIAdiuYfVfR8nUVOI45ybVaMfZWPUU1g36xk8M42X56xh1qbDyM0OaAZRBejkMFrZxrSpM6hy\nC6deSIDrT3ZnVfpTvMVbVDZ2Q2npjKB3219HtyN1EAsdKjW7J83mqeHrcS5QEvhLM+JgN05keIFy\nCXiWJmGfth8a+0CskJmiNZh4qeZZJlh+4qtVr/CNeAxtnwk9KPdYCDpVSWBaIySAUyqjSRHEkMo0\n1lcvxgVER4KxDuy+gK0+MYgOnRRHqZQ1D71K2tSxLFnzIbM//AGdBmRyMPn4TAwoRaBSSdCnhCGV\nOen5cyYivLx+5EOW9F5ElLGN1t0anNWSTrIUOXG3e/E6pIKk22sw7y2n4nQUcj9Qldpon5qHojQZ\nr1TExXdTGLPsEkqlC7sDTH5hLLqyiLTmCFBLCZC3ILM7CdzWTtDhFj6rG8zTu+6C0CiQ2ZFJpKRO\nNLL1L3OJe6hVEIxwrhIAjgA5Hp2IhyI2UKxNIMAlkIAo7zJNb0xCXBND5Mul/1Z1nA0KCu5JEXzY\ncgSfWiZgzfJdaEc4vEoIoFXcGUHlneFUrq5H/PMJpL2moh/ZQtwbBVwpTWXs5/Nh+zng686XZEPy\ng3BiHdyt+xLHX4MZHnmC3KeqyS6DgYkQHg1P9dnPgoaj5JyTcWBGP/LnPMXpJ29H6nXS3+8Su5eN\n5qtp0Bto9wRirVXzN/d8arsthOpqsOYixAhcpK/2AyKJfsTC9e7xHB89mE93TUZwTcQCLvC6oB1E\nOugW0MAbadt5+ZuPSbrHQsiFDp594FVO5w9GEHwxBrEJrdSA01OFw1UHNDF2eCZzF6fz6ZplvPPR\nCrw1YohQIHNb4fMv4M1xmDSRuL/ZCXFxoIrodFX59EmicYEHJA4vOqkDdbsVu1tBozYIJR0kSQux\nR/3mUCGCBJm4rNCqJvpvuTTsCKUt3V+I40cCMrXg7rZVIZzRokcpCmV88lVeXv0ycyduwBQmxlN1\niYyaAbx/9A0iDPU0N7TiEk0CVyb/i7r3Do+iavv4PzPbd7PpnRRSKAm99w4KYgEFFSui2PtjfxSV\nB3sDUXxEULGiCAqI0qT3HkIKpPeySTa7m+27M78/ZkNR3/f9+bt+r9f73NeVK8nOzsyZM+d8z33u\n8r2RYoB+gA47qTgI52JRBYIYvI0YOY1f7IIxXKQ1LEa5JZCidvJ0xL04jvZh0DtH0KmdtFeH802X\nWZx5PIrqDRHookvBaceXlMyG1n7oV1VjTh9KUjCfx08+wZcHnuaTt18jc9GTfzp+/7fkb06lR5nU\nfuj2egHxOQ3sn2Oh+93neN96FStqVRB1Bq0hhhTvVnQD3OTf0oNBy/IRBAgzQN8YJYa7uUEhbexk\nD+m76CzDd8yjNSmJN//9GmG/7qcDxUmPoFB6er0qvp8ynYedb+O4MxriA5Td3I0ePxQSdKgQBZjV\nI5xtA6qQNHMhs8t5NX7+wmVc5zpC/FINBpUBv0fJoNTKXoa3f8Wk+ns5EQsjsqE0PJtbu65ie/9+\nuFGmYgoKELvNYQRdau58fSkN43vS/GwajpWRZIQXU+/xUGuELuEhmqUocDsVq+cYNXj6JTFs80bi\nab4kazFXDOerbx6m5qVCqMpUjLkAlmKa3xQhrieYJIUAxmVFk3CSrNs1RG4V2OCDCFsQdYQKkEGG\nMSNh01EzD8//hfJKC7S40Bp0vDXwCeYd/gwqoXR6OkWenlCsAX8z6sYSBsT5eHXtFPJ+gYwJocaF\nAQ4IGFSceD0XVxcDtkm/UbOiK6rHwwkadOie74sh2BvJ04HkERH1F4fYhESQUYUFCfov4nFxAFIL\nCnB3iozoldD4/agIopEkYmZaSX3/KABSQCCswUH46WZEsQAZFTZJ6jwVToPaD8K331K141met39C\nmm8/tRKYZD0paVqWHhrEgnMT4MreMCwD5p2BrpDhP8eKM2PYcDWM1YDNH8Y3e99h++hr8TQehcZq\nQIMqLFLZlaBBJBnJE81PHyfz08djUdCsHEhFpQKd0YHL0wSyH0OEj4LnbqBEykbtD+Czq1j3goCt\nyIWZQ4CaIOEsiPiOB1N+5KwD8ipD3bIFhC3wGNtpygApRUtKYQ5+tZJ8FXSo+fD6Q/iXfqVMFlmG\ngKAEGGlANEokzq9FF/TQpdTOYzeeZObnmznQMJyb7lmF+SEXonoTR1/rCyuUW5ojsnE6ipEqdqHq\nM57SuU5k+xHErEGIui7KYjxBRqoLIu5KQI8b0VXCaF09a+0v0PxcGC8k38QHO9dR1q83hydpCDyo\n5uODTzJ76FwsageqaiO+gBf8TkSfB6OvA12HF9GnzA+N7CN5SDVXXLua665aQKUZrvxHPDfc/hG7\nQ1aivV0/JeEVO0snlHHdmo1ELa7CUybxycePYPYW8M5D2xkcCep18HnHPB47vYTxCeXcEzedlxYt\n44l7fqCb9RBfL/rjsP3flr8fwL2ACQrv6M+L1U+gcx3hrChSTRQIsQjWZu6Y9zOPvLEW7S6ZrHer\nQQ1h0dBvCgSPQIti2ryEQePYu31wzjZROeMEDrmFMBQdR6cDKVyktlhgyfpBvLssF4x7IGI8VO3F\n0xBD3qDxRAdb8Wj1DD1+ksbkdGSTCOqQnUeAXAqJKbfwSMlUVrw0BWLDEXQys9tWck/9Awp7r6wo\nSz3dReRF9KMB2ANkqESCCKQIcP/B9ZyYO4rANashSY9oiiR1URmPHVlI7rvf0QBUAMl6AZtVQKeV\n8AA1IsSLMnFBC4Si0TtlWsphPNNOgrcV0i/WPpqUOGmVAB1RUF+NIKRh7WZk3YfTaDwTz1X9VrA2\nu4CRjX3QCV5wyGCCJ786RPmjucqq0xfmLXqf0Yd3w28gRQisW3oFHxXPgkjFZj3UuZv3nQvIFyD1\n4hdjB1kUOPxRf6RY0OJFJQ5F+PggjInm5OKHqV2UgevLcFxiOAQEUl/+Yz1VbbKXXjuOcXrMsD8c\n6xRBVHqm+8cVJG9qhgDsTbkMrr8MKEOQZfruOMFLlz+ORgMJXaBFMhJXp2hNslMgqBEZORLC9wIG\nOOWG8QMFnE3wwplH2XBmLsiFCIjIP6fCz7sgTGmTlKNF3JvJ3Icr8EoaIn/YjD9jN3AYBo5ENOgR\nkOn/6hHiRil77RROcfbldPb/a3BoTIuhdxtG7mCZp5f/k1sGzELduIX+R7S8EyXzzPoiDKM8vD38\nbsos5/hWMw8pCB2Swkmpt8KhkIUj7Xd9ZNZCl2j4qdnHNbcUsH91fwQVnJk4GCK04M6AthOIXbXI\n4XHIPkGhk32givg76pj5zrdc9/YyVLuA4TDy0CFKdveg1gJnBuhRH+h3/l57SwcxffAGGmqPM3jl\nTkqWT6DtcBzZr54hbtouZFFAK3tp3JdK/HwLzwdepuf9e9jXDO+Jw3nuzvWI8z5GyDqDoK4D4xXI\nMsougDqWFYymp1TPtz8+S/D7feR8u5cJKyBnK+yuUeiNp9m+Z3bNSvYPu4aJm4H3oTZWTYt8IQsy\nY3YF9079mDVP3kLxYz15TvUW0e9Wce8974Msc1iGr4E4QWDomc9Ze0c1m18bjerfGnpyhqXyHTzE\nCq5UibwQ5G+Vvwzgfr+fefPmUVVVhdfr5fnnnycnJ4e5c+ciiiK9e/fmww8/RBD+nKAIAC90/yaf\nsCdtyLvhixVvsr/mDlhn5vb6V7nq/aU4NgUY3CP0/QDKzviiS4rAZBSKp04/y/s7D/DktKGwG+JD\npxTlwT+jnmVN7LP4OQVsU546Jh4M46HiIFTvwtplGP18T+IemIZsXw/tWqgXIGM0TIzAmhDFzStv\n4NeKNOXiWnjkmiXM1TzNuReVza63DbZuVZIrdRshNxmCrRrea1zJzsyr8Cdo8IzcgdTxI2CGxkLe\nEh6i0T6Usyg7ys5hteuGyWwZPYZ75iygKhGyX8/g6jFfc6bvkJDf6IIGLskqEI0obHwhMQBaDZe+\n4jhGXVnPou//iQDEJbUR+xxoXwnQGJXHjEmg9oe00RuXg/lpMCWBFnpoiklKaYA4eK3wXhaWzgAa\nQdsDTAqnX10M3DIxlFh1UTjVgc8H4o3WognRk76xcTHPXzeCBsYqX+g0i7Seg5ZS+N0W+E9Fxx9o\nJK9dHWBmVQlJeyzKY3f+hGTIzwd48voFCPz5wD/w+UAeHP4kLbUFuCUvhEHCN93ZNvFWhiw7xUPJ\ne3nEvAfzWydYvPtmvuJ+MPeGtGHgdqAqO47dZSDihxOAhF86gRIb7YQOiS/Pjqe35wT6yyW0Khml\nmyRO+kSuRKS/ACmCTLMk0YZI4VGovSUbNt5D4FqRkyO9bHtPQL8FCqJ7YVN56Aac9J/3KZPNpYpN\noknpq1NtSsxKp7g9sP0ghOnguZZW3vhJxvMl4B8Lpfv4uOoqjq65jrUH59K6Jf58SnrYXdAjGVgP\nnAOfF9otYMnJ4J21rzImcz6EOLGPprey8tR8TicPYemap0l4qg55sci9d73N1R3f8cVr92K0d3D5\noq8pRKZC9mP0KdHitQ6IO2HhcRZxVXwEd5avBnEv73cN8OjGQvKzz6K9IYDta3hiztucDEg4CRHV\nGS684E3mG9lydDhpcZ+yygxDu8cx5LlH8bgH0JmCG/NoPYfNQ3DmGPly+nV8VzeI677aw5Mdn5L+\nbhHh+cpsO/DIHRx+IZWFeYtQ1QZ5fv1r+LRanjr0AehF7ixfC+kH/uex+/+j/GUA//rrr4mLi+PL\nLzVv5ZIAACAASURBVL/EarXSr18/BgwYwKuvvsrYsWO57777WL9+PTNmzPjjyd0eBFkhl/nQ8zh9\npdM8uepdKq4fje6VIE6XhqigTLzfj9YFYmfmpBpldBpANQ+0P4Zz7W/fAHBLzxvxLclETtajU/m5\nfp2fwUskeoY6XfbArvKjuFqPQZRJ8b1IKNtDYzRkjISKk8jV4BK0ECGCkACyVfEiIvND3CwyDUVs\nlUYSiJ8K0Yq2pGn206urjx4zwVYPJYdBFVR2nRLgjonklRPbiYj00pEZRtCthpZEkDKAYyCXkzCp\njfnrlnDyRBBTDvQZDz9cNovXJj2FQeOi8fuFpM35iNueug9r2mAkn8h5LqlOMfNHhlgBSB8BcUPB\nr1FmGQIqtYxW7yeIiDrKx8m7hnP3mUOIDgl1KJHs6JK+uKarIag4H1eNvJ1+aUdxnjXxTvzTvNPx\nGD6/HuRKcHUwZFoFry/dwKg3QP0ncbBBnYhG8J03+4h6EGZNh5wkLnGGyVZa1wqQkEXqgj9q4f+d\nXPdDgGdqNtD3SDFC8KLU3BCajfxhFw/NfwOT50K2XDCoVMzplNv6vYWttRApOACo5Imlb3Dz0c0k\nftqMpjpAVQO85xrJ9x3P4SQWOANCTxBEeg8s49tnnqHrIgv/zlvArb2WcTF17zdlYxgqFWCU/TQH\nISoKtF4wuGAcynhRy6CSFbNgK+CQwFYowzwNZIDfp2Lps/DIMDDmudCbwdqq+Dg7n/j3QSOCoLhx\n4gBnm0Knbm9WlkixPcCwOacJfqXi3X++h8f0EISb+cfWXQx8tpqjGoEuL1Yga6Dh/TQIQJEbNpbE\nUTD5apY+OAbZX0of2c2qc4t5d+x9/Oy6YP5qOHEz1/5jDRHvB1n5+ScEM0byesMLzPBtRyd5mPvP\n5ciyTJPHjR6omnUFX70wgZer/4U+08XNX43HhY/wthY2jZlNYwNsbulg314ZjShh3gW5RjDhZ0BA\nIZg+WgJvld/FN8EpxN3SQNj0cirWZSEnjca5x8Tx10ahuWkKd1y5mA/vU9pp7fMDNlEi6DqA3CET\nkCTW3O3jV/lqVB1X4EfpX98nRvhW4DP/o/iCWhxPHURGQEBWdk2SzN8tfxnAZ8+ezaxZswClbJpG\no+HEiROMHatoU9OmTWPr1q1/DuBSGNTvhJShRBTb2b30ck4Wj8dTbSD9kVIeaV7E5JVf4wOcDVCo\nVhJ3ABCgpCWGOSfmMPsXFdbEGACGigL115xDtTUHdZbIzZ9sJLHMgkZ/0UMOGQDWIXAkVH1FDv0I\nIhijIGMQVJwBMSc03y5Cw+qjSCMtZK2pIvpgf0XTFTU8dPVSLg++xaHVMDoLNOEQHiJic/thT2sc\nN55bStW4faiT5xP0qaAqX8mQRM+CVVvJHn6GEacaEJY6MbSAKRK+PDKA5zd2pzWumchrBhI36iTe\nuC5Yps6HfRoFvDtVrLI9IAUgYxh0z4GSDqg/DcmCsggJ2s5cGoiLC4VuFp1/NFGUEI0SRj2ElGOO\nLe7D/LmLqKssP28L2f9DOwOLS4kNk3AU5tHRWgzmoaDNYMoVm3hr6nP0+KIcXSi8+fdy/5CXeGXH\nO8QkXeDe5rftyOFjkAdEknhXLXc0foDPGWTNEzcTFVHzp2Pvv5PcqAosE2NpsUeReNhC1ewuNEyJ\np3pVI+zaxckXhvHlonu5+cG3qdPAmEglRFm6aMtrbY5DCY1rAbrSJ+InrA+E8fIDd3AoT4M/4KFV\n6oKdJBTjvh8QGJlzgPeumcOJ2+voNkhFVLyN8+nF/fvxdeEkBN8ZzKMDREdC21GoaIGu4WAUFD/H\nxaJCiVQaC9Rkuum76QgqrYTo8xHMVfwU+EG8ASI3gqbowvu7WLbfeSM/5D6Of2kEchgEDdA/Mo/l\nPa9HWAsBk5qTb/dCI/rBHgC9zIqiK0i79TCpARs6PTR8kEZ4rg01QRo/SmW1/CIbrXfj/S5ImzcC\nyMTGCcYE3kK2CNhJRGHMhN7xJRjNHrSijxe+OMKbB69BWyZjsXtY+fI/2NJyM7d8+inj+YB9c65h\n3bRXibqrkDcbe7JG8w669gaCeDGZD/LcN3WM67OROEnGIMGz/EKDtw69MZdpH+/HOVxP8oINCBl6\njki34vgwDtdPBYxr/oJ/jG9ncckMwqrc5CyrxtGjG9+OHwvsAEBqdof87Be2dB4reNBf2qFOwCnj\n7KRAs/1Jp//N8pcB3GRS2KgcDgezZ89m0aJFPPHEE+ePh4WFYfsDeVJINEDADzX72bTIxm/Rsyix\nn0HuMoAbxA0MKf4SR9CKCVD5wVIDe1rhnJDLx+KzuIMqmqPyiUqopfTTXmTNLeSlHR9Q9HI3XlK/\nSjwW6m+OJ/zDDrRlflBD2Yx0KovtsDefi4HZ1MdB7C2NVL3QDbRGRXXOmKyAOtBZOGL+im30O1XJ\ni65FbIu8WtGgAcvGVtpbLHTVoNjkBCgbnMuri57EU6Xj9F3plDUXw9lEghVHlS94lPDJBaueZ/TM\n4+R8V0pCSwuiGSqevZyvbTM4scJEo6cNGhroUfs193zzPlvbusBvkYraJFzUPL9KiX+uPAI5g0E0\ng98ODfkKp3rnigJMaF/P+EEb4JkEMopqKc1JA2QEWb6k2tj9N79EQZ6bgC8Ragt5WXycKN8exBg/\nb7rv4+vKXhAoAmKhbyaaYSoCI0SqfMn0WHZpBIkkwf5DsCLwBE3T6nhO8wF3r1pLem4tl73URp+S\nJRwoH8/OzLHEmpvwqbRosjW4d6spW5yLqZ+D1JcuaOIqc4Ceq0+d/7/srl74q5S/P73vWiI++ZWI\nu23UzEnEG6cjECkS1ASwrmrn5C4956y9+ZE38QUMhLcXEQgkhjLtO1H8KJ0hM6vmvkmv9Ca8sTrq\n1W7O+RJRYDWaC5q1slrZi120lFYzNRqkRgnHlJLQMTuUHGShfzQ+HiHidBhqtRN3R4AbX/6N9Okd\n9N5TQtanBUowzUWiotOHI6PqFkAkiMrrRyPAyddyGbSkBG2dnzILGAOXnrvxsTvZKtxCw8/QsqOZ\nYIMd0NBvSAVTHlrL5Af+gY2+RIgq3u/y3nni2OVVVxLmPYrK5uGfn7xC3vBhBDZrkDMh4eEa4m5u\noG1zHP2bKsgxH+PdFx8EovCQSjljUEx4Mp0ArsfDVb02snj/I/SY1oh63S+svGcGx4YO5+DXaoq3\nCZxSxVBHX77fnkPbkZOYqipRDXTT5VkXB9+9HPZaER19eeZmC5HBmdg5jJZ4KjDiIwnaRJKjz7L3\nCxPyjg7axo+jOHow9FARbJYxtO4nuX4/EXXhCO/0Ze6DU6BLCf5liXA5//Hy/8mJWVNTw7XXXssD\nDzzAnDlzeOqpp84fczgcREZG/ul5MUMewmqLQGo6x4fVPZjwiI2EjpFc893XzDr3BQSsCot0GmgN\nUHsWwmIh8Y5wKtOHovlZYuEjnxLtBueidZR/GUZ58nScHVEEBQ0qArhT9Jy7J4NuX1US1W7Ds8OC\nd3cl2OzEXZdOWNJIKpb1x1NpwLIqKURwJYFkg6ZCSBgOublQVMTbn7xLn5l1xL1qo3xzJW0OwGTk\n/quXca9qFfG7wBTC+30Jo3l24Cs4+mrx6I2UhfeCmC5QXKlk6AkCGNW8/fzDDJ5eSLfvaoj7rQ1N\nZoCP7pvP8vK7KTmehTMShY84aKPQUsJC0220vzyV1LQyal7LutCZ53cKYeDpCJl7RMAKETnKziIk\nw6Ye4N7Uzxn76x4qXgojL9xK3wUCZTmpSJEC+c/2oM8ipRBtaclwAlkilJdz++ItzDq8j+iqdhpr\n4HBbL5qE7hCsUShBHSC1CHjDtHjHaTmZ2gt9k4ecJWVgBEGCXB289O089n/Qj8KdTuY6/YhIDM0+\nR9+Ksxxxjz1Py9kphl5OUp8uRxtxqYYjqGSMvTou/K+5sF2vO9eGv92BL1GDP1GNiMTWz8ex4ePp\nBCw+AhYbLnKxcBnIzeA3osQG2VBcf6AEPyuxxWU7yxmlsrDY+iTH92cq/Uw0fyiO4ZIoL+nOU4Hl\nxEcECQaPY2nPQa2p5Z+/HGHU+yuo3ObA79lPgV2FgSA6ZMbva0YzMYbweAdrBszlx1umEzOoid+L\nx2TA16Kj7oWu9Fh6mtlPQ2Wuifxne+CTdGRQTEKVk3+evpeDLX2ACho2JtGckEzQ1IW4YaVMjPqR\nPq+tw1HghI0mmj5+moaveqH+2c4/Lo/mrU0vAtDHc5oqPEhAWWYmZ1f0wnkkHPOIdjRJPoQkL1ft\n2MplP60i3GAjYXI7m6aOYuYTr2MhmnaiWMZ759veenUZ5Uvi2fpMgH69ZWixcXzNDMZu+pS+E01U\njjWz48ztCPbe9E/fyQPXvoXpu3bEExauXf4Exwtj8OLnpElP42vz2T59HHIggOIt6o5CF1FE5XOF\nNDdnMH5gkFJ7Ae78EiZ7i7mhdQlaey3+plZeCjbT1OLkX/zA9sptTHrTzHWM/0N//9+QSi4tavxf\ny18G8KamJi677DKWLVvGhAlKrNiAAQPYvXs348aN49dff2XSpEl/em7akjmkFZm4t+45Ej6pp2t9\nIa0pB4k3lKAO1NOOMj10JoVATwQKswbw1eDn6FiagtgR4Os37sXn80FFJR0V3cFYwG1f5TNozWli\nbS1IsghqgX/vnMnhhjDsbS2ca4kFTS0d+xx4wxwQ6II2yUTyA9UEm9VUvJcFqf0BGYqPASYIBskc\n2kzfr89irnBCQxto3dw/exmPR7yLflslVaUoCpsIB7ReDpV4MOV1JdhYrlQRMCWBXAStFYrmbIP+\nAwswmr2Yyt1o7AHe3TGCZQXXUlkfTbC0CrxJDJ9ay9zhH5P4YyUFQzN5c3xPgssuiq+VZSg6psRT\ndlZmr6gAV4jtqKMBvAGITGPO1J08nLyE8j1R3HvsfjrsjSQM97AwcR8AGpef5F+b8AsabsxeTUdR\nHERo+OCFJ5jUeJCuggV9Inw+cz5NWdnE/pxMy7YeIERBUwO6kjOYcWALiyAQI5L4bYvSRh8IeojR\nQd6IfngTY+H2LLoebceY5UGOFqjpn0RZfjZutZkGFJJd++4o2r5JIGyAg6R7a5BCW45Aq4aq5y+l\n4AxYLwbTJiS8fP/uVZzek4OATHVxCnVlqSi1Me3K+8WLEp+s5w+1QXtMgHI9D773JtsXP8TBdWHk\nuyKxesOUMfF78I6IBXMSrlqBAi6joFUmKj6L579ZQbfX1zJoRxn2wmYGmGWO+itICip39QGB/eB/\nrIVV/ul83z6CyrMy+n2dwaaANhJiegMgGoPEzmlEUonsvmc26boynDl6gqh5sfkZms7GcrhDTyNJ\nQAxjxhZxv/wKCRtshPlcpOjKiaOME2k5LL/7GeKGaoiKraC2LIXneyxBI/iZ/bWDtPdl0pxQG9rk\nuMuNBNo153d9Y779jVnLv0BVWkHQADcHvyN73V5M6tPMigSvbGCI288drkEAfHLfq+hzvOx65m42\n7u5BeXUt7tpqnA8LiLMSUX9noHmHhnEtFVxl24TQUUdmTYBIH0g78on3Knuj4W41jR+0ECclEkcL\nInoUwpkg2/91C9uaF9DyYwUR8aWENbZBWzs5V1YzMniQH6tGYLvjKl46sQzLQZB7GPjpydmMOvI+\n/Db+z2Dq/4B05X+tqPGrr76KzWZj4cKFLFy4EIAlS5bw8MMP4/P5yM3NPW8j/71ICDz0/WtkNB0i\nocKF5iwMTStDZ4dyHUQlQlQyOMbFYo/WYmlXsbhoJCW/QsSYNpo+Dmff7s7skGggElxtjBi8l8Qt\nTYRXdVBSCvEJcKbCxPr63ihG43Twu3CfrcGNCOrjBArbsH7rR9L2haAKIhJBL8Gx4yCrWbB4NZHJ\nTiwDY/hw7S2csCVBnEC/sjyy9GXYZYV6w1IF+YziS+YTqHVgy2sDXweEnwKVHtBclP6ciSMYjTEU\nt/xe4mN8UHoNFZW9IULF1Fk7mKH5jZ519Qy0Hqd8bCafD78a95smfGcNoWzKgGLnbndwIdfUCLYO\nFNttNLg7wN3IiNnFjExaTW27hw0DZrE+LxdaTjJK60Hl3kn35ZWoAhKRhQ7yH+7GhmckAq3H6LrI\njHrLQdr3leNPh4/a5vBZ2wAsWdGED9AhGQy07TTTZ2AeM/rvIu31BryaNgImNW0DIog6bVMih0Tg\nCqULTP0ddHnLQP4yB1eU1dIlTkNApUF75BjBq6PJnzmWtg2x2F+LwV+hxV0UBiIk3F2Lv1FHzb8y\nsW2P+W9GZoA1711OY9UQGis64y06Saw77U4+oBkFRmNCn18EylFpINYzbGIN21flcKC0D8qyouL3\n4B0xSWJo76MM+nwnsslHrx5gj4TDRzzkbNrHtMR2KARtAkSPB886UD+axbrvLqe8MA7JARyupYw+\n1JAK5T685yvMB0HVAZHNEN8D0RBEECXaf4lh4ytX8Pb+Z2kcGk1AJ7GneQTFdQJKIlMqkEFNXiR7\n/LGEtRYhtLYjkIXAFFqs3Tj601UYNrjR6z1kvHSO4HtbkeV+TJ+WT9QmH4Y2WHr945zdPYhAoVJx\npvWHBCZv/5nrDn5F14IKPCg1q41lLQz2ttAhgtkNZtnNGP8OQAHww+u1dJvqoXHiEEYuWY9wazrq\nn9aQ3q+RPW2jMfZwEj9eIN6uJ3VaGMf3X87K3d0J09Tj817YQeIT8W6Mo5oLpahve30bW5ZHYNnj\nxhIxkCBhkGeCDjXRk1vJmzKYZze+zLlqF7Eb9eyOCEO6K4cVC4dSsHs2m0+9/9+Mpf8c+csAvmTJ\nEpYsWfKHz3ft2vU/nnsHnzNh3TZsNS7CzKBVg7oM2rxgTIXobkodA2dPA7u03Vnj6MLxplg0a0sQ\nJsSAPgfUdkjpD5U2QMtb0V8w/rNTGJweMIHDBuvn3MLJ4ulwPI3r0jczUdrB9oJkfmyJByIhYMZf\n7qC1wQhdY5X5eX4uG4F0Rl97DkOED+tQM79Ik6j12Olv/Zy0on2QAuHRUD5lMl+Uz6T6SA/OGPtA\ncz647YBBCQ9Ap6ihGRlQWclEaRldvyjD+2g41Vcn8/OH8VQEu4E5huvGrWV60qcMOHeM/m4/R+xD\nWZj5Att+nITvuAGMHmg8p9i22+tQNJBO6QSXUBk6RCCGluJG1uXlYA/kUN27N8R3IzerlruvWkn8\n8naMh7ygArsYxgvrnkDKOwcSPLBlHYGNFmqtkB0HuxrHcC4vDAx1BCZHIOt1IELfyEquCB4jYpcT\nV7pE2W1ptPcNR5BkMr+sUZTdXoAKgoiYL7NS83wATZ2D+Bj4rP46TlWEYbXLnBpxOa7TYfjPaRWO\nlRYdzd8m4avXEWhX074t5lIMvYjbvVNO7TJxYVEj9FJbgYaLPutAIRzqZPRruXDIDYuufp2U8HoE\nWiE5HAwXODNobYX2dsCPv9FNIoVM6LqPrZdN49AP8bi8Hs52iCz+djA/p17UFOEU5d4RyPnxHLP1\nopXIUBssKKYZMdSWULUTJIXj3N2MJjGDxLtrkDpU1C9O56B2HFGpDiwDI5VCTIgoZiA9SqyJjsrj\nJirphlJxpjb0zFqoN8KKClyCjMrkRbZYeDPsfV5nFfE0I3olSIHjM8fT/HQqUqMKVODMN3O6MYlP\n2saSMzmXKbFnSFldQXGvbvxy9wx8tTqalycRY2zjkUmvnU9u9X5fAW93IRCtx35rLOoRXZhy/Hsy\nPitks3Yg3BxOrwdlHHld+aTuJWpL/ZwOakgPVnE9v+INtX6QKHJQauImEQ5IiitInddCXscYGrfp\nIaqW2XP2MMRexdntOfjqDZzcMxBHQSqUHyeqPMCilHeQrSIH693oVgVZ3PEmlyaA/WfK35rIc+3Z\nDSz3D8KGFr1pKCpfKbOdu9C5LcRkK1EYljoIbLPSokrgt6ZJQD3+5lTcZ2OIv82K9Z0BdH/aw9T7\n1lBCJOMCm8ja4UMTCehhy+D5rLQ8iH1sLDMC25le8x3BrhG0Z0wFVwZEGkEbo3jYJOGP4XfoeGTB\nGtQRMkFUiEhAPQNu8zD59K+ItYW0hUG0FkpsUfzo6A9SNARCgB26hiIyasHJywM+QLTVErSuxbvK\nRfDGXFblz+LsIRGazxA9p4Pc+F+I2XAQrw0OTRzOK7Hz2LQtEg5WQpwBArHQ1hy67u+2/n8QDRBB\nyf44SnAB9VCnISm+ignyGrKP7aL5oJeuIZO6z6Pi54/TURDXTs/kYtJ6e1lxfBZ7awQKO0LDxN2B\nY3szxEQRNtmGYKqivNCD4840PAk6LKMUOtjGCXEKgP/OSS8iK2ulChovi+PHH3tT2JEIpyJxViYp\nWNSJYSrwW3RYvgs5YtVc+q5kLi1uDCjTXYuiXatRLmhHoTnVooC5HwXQOlfteM7bwGvPkBmzkTPS\nRDpUI8GcAeawC11qMAA2kMHVGMORglQ83WdzuOYKqit6oyygAkg6tlZd1KySzcAI+EHFhaLTAZQO\nikHxIrcBJnoNKKd77yZ+/HIsYEH2C0h2FXG31aMSQrUI/1CjOrTLiAM8enB0mtZMKN5uq3JSwAX2\nEiCcoM1P/UqBluETCWcpLkzgh3fzRlD6URekevWFmEQdHNP0Qz+5ggkza4hu8aIfCA3pyWy8fybB\nJg3NhmR0vwa4+74PL2InUMx717z7HXuun0JLl3gOmu/Av+VDMq7Ix9mtN2LvSJwGPcWr+6NLrGPu\n/DWM35PHyLjfKNyn0CZNNsNAG4TJitciJxe+7Ho7trQpYEjhthHfM8H0NTt1g8i/axJiSSr2QxHQ\n4QKysRLPgVoz1LYCpXg7GjnFHcCbv+/I/zj5WwG8aLGH5Y7BNBPO9U4NXUWZVpdMZqIC3kSCvQqO\ntXUjL2kqaHqAvxlQUnpjXA5uDf5Edm0BU9nEUaDFDqU1kKWBb+quZIVxMuU/BInyuRhv2UzXY0dZ\n2jaPnYYREJGhzBcdiu36D1FAApDCDY9+ixAuEAghxpSbdtNLZSXb34SzCkrKoMGaxY62SLAUACng\nMv/hefUGH3c/vpZZQ7aT3VrF+gMSDQ1wcPkEvt08g/rySqCVaabDpBQfwXkSCqL7saH0Rn4uTYM9\npUAbtEeBMR5+H9b0X0pnsWQRxZYWZKDpEFfrdpF4cA2tByEYCV2zwBYws7jyVhSnyTCgjc+l2+lN\nGT8ykNp6E53VdkCn7DBaS6FBTbO1gfxwI9mzkxGRUBH8syjCi3pXos9oGU9SLI2zu+A87gI8IKqU\nkShx3qdw/nX8foR2YpOaC8Ej58WHkoZey3nfwCVyqcalj7Ax+I549i0OfRAhUNE3lS1fdKPF0wfF\nQRw6FgTSIpUopTYVRHXnrCaMs21uWN1JmCAB3dAZrNz42I8AfJt/C4k9Ehj22WcYW504gADxgEhy\ndC1ev5lT/fvSPCYJb70WXMnIkh/Qgt9C4FwFjW9KCNpEku9UwivFby44b6+Y+xvtzV1JHeIl25KH\n9kSAVnyYBB9GoPWiF2IJS+Bg/DAobwPMEPDBUQFRVr5Ue2UiHz0ykoriRAhTADx6QgsDK3agLzvK\nYHkf44pPYPX3Zs2119PYNRIB0CZ4yJ6VT7/PdnJow4UbjnzMT21DEhM/3Ez+mIG0psShR8KHTO+p\nViz2as7si2KouoRuCYXUZZmZVLOdrl3UfL7tRkppIJYIimUJB3ZK5QFE4aVMPstGeRrtciI3zdjL\nLP23uH86y8pej1P1zGSSgx0IX1qxbfGi7E50ShWXcDORcpBJs/ezdtmFCK3/ZPlbAXx3+ADmjChA\nOqXiHs8BehhtnPNBeDKYI4EoqLisP6ukR9lVfR3E2MDbFaxV+E4HcNviufr6tfTamU+ZAAOzleAO\nl0/x6y0rGU+5rR7owLqmLzv8GTQyjIZyL+iPQrQJvPHKZPx9xoMkoWqu5+b7f8On06MiQNz2NjQd\nQe6Os8B3LcQ73NhyYGvMQFY4b+aAfQgk64EwcEtgvZihTYXBFM1dL+9g8cdz6eEtopZqHKSybtkt\nWEhm1JWHSM6oYa53K9nWMxy6IpN1tuls2pWJopUlc54JSqOG+HilfNp/KU4UhNOhII+fXsMayR1a\nwPAuB5nqPIq7A8IlCMRrKByZzppVU3ildCbKQB8AtLL2zR6sVXLPUDaspovu4QM3dGxpowQ9u4dM\noO2XaEZdcQRQyqDJRqi/PJ7kbX9s68CJ4BoUjzPJwOWZxdhuiCffHoGvJvSonQD9+/ejXFw5LqCs\nJ/YKCP5+Ffbxp0HRvxNDDIy508U9g39i3+LRyofJvShIuoPT77bhDtZATDjndzt+SLPtI+ito45B\nGHM1RA4y46sy0PKdFVpPgDoMovsjOt3EJLYBEoOmFTBT3MWENZ9jb23HyfkwbjLUcFzqxzlzFJr0\ndIKqKAp+yqAgfxDQDP4YaM4j2Kqn/uXeCJoU4uY0sNw+n4HSQTR4mXn/r+xaezemaDUTu2/FZTbS\nfqyG8dZTxApQHwRLbhY7uk7AfTgGdFEoC5mSri+TFSJ/kqmdlYh/gQZ8wvn+j5pqYeb6L0mw/4z1\nN6g5BXtGDeO9y54jbWYJAjKRjW1M//IHxld8yaZXLkQUzX6hioUbE9k+czr9dp8g51A+006vJ+gt\np3pnIlG1+ZhHpNDjTAEpFdX8OiIX28E6zr02loLW3jQPzOakPYv+q35DRqaGBNrxUFnUgHugH+we\nJrg+ISa/CJ0fEvVw5nAEYoREZL9WVE4fba06aK9VQqI0cailYqLi1cD+/3GM/CfI3wrgYW/045nP\nvsLc1AHtSqEGKYgy34JwLDCYT1IfZ9eBa/BuCEKsGqKGgtWDMVKi25XHcF0ZjzkD6g/B4D7QMD4R\nQ0Di558G0OK3Q1Qv0KSCvYUNnnQ2MBuF0c0HuJRx+3s1UQCtwcPM4St5askqdHuCyEGB9JX1aFv9\noIcjR0GXCdWmFDb1uoM89+3gMF9Q8lwdoNGA34/ZWsNIDtHmT2f1rlv4+JGbkAIeoJi+14hM73AB\nogAAIABJREFUaDyBteAIdw/+iQHDy4jb18Y5IZl9WeM53dELToeBo3OfHDL2arWKLV2WwfJ7250P\nsuOh0QIdNpQJqidncAO3PbOPy/sXEHBrsKvSMATiOLA9B7dZz1Ehh09LRqGwwHXnwsN0moD0/BFJ\no1Fqe1mooC8VRycxdkWA0VccvpCVZhYom5+GGJBJFCy4MSAjIiBRlgdZ7TZ0lxvIiKonKcdJYblG\naYLIhSSrP5NO4JZCv9sOQdD5X3z5vxZjHIy82ckDl53BfPKi5KJKC988NwmCe4EKEIwQnQEaA0gQ\nXlFDwGUAczZhvepJf6oEz1kTvmAi9u+TwdMMSTLuPHj34ccBJ9OW7cG8o5bDrSM5iwU9PrQY8BDP\nkWYnuxnJ4V+yYVdQScN0WElIMzBowlHaLTIHtmjAlIjcVISrYBCyLLC4y8OstuxFZQgSUKuAVHYt\n74b+Xh212VGYissRbJmYBQ9+2UlVQk++7vYQ7l1GaKwhPFLLqGlH+K1oKpef+YqOL1sx3RKFShtA\n0W4uvADb0SiON0wmTgsOn5szrUby81Pw7irDaldCOnWVHYgfiOwMu51zsng+r6Arlaj3nmbNi9fz\n0bV3kn20GBEoGNOfBp2JbqNcOBMaKD4Wg3VYNF5UhHvcDIjPJ+39Jqq9XXHvq2P0qq9oBKrYRCxw\nbtYIGkZlYGnqjXV9GN1yQHNDOPr2Ftq/kWhvyyb1zgpiroTIwhjS7cfYeVYFdc20oGfFSxNR8jb/\n8+VvBfD0n4+zfftA5NY28AVx2vQY/RVE0c5Jaw8WFtzOxpNT0GvBNLiRgN1DcrqHlKJGouJF7h+/\nhSmf7qBFBXEyNFbAqetiUesDPF7+LNWuAojNgsRe5FZ8R4QnnzATNPRMo9jcB5U+AU2Eg46CS80d\nRo2LWX1+4K3b36P9cBSZ79UiBqQLjk09oIKjtiEsqxzJtpODlWohasDnAo8tlD4XQYShnQmDDjJw\n+w+ccIXz6oKfIOhHcY6O4abX/sWMqs3YX6khc5OPmH1w0pXLwtLxbNyeATGxYEoFRyMgKVXHTbGh\nzFENZGcr9vvW1lDr/YCLIeklxDtOUtonnqr2TDwVMWT2biO1pw9NXRDriUh2dxlGcTCb1UenK6du\ncQFHULg9/9+IF4VRo9NhlgM4EfAiIhM8vwDICAYoejQLaZtIU2kyqsYAEcNb2bce+kp1mPzwav5c\nfvmpJ2i8GIY6EbQQdItoIgJ0nDFf4DIXuLCOdK5rEigL1V9jDzLFywy/3sX9M4pIK6zlSL/cCwdr\nTysVc+3xivHVUqbQLWgMIMMZ0xzlNfqdeAqsWI+JaFJFTENE7MX94MAvYKlHMeF0B1T8ev8EfqUv\nSvRLOcrOKArFtGUN/ZjApSI1M5+oHjqiUjU88OYKNn06mAM7hqLt0ZPePU/Sfn8GgiiTdVURwluV\nyHPjIK7TMRDG5n8PRwGmYRzmChRmwxbYaoWtlUAs4dE6rrx1B3c+v4lDjw7nLeed7L8LhiTBdt9E\nXI5w0F0wPbWsTuRT1yOgGaUQpRMDFVXwfkWITqCVKk0Mh2JeU3xKUgCcCh1h0qEmVBs24xh2LUJv\nNQYfBMrg53tnUnpTDiPz1+NbdIr96dNIvj2buN15WAb2xVIqUuDsTk63Uuwr1BxkPIUoHCktNPPL\nZfMoXZjIoNEHuKxPC3HAuqiRFB3rgIpSiI3DUSbiDohMG3yUmXzKzrN3KVwFYVmKRk4mkP+Xxs7/\nRflbAdy1so3vi+fh9FWByw1CLCNEB31pZ5dtAK0nquly1S7880aiOqDHVRbDuOGf80jVk/hbYMBn\nKhr7xlCyVyIqvp3PTg4idXkbGeeqycyqoTkykazyXUQJ5dzk+4Ku7EDq1Z31c+ZS2hyFobUFY4aV\njoK+59ukMgZJ71fCS9rbER6EKL2NVi7gRABQOeFcVD/ean2d0y6zEuPtsYDeCC4L1J5BQXA9MTle\nBtxQzoLtN4HfBAf2AP0ZPu4skkZFN1MplVOTGbynjZg8H2cc3Xmh9G42NXcDPNCqQql4Erq7RgXh\nCQpgOQGTCnr0gIMHFW0cGzkjGnil/HXEsFi+WXQHnrrumDe24D4USe3HSRhne/iidCbrHr6C83Wx\ncKCAfwTK1PgziaBzgQDIzjlHbJdKqssHU1+eSHxKB2ER1f/FuTKIMicv74X1fheCM4mwHCVD19HT\nhGdtNB5NDsSNAXsUYX1siFoJn0VL+AgrQa+IuyBUdq8TTy7eDPg5z1XzVyS5b4C5j1cy9uN9/Dhk\nHJMW/oyyEAHUQvZ4KNCBqw7F6RlaIEI4mZlYTqptH/UHXDStzkWfnkjDV2mQ0aYstB2dtqDi0HX9\nKD6JepQElNjQxSpRHKvpoXvr6N6rku65TezbN4yfV03ho2eng/4kBkOAkXMa+PDfOrKmRiIPF1i6\nbgw3z6whMq5zAXOgFHLQhO7hQhlHWhTXXywQR3SCj+FXVrF3y0CE9UeIeiuKyBetJGxu453PbsTi\nqIGsi7zFOsDiAmcQxeHbaccahLKQ7wG/CxpPhV7UBaKehqfjCVr1NP4zGnGtgbLUZOpW6GkmjCYS\nKPncS9sa4MlYBGRaxvXll3HPsXO/k/x/defGOat5Y/VNoat1FvsogrvD6THiN9648X1ytp8lz92P\nD1dez/GzBoj2QYcFcU0xmlEuPLP9tOwVUQ80EDiXCClD0HjWkTo0lvI9f2no/J+UvxXA218Ywsdv\nvEJc0IXQDkIrHGtSshkfG7qaIeoI3g0z81vRBILHtZhbbRhbg6TcA7rV0KLTUnpLNsIMiY5nm1nR\nvoBH3tnItSu+4YFrVmE6+SD3/Hs1/auO0YoSa/Dv0fP4rnQ8gbUNeNRdsPpEZRwCRqmD3obj9J6+\nhzUzlGo8ndIZ3OUEmsjk3csWcDp8BDQJ0HIWmg5DfIqSho8OxVZqorwomRfnJwNbUeJy24B2Hnrh\n3/jMetobw2lrjERTHyCs3cmCknvYYukk/Yz/XY/J4G6BhlOQOVGZO06UwIJQK7v1P85z32xm2PI2\nZgY+o6JLMqZsG49O+4A5a9Zg3R7HG4/cw7pjk0Mnq1E06cLQ34mcr3V2nrYHsvpUoDOogbPoa5tR\nO4LcNnsnQ6ZXsvqT69hQPpXxw/aRO/AIBftSCRZ7oeel0TEa/BhxIqz+juy8UYjJii29dF46by15\ngQM/uYEtEDcWy7oLWaZBv4roKyw0VuvQpnpxlyoREufD8iT+Km6fFyNOUiNqCSYFGXLPBmqki7NA\nO8DpACkLJcyvGfCgT3UTdKrwt2mZ1e8LbrR9wGf2G/ks+TKsH6YpOFYdDTnXKDb5wkLo6OxrUACv\nD3AaBcR1oWtfHEYTwYnDE7GcK8dQ7+bQyX70UBUQoanCf6aEb56fhHzyW0pXP0u3Lwr5YfRqZobN\nIooa0nvWUXLCgcOToDj+vVHKzpAwFOAGxZeRQmWRlYenvAYEMUU6+bb/GW6/ZQ35i3rg/7EAHGno\nswL4bUGCThXGTCea5HJodeNpTMDrDoImioigh/T4CnT15+jwRlKROQK5WEUvTnIi5IKYmb+E3P4/\nEK/dhD1aZlXLOH5xZWEqSyXOIuBOTSY6NYwEMY4gQVQEsRNOa3o8rUMyeOOJpyEhCE2d1Tt0QB9y\n+1fxj2+20OfNGrQVARZct5AdjclQawW7jwTDVoaaNiNpDbSXd6WoJQHTW1djmxEP9mbMiVXctfYo\nz8X95zsy/1YAD5+8l6JsUE02EZXmxnEiDGmXB1Hvo8GfxArveH78eigx8ztIebOVST9tYt4TC9i5\nXoE2wexmbMdh2oJGejX+g5c3fsftD61BN9iH7vbjvBy8i4BDgwM9TZhpQY2ksWMMT8OenKTQtrmV\nAW2QnIxz/MwbhXPQ7FaGx+9JTNszE3DYInijfQGFW9sh8Sy49WBzAHpobuHSjL5WlG1rJhcm6tUA\n3Dx5JZdO2JBNnjKUpeLiu3eGWQQ4X3vuYhEEMBrJSDGy+NcNGBOdys5cBBGJxiVpFKZl0OoxsrLX\nrSyNug/yysBfCKoY0KWAlI1OcpCZVIXcrP5/2Hvv6CirLe7/80yfyWQmvZJCCIQSCL0jVRRFRQQR\nEa4C9oLlWrCLYhfB3hBEUVFQEEGk994DCaSR3ttken3eP86EBPXe9977e6+/dddyr5XlEJ88z5kz\nZ/bZZ+/v/n5pcfZCpFOEvfTKMySmCfx0+uIKzCdsnP4QShbAKMUSRiqX4FwDibvghgg4OzsE49cd\nUaRqLhmqGi+gxlZiQu3R0eDvhFdRS9sZxyUCUg3C+ckyLfvDadkVjnlIEylPFpD3YCaucj2SUkaX\n4kB2S7gv6P+hDzfGy0Rp7DgkA/WOKAK1HsR2Dkr8eCOUnJnWi0HlJ2hw6uD91r9UCueLifjUGJrq\nCnHJEDu1AtsZEw0bzRxZEcLJxpvYzAjYkgPxaeD1Q70TlAqkGB36Cak4NhQBBeDMEsyW+IHWk19r\nV6g4UkREtxClKeOKK4/w0KhviX2niroWyK2AIT20nE3fzIJ5D/LriARQQP6tmRAFkffVo8bLw+9/\nRG35BA439CIQ2hn/ORVU1IFXhdj5WuGLrWRNopjgtOp576459Diai07lokN6M02+LqS+VkjFuyFY\nD5vpP2E/YVMbsIcZsX5cSfHZdLzRWUxxruLJ8S/R4eMKDlVkcvsnI9GMbuFdxUKGVc4GoIvpNO8u\n/gZtjMAoTb2vjvzcHpR81Eh4kh3X9QO5Mn8NY2rzWVF9F744DRqrm2RrMR3GlbCjcjwhyhr0hyy4\nZSfhRSpaPGV8uOh5wlCgwSPWfJkfydSXqLQaTGVnuPH6rbgTbSxZMopxawpJGKcnUGODyEhw20Ah\no8j7/5+I6v+F/akO/HnzNJZ8e5CDWTr6LMph5xPDqdOexlxdyKKsJ/jC0hXOVNKwPAnn2gzsLXsJ\nARIlwQWlAvyygkadkZt/kpjw8Fbq7eFwFB5xTiPfGg3EMIcvOMEEjhMLr3kgph5i46GxQnBqduhL\nluMAz5VNJxtBet+h3Tg1eqh2GVmx/CW2rJ5Ky9e7oF4tMIsKDyiVXERm+NvnYFs76c4CnYG+XApd\nU/3mdS7CkbXPySsRKY1YxLG4GuQzSDhRxyiCUj3g6dOH9as74Ygx4GnWoNDIF6NSs9RI1fMXqIxv\nBmUuhpbTqNON+Kv1hGCCzrFgs9HFsY9Nbz6I/1X4+eiln5VyIrQyc3hoOxjHA4khoJCgoEVoSJQ2\ngj/Pjn1qERFb0vGG/XZZucmfmQkqEzn8TIL/GTze4Btpvzk1lYrIMaEXqMDvUSJF++n64Wly5vRG\nafaR9cNhPKjJmdAXd0kIss9Ka7JcHwmhkpNxj7m4I+sQu0LG8NrWv+F4Jh8CP198jIIAUpzM4Tey\nsNRr2jlwE6AgKrae19Y+z5KHO3DszBBKFmagipTRqnLYw0h8ahv4y0HdI0id0gylR5A0GkL79qXP\nhwc5cKugmfBsVoJXIZy83DqbZwElpjCJEOqZfds67kv9jsjvHLScgqO5emo1YQT0TtYUJDCn92a4\n0SjIvltNAqVTRgrCLg0RFpJuKsBaZ8bt0aH0qnHUhOBWNILHIC7ChVoTQUS0nQAKTBE2vjwpOFV9\nKFmyfT23fP43vBoHskciUt/AbS99wHl1Br/eeg2z+3yGpSGU8qRUPjA+jLQY3GjwpEcQLRUwmKcZ\nVvkArZvlrpse4KepLQSUkRgbLbwqvUS5OZOHP/6IWVFrMD1QhWezH8kF4T4ry1++g76bDnH/3NfI\nG9wd16c2Lr/qLgYf6MZ5b1dmjlnNhpIA5WOgW1/QRQMyGK9sxKC18tCuZ5javJT69+DbR+cQ9fxo\n9v+9E7uzDbj/fhRDggZzxc8orBKLh8/in7Wo/6/Yn+rATzz/GWcnWFFszuT7+69l0qJN1NwdhvJg\nPJ63t4NtAHS5FRQw2foxj7geoSZEQYQiQLxBqKMUE07ndY/AuuEs4mpEU0QA+AVIQGeoYLlnPH6f\nHrGQIgCN+KLpFeBQolT68OhdFKugY/vgVgarL4Qe431M3nI7FTdNhA4mCKSDogI6pUNUApQUC8l2\npQJKSkABkkZGqfCLZ5EAAT8Ku+1fALT91uKCP+1UZZ1N6AIb6Lk+GqXBT8Cr4OzYvkSvaKTsVh19\nn85B3+SCjuLyl6ruJ6V5CxGxIF/WhxtKjzEgcSfVg7py2+2LkIS6GHZg9RRxXkj6JyNSSEFwSHCD\nqAgyA+gkiDVAhB5O14OiwEHP+Xmcersrft0f4QBBoQ/w0ncLkAu2IE4Yv8fPAyCB7aiJ/LmZZHx5\nmt7rD+EzKPAEI/fuvxwnp9tMXHlfotZVoZE9TP7Iy6Oa9YS8eo7drlHsGDAK32kdxnA7UqMnOGY/\nXr8KKchb7bP9Dk/Kqi3XYcz0IZMKtSdBMtHpmSaSppdQvCmdopcVBAqSIT4TSSujiDdD1AA09iN0\n/fQ0NoORfj/sw29XcvyGYfjsEXC8ERxe4CgavQq1X83TCz5jrnc9pUuc7CuHjHTI6KOiPPMa7hz6\nPv07rSNr7AL47DNIuS+IkQ9+ZWWI/akZ920y7mgNU5ZZ+GB1DOp+tdyR/wIJ29eyotcjbI6Yg/Jg\nNiqXEokGsnr/yOfbPqdFEY0scXE+lU6Rl5KaPRTe1h1sEl9cfx2T4n7i0X6vYMPIwa0qGhacIXVM\nCYwVcK5D/Qdyy+OfE6OuZeOBbyCtO8iiQWbvc/2Zpd7L2PmrGDhjPgpdCE8s/JSB3Q+Tq0onfb6a\nOEUJzp8DjF2xidErNiEjQhiVX0Zpl9GXebF2OE1HTnNCEuAFK3DgOAwbDHqXjoBLSdqT54kvqSbk\nE9Bp1aRo/QxSfUbvm34hf979bDowgik3reLFpmeIWWqjZvEi4lv+XP3K/4b9qQ78zb/dy9Mn38f8\nVDajjNnIvaDm7jLmZE9mN+JY2NrMUf+3RPJfGEN8US3dPzpJ0wqwJxs49P5wSLsB4bCvRUQWO4Aw\nJCmSN9evYdXiruxZH4lIvLR7i+HJoEtm1MjNfDbnTlJf5mJxSpYl3H4NptVH8K77EfCAYzdEjxfs\nhPbu4jRqAcJShdKaVoaEeOgFMXdU0btXWwpCW1xLRtpVvHmR6a7N5N+mRC4xCSS5nealCmQdzgIH\nJ68aTOaOI6j9XrIPRbFyj5e5m5rRt/b3tMvQ1AFV56FxuoXYTh5uWbAR7Q8bceoF0AWEP2n5F1S0\nu0aKOlbdb8Qa4kKgUzi4nQJXkQNcVuqi7z05HFmaiUdqpzyhkyEAXb7KpmJpKtaG1mN96/9HZKJa\nd7xgWsWRbeRE76FoEt1k7jhyScCekXOKcz1mMuOLZTxV8TquZ0uIroRoA0gv7+TYI33o328XT254\nmfDgEet0VA8ePrKAbUOECK7IPX0VnHkZmVLi19TijjMBo4AWkGzMnvcurkYtroe0KBoTyXtLiHqE\nD62n++KTeE9rOTTjSk5d5aLHzqO4PDpODhiC7JOCaegIJKkGUPDIt+u4e/svVD5VyQGriPv7pkHH\ndPjy3OXMOjUDli9jJx3ZyWLwXYDCjaKJqPtV4r9tBw8AunOWmB8/Y+zXJ7iRYygB+/givK/n0/er\nA0yetRiTGoznYH0c3DOoGq9ZxaE1Iq0zYHo2Ko8f/Z53IfZJ0Cfw/TuQnildrPEWPnkTtfpEwi8c\npqbPHuL2NOIp0WH5Ipq4uVWgUiF1kJGDdO5jb9yHNlF8oFt3vsvSjffwku9Z5k97kkcnvoXiDj+B\n+Qo6SIXYfry0Rt3lSC5fDJ4LwVVyQYLBifBNJSQERPCRfVDixW3LqByVgR4HfpTIwLfz/8ZXz81B\nIQfoNVnJ1OVvUvbwTubd8SUH1XBdHChN0iUx0v+q/akOvBfZaIwekYqT4NqPp7OjYgYuqhDQKy46\nITVejNgoSe1A/l3pXOVZTcm7CTza6ylEgVCLUJycEnydwHvbP+LGjVv59VAsJA4BcyeoCQoYBJ+J\nBnbtGMPMom9Y+J3YgWtKI5nbcyEg4w0cRETAyYALzuyDlMFgaCNSSp5XSNxNFVz+7g8MemYZ/jMw\n/GcZa7P/og91BgLsltyUqruQ7xEAsqsHgEELo0/+wHGbh7b0igyYICkJOiRxzdXrmHf/G8hIGE/Z\nsM+zM+7sI3gqtZzqOwRJHeCWqg1M7DSZ1uPqby0EiDPDxBXvk2uTyEcA/066IK5CXKNXQd84OP5P\nnHj3KFDYwexqbbS/1FwOaGkMprcssGc/jBjmof+cMxz9vLUsrKP32sOQGELB7ZnYS0KDc9zIJdpr\nQYu6soa0587TciSMcw/0ggB4KrWcGdOfzB1tuZ7z47NwO/VkaPIIzbWR2l206RcVglYJb6x4H4dN\nwmMX4z44dSy3Tf2M2pmJMEuGFZc2GhUPfZShg4/x6acmLr+m7fezX/6IiapdbOxwJXZCMM1oIFWZ\nT/ErnWnaHAXdJJ6Lf4jPlj3Igze9yIN8jqQJ0OvwQTR4OTVrEJ5+Wt6790kyEs6Q+X4hlnWNeG2X\nnj+WJs7h/rR3QKsB25WQ04gITvogPDZc3MHcUDYpBnNUY7s79OU5hmC47FNucx/kynfWM/qTX8Hr\nE5JrSnDrIMQJ6EDt9jHkRkFErvT6g7duUwzRAHcdfpJj10YR83ouZcrBVC1LpueUM1gwo+ojc3qg\nFl5ZAXN7k+gr5ZOKaxjKXQBsOQhP3H+W0qmd6fzJGa4t/4mGx4/BuQaWbHkYr1fD1XdtJTBToquy\nAOrBnQ2WBi4xP1Akg6ISOgTaKkbz2E723GG865hBzrs9+WzJPGS1CiSY9M53xBVX8PNbU8hJUQJF\nRGkgIwZqE6OY8+1bkFr0u7X3v2Z/qgMPxcqxlzJxBnQsmNiDI5VRuAOFiAWqhcbz0CwKPlsWh6Ju\nvpl7lqzkbJmZcSce5LbjDez+eS53zXqd1ZbpqFbBB28+wUy9izUtCsKnWbnJ8Rr7HGpI9IrjpqSA\n+kJR+FMboKYAn5zIoby+TOnyCQB+n5IWr5k29rpWJiIN+K1QegQ69ANjNE9WP86Ux1egeMGPwepA\n77djs0CTB5L00BxcfEZgIqDxWslAgMhOnhK5/JXq6VQpZWz+ANEKOCUridNJpDWqOFKrpCnHifOj\nFmKiwX7FMG6+fRM8GAoy+G1KkJQcvnYkrxxMJjtCQ58nz6GvFD3f989+lUEnd6MG1Faw2TzoZbDL\nUO2ACFkopQHYvZDXCH3i4MQfOPHuURCmgxa70LlsQHDzXVLslUVqRQq+9vnBHanh2Js9aU3K33+m\niY83ZmH90Yy3QoOsl6BzFygogAYBQ5xdsYhb695gz4zxfPf03fiNEn590FkpADUE7JcS13RemU3e\nzT0xKmyoAj4UCii0QK0Nks2g83rwe8Arg8sO9hY/EWPqyVp8gHunPcqFDnrKNlzP61kCiRJqcBJx\nXz3KDX56zL+A6YwdCKGHNo+z13dhw56J1B1MIGZwBQGN4NG5IvJXPjXPxL/JwsJr5uHQ6wigFAIM\nRj8BJNafHoR/SwN5axqpV3rJb/GjsMt8+ep8NtXP4p7ST3gk4W08zRr0Y+z0fOYormIDp99Kge+E\ner0qIoysU15Q7+fkpEH4jSqUOh89ni5AXSjChogDAWa+VsHloZWEnAPCfdg3+ZCBo1cOZtutV3HH\nzc8itWusVTraTkGD9j9CfuT9oBVoKAlw+mPwOCKoeiuR+IdkXlj3JHfv/wzzJxYsmUYU6gCOQz7y\nx9UT85lMSMB68X7eU8Ow/hJJ16XZaNPtVCzviK/6cvAdxXOZgs/W3M5Xr05G6Wrh8ht2MvODLTR7\nzQQqFFy/dB3NH7eNMwD4gs57+aHX2DbjWspdaax8/hZCl65n5U8Tqe6ayIqFt+OXlFz58U8oXV46\n/pDH9Xe+zWqG8DfvOl40PcSt76+mcGgK8L/PSPgfO/Da2lr69evHtm3bUCgU/5KosYSMJ0zN0xMf\n5OSJEjz+FtoiMTsE9BDeASQ9rno7tqZa1PjwepVYPSpkrYOb3xuNfe0hUhY2IVXCIw83MXvqtxy9\npzvSsXrqPZW4kbjoZqLSRXOGXg22BvAqGDBuHw+/sxYZP6X5STxx3bPBEbZLWwBiuYSCLyiY4AOz\nt5lYSzWKRrHAq4AKGdJk0OohKk7QdDfXi4yALItswBAgMkxEqxpvPSY5qIMYEOVKlRu0MnSRocoN\nOovQL/SXq6j1x4s9Rds2LG9fDfakGLQGFydf7EavBedZFnobgZZGtA63OI4GROTfIN4Ffvk3fFCy\ncOLn2hHytbeiZshox+AaQBD0dQki71QK2Dd+BDv7DmDaA4sAsNth/1FQRbRlO0YmHOFTGyS9WEjl\ni6k4iwxgUINCATRyT/3T3CFvxemvp8bgw2o2EtZKDNW2eC6x81Oy8NuUeKq0It3kAHyQlCXqha1H\nhV9nT+SCMZb0k3m8v/ghlFofpkg7/dwVDAwo2D31K+AOcXEoWH+MQrYoObXHxz2fLOaVvc3oIr0s\nevUeDi23E3b/MRgcR/iEejpVbWTM02/g0NfjHd6Zd+fdzt3z3r6YIgug5K3Bc8kozeOo10e6TfQB\nycCyN57i0NyrsX8Szu41JkaY4KZB36KOcHLwdC+uvesdTjSqGaq2s9GrppcVRs+SqamG5mIDLUjk\nXl6Mq8HF0K4yZRVwReVLSIt9VEnNmNVg8rZNXea+05hyLnA6AKF2OHAYhgxsm8+ji3pSMkaDTx0C\nCiXpL+VS3vVmat/pDatKiJpeTeQtMqHNLURWNYAVjm7L4tVPX0D2+LAVFHJmW38OtvuMLnvzJNok\nD0QHQA2Zjx7nfEJPGj+yweHz2Px9sTlTgRbWfjeVnbuvIoCM7PXyQtNEzJ1PMOErA998P4v4mTkU\nX9sTuexXmmZEYisrIxCoJKosn0GdXHSLnM970n3sMI/gmvd+IKyxmW+evQ23XkfRng/50nG4AAAg\nAElEQVRpIpTGUylMvfVbyqftw19Z/MeL/n/M/iMH7vV6ufPOOwkJCUGWZR5++OF/TdQYUOGlpige\nj6uVJag18ekHGqAllys5wwTWwS9O6gdX0TUsn8+zjtNys4svZQP+8gBfPwDT+8BN381k/+YqnPmh\nyN6BiKOmC2ryhSakKQ5UWgH2kCRGTTjJwts+ode7F0ABLoeWYeOPceyRTB684qVLB9u1K5RqwbEF\nqg/yd2kjU/TriI4VlNuFdhFZGwCLWzi8TuGX3iKAAOddHg3uFtD625x6qzM1BC8sRaTYW0sBOxsH\n8vkvc0D1Fbi6QVI/lKE+erx3lAHXP0If1xn0IaJjVFfjpvnGEGLjrUQsBy6AwypAHW7+YakQWQbn\n71j9hLl8Qqc1NExcd+TBWRydchl6BYxZ+SuD3v2e7VIkxR0EPEIJROmga6wX5UPnkGWJ7Lc6M/CJ\nU2jWfkHllptx12rFm3PAZc8WUL2tiqi1VSSH1FMqgQsFTTujsB8MI+6+MlJeyKfm0w6kv5aD264l\nb3ovOn+VTdrz53nw6meIqm1CMaOI3AXRLDv7GNl7k3DZvSi8xWgcduo2jmWsNo9rK9bw9JQn8QN+\nm4NjfkioC6CrbJP/O/l0d5xz1zKs3oLaB1k/HccxJ4H6IeFc3WUrqVclscU1kYrzCURnVBIdWUfX\nkHKSLoOCsVqq0hIJq6rn5Sse5IWfX+WV0feSfuw8Sp+fCNqAg9vemMXuCzdSOj2d4aUfcBufETk5\nipahGq7Z+CN9128jqrCMLoBagn5KmBgGgX2g84i93I/gOlMCRdngckOqrxq5CpJCoUESYVFKqIC2\n660OOlkdhAMNAXA3inSXJIlioCNRR0CpgvJjdFoejmmsl5z3hvKA7gMOzenG0XF9adqso/ZEAnWj\nI/heNYHFT0+ixm4nLTOCh1b8wDmK2qvzcf2PN1AXso7GDT4UakF25qzPhUqH4A6ihFaIo60JbE3Q\nyqVQhQu1I5riexTU1h2kbJcdR00LBDxQUIloUpK474MRmHz9QAUVm5006Y9QX65FEUikdkcB0Mqe\nUUPAdgGXWw0FDbSlpP637T9y4I8++ih33303r7zyCsC/LGqsxc2LN99LTWk1kIGoChYjMNORgBu8\nLZwkmuRrRnLFAweIzJNJya1j3+XpvP1JKuFaFX45kfKaLJY172JXXTq+QASiGFVMKxQMjx187kue\n34X9TC1+h/6bS3BrtRTOFl1wBo2dznGFXFIFTMqAsHD+Xj6PFHaTqPCj8lVSZWvGoRRRtgOx/agR\nx7u6INVKsrHtNhICUOhsuQhz/ocWGRy9Gjg2bgDbHr8HX24KLEqAEBPqSA9d3jyLroedXlWHCSvy\noW1XJ0z+sQIDLtSAww1e9x8/51+1TuEQsMN7z93B6f6ZlHRJ5fzOTJQGH/lp6RTp4on0lZOPClVw\n/F4lhOllfOUusp/MwKvQMHPNmzSUNOOSdaAPblsBsKdFcE/yUa4xnMZ5CELqoLsRDN3tmOJacJfo\nqfs6Hm+DhrK30vD7FNiyTRTc1gOFJPORYj7aMA+Oc3XIL6opKsvA0tA6+U7w50FBC04pivPee5Dr\nAyT1beHmO4+R/MAFLL/hFHd21CLXN7LQN5d3E5YSX1fJ42/fRLKmgn5jzhDa0UHuvpFcqNJChnCi\nFgvUVEDH5mKeffwVVG4vnY+fQw4oyDicg9Ln5xQX2Rj44o2n2F54MxX70nC7dZxqmMDJqaUkz9lF\nnUkDcTKmTs0YPwX7WYgNhQFNILeA19NGB5ON2Oj1iGACIM0E3947h0+uGEzmF2to2WSiZcoIrjN8\njXavnQPXjeDGx96nEREUe5vBqlHy8oIH+fnmkVjqqsBlp+bLbtRtNOEoCCF5UCnXJa/j47Db2JE+\nkpqcBvKW2BgfuZe6GD/PO2diuCGSrD5lqOsNLJq2BlaJOPyYJR4sdSLKuWjtaza/r3+0N68Tao4F\ngAocpSDoei+13MpwLnLjVwJYsLceVav+gTYv0F7A+H/Z/m0Hvnz5cqKjoxk/fjyvvPIKsiwjt/NK\n/0zUWImf7L0SLnsSInVSjOCCUCBKbDKgo8t1Zxn0fDmm3lqkfpE01upobgrhmNwVXEmIeDKV/BoL\nbdwcEiJD20ocHbjk2eMa13FV7UvofYWcqgddikRE/2aKb02gudbMa7feR1sKpRAM/Vhw4SGudn1N\normJcD3kWECbCDFxl9xarNHzwolbf4MblBCOzfcvrJf2PYEZeaWMOn6ImrldSOvmABwo9AH0/a3I\nbgVa4EQ29O0leK4AwgpaxE084PNBiV98XX7boPTPrEsE2Jvh/cUP4+0UTeXrSRzbN5DGC5Eggeu8\nAclZQq3TTceR4Ziu82PfZ0KBqBr4AI9ZTe5DnWjqY0aFl13Nw3EFtl0CM5g//RVGB7bh23SGQFMT\nPr3gcopRuwmLaUIb48J6IAxHrhEksBwIv8iQaz0qNFePNBrApwT/WDje2vTUqsBjAMLBV00VsVQF\ncfWh5Q0U/DCYCK5EHXOaGa9XwK2tn1WAxz45jtdhIPVbF+owaB4YS191HuH1FvxRKvQnjoArFEaZ\nUQY/17py8JQm8Hr6U0SuKcbj1VFwf3duj/6e96tn0hSwEQN8cvlrbDl3Mw2n4gl4lCTdUkzXU2vp\ncm4P2Qu7s7x6Kj5U6JqshFaU4/BDqAM8sgeTfJxl167F8jMQEN+aGNqm9Kvk+ZQ7feRtTaTyfDyH\ny+7CGzBi26Wl/vIAXd+sZG/aSFr8MlnzP0Cjg259wFmi4KOsYRyrHYXXfwSwY9teDko1xHTm4HYY\n5M0lclgD3iQlfqMb3xkP6UNK6D87FVNSKrj9qPBhdteQd6J9UfUv+2/bv+3Aly1bhiRJbN26lZMn\nT/K3v/2NunbseP9M1HjZq9VYLd8gXNo1iKSuEuLiwdQR6mDkyH3Memo7AzmLdoOHyqtjOVXVlZUv\njUXs2GEIjIUNQbdq5Pe8z0BEKoSIBO7lLWu5sW4h0c6TguK/DpwtXpxv1iIfdJOQ1oH9fcbBhtbF\n1wzVx9lnC6H7UxmsXm+iKk+PpWt/NLIJfYUzeJ0X8JDSq5TBTwh2M1W9A+XWIkKHgPXHf3d22yym\ntIar3/8Rv6RgzaM3IwU3JK3NxR33LMLn91NTC/7AH/xxHOit4CkTjI/GP7jkt+ZXqfjoo5fRzo/C\nHS6xb7cZ+3E11rIovMdsINnaptndDG4P3sHg0Flo+OEk1fEi/1y6DwI6BQ0DwlHhCwpitPKJB80H\nxr0HyTq0jaIT4Ilq65JX4UeNF8dZIzWfJqJNdBF3TxkEhKix0heg6MUMZL8EcbFQvAsCOoKVBC5d\nC61QxVYVBB3W2r4crg0HBqBzXEbzpjLgAgCdPigj/AEnnlAtxl1uXlc/xoET4xiRcAT0Atop1dfS\n8osXfacYIhArsM4F/mJYY43ArBtLwKPAtt/MDc/+TORXHgZ5YcGgl9lwqhOWA1qQlNxi/Zgx2zfi\nqjuBoaSMfVWj2OseA8VOLumadAH40fqHoi3shUs+zU3vN7DCPYXAqyYUHsCewzHrcGqdKjjihiMB\nLiRkiKJ9i4WqxM50TLGSX9CdyFHlTALcStClGnmky3s0KCIJROihUy8IuKD0BNh8ICfC1VEst01n\n/XOJlCd5GKeNptto2F+WxJK94/Ckp6JtzkF3zsPHZTMg75/RHf9l/5oV818TNd61q617afTo0Xz0\n0Uc8+uij/5Ko8Ywnktn2zZU4WjoiuCGaxY/eDBExXDF+A7fM/JqO/QtxX9Dg9yspOJ3Ksueu4sAG\nLZdgAYF/nNmVRPI3yBUd4zpJvPMokdGQnCwa55pKwFjqw/F5Aw0pKhh4AMYOgu0BkA1gqeFXZmA7\n15tzdUU02N3QeB3YEqDBinBKPsBHoqaBo8cLSO5SxrTbf+JMXw0qtZdkfyG2n/7dGW6zmNJq+m0+\nzOpHZ1x0S36VisI+XUj9egutJ4biaYl4wjV0WF+FoUZ4bHUYmKvB7vqHt0ejBGNyGK/d+QjWtyL4\ntWQGTms5sioAP1QHuX6tiDLopZI4w8YWcdWNRyktkyiwdOP1bq8TV1NHvUvH9wdVVD8Qj1rl5d43\nlnHXa1/w0ePhIuvog9sa38VUmE2BUjSyaoO49D3Dh/HrxImAgA227AknpLeVyEltau2KQIBUrwIC\nUPZlGr5yH3hOMPR+NeNacgjd2kBZJWyVryKHGER9xYUg5opDnPQAQnDZQtjzrZNWBx69qxHLHREQ\nCqVTEvjxyCSaCMPgd6C0ykSfaCTysBVnXij2k6FU3NyNQ3OvIeXIVuxjwvA/VUxjzXiUoX7Snsgl\ndscX6KN8dAQOlUdgqYyHpkqQ1UTc0EDvM8eoP1uBpIOEgRb6mzfiea+R01yJoGQw0sr46Pab+OJs\nClBCxUkrR3wq3O4E8IWCnApNMiIVqQbOg7VS1IA6awhJljDl5VP/eilnUoawMnw+l7lfweXV8WXG\nLCIX1hJoUggyLh1QWQyRYWinqzhqvJrq7VounK0DXRW6q2zkJfRjQfY1bGlOIObwbi7rspLK7nHs\nfHsYorvx96mOv+zfsVT+a6LGvzVJknjrrbe4/fbb/6+ixl/+eBt2hxORFW5HAuWDkXVrmVzxFr32\nnUWhjKa+Xzh5llRWvng9+9Z2AQ6BOh5i0qHiH8AmLppGIE6kfNAZcQ324hmUjhQRwB4fIOdQAhve\nTMccqKbaG0VjQTyUHIN+nRGdm82IL4+Wfd8NQURELihxIdI0rVhZsZFUnDejUSoZMPgYktlP9Zgo\n8EDN32MZ4N+PbSP/V/KlIxOGoHZ76L39GOcHdufAtSMAqO6YgKdKS8uWMGJmVeLRadjwwA30cft4\n4MLnVA6NpHJSAl6TCp9Rha7WTcyxeowtDvQm0P2DWk0tJjbK/dH7Y/jeOw9naCisAuLqobw0GNW2\nbhui5DppzH46N51DOgOZnvOkbD1HXnYWdf4urK+eAIXlYm5yJcjVoNZ6ufu1L2iqCRN7QUMRmEO4\nwroWg1fkoNs3b5zOzGT/kEHocr00ro8GFXhqtdSuSCBmlkikBhQKom4SHC0VK1JEUYsahk0qoX9s\nOVlxJ9jiymRbRQjsUUONOOXFcYZo/GQzud0T/bQRBsAPN13LyLpDxG2rJ+BWMvfsZ6y7cwJh1hbU\nTT527hzE0QNdwdWMfb+dM0P60vJ3iaTN3agLdAZJQhXuI35OKd4aDSEtAkn0RuFY6orKIGQAN05b\nx7GdXdhck0mj8zqGTtiJAiWnU+LRdJawhidAU2uBzwTEExqu5OZHVhDwK1m6YAZ7P1UAPwU/Hxtt\nX+PW7mM/WJsBH7Qko611YVKU4dlyjuJul3Fy/mXcmv0GxWNjkJfupL5+lMC3AvOuXMLeq9MIXX2I\nAdZKqnb5iT4royaGSJeFjie2kn3eT0pDHk9wkNAmBwPLD9JS0olnlG9jC1Txtpz1zxf7X/b/zP4/\nOfAdO3ZcfP2viBqv+uoWsH/e7jfBfGVLNZmeb4ku3IvqDCRU+zl3Kp1vNk9i9+rBCIdqAClMKNMk\nJEBl5R8/BLgYoVstYHVR4OrFWlUkyhYZRYtMYUUCO31J4DuD6D+PAO85OFiBIBzaB+i4lqV0kCSc\nchWnJw8n+twWpJwmvOjQAWZJxDv1MmQZSrhV2ob8rYTXrKJ8QhxlQ5Lo8FgqsSUlvGN6AOPAZhTa\nP8p5wKGrh6Fxuckb0J3cwT04MOkyQMZToaP2k0Qsm8KRXQoUugBRM6rYGPU4SVHRDJmyA02IGyV+\n6kaLYo4rSYOuj4e6SiWGvU1EnG/GkhrKUUU3jm7IAJzU4uCHwBAo7wCLakBZC3FpEN0J3FpQ+EiY\nUIYi0k+/NfuJKahgtGI36VKO2HqPQ7avE7nxIyGsK2i9iGhdi2jKUgNCam3Vouuwt+wBSiGkM1UI\ntuzWnHl7kwBXvp7mrVGgAm+9hoZVcRcdOIA/eBKYWfUh4ZqdKNV2eqyuQTU8hB1XXs6q0psptI0g\nOWQ9Ck7j6pPOpH67GH7sGCfOVmL3Q64/lMPmAQycVcmud8V9baUKKg/XEXPAweFpNzDy9K8cbMjC\no1ODBFubRrCnuTNQguNIPZZtaYTeLhFV5uNsrgPz37ugj6pCdkpUfZrC8Icl3rfMY+HeTlg8Zkbd\ntJsH+37Pi7bZWH8FZ10dB18ay7mWeM7ujiQ8PBX3jWmw2k18Qz0j2Ew1u4ggAaXKjyT5adOc64EI\nMqoRiRwVbVo/arKG5zGkYy41miwkr4z2bDljJ+ey90gkhjA9mdcq2Xx5DCwLgBLibylj3NK1TKp+\nmb49hhJqP0zvlZXUBgQvY7Emi2TZS9yFHKwaGKc7i8Ilnh5WDanf5jLBmEtpi4G3+cuB/1n2pzby\nUAWEZoK3PthNEgvo6TvgEN28BSRVQJGyOzs3JLPnq0HsrByOiHibARN43FBeCB16INIp2t8/IyIC\nHA5whdHK0X1qSzSntnRH5N5bzR68hxtjaDmTbzyP8ZfTQBoF1UdJ0Zm5U7GCdKkRmww7EmpQlRUg\nU4CEiHVS1IJeJcclWpTl50Crg4QeahSBAEn+KmwY2RpyPS+bb8CU5EL1h7KWMhREgSacLT2vEUNb\nKXKu7iI99V/FggTVHycRNa0K/BJVbyXz3JUv8IP3MNGXgLegfmg4nqEavKiIHRNCybIu7G4awE5l\nd7bTEVFLKAZ0EIiHphwUksw09WYkpwwKUGohLaEARayP0YYNJFNE8dagPLAG4vQgj86kcNok4nea\n8blqqFusBp8W6lrZBjuhQGbinK24HcVs+SaDYbZVeH0VKGg7x6isYFSASQPOfAPeg4Y/EJsWpvAH\nGP/peqRAgFvKPiXdYEWlhqOfQ8pe2Do5ifRd50k4WUx31Qb0xvPURXZldEopoyrPM63sJQrDonh7\n/FVkGnIYP7iYXe+OAmDCC2s5hgudAb66chr5IR05c7on46N2E0hUIGNB1F8iwVOJ+2wUYR82MXfx\nInp17MDBWx5k3/Bozo7qh0bt5ugOeCZ1KtZoienjNnPboC303H2Ba2PziE08RljdEQ4fuAHZpSB1\n9wli5SNos6I4pzaSqNzJfZqt5DrB2RzO/mcfx+f309//BaEoSYuFigYI9xfRLHfEhZooyYdbBivV\nDDMfpXu8ku3ODlgqq9BVSITHmnBXOalY1RXXCyoSfq2DMDM0gibKzb2Nr+BaWkvv0LUXSYYNAZGE\nSpZOEYkonpokCNOAUwbZBRpJ6EqUBMDyH9L8/mX/mf25DtwDJF4G1j3grweM9B1Vw5wF+5l0soyq\nH5L4/NzN/Fh+GSJvWY+IKFoQUCEn+CQovkCb9mN780JivFCjrgJcakRU0krf6UIgrXWIVEknjGEn\nuebWHTz9/Fo6F5eDGjbUQZZa5IhD9GBWwMSlmzjsFE9tRXVoFEKPNxxw2SA3X9CDZyi8yC82crDf\nJHx7HdyXPQe/fA7HLxEEAem/n5jQMIiIBJ1JDDVAmxKNApRGH5HTakl8rBjZJxFxTR2NlmiiippR\nZfrxado8ngI/RYeSKM3vQAAFh+o7sf2b3oidoSz4/uMROWETcB4VLl4Pux9/nh/ZHxzlgtb7iaEk\nIFx/lBLqu3bkVO+eaHs5Se2Vj/eCFm9tV5p3G0HqAQGlkJwD7nljGQoC2I1Kblm6kg6RFYTrxCis\nDaCqh+qB3agdkIHnqJ7GtTEXHbgq3ItpdBuyQenzc8cDi1F7RezuDoMqL8gBUFbB9M+/5+qm77Hb\nwKuHEBN4jhViPQBSBCg00JCWxLGFs3jnmymceq2N4s8K9NNDyZThaKKU/DxvMhemZVDcrCWuyYE3\n9wJwBdAJnCew72iksjyFwC3xdHUYqfiulMBwBSghoIJcpYHAol3Q/X5uyZrLiPW5uGpgsu0j7BZR\nWZixcw16FVRowLsHQg8ITY96NWSYwOCEc4om3gt9gmYLfIHIjg4KhbNNorXcqQWrV7y2SVApg3oz\nnNtyNWdSkzBdJXNKN43V7wwnKraIq/ptwNpg5OieQbChHDL6UvJGOr9ahhBJDenRpzA5bZwdPJiy\n/FRK7CqSe+bTJaGU0EY7/rMtVFnBPDiBXM1QTh/RoUi0Ed77EGqXDlb/7pv/l/2X7M914PYaIYKg\nqAaM9GIDc4Z9T8+kOs5s78IH2Vmsq8lCONc6xFE8qHYMXIqnCOH35hS93AmJQAWdY84SF2dBX+pG\nX+YCbT2eQCn2qjD8pOEE4ky1zBn1MzWbFKRrockm2s2Lg0jI3rFg1PzBo4BGF+hUIhqxeURG1emA\nQ2dM7EiZzPthT8NpB4LmKYM/VuoFcIO1VhRzQ00XxX01sR6MvVvwNavwNmjo8JjgbpBUMimv5yEv\nkEg7UEZNmvkSBw5w/lg6qxZNoqIwHtGPWYZw1uGIgp6aEFMcfUcfQuE9TPTJOuJHytgqoakFdFqR\nFvW6hYIbwb9uzExjL+lsT76SXZljMWDDjQapY4CUeQUo1J3wu6NwHjYy0fMzCkkO8pMpuGPWWTw/\n24lRQVonUbws2A9UwKYJ4/i599VIy7lkf1OF+TANF2LRKo+XAev3IQXkiwG6rRmOtlsZXo/A6CuA\nRic4VBCrE7BKr0c0ruirLfT7ch9l87z8pM24+KyKCdFIp3W889RD1CfHIxEg5DIrlW+7ubC5FgdW\ngWOX1BCIBFUErnQn5V9mcKEhjZWHb0eldxI2ugHHiVCGLTej2uiDulp2v+ij3xhwecBxRDStuMWK\npU7dlb1kUImfZMmCWttIhVOL1y2+BUUo8cjhNPtKKCMEN9HkF7gAmRNAirYJORCBpncNHXUlmM87\nqU1OIaNrC2NHnGX38CvY/2ozqBpIT1bxxoDHKF6eyt3Tl8K3wfnuAM+VPAQ+C2+mfEnemSq+GHgL\npxWT8FqiueOh90md+D21mx34vqpG9ug40W0GiyIeRNMUYNLUH7nx0SZBz/uXA//T7M914DXHITkG\nEQk6GM0GTD/l4hwdxnulk1lf0wGxpMsQse4fwxH/2HyE9JNQdLFDuJo4fT23jfqSy8ftJmVXI9Fb\nmyBKHPHKd0NLpcjtUQrNk0CvAcZDZR4Yg5mWww2JtHjU6GXw9wilqawCQ5gbb4KI/OtLzXgqDRjU\ndso8raoEUKVO433dQnh5K23iDv/IPFyk3vM6RAOSJgQ0oE110OHuC/jdSvIf6o714KXalSlP5lHz\nsvdiw44QFRav+o09xYmdvagoTAzeX4FI/OiD85qBOTKHafN+QeXw0uXlPHbn9gE9nLdCqqEZrcqP\nza/F61EIWItSx8/jJ7NWmkbTD9GY324kZnYFqggvmlgPzgo9idOLUXdw0/RSHN93n8JhRS8CKJFR\nMGjPUaxKG5ZKqNaAySTgxioZlD4vzi0hNKyMbRuuDK4iPSVPdabjm+eJTyrn8anP/O78YkZE87IX\nbDYBnQRxxtD5QS+JjkZ7C4RFQWZNEQvmPYdWD2PCfyS6QpCauVZ25d6sAUT5TRiCsj9x95YxYH8L\ncYXQRVWHNfwo1R0SaEyKJFKCPrGnMGMhObKESWO/Z23tZNLfzKHsmXRqpWgCxELFIUIHerH3CiV8\nuIQRJfnfGyg5HQJ2JRvtt7IpZLZgbGwpBneOeEfN4YBLaKo2XgasDb7TYcF1Uys+S8thYCCPPbyG\ny5Wb8bxmYX2vK9gyezqojQwuPkyGdhuHddPAnNKGUDshJsnUv5lw32n0ikYukM7fdzwDNMLC85BU\nT6S5kYjDZzBk1vPdqYFUGwfT8xaJF1+ag6rUR5+hx3nCfjc1u5IIkS9VZfrL/rv25zpwyYS+kxN3\nRTgBVwFLAtNZ+FI4iWMLkL+rQOgDRvyDYbXmFdpHmj6INUN9A/ibiZ+nInRSEVKomttnLCDl6S0Y\nvwBTfw2lsQnU1YVBeAD1FS7Mpxsv1SeR4Lg3ifb1l4V7r+BCk0gDJDzRlfGbt9C1XyPq66MAiZ1f\n9mb9ko7gPB8cXwygBpcKcvIRzrvV3AgH/1v3E1T3QQlNFSL5HCeEdq1Hwyh8pisxcytQ6ALkz+zZ\n2hcMQOevsln7ocSIqaCPFcU9JQEkZFYtuo4d3w9BbJae38yp0DWsvBDHfWNeQ6SpfoPsaTyBiP/i\nAC0Ys0Af3xaxKZqxbFJg2ZRE6KAmwq62UPZSL7QpLjp9mEP6S9nUvCoEOECM7dRd3egt59J5Tz3n\njvgp/Qb0GYnU9TJz3pWKtdp0KWQ8+JF7qtQU3ZGI8W0r2dp+qGTI6nIS+bwfvKKcB+D7Tf9YQ0IU\njfFRmOuaiKmtQaMVUbgvKFLjDwV7u8aruMIalL4wPGcd6JLVKEKUxBdWYGxsITIljkfVp1FU72Tl\nyGmsf30OY05+yMx9n1CZn0RoZytJzeUUrelKz3mHyVx0jO+5EU/sVdCyg97LIzkgZRGW2EJ1bQwf\n7Evj+Ok0Libk7IcF42VYODQPRJQHhwB5aFR5dIsr51T5RAQTZxMCXpiLKMInkNKpmcSIWt778UbW\nnYiFExZYE4CwBApjbwTjYOCoAN3XI/CbNdVIqlhS5hVw2f0PkdrNyps131JT0wG8+YAZPCouL11I\nxxe/wKKMB0MaDXVdKdu2DX5ZQ8i4zhhnF/PTEA9dFxWReUP7OtNf9t+2P9WBa7v0I/3tPPIfuhzX\nFgXxITbMRjcaPKLhQ+UCZQAk/R/05vhFX7e7vQNvgRuGwZcrwNpAwSwPqSsHEjZJdzFZYAlEsK9/\nVz6pmcaqr8YBTrIuL+LOr3+m1RNKyPibJO4b/CyXPngHApblovLhQpZzH2yKg4U22rr+tIgIW6is\niExxq0kI5+xHYI2T+P2Uxwevc/E7TIYkinqWjZF0+jCXgtndcdfqL3Jm59/SkxBJc5HjX9Xu78Nj\nLISG27A21SKyre2/WD64WPhshUO2HzfBf58IvkcPNJ2DpgJ+nwbyYy3zYN0YAdKd3M0AACAASURB\nVAk23IVQMDsV0/pqvvgxkmHPBguVeDHhpWRKAsYKBz1kKxcM8Pzf72P/zKuxLQnH+W6ouL0/OE2t\nztztwHvyOMduGcpVcTvBB4ffGUn0k/mElNiRmgLURMfg1usIr6rHYHVgiQ7j2/l/48eZNzHi/R3M\nfP4zsf8H0+lejZtmfQkh7fYtw91NJJqTyL6/jk6/6DH01nP76++SVljAx689SPfDOYz/4mc8ylCa\na9Wcyzaw4z4bISPq0f7QEaO/GZqakJFoIoyT9MY80Y7iowyKinuw5PGZPLR4GauWTOb4Jh2aWD8q\nsxl1gxV/AAJ9NJilUvTbcvDSCQ8nMUr7iTWqWDFjLsNf30hTuoaQIgMafzZ6yrDTgkQTz/79G3qm\n1bLV0geIA5UefA6oPgxlkUAI+iglCeoK2AhEWWHDCuRuj5E9tT/eNUsxhDqwrOgGHzQG0ZVaqCmk\nAz4ghaKGWJodoexaPZRdq1OAbHwOH44yHT46UWFSUXJXFiznL/uT7E914B3XHQOlEblewpw6lDde\nmUWPrPN4m/Qo3D6IyoSoXsIn/hFaw+FEmXuSMFMjDbV6wCcQf4EI4fTlBoof6USqzovVZcRJKEsK\n72LdI7fS1m4fxqktHbgnYwR/DGJrPyWtpNCHEU6wGpGCqEFQT5kRUXYcwtvk0SZSoApem4UIefL/\n4A2pgI6EmHz4/Tm47G0s/QptAGWoj9B+zXR+MwcfSnp8fYLs6f1BBm+DBpXRy/WzZSyR0u+YHea+\nuBKXQ8uqRT0Rm5CSNifeKgln47eUA5daH4QTbwWTRxLkNQz+tFZZveCwQ8FOQIaAhMdtoGz7fBrq\nNxMZU4+kEJtlz4XnMeY78EWrMF+rwZCsIFArE/BIbdKiv50igww+J5TsDP5SzcAxm/m89D5G/7IH\n3UctvPLCs5wcNJD77n2Ly7ZuZ+WLs9lw5yQaP43mw88f5cPkR0XbarC5q0d6DseXDqJ+gfqiwxlw\n9CFWl37AI+s+hGg34MDwFCx//UF2my8nNbeYn+ZP4UuG0fBEKSOGqUkOj2J1wVDOL3mQO2c8T8jG\n5fD8cADsGLh/6UCSbVbmX7WNSr2VcGUpWmwYwlRkPdtAh8lNxLz5I1aXAUdKAjc8/haXKaFYFpWT\nGzRQ2gyrXoPFmlF8svMHxvQYSIdmGyMUsE0WKSjd3aLS4TY1oghREYjsAkk9oKEWLhT8H/beOzyq\ncuv//uzpSSZlUkkCSQhJIKGF0IvSBQRF7AV7wYKNYxePvbfDsetBxYIIiKJIR3oJLUAggZDee2Yy\nve39++OeFBTP4/P8nsN7ve/L97rmSmZmzy733nvtda/1XeuLQWlk6ugTfLTwfXzPaWhSx9DprOjh\n5OyAakOkBLYjgXM+BAjmLR4Hnob3tHTdH0mACvueXHbs6cMODkBNK4wC+PrfXFPn8b+Jc2rAT/bb\nBckPQEgQH5eNp/WiA+iHQGYvHZHHBD8Z6GD3/RHqIHrM7MWKd29lTNKdgAss02DgHMhvAftaqN9D\n+X0TuNv2KEJRpUPROpMzvVCJLmHd7vBzdg6bFHg1B77vHfg8CDEN7vDIDyAeFml0Ge+zQ6dPRqWW\neejdf1B6IoXv3kkDpQVkP5ETG+j9QhFedLidOsFE6eFn2NZdyB4VB8ePo//GQ3yf7WHoHC3hRkCj\noKjOpvYTJo5dQvRHxwZyUWBMzPz7KqMhZ/msBGEujIjKRi1d+Qo/nqo2Dvds53DyQ3xYtoC1LRMJ\nNYn+rrJOhaKSOHlHKg+9P4EtLxkhWgvRiWe/GkOBTBlybYgQmwoYjT6ohkhvMzMWvUPl6XKU2UB0\nBAuCPyfxH+WE3dCKChmVwY/KFHiomhuRKw8CbpyhTRzoMYjGN43dPEY7PjRoPv8CafQkSAxj2/1Q\ncE0wvus1LH3uFmRU2L9OoO0jL9/L0axdsoc+b1fw8+BZHEjN5p5cO2u9KlRa8WC8EqiUQGPYi+rm\nO2hMHIRDLuWmD8zcsnctickllPoVgsLAqIZ8BSw66G2EFosKdbgWvctPCj6SvF42jbiE+nbYGVhv\nfwncsgY/GuyoiHnVTUR5Jq3LYsSkbmAsZNiZZl3OyusWoXkSjicPYOS1O1Ft/wYMfiTAX7Rd0HTL\nwtARhIp4ZCRUqPDrIvEpGtQ+H2rFix8ZX6cStRERggtBbPD/G2LB/2/Bn9Ei/kMwCi/KZiNGFiGO\no0fg6qvf4LupnwMj/v3P/VBzvCfjeh9AeAheKP9ZKBUMjALjQCAK6o+AzYmQKo5BuPRmhDd5/N9s\nQAY2i/X+AT34a11FwoHxgW3/+4rR95fdxe72Ccy8daM4OGRRrVi4lua3cznYQ8PRIaM5OmQ0p64c\njIKEGx1enYZBu3NRh/q48xWI7AEDFxQRduzs6jwCbqE1Nnq0kIjDigj7/E9iln0Q1bTtiERadwSa\ncfvVULoPFAVNN+m0w6/1xzwgjP4vFhG7vR0wgkb333YlVlfOZfqTOzgedx3tjz3JyT4PcLgpk8MV\nYWy4bRCXvr8cCZn4udWMyN3BiNwdpH/WDKNnwYArKC28g6sHfP67tV6LARX3HrATn9O1z8/yHJey\nuvN9j7nVjDhVReSUFCpuSqeyGNbcaWfkfcdIsVRwfNHwM9Y6qQf0zBvF6A/yeXnXs+wtmk8EQTQv\nSsL9WRIXXAXDbgPVpDNdhwOeTCIbfmY69zIJ0XO+qUZEGZOBEdNg9FXwcux1TIs5xOXJ7Sx96xlR\nxRqOiJKdAup7U1Q6nu8eBAygM7jpM7WSEW2ZjMzdzqTcX9FOmgD6HoCaj7if35jGOwxmkyqNBe99\nROTTCreE/otVpHEDHf3zY4GhiJncbsRj5TzOJc5tEpMIQGLfZ6PIWXsKJaCi9luyCiVKJSoE/gJk\nfzBwA7AGqIDKNRA1I/BtR38UCWG8JUTSp8PTDEV4kMGI+HN3qIBJiIsxga7b6c/YMAnMuu0IWSO+\nYPcvI3j269cJOWUj+b0GNj02jEfGX8Lpnx+HZyD10iLMayPP6KDZHpWCS12NLHTS6RSGVIS0q+LX\ngT8wJvKZYyOpFI5PHEa/wUV8NPFWvG9o8enVqDsbSP0RUZMamTX7LebOfQU1fkKQaEFNJTJqFcwZ\nBY8ve5HvRl+Co+a/YhOkIGL69Yiy77hu38kIvv0fHw6KShKynxqQVCEQnwORvf+wXNcgAYe1dMgu\na/UeVldOJCTKBgZQR8tgFIVAnWxPGSRZQkGFXwK/pMK8NpqKhemijsBhI6XfZj7b+yYub9dYLS+d\nR0xiG+OfWsr3hlux3Wpgy7fPcmH+q7TNyadpahYx9/ZEkcCt1hN2tZl50pvceNMLnFZgzwE/IZY6\nWPRPeGQkAHeVLufGQTdROXINoVuncsn1K9lePwVDskSEysxLx+9h9aopoHLhl534qUPtKkNyDcLN\nQPwcoYpn6MdlCMdiK5CEzKWoN7UgSV6svr3IyhGQKsSBxGVCVAoAt43/nHm9HiH3CS9JkUA49Ikp\n4dfpV3LdBvEA82BCllSQNgSKfTzgnocKBT8W1HII3oejcYeb+Vo1hmU8jYcoYAPCqemJmOVWYUiS\nGLblCLvS/4tL5zz+13BODXjc0SE0z0onrPwJCh9OozkkikV3pLP1qjbcwaWgG/TvV6BC2NwLJPhX\nCMKwJooOajagZ5Ywfh1NusvLoakFyEIYnNNABZg0kJYFNgUKzYCLSNUWDvd8NmDTXViOqal2Smf1\nxVsB6eFoMlK1pK+uZs2JiexLyCbI5EIZqqH8nz3po24g976n2HCthT5tEP5tM/E3VqOW/ZTcn4Wz\nOoSX7/obeuftgIK1LQRhDPWB4/KAowmaDkPPHFzVQRyfMBx1uI/M1XkAZCzN59Q9g5GdKoiV0QQY\nKB24eeFyZH8JKxYNB9SM+mUvj275iFC/ubNvXxSCaxKhgKkW3rjqWa5pep3TSGfoC3fkFjvMXc1d\n49iSdCd5CyP4YxxdExjvHETuQO72jZeCx/rwzson2VAxEdrCAmGdPyJ0iIUp165m/pxnsOLBC+zx\nKJiHtzHuQsj/e188Ji0Lr7yD4rJGlOgLwSCYP7YvwzCa2oi9VZTgh01o4/r7P+bueW/iVGTaJRet\ngy34/MGI4hxIiyjBpYrg4o3vcKTkIMmTUvAmh7F2iYbr9m0gfkYfeHcPWqeX5U/djKST0QR7iZFt\nOAG3XyE+0cKi33JZ8NG9ZM07jD3CSB0SwT9MRtU/kpm3vM6g9S+jXWTH9o6Jq5/8lbtil7HmvWm8\nUnkFUAtKBhHjwhnxzWlAjaupgP33jhWE/MNq1h95BHf4KmTg0Uufp+1YT0AnmlpxGhpzAZlrpc1c\nseRJatRt9BWiONTFxrHxxolMZTsyaiSvzInpwxjw6SEKF2TjKd2OnQmIsNtRwAUOMz0eKUAOy6Zx\nUQRUHQdkLpy2g+c/Wcf+vAQenzMSdy0cnPjXnLDz+N/BOTXgci8jqZvLueqXlbhuNONrU9NYUYbT\n2iAc3v/K6fNDgqOW79Ou4gKWIQyDm6xNQZB8krKH++MsCxYfexDVgJgYznI0mNnLBMAJcjP4dWBS\nIDOCGMtp3tv4DfXaKBxaUSA0ctkhYt9x4ztLFOQY0PptM149lLT6yGA9r5TtpWFgMwogIREkK5hb\nnMQ0CP9EFeKn4v50lFY17moDBEFbYy9oDacr4N+IMKsOoF6UF/qFNpkiS3ia9Ej1Ogpn5gCQ8f1R\nhi3azfPLXuKZG/5O754lZ+xnqMmGMcKOMNN6IsbWEHqhmbIXYGykKHihWQSuDgP4ILK2jQui2ght\n6lLq6WOCNqcoaFqz4Aa+aLiV+hVWrLoKEb+JGAmllV0b1ukhOwftMDWL583DENbVElFCwRuhpX7H\nYey2wRB+9hBO6Egzyc+fxlDlJN1T2cmezFKgqBIO/ARD/MXogiQ+kV7lgaUvUDwgjDuefJlha/fy\n483XsfNS0RVz3Pe/cc1LSwhptxPnbcASOIeJ1ZAY1XULJP7UQvk1YdS6+uJpLxAN3hGl/jFuJ0bJ\ni2yxo3eI8zX8lz3MeeifnARsgzJY+/n9vLf5aWwXhuNp7aoSngBMved+ZL2a5QtvZHydFd+2PJzW\ncKJNdla7p7CkfhRCkcAE2LAesXL4cgMpUUl8VnUF1kojjcAexYHr2mq0ahUe4DvDXAzDZQ6cllg0\n5V2O+ifDKT83NH/BA61vEORrRUmEPsNFYy2tu5VZVRtw2EKob++B+do43A0GpBiZpSen4ndX8OF3\nb7F/30U4lw2HBheQS8unp7j3jlXc8XourHRi3wIte904Zlkwpsn0/OVpqm+NxVX9A2cPQZ7HfwLn\n1IC3Td+EveeVuGwxyEe90G5GeGit0FwM6igI//OiF0MvJ70fOkTlPfvZYrqauasXUX9pKhVP/oDU\nawY97q0kOMHR5YV6XNQvSqRo2XVI8gEEcyQUlHBhMy1OqK/C4kvm5bueQUbBH0gLRDSW89BH3zH1\n1G741I43YJ9CQiHFD7pGHxIQGgTJ4e04PO24u4XXVUAT4TzKGmAJtdOL8JjTUGoLBKNCEwyuNLoK\n1TsQhohwBgMV4DRD6S5Ro98zBwUJV1kQ6UuOU3pfJiqXgi0hDLdylr4wgAg99AFqsMVoabizL+2T\nw/lNG0Reazarf51D+rTDTJm1AAbBie2QES76W/iAVBMsfek+9g8dTOsnCZRszqKmxYm32QPEgrYR\nnE4wGkmdrHDjlZ/w/O2TwRcMNR56Z1UIpYZuUONDsthEJ8Gz5YtlUBv86BLdUCVGqONCNSFCu5IN\n8tc4GZYD6ZEOQvrp0fWDXsHlZHqOszuyAXWUiGMfH59NckEZ17/wJRIik5EFOCUwdstja80+JFnh\n2aWLeP6nR6CnBnB2zkAEJCZ+uxFrbASbb57BmnsuI+uHnznx2nXs2TyKX9a5iBrhQFm8hKKcy0mb\nUsAHP77C01cu5IPHF5A3fQTjl24WhNOVDYT3U9PojWXQlc28P3EJwUta2K3qy/pXb8Ot0iCZZea/\n/SWcPI2s9bNg+5c8O+sCPrau5CR2xowuIzYObNUQttNB4mOtuNMNxH5pIcxXjxlBLAnRQU1mPOsm\nZRPz+DqyU8Jonp6IzyIS5KdvG8CL/d5GqV1G1atWPEYPU7xvM+m5ItblZbNzdSSrvpjGAdNIaKzD\nbw/F6SvGfRw8FcE0VxyB9gQCDczP4xzhf2TAX331VX755Re8Xi/z589n7Nixf0nU2Le/CV/+UUge\nB756OiVWQPTvbjwFbVUQHi+EiH+HuIZaFr6ykNDWIN5Zfj/mV7MgJAR7ngMag+n5fCuGgfZOA66g\nQpUejCXYCTYtwsV3g9wmrJPsB3srHiB/z2jO7GPcm+f/kcynttPQcgQZK1c8UUN1QRZ71xpwBW5r\nvaeaYDN4/AbsxCOErhzACXzoOY4bmAX7/RB0GNxeITSJHcHkEGrFl931IxMu30jkdjMHjkzhPd2d\ncChdcOPLS8DVDlV5qPsMIvWfhRiHWXCcyMTv0EA7qFyi+ZXC78c9EFdHx56t45l/0xy8qPDjpdUj\nU1tXTcGxVPKU5XxzuA6LE8J8op+/nwKMdgMlXwyk9WcTrtMGvHXmgFabAZDF/14YknqKN2YtpzE7\nIEbgBZVZod+6Mk5PT8Kv7W4CxTzlrEIcYgFsR8Iovq0/wU1O1BoIDwNLgMPtQxjhPqmiedgDx2aw\n6+5qbEmDeT33Jj4jh+pPe+GLsxJ5QwjmHpHUpfXs3FoHwbOcM7sudyA9u5Sgl3dSeVdver1mog/g\ntUGlM4Sjc6dxcvRAmnvFknKslNnf/0ZIlZn2FYdRz55E88cS8UaF59/7lReeUsPYFIqH9sUZpKdo\nUD/s4cbAtQlB9W6Svq1jgXkxzaNMGK5y0Tw0jswKLzO3PYdlhwqnS0NtUSiRqnaO+hV0L5XyWkgj\nWQY3ha1wrBBiymDpQw9TtG8M1rXR+P1qjCbo2QvigsTDGBl0RWYi9x2luiyFd4YvwZer66ojKgzl\naMxwkPPgmIFHgx/nSv2veNe0s7M+FoijKjKVKo0eGo8ipszDgGKw6iDPhMh7ZCEE387jXOC/bcC3\nbdvG3r172bNnD3a7nTfeeINVq1b9RVHjaCEOWX0U3AqCySCUUkADbpt4Gc4iAqZAqzWaD+oW4gvV\nsXXVFNwb8pht+IRNchIOoOatFDThPuLurCZooAMZCdM1TXjbghjqcBLNIZb9qy9IDuH5BQdB7yRo\nqINJOljT3aAYKNydSSG9EbFcD7VbbViabDT4LIgVGME/DPwdRTgxCA/Ei0iWdijCRAEecLo5s5mV\njasf+IbB48pIH3ya7NoTJLY0YHPIUHsBmEZAsFfUiFfsAocOSS0TOlY8aFJeO03FwjTm5z1G0P07\n8bwVgnbAn8Wh4miqjaSptoPHrSCSu/uwnEwgn/7k19vF550UzkjwGOFgxzo7GoOpA8fRQZ88gTG+\nhIGDj1C8IgXN3PH0vfgw99/zMrueMzNqv5+KR5Pxhv3J5WauAkkN4YFiIgl8Zi3te00cd+dwV+Qy\n9O1W3NShkE8DcYTQh8g6NepG2NJsobUkDA41cMzXC4iFU00YXm3CsjkaQpPZGqvCs1yPjApPuYGq\nN3thVhzEtK4/+z5VtOM44MXXKM5kmxcmfP8TFx46hN/pQwXEVtTT98hp/EC/o+WYXvdQ+9wNbL5n\nPA9/+BHSnErwC760SJ9bacPDqseuJ3ruEH79PpgRplLcOitbcifRb5yXScM3ousj4dQGccG+3Vg2\niGigVgKvAqZNkBjUTK0E8Qpghs/+/hA/O+bR1NYLuVHNYPNXDApbgWuWCU+MFtPaRvabE1mu7c8N\n1x3F9KWfHdutZ+qhqCBz/lFkVRwVT2SyPTSG4vowrHm9yPcHARZiLqxFFT6AhpP9wFlNl3OgBjyE\nxFiY8lozq2//k0vwPP7X8d824Bs3bmTgwIFcdtlltLe38+abb7J48eK/JGosEnQasDUhbv5GunQs\ngxBc0jbOFD7tghUdaxwpYvltwRAfT1mdjE8BWvOx/hRB3CNBaKK8AU9UIjjTjiHLRHX+JNp8EmAX\npe51RwJOoE8YdJUc2J/YblvsaBwrGBBFuVUI49dd0MGAMNg2Ovua6HyQcBGU+xDlzja6GDECNzyy\nhZGFx8mYWkPYLCcKEjYphB+Cp/PNsaHgrxGbNWhhcChUWCCoHqZ37V34lBZ6uVUUPDWCmDE1DNiy\nH18Q2Pt0GfFxl+ZSXpDE1hX9A2MdFhhvJ6IgKSlwDAoibFMQOMaMwPkI4c+TE1qEFUjHE+SgPiOG\n1iFxqCJ7EzX+N2Y0rWJlE0yPsFDuVqEgkfRNHe/vv5XiIwEZHh3gawdLINnQzYjjs2JuaeUX+Qpw\nBUJtRCKKp0ZCozOw39vEcblkhGfYDNTjOqHCddoChmqOJ0P5iGwUJHwtWtqdJlB84NQiCrB+Dz1g\no/HrTD6rWcAV84K5JG4Lkb8WYj905tyhJiuFX566CY8nlDXFC6h3mXiU9wA1VQ9Y6LVINGPzokVG\nReHYgZjoScjmbfy8LYsiTxxhA2xcXnuSnDePs8c2nOeKHiCtfAJuXEApshJFo+Tnq9QlaCJlUMHb\n1hepKz3N4QODaTBHIlvU3HTRV4wseBNXnJOKtF6kHSpjr3kIX4dMIW3BMapzBvOl5XJ4uVyc4gCe\nfPJ5Vm0Lx2yYgd9uo25+LAWrbsFWb2f6TetpqW+lcK8GyZQIBiM4q343XgpBIXYmXVrCavr8yfVy\nHv/b+G8b8KamJqqqqlizZg2lpaVccsklf1nUWHjclRCTAyERoFJBvUlU8eFCGE8HZ42jqQGDE+yF\nEDdWfOa2ckwZAESCrRkoxX3UhL/VhHV/TxwnQgEFTbiXuow4LOsvAA6AVw9tHdlJGQwqaFZB7ygo\nDwWlo1T+92hFGIcwuvTjXYGdMyF41RrBhPHqITkZKkrOsh4TtWWppFy6g6zGcn54dgbqiT5cLgNf\nH7qC/DYJdHXQWklGgou54z+mKNvH0E0/487IZxmzO6mCpplNFHmHcmvfH0j5pIWKJj1KH6kzjJSR\nU0rm8L1sXdEhn6BFUP5KA+9DEeYoFMENrw3834IIVJyt2AnGTMrnwktOkndwJMXHUph9zxGs4Uaa\nBunw/+M3yiqdLHnnPi7O+whtq0zS0lqUIIjd2sbhjeE0tPaAXoaAUpsW1EbQdovjqwGjBhzB3VTN\njd1eYeLccTqwcBDC6AYjHpYtQDt4rOCRcec7cedbAscTHvheoRv5kB0/QbZUh1anRj+oH1j7YD2S\nwjbtYOzNWo61xZM5vJTRiWX0/vk0RcMy+e2GaTQmxbHvknHIFglvTx8Tt75E66O1KP4cWr8pJeGV\nMFY+MZe2pOjO82IljKCr4ylXsijd3Jureywna2A+B/YO4vPF06iIlEm4OIzv869H9EYOQ43M645e\nqNVWkE6zyjmOVnkArPNAaAnoGqg5rmVHw5Ukjq2nn2Ev4SetFEdnkBsxnGm7lqA6kcaqvP4QI2a5\nGpWP18c8Tv7oTKof7YtdnwStP+Pc0YqvfQboquk/9jSVp/QceMcOEXbB2z+Lk+VoVbN24VgEm+o8\nzgX+2wY8OjqazMxMNBoNGRkZGAwGampqOr//d6LGsAooAf9x0F4MMRPAbAZHR3w0kj/zvvE6oO0U\n0CbKoSVEZqY1GZRgrmIdGfpydBsM5N52BSeDe2DPM+I4YcQ4zIKUoEBTKIT0gahE4a01WgAj+I5A\nbQkkpEF5FWcViuhER0qrwwczIIxJEMIolAmHvKEE4uz8kUOeAASz9YeJoNExpPEY2w6mod6nw+uK\nIX9nlliHxw+txSRI1dx08TKOxQ8gIamO5SsKqW+9n/j5FZ3l6ZGXNcKrJ/h8z0UUWrMZFZxH2iDB\nCT68dSD7N3YUFcXSxYdvQnB4NYG/fqA48DcMEaP/M8+7nfShBVzx0G9kHqui4mRPLrx8DzIqVA4b\n/u1HqDkYxWcvPsQFtk9QFJmEjY1UX9KD6kt74MxvAHk06GPEWBliQRcHwd26LSqAPghioqG2GvFg\n9yOukcBMChnRU7J72a4bYaDDEbOMILpmST66qge1iIfurs5f5u2ASZoWLJf3QPFYwBto+G6AeHMT\noX3d7Iwdwd7iwVwevxrt7GQOTRvJ+GWbCG0xs+nOWaRMq+SWuz+iercO0UJYUO623jSdpmUJeBu0\nRF7SiCHVScPk4fQvKGLg+p1EYGVNy1S2nhrJ7uZMEkJLcLTH0dVOWYVfUXivbiLU2RGzEAed4Tmr\nUEPasmU8o6YbGTNxJeFNFnGpRuuw9U0gtzybhiWRUF8A0YKho5b83D/oPeL2N2APNXF/9nuUpzWz\ns3AILk8oaNzs/mUwlmZZjKGrCVTdihm6wdGuYcMnCZw34P+3KOc/Jmo8btw4Fi1axIIFC6itrcXh\ncDB58uS/JGoseosch6ibQB/VjR6chPCcfAimyFng9kB9LeCC5v1I0f3o8bdQpj5xmGjamOZaxZgQ\nM1uunMXW0njcBgOSWqjL2A6Hi2p6iw0M0RCXBm4nKEZoMoDPClWnETd7FcJIRHD2QlVdYF81CEMQ\nRZcXl04n79nnhZpquoygC9DD4B5Q4gKbxNbvL2Aro4EC2BjDwDEOhow/Qd72CMAAbhsVZQrLD89g\n5PXHKJicxBt3jkbaa0dtSCDm5rpOibZ1wZPYYrqemh9TiJv8ZqcBP7J9AAc3D6ZTgQc1IkzVEQBV\nIQxEO8KAh/3JcUOXjqmKowdy+OKtKHpnVZE+pJTv3poDQEu9AUhFTTkDHCfw5wN9oGZWHJXXxuON\n0OL6F0J1QJIIG27G16bBceJ3Va4dVFA8iEIhO139zM2BBao4s3TbjjDoiYFz6KZrptQQ+Gukq5nX\nH2cXn1ReS2V9OnXbmqGqAEwyuEPRhTkwGBKo2T2Y/Zt7UJ0QQuapKqyrts8pNQAAIABJREFU6tA7\nXGhdHhRU+MJDqLxvDs4P1kKIERxamj+tI/ahRBQ3KE4V5g3RRFzUgqGPg7CUNrQ92yg80IcNJQOp\n+CkVMFJbNpTaso6B6CBRViAShQoigWgOvBf6rZNmFjLAtpFJqVvJbswn7IQNW2oILSYvLUUyaxKf\nIN/tA181NBUJRZIZCWL1X+/nBkcRU65ci2Gkm8p30hl1dDV91dtRb9Hi97mJHpfIAU00ru32P4yb\ngAcRMjyP/zuk8B8TNZ45cyY7duxgxIgRyLLMhx9+SEpKyl8SNRZ1vX6w1ILGBnYtuN1ADNkXnsRm\nVlF8TAaXBRwtor0moItzYxxopXVDbygsAWTUKj/33/JPRv39fdJlN7XAr5dM582spzn6y1B8JVph\nqzq62rnawdqAaPGH6NaWoIGmCsAg2muWlwf2s4U/N2QdM4ReiEq0IIRxdiJi6CqxPoJ/97tAn5fw\nelB3CQYPm1xAz7SDQDhjZ51Go3Pgl8dxbKeG+JRGEkYoLN04lwlDHmLXjyNA0aI076Vm4TgkTSyq\nwGb2xN1H24BkKJRQoe285fsOLab/qF6c2BcQazaEQkQP8SOfD5rboVupu3ggdRy3J7CWDrZQJMLw\nR3NkWzJHtpnJGnmcjCE2fvp4Wrd1eFBJauKiK8h4MIYGZMpv6YlsDFAIUQTbyJhKxFQnruKgPxpw\nxKZDvG0kh+ygYPBFUBwBjcWI2YQNET7pMOD2wBi7EXH7ULqalekQ4aEQxHl1AXXoQ6vJvryR3CVi\nqaNzr2Xjjw/ieKkjKa2Gtmpog8qUULD3IT7VTP9RUezdN5u93xwiKNtB8fx7iTaoGbtiC3uumsjX\nr93LULfCZStXUsk+jv48h8jb1MTeLGJBTd/G47cL/uTuxBnUp/ek/ccmsBYgwiW9A/vv7HYu/IhY\nfSqdCgwBqcEBs2oZaClidt+fmOQ8TkyZt9OBq0oJo7a6hZZV9bT0uQoSLNCmAlM0NLajKI0c3qXg\n31RCL8+PfH5iArcVLubyDR8wrqKMUeENGIJg34Acai+ciurkaDCcAufRP5wuXahCv8vtHFtyjjt0\n/P8Y/yMa4euvv/6Hz/6KqLHw3ozQWEFX4jISUDH9hk3ogtv55vUMSo9rQFuDrk8IIdlWgtPtRExu\npbWyFxT6gRDUkp9Hyhaxek4kPpdE3q8m/pV+HWVL++Fr1IpNeczgtIM+DLxOcNtBHzAUCoAPTHZo\nM9I9Ftq1rzJnxsIjOt/3GWhGrdZSdKSDPmVBeISh/HFYOxKcGthhYeRFR+lV0Yi2TebK8b8wcGwB\nFhtYrRIhIRLaaxpYqc5htCafmMt0fCenU/+Zl0+PzgPWC1ZK0xGqX70U1N32OwKww/G9g8gcWUBC\nn3rGXnIASYIvnh/HyYMy2hQ7hilZWPeHB+R2KoV0DfWIMlRH4BhDEDF/NYQniZCT28eZ3RahIDeV\ngtxenFmNacBtG83X948g/vMaJl29G4PO1a1KVNSBpg0uIqKXjsqylLM+K6Pd9UxtXUJ87DLKnnkY\n/VYb5jeMEG6E9oOgmLvtj/AKe45W6K/bT3hhPf7mJhRF9MKpT/FzpNcYHLuDRYIYO6FRbq5/q4Dc\nJSLptm70bXjW6sFeDaaxjBmxn7DIowQfdzNz8G9k3leH3DecPWtG8PnzN3DyYA7OI8epvreZWCNc\nl/A5u66ajMdo5PD7D/DZkovYpfh44b7nsB5XozE1oYnwMaHXeprC42ggHm+FjuTmUzCkimKPEWdB\nEOjV4AklXNNO1oh89q7LIdDfNYAohKcbDOQw++EtXK2spO3XVuwtWmJCvOAFa48QjnvTObFtGEgp\nAfKRDmN4FEN7lJF3wWicn++gPFjB7x3Ga3jhOS120rk0rIESVQxxbjfO4cn8Y8rf+PngZbi3BItL\nw/nH82WM8nPVWy0cWxL7xy/P4z+Cc9wLRY1IoIXQdccmkpFdTlxSNbHJjaQODKL0eDIoHvTxbuJu\nqkGX6KZ1dazIEaKAUoHc2sC6ZTM4Mbs3Po2Kj3cZaV7YCL2tgeIQA1gqoLUCInpCXAZEJ4A1kLz0\nI7zw3ulgsYukKogRMbeBEooI57gRllGLKLAR/PS0Qb+h1ddTdCSTzuRlR9c/ZLrirwpd7VijGTLe\nwXN3f8CF6/YgH3biWQGsBHudqJyPS4aZN/kZfWMlvf91jOUrx+F9yMK+v0tolxjxTkkGbRi0NQpu\nWfdCGJsVvAaO7erP6JmJJPQRscgxsw4gqZr49LULqYuPJ7S/Getv4SJp2CcJWnMRs4dxiPJpf2D/\nrYAR4hLB7RchLLcTEcbQIjjv3c/tmfB71bx644NcMHMfBl33B2EQg4ZVc/sVP5EXOoni1n50UsO7\noa/rOI82/p21A/oSNqGZYI8bc/CFEFFP6uglpNUVciBuKObcSBRLLeDgwvntPB60geQ3CvC2ixqi\nuoQefD9nLqfDs3DkuTGoT9FnuINMqRp3t77FxtWHadNdgBKWyqCoQ9x18QsMGVKJeUMK5fke6gtD\niOkrkZxVReaIQk4enCXOrycXv9xE+8gobGVhmBKbGbpuHyZFYRBgmtFGw2ephA1sQxPho//2I5y4\nMJv65EQi5zQy5+hiEvIr+Wr8o+RuHYCzIZhwvZmLc3Yw89Yf2Lvu3cA1FhwYpHSGTVrHif2pxNh2\nMKgwl7brQ3FMjkX9XhGsFzHqphFRrBl6I2s9D4oebX4x9sYEExOj36Hiqn5ErNMyJ1JiheMQZb7T\nFBDFZi5gc7s4X/d69lCeNoEtuRNwbwuGIBtYutdLdEF2Spg3nVfkOZf4f6CZVRPCu+3yHG94dAUj\npx9k5QezyN8zEmgGyYKzJBjzpihCR1qofrk3eBoBH8hBeKuPMPvV5QiKQhuwGwzpoAoTBUFBYeD1\nikM0V4LWHaho6IrfqYP9GHrbsZdEQs++4GwVz5Z2C/itiJCPDxGjD6jtBLDh20kIQ12OsD4GhPHu\naLNZQUDUq/Nv/5HtvP70s4z77gBBjW7KbdBQAd6AtmaIGpxeSNxWSVxYJUEp0DdNhdsRgXNgOkG1\nfrxJF0GoDCf2gbMNQqK7eok0NYEzmhseXcGo6QcDDbIERl9cTnvPLF77egLWHQ5C0m3Yy4yiSVZo\nOFg7DHB24O/OwPFIYLFCfJKouGysRyQEgxAGpSOmfBYLLEb5LJ/5+du1P3J1ySEezJuMuTzqD2JL\nJn8zWa58lDAjDUMHILVA+eMZhF5sxvrjSW7Ka+Kq3H3M7X0vx27MwX9oKTGZpQz2lBJb04TDByoT\n2KNi+eHWq/lmwG043zISlOMgxh3JvCWlJL+fz5t776bDu01+IJHUN9qhxsb8qvtxPngSuQ98cPXL\n1L8Zz+3x/6KnrYDtP4zmxw9n0kUzDcfdr4qmV3uT/FUd6RkHeWrOU2gRWZGc3Dw0Uw5CpUJZRBrL\nnrkNBYmE01VE1TXRq6KR7P0nqB67nqpHU3C8EcJY3Vpuv+Jt2ouSgRa0KplR0Y3YGhtpw8sT9yxj\nqXcEA/evov+7dehCE3DlGAlp63Z9VzvQBLWjjfGgGebF26QnrEcjEeUVbMm5g97Xn+Z+3Rykdnhf\ndS/fjszmQ/2lVBxPwG+2kppZx3dNQ2l73wORFWBKEJJvlrPHuc0NIbx9/UWIp8V5nAucYwPeFzjJ\n2W50BRVz7luHpFZY8uJgmtvdhKQ3YprejP1oaJfWgmQA/VBQh4G9DWFUTwBBkDhUCAPrgsHWIJYN\niQdvBTQFJKIi4lGH+tAnughOt9PznjKK3AOR/GYo2wuAaqARwR4w4ihNw289AoqXHslaQk0uQKKl\n3kRrfTDCmGnoMu7BCC+9ALWmhqT+RsLrrZibevLS8wsZ+2UeQW0eMEJKDrhdIgwvpcXRFm2isrQZ\n685mEpIhYxT4yhXKd6ay+saXab9KK7i7dhWkjIGy3WAIB02ANZOaKuzpnzlBThfGtErS3qzFU2Sg\n5OlMkBSkvknYfq6AEC194oqpKOyJz9sRL26FhhOAClwdTI4KwAbB/QiLDSYuopg/yt11QEKlPrPZ\nVWKfRhK/aMYQ5YEBgZ91N96GNq5TvubpqgUcHDCEH758najGFmzZJlKeKOH4hgn0lf7JJ0nXU7Yk\nAr8X0MH0VxzMPHWSHnubRDt2PSyZMZUfFlxHGGZCRluxrIwk6PPJqFo2MfuVOXQPTRye5WAx9zCg\nXxNNRgt6g0jXyINasWRk4FnvI8TQggiHuQkzyRgj3Jibk0lK30pf6RQb26bQfPeZUiHvXHVPZ+nU\nB58+xqnh/VGQuPalzxn7wzZUwJabL2b71ZMJ79nKlJtXcvnlf6d0HQxMcaDVHSI7u56fJ71N9VIr\nW6rBcxW893YBJcZgTu3UMeqftaR3bwgpgff7ZnzR1YQ91EbE6FZ8e7VcPGgx0257jelVYJHAZBJH\ns71fXxav/phwm4xh3gDsu7Yz75VdbP4+ik1LE7v6GaisCIfpbHADuX/y3Xn8J3CODXguQkSgIzkW\nqPHtFme+7O71OK1lfPjYBCw/9MCyOweVXkbf24WikvHWJaObOAKCFdw/2YUKfYckmdcBajvEZoru\n+B1Fj1USVLaIN3IDof0a6f1aOVKsyPD3W5GHrrMpPQRjQwK8tTrybgnDukMF7nyueSiXCy6pREbN\n8kWXsvK9/ojWtCa6hxO0Oj9xCWaiPDbe/HUj417bxbrPFHzTwTYCDJGgUsRhaw2CBv3hnXexbcE1\nTH3zY6Ieex+/Vk2b1kDdaQvOFRsojbsKUbAyu2s4e489c3hl4CKgz9lZ7Pq6UwQf2Ij7hqHoMlwM\nXHEACRm92UPZ6Qysw828f998bp7yOY11OWJMKQfU0FBGV191MxAO6RGMeTyXZ69b+KeSEP6zGPWF\nr+0l4+16wQxyOMRTrFsoY1baGj4YuoD2dRCYyaOPddLn40JOzslGiZYIkhx8N30I5qpfoNf1IEEy\nlURgEXZEEr2oPLKoglTjx3YklLpPkkiOKsdadbannJOnk6/koTWV3P76GqJbWmm0xhAf5acEmQN7\ntah8RixyO1DKmFnNTJ+7kfXfTGThV4eR61Q4vcFo/65FvdCCv1sjtI5RePCuNzqNOQi7qAKmLlmL\nO9jA+x8+gho1sUC9HYpO+hmSWMErS1ezUx7EzJg9+J5TqIrswfHpyRQ8lI1+1lrsdVXYHaDXgUYj\nHiB+wNDfgUfS0LYpmkvmLmPe1YuJ9oG5SWy/pV4ECp8sWEGIyUXh3EG4SoNAasGDv7M3UOBkgr9D\nm/ZskOkKF57HucA5NuBaYCCwCeHd6REn/PcqHgEOhVoGDQQPtJLxXj6aUz6ON86k368HUTwSBYOH\n4i7zgUcPqt5QG5jaxeUAsahD/ajC/cjB4Nc3gWKHdi/m5ZGcdg0g9eOTSGGih4gH8KPB16rBEWCQ\nnJo7CHeJGqQGoJpFD1/LoodTELejhNC5FKwMAJ3KR6imjfg+bpau/oiBdxfhuRsOrIXYwDV/5AiM\nHAnhKiAYogeG0OxR4bKDv8lDpF1LFCZOD4llyZQcXv8mE4LVoFXR8YD5UwRqoPyy6iw9UaD/ZV4m\nZ6j4aXkS6bcV40GLyi8T3dDAjgNpLDsA7R8CUQ4kLSjKCcHOUYLoqphVISykGZXZirbah8oj49GJ\nGYjkV1Db/fjCOhrWClOlaffhM2rQOPz0e62MsBM22vVhOHccBMdxiB4GQJDOSahkhXYIi4V+fSQU\npwqCQB3uI2v9ISoHpONBj0KB2B+/D5DR4zpDF7TeCcXOYKyEYaKVsAvM9H7vFJV39uLtG28nyriF\nNn04covgkZuiR/PF+geIiWomSO/ELBuY/8RbHBmXjREro6ZC7ZtT2LB+MiZc6IGhFx1l8IQTWMyh\nqGNklj8+i+bgWO6TPsfxmAO5nT88Tc86T5HES+fyENxuJwaYqYXwmAYu9bzKh2kwSAW+SyE7Gl7+\n+Q1erHkabZCPzAwbFQfh5BHonwk9E6GmFKrrDUiTjUhekEJl8scM4Y2VL/LO6LvP2G5EdARRmPGg\nQx3pI6KiFUeEhFYNQSEymnAdcrgKVaQX2a1CRofG4CE42Ife5Tmj7k4GWuTfM7DO4z+Fc8r30erH\noNWb0WtcqHSKkIJXhYP0+8KZQKMkmgAF24FwyNbw7l230X/vYbQeL5JO4cLCjWgnRYG+N6ROgn7T\nxcsUi6RXSHn8NGM3biHlcQPSldfApGGABiQ9tgPhlNyWhcojI3kUFI8KbAoFY4dybORIjo0cibs6\nCJp2Bsq4VYg4eKRYB6UI71uNSq2g1fqYFHuQvAkTubdyJP3vKcITBvvXiK6wIELVF0yF8ED9jNeu\n4a7dTzCy7F2W/l1NRexuXn1+OKPZxOwVubx+y3wgCZS0rpX8VzjKn9ZRxNBIVvHPaJYvQ/EqSIpC\nj5IaPux3AyrgZmAQ0D+3Af34UFQjp4OpB5LWiEYVho5UdEShU2nQqx3EXnycQZceJnlTDX6fBhQI\nLnMx+P4iFCQ83fIcQ+adRFstk/lUKWHHBRXznlkf8PXgr0Ea1rncLVO+5IMp9wnhXQf4arWYF3fN\nbnSKhz0Vqfzimo4dBXBC7W+ofU2oFSXQKEygZyYkZXGGw2gcbuHKvOWUHZ3J/r9/R8Kxrt4Evx2f\nyZRndjL0ihOEFDu5Yud1rLhuBN51OiQUdv0IE6wfUTX5Un7TXMLNzMcnqzm4ZTCPzHiWmpM9eHLo\nAtIMJbx7091EvaxCFSSMJB278Sf9u4KMEGb0M/67TSy45RUAbB442iiutkTEJbD/J/B54KMhN7Hx\noioaUg9xclEb3iYxDzxdCDs2Q1Wlml/n384nQ19Bv9dL2uvCuenwnzv2yavTcn3NL2z0zCTBX0vf\n74+yPGYCk74ykN3Lya3P1zP4y4nEfxHDwJ0HSLw3Bj0TGHSFh4/3FlJ3/9vU93yLqoR3qEp8hxNJ\nH5/9AM/jP4Jz6oH/VDGXUJOXQR+eZO5lX7L57dG48kKIiDYThAN7p4eZAmSCuRiUQ5A4DFyQerqc\nHRlTKPOEc13tL7QQiWyRoM/QrisSwAvJL54m/NJm2gkl/KYWErQV1DwHRCSKWLkC9mOhHMkefcY+\nKr7AevSISULsRDjuFSxBggi0Fgq8hC819poCXr5+MZl3HObUZhggw96tfzz+oTPBoNDJfLs27x/8\n1JCIoOvl0FW12VHqfRrQiGRl6U4Rb/k93Jzp4bnA79Uio0Z1Br9bYOSsFv6m38lrk2DKx1H8Y8ht\nZ5SzmICvM69g3uFvsfcN49iCHGKuqOfxTx5h2qptVCgQNEUhKxK+jriebw4OYdijrVxwUxFlt/Yi\n/f1K9i0WiVAdbjwdVa06QILD7/Yne2EBpmPt8NxqULIgKqdrB6oCy3Yw0Wpq4NBnMF/I7XkkHQN7\nt+BL+Qdy5t3QvBqcdVyzxsHs3FPE5rZ0jgOAMzcUW5QJ0wzRylBBArOKitURDHnyZnwLf+nc9PKk\nFlLHyYR1DvP10NQMjg5GEZABhoshyQhFpPHiL4+z/coc+g0rRoMPNRqS2quYffVGVFEyMbGi5Upr\nA+z0wshoQeRw/46G57DCuLd/YYy0pjOsYgOqEZmjjnKrDkT3gF4NEOo98ybuuIOWPzmfJYnPYHvN\nhO6yRryBpczAXi3Mjobmuq7ffTcISg7Fo+up4YltH1I8cwD3DP6GOapfWb9azeK2J6g1jWZe2zu8\nZHwS9waZve40vn3mKvod3sUFm28lPFnhlj0+UWx8HucE59SASzoFSafw5d03cOz7YaTcW0L94kSi\ndloxJruwZ3RcfhKdxTDt9eA/ABEgKQpajxeNt2ua3H/tQXSKj+Nzc0h9uojqj1NoPxxB1YuC2xt5\nWSOoFGKurCX2Yj/m9b0w72ol9aWTnRf176HDy7Erh+Np0gutLuIRlYpnYsZ9xTw6ciM53xTiftPF\n6UY/ihwIHPzOYbYAigPxYLDD5YNX8WvzDGRzqShP7izPj0DcZqcQllkDmEDxi74ehetFD5mMqeCR\nhLHrSCn8BRxcP5hXrr8Opz2X3+4MZkHuYj7MufmMZe4/8AW1mT15ccaDJO8qRfpaJtRlJyLEi9ML\nmv2gCwd1sowii2ONLLCg+krh8KtZKBoJrdXHiPvy2f3FUEbNO8KRFzJxJBoCkmoSNx59ix/qIqHH\nmZPA/D2wMReG3mhi2bCZLLz8Ruh7DACfWUPx1IHsLUnhipNrqLwlFNlvBzxkaIoxKRak7uPgBsUp\nneGBSyjk2YYwLm8XXv9SoVQfQKZHYfdOuGAMXJ6zkZ39xsNP6wJjG8TxF+7gti1P0vpBDcr2bXiI\nw7W9F/7UOKCM1MwKFh9egC9Uzb5vsxnz0GEkSeFIg8j/XhgD2MAQiDD83ohLfvmM8Eo4MMwLjgYY\nC+xBpMcP1kFOD1HKc7bu29+98DeWGf9GSJsD02NtDHr5EK/9ax4nLszmi0evO2sE+5uCZQSZoPiK\nfiS9UEzyiiLuXfE+t79/ObbiYhQ5n3taPmVhyHIiI7wowNjdxXw/XmGafS4eRQ24ydIWcnYh7PP4\nT+Ccl0x50XL1uz8RVdKGbJBIeqqY3IpmTuw7mwWSQJEZkp3LB9/eS/QEaOjZg2sOdnlNmnAfSoRC\n+r9OULM4CdvhMHCDv/QY1fMKaPlccGKnf7WaG979nLDZdnq9UEy/gqM8fccTqEwyGpP3jJdiUsj4\n5hjZa/cRnGiD+EzIHg7DkiGmEqjmmgfzeGnECsb+epTwCBtqv6+7LUCvhox+obxQuIwyjRrd4UFI\nPQIhhSCQZ/tIXXES0z0mGDYS4nogjHckwmJ4EYyWOLp6ZyuiD4wvkDMIeLXoEA8GPdBcTJT9FMY/\nSSZ53RoclhQU3wVYD5Ww774Kfjs464xlnr/0ET7PuIpBO44S7WwlymJG7/YiAcnh8Ot9tzHw+jwe\n++ptbC8Lv1DyK4SfsDL8wXxG357H8AeOoWv1MuquPAwNbgY/e5JRdx5h9O15VM/qQXl/G+64ERCR\ndca2fV4hji5rJJyGYMzeGFxl4RRdPwh1mJ/e3xcyJ3k3NRftRq7vsIAKIdjQBJRgSm9KYu/iIez9\n1xAqUuth65nTIUO8g0kv5VK47Z8czPm08/NIEIwWBcyaCLwhWtAEss2AL8RAvyknSR/jo8U9Fatb\nwdujGu7Uc9o1imsyfuDJy57CJ6mRI2HL2+NYtP0uel1nxLVnKKoXQmmIh3wz+IK6DHl3NACnDRAe\n2UW8UgJyaB3zKZ8s9qiD0Nkdn/IyX3/5NG1L42j80smE3I/57MEHyBhuIfEyB41D+vH5qa94eOWb\nTOMgGo+PxX2vQa1R848L57Fl3SD6OfPRhntIuKYc5erxuBJHgWJm8/xRXD5/LWn1P5Fe/wCjGu/j\nRfMlmL1iytJaHcHjw/521uvuPP4zOKce+KDHigiX3AQ7XHyfdQ3Pa56gMDIDn08m/st6TD1VNE6K\n7PYLLZCE2hBKcIIDdQIoMyQ8yYYzklUKEtoebrytOmR/QN1W8eNrhNpnalC8IYS02whtbodghex9\nB3ngzleJrm9l4ZVP8dLKVwg1W3jhood5bM/H+DVqdPFuJBR6v3UKlUtGVqkxSE4uWvgJCd/vI2uX\njQENzehc3q76im6olRO4rWoDJQ/35mTcYT5IXYCkOdnZRkUV4keV4CP58QpUag0tm5NBskN9R0I3\nBJEc7ThFKoRPpiAm10pX2Khj2zXF0B6KQ47/P+ydd5RUVdr1f/dWDl3VOdOBbpom5yQgSVRExIAo\nOuoojKOY04w5jWEMmAPmHJAkgiTJUUBSNw1N55xD5Ry+P041Deo4M9/3vn4za/VeqwhdfatOnXvr\nuc95zn72xvsrmhR71ozk9bvn01VVDfsmE2jcgGpIkKWH/siNyz9l/uy3eOiiB0msaf7F8U4bLL/p\nKpbeejmty+KZfM52ru/1KJ5IDJT9IXRNZ+aEuiaxQaht7Racer7zIQ4HJFDKIP+8A1bg8JaBvPTR\njYBM2OXHubaI4tmiNONOMMBPEsjbhdMCIrPu6vT0mZX4klXIBAmpAuD62Sa5UkJlDJEi+Vn8zhwY\n1T3Dp4pOy5fT/+UW7r/gfZZXXE1hcTzR+W206hNoHpcCExJhVxIUNYJ9Hb70C2jITSf8kxUFIYKS\njCrRS1+KKXsml3CimsP9BpFfVkTGcSsaBUhhMNSAqxLcEYWGWMDsE4Yav4WiVogKdG+IfvDq4+zf\ndz5123KxSzEQhKA2E70tlSRrCyQK5m1Qo6Y1OxOvpGGK9g6mzz9E7vxjuIxGYmqaSHa3oA4LOeZg\nlIKplU9z6bStdMwdjEEVZtBHr+BRBzCYulekx/PzuenWN7DNMdBSveW3B96D/1H8rgFcX+3GqPCA\nCfr8UIr+PBfhXpIQA23zIVvDiEVkA4LhoWboxCLueOlbwkEJ/BCOk7FhIpaOX3+Trt6KqflQlIS/\nZC/+Ji+yHqZt2M7gC8uRK62kVTQIRYmTNYSRcBkMvPvyXQQUKqTIIjOMhCbTjYQY17wnP6DP9jXI\ndKIoggY3ZGUDXjAlQO/hUHEIGsjmcXkJJ8wDoQpq2wcTCke+agpEd4dRvL4iyU/6bRWgzWZ22Spm\nTl7J0tIhfL2oP6JsE1GboxORjf9GrSQ9BYIagmgIRxZXIRQEkZEJYe800lSVGJkkDZCGzAQSlGvw\nD9ag/BGqB/fmsVUv8NDch/jqoT9Sm5/FDQ+8xZFpIzl0zmiaeqdSvr0Pnd8kEB9sY5K9BnffyPvL\nkZf9lTbr09HwUxpOeTAY/jFbwWnT01ihBUognE7YVY67YpyYCjX0W9OHsusH4W8sZ+a7ds7+qRLz\ncTuV89LpHGNCJhgJ6l0XRTfCQGeDxJqnQpi/tNJVtD30/Vxirl/GlUfPo9gpk270Ubasg6Y1Wwk8\nFgX5ZhqW9aLxq15gCQMJ4HRC6VHi4zZx6VvH6XPiODef/fczWEA+ZFS+AAAgAElEQVTi337ufPdj\n9He4UDlF3uxDTcCrJOiClBNNpHxRi2sLqEJnVHYAkcqMRuyMALgite+1797ErsUXUPSOCovFSUj2\ngxYSL2pEVoco/lzHjpMwYEYM+3OGU7cmm4wLy/AjY/adpGjjYJSvuPjbRffy1lt/4dZbXzw19mse\nWMyoVd9jU3eypvMqCjw5RB3YAV5QdMJYqrloZBtvL3wE1wt5GAe7mPl0LUtm/fb578H/HH5nGiHd\npd5mwCsRRj7lpZ6ytoWASdDUhl9QzrVnHWHstmJS93Wwc9hIHtx6E+6iAlqW7MKmiqf3slik0z5B\nr4crqHk6h/l7F6Fq3ofXGmCwro0+a4MQsOBuacc7vC+LX7jlVInBHSWCSECl4vj4wQAoIgF84U0v\nEl/bHBm2RO8jpbibOgXx0QNlVdAcKV8rFaD0Qn1+Dq/fvYgTj40CMyg1fhYvvQGzIdJ+7EboFUUS\n0jASygwf14bfYtTeL2kcGY8lJwYIQ1QMybF+Lqt+gLGyj9aQVng6hgNQ/RZIEu9+/FccCWYqn+uD\np93AHU++yKVN35L2QIOQJpclwiGJxmbI3N/GXzgS+XTiS6pp9tIxs5iocAW4Qzy/52FaLEpM7VbO\n/XgtzmgjyaV1jHG6OT5uECPW7uVPr7xCZZUWraKawshebksM9Otq4vwNlN6YhePjvdCQB8pudslF\nli+YZf0Sj7+aoqn9ODZlIhwsJyffyvW3r+GJJ6eSs/goYa/E/Zc9xHNjniCckgitSkYNraXXyjZU\n9gAJ+zoxF9t5v24eK1vPp7GiA6vLg3dmO8ZxapIfFiqMai/03uWlfN5eRG8CpLxyAOvrZzP/+RJK\ns+cTSE1g57wb8E9VYR4kVgrGkTaiTlppd8Uz4qJyBssr+OipdPyBciris/np5GiO7kyn242p62+J\nl+YvxBjdrTUfRGbGgq1MuGQ/DQPSKBuei/aAi9Er9tGxHlwqyDSCrVOcrVjEztBhYDGfYOdH6j4e\nRHN1FP72MOACbTFYq7FtiGXOrB+5acab5PwAxionQ3cVMGHmNmpIx5MUw77VD9MneJzKOfks+uFc\nrIuH88Knj1GfJwxMds+ZyrGJw5j8+lIu37icgWETG91JbGUYBKGYWLac9FLwppNAjRptHysTx55k\nCV139B78b+P3D+BdOBuIh0te/JKY3QVgAkOdG22Tn7GzapkUX8o5JYXE6ixYykyYLnEw+qXjKGhm\njH01z902FcIxnJ5dGYbbSP9rBWfdsZ3kH7cQlQN56WCyQEsV2D3QaI6l4ILh5B07ztynP6UjPYlj\nE4disNu5aeFLvPrxg4QVEn++9WUmfrWJFMmJxyVqoxJCMcRDZLntAmdEGtmkBtfIHJY/cRetY7LJ\n1pZQ82YOfR45hvzlSvIK1KhsAdFhYYO7F73GG7feRMkgsdma4y5mSHUplk/sJEYtYwoKtL4o9BY/\nKewnLSzkqXNiRDZmjaRiS0fN5/pX3kRRGOSAU8Xg1T/iaKmlojkoPBGTAIUwUBlUbGFcVCV1p5fH\n3cBaUXUq0UPM/v0M0ILHDf33iM3DMBDb0sF1j76LxuYk/WQN6QiGhEIDOjXU1AhXtPy+iBXQaVl4\n8R055HxYTfUVabROjSHwWhs43WdYeuX4SjFPsrHz6itpy4qm3jEQeiVhit7L6InHCbqm0bEhgYwn\nyzj83igabs8i6FaCDLG003BlIu3nCz3x79+ZzIffzuWkqy+iz8BBamYzvft2cGL3AJLG1xEAOtxB\nDJvaT41h7K5Kjug99Lpbibo5g+oPM5jTspyh3p9Yv2A2R3qNQJPlJuUPteROKSG+uoFDb50NaHCW\nllPwiJL068LM+GgX696/GPZYINzVrKagaE+/yGx2r6IsjbHs+mYMYy/8iQlX7+dwQz6LSyfippJA\nMBqTeyA+9iJWYq1AEk3xYznU0QtfyAR71EAQ0rLAbgVbM3hseMqjSalpYnxakWD0dPoYtruAK4PL\nuSPvFdKmV9JywQiiQp3ggYuvPMTL+67iyHlRqKJE+bB8hLDssSdEo3zRR+MaGxW0Im4lObTio7Xt\nKOysAN1eHMUBPr/xQgR7qge/B/7tAB4KhViwYAElJSXIssx7772HQqH4l0yNS2/MwmT04VNpWHpi\nHsWavgQH+TAkxdBc1kTRuXF4xkQz1FZNZlkDQaWCwtvzCZshKs7BtCt/QiaMpU3Ncze7qF1oIf3V\naGR993tFjbaiSfQSDaTEgSkVVqfOolNSE2euZ/nVl6LGR0xTO1OWbYJ0E3qbA6XHy4Slm3ntwwcJ\nK2D0d7uIsjnRJkHAIwo63W0pv+j+pmLwAL697i9s2XI+bAsjuUDndPKXlQ/R/LWL2GlO5NP4ehMC\ne/G+HqJaSiIM5O8tIgboVdHEMH0TNgN0OKHBGxFWlCE7GmL1wvDHFRnM9fe/w8i1ezFY7AwB7JtF\nhVwC/D5oagGVAgJOUAaFkOHP24EUEmRFQ0Vn9+dLNYHXLnpkumY378CJU88nEZHvUoJeA0V2YT4k\nBaFvvzNfv+WsWIJqGcvIKD597XJqitVCU0OZQMLlHgwjbER/00FVVh4/XjkL6YhE88dpYFYQRIGd\nKEIOH23vNxEijyrysC8tJ5w8BAAlQSyDo4AoZILs+iKdky4vouU/nWGTWpn32GpaJQUHvoxjSIqD\nOU98RAtCeaALSRdDzHeVxOTHoTi8DXvNPPrUFtN6ZSLH9g/DronGNKETX60G53ozTYUGqstMMMZI\nYJ+Szi+qSfU1sEDzKVVP9iOzvJjNd07A7zrdAETi9KSj7HBvyg5nU3s8naId+dSWxnO43ExCvx+5\n8LImsldWsOiPC7C+lQqVa4Ac8AyCcA1dSp7gAZeD4b7vaNP3pSYUz6yxX3NZ3Do4hLiAEsGY6SRz\ndSE281HSpgtHHjkU4sGtD5Ea3MKjNU/y5eh5dETF0PxhKlce/pDaazIpHd2fQTkH0FwQhXf6YOKP\n6NCucDKDT4g7X8kHqQtgUYAbW/6GdlUCP9KHHvw++L/yxHQ6nezatYtNmzbx4IMPEggE/iVT49Zp\nsbhj/PhRsfTLXjQfDdB25zCG5aYj7T9B1UE/KcvayOh0cGxPDHvOyiMqOZHNH48jaW8bc25fT5Aw\nYWTCQWh7v4a0502iU/HXEJHu6BxvoiNWQ58Dx+lla6WMfLHDL0O0x8YF764iBPg1qjNqlxKCnxsM\niNJrdBYEHeBrO/NtTjKCzyzz+XF3Ft59iae+n7HeNqZ+sI7tiK9Z1ZXpBIwKfCo1mc31jHh1HwMK\nu4NmO+CWobdWBEKXU/BSTAowmyFOC/YuIbjIQVO+3HhqHF0l6K5P4LGAwyJOcteJdv9sc0wpQ4YJ\n9AGhsh0LaLNB5xTNnw5rpNHxtDkBkTy7EPmtlkixwAfNVaDyiwRckqBfZDXdNjkGBUF2fDuGtoZW\noANinBhGOImb04z+mANcYdyHDVjeisd+IJrsPie49vL1eKLiUV4yhpThbdR+FuGM+7+jq/QhlHRE\nzXvTFxM5/mMigriphMwA2Zc2MmHKjxwvS2bwyAr8O3sxftk2fuRML5/H6qfSFAyQ+ik0t1eDeitL\nfGnUNmZSUmhFu60J2yAHrkIjjv1m8LmEzZ8tGujE39lG+bsSq3UmnOo9dNBMOPTzW/2vo6wAygrM\ndBlY+J1BGqsD4GwhUG4Bjw+RybeAYzdn1vV90FmFnQa8WiOEXLQ31LPUZmbpyXPFiqhJPBoKjfh9\nh6m7V9T9FYEge9/xURsaT66xlZonyrDEmLGsa+dYaTutFUrq+ykwbyvHpTHgK4ki2KBE8jXRgBtH\nUzK+QCeEOqhGQh3+daXCHvzv4N8O4DqdDqvVSjgcxmq1olar2bdv379kaiwaHYJ899Z5tG/QY6lv\nRnZGsaNqFkc1ceSpT5BbXgNmiS198vl4w9lk1MSz9ev+9B/rZc7twkFcpQ8z6RE3Zx/cxEZVHv5f\nUW/yIQJPx4BoBqYXoOt00FuqpH3rVrbOnggIGZVmN5iioDOoZcn91xCSZS57/nP0NqHq5nEJjxeA\npFSwNncr0prioUw9ks/aHmB74zBYUQRpHiFhC7j9Tl5X3MfUB5ZQ2ydE42VJBPUK/KjwFytJ21aD\nMdaJrwL8tSKYOHwQ7RFkla6HAtAFBQvE9RtSE02IUkhXhn164P45NApI0IkYpNFo+XDBlYx89lMs\noRAjc6F2dC++/zwd1+xspu3eRfrJXzolaSMPFeJGo41MfH2lKDNJEigUEArBildm4rTqaGuIQ4R9\nsZHXuTUeTa6bY5OG4t5nwLo4DvvuaFBDWkorl5+zBeuaeO6asYPNV4/HH1VL0+J0RIAW1fy1708m\nLn47qdkt7Fs7gvKCeESxywWpAeGPAPTKdTAruYSSb8VxP+fQvrkjQkfpanDxFbGBRFjrBn7CATg2\n/uwgF5y+n24HPnaPgEXNEW+pY//gDPw2LDWw/rNYIBYWF532TMs/PKaUVPA4AAd7Dqay5/SOmsrT\nf9NPy6LqU/97hzHiHw7gw07EhnlV5LOHYW01LUTYYXvKTh33PeNgA4ieBficcf9yP0IP/mfwbwfw\n8ePH4/F4yM/Pp729ndWrV7Njx45Tz/+WqXGXEa/LpiMU6A8cp+MrD0ujxpA93Uy/85zIMVZ+sObz\nQ/VYyo/GUH40CWhGIh5FhDqoUUg8MHgn5yZtZZ3qUcJ0m/iejjAQkmWyimuJbbaIZsfekFJWz7AV\n26kKglMTQ9nNl+AKhvnikRsAuOzvn2O0OrvZeYh85+d9jRWjB7Es/Q62r7oUdDbwDQQpogXe0oQb\nN69qLub8R3dRpwqiIHDq0ZofgzQ/jMHrxlMC5rWdpFfaaO6ATjdEGYQlpNct5Egc/8gn+v8CGgWk\nGECOM7Pu4hl4DDo+f2y+0OF4YxlV5T4+HnY5HzrMhLXpZClPkn6a1d2JcQMJKpVk7jxyioZ+Wjlb\n2JVKkGhW8M4F87iu6UeWPX8hjY2JiNuMUpwdezPW9bkQTmfzqAuxV0Vj2xFz6ulgWEGwTcGg749z\n50WvsFF7NikLawg7ZVqeHEo40qpfZ0/FsMVDWnQLuhpPZARdvo3dTGk9LoYYD9N7RBmxYyGj2sDK\n2RdDT/d3D/5L8W8H8Oeff57x48fz9NNPU1dXx5QpU/D7u78kv2Vq/P5V5eiHqZHUr2OI1tHRPJbR\n0w+QnHmc/GtsDJfaUNYG2X84mx3L8hF0whaEdZnIl4IoIASDq46BLUzzkTRihrWiVJ/Z0hAE2jqg\n9w8dmBLEnlkwHugPWYXlnPf2tzTJEMxM5PHHHybR20rnkniQYMsVM5j52WoUzu6dOC9nBvCK4QP5\nZtwdbO68JOL3EHGqVwJZ/SGsQm0/ysw/foVa9p6x4N21agyWVhMedARQCCXctFoSOpqwuMBvgwQ/\nGHJc9BlUSe6xcryF/+6Z+sfokFM5pLiAGnU8n435k4h3K+C50X9jUkwsB48f4MvHR9GJEt6qoHR6\nAqMzYqjWZ1AVk8neiyYSUKuY8LcPyTlScIZts1INcamgaIf0OAXrXryDGWW1hMLNiI24GkS4V4Ol\nAZCwrozDujZOmBpHrsgsUxUzTWtR7w+ecZVKijBp91cSbBzExFXLidHsYVifFoZvPUpKSycXhjZT\ne8n5HG/KwVtqglB0RAZBQI+LqDQnrTdlcvCpfJaNeAhY8j83uT3owf8zqvhfMzV2Op2YTGIDJCYm\nhkAgwLBhw/4lU+Pz1rtJu8iI/upY/D6JhvI6/nDfLkYZjhBqVWCxyYSOuUjYdQIh6KyCKD3ExgKN\nkVYNmZBOpviu3oTelrG92oL59ZCIDadBRshoRJkER9trFyyOIAoa09KomjSM3OIKtl00GrXbR+ea\neGofzgZHHc+//iQjvYcxOa3E1XYiH/OfUsk0ZkBzTn++mXQnm9uvxPO94ZQUuCrOh2m0BUkXRm2R\nyPhkK89d8QPsEpSxjrFm9m4dyRv33EB9eQpnbou6OaMx2gupuZ3MnriLiY7NOAoDQBtqApwfWbL+\nO6hPzaHEPBBOtFHuz+ITxyNCd/R2QCGDSfhkfi49DtISREX+XEBPxa1WyrLcLPPMYUfOBDRx4sbW\nJof5wwfvkS+VI3XqiTvRiUYP2f2BA+AjjBYP7+Vfiz1JhoAGLEYIdJleAJZmoAHMSaDKE90mQI58\nmKsbnyGtEIgSdEsPWgwRT9L0Vys5a+MW0lTFxO1vRqtygg7+lPgl9X/Kot19Fm0fJOMqMxCqk07J\nosqE6PBH80HbDD6qjIUHfi6k1oMe/P9GFv9rpsb33Xcf119/PRMnTsTv9/Pss88yYsSIf8nUWAnY\nF9aSkCBx/yVvYu+rJ2hSkvRsOwmHOig6DgE1ZJtbGNS7iRPGfgTsGTAgj3DbQcJIyIQIIRNWSBy5\ntT/BR9eAa7LY4YugfHhf8g8UE2xsP6X7EJsI1hwTVepM9mWMJ/yYxPh7drJ44p2wXkntI73BEILy\n/VQ/MouTj8XSu7ee9H0ODK/40UugUULbhXmsGnQvm9bNxbv2zOCdc/ZJRl+wg9qBWYxc/gNpb71P\nwh0QnQoEYdefsnjtnj9SX5tCtyRtl+t4V0VWT1cVu2F/Am/vz+JtZiIC/DGisPEubwF6+k7rIGl3\nIwrPL0Wr9CpoyMukSp2Nt0Jib+YElmfOgxOVQB34D0KrFgiLt9aNJPocBdZVLYTD0WCKAUUS/fu1\nMzixmdrBKYTWKYmjE1ec+NC100dydEg7E9rfIaTLJnZJBUpPAI5bhGhHpJZcQh6BzFFg1EClSzj7\ngDBH8lkAu9hcCAOxGQBY262UVUD6OCXWIVG0xEbTusWFYao4VCbIszOfxfLBHl588itGrPwBSn0c\nbR5CgyUV0yALrmwDrkIDIbeCAMpT3bsNpUl8dO+VwFZoO/JPrvge9OA/F/92AI+OjmblypW/+Pm/\nYmrsBxL6Qv67NYSy9ZTdm4nFpMORacDstYNWSa3fRIrVzqy+nZRnjsX4qY7EYC2QdcocoKtTUo8T\niTCuwih8rTr0+U5kfZCvH7uejJJa4r/8QSiNh8Abp2Z31giWV03BvjPEkfxRbEy+GPd8g5gFNYJT\npk8me3wl7ffWMCuvEWMCZCghfiA0SRk8wY2sXHUB3k3dwTshupWR5+5nUu46zl6wluX3X82f//gq\ne4Djx2BcP5DccPR1E263FhS6CLUjTHfgrkXsNOUC+XQXbNQI0h5ABnY6mIceSOXWe39iUuEG+ver\nIMHVgakmSHVWLm5LPKkBBRtmz+CrqDl0fKKGvSdgbyGiHHWa/ogKyAKppYS0+Trshb0IdgQwXDAQ\nT7uB8/+wmfy8kxhwMUO3mS/VV/IFc08d7mqEzuNBPPPUHLx9IEn72okts+A/R8XeDWcRRsJ51EjI\nIosLIKO3OFCBMFlv3YMgx+sEbabJSoK/gcmZOxg1KYqWYXoOz+/PznUDsV6zDcfmbt2W+KuacKwY\ng5aVYn8lBM+nzmeTbTq+1+KwrI0jOVBPr9piFAcc6JKg1RRHeUFWZACmf3rN9qAH/8n4XRt5fCSQ\n86cGgg0qNs2ciCHFiQYfVVel4V2hJjhMzWf7J/Hpa4MFHUOxg6EXurjo6t18+lJf1D4/2mYPnlQN\nuloPrkwdIFFxaz9QmMhfcQT9ILHE7ipMeL1Q226g+dwUtjCMndepwXiQ8IwZJN1cR9UDfUEStVVt\nbw9u23gWLpjHApcFY4To0HsoVGszuWvXray9JxbiSyA+GiJSqVPy1vPWiD8R2KmDIgv3XfMUHkQe\n7UJYbNYl9uf1v35Gx/P9YbeS1OgTRFvbaOhMRpXkw++1YmlDSMbqjRB2gO3nmbWM0EcRDJ83ZvTl\nDS7hwfc+Z2bpZpSvt/DFzfezbd+F+Lbq4LVicFQgas6RGv1pUGsDpAyzUT3rLMKfx1N0DfR3vk5p\nqIP0eWZqvzHz0u23kRjdwNiLfqLWYqahTYlLLaFKUKFK8HGsKJrl32Yy8RIfafua6f9CKchgLTMz\n5YItDJb3UzZ/AEGP8kzm2y+8KVQQk4A5xc1s12pmDSli2V0z0Oh9+CpUPDdnIcirKbkkGzSnbZnW\nrwAsuJM0dBRkYNl5mJY1wwXnUwNn21cx6aO3aFytJXVONFuHj+eFPy9EpP9hfmkm0oMe/Pfgd1Uj\n/LvuMr55RM93M8dx712PULw/FwUBVPjYe+lIPG06stuSUZz/J5QJF0H0BPbY7+L+bxYBYZQtQfo8\nV4Oh0s3Qm07SXBFPKKQT6e3PRDI74834o/RUVcBfdo5mceVgUpUW4lWArMVZFEXVPX3BL4K3ro+T\n/PcP0ytUhX3COkLNkWW+C3DA7WOeY232MJCjoM0iPDb9LvC7KF2n4LWXR/HpsDl0psfRFJWKFhgJ\nFIVg23oYm7qLihvzUViDJOfW89jLT7L88ms427yHObd8x9mzD4jTEeeFyTJMiOKfnx4zkMIzs+9i\n/L2fMKH6YTbeDr4v9kLDDuFSfwY/BEBGo5VIyepg0LhKHnj+PXj4E0E6V8GaJ18iMdrOyTl+XMdC\nYDAhq5Qo8fPUunNYdHk8xRMDNL6Wga9eS7V0LkfT/0rCnk4RvM+ARKBeJYyTfwUJxlaitA5Ri1cG\n0XmOM3fqJ+TdbmXS0k9YMPhZ/v6H2yIqgzKEtFC7XYh+acIRNcYWwMeeK0Yw1/sia1unQUcF2CvQ\nhlpZHcxiLk/wR89HXL7+dd5/5GrEnaRL073+V8fWgx78N+B3zcB/mrgYvVlmxNwHaQ7Go1R1d4jk\ne07SS6oHWSLp+gZ0V3upfq4vuPwobWbMptEE09dz7LE8Rt5SSEsgjnl9XsAf3gTWzZBxIUG7koBV\niUIf5P1X7+BGWabvp+sI+Ew4FQlMT9yMvncRNzf+5VTXi8i8XeS+dwzZEmJHSR9OBANnmBzYAwZ8\nj28H1R1gygRLJbRXQnsFEOYwSRxufJNMTz1H1o3mwCsjWf3BRPxANE4hxu/txLy7HLXZy5Pn3EFw\nbgVXe5/jUOhseLBLLPQwNBXAjwaIGoBIU7u1M/4xlIgySzpnMsF/CZXayOhzOnj4kxeoOpHKnyc8\nBmyA6nWQNYtnpt2CVRuG2CkQjIYLQM4S28da/SDU2hh84SBtXyXQsSKRa6Z+ysdjroenOWVrGQrL\nWHxGwjYPRecI84zTzHkEwvDK3DvZvkfF+213I6tUTJ+9lxtHb6fiUZkozUF8uvGYtK5I4i4DJuGO\nULIZ+s0gOuDEZ/Ki8gV49oq7ObTDh8iso6C1lJHW51HSyC7NNKZfsYT7X9rBgc0Duf/SR3FL0RAe\nAaz5J3Pbgx785+J3DeAHN8LSmqdofGUUry9cSL+cIkIhmXAYst+sI3FnB1SGISpM7DPNxMxqQakI\nMKltFw+VPM8R8vEnqPn+rSlcmvAawlszQFcpo/S6gQD0fusE0ee0s/jlO1AvWkjjsl6M8+/lw4ZO\nXjnZD0xC2ESSw2hzXeS8epzCMWNQBXyEkTErJeQuwaGwgtkH32Zrexh6BUFWIFrbJCTZhSxnEA5r\nCYWPU71jDNWDkoH15LMYI3beUN5CNFCxLIeL7ltOszmRRza8StnjA7G/vw+aulQGSxDZoB6aa6C5\nGegF5AAWJAlkxZkllWDgn3f4dUMwXqbM2MQfbt7JeXFLEQ0bu8X7hDVQuZH3swJANvSJRNxjENVm\nQxP2ctvLHyDJQ1ny0miQYkm8PZ7s608SXgaSLiKcFYZKRyp9vv8UpEXQ+0HQyr+0EnMRoWjbyVhw\njNQ7kzi3sYrhh48yfJxE1PBP+PIRD28evJ01nBM5KARUgpSDHA5QEB7EtzvPZ8bbRXxVbENSGpGC\nCUhhI+Bi98z7kDR5jDDv49o528maWkDTwULuV1fyeMz3hFv2oJRDwhe7Bz34L8TvWkIZlQoNimx8\njWrwCWpd3nOVjJt9lKTN7TyY/AzSU2GOGPL5xnQet934Ih602Lwmwi0S/jPSOB0i5RsFNEHt9+Dt\nBKDyjnw618UjE6L6hRzqnspG0RqMNALFAlmYR3Uyet92Bn35E+pULwO2/QQaibb2PDpsUwiliXRy\n8o+fs71DRqSQJuidA6mpQB+uuN3CZtufuf/w13DfxdA/AeHeMxtoQY5rwWybRqdtGuEHlYSMgnlS\nevUg7JtM4EtDZM01CKZ5OsI4KwYRrE4AZUAMWf2q2Wy75IxHVLTjX5z5VGAooGTTmhwWzP4UQRM8\niDDsykUUfEZGxnAmte7Wb97l+6KLTpv3KBKvayXlwWoKdylZ/TJ0DjKzfdloPnvyEgbuWIGwnNeK\nU/QPfCC7PJIDKLnoma/Jy/2IT9enc//oK7jkm+vYPymDL1+W8ZzmWI8kQ78ZPFGWQ/SV9Yw792NM\nh5rotcbKWTYVr899iUL5PHZJlzD3uztYsHQ2H34wlQG3rEOtgxqyeGnoZfTZWkfmzElUbnjqX5zD\nHvTgPw9SOBz+XZpfJUmiI03LvP1f4zLoeWv7HfTdVIqiJojsF0O4J2MRVTU2Hjz0BCevmMMzT/wV\nldmPv0xDzEY7zyy8l/raZG4e8RRO6yGWV3zAVQP+iMPqgN5XgC4J/DJZz5Vg/9GMdXssSfPriLuk\nhWsqvkL7ZgG3fTIH08wosr/sg8IUIISCQKOS4kuGEnQoiWnr4POTc4iSHNwx/iEKi7z4wy4gChQG\nkI0QVPDne1Yx/9G1xO62snPZVO6b/Bxp+TV4t+q5fdTDLJw8F0kehznBBzhQu5dj0eYRSr+QYCCW\nsF6CkgB07AMqIGMIpPSFxkaosSE214oYfXYN7z/1GSkPtWOOt4lSsErip88HMiPhK+ydZrojpJ8z\nxZJKEQT2AQj2yQlEa7dQsMvMb+H9VUvou6iUFe/ruOficoJrWsG3FhQp5G6IwzQsTMV3/bh9+CKm\nD16Py67ioyeG8E3ZVSQ8lsPkY+8w+5s3SPuqD0GjAjkQpMADa4oAACAASURBVK09hoOeITz7weOw\nSv/z7Qn6vlzIPa88gHrbZnI0YVKUWiSnD43TTbNOgcesIs2vwdYpg8JCmUlDS7sRheTjQnOYJoee\nQ4FW8gwhJLdo10/PNhHwKgg3O4nX+tAZwBlW0+yANpuPeCPkxoPHp8Ch0hMyqKkplziod7Gw877/\nrcu+Bz34H8AT/KMw/bvLyb44aSFeCY46WqlyBhjbD+K7mnB27qJvPzfGD9M4UKaj6akTmC8eSe2j\nOeTlCY/IUJQKyw39UZ1MIybpTSS5FlBA7R5IPYesV5qx7YrGONrGPfWPMfnhDaifD9DitVPZ6eOG\n2WlsfPseZJOTIEq8VVoqrs8n0KlCnehj19yJZNxZhawI45yZiz8xE6xhKK8ASyOkp7DwrmVcfc06\n/EYVDROSqaxyEtiwgT7pHq554WkUsW1sHVbMlBOPYLl4LrzXCqE+go7SsQ+yJoDeFJl+H2CDxhNk\nzGsl4yY/+EO0HEym5OWZFP7UzuxrzkHZEsm2JfGHO1+D09qlAfMToiYxkYh2IaIkE6kHn4EQgo0y\nloaKDubPGI+6oxx7aB/BH/ayeu+j+KLC9Flay9/ynqAitjcP/3ATvR/bTGI/J70SYYjjBBkJqSz6\ncDxr99/J9tYrGHrrfh78+C30TR5GPVLI8LQSFt9+F52rdRCSGPDxIdQJgvFx972PM3bbdoqdHpxu\n0Ed5MUiC6Z7sDqKWg8TFePCEoaYDvO0e+uJBKUGSASSrnclAs1PsHARCEGWxEbaD1wMFfvA5wISP\nOD0MSxGKiwEnuDqDOLFTpoTJsZAQ+semEj3owX86fvcAnlzZQCAIFYi+w9JCKFHCtw/fxrKW+Qxf\n/inHRhQSMvuwLNFiP9gbf52acLxEABU4HPD5JwTc/Zg/ehEuWzFgB38lNG6lcdEoku+0cuvWZ5m1\nfgUpXis4Ic4B/fQwu2QNEz6QePXhm/Gc1FN9Vx98LVoUsQH6LD7Ctlml3NAngEYJ8rbloF0oWjlz\n86HcC02VZH18lOEHSwhEK2ieEI9P3wv76nYcXhtDHq5h99Mw/aIy9jc8wIlViyDkF2MkgDGgQq41\n4WpUUOgFCTuDJQ+ZShl5iYLADxGBUIeamgYtja4g4WoIEsKbamb/F3ey8YoLoWwtQqVJ4pllS0nN\nbuC5m5I4cSAfKOG8h/ZwXdIWYj6q4vBhFW2oiMFDcqabvH4qTq6PoqOXguRvMrFaZO6dMYVVm/5K\n0hAneU/WENXgoGlZNvYrotnw5BWMurWWvLofabs0hfdKZ/PFx70I6vdij5qIXRVDW71FOOAEQ1g6\nYrk4bhX2GXEQEKuBysf6krP4OOp0D3HtrRicHgYA5SGwSpBkAr1B6JC7HeCQQdO1KRq5UKUQHG2F\nyILtVGKfFwdGNULSICz0xMKA0QhmI4S8gpATCkF7AIoBcxCK2iPGOj3owX8pftcAbmkTzY4Soirr\nBQIuSDOBlGxGdwX0t7hIeKuNgK6eoEVJsFYDsRAeFjHICoSgvpMwQUo6xiB66A8BCvCF8B4opeVv\nLj5sHMhK3zSmy6uYN2gpKQBH4NDwQXx1+eW4jxmpfbg3nlIdKCDkUVD/VBbt1RJHP8vn2QW3U13l\nhKyAmCWdFlL6c4/3GeYpNqFt8lJ/DPZoUjg8eCQ5gzqZfO5Rjr0GvfygbgowQllDYv2ZKn5KQPJC\nwAuDEXPRHoaQDzLbIc4lBKycdlFNr0d0VWZGQYU6iS0TYhj17UHwwhPrr0O3zUP/DSfRGr0MjLqN\nnWYjrVYHiUutJGja6NvuJMYIFQ5IABJt0L8O0mPghyaZ6HuKiQ4r2DiwAMdfKmmTVEhPpPPCPddy\nZGMZgS2TaDBP59I+S5BvrOGNwuv4ZNlomttcoLRAcimjLmjnwYVPCx9FVPjcPgqWHwdp8ClCjKvS\nQPmd+WQ9X4KMuEl1WYkGgVaP0DlPjAh0B/xCVyUlBvp1QjmiCOQ4jbadHye0zkMOKHeI6ylFL7TM\n3Q7hkhTydkvidiJex4jwKnb4xBqlBz34b8XvGsD9XqFFJwymRCW2lwk23n0VBVNHoE9zUnDvJIo0\nozjyqTjGMNRO3pStnP/Zy/Q1VNA2Kx8UasgbCMWeiCuPGrE56QevDffRECcwMuWuZgarWkixg6cR\n1k6ZwpIHbqe+bwqaTjdpt1cRbFRR+Uwe4YCEsyia8SvicIw2c/br+9lzQx9cSGLAbjjL8g4XpHxF\nekYbrXXQUAq93eXcs/9rWkpdxL7fiaIAlCo4/gMorJAVcQ2ztkNTuLu/MtMMSSohD6vxQmcQGt2g\nUAmThC6DXScQL0GiGgItFv566eOo8REEXLWHMTcEqCwTE6qngBHuiBlOiTi5LUqI00NmfIQ2HQRH\nOehDMMgbomqbg2QZEmKs+Nuhf5yPjU830af4W3Y4ptAkTQODifeU9/PNsTqKq8M0V7kBjdA9aK0j\n1l1CvyFFOOpM5LxdiyUgQ21Nt1w3gAyuzZXU3NCMp+jnXurQFoBgGDR+qPeAQQHNA/vwxt03Ym3Q\nUPddNPdd//Kp3x/xRgHt+4JkacAZEMHYhXiNTDNsvnEWW887G+uGWFq/TACPn6z+hcy9+nOGLRWS\nqH4P/LT///Wq7kEP/v/hdw3gzYjA1LVq7WWCH+6ax8r5c2hKS0QmTH3fXrTMSKP+QBucqEWV4CM1\nr4I+B7fRoNERmiWDLEFMDEKpsBBR87UiGlu66sJxVO3ppPzaHDLP6mDHVzF8uHI4LTsgdYAfOSaI\neqoPT5nulE+nZAbjzHg8yiCjzilAZ0wCnxjtDc0vkdfxJjHp1aAVch5eB6TUtaFtaSPcAbqmSEbp\nh45GYYigjoXSTpHx1lrECkSJcNrJ0gpWohURqJNUYFCJj9OJsCw7Xelc4/IyZvVuQJQP1iKyyS7O\nupfuzLYL7gDEhoWzV2sAshRgcYvemQFmMFhBF4LWDhgSCxoPDPjByrDwAX54cgGt+8wEq+FQ9XAo\nyEasdnyAAYwxjJzawM0TPyPl6XaCDivRhTYs/IoapQ7wunBsz2YRM0kgDzBhPXsgWlcSY3N3cVHW\nt2jXN9E2oh/vDJxI6aoE9q/7I0GHEl+xmte+h3sXvw1ATeIA0p44wYOmp/FNCjHsjXc4K1RJXAys\nOO8K3jfeysmN+XiqdLjVfrA6ia8fCXV6kp95T6wWOiVynqyFA//eddyDHvyn4HcN4AnDwByhLj8X\n91e00zUUXDGUxvSkCO864ocTCAsPMY8FbOWYgBw/NLdLhJDFHcAuITbjmhHhTBN5KBDFBwOV+3xU\nzD3KkKElHP8hA1uKgSyDg4aDg0kY0YSvTk3Dm5mnxhdWgRcNEiHefegaOpq8EDxByr2d5K36nsym\nql+0yFi9YI30I/2cLRcMQ7kFWpzQOxpc1u6AbPGAzyhGawEMOnFDOzhtInXqGPp9/B0FQ/vjvmoM\nF+xfyd/WDmYh3brrMoKhp+G3T2JsKhTNmkihN4YJS78j1wTKKLB4IdsoCIR2KxAGrU8YWGSG4fNH\n58Of80if2ELL6yrmZSxhpHU3y3WT2Ow+GyqVoNHRa0A1Z/UvxLTMBRI0aFN5JPFvkDj8zIGoACkH\nULKTyxAUxhxoVjPjgiOkXWVl55HJLG4xUhfSspextNXHwcbIEuZEkL2to9EtfokQMtYxRhQP5rHy\n2TjUk3KJWraUKa5KEnrB8YlDOfrjENzfR4nJMbrADzFxDeSOr6BjvIkQCsJuCa1Xhl/XXutBD/7j\n8bsG8Ledt3PDI6sxRLvY8kkOtSVpqD/OJvZSL/r+3ZxmY66NyUOOEC0XsG9OHiHEhqe600/W0jrR\njRcApuhghyRMK1EAXkjOAlsauLyAhBIJHR6U+MkaYGf8jFJ2tadgR4+kDqFK6jbVCgUVvP3ADdzw\n5Gds+Gwy9s79QDPm8SHsP3mRD4JtVCwnz4tBmWwhS9ltiJsIeOzQVN79eSVApVHw3UM38t1HGZyM\nltFZTqAIegAzcc5m5ICDJowYQlriXXCoNo8ObRSDMHLcmYm1ZiylbUNZ64qmnaGoDD4mP3yCaRt3\n8MM5d+J7NwnJLEF5Mzi7CsQNiDw8AZMfyuqTqfJKFPqSKcgKMu6qnfgb3ORsrUVbLWrEZkTd+LPH\nF+DVadgwfxa+ODVxiS1Yvolnmn4zk4duZp9rAmzPEkuESBeBM1uP/0Idqeub6VDG8nnCDb8kvwCQ\nwOW3fcTetUOpKx8BxMPJAkbcuI7hI8tZvPV8FjeMhgY3lCRCwgBR95EhKsbB/Me+RCYcuV17eGXH\nAtr2NaD6u5GYqVqsvVJ5d20vdr4bwG9tErIHMqDTQ0hPavYhJszaSwhZGIDooGVS7P/VtdyDHvwn\n4J8G8H379nH//fezdetWysrKftW8+L333uPdd99FqVTy8MMPM3PmzF99rddKFtBUkMnVf1mB/8kA\nlmUNxMxPQJLPHIZhgJ2zxhynV6iGwxfH0lyewt77LuD8yu0sfTsTWesj8aY6mvalRYKIB2KTQGGE\n1HTI1cJJL2eN2o/brqVgZz9kTEQRwyTPZswVDt7230TcoGaS/1SHwhACLzSu7MWXi67l2ge/Zs5t\na/jieTPWNiWt38Wzq+U6Bo6zELrIiSNOR6auk/jepw1aBks7FJansU5xPRh8yPZiUsN2vvBdQJMt\nl1BIRjTU+IAccLci6H468JrBa4KdEuDlEOOh1A6lXkq4FJB5k7Gown4K/MUUBCXW+MbRER5AOGSM\nuJ97EHe2o+I1GQCtGlhzDGikjCnUJHeSd+tJlO1BqnqH6bWqDu8WLcvvvhKAb/7yB/w6FW1fJRPs\nVCAB3nIdDIZ1rWez76gRTlZDKBNUoLYFkDzQNjGa1PXN3fPxM3ZHxpwK0irXcEvCBwyYP40qVwYQ\nZs/3Qk63YEc+hzdnIwpBRlBHg1lYgiUYW7lz9stMvXUtodPWOUaVA1mSubh8HYPu8aOzafi+Lo8D\nBdlCXlgPUUOsDNDuI33VfjJqKkn/rIXQaYbbRoeWHvTgvxW/GcCff/55Pv/8c4xGQQ24++67f2Fe\nPHbsWF5//XUOHjyI2+1mwoQJTJ8+HbX65+IXcGPKN2i/CpHau4Xzz21iUnw1RdcbsOVn/+J3Nf1B\n41DhLdWj1qqITojCaZXoyDWjvzKXtJsqmfHqSoza/dj8TnZcNwl3opGQ2oK1SmbIwINce83XbFs+\njkNbBzF4wnESM9uJ9XdgrrbT0Z5I7KAWlHF+Um6rRtPpZdo73/H9LZezetelqIwWFIoMoIH2j91s\nV07mxj+sJjb7KL5mD550NXUZyafG21AVz9ajvTmMkSVcC7IKwkegowMeCyIc0iVIzBD0ivYU8KYg\nqtitkVORhVAb7DK+bEaQ3toRzTgK/C7Y8uhZbKEWdlgjr2tAtN0nIG4OMYgtUH/k9WMQwV1Pc7mK\nn74dwtiLD1J4XharVqbRJun5KOFKQIb3fEh4aF4ci9+fDQoNhMAzQ8Wu7UMo/lYB8bWQmAleG+rD\njcR/bEWdEtmedbvgyBFQDD01N/GXN3Gt/Bba0AcY3rdgfHcsMU4b1PnR6DQc2DWEnT8MYt+GNE6v\n/GuSPWQPKuH8jV8xJesFnG8mk5Uu0zQrgbAM8+5byfcfnU+MIY6A0szeJenUH0sEOR6UJgxD7STN\nr2NS8Xomf/AyLW5QvgAp3acNg7+HB96D/178ZgDPzc1lxYoVXHPNNQAcOnToF+bFCoWC8ePHo1Kp\nUKlU5ObmUlBQwMiRI3/xen/Pe4oYtQdWwP7zBkFWgGO7bbTWaogZo0Kb3W1h5oyDjngFwU4labYa\npv5lCbuzzAx/J4419WOZ/snr3FL9IqnJITrCMP/Pc2jsayeEjPprD9emL2HEsAIaaxKJq+9kYto+\nHFP1ONBTP0xHeF05YWSkCC9EHfTwcO3dHHlpFIuvvo3g6hbwhIHjYC0DivBGd6Cr8bC3YwSF2nx6\nD6ohf6RQ4Nu1sh+P/P1ioBOCJ8ESh9D1rqS7nuADnRKS08GpZuSEH2msDFNf4aXbu7ErdXUhtjf/\nUYCJQfDAZQSV0okohHQZRYAI/KfDj8Mq01CWghovnVYTd679A9AGd7g55Z4eHw8hN2gaxC5rVAKO\nPC1erwkKc8BvBBXkJB5ntH4Lhk1uDDGRc2d3wL6dkDcUSQ4Te2Er6fdVkPRIPXgCVDbDp8uuoODY\naDjsBO9+CjEi9GCqI59XzJcmy82IubtY8PLfKSwC3Rf1qPpLJKokWqfHsWnlBByWGBadmEt68zNU\n5iXQGBcHFc2ga8M0QYVpSifKYhkz0OCEqkZI6XXalPTwwHvwX4zf1EK59NJLUSq7Y/zp7ZxRUVFY\nrVZsNhtms/kXP/9VGAA1/GAdz8uPLuCWtx9l918VNN7sxLFbdcavNu6E0m8DKFP9hJHEZp0xmSeG\nPohhhZtbbnwebzAEuXD08im4zCYCqAghc3bmRjIP/Yj/i1YmjdjCtBG7aNsUS8nhbGRCxEmVpHr2\n4ajq1scOaFQcungiKtkP9WHI1oJaCQxCMJDdtOfpOLkrm6ULJ/HCDdex85uxqPDTXhPDiR/TEEG3\nDxGTTESAbSFiNQPYoboIvC7IgLkPfcuAsRsBBxiiIUNPrwn1TLlsF/1G7QMaQRUDcWaMGQ7Ov2wz\n4y/cd+acxsSAIgfBrPcDgdOeNHA6jyU1o4l5C5dz9b1LIybQemAcIuuPR9wUjBCdBlHJQm2x/gjj\nEteTHN1MMM0JaVGgSQAlTBxXxHXztojDgA5VLJviLwS5r/iBDKbxHUjKMB+9eAum1Dgap47AuT0G\nXEaIikIEaz3C2v20Eozfg7mqggHbCogBJgAxQSgoCpPzUg2yN8Sb995Ae+NQIEDRzlyS0jqJT3OL\nuQ9zRnDWRc5A19Uc0CuoHZrCmpYpv7xOe9CD/xL8W5uYstwd7202G9HR/4e98w6Pqlrb/m9Pn/Te\nOylA6L03xYIFRERREfWgqCBgw4IFsXFQz7GLCHrEiorSpHeQ3gmkkN7LpE5mMnXv7481KSjnPe19\nPXp9ua8rV5LJLmuvvfOsZz/lvgPw8/PDbDa3fW42mwkMDLzs/oua1QRUwwe1yZiUBroOVBNhKiHL\n7QXa+F9tH1Jcz8ANJwnXVpEzfhBSQgxGPxu+DzRyYNcVRA07QUFKFx645gkMvgGecjqJyUu+xLD+\nLGYt6O6H8kej+P7YBCo+DuXRD1aQNLiF0aEuvtoZh9+fBAFWi68Xb3z1Ik2Hg/Dp0USy5RzmchPe\nfQ3kXUwjPC6PElMya45eyWGTD1DrSZEqnN6bzldLJyOKrzWiBVDWQVPHq0kFzoNXGCga+l9xgtDo\nGiAa9OEYh8aTOKiKqeO+5uorNrL5824svut6NJFufG72pWvweVb8aS5nNelMCP3ac0wnJCcT4NdM\n96ajKN4uMs+n0lAj/hpMA5FdqlEnmZBLaxgZfYbbB/+E7mIgTSk+f+cu2yH3fIffJa7130LLRR2l\n39bAvp0Q0IdovIg7chZ7aUvb+0WOMZVH4lfCAfG74pIoeKQrSe9movZ2I/fpzdpJsyj/PFU0BEhe\niCylmvZ+S88z1mLFf8c+Enfs4ABJaI0QO8SF7kIx9YP8Obk/HYdNC/QAJFYsmo4IGx0GGsBWj/2C\nDvMeNc5GL7wH6/H388Hs8mK7KQ5buJ5D3Qbw2qszgG//zlx0ohP/DRTyfyJqfDnx4kGDBrFw4ULs\ndjs2m43MzEx69Ohx2f3Hre3PNY8c5jvvu4ko8uOFmYu5et8OHmA5B7qGI/6rBYwBcHXaQWZXneR8\nXhce3/YOAL7VTRQtS+YvIYt4adHDTLn2BZo/PEvi1+noUiMxpDpQodAD0UZ9fK+ajPhIqmqDUWFD\ngxtfzMTbc6C6+pLxKS6J/D91pdfhI/y151SKrdWEPBDPR7ue4ar7fubHZUM5vCkFKCcyppHouI4h\nCkk0GAUEY+gSTVLTWRqsJhoGGNHiwuf4cSrDfNAPSiMuP4/FjbMIu1BBEmMZEGVCmqbj9tgVjC/c\ngPlkKNENtXRPrsA2TM+oqaeJaypCXtGE3xXNDPE/Bt55ZMYEEOs4Qf85J3m4+s+44iWW/fVhsvbq\ncDrcdJc3M37sKfz/lIz7xxbUS89ScBxGTLSgPBmLd74FMINkAB9fMJvBJwIkCSwWkG2Ak+c3PAIb\ntAhyLCs0VHG9ZQ0Tqv5GdjiEpHimQEa8BIR3mBYd5D/cDVrqWfz+a1S8l4Ct1Eu8HLR5yK29mUGI\n0lBRIppBNNNYANjxCahj+kI10xf/wOrrevDEtU9iNftzKdSIeqAGaLxA3fve1K2KJXdEKpkPjiM7\nLZaLxxL4eO5UcY4Nei4Rku5EJ34XSOB/VdRY8mTt33zzzV+JF0uSxNy5cxk5ciSyLPPqq69eNoEJ\nIKFw0ZKA/bt1rPp8LUO3FqOqliHYDM2X/iOFjzSi6tWTn3VhRB+txtGgR+vlQNWocMPTX/PaiNls\nvS8R2V4FaCiY1ggRvRn+l/N4m1uQgJrwEDa+8CAr3PdTt6qSySNXokJGixPvshxYvx6eHthhgIIf\nHLWCSZvC6P4SRfPKePitV/GO9madJRyRFNQzfuIRJtyyv7VyXcDohSEshmEV23mpeCIHA305sOpj\nApwXiB+6gE0TNxA1fQ+P3v8MFz8toOpTeOz6LwkK+JKvLt5O0YkWjn5QT9fweu4akEO/ObVsCBjH\nfUPfoBHYqIc7N55ke/dJ+PSF+x98jweuupewm+rYhTCBz6cuIDwUaqvgpAPMK8BrRS0GhG1VNUDu\nWit9srKxt5iRtGcwdktD6pGI5cc86N5T0PtlXYDGPNHjz3HPBYYAYQSHVpMU08Rgf9pC9G6DCluQ\nCurqaYuptMIAFOyhYNYQ8HKDygwWIzhlRMinHGH9QxF6na3PwrWe7400V+zkwyt78iG3w4hWutuO\nj68ndELratIESGCu5IfNffhhs6D4FauGjFhB1PzGlbSd6MT/Kv7h05uQkMDBgwcBSElJuax48cyZ\nM5k5c+Y/PJkWB1ccWU619RzHdX3oEmElkAbcu3bCgAAYHt227YmYPuiCzFyxbzuW3VEU25KJH5dD\nyx2+vHZiDlWJcbz20wbcdydhKPoKe40/StUhbr/9TYLJo1wVwcqZ89g9/CrUn7vxqrXh3dyMu84N\nQSoMGjdhPhZkVEIQF5C0Ct02nAJgbvgX3Lr0U66b8wX2e4sJ7eaLwWQDAkGTxqplY7F7pfHg0pWI\nV3crermRUc3bWVk8EQlIbDTz2LjbKC+DNQrsWncF1hWC56MRYbqKN4JPIMx4/yuazeLFqbQKjHtg\nwNmT9LSdpBYRaNDYYecR0ElwbQksWzuHqmrhr7aGMQpz2kXCgj1f7fMvzFZjI+w9AoVaFYa+erqt\nkTHKR/n5whUoVs+C1LU7FESByQGu4+LtQuVPgL6BuQ+uZ1biFljdfmxTQhAHRsfBrd9A8oOX3nhf\nQNUIFYdpS5RG9wPFjCgob81/mBDc6GG/eHL8EcbcIz5x2cc2G8Fl7g8kIZLHBYgFV4eYJW+EES8F\n+iOMeacH3ok/Lv4L7schoB/PTJsCP71Iz1FnaJgZiKRWocgqJJUwppWEc2KNL12fuUDA1aIe2CvO\nQtrK8zSOC2DChf3UxUSSeuocYf5RHL9/BJaN65jdPAlwQPBkeK8nvAeSUeZW1WqmfvsNJqMXIR/F\nMSKxmIHTf2Ci41bCdVW/GuW3jWNpGVvHXMPtTPLayp6cuRzVhyAZZJQoX1C8UdwSjkYd9hZRzjfA\nkc9HdYvbuF5KEelPFcK3VNE+4a3m5JfvKv6I5cCogKyI7Vr108d7Zq+1Cq62ElSyWAhaj6fl11BJ\nHj0exdO5qVFj8TYipwXj98lwTqTEQZQLvCTUPm5AAR+Qp/mj/FgrVpWIBAhI4ukhT/Bo1WdoDrYP\n3q1Wc/xkH5575ynQHL/MCECUQdppZWWk7CIGZDQYcBp0OCS9J7EKKrcbjcaFzaqjnT0GxDvEXuAK\nz+8dH9/WssUziFBMsrgOTAijLXsGXIgQrgBhvH/+O+PtRCd+//hNDbiiSIj36TK+2fU0EQPt2NFz\n4woHNUcSqM4OIaxbu8isGtC5EMUdikJMZiHv9pqBOTQISS+TXn2C8wP6k2nui6QogtoQT2dlB2sZ\n8WAp+w2TsJbGM+/F13EATrMN51499ZYoIh6oROnQ3AEw5/znZI7vx+1vfMo9BZt5YckjzHv8TT67\ncAOWn/whDb49M41vAyZ49iijbnQuO16+Eq9hW4gDtJLor8mXPH6j5CmOkCRhTVshCRKBXEThXzBQ\nbRWt+F182kPFRklhnHKpZIMiSRxSFALx6Oh0vAxFmMRIHwjXQJPI13JqTH+e3vY2thwvqibEQYID\nsrdB9wmkbzmGxk9UsmR91AcrR8QNKLuAhIZd6xQGB8LolPbTnBjUh9cnPQGPhIgE5t9T4AE6tmg+\nw2KuYjvfvjqfL/wfx9tmxehjJf7ESUaP2cTTk2cDRwFfFGmAuMfICDLiAmAU8MtGHOXvVAYW0Fbl\nIh0FZej/NMhOdOIPgd/UgE+JW4nN6gVoqWUTQYi+82RyCTNVU62EXLK9DvDpAnK/AvhsFQzxozou\nggcvfEW4o5rzg/rjtmjovvUE715/F4u2vsbh52/DuXc9VB8FjQ/4JFL5YSxICv2nnGo7dm33IPQv\nOCn7OJzMHqHMOf/5r8b7U/kA9MPyCZrlILcFqpxaop4qwu+JJir3xVL2eghimXED0WTvuZO3n+rO\nS01O6jzH2CwJQwywXYLH+vfEsHw0U59fzIC9p0gZDC+bruXT+seRRw5CsVQinSwFQGqpRmXLRiGS\niO4WXlq/m9tuXydCxh4jeV/m1zw3cQGx2cWcAOzf9EI7IRSAz5++kp/eG4LUXIiKShRCwCsGOX80\n9p46oXKgaYGcXW3XnDGqPScg61VQFwuUQXQ6bz+9yikQIgAAIABJREFUlJQTy9Ec6DBJUWDp442u\n6iL37p7L12mz6Xn40qTLyfHDcfXtD2dOCRYwjxcegIPugRDhIzO35BWmvvYZKgka3TK2T90UeX1G\naYsbZ3oSz65eysvpDxKvhgK3it0o3KpWcdYt0UrC0FcFlYrMUuVV9tEP4W37IeLhojQnaKyGpJcC\nOT45CKo7Fek78cfGbyqpJvQd9Xyw52l6Dsuk22t5+GZYULQSsyM+YOuUcYQNbf+n0rTYufLiDsau\n/par3piB32Bf+nyXRkN4EIpDxbneA+m28RT6xBYCTHWcumMYjVlBKAabIHyWdWDKhqY8prOdmcav\nsNytQ/+O6Pxsln34uWgEX3x9N2HPlKG65HUd/KvreSfnUaxJ3sSsLOVxy1scvGMwwT2r0NsdVO2K\nIv+NWNjVakIUug/J5MNDC9qO4XRomJayDLfLBehorN6GFBiGsSkNnR20utM0ySaschxoh4IcDs4m\nREVOPhANRKPWuPALrsJYXwduGdiL7I6lPjwEv9om1C4XDkaiBBmRDKIpyNqkx9Zc5jmOH+AvyMhV\nntiHlw/0HCp4fs2AxiDcfQfiux4hRqHIvFA1n37KKuLjrXQL95TIA2tCbuaJ6//M8MBNTH5yJQ9t\n+ZLo0DougUnFufsG4KhQQcYhsDQApfgTgJeqAoufmivn1/Pk0LXkmVN4feg8/KRG1EDSiWzufno5\nt53eQJ+qE3wkP0TIFw2sXgyT/AQfeEYNPOa8hSxicQPNRGAngJGP1fHw+D0M//Qo7BehuaMjB/Hu\nI3N4ftgs9gTL3Pyyip6z7v93HulOdOI3wu9FUq13GGS2EBjWiKSV0bS40TULhXj16R2QHARDQ9s2\ndxn12P186dGnjkWrjrFoxkBO3pFLyo7+KFo33X46iT7BhqJSMfee11g+71GKuiZRsrgL5sP+xM4r\n4K6T73LD6g3E+zRT1dKEZYuarstk8h6IxVvVTKg9G9P3W4h4Jv1Xw20MC+T7+zT0e8qNeXZXquaf\nQTnlCz2Dceq1hI2pQGpWyKuPg1PNgISEiqqLYTx+43PiIIqEqSQIRdEg3OYboUaNmYtAIzhiEA0/\narBrECnIswjrmYxQpbfidumor4qnnlhEGKFK7FelooYoz4jjRT8M7QRd4g1B5fluAEXnCSu7wVKH\nrnoPqT/4kXF7f7G5BJQdFARhcQPA4Mei8odIb/wKlWyl1gplLkj0lO1bs4op+vkCAX5d6K5XoQo1\nXFqZA0ghsgiD2bSQNgAuZoE5gUbKaZQd0GBl23tdOfG3B3DIpZi8LqDyVLIcbwlje+VMKntsZZcu\nitHXHELz+Qc02WVerhXxfZsLKvHH1pYBaAHsnPwshsfX3IhXfRdxfsC62YilpZjFaz8kY3oaX2bb\ngR//4aPbiU78HvHbGnCjFiQjrZUI2bMTSX23kLq+/tSs1Xlery9FXmQim8dPYKjmIi+sz+PVPYuB\nErROF6/fOQudS6QMv3juXurGBqP1thO7OA/ZrEIfbSM6v54gWzlyH8APqne6yTvgQHpAQYeD5PhK\nbnq3gU2fp5MyPeNX57dWQMs9eeiXJ4PbDDZRtSAj4TKqCbi6litKtjPA/ztSl0ah97Fjs+sozorx\nHKFj2hIxCEC4uR6x5LZuySqEdQ3CI6yGSIVqEVoyfRDG+wSiTrS1nC7Scx4XwnXuaEDjPJ830J4S\nBbCDXIizRKbg3o6sXEBUD1Bk4l8v45G/zCE6cwNGuQkfwO4ARwdVHOwu5IIybOomWvr/avoAEd/v\n8s4F8uZ1w9HkJXhi8Ka9EbgrzaZ4mk2lns98EQG0auz40oQWsgJxaSvJ9Z0Eld1AUf1KLPmXsJji\nsJgkRNpXBxwDJ6h21XEwX8Jm96f6yKD/+SCd6MTvGP+FKhQNMioUJKwxRnIeSORvH0xm/4FQDIPU\nv9q6Qh/B9vM9mLhoA7PSi0hPsfAKjyEpTpKPZ2NwioRbRXIMNm8jKmQMCVYUVNz019WM/H4vTjfY\njdAlHCquT+fQgkEM4wwSCoFGM1fEH2LNvCiYnvCr8w8FvLNbcDychzvtAUhNpVWIa9i3e7h2+Tq8\nKmrR1pTBq0YSxhnIuDeFt3YID1zjkkl7ugCpG3y/Dva9+xy6OCPXPfEJulM57HrmfmrH9WTksrWk\nf3/wMvOl9nw10xyRwIYP7mfa5GcBIycQldlqDLQawz4JEOIPFbeE8snpaez+fiRigWhg4JVZ3PXU\ndrJPJvPegnsAbxT7MSynVJeo5/y1ZhYR7hq8l5ghJxON20z7stuODd1uYEnynXCmCOQC3DVazOuD\niLixArdZTf7s9oMmvpVNytLzKA4VRUsjsWzJB3MtYiFKpJ3dXE+7FpEGsYi5gRrU3nYS/5xJ3pgb\nUVJUkLtXyOp0RGwvsNRx09RN2CyVOOxqJt1/mmM7+rNqST/gJHKzFluGN6jOCQXkTnTiD4rf1oBb\ngQmg+AkPUY0bS6KR7PJkTGUGjGtC0HYNIXCCqW0XJ1oa6ow0bDFjyjczZMFh6gkkgoq2bRZ9vISq\nmEhAeHsKam766zdMfOc74mqryPES5qDgitF83GsWiREFxJ3cQnG/SNS4STUU8enQd3meTwik/pIh\nByFYRorPWlFSAjz8HRZGfrOTW19ZRWJGPhJQAZTtNzNQa6VfwwX6uS7g9lKR+0Q8vt5WXpvXk4wB\nk6hcW4RKbWRb6c2oOEbptgZsmaUcOBfLBUaBVzS+E4IJvl1UTCSdzWX6ohViLppy6LOinFQuAMKn\njKb9JrYAgXWQHgpDSo2kufMo7REFihWwobFYCf+ymB69Svn5jWs49XJ3aKijIyXO549P55qj63B/\n1ULmEWE+jUBcGviFgdsBXh7Hv9QVQ2iCkR9u+wzfgmbMoZG4ysQfFZcK8yGPMo8WCp9IJeGVHGo+\ni8JREcwIljJl3F5iTH4UZhpZ4xzIIcYh6nUsgJHwXie5aX41V23dhul0II8vWkLN61EowUG8XT2d\naP8cVB7ul6WPPsrxHwdxT+Zqxum343uyiLMT0gmJ1nLzoT1oci2sIhbBU+MCrQyhI6F897/0CHei\nE78n/LYG3AkkgUrXyuoso8aFCglQ0XKiFttZDUy4dLeQOBhzB/ifA+cuCdtdl5aOZVzdF7tva0W1\nMOEXB3SjMiGSmPIKFAXU9VCsj+V4r36YckJZljObCf1+AEDjD2mz7Ly6axFvjn0YWWo3aF8tupeZ\nT3yAfKGQ+zKXIb36HYqPjYTTuVTHRfDZ8IeoWxNKXM8L3HLtSjR7TLTsNrC05j5mvfsNTlnDgk8W\nsjOjDGdkOlSUgCMRE8GANxxvhuNp1BIKhIMzAn22Hq+1IfQPL+Be7dl2PkKrnT6bTrSNLR5hXFsD\nJlrA3ARZeZAmtTAw8Awx6jNUVoobbS+F41X92axfQFVVgnDVQweBzY2kUUh6IYugb9fj29AC3qBp\nBqMLYtMgMg0M3giLbodNaRP4TDWK1GM7uSn9PMhw2Ecsoq56LSWLurQPSg1+o+op/zCOhs0hzMp/\nk8Et3zO6toRYN6yYMRGTaRCs1XsekgCgmeCwaNIGnmLt28lY6rxx7igm9OZwAu8ysXvGtUx+08Gk\nnE34bmsm8PxHXKzdxBAO0U1XQHMRBG5pwaFXsTsunTXJ9yCq8cvEOVR2MCTQTt3biU788fBf6SOW\n2qjiJFTISJQwfpqFurAkypMSgeZLtrdZobYG0sKgJEd85tao+fjtuajcEq5ADWrkdqUVJM6N7M2X\nz9+L/qBEsKoIyazCubmK+iMVOJPT0EVU0P+JEobFgcNXS+FtMUw+sJ4XxjyLt9Tc1lRyfMJQtA4X\nN/28gtiIBoI3FpBNMlvum0hev1ROBw/GOswb7yA7MTEq9hkGsmzJ7ezWDWfqmE3IdhU7vhiFy7kF\ninJ5tucmavO1hFplvKRKzIqEXQnh5OS+HDMOxHw4FLtVxr5FId+u45vQAdhbjT39gPYKj0ayUNpi\n5ilADk6iket8Cc6z4ufjor4BGhpbU5lqSlQRnNjji97VSOLiFtCBvq6FWxe+Ssz2Mvx/aKFYI5KD\nWgWiUiEqEQwqhIuvgqp62HnYlyOaGHyrAjljgt6e0L6zWkfpa4nUbwppM964IODqWmxHvblj7Qpu\nbFxOkqGUnaOmUNI/hVMDexPQ7E8qWeSs1SHIVFxUZ/fluxftHDxTAoDqyxysxhYkgljn7MLQa4N4\n8cAY7NVuWAd2my8nNYPRmLsCYD4JZgcU90jjbIWP57ny5FlcFqjJ4B8G0jvRid8xfhdEEONuPUJU\nXBMqcw5bdAoXSGkzoABmE+ScgoHXgzmjkUffeYfvH5pIcJkJlQzTXv2MH+ffSn1YkMcbVVABZ8f2\nY2/1z9yQnY+7VzQZ3n1w5/vRteUsN3z7CbXHmrAuDsftrcbhkHh27RjKiy7S5flw1Mb2ROChSSPp\nnv0TPeRq9k8Zx7aB4ykYlIyEgpFmelpPMO6zz6lwNeId1kJPYzZDfc8SvqyWRfmPIrslWjsRBz+Q\nC45Kep8qI+SgldpisDrgs+F+lF45hsCz0HwhgLqtIeSXxvJhbiKQgfAUb4IOoSNR53wRiCJ2diSG\n6FRCP7/AwNpKwr1F7DgqCAiCWjOUmNR0qS/Gp/4gJ4bcQMi0OAB0LXZUVW7OvDWI8Y6tVNidbaS0\nwWFg0CByrgAG2GtOYnuGN11Gn2HYtdUYDwD+oPZzoe3aQt1zYe3GG4h5oBDTVxGoFBmTHM7n0i0E\nyPnsLR9DoU8K2mwnQUYbdlco/oNtJMafJ/78CaLu6EpViRfQGyhGtkmY3ms18CfZ++ce7N8Uhbm2\ntfwzHlzBQAmtdd8AZHhDRjGtuQvQgdsXzO19AZ3oxB8RvwsDPuLGQkAi/5Nmms83UHUyFq8eZvxG\nini0hKDicIZCuUlFyxFfpFkwZelX6Jwu1s++ua10bczXOwgvrODQxJGEFlfj994F3Np61MOiqU7u\niaEkhm5sYcyje8gY4kPRtCjUyLSYtLy+9SrYehEWhAjhhQ4oOAhXyBdZ9+y9HHKNwu94Ez4DGpFQ\niM0ooOvb+8kzwrAuGTzdPQOnHc6+7c/pG3p7xpYEOKgeG0FMN4X1z/UlOqKefvmnCN5nYsiuY5QM\nSiPrznR6fXGcuK/zqQcqcRNKPeFSDfVKKY1tRgi6xYJalQ8NPsT6OpE1Mk5204dSojuMXYPgXqnV\nQn16Eh93m4HjQBRlr1lBrQW/VD4OWUCPJ89j+EpNtEOkDasLEBGNjk5qAFy8biBZ8ZMZZDvBcGkD\nqRFQqE3gM+kuIVrfmnftgJqvI3E3a/iyfjxwFVj3whqXZ2SQNrqUEcmF+EfWEGPPIoATGAmk0S+U\nlIFXUp9Xz/fTJ9P17U0cIhIFF5veHw/so90wt4pSJCNYthoQyVFfxBXZPT9rEZmNXEQmoWNZTSc6\n8cfB78KAgyjL23g+jXUfxkGQFz4jA7AXGdDH2ggHqsw+fFWQgnGmgZdjn6OX+gibH7gJlSzz2Uuz\naA70ZeR3u7hj0SeUJ8dwYvxghv24l34HzmAdAtqMCrrYj4Amhaoro8icOYKuQadpBNS4UKNHeMmZ\nmFZaCX3AF5VPuxcuATv8x3P6TD/q9oVhM/igekjGu58g/VYjRGwKC8DgB/4xoMLGY2nLWSF1xQcN\nvjMCCQ+s4eh3fVj+7U1MeP0Q5QEKsfoq0jKyuGXJFxy7dijpB04zvHBnG7VTFIKmqRLhi7c2o/fT\ng8ZDGRCySuhEnGoGs0s0jrdCAwRowdgniQ03P8j+5lk4tqoo//M5aK6BINDq1Cwr+Cu2aD9idrSg\ntrnR6ED3S0GgQNDeHEW/eC+GPZ2JKqsEekOuksz71ofhe0RVYweULktoJ/6LtoPVDU49IizkB5jp\npd7C1OGHKK3vD38zknLeRt4H9biuMRLjsx+dJgBNtAM/XxWYj9OPDDJIxYEBj+S952wKIjPgSVYS\n6Pm9BsE04wTsGKkihXOcJYVOdOKPin9J1Pj06dPMnTsXtVqNXq9n1apVhIWF/dOixv8TVMiiFqKl\nGloqaD7VE2eNjtDp5RANzXYdRfWR9BrZgrz3AqaNEbwy7jUCr6sBLQxZt59e+06RNSSdH+ffhqG5\nheicEiKA84dBKa4lvlcW2kmVZIels/zqZ7nP5xO8G2o5u6s/A8ef5qo7qtn+tUzZE2UE3pqMzqed\nGiq8K3zXdDfHC4biG9EEEjgq9HgDVUlRZIzpiy77AqY+sSzbm0K82o0mqZK+Z0/zdPxXhFQrOPpG\nEW7W8PQrz1CSk0o061iTMZz40RbmDFzPsNcPMuin9lLCSDrYQkVwpETQzv5RlNs+f05/MKjBV/Vr\nKpKS9FRyhnWjMHEgy+2zaPnG1yPg0weqMtE7K7nDtY6Bu05QFx5C1dAQZJeKMIMJXY3zEg/8uGsA\nF1zdGdu8mVsbv0Fu1YVoNkP9RQi+jEHs8JSlhObTrXQ35wd2JS7UTGy1CXJr8dufy5dBg9k2bA56\nfSFTaabW35uCqGGsXuFJKj+Vw5agR8D8JZFkkslhhFHu+BiHIZa6etrr31toz6u4gRa0FBFBJmfp\nqK/WiU78sfAviRrPnz+f9957j169erF8+XL+/Oc/s2DBgn9a1BiAOvAvbkbt58brog1blB5HUKuh\n1AEGUKnRJdgIvbOcsDvLYQd0CanjkX6b+O4hb24wvoll702ogdLMaAYfPsjQH/ew+tl7KE+OIe3I\nee5+dhk9951uO6rODIZ+YfjNSsJ5WuHItqHkeKUxKedzvv/rdXxXcB9Pf/ouDtsQDqyPpGl/fwIn\n2lF7i/hqdDL4/VzOgJSN+ExUUdGlPUiRObwndUseoN83myntMYLPNqdjOGFjRMJmrvuLxNREEyfX\nD+TEIg1pDmgxe9Nr+AUiI6vo3j+YmAQL2liJ6qY4WN2C8XyNaPFRg68OFBkcdnEd6Qjz1B5IESj+\nOyp2Ri1k3TiWFQ89ifMzAy1f+Lbfda0BXVQaA5vX8JJ9CfJTEKBuJPenvjSH+9JNpyJqZzXaRlEr\nfbqpGy9l3cu+Xb14uPkY/t2Fv1th9+NgsS+U7YekyxhwcxV4hzDCuodrds8jNjoc+blB9Asppu+G\nnWBtILMW1uzpx9mDGihv4BjT4DxwPgXRmQrIbjDtARR+4jrE2Rt+cbJm8Qy1NTY18es4EDThzTau\nuvykdaITfxD8S6LG33zzDRERgszU6XRiNBo5evToPy1q7NO/EcnHTtLPxbTEqYj/rIKyyWHUDW1V\nVtG0DcmYbMVviPjnlDyfyoCP2sKawFUUl61CBzy6dwWPz3yJT5c+SFhxFWHFVUx/7iPSD55rO68X\n4l/agB1vLMhxKgKG1VL6ZgzvfTeLSF0ZEgoarcxL3x9kQtBkih8LRNLZCLimAbWPm0MbwXfzem7/\npoo8zdWsmXtrW8IUoHJwD77RjSTv4XCMEVsYOfYUL6w6Rq0czKd9pvDKhdm0FATCHj3U23nv4yfp\nNjCHrgMvokLhVG4PTg5PJ1WdSa+dO6kGUu0OfJq1ZLuSSDwvygdVCK88A9Hy0upt++hES7leDQ4Z\nnJ68XrMuEYs+Aes+bxo+D2tv3gS8DRbGxqznuvV3kRcK6go43HUQI2saUQcr5P8pFr+8ZrSNTi6W\nJvBczkx+qvaFrUcwTzMTPUuDbquLH6sSeSF/Cvj/HW+29CRE9eKx+OfpQhEzr/yI4sYU9uy+iqDj\nXbGVn6baFQVNIeDIQxhcm+fqsgAfNAaJ+CENxFYc4lDUAOz7jeAq4VINUDz7/WOOb603xPd3EllW\nwf68uH+4fSc68XvE/2jAJ0+eTGFhYdvvrcb74MGDvP/+++zfv58tW7b806LG3lELcFsMfLC7mh5x\nfoQlGnH5imyXqN72mGnFSePOIBSbRNS8IlRVRkIStTSFBtAruAYpDLw8nFfvTBRCEo/d8/Jlz1kT\nGw5uN+5GG0UuMc7mE36UvZIoqu/6BMMBE2pkXG2ZNxtU7qb6o2vw7tOCOtmKLzDXbz+61BhOxYUh\no/aUQCqesUuotS68knREjerPbXdvJOtYEhanLy+Mn4vbtR6IJs5HQ7DGm7CKWnyyrShI2MN1bPpw\nLKv/ciVj7jxEy5IgQKEp08TeH4y8xwzeOj8LkYSTUCQdFf3N9CqqRe2hOkyNgbxCsKqCKLEZaHCL\n27veMosDuZPQ6RtBulQoITG0gK8fu5P11X70HAsBNU3c/dcVjHv/aoxWB7oAFxqrm/y74nj8nXns\nqg4DLIRGg1+aGYuvEbNWR65PD/DvAVHDf30D1GIclJygYGsX+u4twpDRQOWroUQ3lDNz5j7OBjSw\ndUtvJElLU20el3rL4lnyjZB5cGMNQ1/ewcSb7sdxXX+U2ndA+TuvHv8AQYluZq+tJv35vVz13vR/\n6xid6MT/DQr5P9HEBFi9ejWvvvoqmzZtIjg4+F8SNY546m7y5vRjWtpeDPEKF6+NRNK7USGjrpdR\na7tBYJzoHHRD075AmvYFEtilBd38QazwH8qdw78jJ8lC3SkRdkmkqk1R55eoDw9i1eL7qDZbqXup\niIPmq4lFQe3lxtClBcmgIDeowBDwiz2NQBXRC3LRxYop6geEu2HRQw+yftL1+NCM1Krkg4JiAV2w\njV7Lj+J3uJFFs56nvtSJObd1LiIBI49/+y03f7ML/21NSNuhtiKArMldMNcJcd89X1zJni+uRnih\nVkQa8zzX8AbCG/VGrfXjmb+dY8CLG9BZRQVFSVcbhWvcLCq8jpN0RVjOQMAPvjgD/vEQaQNZ42k/\nV3DXW2jK1mL8pA/fyLGMWb0NR56ZHe8pzPyxgIAAQAJTWSDWpkrQxRMYEsufHlrDrLCjBH5r5vPg\nqSwI/BBq2nm+L4EXRKa48KmvpFfJUU7cnY7pukNQkMTN9k8JfWo71XI/RhqXow9SsS58InKVk1/2\nAmhxEtFSxPAld8OSTRDXS0RPfumA/5MwYMe3saLTeHfid4gE/lc1MVvxxRdfsHz5cvbs2dNmpP8V\nUWOQSP3yHN93t/HoriI0r6fS3EPwl8R8WUlYtBluGQYbdZe86h+yD2XM2q3waQ4vMx2VahtBUT7Y\n0XPK+jA+TRYaQgLxqTejcbowB/nhMOhYsXQOu+64GhUyJk04mmI9KgrxHd5Ajy3H0eCipdiL2hfD\nsVe6UEcIDzwoQoOlSUPuzB503VhMeFQZdi8DRV4hyJITL6y4LWokpVXBRnj1tT+EM/6u9Syc+hRF\nhjCWb3uejb1HgsMKGAgKt2DUtLBrzjA0TheBQY28/qeZ7HxgFKKe+yxGnxi8/UTOwWHT0VTX+no/\nEBFS6InbsZOXekznJe5AeOUK/HQW0eQjAV0RXYetsENjNSjnwDcCyk4CdkwXy1l+2JcQ8nmYd4E+\nBH20kSlJDvz9JJwBGtRWF588ezOnqlIwJARz/xPrmOtYQeS3NVhURhpOVUDpJoi79TJ3WyFCruSd\nbR9w/Q/b2TjLn/XL7qNaNkDtGT6Pvhdn8Hw01n3MT/sU7Z+6sq3iVizPVIP8wyXHUiHj1THy/x/W\nT8lOCXvV5fSLOtGJPw7+aVFjWZaZN28e8fHxTJ48GYAxY8bwwgsv/NOixqCgt9gwygqSDnq8nCNG\n4IaseUmU7cqEtYcgbPQvdxM0qNpoJJdMWOzVrCmcwW7GEPCBiuaFOh7Z/BFP3b+ItBMXeOPTZzl8\n48j2i3Q4iZleiEurwe0Jk8hIONCiibGT9tgBfu6ZzaiaXgB8fGwdd3S9lhrFjdyiYsHNL7Dh0VtY\n+vVLIlzikKhaGY3kVoh6pAgQreJ+o+q5SBpTd+0gu18vuA7oZcfrxAYkZQqf7J2Kf6SZB0a/RPbJ\nrry4+k1kp/C8QYNW18it83bwwKKfkWTY/dMInpr8PMKTdgB9gSPApA6TsxvhrY9FLAKtTH8d4VkN\nmyqhqRZRutdMDd14kbXALmA/Xj43sDJzLiWGJMLmZZD1cBeSPi/h2cfep6b2ffSvfczEJcsJT5Ww\nG3R8nHcLj1yYDn7NXA46tYOiGfGoXpBR29w8f/seMmd2g0DQR/7MW73mc+6xMaRE5FHyZ4lFM8LA\n9wQExQoltI6PgCxhs3RY1eVW5sV/DyXZEcweMhXY+B8dpxOd+G/iXxI1rq2tvew2/6yoMUi8n34n\nh4uqBI1eq51vpatGCy6NeC3uOLIGoFoL9wQRse0Ca/JmIKEwmr10eW4O5gYtysQxzKu51HCJGLXM\nLa+t4vbFf2PzAzfx/vuPXSLcEJtZxGu9ZrAtSI0DPTrsTIlfQVPtDmAvObdcSbPJ39OmLwMS5W8m\novFxEjm/+JLzKUjIqNtZphQ7uuPfc5Q5xHo9yJ50henKTkplUamx6LbHaU9DJjPjmSPc9fwxAjY2\nE3ihAXcqXDoZRuAXixsAwxCVGj6eyVLoKF0m0Gr8nGKeiUQQR1mBCHR6idOmsdTow+l/zwX01Q76\nPXUeFAg430Rwl3rsbtDooOiOGJaW38dHG0Yi6G5TLzOmdmz7YBRjnjgkfkkUQ3jv/Y/4YVkU669U\nuJFcWhR96037Ne0hUFUczB1JbwJrxAeFG2hri/+30Ey7wmjFP9i2E534feI3buRRkGSlre3i7PNd\naejhR9d38nh/3h2sK0oHRyao/SHcE4aRETVzdZBwVTEr3ngAt0qF067hpphPaao3oLAGyndwcOcA\nepYXoU9v3VXFPQuXM+nNr1k/ZwqfLnnoVyOSFAWtrCDXuqgLOsrE4aBukhH1xeWg2C+Rryx/OQHT\n1xFEPFBC9edROEr1RD9TiIIKFW7sZ41cvD2dKIrZVNKL+AgnFyqdTMs8yC3DJuMs24MIb4R4NEIF\nn/n9r3zOrY/9iCxJfFI+hWWLbsOhMiBUMvMRxLZ4Zk5GeN4yYqWoRIRSfBCc4QWefYI919EKPWJ1\n8UdwpzR6jueFwnBqVB8gI7U7pAqihEcDkueNZCWSAAAgAElEQVRJWZj9KIfvvwe7XINCLRAhygSL\nj0Lc5bm1vSWLoEb4+GPwfwKMkYRua+LFp8/j0BnY9Ldx/4QPbEORDyAWnmagiH87AA6Ieb+8Q9KJ\nTvxR8F/pxIzGw/psUOHyVjMn+3k258XidKsAP6gtgoYK8IuEsB7CkJhBlSHj7Wulrs6fu3u/Q2Ot\nn8fYRIJs4q3bbmCFOwaz1krwh9X4TwzjuyfuRGe149aqcRjblc9bUZoWz8KDy3lx2P38VC+Rsv0Z\nGp2t3X0Kc5a/yV8aFmPu6Y0BC7JNheKQqP4kGiQFxS3RsDkE3xENxL92EWPXZsa/t5bnxj9MttxI\nby30j4IWfx/GqyTW7RpMXHI1F2eH07BdA7YWwM1Xr09k7TJRl9zSbMBs6/g20a/Dz06EcrADIdYg\nxikMWzfELS1AGPfLmUUJqCat7z7eeW81sUsq2LhkDNNmLiB0ugn0oKtr58g+PzeVyu6hVMw/ge6O\nCOr7+WP+uAixCIQALvAOhag+0NIIxUfRxUj0PGhEKzuRflLQYmf54ruojXyILhNMGCNK+Xl2Hanz\nC4kqSWfIc1E4egzjyPvD4YwWEQr6JQQnuBi/0uHrP0Fn6KQTf2z8pgY8e2pvpgzch6uhGOMpJ86b\nfXEbNNSUBmFxFyGMkgtkWehZNpSIVm9jIISkwOlMasqCmXPFq9SUBne4hGGAi6YqAw+t3MDWL1Rk\nzLmA4pDhlghWP32XR9EcBm34mT47jrL87UcAcGvV5A7oxsIDHzFoxGxK7RIylUAEr69fQ9roOvbf\n7YU9eBDGRL+2a3G3qAmeUoUuxEHF+7E0bA7BckaELdzmCxjCZRav3snisSHAxxQP2c6dlfMpvz8b\nSR+M3ZgORslTsqymucGf5oaO3nJHXCI1j/C2Y2mPQYljiIqVjsnLVtgBGYKiGX5zMc/MewFVlcKo\nT86itDjpe3MNF0sauXgWRg5v97YznkylcaAPGoMDlWwm37s31q4DoV8MVJmgrEzcL5UaHBYoPQNO\nNU6Li5yzPUgdd5Y+Jaf5i/wgaYFZ6Dd9j3ZCPx5b+A7K9hM86XyVA+5w7g1YQ3NhMUdy/LlBXcJT\n1oX4RzRddiacWi1XbdiAaVQ0StPn/LJapROd+P8Jv6kBt5V4MbBxATOuLWHNnXfy4+ap1K4xQuMF\nhIeVimiBrgD04iO3Wegz2mTKygfz+A2LKc5u7YLU8Pa2Z/DytfL8tGeoKPQnMsGGl68eZ6mNiqey\nkVxuVNMiUJCQUPBpaGLcF1vpfjSTwvQk/rriKWStRP7g7tj3vYVyzQ2QFMC6KyYxfOtJcnslojLV\nIbUIncnwWaUET6kCCcyHA3DVaej23SlUKLhQE3e+gGmvrGTu8lVkPzICV7AGKidAlkwedZBbA2jB\n6zRE9walFBoMCIa9fwQ7Qk4NLjXebTOMkGUzINhTNIhOxGrwi2GUMZv5m55BdS4ff40KQ4AdOQD6\nuxo5mwM9B4O6Q/y5ZmEpDS6J3skQdDyRA1ldkP26iEC4roOB1YjbhcMbSEapK6d53nryel/Hxtk3\nkr7wHNnPJaCqM1E0vYavFtyM9r5JlJOCvDIWZ0A+ruIsgq4qID+mK/OWLEJj33PZGZBVKhpnHUTx\nvQ8san6hQ92JTvx/hd/UgK/R3oy1dhcrQ9+jun8c7v1eoNQjXveNiOqJAETVhdbzuQncJSSn5vDs\nW0spqIrmjTmzePW71wAVfcacQ611ozO2AC4+fPIuKotUQBaOfBeVL8rUrfFG8U3Af2wdKknBv64J\nk93B5vtvREL4t26NmsrhPUncYKHguWhKt+eijWik29u5fNCrjlcTB5BPLPpYG/pY0emnDXEi21QY\nu1gAiYRTecx+ZykGtZ26saEk2XPIWdgDQoZCZia44zzXdA6sWVBuB6cXIpbrQvB4+PH3k3NaBKvh\n6V98Xo2IZweK+YtJAIsF6mUE6YmDXlcc5d4pZxn4ZRY5m0AXAAwHlRMCwqH3aAgIQeQ0PSoRX9/x\nFJGvf4N/XzPNNd7YzxrArhN/DwkBux3KCzx0kRLdIvKZf8UyZn35DEp2FZaSDOpKj+Dt40LlkoGR\ntGRU8/M7vqiDjEAdd+T9yJjDWzD2bMJ/ajylFTam6Vbi5VvddnUlMTE88shSzHf5AN/CERMkKr8m\nffkX4J+gcOtbTYzfsI1bVt7y7x+oE534L+I3NeCflYyizn01J7YYURc2Y8sugEY3RMWCnx/gDSYt\nI4ed4trpGwE4fzSAL1/vSRBmrvfdzPm+qfS8OgP1p0cJ/SIBp1qHqkNMNOt4suds9UAdtmywFVRD\nYACOoihqNFFIgDnYn6xB3Ts0AUnIKhU+4xp5654Z+JaaUGLBNCKINavTOfNkJdpnQtGP8G2jrtVF\ntwocq1BQ4VPbhHe9mWXvP466xU3V1lgR2dAGwI1psOU0tHjCROjBItO+UFkRhljN4KuymHifqIPO\nPZfIJ4vvQHjXmZ6xRtBuvWoQ4ZQ4ROxYgUYtOFWIVlN/Rt7YwG3P/Uw3VxlhCSBfC2XFBjKejkNB\nwuXU0Pet8yKCpdAmZF84pA/j/rSFtUeu5cSFWJA8TFlOQK+HqCjAzqCYnTxx78tIu0qxnbzIn2hm\npXQNUmgcXXvBn/z/xnO5i9HbAgET1uMy1z2ZwQTNQcquSeXkrhgcuyvZXSnRr2EfhmEyX4xcSMvr\nVmAvTWW++H59gpd9D/Lc8vtoujMEpP+shtvHx0GfgRWseq73f3ScTnTiv4nf1ICvl+4UP+TtgDwv\nRPzSKQyZrz8EGpmUspZ7bv+Y0CnlKEj0C1BzxfcH0JgcHPzAifRnLdtLtNx4fzBd3i0h98H4Dk0/\nuYgUqQ8ijCABdnCUQb2FBD8Dg8ccp7BHD/529f0e71vExr2bm7l/7l9RkAit3IYsO1GXQtW3Zran\nTqV4jQ2fpb40bEwh8DoTviMb6LflCCO+3eU5jkRQuQlLsD8nxw9CY3XhN74ev2vq0eDi5iXv0OTK\nwvJKHzZV3UrtuhCwGsFXA7Ul0GgGrAy5Zif3Pr+d9KHnyD7ZhXUrxnvmKQcRHlEjavFaEUu7Kn2x\nmE9zK6GTnlGTTnD3wk2k9K3i7Noklu0eTVD3XMbNryLhWAmKAnKLShhlIOfBRNw+KlY+m8L5J5vI\nM1s5fFxLtTIQguPFRq3U2noDhMWht+lx/XSItfmjKcgZiSqwJzQ0oTSVknUWfnRpGH28CWt1FmLB\n8mPgsEKqjyus2xdE7OABWNRNnFpnwIwvWV0G4+rdyKyFP8OhXCryIzg9Lom9u404tpRD0AixmPwH\n0OLC21HPhnND//HGnejE7xS/qQFPWVxFwSfJuJqGQVkt2F2ADI114N0MxmB8ak/j03Acn4wAgvc2\nYKi2Y+oVzscN1+G1uYCs8JuJv+dn/GYE0PSTjEql4EQLZCPaTwtpN2pWRGjBBloVcV2rSZyRz7ED\nKezIC7uESFRns3PFp5vaUoF6QFMLmh/rkZ6Ig8homs+HoO2ioAl2IqEQfy6fKz37FPZKZsu9N1Af\nGYyEgsrLTfDNQphYjZtp936J22mmIquU0/dOpSEnAXe+RkSMvNRAKTRW06XnGdKHnkVGhZe/lagu\nlUAX2o13MJei1XgXeH6uARwQEs2k9APcecf3RA0o4szP3Tl0vDd1w+BYUS+uHvEZkY95whRu2mqv\nTWMCcfqo+b5uCElDSmlab8ZcGwGx3UDfgSKh1YjbnGSVJ7P07FOcwgGqUHCmg5KBu+40S35+ChsX\nUS0yIJ2rAUsQg2aXMrgsi+Vb4zh/1E1DrRduRy9AIhfIzYNr8k6ROvU0361Nps4cSFOWix+MU+Gz\nN8DvFJhUIP/7Qgx1Ff58vfh6OksJO/FHxm9qwAPvrMEV6YPKKiNV2Sj7MYKW0xbwJAhH1W8m7uIu\nCv5mIfKkjajCJtDBmW59+W70DAZs13FoyzUsfGMZzfhSekMEatyI934dwqKoECY4GuGpXgBqQO+L\n3ghSoEy1S4XjxyKkh0J+NUYV7SwEjmawuEEXaiHiXm+0zY1cWb8RR72WTHpyfmRvjt44kvDiSr5e\neDf7p4wDhFfv3WDm2g/X8u3TMwDRVuMDhK/NJXZ+MfWzwjGtiMRWbgRDCEQKJsYz+4dwYH0zw248\nSnSXSkbdtIsfP4jrMDo/LkVrDL2C6+8tJDqxmJ05YzAleJFm3kvasR2QGEWLwYvEoCrujDrKvrGD\nCehIw6pGvKwkg31JGZonIrhlbi4jvUvZHjUWrH0xHtbTUvSLU7uhj/Eck6O/oFBJpXBsd1QrFe62\nvk6AnwqkWmR7V65VZxJb38KQ2Y1Mu3CKFE0Vp1cbycmMAfwp2+/yDEKLKE+UaVH7crL5/7V33uFR\nVenj/0wvmfTeKQECIUCE0LuKiALCiogIiqBiQ7Hu6rKKil0XCzZQYC2gKCCKSFGJtFCS0EMJpPdk\nkun93t8fN4UorPpdf2B85vM880xyZ3Lvec+5ee8573lLR17fP0C61srTkDgG1KMALdTu/p8UuLle\nxXfLE5HsRv7Cxn7aJxdVgZe8Ucts3UZyZ4+g37e7McsNNMpsKGhEbo3iCt9OQmw7qM6GuhNQnQLR\n8aAI8SJco6Og6ySUuYHEHa3hRM8gFPj44o1r8TnlmOtDkRRcMtKsSo7kUtcBMIGjBrm1gZASE8PP\n1EOUh9Al+dib0mvo7L9MQbpu6niiN+4mIN1GxOhK9NgZdudWStQdOT6kNycGpvP5P2YSvNXE5qDx\n6MptNH4bjirEQ0xmORNf+5w1j87kusWrUTklZfPD7Km4YwOIvKwSy9YQnGd0hAwz4vUo6eSykZ5Y\nidd37rA4kAJ1mjY35XJkkbEkzzjDwLe+webcwY9kMmzGQR4auJ5OIbX0izJTZtlN4Pb9lObb6GKs\nZvSY3WgcHpJOltFlTCGaH89RfjKk558Rqt+pJiNRxj2RdcQerWXF9DshJRDtY3YcxW3L88Q4DzI5\n9m2e6LmaHfZB5M4axqQVX3Kffi2hgdJ5fa4fUSjgxAq47s6fiJqlYNenPVlxZAxFlqYILWRIgTnN\ntdhk+FDgRtW2jQoVhDalSKj7lv/NBcWFZJY6T9inHz/thIuqwKue8uHjGBXp1zPi5a10OXIER1Mj\nzGZpHm1D2nqzNEJBAagFUKT40OBCCJURcV01wTl26CmVQlv51BQsDQbgDNJGnp7WWaqv6Vg9OE6D\nrRyZA3rJqrgi6hju1VC3U/qmgrbq4Pubx7Ly2TtZeLiASdu28XVXPfEnC0k4XoLBaOdYzklO9+3G\niYE9sGsNODYHYN0XRN2KGCLDqxgxYQtap4tr31nHrMfeQeUT0OphxdwZ1MZGocJN0JAGVOFuIidU\n0WnLKS4/uZ5hvXcSopHBRiiyJ7B7Vx+kTc5gNIF19Jlylq7bDpHa8QjXyD/ErXfRQz6ezMQCYj47\nS4TXxZwhH2LOgpxdkuGlvtBHQlU9erMTPKA96iZm3zlFfwGfRsEH1bPxiisR/11FfBKo0gE5yJrS\n5jZjSDPT3XOQgd+/y2WsRgyEcGMNM779iFt87xJ6ziJB0bQ/kRoE+vf2sls5iFXcTf34ZDS78nEV\n5PLLogwAnqbS1D+jOfhS/F+ryTdvHPvx0365yJGY/XkBDazUs7WqF9GUEImJY0N6UV5tJLSgjBAk\ns7AHcDZCrimWvI4DMGBFHuEjYmYVx58BJMsEo6bsZsvHI3DaQ9qI02vIMYzVQQQE2fB6KjlzJBDQ\nYuoWyClVJ2SbRMLURvQ5YJLr2H31QIZ98WPL3y9/bi5dDpwgsN7MrCUfoBXtdPrpKGm7j0iTQdHH\n6iduoSCjK4Y+ZuQKAfcLWoZZvye2sYyZC5YSoIN77nu15ZwqDQTJLBib7NiRN7Xm4Lh61VoG/ecz\nZN+BIQ6EZA2lhv6s+WQckIchpJ4rbjnMlc/YSJu7j54r8lEqRAKDoLPrayregGIHhPSRHmEqNUSo\nwOEBV4SayquikHlFAk45qM0IQ6ZvVciiTIZdq+ee+iWs2rGG0yddJESDqowWj8aADDMymYAMCLuy\nlgm5qxi3dhU4wVUHyb4z3Jl/BicgiuBygLZpwl5nh7BecKLr5RR9EInLpEI7Lx8hMQFXcR142j5M\n/Pjx89u4yAo8AMiEz/J4kSuRUUcPivhi0DT6nN3JtZYyAppb5ITqoCg23DaFDffMIagpsb/dCt+t\nFBl/kwlj/2AeeW8J2ZsScNqrkaqRJwBqeg46zpkjSQwYk4fV3MiZIxMAO0q8+EJl1HUKI7LIiGyw\ngc0dxvLxC7PbKPCMbfuZ+eRSIktrsAETXljVRpIhX2ZR0SmB0xmpgIA+3crAWVk88+kDUj4mJQSG\ngvOcSZ6lQaoKlrbjEOXdE7FEtLVnqwGnEQobwBiqoTgtmObyYIbgOkaOd5CkK6NifirDNp+Q3Cdr\noKgGuoaB0SOtYnJLYym3BuLQRSFQQ+L+U8R9IlJ+TQzWND2+ZDmn7+pA0FEryKUkXFYhgGu2byQO\nDw3nG7l0C2HD69DGOfAhh1w5MYDCBU4RNDqwmqRAIKddWkHJ5JKjSkEDZHSChQsf53hAL8RaOfbV\nFXicgiSe5zwX9OPHz6/yu4oaN/Ppp5/y1ltvtWQp/H1FjQ3AMGAfLzAV8NJho4VbImvJ7Ic0fZRD\nFdFsGTqFH++dRhCmFn9tpQpS4nx0f+osx15IYaepLx7XUaS8HFVN7yp2bczE2qgnPqUKh7UjUYk2\nkrrkIEcgsMJGzM5aSvURbB+cylOX38+E3XsQkUytKg08PHtRmyRW5yOytIb0rIM01xPqePhsSzI9\nuQgeN6g1Uj3LZrruz2fK8yt5Z8mDHBl9GQn5xdhCDMiQrAPBOgjUgLDbTPyuI/QJP0VhkozAw3Vk\n3TuUUctfotcbJ6STpQA6MDTCsV492V8SSrXHw/ubhrGtLoLIPt24Sb2V1IZTaLMa6ZXdSF0nA0dv\njENf7qDXilJazMxyGHLVdXwkk1ZAVhOczuyJsSQCuy0Q45IoQsfVETG16hf94HGDzysFaHrdYDZK\nxxvrIDRCquuZV52BZU8wwdcbUcvdVJT3x3MiCGSH/3sn+/Hj54L8rqLGAHl5eXz44Yctv1dVVf2+\nosYtSJnr4jtXcv9rbzH05BnYjGQE18B3117J4tvuIRRjm4o7hmCY/KAMy6EAPPepeGzP3zF7c5G8\nTmKRngACt/xzNZWFMWStHQjAjQ/9yN/uP4EXJY1pQRxYlM6h7AgeGdSbuBfXMa/Hx8gSgHLpGqZ6\nEM8xild2jsfQYCHQ2BpCPnL1Vkau3oolLIjqDrHoLPaWLTHBBw0mBY2jOhO65TSIIkoVPHrr000P\nBgUickZ+vIXTfbsjQ44HaWutiw5idDDYu4/Uga/y90fvZeboJ5keAMJ8JLO+dAoYAl2NMObl59h3\ncAi2l1x4jT6ik7Yy+eEN3KrZS/irUFwGSQFg3WfF9u4pFCFIKWQ451xNb4FAwSF4dOlzHFg8FM8+\nLcghdNzPknSfgytUj6NrBEF7SvCoVRT37IRMEOl06DRdIkX6v/cOZ+d1QbTIcVXo8NkUUkSnP5WJ\nHz//Z/5rNERzUWOxaSpaX1/PE088weLFi1uOnVvUOCgoqKWo8YVxADKiEupISKlgwXOvMDJ9Fwqn\nryW4sFEeQo0tGrFa3kZ5ix4ZrnINXoOCPa9k0D/7I8xeLdJmlBspxNxEeKwRfaCDmU98zgc5D7Fy\n+/1Mm7W+Te45r12BtUwy0trjAti4+wYs8zuDXIbZKCnglk5SwHuL7+fAWOlhIJdLLwBbcACbZ13L\nPTkreGXFAipSElpep9K7MfXNj/AqFCiUEBopmVZqE6Jw6TUIyFm56C52Tx6JKTyY0LCgFhdGnwge\nGWjxEl5pJdABuTmQndskrh2cFhA/A58RECHlluMEZyqJjnTy8MP7uHlUHiEWE4kdIDQUDh6GskbJ\nkNUy8HKkfg9ACl5t6qTapHgErRKZXJRsO811J5qwhRqoTEmgIToMZ4COrGtG8Pe3n5XkzuzOos+e\n5YVPF1LWNYm8us44izXEvZhPhyUHCBxeh9zg+59C4f348fM7ihoLgsDs2bN57bXX0Gq1Ld8xm82/\nuagxvAJUotHGc8cjeVw3s57Oz5UQ8p5FWsorwKYOYHHoPSz8+glCd5oIXWZEESi5HjgLdZy6KR37\nXJC8CLLQR+gIcAvI7KdpDAohwGfhiWVL6TH0JC6HGqVOIGSNGY9RTcXMGNRaD/ogB8d2d2bhlFtR\nKH8gKtRKcmMJaeX72Sd2oVMPJ64yO6JFRPCBvGMgBsHd4gqoDQREcFhg96SRrHn0ZgJMVo4PTmfW\n6TUovD4MRjO+RiW1o+MQfTKCYkCmgMawEJ78+hXO9OnSpmc+f3wGGreLOa8uxydAjR2MDsjYl8OH\nu3P4kVYvcI9aMvMc/BIyIqSEjfoaE7YaDUFeI4vGP86kfWuRrQWlVkrs6DsndbYSCBDB7QN1IGAD\njx1UyySbNsDCdR/jTgtCLfPgM6gQvW2f9d9Nn8gPN17D2LVfk/nZbpa+fB9elZJZp9cQXVTJfzpO\nxqNRcZ3lB46m9cN1kwaDcy0Ou5dOGwTk+p6Yd4QimFUIZhW/2RAuA2WoB2+RDgSptud/Q6UHvdaD\nxuGWljc/Q0BGnaD/5Qd+/FwyivjDixrn5ORQUFDAXXfdhdPp5Pjx4zz44IOMGjXqNxc1hgw02vF8\ne/Axhvz7KJobPdKsrul54FGoeG7o33mueCR8v4LGsIGwIIWOiyWbr0wBVo/Asn9AzykCWnkt9xz2\n8o+N7xL8loUxKzfwROGDRHSu4pF7/kXvUce5asaPvHTmdj56biI8ouCqGXv4+/I38bgtwCGSU7Ws\n2vQ5UdPLEXe/ziBe4oFtp3hky7voXrVRfxweevNFrn9rFf037kAASkxS5H94MFy5YiNXrthI9oRh\nPLf6GQASjxeyuN+sNpIfqJTygt/+/ac0dApG43A1VQZqVUAKjxe7FSqtUlYUgBP10C0YBtJUwsAN\n+9fDgMnnnFwG74+dgVeUHmu7gc+RbNld0yBACcWH2o5Eowl2ZcOIq8CrgNwNkBkL8Vo1LoeMhqWR\nqB/xgUIk5cXjGDdFtXElrFsdw7UnvuOx+FewboFVsddydFhvHv1hCSqnW6pdJAO1w0X3k3kUXJnG\ngjeyWL7zTpQxDro+fQSA0ntTMS734FXm4EGJ0udDofKiVIooBAGVVnp3aRTItAIylUDatgMcTb4b\nX8ObNFetPxeFCpRyH3KvSP87fTw8I4drl26Vqqf9jDpBT2T5I+e/Xf34uSR04A8vapyZmcnRo0cB\nKC4u5sYbb+S1116jqqrqdxQ17sC24/PQdhDxalVoFG1nXY+PeY7Xjg2B94vh8tGELgwluf/Jls+1\nnex0X1eImOLFE5NN/aC9HOgM2nChZTn+xRIYtL2Q+SueQTsthHceu4XPXpuIpP5cgII93/RlwfVz\nAKm4b4kjlMsPz+LlupPMvfY5lPN9/PD6EO58bgBlbh2+OVdxVeOm/xryMeCbnawNvgKQqvxc6Ltb\nxk/AWCNt/IHke95sxZD7fptvsyBA9tpWV+jwaECEhlppwzQYySKiAsqOS6bm82E3wZ4vQCWHzDjY\nWw6Lq95lc9/O2N7/DpZFIibF4L1FScJzZ5DJWhV41C2V2N4rZP9/YMAtkFV4GY9vXkxifiEv95nJ\nT3K4IcLDFxFjmVa9gU2neyD2ruT2qHfwms/Z2PXJMASLvP3PeSzyPsHNGz9jzoJ3OaHrwsDv8tGe\njmTY9r1cOfUbYmV7EF1yDkcNQIiQSwGU5ynKM+Z1L3/vsY1Bb++nYiV48kSp1oUfP38xfnNR43MR\nRbHlWExMzG8uanxm51Q2jjMSWwMpPQXJIeUchCI5QlwmDOkI2/NoeEqEJ/vRYfCppoZAgEJkAnAC\nGdu+HM6oB3aiSRWkKScwSoArg0VOzi/k2XlPsMk+FkGQI6lJyQwgCjJ83kikSu/biEqy8XnO5wy7\n/zCaKI9UACdzDz+596OPl1FvfBOl04YhFKrc0GiTNvrO7RWZIKIULlziqyNSZ5vKvYju1o4/3wA0\nOxfWnOezZkQB+o2HYz9A9yA40wAJQZBvAdF5TsC9eH4jg7LpOqIgfS5vamONKg73Zf0QE/qDVUa3\n109gGGJB/PkTSS7iQsRaA9q+EHynDJ9SgUwEjddHohy8GhXTy9ZjDgkhQPTi9gqofALz1izlZP8u\naJpsGtX/SqT81WQcQTrkPSFKW8+xgalk6/vRa14WQ7dOw/LQZuri7pCSb0XI4b8kI0xWlPH2pjRe\nTh3K/ZP3UfSqhQEfjmljpYnoLjLvu3qmfrganvwvHe3Hz5+Y31XU+ELHfmtR4003WOhS7cPrg317\nod9lEHauteU7pKLGaVFc/o6bLu6veH+GQNF1A+jwqjQTNyZE8lDhp3T3HOKjARPRVNciU+0Cq4vq\ncUc4ZLweXdCreGwHabCZcbMLqZp7IFfdvIkHXtuBRu9iTeEdgIBGbUNrdNP3X8dRO9zkfAt9jsBQ\njxeN3MuJerA4HaSEQpVLsk0nBEGcAVxNYfgaHQSGSLNq0wVyI8mBhmr4+SS7+e/O9ReXIT0g9DR5\ngasgNhYCfLC5hpYkXEe+B7cDxEDwCpLJYmCYpMwbfkO933MfQF61ijmnPsUaHEjXpcdQCV5kgkjR\noi4I2mrmf7aQARuksNUND9zA1/dPQQ3YS+C76o7U903mq+cm07hEeoiZBB1dSu6mcvJIum863GJ+\nmVj3Fdm3NeKJi0YW0JG4R4qwRwVi1+hbkmrtXZfOwzPvB3cZqoYkTA41ON0IQU23qxo2l/ahc3gp\nCvkvVy1lz3rJvm8InRNKOPaewDOHx2B0tV2HBMgcKIUGLlt8x693lB8/f1IuaiBPXIW0tBcAqwty\nD0FGLwgPg6fj/8V/fDOliHivHEOUl2pU/00AAB3YSURBVPBGI0K1DU9d63TLp1RQ1SEet1dP9egM\nxJXVYOkC5EBFLQ684C2FpJEQHA7lx6EmH5CRvWkoq5I6cceiJRirQvliybU8/tEbWLwGDj7ZA6eg\npa9tL3K5iO4YNFZIrndnfHDWLCnf+ECIDZQ2/ewWyQvOJocQZduNwvPh+1nqjlpAqZBMGPpAKYLR\n0eRW17xeEFySX7UhGHwN0JfWmbmrSenn14Gr6dweM9S4Wksc/xpqBSSmBHHFF19w4IHBCMjosuIo\n8igvRQ92w7QzDOuxIDgtJ6aiCjlgMNkRkXP2htF812Bhwo8rSZfp2N03k1EVG6iLi+C1VUsoHjkS\nqvQ0OxK9v/5F6jpGw1MZePKjeLjoSUzVoWTPHUX4DdXUr4vi859u4BtXd+qK6pGWQlHAdvA5oPwH\niJcSht3nuRyN0X5eRxaHD8YozBQWy1mXHU2965dGJAU+AgQLpQ0XKmPnx8+fn4uqwJszdCuQlIto\nh+NHIbUHlHeIRznHSdTBSmqOxbJj3QByd3rA2QB1eZy7ZhaQYxTDoFgDPhVSJZoBSOXGqsBbAq50\nome6cFcl0bBCCdXHMNVHUV0aw8Gf0nj17rlUl0Ty3Ix5/P2jt7B10CGICk6+moYDHQWWFK755luC\n15mQWyC2JwRFgK4DqErAlS3VoqgHKceUCeI0/C6qgAYTdDNAhF6KMv05zWHpXi8IHqnffm5acZzz\n4PD5wCPAb7GmV3dKYslHrxLts7PnyeF4CjXghjN39ECuErCfCEDwKJh48xdknjxBRB04jsDYD77G\nEh7EN/dM4sTt4/FO6MjY4AP0iM3n4513slc7EFtyOBvEyfjKIflmC++9/zBHR2Si0Pno/FIVd1Ut\nYtRTa3nTNw93lBpdlIPI2yphghzrkQgoDIPDp5DWG+GSXch5BFWZl095lpjwEmSyC0uZpx/Gf8zd\nqXScP2Nh5dlInrn+buDQeT/346c9cEmq0kOrS3FcLAQGAnv3ouoXT+gdkZAlUrMqDOPpRKAe3Hak\nrblWBIWMzk8e5+yhjgjVO0DsBvRB2rGthrojmFd6CL0lDNltXTB+qIRABTn2rhTOD6LwWBIgo+Bg\nZyzVATw3636UKi+LvnyeBTf9nWqrksAn69m00UD/p2tJHWFDrQX0UGuNIH53OeGfHMOzB0IiISIJ\nlBWSScRyvtxM58ENeLwgyCRf8wshipL3yW8lhAunaQrSQOOgNF569EEwKdi99BpUHjeefI00KNUH\nsFc0PRFie4LWQNeUk0Sb6lDXglwLiXXVRBVXISLHGRnCycgBlJf0QlgLhfscmKONpL/sIoNdHHRC\nzzwo7NUFl06LHB9zPlhMhwPfoitpRKVT4m26DTXRLmTRIqo4N0KdgdLHe4LFhvToV4Nowec8ylsk\noyPpv7qRly+JZXCfQ/Qa6uSDnRm/+NxlFziV05w6zfjbO9ePnz8Rl0yBAySmQGyiFG5OjRGxwYIq\nKQh1kBN0GugXAgeUSNnqfrbUlUPQoAZknbtBfSN4jgE9mr6XCC4jjoOlgB0xoiOEpkGAl7piLXW5\ncppzD8qAQIOVUZN38tq9d4IocvW0bXjdXjTd3ewkia79vDgHNBWQB5yokVdCVCIEyEETAJ7ewRR0\nCCfl27N41FD+FXQMaQ0rPx+dmt5lNnD9xqymAlKGwfOVQC4xAV7pO+fdHNWAbXgPVjx9H8djBlG3\nMBbXTgWu6iJIbiotFh8PBafBawa8LOj/DDd8/xkRxUawgzIVFO7m5AHNFdZU1IXpMGUE05Ar54Zx\n73Dj9x8hqpR8smIBI2UvULa7E7Kr3Nzywttc/uEmqGkkKBymfrgKa5iW3GsyAREBObJQAXUXBeh0\nYDkKdEEfuY+JrzVyTdZ33Hf5KzTOiUS0beKCj6qjkNZQjUZ+If9yN1Le+P+tso8fP5eSS6LAl/EM\nc2/4gFhfEWoHLE24nZ8sN9Cw0YWzBFRdVFyWtpYeqk0E36nibHwq1SSf/2RBSFVgaA7q6NF0sBHw\n4DgoQoQIkU0WYbMPaXuw1XddH+Bg2HV7JQUODJ+U3fLZrU+colOqjQ5fl2HuakBf7qD70QKCCm3o\n3KCLhNLUeM4M7ED3wyeRh0OAFkJ7Q+VpiA1rbaq1UXIBbKZl/9YNNvOvhaRIyLiwW6DpPIEqzQRr\noHFUT5ZeN5+NX12Lt1GFZV8IBNjBXgk0KfDwWCgsg/B4UOkZGb+dnqXHJYN9ABAN2bOHsSNjdJvz\nKw0eEpKPMtyzkUmXl5D5ZB53TniPE1O7I+S+gvmHUAJdtfTZup/QmgZJbVqh667DJI8vJOea/i3n\nEpCjSXOQdvsuQhd9zIn48dz5ajYJY7V8/24yLrGSZ71riAzJQ3YeBb3mb5PZXjSKKp2Ba/t8wyxH\nLauMU3F+YAH2N31LlDrej592zEVV4EsZjRovm8Jn0rd+A121RbjGRPF1fiInklKhVEBRZyZseiOK\nYwqqNqcTqmikT+czfPBoMqqUy4i+o6ztSZ1AQg8oOQQeEYhm/G2b6ZBWTA0Ce0/3pSg3WtLnLiBC\nQaf+lYzL+BwZIHgVvP7QHJyOtgbsFc9MxdoYwA0PbGDnV4P54ePR2OK1aOusjOm1m14jzuAJVaAy\neym+Pp6GuCDMGDD1DcSNGt84qD0LDr1Ij9WnkSWKsA2sNW3D9Jtp9gtXa6QwfecFvEgUSDP3C2cl\n+SV5jOKg0BtjYwg/5EzC/GOotKWgBnRqiE5FqfDy/K3/oOEtgRX/mELVtgSERjUHfoKeeoiSAx6o\nSoziu57j2B8yhOBzypGJyNA6jfQ68An2JxJ5LOsuVkckELE/max/y3GWZ3Ff1A7iGmuQA1tuG0/n\ng6dIyT2JCJh/CgOPSPDlUi7ELg35TDyxjDBlLuXqClJOl+C5ujOWWAFl92AK5Kmk/qOMMUU/YvjJ\nBk0par6YNAlzxAjG5FYwRp2N56xAhUuNppsP/awUjMtF4MDv6D0/fv68XFQFvo7RDH3QyF3FyxC3\nlXPKANtixnN0byKojhJyVRzRfxMJ6GfBou2EuZuOTl+vIj7RRM0bRpS94pGpBKJmVbScM/7mYsp3\nJ+P7wi7V1kSD067CatbhIACfzQeWM2BPRt9bR2LHfQwvWMn4iCxso7vy8XPXs/adcWj1Lm5bsBql\nwsfHL/yN1a9ch82sx27WEZlQw7b6oZTslkpwqa6F8ElWzKkGlFYvzr4qArBSOjEWsamajNC0NC8T\nQBflwBOnppOumICNXmxV51fiIOXx1uil+aHrHCUuV4DeIPltyyygD4IyCwgXmLaH6eDwlQM5dFlP\n9uZcxY+7B0OZGapU4CqF8ETJ1uJRIo9LJGlWAcMLFvN52cP4hHjwKplufB/7qUIa0yEqGvCCOTqA\n6tMObEeqCena1u4TAHSp81Kw2sa+BzKZJa5kxYu3o+oscMWmJQx74zBfVXbHe8vV7H50Ajc//QEp\nuZJ7aO/d+0nfmkelI4591w4lrqCM3nmn2TrnZqxbwqjSFXJT6U72OFIQTW5WiMNJmVbAsUWD8TV6\nWhZU31QP4FBuAkOPHuaEq579ezqwn2C0vXLR9pKDoQdY/Qrcz1+Di2xCSWTKA4e45f31LG6YwPuH\nY/h+11QSMkvJjNpKsS4SkycdkRD06Vbi7i+gx5ECDMnB9HnASUVwDYJDUhqiT0btR7EoEJo2s5xI\n2ZgS2Lp6NIPH7SG5+ynGVXzF4fJQDmVcQ8ztsYQZq6l6K5hVR8ZhzUlj7TtXAGXIZFFotG7W/HsC\nK56eisuh4Zpbt7H7m0yGXbcXhVKONI3XcijrMtIGFSJXCRz8qQf81KyNZUTEmRgzbXuTElegwItP\nUFCUEY94O6i6eQlbW4XypAtXY6vroVoDDaK0SEhSg1bXqsDlCtAFSH7eyKX3pCBJyVdYpMRXkXow\nuyR3wpxxo7HY09gXOZqciESsGh/IHODVgq0YbFUgNpsPRAjwIapFlstvZHnQP3F9EgBKmHT158Qe\nKSOsNfUNR7O6oQixMqzfD1joQx2tdUWdsRGceuhGjoYa6PiYi78f3MF/FvUg8GEvWnkvlhcMoWCy\nhrRuDjK/2UVlp1i+fGgaB7398eSq0HnsKF2SSaSiSwJfPnozP/W+nA47Cym4dSgjHlnPoo33wsYT\nQCWHliaxZV0kjTXn2KU+c9DjuiySppVy1DOIg6UD4adGnIfP4jxTBUGJYAV9BGROc5B28Chv78j8\ng+5vP34uLhdVgfcml8RV+1i/byQrNNMo0nSmc2A+kzouIy3hBO+vGUB+TjAxj8sxDAikPqInZTHj\nuU67lrEL6vi8xEJI9ybjgQjOs3rq10chauVSREt4KKOH7yckop5r5mwitX8BVS/IqDiYSmD/UkKu\nVGPM68HR60Zj2eSAN8qBMqAMh60jbzx8e5v23vzol5w9lsz6d8ciGS1OA8k01oRyYEtvzh5NYvsX\nA5HW7w4girhOdbitksujQitw9U0/oC91oBVcFPZLROwno/ZIOu4iBbFX1dBTOEFgbgMaF7gEyFb3\nwqboRAf9QQaEFkGVlMFQowNjddPsXASHDaKU8MVNE6ndHkGC/RR1HhsOn55tcVM5Uj4Uz/ogWFUD\n9jqkh5uy6eWFqgKa5vmgB2tpf7JfvBvv9xopYlEG6utUXBYgQ1sg9cfODsN498xdxI0pYcq1W9lS\nG0WhrTOBHaR8JLXJ0ax65R4E5GgdLrb9MBZRhDdfGM43Ac9y9eAsrl7wE7JXHPhWy/jp7Ssouqkz\njRvDsTYGcey23gSPrUeGQHHPjhT37ETM2UrS/5bDMUtnGlZ4uT3gsNRm3Agv9SJwQgKWveH4yqsk\nX3E8DLp6N0P1p/gmfwBysTtoTOA6KwnR5LoSHOPlbwuq8d7l90Dx0365qAp8Mq9zZNcg3ix+irrC\nMnoP2cD0hg/JWHkSdz3QZSB2dwjVL+nw3BaJu1JN1KESgvecoFtmKpWlSS0KXKYUSXq6AFEmQ4kP\nX3cDxAYzqes/ybiqiOMlGWxZPZLvdurYWx9EcL6Chh8VqNMhcUE5VbpAjBu84BWhIbaphW1NAns2\nZWI2Bjb9VtL0eQCjp2zCZtax/YvBtMYzegANFWdjeemO+wDQB9pQqHwQA6wXaPZ4+HDHNcR0rWDc\nwgMYc1T4zhpRlIFFgK8CZ7JVMY5h3g+4OyYLGvVAI4JTi01mx6CRYbYZwC25Qb5+xTOUl3dE2Lse\nPMVAGCwLBPKRvMYDaAms12ikl7k5p7kAiMiUAob+ZkzfhiE2yTMu81s0G07jq3O3dM2qoTdw/Gws\nfQO2EkkN+mIX9aXRLQq8GTkCbo+Cd7JHcv2w9azbeR3uoXpujfsXuh/sPCh/gUMBmUQchMGafQz3\nbKVkekdK0jq2OY+IjMpOcXz61CyCaxvxTRrB6CxXk2wiPmcBuYPmU10+Gl9NFvik/ZGyA9EsqYjk\nwEYl6A+DKlDS+V47OCQveo9JwZHV8Sz9ssOv3LV+/Px5uagKvJrOfDf9JTp83kBkhYOH/pbFKK0J\ndX04dXtsxF7XAX3pGExvhGM6DIGDTNi6mjj+upXUwUehe/Evzpm88DSBWHERiUgF+f/QYHH2ZM2a\nW8nbng6cBMyYvjFgKhMJe0xBlxsb0D3mQC3rSIcfD2FqcJGvqIcOsXDW3eIO8sZDc2gNiQlFqvYT\nStGJRJw2NU0pqIDIphec+xCwW/Q8O21+029uQE2f4Ufp0M3EHc+tpXPvIp5+7TK2noxvFcjXC+QJ\n7Gi4nh1lQ4AQUB4HfQoIpWBsAFkkBFwJ+lh4Vi5dWtEZaTjlSIH4Xlpd5ATJuB4dJ7nImG2AAn1g\nDal9K8ndEUrhA90kubWAvY75aQ9g+/QMVj0EBMHBoD5UNkTTL+dDUvWfE9AxjNCzReCpPu9Ya90W\n7v16OiMWwHcFV+FOLeF0lpuMz4vRp+9HrjIQuULFtPf/Q3JiAZ/+4xaK0yTHShkiIdVGIotrONG/\nJ4JNQemRRB6b8jjFazsBy1vH5cESCCsBoQbJVQY2L+2JpLFLwV7a1A8qKfeBKxeAutJAls67DNjL\nefPM+vHTDrioCvxtrqfDf5QsOnknZ11n6LMYapZ1pXZ2DNF59QR7dQS47bh6BOCq0KLe6SLkWysu\nXQiHlXEIX2zCPn00+vS2IYvVh2PwWi3IlQHUPD6Fb25PpyQ3HtQiuNOavuWCg8fxrjiEpXdnwmOd\nzMh8iynLXuaIJoq7hy4j8noD5QsNiNVNxSVblLEIdEFS2D42LB3TdLw1Qdb5Uf7i58feXUJy91IE\nZBQeT6Ch9ty6mGpUMSIxHeuIc9sRHEpqgsxY+iXRI0iLc2sEByxyEBugZivEXQ0alRTPL/iAcNDr\nweORXoCk6BxShFFYPGDC0EVN5+gywqJzuOLGInJ39JHEUEvN7Bn7FQUvm5naDUKbvC9fFm9j3RvD\nmXDyR7Q6I9E5RmLZjTe5G84RPdB2b3srKVQK4gb2YulWGeq/jUH+ZTYDb1cRmx/HwGtCUazXctPm\nlxjCVt64eiFrO00nuKwRbYKD4BojV3ywkfQf8/jn1jfwGpXUvhaJ9ccSpLJNzTu3QZJsxqPSe3Ne\nYiqQnC1DkfZG7EgrkUCa9zGkfjkh9Rmtm+J+/LQnLqoCTySPB+fl0aPQStGiSHaIeuIKZYT0NrEt\ncjAbvxmCoLMTdnUttetjuNK1gScKn2Bd+jD+1e8V2HKYs/d1p+f2/W3Oe/a+7rjzskEXhfNlAaM2\nFLoHQ5WHCEoRnGCsDgVCMW8+Tem9BXSZ6mbCnf8hHlDGqonclsp47xd8UnEblqUqxBpP0yTv5xE2\nMlpn3ruAIb9Z/g49SqgsisLlViEi4437byEvy4QUHK8CDAT1tnNTl9d4OOstLFpYP3Awm9c9xnt7\nZnL8dBLjjkxDUk4mqNhDa4oBg9SuDslQWwe1zZXePdLL5waHA0M0XDE5n3smvMKBgkz+cf1cUOwC\nwQwE0UG7nGVvvkXGG/Woz43Z355FgtNJcupZukWqiUsQcVVoMG/2UHqviaSlwWg6td5OtmADj+9Y\ngoCCFE6hLkkhb0B3Dt+s4/b5b/PIlgXkO2F3QhT5HyVSsbwjrpklxM0v5LIf9zHzifc5eIW0uahN\ndNDjvXysw8NQlm0iP7UzKpkHR/4gtB1PotCG4SgOJtpcgFowI08AT7gCozUMW4URHIkoQ2tRBCtw\nFfcB8eQ5gv22FL5/Hopomyu6vVPEX0seuJgyXVQFPi7kezKuc7Btw9U8H9qTqH+ncdWSN+lnqeSn\nnO4c+bQCAhUQNoKwCbWEJ1XgzgOOlEPBLkiew/mWu6okFx7rcMQT31NyixE4C10HEhaj547pH1Ff\nr2f5u7fibuwELgWWH/bz1Q9qznA3y9VvYEyMQkDOXmV/Mp7eQ2FhF2r26XBVqxEt4s989c6dce8m\nIDCD4Ahz05xQhtwjQC2Uu2KkIzKISa5BJhNZsPwVnpz+MGUFceec4zhS8FE8cJT6lYcp69FIUe8o\nGva4iVPrOV0Vw93i63x7ajRoPgJXc751E9KssrlNFnBbJUdyrRY8rqZcMaAVSgnxNjDyzFnuy3mA\nde+O4JXq+aA5CC4DsrNZJI9MYyp3MWChq2UjsxlZZCCPZH7F6BnlBORHU6XyUexKxpANEYeq4J5q\nwj6IwhjX6pUi9ZaPoOJG7s6eimZdPWOGQdhEDSUNcYSelbPh5TvIrbscw4e12D+uobzGjjlDQZU+\nClNMODJEZAiEeWpZXzSF8I5qUnKO0Ls8j5+mpZL4vJaQjg2cfDaNR3a8R4/Gb1DMj6Hmxn6s2HML\nWx60Q1kPgkZmEzc5GdsTIpiPgxW8CgXl0bEIJb/5Fv4TUMRfS+EV8deSB/6yCjx3RgaPHT7F7Gvn\nUuQ6wzjzLv4WZqT+n/VYO+sgORLqRfA5MK4zsNeaTA902NEAAogO8Lrw1reNvuu8OIeTc3vjOilr\nFcnq4d6aBQyet5Kdj40ldfEIDr/cA3IjgXFADUfZztDOT9BlXT/C6svx4qMeAx98M4QFWcvIXTYU\n9ycOMF4oHNvLqOu3ce/LS5vUjBzDKTvy+2BYzlpASgW7bM+dKFQ+ZvR+l9ryYNpqx65N706kMvMJ\nfHJ8KJ8cnwAcgw3A5oOcTZoB6YA4A3Jymv5Gj5QSwNfSHgpyIKU3dEyD4lyorANCyby+knmZq+j9\nYA4nxw1i6d3vwU1REB8HebmolHXsebkPr43zUd9D94s7Q/V0Bt9/6aXr7blkJkPltVG43SrG9TzK\n21M+wXUM9k5M5anvXv1FLz3V5y6CG+1sQceWHaB+MIN/z3iemu7hhHQ3EkMBQ0s+onZxJNvXTGbp\nx8F8ds0SkhZHQ70HOT48jV7M6JAJKsLqy3myzzweznqH7CkjcZlS6bDiJKHPQ4/tQZx9uZGuK7fR\n2+NkS1UkBLsxrqtjoPVdVq5eh2wN8DmUx8Ux6pP1GLt+8V/vWz9+/qzIxObqxP+/LySTASOAkRfj\ncheJ7fy15IG/nkzb8cvzZ2Y7fy154I+XaSEXUtMXTYGPHDmSrKwL13bz48ePHz+/ZMSIEWzfvv28\nn100Be7Hjx8/fv5Y/Lk0/fjx46ed4lfgfvz48dNO8StwP378+GmnXBQFLggCc+fOZfDgwYwaNYoz\nZ85cjMv+4Vx22WWMGjWKUaNGMXv2bAoKChg6dCjDhw/n7rvvvuBO8Z+NvXv3MmrUKIALyrB06VIy\nMzMZNGgQGzduvJTN/VXOlScvL4+EhISWcVqzZg3QfuTxeDzMmDGD4cOHM2DAAL7++ut2PUbnkycv\nL4/4+Ph2O0Y+n4/bbruNoUOHMmzYMI4dO3bpxki8CHz55ZfirFmzRFEUxezsbHHixIkX47J/KA6H\nQ8zIyGhzbPz48WJWVpYoiqI4d+5ccd26dZeiab+LF198UUxPTxcHDRokiuL5ZaisrBTT09NFt9st\nmkwmMT09XXS5XJey2Rfk5/IsXbpUfPXVV9t8pz3Js3z5cnH+/PmiKIqi0WgUExMTxQkTJrTbMTqf\nPMuWLWvXY7R+/Xpx9uzZoiiK4vbt28UJEyZcsjG6KDPwXbt2MXbsWAAGDBjAgQPtL6H+oUOHsNvt\nXHXVVVx++eVkZ2eTm5vL8OHDAbj66qvZtm3bJW7lr5OSksLatWtbZgjnk2H//v0MGTIElUpFUFAQ\nKSkpHD58+FI2+4L8XJ6cnBw2btzIiBEjmDNnDlarlX379rUbeaZMmcLTTz8NSCtXlUrVrsfofPK0\n9zGaOHEi7733HgBFRUWEhoaSk5NzScbooihws9lMUFBr0iaFQoEgtK8cFAEBATzyyCNs3ryZd999\nl+nTp7f53GAwYDKZLvDXfx4mT56MUtkaZimeY/YJDAzEZDJhNpsJDg7+xfE/Iz+XZ8CAAbzyyitk\nZWXRqVMnFi5ciMViaTfyBAQEYDAYsFgsTJkyhWeffbbN/0p7G6Ofy7No0SL69+/frscIJB126623\ncv/99zN9+vRL9n90URR4UFAQFktrEWFBEJDL29f+adeuXVuUdpcuXQgPD6e6ujWVqsViISQk5FI1\n7//MueNgNpsJCQn5xXhZLBZCQ0PP9+d/OiZNmkRGRkbLz3l5ee1OntLSUkaPHs3MmTOZNm1aux+j\nc+W58cYb/xJjBLBixQpOnjzJnDlzcDqdLccv5hhdFC06ZMgQvv32WwCys7Pp1avXxbjsH8ry5ct5\n6KGHAKioqMBisTBmzJiW6NJNmza1LKHaExkZGb+QoX///uzYsQOXy4XJZCI/P5+ePXv+ypn+HIwd\nO5b9+6Vsldu2baNfv37tSp7q6mrGjBnDSy+9xK233gq07zE6nzztfYw++ugjnn/+eQB0Oh0KhYJ+\n/fpdmjH6Qy3qF0AQBHHu3Lni4MGDxcGDB4snT568GJf9Q/F4POLNN98sDhs2TBw2bJi4Z88e8dSp\nU+KIESPEQYMGibNnzxYFQbjUzfxNFBYWtmz6XUiGpUuXipmZmWLfvn3FtWvXXsrm/irnynPw4EFx\nyJAh4siRI8Vp06aJFotFFMX2I8+8efPE2NhYceTIkS2vQ4cOtdsxOp882dnZ7XqM7Ha7eMMNN4jD\nhw8XBw0aJG7YsOGS/R/5Q+n9+PHjp53SvgzRfvz48eOnBb8C9+PHj592il+B+/Hjx087xa/A/fjx\n46ed4lfgfvz48dNO8StwP378+Gmn+BW4Hz9+/LRT/h/7e19KLJbo7AAAAABJRU5ErkJggg==\n", + "text": [ + "" + ] + } + ], + "prompt_number": 15 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "import cv2\n", + "\n", + "# plt.imshow(arr.astype(np.uint8))\n", + "faceCascade = cv2.CascadeClassifier('../../../data/haarcascade_frontalface_alt.xml')\n", + "faces = faceCascade.detectMultiScale(arr.astype(np.uint8), \n", + " scaleFactor=1.1, \n", + " minNeighbors=5, \n", + " minSize=(30, 30), \n", + " flags = cv2.cv.CV_HAAR_SCALE_IMAGE)\n", + "bbox = np.array((faces[0,0], faces[0,1], faces[0,0]+faces[0,2], faces[0,1]+faces[0,3]), dtype=np.int32)\n", + "bbox = bbox.reshape((2, 2), order='F')\n", + "bbox" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 16, + "text": [ + "array([[ 71, 175],\n", + " [ 73, 177]], dtype=int32)" + ] + } + ], + "prompt_number": 16 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "start_time = time.time()\n", + "P = flandmark.detect_optimized(arr, bbox)\n", + "print \"Elapsed time: %s ms\" % ((time.time() - start_time) * 1000)\n", + "\n", + "plt.imshow(img)\n", + "plt.plot(P[0,:], P[1,:], 'rx')" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "output_type": "stream", + "stream": "stdout", + "text": [ + "Elapsed time: 82.5798511505 ms\n" + ] + }, + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 17, + "text": [ + "[]" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\nz8J+Te0csb2+Yybxoz/6oxw4cGDw/VVXXcXP/uzPsmXLFj74wQ/ym7/5m2zevJnh4eHBNa1Wi5mZ\nmXPygl/u8dJEQ8/+HRe6IiGNlwowWOezhShKSOKMRqvJ8OgoRw9n9Ho9hIpwUjLb7tKdK+h0OrS7\nXVYsW06j1kAKyZAVqCji9GyXuW4FKLRzGOdQzuGkC9mmp35ba0kLy9aHjvNn77yUK3Yd4r7tq9G1\nJLxSwHohPicFIhJY4yHBtXqdRr1FFDoZZVkFwRPHsn1Pc2rVEqosZsX+45xevcT7hBjHus/ez+HX\nb6F+7AjtdROsvuMejr1hO+vvuJv9b7qaKKuhNqxh05/8Pbt/6o0samRY1SWJI1ZNddh30Xlccdej\n7PjxG7ni3sd4ZNsFrL/vKe553SY27XqCXZetYss39nFg81qu/txu7nj9BnqxpCFAKoXA4ozGOEOz\n0lyw40F2ffjfsOH2j3Dq134GMTYaegYSISIEYWtoBFWp0abChM/L2j6bVBDE6VAqJVK+PqG19dyU\nOBrcHLxpsL8pWGNxQpCmmVc+c44kMQhhsdZ3TWKVIkWCEJIolsSJQiiDMwXOVAgXzKjp19MXYiHO\nbof+ABUu3/72tw8Cwtvf/nZ+8Rd/keuvv565ubnBNXNzc4yOjj7n7//Gb/zG4PyGG27ghhtu+G5f\nwjkZL2WrceboA14WbGWc92XwkyhiZGSM1WvWknc67H+i4nR3iqoyFBry0lDpaUpjmJ5p02q0SCKf\nFlur6XY7pGnE4sWjHhgqAsNDhNRXCl/Z71S89oFj3H3lCmyWcM+2FVx1z0HuvnIlReIzgSyOfUos\nQTuDdp5zICOBiiVxnHgcQVFBIJZNTizhoi9+i4eu38SRJaNc+pkd4GDPLZeTjtTY/kefZvePXc/E\nX3+Zh27exqK9B3h062s471Nf4egNWznvrj0cePePcOGnv8KeN21n9Z0P8PBNWxHtDrfe/mnu+Jk3\n0c4SHtn8Gt7y3/6eT737FjqNmHuv3MC2e/bxxLrF/PDHvsk/vHM7nYakpgS1ep0oSymLEl1Y4rLi\ntfceYt+7bmF4vMmBd72elb/9Xzn9L/8JupkFWopvTUYyJokz8ryim3coqhyHtzDQpgTbV8lKydIW\nUiZUhaWXl1S69P4czhdxjYVmo0Faq3kFKeeNnnu9rg++mTd6FijiqEaj3iKL62EXJ1GJREUCqbxE\noFCRJ+MJrwbmrA9YL2Sm3vnNe7jzm/e8PDPavYA8+8CBA7zzne/k7rvv5uqrr+b3f//32bZtG7ff\nfjuHDx/ml3/5l7n55pu57777yPOc7du3s3v37mfVJF5uxZyXOpyzzBzfP/jeG0WdXZKE/q7RnXF2\n9uhXIoKytvXGLUJ6DIU2Jb1eh25njs7cKWZPn+Tpp57iwV272LtnD1OTU1S5JhEKZw1RBEmckEQJ\nOElZGsrC4NAsWzLMhtecx8hwDSFLYiWo1RK0LtG6JIokq/ef5OiyOjpLkOE1RXnF0mNzPDXRRElJ\nmia0mi0ajQZxnJAXBUVeUK83aDZbYBWddkFV6aB27XEAdmaOrffsZefFq9n24AEA7rpoBVsffobH\nLlrOT/79bv70bZdTjI+S5ppt9z/BYxtX808+eTe7b9rK6IlpHr9sPTd95PN85doLOTJSZ/v9T/K5\nTSvY/sQUu9ct4XUPH+HLV5zPtsef4RubV2MbGUum2/zTT93PF3/8atbsPcLOq8+DoQZZI8MqmOvm\nnJqdZe2BU9htF7N040U0h4b8NqnbpfXoQea2b8SGFjJWkqV1mo1hqlIzPXua0zMn/bYgklS6QFcV\ntVqdkeEx6tko1kja7ZyZ6Tbt7uxgy9bn3IyOjjI8MoKSEcZZyrJgenqGSpekqafexyqhXhtipDVK\nLW2A8O1phyNOvftXkqVEWd2b9MgaxnmJfYFAaANCI5wNXY2ABP42hYmhJee96LX3gjOJfjr+x3/8\nx/zCL/wCcRyzfPlyPvShD9FsNnnf+97Hddddh7WWD37wg/+fKFouHCJUhL5zjF7Y2zrr8T6mPtQ4\nRIDK9q/sA49UNEIkBGUvp9ft4HRFkiScPnkSp71mhXO+9tAre5SlJs/BVBBH0Co0naKkbmukSmGw\nVNbXBvr06afXjoQ7kEIJhXOClSemeXppA/C8EW0MSWVY9sQJTm9aTWRjr40hBNpoyqKi2y1wVjA3\nN8fx4yeYnJykKEoeEQW/84m7+bWLR6jVMn7j0zv5T5vHuWbnPn7rqmW8/r7H+fLGFRRpzMzqIX7y\nC9/iT7efxzu+sZsjI3UWf22a37/pIq5/6BmuPtHms2uG2DN7ktmW4Be/+gi3r20RP7CHPxmr846v\nPci3Nizhxj3H+cQ7tnHZvqM8ctUGtty9j723bEIkCeMPH6CzqI6xhoMXLGP90kUsyTJGH32a01vX\noxNFd/tGYmG9wK+DOEoZbqQMDdUoS40uZ5mdKXHBSsDpHKqKuBYzXE8ZHWlSFQ6hDV0qXNXFuso3\nu0NpKlOW4VpElPj/5azpgu5QdTvY0qKUxMYZNSWQtoYkQlhP+iqKHJ1EuHqCEi3iKIbYgvU6m7Zv\n6iT6tQn5HPPw5R8vKEisXbuWu+66C4DLLruMb3zjG8+65rbbbuO22257eV/d92G8sN1dv1j5bFVS\nF9hgXqgmBAtcSFsVWS0jzSS612NkdIR169djipLZ6RmmT59GU5JlqRd9iYK+odJoW2CswQgotCGv\nNNr6D9A5h/a3+kElWggvha+ClL5zgsmVI1zzzQN8Y+sSerFAdQs27TjG/rdejowUsZCY0CXw6Et/\n5+rlOSdPnmTv3n0cPjrHSARv6cB718S860RBrSb46Nu2cdvXHubTN21kdKTF45sEb7vrcb554TKu\nOzDJnW/Zzns+/jX+bPtafnzn0xxcPkZ9aIghA51azLVTOUfWLuWmA8f58yvW8IaHD/G/W02v02Eu\ng3//wCE++tr1pGN1dq+8iEvvfJSHtp3HskOnmFk8xsm1S9ny9zv5/OalyEaTuoZlf/ZZqn/9k2QS\nKimxZWCW9hd0ljHUbNFoNElUQSdLqSUxVekQWGRwPkvjhHqa0GrUKJWmMwdJBEoY35oNYCglJY1a\nRKuRkGaZ9/fUPaaVo0CjixwjHcpZcE3iyFJLPFaiKg1WF2hXoZXF1WuARRiDk8bXNSzeZlA9R79h\nQAZ7+ccrnirev+tbawd8/heeli2gfwXSzXwBNDyPnb/US9N7xGOz1WJ0dIwkSSiqgqIs0MYLyKoo\nIspS0kaduJYhkxgZx6AElYV2r6LdzSm1xjgvFWeMxQY4uQ2ZiG8Jhj8vBFUWc//Vq7lm5zFaMwVX\n3XOI+69ZTS/ykO0+D0Op4FwtCLLwDm0qKm1Y1kj5V6rJvVetZ82mi1g0vojFSxbzurXrmfmP/5If\nOQ03XXst17/1LZh/9S7eWCZk7/tfuWnWcddv/xy3nNI88C/ezopGk9s+uYN0zUq+9b4fZ/KNr+Xn\nv7qPmZ94AzfbjE9dfSFlS5GkivNFwoe3rsAsHSWt1TDNjIdu2Mj4TM6pTWuRSpGnEd+8ei2vu+8Z\nRtoVGz55F8ffcyu9NPbFXemRr5HKiOM6adIiiWo4J9GVwTpQUUwUpSgVI0SEFP57KSLKUtNuz9Fu\nz1GUPYzxdG+Ft4qUzlsb4BxVVVIWPcoy945mpsJor51qrKGqCoqiFxS+OlS68NfpiqoqqLRvRVtr\ng21jwFv0uQPPNRPPYULxikdcQihahnpJXynshY35K6UUAcwyX3cZFEMdSCE96MWaQPOGdnuGffv2\n8dhjjzE5OUmlPU9CBE1IIyxVpekWJdoaVCQQyitKVVp7iLX1W5zKWCLhgUDCOGwIOALhATvCB4oi\nUTxw2XL++ccf4o9/dD1SOGSeIyNFo94kiyK0itBlha4MUsLoaJO8GGNizVK2dmDmmiu4crjF8ieP\nMn3jtZhWiw1zmt5lFzG7ZJTVz0wRXbGFY406+t1jnPepO5H/+d+w5tQkJ89bzWUf/xy181bBowcY\nGhnhwksuZmzvUY783q+w7Zf+M4/97q9w1dfu5tTa5ZRKMNXIWL5knGWNBquOzXJy4zAljqPnr2C8\nXg9w94puLNixeYKf/6Ov8JXf+RmGIonpFSghqSWZx9T3+TdBrbrXM+RFx7eEjSSJ64DCmAprZYDA\nR3S7JcbMUlWWvMipjA5eI2EmCA8m01qT93LKqvDnec+zb4VDKo+dcEKgtaEoCnpRDk7QK3J6ReHV\nyCqNMQ6jDVLp4DcSnO6l8oHj3AEsnzVeDRLMA6H6AJZnwa0XjOfajvQfm8dc9H0t/CepTYk1GqRX\nV9ZCcHJyikcefoRHHnmYo0eP0Ol0PKdCgZVeYNcHAoMNaEeVREjrkZHdoghy9QrtLGgQoSruAkjH\nWu+6JQgWAEBWGC5/8Dh/+mMXse3Bo9w/0qLIMrKsEbY23ixGxBKBJokSVBwzbsdQsSJdNM6qdetI\n05Tapoup1VOEgGzZckyvhxwbwW5YR9Js0urllDv2YH71p1HjIzSqHm7xmN/EtLtUX/9zkv/0/7D8\nA39I+//8JYb/5+c4+j9+mzX/7g958oev5p89sp9vbDkP2cxYUatxxY7HeeSmSxFCePp8EiOkoKgq\n713RybnqwSN84lffylWf38XUurWYeguVJERJ3Uv/hSIuDu+WFdikDod2iihtIuIUXWlU4i37nFQU\nWmCc9hkbkrTeQMSxrzkFqLR1XiogL0tcAZXRaGOJ04yGEFjlaedS+KymMAaRFzgjqMoK6wQShUN5\nODYe9yH7CN/+HWfBl+/FeMUHib7BTL9w2e9tCOeLQq5PvAmRwf+MM5SKQ/lhHkIsfKtLSX9HMsaL\n2GI0kXB0uz2OHT7Mwf37mTx2jF636+XqnCULku15WVBpcMrzKoy0IBSVMTjjaLcLurlmpJkhrBe2\niZPg8iTEwNLPOUllLNIassqw7b5D3Pfa85hzFV/fvJQb7z7EQzc0oAUETQPwxKQo8iIxHmEoGR5u\nUaundLttur0ueVmQVw3/P4kSSmuZmp6mkxeMdnOmp08jZ2Yon36Guq7QuqL53z9N1evRvfUaymaK\nufwCmvsOoP71/8V9v/Zu2u1Z3E/czGV/+Tkemhjj9Q8+zeNXns8VOx7nqTddgaxFxM6SZAlJllIa\nj1TVMx2uu+dp7rz+QpatXM7xy7dx3l98ian3vpOoOUyUtpBSeWMhEfkFHbZ+0mmcc0TOkTRGPU7C\nGB9kA8bBty5Db8sZGgb/v3LOw6edf7yvkWmxKOMBaFnLPxfScyx8ybH/GfmtnaxDgi9uZ1lG3Ggg\n4xrIGCcFEotxlZ97TjJQlHALKwbfJzDV/9/HQhDVfG9DnWF8cjYkfhAwFjzuZNADcP6ZjAsSZM4M\nILnWOHRRMHXiGAef2s+xw4eZm53FGY2SgiTy+AVrHUW/cKgiRKIQWvm7oDEYbegVhiKvMNoRCeHv\ncDpUvIVESBek0ILrk3QsPTrHvdvXUGUx9DR5JDk4XmfJE5PMLVmMs8L7gXYLhvcf5+TGCa9ChaQM\nNnZlVXLq9EnyosQ5QaEtlTYMtVos2XuIJxY1kEMtalnKyePHWXv/41z68c9y1z+7GTcyxITtcf5D\nj/P0ilGeaDhmylO8bm6GqtJ88q//ljJOGROKZQJKBLsuXsNP//mX+eL73oprpERYUBFJEjP+6DMc\nWTFKr6hYemiGO6+5gDius/qx46SbttH55dsYe+hJ3NrzvTmR8hwLJf2093UkO1+D6m85ndetMKFO\n5YLgyxlzxfWlAUIda8F88vWt+bkwEIkRZ86ZMwB8rg+7FsF20SuaWxchrEVKgxIWR98w+Cy8xDnE\nU73ig8TLNQbS7mJ+22G0QeGIoghjSgQwNzfL/v37efKJJzh+4ji9Xm+gTh3H8aCzYI31Cx1IoxiR\nCax2mMhQ9gKdu9ejLGvIWOGsd8uSSOJI9NMaWMApObhm1OsoLqiZPD6ecvOjpzh5cpoiy2g6wbo7\ndrHvTVsCb0ARx4pGI0NGirLQ9Lo9ZmZnmZw6xeHDR5iZnSONM2JteNvBNn+/YRxXSzBTp7noUJcD\nDob/6BP87bKMHz7aY7eMEF+5m91HnuCGvSf4t4vg1Ikut921l78dS/gxm/CZLRtYsmiM1z34JJ/+\n6Zu59JuPsP/NV2BbKSr2UoCn1y5m/Se+yf4tK3ls5TANp7jum49x4J1vYkRFZEuXoibWBA1J72wu\npUcw9nU/pVABzi4QSpzxeVq7oLY0+JEI5/PbjHlRKDEQ9zlrduAIJKznnT/+uv7rmqcKCKztf4by\n+XOFc1i5fDVIvJxD+AIl+HqADYs0Uj5IGGM4cWKSJ598kqmpKaz1xsEikn4PHEVURY5nc4S7FZY4\njpBSkXfz0H3xQrl5r6QoSpIoQ0jpRXNxRCoONYk+l8GrLC8Es/UDR1c5vnTxGG/46mMcuill3b0H\nePItl1Mlsc9anCLCGwbJKEapEmsdWZoxOjSMrQz1pBZ4KPC1i0d496E237p0JVceKrj/zZehjeXa\nux7jv+w5yc4VLT63dS0jSY3f+pt7+b23Xs6yqiBrzXDXTM7HHp3id2/ayPjIKNfvfooHr72YeKTO\nvpsu56LP7+Kpt2yFJMYYQ0dYnrlmA1f84y7uvGQ51zw6yVev28SogKKscAhUFKNU7DEszmeL2jjA\nu3QJ2SflCdBnJezhti9EKGDOf8yhUCkGpKv+zwb/83Cl6HNq/AfK8ytR+gDhHdOFB3w565sagzTj\ne4OLOHu8GiRe1jF/1x4sRggUccfcXJujR45w4sQJnHMMDw15/QGr6Xa6aF1hjFfdVEphfWWNuJYS\nWSh6uW+TOi/g2y169PKCRj1DSeUnlfUcAm+wG0TYJfPydUHLUwjhlbK0puMcOy4a52d+73N89dff\nSpUlHsCD35MbaweZjncJ9/i+RlpnfHiMqtKD9+9ExOxmx8/9359g5797D69dO0Gclyx7pgMHT3LB\nhvNZ+pZbaX7yyzz6e/8bP/7JL7Lr2ivotLts+uouPvWe1/Lm+x/lqIj51rYLEHFEPY6R9Yyn3nQ5\nQwdOMHXxKsqipN3tcEoX3HXJMn7pr3bxe+/czoyANC+oKl9LUCoijr0zFk6ekSH08/P5LGCBIC1h\nTQ7Ie/1isG8JO+frNlIxCCYOizMel+u9O4NFn2QAtMOZwXP29wgiCBuBwBrhWZ9IpIgQqp9RyHDj\nWbhfeZmm7XcYr3icxMs6FqTx81/9HrXT6TA5Ocnp6dPUajXWr1/PxMQqhlot6vU6Skq01swLoYYC\nl4QsSWjUayRJFFShQAhH3usy1+1QhMq4dQ6tDVobKmOprEVbX5Ow1pOW+h4VwECKLikqNj9wmI/9\n1BWs+tJumGtjAyVaW+M9RysP+fbFV0GiFFhD0W2DqVBYpHHU2j3WfnUXX/wXb2XJP95F/vhBxj5y\nB8bB07/7q+BgyW/9N6besJ2ikfLMG6/m0s/u4KqvPcCTN27DjA2x57WbWHHsJGmiyGopSRwDjiKJ\nOXb+Mnq9HrNzc8y05zCzba7ec4z/8k+3sn3XQWS7GxaywDqJcQKLxAmFE/4rQazWiQiLwjiJ9ZI2\nWNQZP5v/qgbPM7gGibN9Lwy1wDjaL3ZrwxHOXTAC9qQbNTj3hC+FN+cBrR3Ga/+C82Q0/5wEV/Hn\n8OA4h+PVIPEyjX5a6fUjzaD45XAURUG322VycpJer8eyZcvYuHEjExMTA+SfCNqNkYpwxqelnq/l\nyNLYB4koIokUSQII6BYlnXYnmPQ6dOXl27S2GO08qzOoZRvrPAnJ9OXrfLZSN/D6h0/x+QtbHFea\nndeuY8NndkG7izEe1DP0wH5o+xatDU6+aVGxav8JGrUazVqNRpIxbAVb732c/TduxS0a4eBNV7Lu\nE1/C9AqeuOlKjuicw6vGOb1khPK+Bzk9eZK2NZxcu4wTq5dSCIspcgppefCqC1k5NUuWJSzedwjR\n7aGtpixLer0e1alZVu5+hmvuOcBXtq3hdDPj7y5Zzuvv2UeWG4RKPLhMeGKdNgZtg5q5UEjpdSsR\nYXE6v4j7C7W/ILV2XjfGEDoJMnQwJM75xa8NaOOw1j/PIDhYAtDNf3VW+MV+1tF/zFc2g2kxIdhY\nMLrfWv92qcO524a8GiReptFPY/tBwgbCjw2aknmvx/T0aQCWL1/O2rVraTQbOOuBMnHiFaijANCJ\nQuobSW8onGUp9VpKrZaighOdrgx50RevAW3xGYQOgcKE7Uc4/KQ+Uz9jYrLLlzeO0lGOvMiZdRW7\nb9jA2METAR1YMrl6mPP+bieqlyOwxEXFa77wAN11K8jSFInfCg09dYi9r70Ym8akUUw6MsL09kuZ\nu3gdrp4hrGPq4nU8/sbtVFKgcNSThPYVGzl16XoiBbGCSILOIo6uGceYipMTY2z4wrdgrktVVZiZ\nOS772mOUVcVXtq4mTxO6eY+pquAfLlvD8iMnUSry71u7EBgJGVV/m+BNkJWKBudC+E5OHxRHUEb3\n9Ulv2ut/Hs6F8p2kcCAkUiov6CPnf0ZQ7hroisjIa3KcdS775yoOilcLi6DzvhvPMfs4l0Hi1ZrE\ngvFSGKr9Vlh/9GsTA0XpuhdOxWiazSbGGIaHhpmYmODUyUlqtTrOOvKi692xoog8OD2lcUQ9Sxge\nHqLT6dLp9LxoDVBqTVlpqkpjKuOt75zDRiH1dQ7nFIq+uW4/oPnaxFOrWpS9HiJYCLbbs2RZzPEL\nlmBNhVCSKovZd+smXvPp+zh0wyVMfGkP+9+4BZHWqGuDlgpXao6sGkdUFUm7i0AQRxFTmzYMWntC\ngHACU0uZ2jABeYkRFUZrim6XIvcmxEJ5fQu/6AS6lvLwjZdw/hd388j2dWy8cy9fuWKC08IiVBy2\ncz16vQq7qMn01ktZGSUolaCiBCk9d0WKiIVuZv1sYECU8hXJM9Zb337vWXojYlCa/LbzYuHv9f/n\nL3bMF0S/t+PVIBGGO6ue8GKGQASkpT+sFQMwUpqmjI2NgqkQQtDr5URRxOLFi+m0Z2k2GjhrsKby\ndYLYq0FlmXfTrtdrlGVFlqXEkUIrjfI3KL+VcH39bj+pte530ed79F4RyQ0KcN5E3BckvZu6C2bA\nFdYZrDOD4FJmMQduuJBr/8PfcNe/eTtVGiO0BgRRFFFv1Fj21HGOjQzRs5Zq1tArcpLSMHr0JFPn\nr0ZKD0AyxiMZbfAdXfLUEabGGvQUSCVJZExdS5Yen2Z601qMcBRZxKNXredH/uAL/MVPXUVbWax2\nIL23aS8vsCiaQ8OMjI6RZTXiJEVFvtODkKEbsZBP4yBQtPssnOe6IT+XIFEfwj///XP/snie8xc0\nn57jF16cONJLG6/47cbC1PslZxJnfd8njUkpA5KuRpImoXhYYa2l0WwyNDREo9lECkma+qAglaRe\nqwXClSRN4gCykSRxTBQJlCJoYAbzX+OFT8xgL+vVrLXxXhu6qjwzcQD68gi/NE0CqcuDgPx2yUOV\njfHXi07O6i8/wt0feDtrvv4wcV6incXovupSQr5hgkt37iMuvb9p+/gJVn1hBw8rzeGjR5D3PcTp\nZw4zNTXF6dOnmJmZJp86iZ7tsOnex5C9LmDJtGbTPXuZO2+pp8FrjcpLLtzxBH/1z6/jkvsOoLo5\n/XXZywsqbajV64yMjjIyMkazNUwcJ6EW4xXOHQTotG+F9iXqRR/t9mI+93AMspCzDse53gyc+/Fq\nkHBn7tFf7OgXLvvBoR8g+n3xLMsYHR2h1fJtzzzPEUJQq2XU63XSJPHqREphnfXCtIgAACAASURB\nVHepklKCsZhS+xantUghiYPcPoCQMhTmNGVZkec9er0eRVGQlx5HURYlZVn6/bzRg9fWb4OmwUbQ\nt2otlc4py9L7ahqD6hSc/5mH2PfGTeRjTfbfejnnfW4XaVWhYq9i5YSgyhL2XnsJl+58nJFCs/WB\nA+zYch7dSFKYigOjdS69by+2PUevyDFzbS69fx9PLqmz49JVXLH7aYbykkvvfYJHb7yYsp54u8NO\nh41f2sODN25ktpXyzSvX8EO7TzAiPXeiLAqSJGbZ0hWsWDHB+KJxGs0mUZzitxQeDCWlRKAGnxXC\nZxEON2DOLlzU84ufPt3jOY7vPG/611jcGfPthR4vYPZxLpfyKz5IvJzDZ7VicMfyk9FPJSkljUaD\nsbExWq0WaRL5ekOkyIKUu5dTL8GZAfcDR+hSeD6JxLtPGwNJkqDiFBUniDhGJrH38bTWazYWmirX\nFHlBWXp/UWtCum3nHcBi5bsmkZLgDNZoiryDDQFl9MAkj95yITrz2I0qi9h/6+WMPnMSlcQ44Y1x\nDBbbSNl/1QW8+aNf5snXbkSOj5IMNUkaddxwk/u3bWD7g08zkle8ds8z7Ny6FjFUh5E6j15xHm//\n+F3su/Z8qlZCicagWXT4JA//0EbyGEpTUdVj7rlmPRPH26GTBGOji1i1ahUTExOMjIySxCk43zHq\nFxattSEweKVL57XsceGwsn+4cFiscOE463EZwsvg9/3jTrhnnXuP2MDclG5BB/Psczd/3keBvsAM\n5xyp6QOvBomXfwgR0td5EBV4p/AsrTE2Osr4+BJGRkdptZq0mg2ajRpZmvrsQFik8AtXKY+AqoqK\nXjenyAuK0usMCOEdwZRKEEohlCTOEuIsRijplYy0wVQGXekFmYTxmhbaedMfY3B9sFSkUFKEIJEP\nBFyPvmacKlUBZxEYk7WEU5es9mm1EohYEaUxqTWs/9YTfPbnbuX8b+0jk4KoniKzDFVLsUNNHt66\ngXd96n72XrGBeHSItBbTkJJLHznCZ37xFs7f+RSxs4hYQCQ4sXElVU2FO77BOkc3keydaFFpS63Z\nYtWqNaxbt55ly5aT1ev0bfesFYGzMQ+jnj8sVlgcwd9isKgXLHxhw3Hm4054rw8Eg+9ZEDTOOBch\nANDPXGw4zj538+di3qP2+z1e8YXL56xcv4Sx8LmEEGB94dIFCHa91SJOIpI0plerkdeblNoyPdNh\n8tQpekWBjCxSKsqyxFmBsSUzsyfpFd2AgtSktYRIRURx6BoAsZI4FWFUhYsUwnjJM6cNVgSotwGT\n+AAjtPeyjSKJRaCSBOcM2lpsVZE5h/TPgLbWa1X0vSmFl8CTIdWVkSIuNGu+8QiP3HwFXQW7r7uE\nLXfuYee1l1AmMc4K0sqy+eFD/MNtt3DZ/U/w8HUXYaxh047H2HvLZhhp8MSto1z82V088sZNlFmC\ns2AqQ6kt2oAxoTsjI1ojTYZGxjn/ok1seM2FDA8vQirvwWmFX/zf7o4sXJ+Zac+pcMuLHT8IL+kV\nHyRgvuj4cgcLIQLgxoQCY+ijqzil1hhCqYh6YwgRp3RKw3TboydPTk0ipdcvcNZiXYHWgjiRNJsZ\nQgpUlCCcpZ5EJHFErASRdDgFKo69L6nW3prPCl9g7JMThECI0sOLBTi8KE0UpThMMBMOqlaDkr/1\nqtDBPcrZPnow/A8lLHp6koNv3k6UJGRVRZ6kPHzTFSw/eIxD65ajuhVX7NjLntdvQTRq7L1liEu/\nspuTa5fw5Ju2QdN7ktokZu+tlzP65FGOXLACbS25NZTWtzyd8cXZWqPJ+NIJlk+sYf1rLmLR+FKE\nStDGEsUKKb2mw0DMJ8gB9BlZZwYFX3j4QQwUEHBWC86/l+OVHSTcmZnEC8kqXmiB06e3AYorBEJG\nOMA4B04io4y0HiGFQCYZhYZur6Db6XF6ZiYoZkckNUWaRZRVD0fM0HCDZStXMjK6yG8f8g5lr0sW\nQeS0X/BSUOUC7bwfh9VeKMU5F/w7DVR9T1MZCpjKv0ZL4IB4CriMpC+aYrEExCUCpKcz9wOhs4Kp\nTWtRKFIZEdMgNpqiYTg12iLVhmUHJ3nkliuRjQyBQ6cRj996JYsPTSIXDaOMHrRiq0Rx5ILllEZT\nVJpeUdIrKnxuo0BJxsZX8JrzL2L5xFrGl64kTptUhiDYIgOGyYTtmdeg9ALFIJyvNfTngf/MXswk\n+t6M72fsemUHiTC+my3Hd98FEThUKEb18ft4nQjlNRqyRszS5RFlZXHWMdNuc3LqKLF0NJsp2lQg\noJ75DGRi9RrWrjufOI45+ORejj69H6ELlPYFROV3OR5QZRWRAOvMoKpvrMVUwd5PCVDe3EY6z5D0\nC9EzKaXySEHhVICZaxTeG0Ionxk5K4IHqELIBCFjIiVJbYwrC1zlQWUzW19DIiRKSIQLqtUi4fRl\n60iEwFRQlgE2Lr0hsg1dm15R0C1K4ijDOUWaNli6dAUrJtYyNr6cOG5grEAIX8uxznkPkjjyWyLh\nHcv8bikQqzgzg/xuY8R3OxfcdxmFvh21/Owh3PO/npeaIb8aJMJ4ObOIM64VoX82aKH1F1QfyedQ\nUUytpVi6cjUicCz2PPQtjh0+SFFqWs06S5a0aDSHSLIWjdYQWa3BUGuI08MnOC6foSzaKOmIlUKX\nJYO8Wfg2qQzyWSK0aZ21aOeolEFKn44vwIt6/oCTGO3Q0gIevCWVwTtiO5+RBO1OIQSxkMhYoZTX\nPZABaOXC35T0YecSn7L4QqgUlkgp/96lV4kyLihHaRtYph7qrEMtIq03GBlbTKMxQhTXPPeCPolL\nYJxvPco+SnEBK3dA5B4wM31A+W7z+OfCP377OTJPLf9uxwt5aefK1+bVIMHLHyAWDi8UMv+7Xi5P\nIYQLoCV8nSKStFqj1NYl1JsN8rzL3Oxppk8ex2jN8MgYS5YsZ2hsCU6kICPyUtPNNd1ehckr6rWU\nRAmMqBZ0VxZiQfp29X6p9LkmAwi5cUSx334opXAWtDYIYXxtRQmksyA0QgfmIr72IqXAqWAe7CkP\nKAFRv5EgPNdBSe+F6awCJzx5KWhv9J9LCAfOs1nLoqQqdfAdFVThNaa1Os2hEbJaw0OzncQh581q\nBvUUFmwxeHYdIgCqznjsHI2FQfhcjIXb5jP+7ksMHK8Gie/DECL4OwbIdmVCBV4pZJqxdNlKLr5k\nM7EUHHhqL8ePH+HokSkcGSOdirQ+wuTpLnPtNkeePsjJyVPUnWY0TYmiiAiFk/07Z8AHhAKmddpn\nNM75dmZpB+CvqqoCsCrCWouUjshJwHowkpC+k2d86o4tscYiVUQcgVMRjtABcV4tVGJRsj9JDcJZ\nMP0qnPWUdE+xxOKDhXUOY523PiwqirJCxUkIWhVSxcRxRi1rIGXk27kLwE4+a/MAqT5UZWFwOHOJ\n9pFSLxyT8HzjbP7Oc3zwA+7YuRjPFwxeDRI/4OPswmif5NP/4JQIQijGeD6FSpBCsnrtBhYvGmNi\n5QSP7HmQQ4eeod0umOsdozWi6ZaWJ5/az/GjR2kIy7JmDV05RORRm0a7ECiCAVxYMH6b493MvY5j\noLRbh9HSG8AY63kWxqAiSZqCQCGFI5Le18MK59WmlUMpi3JgpcIqiR2kvTbsrPxWx+MsfDu1L8Li\nLfLMAO1oBBghMEKgHV4TQ3sQlNaGqtKo2P8PrXPkReWzDJX496cC6zIECr8gF24ynuMzCle81ET9\nBwV+ffa249Ug8QM+zt7KLIRtz6s9MRCCEUJgkDQaLcZaTYYbTRaPjXP8xAl6RcnkzAwnpqZ58uCT\n7N37FNOnTjMxPsJInPjCZyrwQiXBIqDfwnRgsDgX9ut9GLLrmxKB0R6hqKvS803iCBVJtLYDtqRE\nopTX87TCIaXBeOaWJ7iJ+cXYv2lK2a8BMA/g8m92YHasA4yowmCFQ+OoQpaltZemz4sivPbgMqY1\nRVF4SGDkECJCRF7/sm+IMZCP+x62Lp5rUXo/l+/daxj4yLwMlINXg8Q5Hv0Pa1BBFyLAqs1ABk5K\nCbLv4ynRziEdWFtRq7WYWLWOVavXUWjD0cmTfOGrX+WZw0eZOjWNLi2dTkk3K/FxJvI6i0IhhWXA\nhLZ90NCzk23nHLqqQIjA0PSvIzEJQgiKXkWVG2wFNOWAZyIlvp4w0MazCKw3/BEC4foisf49WmMG\nUvUgvNGMkggE2liKqvLIUGOpyoq5Tpte3iUvckBSlAUySogiP23LsqQoK9+hsc67cRPctJR/D0jZ\nV4EYvPOFmcPgXLy0XcB3JAm+iHX6XMXKb4fjeLmBgf3xig8SwoUIP6hf9ffyZy8mEar09gy5/TOG\nW/D4AKB1ZvqnlBoECd+WC9LsuAG3wCta4+niUUSWpQgpOTk9w2y7w9HjUxw6dIyi1KRKUZQVnV5J\nZSWGGEQClOC8C7rsw4IdaOdt7K2Q2CAGq6326b/zrFFTgYojQCMRwYfCzXNHWgohFRLptxABQ4Fw\nQTQlIo4jwGFChuSp83izIePClkAgne+qaO3o9Sp6RekDRlkw1+3S7bQxWmOtoTKONE4BTz/Jq5LK\nGQQh4ApD7BKciQBFHEskwYA5bLUGn2eoVfRXXb8J2m9TnlHD6P/aWXIQ7qwV++3u2r655J63tXG2\nQHG/2Ppc1z0vevQ7PPeLHa/4ILFwDGTx4TnZfYP2Vb+tedbobyOAQbqvlBp8sAvvNv1tRn9IpYil\nRCgJxiGMJ0xJ5RWLEIKp6RkeeGgPDz70KLPtgiSp4WxJqQ25tuSlpdDGy57Rrwl4HoCEASfEhu2H\ncJ7ohJO+WBgwBI7g42FKr6novKFtkWuKoqLbK6jXM2r1GnEcIaQNMmxeCUpXhiT12ca8Zmf4GzaI\n9AbBXiu9TFuuNXlR0slL8sIzWbudDmXeA6eJo4gkir0rt3NURtMtcgpTEilFpUukUaFL44ObbNRx\nfQCVUgPUpS8c97U1QmPaSS89ueAzGWQe7uyT/nx49hx53jt5/2bBsxft2WC+77Sov1OBcuHXhXPy\nxY5vGySqquI973kPBw8epCgKPvCBD3DRRRfx7ne/Gykll1xyCX/4h3+IEIIPf/jDfOhDHyKKIj7w\ngQ/w5je/+SW9sO/VeFZKt6Bt9uyLfbvy+RI6qZRXVDrjSZ99h+jXI/p/ZyB35xxoRRS8MXSlvZQb\nhsmpSR7Y/RD33v8tntp/EGOsZ3+qFKMrrIW89J2AREkwMqAkLcIJrFCIKPJ+oWE744wJNQlvdWdC\nrcDhPT6sdTjb39cL6OZ0uj1q7R71eo1ms0FrqEGaxkSRwghDSU6elyRJTJIlRFKF4kRfKh6MNlTG\nYJzfqlgn6OYl3Txntt2l3W6T5zm6KL0IjxJEWYzKvMt5VWmmp2d55pnDqHSIscWxN9IRFikisBKF\nRJeWKPKvXQgPZhIqSMr5f74PigOcxNnt0LPnwllBIgjuLtxKfrvRL84+//O/tHb8vDHQmVTzcxok\nPvrRj7J48WI+8pGPcPr0aS677DK2bNnCBz/4Qa6//nre+9738ulPf5rt27dz++23s3PnTnq9Htde\ne+3/296bxspxXHffv6rq7pm5G0mRlLhL3CVZis1EmyVZix1v8RLIsAAbcYIkTgDDRmwkzgJYBhIb\ndpAECeAkQBBIDvwhyCchDoLAMWL4NSDkzWPJtiTL1kqJoihud+G9d5Y7W3dX1fPhVM/0DC8pSyIp\n59E9xIBzZ3pmqqu7Tp3zP/9zDu9+97tJkuR1De6NkFc0zUZKmq9+bNFfUi5OAPRCtSp53+GUDZwA\nRPkE6rYyEZLinJI7aLVanDx1nEd/9EP++/vf54knn6HRaoNJwEQoL6Z+ai2dXpdev0plMiIymqJ8\nnQu7mFFSrl1rcZviPCLLUmHrBYDQORfISH7Q91IXVkDu0KpPp5fRWGkz2Woz3Z5mZt0005NTaE1w\nLySZLalWSOIoMDPl4R1keU6aZaTO4gOxbKXdo9loUW+06HV7UjncSnvBKEnAGXAyTy73zJ6eZWG5\nTeoirkmqTE3P4Kyn0+1TSaooBd1el2qlQlKpCNAaXLxCYY8vbg8oV1qw45eecUrF6ryEVeVVQAWv\nlEtUtjzKVkOhJFZTFK9Hzqsk7r33Xj760Y8CcmPHccxjjz3GHXfcAcD73/9+vvOd72CM4bbbbiOO\nY+I4Zt++ffzkJz/hhhtueF2D+98kxQUqKlFrozGRKRIkzropB5WrCM2FlUZpiSQ4JwuyvrzMjx99\nlP/5P/8/P37icU7OzdFYaZM56R6eaINRGuMlH6Pd6dDt15iu1Yg0oReoCbiHwimItVS3MkaDF0Zi\ncWPlocfGoIgvUlzXeRuKyXrwFvpStm7ZdJhodtnQTtmwwVGJEnk/ELlMlJFUI2FZao02odNYlmHT\njL7LsUpwipVWh3q9wcrKCnluiXREHGkqcY1qpUolruC1MDhzC3Ozc8zXj9Dq5ZhqjauvvoaJySmy\nfk6WZXgtrE2tpLBOsZc6Jwq7fD0Gi+gcO/2IMiktuHORl1a9P/zqQOS57qVXknEFULYaBlYpjDx/\nrXJeJTE5OQnIbnbvvffyla98hT/8wz8cvD89PU2j0aDZbLJu3bqzXv9/XkpdgwtNXm5AXBR/Ld4v\nEo2KOhPlHc05R55lZNbTXukwPzfHT378GN/7/77LU08/SaOxjI8i4RF4jwol6KTCsiWzGSvdNt1u\nlXwyolqTZrQeh3aCNxSBjthEIargiUP4EopqB7LTE2pmWqVCDU0JV1rnhbzkPN6lNNs5jVbKmeUu\ntWqVJI6ITDRoXRhVEuJIC9MyioQOnqdkaYb1jm4q7Qp7/Z50Vs8Ef6hMxkzUatSShGqSkMQRLpYF\n388z6o06x47N00wtlSmhqh84eDVRJabfS/HGEytN1k/phvKB2hiM91gUREIOU8ML9IoBiLOwhGLH\nf9030quT81WwGlcSlyQEevz4cT7ykY/wmc98ho9//OP88R//8eC9ZrPJ+vXrmZmZodVqDV5vtVps\n2LDhdQ3sUknR0QoK61EWtnPl/o/F+wUIOSwoI+trCDgV/xel9U3YQQvUHyBLs/CFEjXJ0oxms0mz\n2WKp3mBudp6nn3qKxx79ES88f5hOZwVlCGncYqkoDbnNqBiFVmBtTje1dHo9rJtGm1jwByVJW6og\nayktmadKg4nIIketWsXjyENDHucFgFQKLArrFDkBq/Ce3PvQb8KT9x3tbpd6KyWJY6nPGcWDxRcF\n69JoyeVQygUSlxTC7fVTut128e0YIynxtSSiGkfUkgijwdoMnSQoDb2+FN/ppY7Tpxd4+pmnuXzr\nVjZdvpkNM+swRmFtRhxV5Dq021Sq1dC6IJFrpyQJrowVlZdS2eQfN/9XO/5CyFm1SFjdSlnNehjH\nIC5kDsd5lcTc3Bzvec97+Id/+AfuvvtuAA4dOsRDDz3EnXfeybe//W3e9a53cdNNN3HfffdJXcVe\nj2eeeYbrrrtu1e/8sz/7s8Hzu+66i7vuuuuCncxrkXFFULRzG4B1xWQHf16ZIuW6aEk/NKPLF9kE\nxSA6ZGgGZllGq9Uiz3NB8LtdlpaWOP7yy5w8fZqFxUUWF5Y4eeIE87OzpP0eURKTZRm9NMUkhqpR\n9DNPnvfxRtiFTkHuHamzZEiPDa0VUQTGgHYKm+coHLhcis4owg4LngrOu2AJFYtAEXmDz3OUsxIC\n1tK2TjI/JQyYZZ5OP0eRY0x/kDPiECKVuFMKrTxGOckxDTe0CostiRSVRDNZqTI9OcFEJSEx0h3d\n+0xCrkaTZZZ6vUmn2yWpKlq9nGPHT/Lk00+xcdNGrrv6WtZNT+Osx9sclMFbT5am+FgiO3KZYsl+\nDVjJ8NKdo4Q+Es0oSuy/Wnm1NSDOFwE51/Flq+H7j/yQ7z/yIy6EnaP8ec74c5/7HA8++CAHDx4c\nvPa3f/u3fPaznyVNU6699loeeOABlFJ8/etf5/7778c5x3333cc999xz9o/9DOGdSyneO5Zmnx/8\nPc6MLD8v7zhan61bvfdoZYYAXVAMnU6HRqNBq9Wi0WhQr9dZXFyk0WiwvLxMo9Gg0WgwPz/PmcVF\n6s0GWZaHWpROeA5G0c/6gg9oyC1kuezMM9Uq1cjgbY+atuy8/DL277iCbeunmUg0SeTB5fTyPlma\nYlADpmdRTNd7T5rndHo92p0O7U6XXpqSoehZ6PUywREcWKuw1pNmnn5myTNPnst48lw8l8Ii834Y\nJlRIiZpIC3M6MsH10VAJxXSmpyaYmZqgNhETx6GZr5aFHFUr1Natp5VZfvzTwxw7vQiVSZaaXfq5\nY/vOrdx+6628+53v4sCePbjcYZwniaKQrQpJtYqJI+I4JkkS4jgeuH+CN5TCnqsRmc7aUdR4VHT1\n4wjErfHA1ypyFpg6prDGLYdi8ym/ttp3bt/7C6957Z1XSVxo+XlWEuUw0ciNw6jpKaas9NwsSuWD\nVH5yTsKZ3W6PxcVFzpw5w8nZ08yenmV+fp7FxUWW68vUl+vBiuiQ9tMQO5eOW957yXoElANrU+l/\nEejG3WBmQ0SkDVOViCQx2LxPrB3bN21g/44r2L5hHTOJohpyK5y32DzFBzcojiIqlRhtisxJTS/N\naLc7tNpt2t0umbWkuSRaZXku5x1K9vczR7+fk6aONHekKWSZKAr5Ogk1+kBYMkryQwxBMVSgEmkm\nKzG1WsLURJWpyRoTExWq1QSvhr1E4iShOjUNlRrH55d4/MlnWWz0iSZnaHRSmu020zPTXHvwAO99\n9y/zjltuYWZiGlw+KOIaJwlocZeSSoVKtSKFhAOoqpRUpTprkZ4VIlclN2OUL/OK/IZXCVwWm835\n3Ivy84Eruorb8nqUxJubTOVHcybKk2utHdw85QulAlPQRFr6dqLoh56c7ZU2i4uLHD9ximeffZbD\nLzzPiRMnaTYbdLtd0lDENssyQNwBVWonL41rpH+nUQajlPSsxOBsTpZnGB0RaVmUqiKkoMxBHuop\ntK2n2XdcrgyZUhhvUSgq1SqaGJv26PV7OJuRpg4TR2htiGJDrVYT/CSOQWt6vS6xtlijyK1Qp/Nc\nkXlIYqgmMf3U0e30Ic8lE7MgJJWaBSkfUrWR9PHEKGqxYbJq2LR+hpmZSZTyRFpRMRBHRQdtqSFR\nnZghqUxyptnm5Ml5ej2LNhX6fYe1EsFpr/R56aXjPPqjx1k3Mc1br7mO9TMTgOBDPk3RRqOjSDJv\nsxTwxHFCpZIM3I3yAgVZ2GWCnFDbCxElUbiUrybacd7bchXrARixGorXX4kLcSE25Te3kqCwDswg\nH2BAKhoDropHq9PBWlnoaZpTX24wP7/AyZOnOHXqNEePvsT83BkWFxdZWloizaSUvTFmEN3woWRc\nQU0efn9B1vLSDs+7wrFHmtVKCA+vQiVtuUEz53FIBKGXeZrdlK5VzESVUCQml4rO3hNFEZNmQiIp\nmbTYw3isAh3FVOIYE0VEcUy33SLrdUmznH7Ik+h7B9ajjSZWhgiF9jGRhmqmSDPIckc/s9giMUyB\nMlCNFbVKxMxEhampGpMVzfRkhYlqjFFIWBZPnqZ4pYjjCjqukCQTdLoZswtLLCw26fccxBVREGji\npAbASqvHC88fZbo6yURc48DeXUxN1rA2p5/1pPFREqGVZKRmmVDHjAm4CRpXAqVZzfItA5ZKDVmX\nqrQgL0C4YxyALI+jsBjKx15MeXMrCQXVquQCWJvjg4+pdTToFZmFPpvO5XQ6kmy0uLjI7OlZTp0+\nzcvHjzM7N8uJ46dpNlustDtkqaQ0W2sxUSQ3u1bheyS5SZRPgYuWn8uW60JAUunCnw07my9a0kmy\nVJYnmCiUhHOQZ45Wu0Oz22XdREIcSTUoMd2Fi5HEhjixmF4Xm6WAw+cpAFGsiOOI2ExQjQ1pN6bb\n66I7oYANOdog3bO9JjKKSiXC2gpZrulnnm6vTyd01UIJPT0yilo1Yt1EhXWTk0xPVqnGKvA5PHGU\nYLTG5rmwSSMpjRdXa1ilmF+uc2J2gcZKl7716EhAVJv5gBMZ0jznzNISP3nqKSqVGOf77N97FRMT\nE6AUmbWYLMNBoMVLh/HMOoxXxAbwRYbqsNuE/C1Fbwpgs7h/LoSsZjmM0/hXcy/G5WJlur65lYSH\nTqctTWqVJkmqGBOFHhU5vV6XRrPJ8pK0pFtaWuTYsZdZWJjn9OnTLCwssLi8RGuljUJjrQ/uiJHF\nEXIFnHP0+1n4nVDSzb/yRVVhpyrvamKBCNVJmJEO7ZAQhpNszpUVx5nFJWqRh+kK0WQFo0MDYa1B\nD3ts+NRgrXT2CrXrQ5QjopbEJGaSSpKQJCm1Wkqa2UC6Aud0UF4SCfIqIbfQ7nal9Z618h5SgCaJ\nDZMVw2QlphpFAafIkApXcqyJIgyg4hiTJGTWUa/XObWwyJlmi5U0w6KJJT1N+mUgpLA4TsBoFptL\nPP6TH2Ntnyzvc/DgQTZsWI/NLd1uF51lTExMEkVxoMer4bz6UWblINQp4MpoNCwceCF38nHLofz/\nCH3/EsqbW0koMEkM1uA9LDeadDodlpeXmZubZ25ulrm5Oebm5lhaWqJer9Os10nTfmisKyXr4yjB\nWulLkYc+miqUzx/8lFqd6TeuKF7NDaBLzE2tFF5Dmmd4m7KwuERiHDHrmKxG4kYoQ5H6pZShkmiI\nNDbT2FxjrZOCMNYP3TCTEEcVKlVHlksBGIvDWvBKESUVBF8xRHEFG3IrellGL5XUb5vnOJtjlCfR\nnlgpFBasQ/kYL7FUdKRJkprs8iYi84b6ygonT88zO79Ap5NiHXijyJ0jx6KMAWexTsBYraUL2ez8\nPC7vk6Vd+mmfq6++msnJSarVCaJILMVe6GIexzEqSTA6LnTawKor8yHUmELwhUZ5nXK+7M3VIhnn\n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\n9/LVr36VXq/H7/7u73Lo0CH+/M//nC996Uu87W1vY926dYPPTU9P02g0XtfAfn5FgpJniZdyKFrL\nlLqADcgi1Sjl0D7UKvCeONZU4ojp6UnWz8wwMzONUY6KkbDg9HSVDeunOH3yZRpLTRwRWepQ3lGN\nIzZtWE/mPBOTljS1dLpdMTczAbF8sRsBKBf8ejM6ZEr4vRoW8hV7yEl0xuXYPCXPLM4y6JRujMFo\nE1K1xWopA282FJ5VISmtLAVjsvSKjCcsFoUK8f+hCyKLyY1YFoP8+pGTKly9c/e/eKNkwAdhNHJW\nnJJznjhOQq9Sofl776Uzm5IeJ9474kpMZnN839PJ2jz55JN0u13SNOWtb30r+/btI4oiiXi9ivqb\n55JXBC6PHz/ORz7yET7zmc/wsY99jEajMVAI99xzD7/3e7/HHXfcQavVGnym1WqxYcOG1z24iy3G\nGK57y3XcfMtNgzBcWVw5KlH46aFykYBxpWXmCwq0LESJcDkgFxdD+aBeLHhLksRMTdaYmZ5molbD\nRIqsn9LvNfG55QePPcf23deT6fVsrjfJckBpojimWpskSUKZOCKyLKff79PpdOmmKc5a2XkD8Wjo\nd4DSoYv2WJCxvHB1sBAM4PM8AGeeHzz2Y2668RcxcUwUxZIK7wtLwmNzKwQnayU/Qysqof3hmGkw\n+vfIe6WIBmrwzweGo1JqwJPweB577AluvvkGBvtyEW7Erfr1r+B3DYan1LCK+vB1TQleEvdqFQLe\nIz/4ITffdOMqXx+URHDLCph3kGOCD6QpoV670IVeax26wgseoxTYXHqk6DDWqalJ1m+8gqQ2TVyd\nknYAY3yf1yz+PDI7O+uvvvpq/73vfW/w2i233OJ/8IMfeO+9/7u/+zv/J3/yJ352dtZff/31vtfr\n+Xq97q+++mrf7/fP+r69e/cOLKy1x9pj7XHpHnv37j3fUj+vnJeW/bnPfY4HH3yQgwcPDl77i7/4\nCz7/+c8TxzFbt27l/vvvZ2pqiq9//evcf//9OOe47777uOeee871tWuyJmvyv0guae7GmqzJmvzv\nk4tTg3tN1mRN/p+Ri64kvPds376du+++m7vvvpv77rsPgIcffphbbrmF22+/nS9/+csXexhniXOO\nT33qU9x6663cfffdHDly5JKPoZBf/MVfHMzPJz/5SV544QVuv/127rjjDj796U9fkFj3zyqPPPII\nd999N8A5x/HAAw9w44038va3v51vfetbl3RMjz/+ODt27BjM14MSx++lAAAEm0lEQVQPPnjJx5Rl\nGb/+67/OHXfcwc0338x//Md/vOFztdqYHn/88ZG195rn6jWjGT+jPP/88/5DH/rQWa+/7W1v8y++\n+KL33vtf+ZVf8Y8//vjFHsqI/Ou//qv/rd/6Le+99w8//LD/1V/91Uv6+4V0u11/6NChkdc+9KEP\n+Yceesh77/2nPvUp/2//9m+XZCx/+Zd/6a+//nr/9re//ZzjOH36tL/++ut9mqa+0Wj466+/flWQ\n+mKN6YEHHvB/8zd/M3LMpR7TN77xDf/7v//73nvvl5aW/M6dO/2HP/zhN3SuVhvT17/+9QsyVxfd\nknj00Uc5efIk73znO/nABz7A4cOHaTab9Pt9du/eDcB73/tevvvd717soYzI//zP//C+970PgJtv\nvpkf/ehHl/T3C3niiSfodDq8973v5V3vehcPP/wwjz32GHfccQcA73//+y/Z3Ozbt49vfvObg11w\ntXH88Ic/HBDnZmZmBsS5SzWmRx99lG9961vceeed/M7v/A4rKysjZL5LMaZ77713YP0WJMM3eq5W\nG9OFmqsLqiT+6Z/+ieuvv37ksW3bNr7whS/wve99jy984Qt84hOfoNVqMTMzM/jcG0G+ajabI2Mo\nCppeapmcnOSP/uiP+K//+i/+8R//kV/7tV8beX9qauqSzc1HPvIRomhInfElN6e4Rs1m85IS58bH\ndPPNN/PXf/3XPPTQQ+zZs4cvfelLtFqtSzqmyclJpqamBiTDr3zlKyP3zhsxV+Nj+upXv8pNN910\nQebqgiqJT37yk/z0pz8dedxwww18+MMfBuC2227j1KlTTE9Pj5Cvms0m69evv5BDeUWZmZkZGYNz\n7oKw016tHDhwYKAY9u/fz8aNG5mbmxu832q1LvncFFKej+Iajc/bpSbO3XPPPRw6dGjw/PHHH39D\nxnT8+HHe+c538hu/8Rt8/OMf/7mYq/KYPvaxj12wubroq+LLX/4yX/va1wAxrXft2sXMzAxJkvDi\niy/ivec73/nOwFS7VHLbbbfxn//5n4CAqL/wC79wSX+/kG984xt8/vOfB+DUqVO0Wi3e85738NBD\nDwHw7W9/+5LPTSGHDh06axw33XQT//3f/02/36fRaPDMM89w3XXXXbIxve997+OHP/whAN/97ne5\n4YYbLvmY5ubmeM973sNf/dVf8Zu/+ZvAGz9Xq43pgs3VRUFRSlKv1/0HP/hBf9ddd/lf/uVf9s89\n95z3XsDCW265xd94443+i1/84sUexlninPOf+tSn/K233upvvfXWwbgutWRZ5j/xiU/4d7zjHf4d\n73iH//73v+8PHz7s77zzTv/2t7/df/KTn/TOuUs2nqNHjw5AwnON44EHHvA33nij/6Vf+iX/zW9+\n85KO6cc//rG/7bbb/F133eU//vGP+1ardcnH9NnPftZv3brV33XXXYPHE0888YbO1Wpjevjhhy/I\nXK2RqdZkTdbkvLJGplqTNVmT88qakliTNVmT88qakliTNVmT88qakliTNVmT88qakliTNVmT88qa\nkliTNVmT88qakliTNVmT88qakliTNVmT88r/BRnYrUC8hJCEAAAAAElFTkSuQmCC\n", + "text": [ + "" + ] + } + ], + "prompt_number": 17 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "features = featurePool.getFeaturesRaw(0)\n", + "plt.imshow(features)" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 18, + "text": [ + "" + ] + }, + { + "metadata": {}, + "output_type": "display_data", + "png": "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\n", + "text": [ + "" + ] + } + ], + "prompt_number": 18 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/python_interface/setup.py b/python_interface/setup.py index 82b5ae1..1b9bd96 100644 --- a/python_interface/setup.py +++ b/python_interface/setup.py @@ -21,6 +21,6 @@ license = 'Apache', keywords = 'cmake cython build', url = 'http://github.com/thewtex/cython-cmake-example', - test_require = ['nose'], - zip_safe = False, + # test_require = ['nose'], + # zip_safe = False, ) diff --git a/python_interface/src/CMakeLists.txt b/python_interface/src/CMakeLists.txt index da59f2d..6d0fb34 100644 --- a/python_interface/src/CMakeLists.txt +++ b/python_interface/src/CMakeLists.txt @@ -1,30 +1,104 @@ -#include_directories(${PROJECT_SOURCE_DIR}/python_interface/include) -# If the pyx file is a C++ file, we should specify that here. -set_source_files_properties( - ${CMAKE_CURRENT_SOURCE_DIR}/py_flandmark.pyx - PROPERTIES CYTHON_IS_CXX TRUE ) +# python_interface/src/CMakeLists.txt -set(CLANDMARK_LIBRARIES - -L${PROJECT_BINARY_DIR}/libclandmark - -lflandmark - -lclandmark) +find_package(python) -set(THREAD_LIBRARIES - -lpthread) +# If the pyx file is a C++ file, we should specify that here. +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/py_flandmark.pyx PROPERTIES CYTHON_IS_CXX TRUE) +set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/py_featurePool.pyx PROPERTIES CYTHON_IS_CXX TRUE) # Multi-file cython modules do not appear to be working at the moment. -cython_add_module( py_flandmark py_flandmark.pyx ) +cython_add_module(py_featurePool py_featurePool.pyx) + +# message(STATUS "CLANDMARK_LIBRARIES=${CLANDMARK_LIBRARIES}") +# message(STATUS "FLANDMARK_LIBRARIES=${FLANDMARK_LIBRARIES}") +message(STATUS "PYTHON_LIBRARIES=${PYTHON_LIBRARIES}") +message(STATUS "Python_LIBRARIES=${Python_LIBRARIES}") + +#target_link_libraries(py_featurePool ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) +target_link_libraries(py_featurePool ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, change _LIBRARIES to contain .lib files also, to solve this + +## TRY THIS +if(APPLE) + set_target_properties(py_featurePool PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +else(APPLE) + if (UNIX) + message(STATUS "Linking target py_featurePool against libpython") + target_link_libraries(py_featurePool ${PYTHON_LIBRARIES}) + # target_link_libraries(py_featurePool ${Python_LIBRARIES}) + endif(UNIX) + if (MSVC) + message(STATUS "Not linking target py_featurePool against libpython") + set_target_properties(py_featurePool PROPERTIES LINK_FLAGS "/LTCG") + target_link_libraries(py_featurePool ${PYTHON_LIBRARIES}) + # target_link_libraries(py_featurePool ${Python_LIBRARIES}) + endif(MSVC) +endif(APPLE) +######### + +cython_add_module(py_flandmark py_flandmark.pyx) +# cython_add_module2( py_flandmark py_flandmark.pyx TRUE ) +# target_link_libraries(py_flandmark ${FLANDMARK_LIBRARIES} ${CLANDMARK_LIBRARIES}) +target_link_libraries(py_flandmark ${FLANDMARK_LIBRARY_STATIC} ${CLANDMARK_LIBRARY_STATIC}) # for MSVC now, change _LIBRARIES to contain .lib files also, to solve this s -target_link_libraries(py_flandmark ${CLANDMARK_LIBRARIES}) +## TRY THIS +if(APPLE) + set_target_properties(py_flandmark PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") +else(APPLE) + if (UNIX) + message(STATUS "Linking target py_flandmark against libpython") + target_link_libraries(py_flandmark ${PYTHON_LIBRARIES}) + endif(UNIX) + if (MSVC) + message(STATUS "Not linking target py_flandmark against libpython") + # set_target_properties(py_flandmark PROPERTIES LINK_FLAGS "/LTCG") + target_link_libraries(py_flandmark ${PYTHON_LIBRARIES}) + # target_link_libraries(py_flandmark ${Python_LIBRARIES}) + endif(MSVC) +endif(APPLE) +######### add_custom_target(${PY_NAME_interface} ALL DEPENDS py_flandmark) -add_custom_command( - TARGET ${PY_NAME_interface} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark.so - ${PROJECT_BINARY_DIR}/python_interface/bin - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libclandmark${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin - COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libflandmark${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin - COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX}" -) \ No newline at end of file +#TODO: copy libclandmark and libflandmark + +if (UNIX) + set(copy_py_flandmark "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + set(copy_py_featurePool "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") +endif (UNIX) + +# if (MSVC) + # set(copy_py_flandmark "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + # set(copy_py_featurePool "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + ## set(copy_py_flandmark "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark${CMAKE_STATIC_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") + ## set(copy_py_featurePool "${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool${CMAKE_STATIC_LIBRARY_SUFFIX} ${PROJECT_BINARY_DIR}/python_interface/bin") +# endif(MSVC) + +# add_custom_command( + # TARGET ${PY_NAME_interface} + # POST_BUILD + ##COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_flandmark.so ${PROJECT_BINARY_DIR}/python_interface/bin + ##COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/python_interface/src/py_featurePool.so ${PROJECT_BINARY_DIR}/python_interface/bin + + # COMMAND ${copy_py_flandmark} + # COMMAND ${copy_py_featurePool} + +## COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libclandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin +## COMMAND ${CMAKE_COMMAND} -E copy ${PROJECT_BINARY_DIR}/libclandmark/libflandmark${CMAKE_SHARED_LIBRARY_SUFFIX}.${clandmark_VERSION_MAJOR} ${PROJECT_BINARY_DIR}/python_interface/bin +## COMMAND ${CMAKE_COMMAND} -E copy ${FLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin +## COMMAND ${CMAKE_COMMAND} -E copy ${CLANDMARK_LIBRARIES} ${PROJECT_BINARY_DIR}/python_interface/bin + # COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_LIBRARY_SUFFIX} and python_interface/src/py_featurePool${CMAKE_SHARED_LIBRARY_SUFFIX}" + ## COMMENT "Copying python_interface/src/py_flandmark${CMAKE_SHARED_STATIC_SUFFIX} and python_interface/src/py_featurePool${CMAKE_STATIC_LIBRARY_SUFFIX}" +# ) + +if (MSVC) + install( + FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_flandmark.pyd + DESTINATION share/clandmark/python + COMPONENT Python + ) + install( + FILES ${PROJECT_BINARY_DIR}/python_interface/src/Release/py_featurePool.pyd + DESTINATION share/clandmark/python + COMPONENT Python + ) +endif (MSVC) \ No newline at end of file diff --git a/python_interface/src/py_featurePool.pyx b/python_interface/src/py_featurePool.pyx new file mode 100644 index 0000000..509f72e --- /dev/null +++ b/python_interface/src/py_featurePool.pyx @@ -0,0 +1,106 @@ +cimport c_featurePool +from c_featurePool cimport CFeaturePool + +from cpython.version cimport PY_MAJOR_VERSION + +cimport numpy +import numpy + +cdef class PyFeaturePool: + """ + """ + + def __cinit__(self, width, height, nf): + """ + :param width: + :param height: + :param nf: + :return: + """ + if nf is not None: + self.thisptr = new c_featurePool.CFeaturePool(width, height, nf) + else: + self.thisptr = new c_featurePool.CFeaturePool(width, height) + + def __dealloc__(self): + """ + :return: + """ + del self.thisptr + + def addFeatuaddSparseLBPfeatures(self): + """ + :return: + """ + self.thisptr.addFeaturesToPool( + + new c_featurePool.CSparseLBPFeatures( + self.thisptr.getWidth(), + self.thisptr.getHeight(), + self.thisptr.getPyramidLevels(), + self.thisptr.getCumulativeWidths() + ) + ) + + def getWidth(self): + """ + :return: + """ + return self.thisptr.getWidth() + + def getHeight(self): + """ + :return: + """ + return self.thisptr.getHeight() + + def getPyramidLevels(self): + """ + :return: + """ + return self.thisptr.getPyramidLevels() + + def getCumulativeWidths(self): + """ + :return: + """ + cdef int* pyr = self.thisptr.getCumulativeWidths() + cdef numpy.ndarray out = numpy.zeros((self.thisptr.getPyramidLevels(), 1), dtype=numpy.int32) + for i in xrange(self.thisptr.getPyramidLevels()): out[i,0] = pyr[i] + return out + + def setFeaturesRaw(self, index, features): + """ + :param index: + :param features: + :return: + """ + # TODO: check inputs + cdef unsigned char* featuresRaw = features + self.thisptr.updateFeaturesRaw(index, featuresRaw) + return + + def getFeaturesRaw(self, index): + """ + :param index: + :return: + """ + # TODO: check input + width = 2*self.thisptr.getWidth() + height = self.thisptr.getHeight() + cdef numpy.ndarray out = numpy.zeros((height, width), dtype=numpy.uint8) + cdef unsigned char* rawLBPfeatures = self.thisptr.getFeaturesFromPool(index).getFeatures() + for i in xrange(height): + for j in xrange(width): + out[i, j] = rawLBPfeatures[j*height+i] + return out + + def computeFromNF(self, numpy.ndarray[unsigned char, ndim = 2] nf): + """ + :param NF: + :return: + """ + # TODO: Check input + # cdef unsigned char* nf = NF + self.thisptr.updateNFmipmap(self.thisptr.getWidth(), self.thisptr.getHeight(), numpy.PyArray_DATA(nf)) + \ No newline at end of file diff --git a/python_interface/src/py_flandmark.pyx b/python_interface/src/py_flandmark.pyx index 32dd0ac..911ca59 100644 --- a/python_interface/src/py_flandmark.pyx +++ b/python_interface/src/py_flandmark.pyx @@ -1,10 +1,18 @@ cimport c_flandmark cimport c_cimg +cimport c_featurePool + +#from hgext.largefiles import featuresetup from libc.stdlib cimport calloc, malloc, free + from cpython.version cimport PY_MAJOR_VERSION + cimport numpy import numpy +from py_featurePool cimport PyFeaturePool + +# cdef c_featurePool.CFeaturePool *fp def convert_text(text): if isinstance(text, unicode): # most common case first @@ -18,8 +26,13 @@ def convert_text(text): cdef class PyFlandmark: - - def __cinit__(self, file_name, learning_mode): + + def __cinit__(self, file_name, learning_mode): + """ + :param file_name: + :param learning_mode: + :return: + """ utf8_data = convert_text(file_name) cdef char *str = utf8_data @@ -29,12 +42,24 @@ cdef class PyFlandmark: self.thisptr = new c_flandmark.Flandmark(str, False) def __dealloc__(self): + """ + :return: + """ del self.thisptr def detect(self, numpy.ndarray[double, ndim = 2] img, box): + """ + :param img: + :param box: + :return: + """ if not self._is_2xN_array(box, numpy.dtype('int32')): raise Exception('configuration be 2xN numpy.int32 array') - + + if box.size == 4: + box = numpy.array([[ box[0, 0], box[0, 1], box[0, 1], box[0, 0] ], + [ box[1,0], box[1,0], box[1,1], box[1,1] ]], box.dtype) + cdef int i,j cdef int height = img.shape[0] cdef int width = img.shape[1] @@ -48,35 +73,40 @@ cdef class PyFlandmark: for j in xrange(width): ptr = c_img.data(j,i,0,0) tmp = max(0, img[i,j]) - tmp = min(255, tmp) + tmp = min(255, tmp) ptr[0] = (tmp) # convert box to needed format box = numpy.ascontiguousarray(box.flatten('F'), dtype = numpy.int32) #call native function self.thisptr.detect(c_img, numpy.PyArray_DATA(box), 0) - + #extract result cdef double *res_ptr = self.thisptr.getLandmarks() - cdef int landmarks_num = self.thisptr.getLandmarksCount() + cdef int landmarks_num = self.thisptr.getLandmarksCount() cdef numpy.ndarray landmarks = numpy.zeros((2,landmarks_num)) for i in xrange(landmarks_num): landmarks[0,i] = res_ptr[2*i] landmarks[1,i] = res_ptr[2*i+1] - del c_img + del c_img return landmarks def detect_base(self, numpy.ndarray[double, ndim = 2] img, ground_truth = None): - + """ + :param img: + :param ground_truth: + :return: + """ + if not ground_truth is None and not self._is_2xN_array(ground_truth, numpy.dtype('int32')): raise Exception("ground_truth must be 2-dim numpy.int32") cdef int i,j cdef int height = img.shape[0] - cdef int width = img.shape[1] + cdef int width = img.shape[1] cdef c_cimg.CImg[unsigned char]* c_img = new c_cimg.CImg[unsigned char](width, height, 1, 1) #convert img to CImg object @@ -85,22 +115,22 @@ cdef class PyFlandmark: for i in xrange(height): for j in xrange(width): - ptr = c_img.data(j,i,0,0) + ptr = c_img.data(j,i,0,0) tmp = max(0, img[i,j]) - tmp = min(255, tmp) + tmp = min(255, tmp) ptr[0] = (tmp) #call native function - if ground_truth is None: + if ground_truth is None: self.thisptr.detect_base(c_img, 0) else: ground_truth = numpy.ascontiguousarray(ground_truth.flatten('F'), dtype = numpy.int32) self.thisptr.detect_base(c_img, numpy.PyArray_DATA(ground_truth)) - + cdef int *res_ptr = self.thisptr.getLandmarksNF() - cdef int landmarks_num = self.thisptr.getLandmarksCount() - cdef numpy.ndarray landmarks = numpy.zeros((2,landmarks_num), dtype=numpy.int32) - + cdef int landmarks_num = self.thisptr.getLandmarksCount() + cdef numpy.ndarray landmarks = numpy.zeros((2,landmarks_num), dtype=numpy.int32) + for i in xrange(landmarks_num): landmarks[0,i] = res_ptr[2*i] landmarks[1,i] = res_ptr[2*i+1] @@ -109,15 +139,25 @@ cdef class PyFlandmark: return landmarks def get_normalized_frame(self, numpy.ndarray[double, ndim = 2] img, box, numpy.ndarray ground_truth = None): + """ + :param img: + :param box: + :param ground_truth: + :return: + """ if not self._is_2xN_array(box, numpy.dtype('int32')): raise Exception('configuration be 2xN numpy.int32 array') + if box.size == 4: + box = numpy.array([[ box[0, 0], box[0, 1], box[0, 1], box[0, 0] ], + [ box[1,0], box[1,0], box[1,1], box[1,1] ]], box.dtype) + if not ground_truth is None: if not self._is_2xN_array(ground_truth, numpy.dtype('double')): raise Exception('configuration be 2xN numpy.double array') cdef int i,j cdef int height = img.shape[0] - cdef int width = img.shape[1] + cdef int width = img.shape[1] cdef c_cimg.CImg[unsigned char]* c_img = new c_cimg.CImg[unsigned char](width, height, 1, 1) #convert img to CImg object @@ -128,7 +168,7 @@ cdef class PyFlandmark: for j in xrange(width): ptr = c_img.data(j,i,0,0) tmp = max(0, img[i,j]) - tmp = min(255, tmp) + tmp = min(255, tmp) ptr[0] = (tmp) # convert box to needed format @@ -140,7 +180,7 @@ cdef class PyFlandmark: cdef numpy.ndarray out = numpy.zeros((2,landmark_count), dtype=numpy.int32) #scale_factor = None - #call native function + #call native function if not ground_truth is None: ground_truth = numpy.ascontiguousarray(ground_truth.flatten('F'), dtype=numpy.double) @@ -155,30 +195,40 @@ cdef class PyFlandmark: #free memory del c_img - + cdef int height_nf = nf.height() cdef int width_nf = nf.width() - cdef numpy.ndarray nf_out = numpy.zeros((height_nf, width_nf), dtype=numpy.double) - + # cdef numpy.ndarray nf_out = numpy.zeros((height_nf, width_nf), dtype=numpy.double) + cdef numpy.ndarray nf_out = numpy.zeros((height_nf, width_nf), dtype=numpy.uint8) + for i in xrange(height_nf): for j in xrange(width_nf): ptr = nf.data(j,i,0,0) nf_out[i,j] = ptr[0] - + return nf_out, out - def set_normalization_factor(self, double factor): + def set_normalization_factor(self, double factor): + """ + :param factor: + :return: + """ self.thisptr.setNormalizationFactor(factor) def get_model_parameters_dimension(self): + """ + :return: + """ self.thisptr.computeWdimension() return self.thisptr.getWdimension() def set_weights_parameters(self, numpy.ndarray params): """ wrapper for setW + :param params: + :return: """ - + if not self._raise_exception_if_not_array_one_dimensional_array_or_two_dimensional_with_second_dim_equal_one(params): raise Exception("params must be 1-dim array or Nx1(1xN) 2-dim array") @@ -194,13 +244,18 @@ cdef class PyFlandmark: def write(self, file_path, write_weights): """ - """ + """ utf8_data = convert_text(file_path) cdef char *str = utf8_data self.thisptr.write(utf8_data, write_weights) - def get_psi_base(self, configuration, numpy.ndarray[double, ndim = 2] img): - + def get_psi_base(self, configuration, numpy.ndarray[unsigned char, ndim = 2] img): + """ + :param configuration: + :param img: + :return: + """ + if not self._is_2xN_array(configuration, numpy.dtype('int32')): raise Exception('configuration be 2xN numpy.int32 array') @@ -214,7 +269,7 @@ cdef class PyFlandmark: cdef int i,j cdef int height = img.shape[0] - cdef int width = img.shape[1] + cdef int width = img.shape[1] cdef c_cimg.CImg[unsigned char]* c_img = new c_cimg.CImg[unsigned char](width, height, 1, 1) #convert img to CImg object @@ -225,7 +280,7 @@ cdef class PyFlandmark: for j in xrange(width): ptr = c_img.data(j,i,0,0) tmp = max(0, img[i,j]) - tmp = min(255, tmp) + tmp = min(255, tmp) ptr[0] = (tmp) cdef c_cimg.CImg[unsigned char]* nf = self.thisptr.getNF() @@ -235,14 +290,19 @@ cdef class PyFlandmark: cdef int weghts_dim = self.thisptr.getWdimension() cdef numpy.ndarray psi = numpy.zeros((weghts_dim,1)) - + for i in xrange(weghts_dim): psi[i,0] = psi_ptr[i] return psi def get_psi(self, configuration, numpy.ndarray[double, ndim = 2] img = None, box = None): """ + :param configuration: + :param img: + :param box: + :return: """ + if configuration is None: raise Exception('configuration can not be None') @@ -259,53 +319,125 @@ cdef class PyFlandmark: cdef double * psi_ptr cdef int i,j,height,width - cdef c_cimg.CImg[unsigned char]* c_img + cdef c_cimg.CImg[unsigned char]* c_img cdef unsigned char *ptr cdef double tmp - if img is None and box is None: + if img is None and box is None: psi_ptr = self.thisptr.getFeatures(numpy.PyArray_DATA(configuration)) elif not img is None and not box is None: + if box.size == 4: + box = numpy.array([[ box[0, 0], box[0, 1], box[0, 1], box[0, 0] ], [ box[1,0], box[1,0], box[1,1], box[1,1] ]], box.dtype) height = img.shape[0] width = img.shape[1] c_img = new c_cimg.CImg[unsigned char](width, height, 1, 1) #convert img to CImg object - for i in xrange(height): for j in xrange(width): ptr = c_img.data(j,i,0,0) tmp = max(0, img[i,j]) - tmp = min(255, tmp) + tmp = min(255, tmp) ptr[0] = (tmp) - + box = numpy.ascontiguousarray(box.flatten('F'), dtype = numpy.int32) psi_ptr = self.thisptr.getFeatures(c_img, numpy.PyArray_DATA(box), numpy.PyArray_DATA(configuration)) - del c_img + del c_img else: raise Exception('both img and box have to be either noNone or valid arguments') self.thisptr.computeWdimension() cdef int weghts_dim = self.thisptr.getWdimension() - - cdef numpy.ndarray psi = numpy.zeros((weghts_dim,1)) + + cdef numpy.ndarray psi = numpy.zeros((weghts_dim,1)) for i in xrange(weghts_dim): psi[i,0] = psi_ptr[i] return psi def setLossTable(self, loss_table, landmark_id): - + """ + :param loss_table: + :param landmark_id: + :return: + """ loss_table = numpy.ascontiguousarray(loss_table.flatten('C'), dtype = numpy.double) self.thisptr.setLossTable(numpy.PyArray_DATA(loss_table), landmark_id) - + def getSearchSpace(self, landmark_id): + """ + :param landmark_id: + :return: + """ cdef const int *ss = self.thisptr.getSearchSpace(landmark_id) return ss[0], ss[1], ss[2], ss[3] def getBaseWindowSize(self): cdef const int * ss = self.thisptr.getBaseWindowSize() return ss[0], ss[1] + + # def setFeaturePool(self, *featurePool): + def setFeaturePool(self, featurePool): + """ + :param featurePool: + :return: + """ + if isinstance(featurePool, PyFeaturePool): + self.thisptr.setNFfeaturesPool((featurePool).thisptr) + else: + raise Exception("featurePool must be of type PyFeaturePool") + + def detect_optimized(self, numpy.ndarray[double, ndim = 2] img, box): + """ + :param img: + :param box: + :return: + """ + + if not self._is_2xN_array(box, numpy.dtype('int32')): raise Exception('configuration be 2xN numpy.int32 array') + + if box.size == 4: + box = numpy.array([[ box[0, 0], box[0, 1], box[0, 1], box[0, 0] ], + [ box[1,0], box[1,0], box[1,1], box[1,1] ]], box.dtype) + + cdef int i,j + cdef int height = img.shape[0] + cdef int width = img.shape[1] + cdef c_cimg.CImg[unsigned char]* c_img = new c_cimg.CImg[unsigned char](width, height, 1, 1) + + #convert img to CImg object + cdef unsigned char *ptr + cdef double tmp + + for i in xrange(height): + for j in xrange(width): + ptr = c_img.data(j,i,0,0) + tmp = max(0, img[i,j]) + tmp = min(255, tmp) + ptr[0] = (tmp) + + # convert box to needed format + box = numpy.ascontiguousarray(box.flatten('F'), dtype = numpy.int32) + #call native function + self.thisptr.detect_optimized(c_img, numpy.PyArray_DATA(box), 0) + + #extract result + cdef double *res_ptr = self.thisptr.getLandmarks() + cdef int landmarks_num = self.thisptr.getLandmarksCount() + cdef numpy.ndarray landmarks = numpy.zeros((2,landmarks_num)) + + for i in xrange(landmarks_num): + landmarks[0,i] = res_ptr[2*i] + landmarks[1,i] = res_ptr[2*i+1] + + del c_img + + return landmarks + + def get_score(self): + cdef double score = self.thisptr.getScore() + return score + ################################################################################### # aulilary functions ###################################################################################